[Mesa-dev] [PATCH 4/4] st/mesa: add support for indirect drawing

Brian Paul brianp at vmware.com
Thu Apr 4 12:24:40 PDT 2013


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 <brianp at vmware.com>


More information about the mesa-dev mailing list