[Mesa-dev] [PATCH 06/16] main: Added entry point for glTransformFeedbackBufferRange

Martin Peres martin.peres at linux.intel.com
Mon Feb 23 04:55:51 PST 2015


Like the previous patch, I wonder what I was thinking.

Anyway, should be good now. I'll send the new versions as a response. No 
need to re-send the whole series for now.

On 21/02/15 03:02, Laura Ekstrand wrote:
>
>
> On Mon, Feb 16, 2015 at 6:13 AM, Martin Peres 
> <martin.peres at linux.intel.com <mailto:martin.peres at linux.intel.com>> 
> wrote:
>
>     v2: review from Laura Ekstrand
>     - use the refactored code to lookup the objects
>     - improve some error messages
>     - factor out the gl method name computation
>     - better handle the spec differences between the DSA and non-DSA cases
>     - quote the spec a little more
>
>     v3: review from Laura Ekstrand
>     - use the new name of _mesa_lookup_bufferobj_err
>     - swap the comments around the offset and size checks
>
>     v4: review from Laura Ekstrand
>     - add more spec quotes
>     - properly fix the comments around the offset and size checks
>
>     Signed-off-by: Martin Peres <martin.peres at linux.intel.com
>     <mailto:martin.peres at linux.intel.com>>
>     ---
>      src/mapi/glapi/gen/ARB_direct_state_access.xml |  8 +++
>      src/mesa/main/bufferobj.c                      |  3 +-
>      src/mesa/main/tests/dispatch_sanity.cpp        |  1 +
>      src/mesa/main/transformfeedback.c              | 98
>     +++++++++++++++++++++-----
>      src/mesa/main/transformfeedback.h              |  6 +-
>      5 files changed, 97 insertions(+), 19 deletions(-)
>
>     diff --git a/src/mapi/glapi/gen/ARB_direct_state_access.xml
>     b/src/mapi/glapi/gen/ARB_direct_state_access.xml
>     index 35d6906..b3c090f 100644
>     --- a/src/mapi/glapi/gen/ARB_direct_state_access.xml
>     +++ b/src/mapi/glapi/gen/ARB_direct_state_access.xml
>     @@ -20,6 +20,14 @@
>            <param name="buffer" type="GLuint" />
>         </function>
>
>     +   <function name="TransformFeedbackBufferRange" offset="assign">
>     +      <param name="xfb" type="GLuint" />
>     +      <param name="index" type="GLuint" />
>     +      <param name="buffer" type="GLuint" />
>     +      <param name="offset" type="GLintptr" />
>     +      <param name="size" type="GLsizeiptr" />
>     +   </function>
>     +
>         <!-- Texture object functions -->
>
>         <function name="CreateTextures" offset="assign">
>     diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
>     index 86532ea..7558e17 100644
>     --- a/src/mesa/main/bufferobj.c
>     +++ b/src/mesa/main/bufferobj.c
>     @@ -3548,7 +3548,8 @@ _mesa_BindBufferRange(GLenum target, GLuint
>     index,
>         case GL_TRANSFORM_FEEDBACK_BUFFER:
>            _mesa_bind_buffer_range_transform_feedback(ctx,
>     ctx->TransformFeedback.CurrentObject,
>     -                                                 index, bufObj,
>     offset, size);
>     +                                                 index, bufObj,
>     offset, size,
>     +                                                 false);
>            return;
>         case GL_UNIFORM_BUFFER:
>            bind_buffer_range_uniform_buffer(ctx, index, bufObj,
>     offset, size);
>     diff --git a/src/mesa/main/tests/dispatch_sanity.cpp
>     b/src/mesa/main/tests/dispatch_sanity.cpp
>     index 183755f..87f7d6f 100644
>     --- a/src/mesa/main/tests/dispatch_sanity.cpp
>     +++ b/src/mesa/main/tests/dispatch_sanity.cpp
>     @@ -957,6 +957,7 @@ const struct function
>     gl_core_functions_possible[] = {
>         /* GL_ARB_direct_state_access */
>         { "glCreateTransformFeedbacks", 45, -1 },
>         { "glTransformFeedbackBufferBase", 45, -1 },
>     +   { "glTransformFeedbackBufferRange", 45, -1 },
>         { "glCreateTextures", 45, -1 },
>         { "glTextureStorage1D", 45, -1 },
>         { "glTextureStorage2D", 45, -1 },
>     diff --git a/src/mesa/main/transformfeedback.c
>     b/src/mesa/main/transformfeedback.c
>     index d932943..2dded21 100644
>     --- a/src/mesa/main/transformfeedback.c
>     +++ b/src/mesa/main/transformfeedback.c
>     @@ -541,7 +541,8 @@ bind_buffer_range(struct gl_context *ctx,
>      /**
>       * Specify a buffer object to receive transform feedback
>     results.  Plus,
>       * specify the starting offset to place the results, and max size.
>     - * Called from the glBindBufferRange() function.
>     + * Called from the glBindBufferRange() and
>     glTransformFeedbackBufferRange
>     + * functions.
>       */
>      void
>      _mesa_bind_buffer_range_transform_feedback(struct gl_context *ctx,
>     @@ -549,35 +550,74 @@
>     _mesa_bind_buffer_range_transform_feedback(struct gl_context *ctx,
>                                                 GLuint index,
>                                                 struct
>     gl_buffer_object *bufObj,
>                                                 GLintptr offset,
>     -                                           GLsizeiptr size)
>     +                                           GLsizeiptr size,
>     +                                           bool dsa)
>      {
>     +   const char *gl_methd_name;
>     +   if (dsa)
>     +      gl_methd_name = "glTransformFeedbackBufferRange";
>     +   else
>     +      gl_methd_name = "glBindBufferRange";
>     +
>     +
>         if (obj->Active) {
>     -      _mesa_error(ctx, GL_INVALID_OPERATION,
>     -                  "glBindBufferRange(transform feedback active)");
>     +      _mesa_error(ctx, GL_INVALID_OPERATION, "%s(transform
>     feedback active)",
>     +                  gl_methd_name);
>            return;
>         }
>
>         if (index >= ctx->Const.MaxTransformFeedbackBuffers) {
>     -      _mesa_error(ctx, GL_INVALID_VALUE,
>     "glBindBufferRange(index=%d "
>     -                  "out of bounds)", index);
>     +      /* OpenGL 4.5 core profile, 6.1, pdf page 82: An
>     INVALID_VALUE error is
>     +       * generated if index is greater than or equal to the
>     number of binding
>     +       * points for transform feedback, as described in section
>     6.7.1.
>
> Again, "" would be nice around this and the other spec quotes in this 
> file.
>
>     +       */
>     +      _mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%d out of
>     bounds)",
>     +                  gl_methd_name, index);
>            return;
>         }
>
>         if (size & 0x3) {
>     -      /* must a multiple of four */
>     -      _mesa_error(ctx, GL_INVALID_VALUE,
>     "glBindBufferRange(size=%d)",
>     -                  (int) size);
>     +      /* OpenGL 4.5 core profile, 6.7, pdf page 103: multiple of 4 */
>     +      _mesa_error(ctx, GL_INVALID_VALUE, "%s(size=%d must be a
>     multiple of "
>     +                  "four)", gl_methd_name, (int) size);
>            return;
>         }
>
>         if (offset & 0x3) {
>     -      /* must be multiple of four */
>     -      _mesa_error(ctx, GL_INVALID_VALUE,
>     -                  "glBindBufferRange(offset=%d)", (int) offset);
>     +      /* OpenGL 4.5 core profile, 6.7, pdf page 103: multiple of 4 */
>     +      _mesa_error(ctx, GL_INVALID_VALUE, "gl%s(offset=%d must be
>     a multiple "
>
>               ^^^ Redundant "gl" here.
>
>     +                  "of four)", gl_methd_name, (int) offset);
>            return;
>     -   }
>     +   }
>     +
>     +   if (offset < 0) {
>     +      /* OpenGL 4.5 core profile, 6.1, pdf page 82: An
>     INVALID_VALUE error is
>     +       * generated by BindBufferRange if offset is negative.
>     +       *
>     +       * OpenGL 4.5 core profile, 13.2, pdf page 445: An
>     INVALID_VALUE error
>     +       * is generated by TransformFeedbackBufferRange if offset
>     is negative.
>     +       */
>     +      _mesa_error(ctx, GL_INVALID_VALUE, "%s(offset=%d must be >=
>     0)",
>     +                  gl_methd_name,
>     +                  (int) offset);
>     +      return;
>     +   }
>     +
>     +   if (size <= 0 && (dsa || bufObj != ctx->Shared->NullBufferObj)) {
>     +      /* OpenGL 4.5 core profile, 6.1, pdf page 82: An
>     INVALID_VALUE error is
>     +       * generated by BindBufferRange if buffer is non-zero and
>     size is less
>     +       * than or equal to zero.
>     +       *
>     +       * OpenGL 4.5 core profile, 13.2, pdf page 445: An
>     INVALID_VALUE error
>     +       * is generated by TransformFeedbackBufferRange if size is
>     less than or
>     +       * equal to zero.
>     +       */
>     +      _mesa_error(ctx, GL_INVALID_VALUE, "%s(size=%d must be > 0)",
>     +                  gl_methd_name, (int) size);
>     +      return;
>     +   }
>
>     -   bind_buffer_range(ctx, obj, index, bufObj, offset, size, false);
>     +   bind_buffer_range(ctx, obj, index, bufObj, offset, size, dsa);
>      }
>
>
>     @@ -596,14 +636,14 @@
>     _mesa_bind_buffer_base_transform_feedback(struct gl_context *ctx,
>      {
>         if (obj->Active) {
>            _mesa_error(ctx, GL_INVALID_OPERATION,
>
> I don't like this change.  It was fine before.
>
>     -                  "%s(transform feedback active)",
>     - dsa?"glTransformFeedbackBufferBase":"glBindBufferBase");
>     +                  "gl%s(transform feedback active)",
>     + dsa?"TransformFeedbackBufferBase":"BindBufferBase");
>            return;
>         }
>
>         if (index >= ctx->Const.MaxTransformFeedbackBuffers) {
>            _mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%d out of
>     bounds)",
>     - dsa?"glTransformFeedbackBufferBase":"glBindBufferBase",
>
> This change should be rebased to the previous commit.
>
>     +                  dsa ? "glTransformFeedbackBufferBase" :
>     "glBindBufferBase",
>                        index);
>            return;
>         }
>     @@ -681,6 +721,30 @@ _mesa_TransformFeedbackBufferBase(GLuint xfb,
>     GLuint index, GLuint buffer)
>         _mesa_bind_buffer_base_transform_feedback(ctx, obj, index,
>     bufObj, true);
>      }
>
>     +void GLAPIENTRY
>     +_mesa_TransformFeedbackBufferRange(GLuint xfb, GLuint index,
>     GLuint buffer,
>     +                                   GLintptr offset, GLsizeiptr size)
>     +{
>     +   GET_CURRENT_CONTEXT(ctx);
>     +   struct gl_transform_feedback_object *obj;
>     +   struct gl_buffer_object *bufObj;
>     +
>     +   obj = lookup_transform_feedback_object_err(ctx, xfb,
>     + "glTransformFeedbackBufferRange");
>     +   if(!obj) {
>     +      return;
>     +   }
>     +
>     +   bufObj = lookup_transform_feedback_bufferobj_err(ctx, buffer,
>     + "glTransformFeedbackBufferRange");
>     +   if(!bufObj) {
>     +      return;
>     +   }
>     +
>     +   _mesa_bind_buffer_range_transform_feedback(ctx, obj, index,
>     bufObj, offset,
>     +                                              size, true);
>     +}
>     +
>      /**
>       * Specify a buffer object to receive transform feedback results,
>     plus the
>       * offset in the buffer to start placing results.
>     diff --git a/src/mesa/main/transformfeedback.h
>     b/src/mesa/main/transformfeedback.h
>     index 89c0155..6cad766 100644
>     --- a/src/mesa/main/transformfeedback.h
>     +++ b/src/mesa/main/transformfeedback.h
>     @@ -69,7 +69,7 @@
>     _mesa_bind_buffer_range_transform_feedback(struct gl_context *ctx,
>                                                GLuint index,
>                                                struct gl_buffer_object
>     *bufObj,
>                                                GLintptr offset,
>     -                                          GLsizeiptr size);
>     +                                          GLsizeiptr size, bool dsa);
>
>      extern void
>      _mesa_bind_buffer_base_transform_feedback(struct gl_context *ctx,
>     @@ -151,4 +151,8 @@ _mesa_set_transform_feedback_binding(struct
>     gl_context *ctx,
>      extern void GLAPIENTRY
>      _mesa_TransformFeedbackBufferBase(GLuint xfb, GLuint index,
>     GLuint buffer);
>
>     +extern void GLAPIENTRY
>     +_mesa_TransformFeedbackBufferRange(GLuint xfb, GLuint index,
>     GLuint buffer,
>     +                                   GLintptr offset, GLsizeiptr size);
>     +
>      #endif /* TRANSFORM_FEEDBACK_H */
>     --
>     2.3.0
>
>     _______________________________________________
>     mesa-dev mailing list
>     mesa-dev at lists.freedesktop.org <mailto:mesa-dev at lists.freedesktop.org>
>     http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
>
> Otherwise, this is good.
>



More information about the mesa-dev mailing list