diff options
author | Eric Anholt <[email protected]> | 2012-03-14 14:44:22 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2012-03-19 22:01:53 -0700 |
commit | 56118ef9292caa947216d6b0a75c6ae588419556 (patch) | |
tree | 6c90f3b763463fde7899f316fa99282359424b5f | |
parent | 7ca4f07b5b77ccac0a9b60dc5ac9082906b5947e (diff) |
mesa: Validate the drawing primitive against the transform feedback mode.
Fixes piglit GL_EXT_transform_feedback/negative-prims.
Reviewed-by: Brian Paul <[email protected]>
-rw-r--r-- | src/mesa/main/api_validate.c | 45 | ||||
-rw-r--r-- | src/mesa/main/transformfeedback.c | 27 | ||||
-rw-r--r-- | src/mesa/main/transformfeedback.h | 3 |
3 files changed, 43 insertions, 32 deletions
diff --git a/src/mesa/main/api_validate.c b/src/mesa/main/api_validate.c index 17da5d01b7e..02495a15a90 100644 --- a/src/mesa/main/api_validate.c +++ b/src/mesa/main/api_validate.c @@ -29,6 +29,7 @@ #include "imports.h" #include "mfeatures.h" #include "mtypes.h" +#include "enums.h" #include "vbo/vbo.h" @@ -215,9 +216,49 @@ _mesa_valid_prim_mode(struct gl_context *ctx, GLenum mode, const char *name) _mesa_error(ctx, GL_INVALID_ENUM, "%s(mode=%x)", name, mode); return GL_FALSE; } - else { - return GL_TRUE; + + /* From the GL_EXT_transform_feedback spec: + * + * "The error INVALID_OPERATION is generated if Begin, or any command + * that performs an explicit Begin, is called when: + * + * * a geometry shader is not active and <mode> does not match the + * allowed begin modes for the current transform feedback state as + * given by table X.1. + * + * * a geometry shader is active and the output primitive type of the + * geometry shader does not match the allowed begin modes for the + * current transform feedback state as given by table X.1. + * + */ + if (ctx->TransformFeedback.CurrentObject->Active && + !ctx->TransformFeedback.CurrentObject->Paused) { + GLboolean pass = GL_TRUE; + + switch (mode) { + case GL_POINTS: + pass = ctx->TransformFeedback.Mode == GL_POINTS; + break; + case GL_LINES: + case GL_LINE_STRIP: + case GL_LINE_LOOP: + pass = ctx->TransformFeedback.Mode == GL_LINES; + break; + default: + pass = ctx->TransformFeedback.Mode == GL_TRIANGLES; + break; + } + if (!pass) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "%s(mode=%s vs transform feedback %s)", + name, + _mesa_lookup_prim_by_nr(mode), + _mesa_lookup_prim_by_nr(ctx->TransformFeedback.Mode)); + return GL_FALSE; + } } + + return GL_TRUE; } diff --git a/src/mesa/main/transformfeedback.c b/src/mesa/main/transformfeedback.c index c2114c22766..f2c1435d9e7 100644 --- a/src/mesa/main/transformfeedback.c +++ b/src/mesa/main/transformfeedback.c @@ -89,33 +89,6 @@ reference_transform_feedback_object(struct gl_transform_feedback_object **ptr, /** - * Check if the given primitive mode (as in glBegin(mode)) is compatible - * with the current transform feedback mode (if it's enabled). - * This is to be called from glBegin(), glDrawArrays(), glDrawElements(), etc. - * - * \return GL_TRUE if the mode is OK, GL_FALSE otherwise. - */ -GLboolean -_mesa_validate_primitive_mode(struct gl_context *ctx, GLenum mode) -{ - if (ctx->TransformFeedback.CurrentObject->Active && - !ctx->TransformFeedback.CurrentObject->Paused) { - switch (mode) { - case GL_POINTS: - return ctx->TransformFeedback.Mode == GL_POINTS; - case GL_LINES: - case GL_LINE_STRIP: - case GL_LINE_LOOP: - return ctx->TransformFeedback.Mode == GL_LINES; - default: - return ctx->TransformFeedback.Mode == GL_TRIANGLES; - } - } - return GL_TRUE; -} - - -/** * Check that all the buffer objects currently bound for transform * feedback actually exist. Raise a GL_INVALID_OPERATION error if * any buffers are missing. diff --git a/src/mesa/main/transformfeedback.h b/src/mesa/main/transformfeedback.h index 8a6672d58de..7d63de01744 100644 --- a/src/mesa/main/transformfeedback.h +++ b/src/mesa/main/transformfeedback.h @@ -42,9 +42,6 @@ _mesa_free_transform_feedback(struct gl_context *ctx); #if FEATURE_EXT_transform_feedback extern GLboolean -_mesa_validate_primitive_mode(struct gl_context *ctx, GLenum mode); - -extern GLboolean _mesa_validate_transform_feedback_buffers(struct gl_context *ctx); |