[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