diff options
author | Sven Gothel <[email protected]> | 2009-10-18 07:42:54 -0700 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2009-10-18 07:53:05 -0700 |
commit | e4b0e57b9fe28296fcd8d9eb372242c33643886b (patch) | |
tree | f1d2c72b1dc17674c9a7dc14049960ef65c3d350 | |
parent | 4d493ac36bd5d763d2af3243e799bbaef3679594 (diff) |
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.
-rw-r--r-- | make/config/jogl/gl-common.cfg | 26 | ||||
-rw-r--r-- | make/config/jogl/gl-impl-CustomJavaCode-desktop.java | 42 | ||||
-rw-r--r-- | make/config/jogl/gl-impl-CustomJavaCode-embedded.java | 29 |
3 files changed, 50 insertions, 47 deletions
diff --git a/make/config/jogl/gl-common.cfg b/make/config/jogl/gl-common.cfg index a1414f0ad..37c030cb5 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 bd4659b88..fb06aa4ae 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 c803a06a4..ae90a42a0 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; } |