OSDN Git Service

mesa: add error checks to glMapBufferRange, glMapBuffer for ARB_buffer_storage
authorMarek Olšák <marek.olsak@amd.com>
Mon, 27 Jan 2014 20:31:58 +0000 (21:31 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 25 Feb 2014 15:04:22 +0000 (16:04 +0100)
Reviewed-by: Fredrik Höglund <fredrik@kde.org>
src/mesa/main/bufferobj.c

index 22d14ba..b971014 100644 (file)
@@ -1577,6 +1577,20 @@ _mesa_MapBuffer(GLenum target, GLenum access)
    if (!bufObj)
       return NULL;
 
+   if (accessFlags & GL_MAP_READ_BIT &&
+       !(bufObj->StorageFlags & GL_MAP_READ_BIT)) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glMapBuffer(invalid read flag)");
+      return NULL;
+   }
+
+   if (accessFlags & GL_MAP_WRITE_BIT &&
+       !(bufObj->StorageFlags & GL_MAP_WRITE_BIT)) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glMapBuffer(invalid write flag)");
+      return NULL;
+   }
+
    if (_mesa_bufferobj_mapped(bufObj)) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glMapBufferARB(already mapped)");
       return NULL;
@@ -1931,6 +1945,7 @@ _mesa_MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length,
    GET_CURRENT_CONTEXT(ctx);
    struct gl_buffer_object *bufObj;
    void *map;
+   GLbitfield allowed_access;
 
    ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, NULL);
 
@@ -1965,13 +1980,20 @@ _mesa_MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length,
       return NULL;
    }
 
-   if (access & ~(GL_MAP_READ_BIT |
-                  GL_MAP_WRITE_BIT |
-                  GL_MAP_INVALIDATE_RANGE_BIT |
-                  GL_MAP_INVALIDATE_BUFFER_BIT |
-                  GL_MAP_FLUSH_EXPLICIT_BIT |
-                  GL_MAP_UNSYNCHRONIZED_BIT)) {
-      /* generate an error if any undefind bit is set */
+   allowed_access = GL_MAP_READ_BIT |
+                    GL_MAP_WRITE_BIT |
+                    GL_MAP_INVALIDATE_RANGE_BIT |
+                    GL_MAP_INVALIDATE_BUFFER_BIT |
+                    GL_MAP_FLUSH_EXPLICIT_BIT |
+                    GL_MAP_UNSYNCHRONIZED_BIT;
+
+   if (ctx->Extensions.ARB_buffer_storage) {
+         allowed_access |= GL_MAP_PERSISTENT_BIT |
+                           GL_MAP_COHERENT_BIT;
+   }
+
+   if (access & ~allowed_access) {
+      /* generate an error if any other than allowed bit is set */
       _mesa_error(ctx, GL_INVALID_VALUE, "glMapBufferRange(access)");
       return NULL;
    }
@@ -2002,6 +2024,34 @@ _mesa_MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length,
    if (!bufObj)
       return NULL;
 
+   if (access & GL_MAP_READ_BIT &&
+       !(bufObj->StorageFlags & GL_MAP_READ_BIT)) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glMapBufferRange(invalid read flag)");
+      return NULL;
+   }
+
+   if (access & GL_MAP_WRITE_BIT &&
+       !(bufObj->StorageFlags & GL_MAP_WRITE_BIT)) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glMapBufferRange(invalid write flag)");
+      return NULL;
+   }
+
+   if (access & GL_MAP_COHERENT_BIT &&
+       !(bufObj->StorageFlags & GL_MAP_COHERENT_BIT)) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glMapBufferRange(invalid coherent flag)");
+      return NULL;
+   }
+
+   if (access & GL_MAP_PERSISTENT_BIT &&
+       !(bufObj->StorageFlags & GL_MAP_PERSISTENT_BIT)) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glMapBufferRange(invalid persistent flag)");
+      return NULL;
+   }
+
    if (offset + length > bufObj->Size) {
       _mesa_error(ctx, GL_INVALID_VALUE,
                   "glMapBufferRange(offset + length > size)");