[Mesa-dev] [PATCH] svga: avoid emitting redundant SetIndexBuffer commands

Jose Fonseca jfonseca at vmware.com
Fri Dec 11 08:13:00 PST 2015


On 10/12/15 21:09, Brian Paul wrote:
> ---
>   src/gallium/drivers/svga/svga_context.h |  4 ++++
>   src/gallium/drivers/svga/svga_draw.c    | 17 ++++++++++++-----
>   2 files changed, 16 insertions(+), 5 deletions(-)
>
> diff --git a/src/gallium/drivers/svga/svga_context.h b/src/gallium/drivers/svga/svga_context.h
> index c4284cc..db9491b 100644
> --- a/src/gallium/drivers/svga/svga_context.h
> +++ b/src/gallium/drivers/svga/svga_context.h
> @@ -343,6 +343,10 @@ struct svga_hw_draw_state
>      SVGA3dElementLayoutId layout_id;
>      SVGA3dPrimitiveType topology;
>
> +   struct svga_winsys_surface *ib;  /**< index buffer for drawing */
> +   SVGA3dSurfaceFormat ib_format;
> +   unsigned ib_offset;
> +
>      /* used for rebinding */
>      unsigned num_sampler_views[PIPE_SHADER_TYPES];
>      unsigned default_constbuf_size[PIPE_SHADER_TYPES];
> diff --git a/src/gallium/drivers/svga/svga_draw.c b/src/gallium/drivers/svga/svga_draw.c
> index cca499a..2d3631d 100644
> --- a/src/gallium/drivers/svga/svga_draw.c
> +++ b/src/gallium/drivers/svga/svga_draw.c
> @@ -539,11 +539,18 @@ draw_vgpu10(struct svga_hwtnl *hwtnl,
>         SVGA3dSurfaceFormat indexFormat = xlate_index_format(range->indexWidth);
>
>         /* setup index buffer */
> -      ret = SVGA3D_vgpu10_SetIndexBuffer(svga->swc, ib_handle,
> -                                         indexFormat,
> -                                         range->indexArray.offset);
> -      if (ret != PIPE_OK)
> -         return ret;
> +      if (ib_handle != svga->state.hw_draw.ib ||
> +          indexFormat != svga->state.hw_draw.ib_format ||
> +          range->indexArray.offset != svga->state.hw_draw.ib_offset) {
> +         ret = SVGA3D_vgpu10_SetIndexBuffer(svga->swc, ib_handle,
> +                                            indexFormat,
> +                                            range->indexArray.offset);
> +         if (ret != PIPE_OK)
> +            return ret;
> +         svga->state.hw_draw.ib = ib_handle;
> +         svga->state.hw_draw.ib_format = indexFormat;
> +         svga->state.hw_draw.ib_offset = range->indexArray.offset;
> +      }
>
>         if (instance_count > 1) {
>            ret = SVGA3D_vgpu10_DrawIndexedInstanced(svga->swc,
>

Reviewed-by: Jose Fonseca <jfonseca at vmware.com>


More information about the mesa-dev mailing list