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

Laura Ekstrand laura at jlekstrand.net
Fri Feb 20 17:02:23 PST 2015


On Mon, Feb 16, 2015 at 6:13 AM, Martin Peres <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>
> ---
>  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
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>

Otherwise, this is good.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150220/1d54983b/attachment-0001.html>


More information about the mesa-dev mailing list