<div dir="ltr"><div>Looks good to me.<br><br></div>Reviewed-by: Laura Ekstrand <<a href="mailto:laura@jlekstrand.net">laura@jlekstrand.net</a>><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Mar 5, 2015 at 12:20 AM, Eduardo Lima Mitev <span dir="ltr"><<a href="mailto:elima@igalia.com" target="_blank">elima@igalia.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This patch adds two types of checks to the gl(Compressed)Tex(Sub)Imgage family<br>
of functions when a pixel buffer object is bound to GL_PIXEL_UNPACK_BUFFER:<br>
<br>
- That the buffer is not mapped.<br>
- The total data size is within the boundaries of the buffer size.<br>
<br>
It does so by calling auxiliary validations functions from PBO API:<br>
_mesa_validate_pbo_source() for non-compressed texture calls, and<br>
_mesa_validate_pbo_source_compressed() for compressed texture calls.<br>
<br>
The first check is defined in Section 6.3.2 'Effects of Mapping Buffers<br>
on Other GL Commands' of the GLES 3.1 spec, page 57:<br>
<br>
    "Any GL command which attempts to read from, write to, or change the<br>
     state of a buffer object may generate an INVALID_OPERATION error if all<br>
     or part of the buffer object is mapped. However, only commands which<br>
     explicitly describe this error are required to do so. If an error is not<br>
     generated, using such commands to perform invalid reads, writes, or<br>
     state changes will have undefined results and may result in GL<br>
     interruption or termination."<br>
<br>
Similar wording exists in GL 4.5 spec, page 76.<br>
<br>
In the case of gl(Compressed)Tex(Sub)Image(2,3)D, the specification doesn't force<br>
implemtations to throw an error. However since Mesa don't currently implement<br>
checks to determine when it is safe to read/write from/to a mapped PBO, we<br>
should always return the error if all or parts of it are mapped.<br>
<br>
The 2nd check is defined in Section 8.5 'Texture Image Specification' of the<br>
OpenGL 4.5 spec, page 203:<br>
<br>
    "An INVALID_OPERATION error is generated if a pixel unpack buffer object<br>
     is bound and storing texture data would access memory beyond the end of<br>
     the pixel unpack buffer."<br>
<br>
Fixes 4 dEQP tests:<br>
* dEQP-GLES3.functional.negative_api.texture.compressedteximage2d_invalid_buffer_target<br>
* dEQP-GLES3.functional.negative_api.texture.compressedtexsubimage2d_invalid_buffer_target<br>
* dEQP-GLES3.functional.negative_api.texture.compressedteximage3d_invalid_buffer_target<br>
* dEQP-GLES3.functional.negative_api.texture.compressedtexsubimage3d_invalid_buffer_target<br>
---<br>
 src/mesa/main/teximage.c | 51 +++++++++++++++++++++++++++++++++++++++---------<br>
 1 file changed, 42 insertions(+), 9 deletions(-)<br>
<br>
diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c<br>
index abcafde..f239e39 100644<br>
--- a/src/mesa/main/teximage.c<br>
+++ b/src/mesa/main/teximage.c<br>
@@ -53,6 +53,7 @@<br>
 #include "mtypes.h"<br>
 #include "glformats.h"<br>
 #include "texstore.h"<br>
