Re: [Mesa-dev] [PATCH 1/3] virgl: add initial ARB_compute_shader support

2018-07-31 Thread Gurchetan Singh
This series is:

Reviewed-by: Gurchetan Singh 
On Tue, Jul 31, 2018 at 3:29 PM Dave Airlie  wrote:
>
> From: Dave Airlie 
>
> This hooks up compute shader creation and launch grid support.
> ---
>  src/gallium/drivers/virgl/virgl_context.c  | 55 ++--
>  src/gallium/drivers/virgl/virgl_encode.c   | 25 -
>  src/gallium/drivers/virgl/virgl_encode.h   |  3 ++
>  src/gallium/drivers/virgl/virgl_hw.h   |  5 +++
>  src/gallium/drivers/virgl/virgl_protocol.h | 11 ++
>  src/gallium/drivers/virgl/virgl_screen.c   | 59 
> --
>  src/gallium/drivers/virgl/virgl_winsys.h   |  2 +
>  7 files changed, 153 insertions(+), 7 deletions(-)
>
> diff --git a/src/gallium/drivers/virgl/virgl_context.c 
> b/src/gallium/drivers/virgl/virgl_context.c
> index d224b68cfcd..ae1da337994 100644
> --- a/src/gallium/drivers/virgl/virgl_context.c
> +++ b/src/gallium/drivers/virgl/virgl_context.c
> @@ -506,7 +506,7 @@ static void *virgl_shader_encoder(struct pipe_context 
> *ctx,
> handle = virgl_object_assign_handle();
> /* encode VS state */
> ret = virgl_encode_shader_state(vctx, handle, type,
> -   >stream_output,
> +   >stream_output, 0,
> new_tokens);
> if (ret) {
>return NULL;
> @@ -961,7 +961,7 @@ static void virgl_set_shader_buffers(struct pipe_context 
> *ctx,
>pipe_resource_reference(>ssbos[shader][idx], NULL);
> }
>
> -   uint32_t max_shader_buffer = shader == PIPE_SHADER_FRAGMENT ?
> +   uint32_t max_shader_buffer = (shader == PIPE_SHADER_FRAGMENT || shader == 
> PIPE_SHADER_COMPUTE) ?
>rs->caps.caps.v2.max_shader_buffer_frag_compute :
>rs->caps.caps.v2.max_shader_buffer_other_stages;
> if (!max_shader_buffer)
> @@ -989,7 +989,7 @@ static void virgl_set_shader_images(struct pipe_context 
> *ctx,
>pipe_resource_reference(>images[shader][idx], NULL);
> }
>
> -   uint32_t max_shader_images = shader == PIPE_SHADER_FRAGMENT ?
> +   uint32_t max_shader_images = (shader == PIPE_SHADER_FRAGMENT || shader == 
> PIPE_SHADER_COMPUTE) ?
>   rs->caps.caps.v2.max_shader_image_frag_compute :
>   rs->caps.caps.v2.max_shader_image_other_stages;
> if (!max_shader_images)
> @@ -1008,6 +1008,50 @@ static void virgl_memory_barrier(struct pipe_context 
> *ctx,
> virgl_encode_memory_barrier(vctx, flags);
>  }
>
> +static void *virgl_create_compute_state(struct pipe_context *ctx,
> +const struct pipe_compute_state 
> *state)
> +{
> +   struct virgl_context *vctx = virgl_context(ctx);
> +   uint32_t handle;
> +   const struct tgsi_token *new_tokens = state->prog;
> +   struct pipe_stream_output_info so_info = {};
> +   int ret;
> +
> +   handle = virgl_object_assign_handle();
> +   ret = virgl_encode_shader_state(vctx, handle, PIPE_SHADER_COMPUTE,
> +   _info,
> +   state->req_local_mem,
> +   new_tokens);
> +   if (ret) {
> +  return NULL;
> +   }
> +
> +   return (void *)(unsigned long)handle;
> +}
> +
> +static void virgl_bind_compute_state(struct pipe_context *ctx, void *state)
> +{
> +   uint32_t handle = (unsigned long)state;
> +   struct virgl_context *vctx = virgl_context(ctx);
> +
> +   virgl_encode_bind_shader(vctx, handle, PIPE_SHADER_COMPUTE);
> +}
> +
> +static void virgl_delete_compute_state(struct pipe_context *ctx, void *state)
> +{
> +   uint32_t handle = (unsigned long)state;
> +   struct virgl_context *vctx = virgl_context(ctx);
> +
> +   virgl_encode_delete_object(vctx, handle, VIRGL_OBJECT_SHADER);
> +}
> +
> +static void virgl_launch_grid(struct pipe_context *ctx,
> +  const struct pipe_grid_info *info)
> +{
> +   struct virgl_context *vctx = virgl_context(ctx);
> +   virgl_encode_launch_grid(vctx, info);
> +}
> +
>  static void
>  virgl_context_destroy( struct pipe_context *ctx )
>  {
> @@ -1118,6 +1162,11 @@ struct pipe_context *virgl_context_create(struct 
> pipe_screen *pscreen,
> vctx->base.delete_gs_state = virgl_delete_gs_state;
> vctx->base.delete_fs_state = virgl_delete_fs_state;
>
> +   vctx->base.create_compute_state = virgl_create_compute_state;
> +   vctx->base.bind_compute_state = virgl_bind_compute_state;
> +   vctx->base.delete_compute_state = virgl_delete_compute_state;
> +   vctx->base.launch_grid = virgl_launch_grid;
> +
> vctx->base.clear = virgl_clear;
> vctx->base.draw_vbo = virgl_draw_vbo;
> vctx->base.flush = virgl_flush_from_st;
> diff --git a/src/gallium/drivers/virgl/virgl_encode.c 
> b/src/gallium/drivers/virgl/virgl_encode.c
> index 1d193ae6c7f..0cb5184d193 100644
> --- a/src/gallium/drivers/virgl/virgl_encode.c
> +++ b/src/gallium/drivers/virgl/virgl_encode.c
> @@ -241,6 +241,7 @@ int virgl_encode_shader_state(struct virgl_context *ctx,
>  

[Mesa-dev] [PATCH 1/3] virgl: add initial ARB_compute_shader support

2018-07-31 Thread Dave Airlie
From: Dave Airlie 

This hooks up compute shader creation and launch grid support.
---
 src/gallium/drivers/virgl/virgl_context.c  | 55 ++--
 src/gallium/drivers/virgl/virgl_encode.c   | 25 -
 src/gallium/drivers/virgl/virgl_encode.h   |  3 ++
 src/gallium/drivers/virgl/virgl_hw.h   |  5 +++
 src/gallium/drivers/virgl/virgl_protocol.h | 11 ++
 src/gallium/drivers/virgl/virgl_screen.c   | 59 --
 src/gallium/drivers/virgl/virgl_winsys.h   |  2 +
 7 files changed, 153 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/virgl/virgl_context.c 
b/src/gallium/drivers/virgl/virgl_context.c
index d224b68cfcd..ae1da337994 100644
--- a/src/gallium/drivers/virgl/virgl_context.c
+++ b/src/gallium/drivers/virgl/virgl_context.c
@@ -506,7 +506,7 @@ static void *virgl_shader_encoder(struct pipe_context *ctx,
handle = virgl_object_assign_handle();
/* encode VS state */
ret = virgl_encode_shader_state(vctx, handle, type,
-   >stream_output,
+   >stream_output, 0,
new_tokens);
if (ret) {
   return NULL;
@@ -961,7 +961,7 @@ static void virgl_set_shader_buffers(struct pipe_context 
*ctx,
   pipe_resource_reference(>ssbos[shader][idx], NULL);
}
 
-   uint32_t max_shader_buffer = shader == PIPE_SHADER_FRAGMENT ?
+   uint32_t max_shader_buffer = (shader == PIPE_SHADER_FRAGMENT || shader == 
PIPE_SHADER_COMPUTE) ?
   rs->caps.caps.v2.max_shader_buffer_frag_compute :
   rs->caps.caps.v2.max_shader_buffer_other_stages;
if (!max_shader_buffer)
@@ -989,7 +989,7 @@ static void virgl_set_shader_images(struct pipe_context 
*ctx,
   pipe_resource_reference(>images[shader][idx], NULL);
}
 
-   uint32_t max_shader_images = shader == PIPE_SHADER_FRAGMENT ?
+   uint32_t max_shader_images = (shader == PIPE_SHADER_FRAGMENT || shader == 
PIPE_SHADER_COMPUTE) ?
  rs->caps.caps.v2.max_shader_image_frag_compute :
  rs->caps.caps.v2.max_shader_image_other_stages;
if (!max_shader_images)
@@ -1008,6 +1008,50 @@ static void virgl_memory_barrier(struct pipe_context 
*ctx,
virgl_encode_memory_barrier(vctx, flags);
 }
 
+static void *virgl_create_compute_state(struct pipe_context *ctx,
+const struct pipe_compute_state *state)
+{
+   struct virgl_context *vctx = virgl_context(ctx);
+   uint32_t handle;
+   const struct tgsi_token *new_tokens = state->prog;
+   struct pipe_stream_output_info so_info = {};
+   int ret;
+
+   handle = virgl_object_assign_handle();
+   ret = virgl_encode_shader_state(vctx, handle, PIPE_SHADER_COMPUTE,
+   _info,
+   state->req_local_mem,
+   new_tokens);
+   if (ret) {
+  return NULL;
+   }
+
+   return (void *)(unsigned long)handle;
+}
+
+static void virgl_bind_compute_state(struct pipe_context *ctx, void *state)
+{
+   uint32_t handle = (unsigned long)state;
+   struct virgl_context *vctx = virgl_context(ctx);
+
+   virgl_encode_bind_shader(vctx, handle, PIPE_SHADER_COMPUTE);
+}
+
+static void virgl_delete_compute_state(struct pipe_context *ctx, void *state)
+{
+   uint32_t handle = (unsigned long)state;
+   struct virgl_context *vctx = virgl_context(ctx);
+
+   virgl_encode_delete_object(vctx, handle, VIRGL_OBJECT_SHADER);
+}
+
+static void virgl_launch_grid(struct pipe_context *ctx,
+  const struct pipe_grid_info *info)
+{
+   struct virgl_context *vctx = virgl_context(ctx);
+   virgl_encode_launch_grid(vctx, info);
+}
+
 static void
 virgl_context_destroy( struct pipe_context *ctx )
 {
@@ -1118,6 +1162,11 @@ struct pipe_context *virgl_context_create(struct 
pipe_screen *pscreen,
vctx->base.delete_gs_state = virgl_delete_gs_state;
vctx->base.delete_fs_state = virgl_delete_fs_state;
 
+   vctx->base.create_compute_state = virgl_create_compute_state;
+   vctx->base.bind_compute_state = virgl_bind_compute_state;
+   vctx->base.delete_compute_state = virgl_delete_compute_state;
+   vctx->base.launch_grid = virgl_launch_grid;
+
vctx->base.clear = virgl_clear;
vctx->base.draw_vbo = virgl_draw_vbo;
vctx->base.flush = virgl_flush_from_st;
diff --git a/src/gallium/drivers/virgl/virgl_encode.c 
b/src/gallium/drivers/virgl/virgl_encode.c
index 1d193ae6c7f..0cb5184d193 100644
--- a/src/gallium/drivers/virgl/virgl_encode.c
+++ b/src/gallium/drivers/virgl/virgl_encode.c
@@ -241,6 +241,7 @@ int virgl_encode_shader_state(struct virgl_context *ctx,
   uint32_t handle,
   uint32_t type,
   const struct pipe_stream_output_info *so_info,
+  uint32_t cs_req_local_mem,
   const struct tgsi_token *tokens)
 {
char *str, *sptr;
@@ -298,7 +299,10 @@ int