mesa: Check that all buffers are bound in BeginTransformFeedback.

From the EXT_transform_feedback spec:

    The error INVALID_OPERATION is generated by
    BeginTransformFeedbackEXT if any transform feedback buffer object
    binding point used in transform feedback mode does not have a
    buffer object bound.

This required adding a new NumBuffers field to the
gl_transform_feedback_info struct, to keep track of how many transform
feedback buffers are required by the current program.

Fixes Piglit tests:
- EXT_transform_feedback/api-errors interleaved_unbound
- EXT_transform_feedback/api-errors separate_unbound_0_1
- EXT_transform_feedback/api-errors separate_unbound_0_2
- EXT_transform_feedback/api-errors separate_unbound_1_2

Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
Paul Berry
2011-12-29 15:55:01 -08:00
parent 1979e22e13
commit ebfad9f6a1
3 changed files with 22 additions and 2 deletions
+5 -2
View File
@@ -1865,11 +1865,14 @@ store_tfeedback_info(struct gl_context *ctx, struct gl_shader_program *prog,
tfeedback_decl *tfeedback_decls)
{
unsigned total_tfeedback_components = 0;
bool separate_attribs_mode =
prog->TransformFeedback.BufferMode == GL_SEPARATE_ATTRIBS;
memset(&prog->LinkedTransformFeedback, 0,
sizeof(prog->LinkedTransformFeedback));
prog->LinkedTransformFeedback.NumBuffers =
separate_attribs_mode ? num_tfeedback_decls : 1;
for (unsigned i = 0; i < num_tfeedback_decls; ++i) {
unsigned buffer =
prog->TransformFeedback.BufferMode == GL_SEPARATE_ATTRIBS ? i : 0;
unsigned buffer = separate_attribs_mode ? i : 0;
if (!tfeedback_decls[i].store(prog, &prog->LinkedTransformFeedback,
buffer))
return false;
+5
View File
@@ -1821,6 +1821,11 @@ struct gl_uniform_list;
struct gl_transform_feedback_info {
unsigned NumOutputs;
/**
* Number of transform feedback buffers in use by this program.
*/
unsigned NumBuffers;
struct {
unsigned OutputRegister;
unsigned OutputBuffer;
+12
View File
@@ -342,9 +342,12 @@ void GLAPIENTRY
_mesa_BeginTransformFeedback(GLenum mode)
{
struct gl_transform_feedback_object *obj;
struct gl_transform_feedback_info *info;
int i;
GET_CURRENT_CONTEXT(ctx);
obj = ctx->TransformFeedback.CurrentObject;
info = &ctx->Shader.CurrentVertexProgram->LinkedTransformFeedback;
switch (mode) {
case GL_POINTS:
@@ -363,6 +366,15 @@ _mesa_BeginTransformFeedback(GLenum mode)
return;
}
for (i = 0; i < info->NumBuffers; ++i) {
if (obj->BufferNames[i] == 0) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glBeginTransformFeedback(binding point %d does not have "
"a buffer object bound)", i);
return;
}
}
FLUSH_VERTICES(ctx, _NEW_TRANSFORM_FEEDBACK);
obj->Active = GL_TRUE;
ctx->TransformFeedback.Mode = mode;