[Mesa-dev] [PATCH 3/6] main: Added entry point for glTransformFeedbackBufferRange
Martin Peres
martin.peres at linux.intel.com
Thu Jan 29 04:55:23 PST 2015
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.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 | 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;
- }
+ }
+
+ 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
More information about the mesa-dev
mailing list