summaryrefslogtreecommitdiffstats
path: root/src/mesa/main/pbo.c
diff options
context:
space:
mode:
authorYuanhan Liu <[email protected]>2011-10-17 09:57:36 +0800
committerYuanhan Liu <[email protected]>2011-10-19 09:25:30 +0800
commit9024d8af0ae832a0b4278eb6683bc0e76c69baac (patch)
treef7c58496d7bb47b65ff51c865ac3e9d651fdbea9 /src/mesa/main/pbo.c
parent76669381c0de6a49a1edd0b88fa1ae6b86f10b30 (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.c13
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)