On Thu, Jan 29, 2015 at 4:55 AM, Martin Peres <martin.pe...@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 > > Signed-off-by: Martin Peres <martin.pe...@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 | 94 > +++++++++++++++++++++----- > src/mesa/main/transformfeedback.h | 6 +- > 5 files changed, 94 insertions(+), 18 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 166401a..3b34f7b 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 6583974..7564b6f 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,72 @@ _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); > + /* 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. > + */ > + _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); > + /* must a be multiple of four */ > + _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); > + _mesa_error(ctx, GL_INVALID_VALUE, "gl%s(offset=%d must be a > multiple " > + "of four)", gl_methd_name, (int) offset); > return; > - } > + } > + > I think you got your offset and size comments in the wrong functions. They are mixed up. > + if (offset < 0) { > + /* An INVALID_VALUE error is generated by BindBufferRange if offset > is > + * negative. > + */ > + /* An INVALID_VALUE error is generated by > TransformFeedbackBufferRange > + * if size is less than or equal to zero. > + */ > + _mesa_error(ctx, GL_INVALID_VALUE, "%s(offset=%d must be >= 0)", > + gl_methd_name, > + (int) offset); > + return; > + } > > - bind_buffer_range(ctx, obj, index, bufObj, offset, size, false); > + if (size <= 0 && (dsa || bufObj != ctx->Shared->NullBufferObj)) { > + /* An INVALID_VALUE error is generated by BindBufferRange if buffer > is > + * non-zero and size is less than or equal to zero. > + */ > + /* An INVALID_VALUE error is generated by > TransformFeedbackBufferRange > + * if offset is negative. > + */ > + _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, dsa); > } > > > > @@ -596,14 +634,14 @@ _mesa_bind_buffer_base_transform_feedback(struct > gl_context *ctx, > { > if (obj->Active) { > _mesa_error(ctx, GL_INVALID_OPERATION, > - "%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", > + dsa ? "glTransformFeedbackBufferBase" : > "glBindBufferBase", > index); > return; > } > @@ -679,6 +717,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 = _mesa_lookup_transform_feedback_object_err(ctx, xfb, > + > "glTransformFeedbackBufferRange"); > + if(!obj) { > + return; > + } > + > + bufObj = _mesa_lookup_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 2c4ce58..1178169 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, > @@ -162,4 +162,8 @@ _mesa_lookup_bufferobj_err(struct gl_context *ctx, > GLuint buffer, > 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.2.2 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev