[Mesa-dev] [PATCH 09/14] mesa: don't install glDraw* functions into the BeginEnd dispatch table
Brian Paul
brianp at vmware.com
Wed Apr 24 17:32:23 PDT 2013
Functions like glDrawArrays, glDrawElements, etc. are illegal between
glBegin/glEnd and should generate GL_INVALID_OPERATION.
Fixes several piglit gl-1.0-beginend-coverage failures.
---
src/mesa/main/vtxfmt.c | 73 ++++++++++++++++++++++++++++-------------------
1 files changed, 43 insertions(+), 30 deletions(-)
diff --git a/src/mesa/main/vtxfmt.c b/src/mesa/main/vtxfmt.c
index 712b2bf..a2f4150 100644
--- a/src/mesa/main/vtxfmt.c
+++ b/src/mesa/main/vtxfmt.c
@@ -41,6 +41,8 @@
/**
* Use the per-vertex functions found in <vfmt> to initialize the given
* API dispatch table.
+ * If beginend is true, only plug in the functions which are legal
+ * between glBegin/glEnd.
*/
static void
install_vtxfmt(struct gl_context *ctx, struct _glapi_table *tab,
@@ -114,36 +116,47 @@ install_vtxfmt(struct gl_context *ctx, struct _glapi_table *tab,
SET_Rectf(tab, vfmt->Rectf);
}
- SET_DrawArrays(tab, vfmt->DrawArrays);
- SET_DrawElements(tab, vfmt->DrawElements);
- if (_mesa_is_desktop_gl(ctx) || _mesa_is_gles3(ctx)) {
- SET_DrawRangeElements(tab, vfmt->DrawRangeElements);
- }
-
- SET_MultiDrawElementsEXT(tab, vfmt->MultiDrawElementsEXT);
-
- if (_mesa_is_desktop_gl(ctx)) {
- SET_DrawElementsBaseVertex(tab, vfmt->DrawElementsBaseVertex);
- SET_DrawRangeElementsBaseVertex(tab, vfmt->DrawRangeElementsBaseVertex);
- SET_MultiDrawElementsBaseVertex(tab, vfmt->MultiDrawElementsBaseVertex);
- SET_DrawArraysInstancedBaseInstance(tab, vfmt->DrawArraysInstancedBaseInstance);
- SET_DrawElementsInstancedBaseInstance(tab, vfmt->DrawElementsInstancedBaseInstance);
- SET_DrawElementsInstancedBaseVertex(tab, vfmt->DrawElementsInstancedBaseVertex);
- SET_DrawElementsInstancedBaseVertexBaseInstance(tab, vfmt->DrawElementsInstancedBaseVertexBaseInstance);
- }
-
- if (_mesa_is_desktop_gl(ctx) || _mesa_is_gles3(ctx)) {
- SET_DrawArraysInstancedARB(tab, vfmt->DrawArraysInstanced);
- SET_DrawElementsInstancedARB(tab, vfmt->DrawElementsInstanced);
- }
-
- if (_mesa_is_desktop_gl(ctx)) {
- SET_DrawTransformFeedback(tab, vfmt->DrawTransformFeedback);
- SET_DrawTransformFeedbackStream(tab, vfmt->DrawTransformFeedbackStream);
- SET_DrawTransformFeedbackInstanced(tab,
- vfmt->DrawTransformFeedbackInstanced);
- SET_DrawTransformFeedbackStreamInstanced(tab,
- vfmt->DrawTransformFeedbackStreamInstanced);
+ if (!beginend) {
+ /* These functions are only valid outside glBegin/glEnd */
+ SET_DrawArrays(tab, vfmt->DrawArrays);
+ SET_DrawElements(tab, vfmt->DrawElements);
+
+ if (_mesa_is_desktop_gl(ctx) || _mesa_is_gles3(ctx)) {
+ SET_DrawRangeElements(tab, vfmt->DrawRangeElements);
+ }
+
+ SET_MultiDrawElementsEXT(tab, vfmt->MultiDrawElementsEXT);
+
+ if (_mesa_is_desktop_gl(ctx)) {
+ SET_DrawElementsBaseVertex(tab, vfmt->DrawElementsBaseVertex);
+ SET_DrawRangeElementsBaseVertex(tab,
+ vfmt->DrawRangeElementsBaseVertex);
+ SET_MultiDrawElementsBaseVertex(tab,
+ vfmt->MultiDrawElementsBaseVertex);
+ SET_DrawArraysInstancedBaseInstance(tab,
+ vfmt->DrawArraysInstancedBaseInstance);
+ SET_DrawElementsInstancedBaseInstance(tab,
+ vfmt->DrawElementsInstancedBaseInstance);
+ SET_DrawElementsInstancedBaseVertex(tab,
+ vfmt->DrawElementsInstancedBaseVertex);
+ SET_DrawElementsInstancedBaseVertexBaseInstance(tab,
+ vfmt->DrawElementsInstancedBaseVertexBaseInstance);
+ }
+
+ if (_mesa_is_desktop_gl(ctx) || _mesa_is_gles3(ctx)) {
+ SET_DrawArraysInstancedARB(tab, vfmt->DrawArraysInstanced);
+ SET_DrawElementsInstancedARB(tab, vfmt->DrawElementsInstanced);
+ }
+
+ if (_mesa_is_desktop_gl(ctx)) {
+ SET_DrawTransformFeedback(tab, vfmt->DrawTransformFeedback);
+ SET_DrawTransformFeedbackStream(tab,
+ vfmt->DrawTransformFeedbackStream);
+ SET_DrawTransformFeedbackInstanced(tab,
+ vfmt->DrawTransformFeedbackInstanced);
+ SET_DrawTransformFeedbackStreamInstanced(tab,
+ vfmt->DrawTransformFeedbackStreamInstanced);
+ }
}
/* Originally for GL_NV_vertex_program, this is also used by dlist.c */
--
1.7.3.4
More information about the mesa-dev
mailing list