[jogl~jogl-git:e4b0e57b] New iteration of check 'imageSizeInBytes':

  • From: svengothel@kenai.com
  • To: commits@jogl.kenai.com
  • Subject: [jogl~jogl-git:e4b0e57b] New iteration of check 'imageSizeInBytes':
  • Date: Sun, 18 Oct 2009 14:55:13 +0000

Project:    jogl
Repository: jogl-git
Revision:   e4b0e57b9fe28296fcd8d9eb372242c33643886b
Author:     svengothel
Date:       2009-10-18 14:42:54 UTC
Link:       

Log Message:
------------
New iteration of check 'imageSizeInBytes':
Premises:
See http://www.glprogramming.com/red/chapter08.html
"If the rectangle in memory is larger than the subrectangle that's being 
drawn or read,
you need to specify the actual length (measured in pixels) of the larger 
rectangle with *ROW_LENGTH. "
This equals ROW_LENGTH == SubPicture-Width + 'Dirt', ie the offset to go from 
one line to the next.
"You also need to specify the number of rows and pixels to skip before 
starting to copy the data for the subrectangle.
These numbers are set using the parameters *SKIP_ROWS and *SKIP_PIXELS, as 
shown in Figure 8-9.
By default, both parameters are 0, so you start at the lower-left corner."
This equals to a one time offset _before_ you start copy the data, ie with 
your DMA engine,
using ROW_LENGTH and HEIGHT only.
Compared to Mesa3D's implementation (proof):
http://cgit.freedesktop.org/mesa/mesa/tree/src/glx/x11/pixelstore.c
Line 78 - 200
PixelStore State Tracker: Store the values in the PixelStore structure.
http://cgit.freedesktop.org/mesa/mesa/tree/src/glx/x11/pixel.c
Line 82 - 155
Line 210: Start position is set one time using SKIP_* values the same way we 
do.
Line 228: Jump to the first pixel in the newxt row, just using ROW_LENGTH
Line 230: Jump to the first pixel in the next 'image' just using imageSize,
rowsPerImage = IMAGE_HEIGHT>0?IMAGE_HEIGHT:height;
groupsPerRow = ROW_LENGTH>0?ROW_LENGTH:width;
groupSize = elementSize * components;
rowSize = groupsPerRow * groupSize;
imageSize = rowSize * rowsPerImage;
changes:
Removed redundand 'dimension' parameted, which is derived from depth and 
height,
1D == depth:1 height:1
2D == depth:1 height>1
nD == depth>1 height>1
Safe fail depth to >= 1
Safe fail height to >= 1D
Take either the ROW_LENGTH / IMAGE_HEIGHT PixelStore value if > 0,
or the given width / height.


Revisions:
----------
e4b0e57b9fe28296fcd8d9eb372242c33643886b


Modified Paths:
---------------
make/config/jogl/gl-common.cfg
make/config/jogl/gl-impl-CustomJavaCode-desktop.java
make/config/jogl/gl-impl-CustomJavaCode-embedded.java


Diffs:
------
diff --git a/make/config/jogl/gl-common.cfg b/make/config/jogl/gl-common.cfg
index a1414f0..37c030c 100644
--- a/make/config/jogl/gl-common.cfg
+++ b/make/config/jogl/gl-common.cfg
@@ -519,20 +519,20 @@ JavaPrologue glGetTexImage     depth = tmp[0];
 JavaPrologue glGetTexImage }
 
 # Range check directives for various image-related routines
-RangeCheckBytes glColorTable          5 imageSizeInBytes({3}, {4}, {2}       
     , 1              , 1    , 1, false)
-RangeCheckBytes glColorTableEXT       5 imageSizeInBytes({3}, {4}, {2}       
     , 1              , 1    , 1, false)
-RangeCheckBytes glConvolutionFilter1D 5 imageSizeInBytes({3}, {4}, {2}       
     , 1              , 1    , 1, false)
-RangeCheckBytes glConvolutionFilter2D 6 imageSizeInBytes({4}, {5}, {2}       
     , {3}            , 1    , 2, false)
-RangeCheckBytes glDrawPixels          4 imageSizeInBytes({2}, {3}, {0}       
     , {1}            , 1    , 2, false)
-RangeCheckBytes glReadPixels          6 imageSizeInBytes({4}, {5}, {2}       
     , {3}            , 1    , 2, true)
-RangeCheckBytes glTexImage1D          7 imageSizeInBytes({5}, {6}, {3}       
     , 1              , 1    , 1, false)
-RangeCheckBytes glTexImage2D          8 imageSizeInBytes({6}, {7}, {3}       
     , {4}            , 1    , 2, false)
-RangeCheckBytes glTexImage3D          9 imageSizeInBytes({7}, {8}, {3}       
     , {4}            , {5}  , 3, false)
