mesa: Add support for glUniformBlockBinding() in display lists.
authorEric Anholt <eric@anholt.net>
Tue, 31 Jul 2012 21:28:05 +0000 (14:28 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 7 Aug 2012 20:54:51 +0000 (13:54 -0700)
Fixes piglit GL_ARB_uniform_buffer_object/dlist.

v2: Use the .ui fields instead of .i for type consistency (review by Brian
    Paul)

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/main/dlist.c

index 510fd1e18b329027989df8ed779eb76dc0fa52a6..5a813e98ac35ed513f8757864c3d6a90b5cbeea1 100644 (file)
@@ -482,6 +482,9 @@ typedef enum
    OPCODE_DRAW_TRANSFORM_FEEDBACK_INSTANCED,
    OPCODE_DRAW_TRANSFORM_FEEDBACK_STREAM_INSTANCED,
 
+   /* ARB_uniform_buffer_object */
+   OPCODE_UNIFORM_BLOCK_BINDING,
+
    /* The following three are meta instructions */
    OPCODE_ERROR,                /* raise compiled-in error */
    OPCODE_CONTINUE,
@@ -7582,6 +7585,23 @@ save_EndConditionalRender(void)
    }
 }
 
+static void GLAPIENTRY
+save_UniformBlockBinding(GLuint prog, GLuint index, GLuint binding)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   Node *n;
+   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
+   n = alloc_instruction(ctx, OPCODE_UNIFORM_BLOCK_BINDING, 3);
+   if (n) {
+      n[1].ui = prog;
+      n[2].ui = index;
+      n[3].ui = binding;
+   }
+   if (ctx->ExecuteFlag) {
+      CALL_UniformBlockBinding(ctx->Exec, (prog, index, binding));
+   }
+}
+
 
 /**
  * Save an error-generating command into display list.
@@ -8877,6 +8897,10 @@ execute_list(struct gl_context *ctx, GLuint list)
             CALL_EndConditionalRenderNV(ctx->Exec, ());
             break;
 
+         case OPCODE_UNIFORM_BLOCK_BINDING:
+            CALL_UniformBlockBinding(ctx->Exec, (n[1].ui, n[2].ui, n[3].ui));
+            break;
+
          case OPCODE_CONTINUE:
             n = (Node *) n[1].next;
             break;
@@ -10632,6 +10656,9 @@ _mesa_create_save_table(void)
    /* GL_ARB_debug_output (no dlist support) */
    _mesa_init_errors_dispatch(table);
 
+   /* GL_ARB_uniform_buffer_object */
+   SET_UniformBlockBinding(table, save_UniformBlockBinding);
+
    /* GL_NV_primitive_restart */
    SET_PrimitiveRestartIndexNV(table, _mesa_PrimitiveRestartIndex);