+#include "pbo.h"<br>
<br>
<br>
 /**<br>
@@ -2110,7 +2111,8 @@ texture_error_check( struct gl_context *ctx,<br>
                      GLint level, GLint internalFormat,<br>
                      GLenum format, GLenum type,<br>
                      GLint width, GLint height,<br>
-                     GLint depth, GLint border )<br>
+                     GLint depth, GLint border,<br>
+                     const GLvoid *pixels )<br>
 {<br>
    GLenum err;<br>
<br>
@@ -2195,6 +2197,13 @@ texture_error_check( struct gl_context *ctx,<br>
       return GL_TRUE;<br>
    }<br>
<br>
+   /* validate the bound PBO, if any */<br>
+   if (!_mesa_validate_pbo_source(ctx, dimensions, &ctx->Unpack,<br>
+                                  width, height, depth, format, type,<br>
+                                  INT_MAX, pixels, "glTexImage")) {<br>
+      return GL_TRUE;<br>
+   }<br>
+<br>
    /* make sure internal format and format basically agree */<br>
    if (!texture_formats_agree(internalFormat, format)) {<br>
       _mesa_error(ctx, GL_INVALID_OPERATION,<br>
@@ -2291,7 +2300,7 @@ compressed_texture_error_check(struct gl_context *ctx, GLint dimensions,<br>
                                GLenum target, GLint level,<br>
                                GLenum internalFormat, GLsizei width,<br>
                                GLsizei height, GLsizei depth, GLint border,<br>
-                               GLsizei imageSize)<br>
+                               GLsizei imageSize, const GLvoid *data)<br>
 {<br>
    const GLint maxLevels = _mesa_max_texture_levels(ctx, target);<br>
    GLint expectedSize;<br>
@@ -2319,6 +2328,12 @@ compressed_texture_error_check(struct gl_context *ctx, GLint dimensions,<br>
       return GL_TRUE;<br>
    }<br>
<br>
+   /* validate the bound PBO, if any */<br>
+   if (!_mesa_validate_pbo_source_compressed(ctx, dimensions, &ctx->Unpack,<br>
+                                     imageSize, data, "glCompressedTexImage")) {<br>
+      return GL_TRUE;<br>
+   }<br>
+<br>
    switch (internalFormat) {<br>
    case GL_PALETTE4_RGB8_OES:<br>
    case GL_PALETTE4_RGBA8_OES:<br>
@@ -2451,7 +2466,8 @@ texsubimage_error_check(struct gl_context *ctx, GLuint dimensions,<br>
                         GLenum target, GLint level,<br>
                         GLint xoffset, GLint yoffset, GLint zoffset,<br>
                         GLint width, GLint height, GLint depth,<br>
-                        GLenum format, GLenum type, bool dsa)<br>
+                        GLenum format, GLenum type, const GLvoid *pixels,<br>
+                        bool dsa)<br>
 {<br>
    struct gl_texture_image *texImage;<br>
    GLenum err;<br>
@@ -2503,6 +2519,13 @@ texsubimage_error_check(struct gl_context *ctx, GLuint dimensions,<br>
       return GL_TRUE;<br>
    }<br>
<br>
+   /* validate the bound PBO, if any */<br>
+   if (!_mesa_validate_pbo_source(ctx, dimensions, &ctx->Unpack,<br>
+                                  width, height, depth, format, type,<br>
+                                  INT_MAX, pixels, "glTexSubImage")) {<br>
+      return GL_TRUE;<br>
+   }<br>
+<br>
    texImage = _mesa_select_tex_image(texObj, target, level);<br>
    if (!texImage) {<br>
       /* non-existant texture level */<br>
@@ -3215,12 +3238,13 @@ teximage(struct gl_context *ctx, GLboolean compressed, GLuint dims,<br>
       if (compressed_texture_error_check(ctx, dims, target, level,<br>
                                          internalFormat,<br>
                                          width, height, depth,<br>
-                                         border, imageSize))<br>
+                                         border, imageSize, pixels))<br>
          return;<br>
    }<br>
    else {<br>
       if (texture_error_check(ctx, dims, target, level, internalFormat,<br>
-                              format, type, width, height, depth, border))<br>
+                              format, type, width, height, depth, border,<br>
+                              pixels))<br>
          return;<br>
    }<br>
<br>
@@ -3570,7 +3594,8 @@ texsubimage(struct gl_context *ctx, GLuint dims, GLenum target, GLint level,<br>
<br>
    if (texsubimage_error_check(ctx, dims, texObj, target, level,<br>
                                xoffset, yoffset, zoffset,<br>
-                               width, height, depth, format, type, false)) {<br>
+                               width, height, depth, format, type,<br>
+                               pixels, false)) {<br>
       return;   /* error was detected */<br>
    }<br>
<br>
@@ -3624,7 +3649,8 @@ texturesubimage(struct gl_context *ctx, GLuint dims,<br>
<br>
    if (texsubimage_error_check(ctx, dims, texObj, texObj->Target, level,<br>
                                xoffset, yoffset, zoffset,<br>
-                               width, height, depth, format, type, true)) {<br>
+                               width, height, depth, format, type,<br>
+                               pixels, true)) {<br>
       return;   /* error was detected */<br>
    }<br>
<br>
@@ -4633,7 +4659,8 @@ compressed_subtexture_error_check(struct gl_context *ctx, GLint dims,<br>
                                   GLenum target, GLint level,<br>
                                   GLint xoffset, GLint yoffset, GLint zoffset,<br>
                                   GLsizei width, GLsizei height, GLsizei depth,<br>
-                                  GLenum format, GLsizei imageSize, bool dsa)<br>
+                                  GLenum format, GLsizei imageSize,<br>
+                                  const GLvoid *data, bool dsa)<br>
 {<br>
    struct gl_texture_image *texImage;<br>
    GLint expectedSize;<br>
@@ -4653,6 +4680,12 @@ compressed_subtexture_error_check(struct gl_context *ctx, GLint dims,<br>
       return GL_TRUE;<br>
    }<br>
<br>
+   /* validate the bound PBO, if any */<br>
+   if (!_mesa_validate_pbo_source_compressed(ctx, dims, &ctx->Unpack,<br>
+                                     imageSize, data, "glCompressedTexImage")) {<br>
+      return GL_TRUE;<br>
+   }<br>
+<br>
    /* Check for invalid pixel storage modes */<br>
    if (!_mesa_compressed_pixel_storage_error_check(ctx, dims,<br>
                &ctx->Unpack,<br>
@@ -4758,7 +4791,7 @@ _mesa_compressed_texture_sub_image(struct gl_context *ctx, GLuint dims,<br>
    if (compressed_subtexture_error_check(ctx, dims, texObj, target,<br>
                                          level, xoffset, yoffset, zoffset,<br>
                                          width, height, depth,<br>
-                                         format, imageSize, dsa)) {<br>
+                                         format, imageSize, data, dsa)) {<br>
       return;<br>
    }<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
2.1.3<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div>