-RangeCheckBytes glTexSubImage1D       6 imageSizeInBytes({4}, {5}, {3}       
     , 1              , 1    , 1, false)
-RangeCheckBytes glTexSubImage2D       8 imageSizeInBytes({6}, {7}, {4}       
     , {5}            , 1    , 2, false)
-RangeCheckBytes glTexSubImage3D      10 imageSizeInBytes({8}, {9}, {5}       
     , {6}            , {7}  , 3, false)
+RangeCheckBytes glColorTable          5 imageSizeInBytes({3}, {4}, {2}       
     , 1              , 1    , false)
+RangeCheckBytes glColorTableEXT       5 imageSizeInBytes({3}, {4}, {2}       
     , 1              , 1    , false)
+RangeCheckBytes glConvolutionFilter1D 5 imageSizeInBytes({3}, {4}, {2}       
     , 1              , 1    , false)
+RangeCheckBytes glConvolutionFilter2D 6 imageSizeInBytes({4}, {5}, {2}       
     , {3}            , 1    , false)
+RangeCheckBytes glDrawPixels          4 imageSizeInBytes({2}, {3}, {0}       
     , {1}            , 1    , false)
+RangeCheckBytes glReadPixels          6 imageSizeInBytes({4}, {5}, {2}       
     , {3}            , 1    , true)
+RangeCheckBytes glTexImage1D          7 imageSizeInBytes({5}, {6}, {3}       
     , 1              , 1    , false)
+RangeCheckBytes glTexImage2D          8 imageSizeInBytes({6}, {7}, {3}       
     , {4}            , 1    , false)
+RangeCheckBytes glTexImage3D          9 imageSizeInBytes({7}, {8}, {3}       
     , {4}            , {5}  , false)
+RangeCheckBytes glTexSubImage1D       6 imageSizeInBytes({4}, {5}, {3}       
     , 1              , 1    , false)
+RangeCheckBytes glTexSubImage2D       8 imageSizeInBytes({6}, {7}, {4}       
     , {5}            , 1    , false)
+RangeCheckBytes glTexSubImage3D      10 imageSizeInBytes({8}, {9}, {5}       
     , {6}            , {7}  , false)
 # This may produce wrong answers for 1D textures
-RangeCheckBytes glGetTexImage         4 imageSizeInBytes({2}, {3}, width     
     , height         , depth, ((depth > 1) ? 3 : 2), true)
+RangeCheckBytes glGetTexImage         4 imageSizeInBytes({2}, {3}, width     
     , height         , depth, true)
 # Note we don't support glTexImage4DSGIS / glTexSubImage4DSGIS
 # FIXME: add the following unpack operations:
 #   glBitmap, glPolygonStipple
