mesa: create validate_buffer_sub_data() helper
authorTimothy Arceri <tarceri@itsqueeze.com>
Fri, 12 May 2017 07:10:10 +0000 (17:10 +1000)
committerTimothy Arceri <tarceri@itsqueeze.com>
Wed, 17 May 2017 00:12:03 +0000 (10:12 +1000)
This change assumes meta will always pass valid arguments to
_mesa_buffer_sub_data().

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/mesa/drivers/common/meta.c
src/mesa/drivers/common/meta_blit.c
src/mesa/main/bufferobj.c
src/mesa/main/bufferobj.h

index 47ef16b3e7d2721c8ef5dbe6f236c7a7153cb1a7..1ff46515f121a347aa7ae19cf145e16fc51eb58d 100644 (file)
@@ -1902,8 +1902,7 @@ _mesa_meta_CopyPixels(struct gl_context *ctx, GLint srcX, GLint srcY,
       verts[3].tex[1] = tex->Ttop;
 
       /* upload new vertex data */
-      _mesa_buffer_sub_data(ctx, copypix->buf_obj, 0, sizeof(verts), verts,
-                            __func__);
+      _mesa_buffer_sub_data(ctx, copypix->buf_obj, 0, sizeof(verts), verts);
    }
 
    _mesa_set_enable(ctx, tex->Target, GL_TRUE);
@@ -2422,8 +2421,7 @@ _mesa_meta_Bitmap(struct gl_context *ctx,
       }
 
       /* upload new vertex data */
-      _mesa_buffer_sub_data(ctx, bitmap->buf_obj, 0, sizeof(verts), verts,
-                            __func__);
+      _mesa_buffer_sub_data(ctx, bitmap->buf_obj, 0, sizeof(verts), verts);
    }
 
    /* choose different foreground/background alpha values */
@@ -3140,8 +3138,7 @@ decompress_texture_image(struct gl_context *ctx,
    _mesa_set_viewport(ctx, 0, 0, 0, width, height);
 
    /* upload new vertex data */
-   _mesa_buffer_sub_data(ctx, decompress->buf_obj, 0, sizeof(verts), verts,
-                         __func__);
+   _mesa_buffer_sub_data(ctx, decompress->buf_obj, 0, sizeof(verts), verts);
 
    /* setup texture state */
    _mesa_BindTexture(target, texObj->Name);
@@ -3409,8 +3406,7 @@ _mesa_meta_DrawTex(struct gl_context *ctx, GLfloat x, GLfloat y, GLfloat z,
          verts[3].st[i][1] = t1;
       }
 
-      _mesa_buffer_sub_data(ctx, drawtex->buf_obj, 0, sizeof(verts), verts,
-                            __func__);
+      _mesa_buffer_sub_data(ctx, drawtex->buf_obj, 0, sizeof(verts), verts);
    }
 
    _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4);
index 991d52f21e9e1e12e73fe161447f5a94600aae33..e8719a3a7702ed234088a7e96b4a31eca299032c 100644 (file)
@@ -800,8 +800,7 @@ blitframebuffer_texture(struct gl_context *ctx,
       verts[3].tex[1] = t1;
       verts[3].tex[2] = readAtt->Zoffset;
 
-      _mesa_buffer_sub_data(ctx, blit->buf_obj, 0, sizeof(verts), verts,
-                            __func__);
+      _mesa_buffer_sub_data(ctx, blit->buf_obj, 0, sizeof(verts), verts);
    }
 
    /* setup viewport */
index 674ff630cd68b7f990aa59b262b0819b9414ae1a..97e4df91875cb31d3fe25ff344a5d93c5d1ce611 100644 (file)
@@ -1793,42 +1793,27 @@ _mesa_NamedBufferData(GLuint buffer, GLsizeiptr size, const GLvoid *data,
 }
 
 
-/**
- * Implementation for glBufferSubData and glNamedBufferSubData.
- *
- * \param ctx     GL context.
- * \param bufObj  The buffer object.
- * \param offset  Offset of the first byte of the subdata range.
- * \param size    Size, in bytes, of the subdata range.
- * \param data    The data store.
- * \param func  Name of calling function for recording errors.
- *
- */
-void
-_mesa_buffer_sub_data(struct gl_context *ctx, struct gl_buffer_object *bufObj,
-                      GLintptr offset, GLsizeiptr size, const GLvoid *data,
-                      const char *func)
+static bool
+validate_buffer_sub_data(struct gl_context *ctx,
+                         struct gl_buffer_object *bufObj,
+                         GLintptr offset, GLsizeiptr size,
+                         const char *func)
 {
    if (!buffer_object_subdata_range_good(ctx, bufObj, offset, size,
                                          true, func)) {
       /* error already recorded */
-      return;
+      return false;
    }
 
    if (bufObj->Immutable &&
        !(bufObj->StorageFlags & GL_DYNAMIC_STORAGE_BIT)) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "%s", func);
