On 04/04/2013 12:18 PM, Christoph Bumiller wrote:
---
  src/mesa/state_tracker/st_cb_bufferobjects.c |    3 +++
  src/mesa/state_tracker/st_draw.c             |   11 ++++++++++-
  src/mesa/state_tracker/st_extensions.c       |    4 +++-
  3 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/src/mesa/state_tracker/st_cb_bufferobjects.c 
b/src/mesa/state_tracker/st_cb_bufferobjects.c
index 8ff32c8..5a44bf2 100644
--- a/src/mesa/state_tracker/st_cb_bufferobjects.c
+++ b/src/mesa/state_tracker/st_cb_bufferobjects.c
@@ -205,6 +205,9 @@ st_bufferobj_data(struct gl_context *ctx,
     case GL_UNIFORM_BUFFER:
        bind = PIPE_BIND_CONSTANT_BUFFER;
        break;
+   case GL_DRAW_INDIRECT_BUFFER:
+      bind = PIPE_BIND_COMMAND_BUFFER;
+      break;
     default:
        bind = 0;
     }
diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c
index ee1c902..f1379ab 100644
--- a/src/mesa/state_tracker/st_draw.c
+++ b/src/mesa/state_tracker/st_draw.c
@@ -256,6 +256,14 @@ st_draw_vbo(struct gl_context *ctx,
        }
     }

+   if (indirect) {
+      info.indirect = st_buffer_object(indirect)->buffer;
+
+      /* Primitive restart is not handled by the VBO module in this case. */
+      info.primitive_restart = ctx->Array._PrimitiveRestart;
+      info.restart_index = ctx->Array._RestartIndex;
+   }
+
     /* do actual drawing */
     for (i = 0; i<  nr_prims; i++) {
        info.mode = translate_prim( ctx, prims[i].mode );
@@ -268,6 +276,7 @@ st_draw_vbo(struct gl_context *ctx,
           info.min_index = info.start;
           info.max_index = info.start + info.count - 1;
        }
+      info.indirect_offset = prims[i].indirect_offset;

        if (ST_DEBUG&  DEBUG_DRAW) {
           debug_printf("st/draw: mode %s  start %u  count %u  indexed %d\n",
@@ -277,7 +286,7 @@ st_draw_vbo(struct gl_context *ctx,
                        info.indexed);
        }

-      if (info.count_from_stream_output) {
+      if (info.count_from_stream_output || info.indirect) {
           cso_draw_vbo(st->cso_context,&info);
        }
        else if (info.primitive_restart) {
diff --git a/src/mesa/state_tracker/st_extensions.c 
b/src/mesa/state_tracker/st_extensions.c
index 11db9d3..c021cda 100644
--- a/src/mesa/state_tracker/st_extensions.c
+++ b/src/mesa/state_tracker/st_extensions.c
@@ -398,7 +398,9 @@ void st_init_extensions(struct st_context *st)
        { o(MESA_texture_array),               
PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS         },

        { o(OES_standard_derivatives),         PIPE_CAP_SM3                     
         },
-      { o(ARB_texture_cube_map_array),       PIPE_CAP_CUBE_MAP_ARRAY           
        }
+      { o(ARB_texture_cube_map_array),       PIPE_CAP_CUBE_MAP_ARRAY           
        },
+      { o(ARB_draw_indirect),                PIPE_CAP_DRAW_INDIRECT            
        },
+      { o(ARB_multi_draw_indirect),          PIPE_CAP_DRAW_INDIRECT            
        }
     };

     /* Required: render target and sampler support */

Reviewed-by: Brian Paul <bri...@vmware.com>
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to