diff --git a/make/config/jogl/gl-impl-CustomJavaCode-desktop.java 
b/make/config/jogl/gl-impl-CustomJavaCode-desktop.java
index bd4659b..fb06aa4 100644
--- a/make/config/jogl/gl-impl-CustomJavaCode-desktop.java
+++ b/make/config/jogl/gl-impl-CustomJavaCode-desktop.java
@@ -3,9 +3,7 @@ private int[] imageSizeTemp = new int[1];
 /** Helper for more precise computation of number of bytes that will
     be touched by a pixel pack or unpack operation. */
 private int imageSizeInBytes(int bytesPerElement,
-                             int width, int height, int depth,
-                             int dimensions,
-                             boolean pack) {
+                             int width, int height, int depth, boolean pack) 
{
     int rowLength = 0;
     int skipRows = 0;
     int skipPixels = 0;
@@ -22,7 +20,7 @@ private int imageSizeInBytes(int bytesPerElement,
         skipPixels = imageSizeTemp[0];
         glGetIntegerv(GL_PACK_ALIGNMENT, imageSizeTemp, 0);
         alignment = imageSizeTemp[0];
-        if (dimensions > 2) {
+        if (depth > 1) {
             glGetIntegerv(GL_PACK_IMAGE_HEIGHT, imageSizeTemp, 0);
             imageHeight = imageSizeTemp[0];
             glGetIntegerv(GL_PACK_SKIP_IMAGES, imageSizeTemp, 0);
@@ -37,7 +35,7 @@ private int imageSizeInBytes(int bytesPerElement,
         skipPixels = imageSizeTemp[0];
         glGetIntegerv(GL_UNPACK_ALIGNMENT, imageSizeTemp, 0);
         alignment = imageSizeTemp[0];
-        if (dimensions > 2) {
+        if (depth > 1) {
             glGetIntegerv(GL_UNPACK_IMAGE_HEIGHT, imageSizeTemp, 0);
             imageHeight = imageSizeTemp[0];
             glGetIntegerv(GL_UNPACK_SKIP_IMAGES, imageSizeTemp, 0);
@@ -45,36 +43,40 @@ private int imageSizeInBytes(int bytesPerElement,
         }
     }
     // Try to deal somewhat correctly with potentially invalid values
-    height      = Math.max(0, height);
+    width       = Math.max(0, width );
+    height      = Math.max(1, height); // min 1D
+    depth       = Math.max(1, depth ); // min 1 * imageSize
     skipRows    = Math.max(0, skipRows);
     skipPixels  = Math.max(0, skipPixels);
     alignment   = Math.max(1, alignment);
-    imageHeight = Math.max(0, imageHeight);
     skipImages  = Math.max(0, skipImages);
 
-    rowLength   = Math.max(Math.max(0, rowLength), width); // > 0 && >= width
+    imageHeight = ( imageHeight > 0 ) ? imageHeight : height;
+    rowLength   = ( rowLength   > 0 ) ? rowLength   : width;
+
     int rowLengthInBytes = rowLength * bytesPerElement;
 
     if (alignment > 1) {
-        int modulus = rowLengthInBytes % alignment;
-        if (modulus > 0) {
-            rowLengthInBytes += alignment - modulus;
+        int padding = rowLengthInBytes % alignment;
+        if (padding > 0) {
+            rowLengthInBytes += alignment - padding;
         }
     }
 
     /**
-     * skipPixels and skipRows is a static one time offset
+     * skipPixels and skipRows is a static one time offset.
+     *
+     * skipImages and depth are in multiples of image size.
      *
      * rowlenght is the actual repeating offset 
-     * from line-start to the next line-start.
+     * to go from line n to line n+1 at the same x-axis position.
      */
-    int size = height * rowLengthInBytes; // height == 1 for 1D
-    if(dimensions==3) {
-       size *= (skipImages + depth);
-    }
+    int imageSize = imageHeight * rowLengthInBytes;
 
-    int skipOffset = skipPixels * bytesPerElement +
-                     skipRows * rowLengthInBytes;
+    int skipOffset = skipImages * imageSize +
+                     skipRows   * rowLengthInBytes +
+                     skipPixels * bytesPerElement;
 
-    return size + skipOffset;
+    return skipOffset + imageSize * depth;
 }
+
diff --git a/make/config/jogl/gl-impl-CustomJavaCode-embedded.java 
b/make/config/jogl/gl-impl-CustomJavaCode-embedded.java
index c803a06..ae90a42 100644
--- a/make/config/jogl/gl-impl-CustomJavaCode-embedded.java
+++ b/make/config/jogl/gl-impl-CustomJavaCode-embedded.java
@@ -3,10 +3,7 @@ private int[] imageSizeTemp = new int[1];
 /** Helper for more precise computation of number of bytes that will
     be touched by a pixel pack or unpack operation. */
 private int imageSizeInBytes(int bytesPerElement,
-                             int width, int height, int depth,
-                             int dimensions,
-                             boolean pack) {
-    int rowLength;
+                             int rowLength, int imageHeight, int depth, 
boolean pack) {
     int alignment = 1;
 
     if (pack) {
@@ -17,23 +14,27 @@ private int imageSizeInBytes(int bytesPerElement,
         alignment = imageSizeTemp[0];
     }
     // Try to deal somewhat correctly with potentially invalid values
-    height      = Math.max(0, height);
+    rowLength   = Math.max(0, rowLength );
+    imageHeight = Math.max(1, imageHeight); // min 1D
+    depth       = Math.max(1, depth );      // min 1 * imageSize
     alignment   = Math.max(1, alignment);
 
-    rowLength   = Math.max(0, width); // > 0 && >= width
     int rowLengthInBytes = rowLength * bytesPerElement;
 
     if (alignment > 1) {
-        int modulus = rowLengthInBytes % alignment;
-        if (modulus > 0) {
-            rowLengthInBytes += alignment - modulus;
+        int padding = rowLengthInBytes % alignment;
+        if (padding > 0) {
+            rowLengthInBytes += alignment - padding;
         }
     }
 
-    int size = height * rowLengthInBytes; // height == 1 for 1D
-    if(dimensions==3) {
-       size *= depth;
-    }
+    /**
+     * depth is in multiples of image size.
+     *
+     * rowlenght is the actual repeating offset 
+     * to go from line n to line n+1 at the same x-axis position.
+     */
+    int imageSize = imageHeight * rowLengthInBytes;
 
-    return size;
+    return imageSize * depth;
 }




[jogl~jogl-git:e4b0e57b] New iteration of check 'imageSizeInBytes':

svengothel 10/18/2009
  • Mysql
  • Glassfish
  • Jruby
  • Rails
  • Nblogo
Terms of Use; Privacy Policy;
© 2010, Oracle Corporation and/or its affiliates
(revision 20120518.3c65429)
 
 
Close
loading
Please Confirm
Close