-      return;
+      return false;
    }
 
-   if (size == 0)
-      return;
-
-   bufObj->NumSubDataCalls++;
-
    if ((bufObj->Usage == GL_STATIC_DRAW ||
         bufObj->Usage == GL_STATIC_COPY) &&
-       bufObj->NumSubDataCalls >= BUFFER_WARNING_CALL_COUNT) {
+       bufObj->NumSubDataCalls >= BUFFER_WARNING_CALL_COUNT - 1) {
       /* If the application declared the buffer as static draw/copy or stream
        * draw, it should not be frequently modified with glBufferSubData.
        */
@@ -1839,6 +1824,29 @@ _mesa_buffer_sub_data(struct gl_context *ctx, struct gl_buffer_object *bufObj,
                            _mesa_enum_to_string(bufObj->Usage));
    }
 
+   return true;
+}
+
+
+/**
+ * Implementation for glBufferSubData and glNamedBufferSubData.
+ *
+ * \param ctx     GL context.
+ * \param bufObj  The buffer object.
+ * \param offset  Offset of the first byte of the subdata range.
+ * \param size    Size, in bytes, of the subdata range.
+ * \param data    The data store.
+ * \param func  Name of calling function for recording errors.
+ *
+ */
+void
+_mesa_buffer_sub_data(struct gl_context *ctx, struct gl_buffer_object *bufObj,
+                      GLintptr offset, GLsizeiptr size, const GLvoid *data)
+{
+   if (size == 0)
+      return;
+
+   bufObj->NumSubDataCalls++;
    bufObj->Written = GL_TRUE;
    bufObj->MinMaxCacheDirty = true;
 
@@ -1852,12 +1860,14 @@ _mesa_BufferSubData(GLenum target, GLintptr offset,
 {
    GET_CURRENT_CONTEXT(ctx);
    struct gl_buffer_object *bufObj;
+   const char *func = "glBufferSubData";
 
-   bufObj = get_buffer(ctx, "glBufferSubData", target, GL_INVALID_OPERATION);
+   bufObj = get_buffer(ctx, func, target, GL_INVALID_OPERATION);
    if (!bufObj)
       return;
 
-   _mesa_buffer_sub_data(ctx, bufObj, offset, size, data, "glBufferSubData");
+   if (validate_buffer_sub_data(ctx, bufObj, offset, size, func))
+      _mesa_buffer_sub_data(ctx, bufObj, offset, size, data);
 }
 
 void GLAPIENTRY
@@ -1866,13 +1876,14 @@ _mesa_NamedBufferSubData(GLuint buffer, GLintptr offset,
 {
    GET_CURRENT_CONTEXT(ctx);
    struct gl_buffer_object *bufObj;
+   const char *func = "glNamedBufferSubData";
 
-   bufObj = _mesa_lookup_bufferobj_err(ctx, buffer, "glNamedBufferSubData");
+   bufObj = _mesa_lookup_bufferobj_err(ctx, buffer, func);
    if (!bufObj)
       return;
 
-   _mesa_buffer_sub_data(ctx, bufObj, offset, size, data,
-                         "glNamedBufferSubData");
+   if (validate_buffer_sub_data(ctx, bufObj, offset, size, func))
+      _mesa_buffer_sub_data(ctx, bufObj, offset, size, data);
 }
 
 
index 024d07daaf8352a85e8f393d67028a580973f88e..a7a9673b85247066e49a290930f048d5ce2f0fc7 100644 (file)
@@ -139,8 +139,7 @@ _mesa_buffer_data(struct gl_context *ctx, struct gl_buffer_object *bufObj,
 
 extern void
 _mesa_buffer_sub_data(struct gl_context *ctx, struct gl_buffer_object *bufObj,
-                      GLintptr offset, GLsizeiptr size, const GLvoid *data,
-                      const char *func);
+                      GLintptr offset, GLsizeiptr size, const GLvoid *data);
 
 extern void
 _mesa_buffer_unmap_all_mappings(struct gl_context *ctx,