diff options
author | Yuanhan Liu <[email protected]> | 2011-10-17 09:57:36 +0800 |
---|---|---|
committer | Yuanhan Liu <[email protected]> | 2011-10-19 09:25:30 +0800 |
commit | 9024d8af0ae832a0b4278eb6683bc0e76c69baac (patch) | |
tree | f7c58496d7bb47b65ff51c865ac3e9d651fdbea9 /src/mesa/main/pbo.c | |
parent | 76669381c0de6a49a1edd0b88fa1ae6b86f10b30 (diff) |
mesa: generate error if pbo offset is not aligned with the size of specified type
v2: quote the spec; explicitly exclude the GL_BITMAP case to make code
more readable. (comments from Ian)
v3: Cast the offset by GLintptr to remove the compile warning(comments
from Brian).
I also found that I should use _mesa_sizeof_packed_type() instead,
as it includes packed pixel type, like GL_UNSIGNED_SHORT_5_6_5.
Signed-off-by: Yuanhan Liu <[email protected]>
Reviewed-by: Brian Paul <[email protected]>
Diffstat (limited to 'src/mesa/main/pbo.c')
-rw-r--r-- | src/mesa/main/pbo.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/mesa/main/pbo.c b/src/mesa/main/pbo.c index 4e7e6f925cc..41ff2ff44f9 100644 --- a/src/mesa/main/pbo.c +++ b/src/mesa/main/pbo.c @@ -82,6 +82,19 @@ _mesa_validate_pbo_access(GLuint dimensions, } else { offset = ptr; sizeAddr = ((const GLubyte *) 0) + pack->BufferObj->Size; + /* The ARB_pixel_buffer_object spec says: + * "INVALID_OPERATION is generated by ColorTable, ColorSubTable, + * ConvolutionFilter2D, ConvolutionFilter1D, SeparableFilter2D, + * TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, + * TexSubImage2D, TexSubImage3D, and DrawPixels if the current + * PIXEL_UNPACK_BUFFER_BINDING_ARB value is non-zero and the data + * parameter is not evenly divisible into the number of basic machine + * units needed to store in memory a datum indicated by the type + * parameter." + */ + if (type != GL_BITMAP && + ((GLintptr)offset % _mesa_sizeof_packed_type(type))) + return GL_FALSE; } if (sizeAddr == 0) |