Re: [Mesa-dev] [PATCH 1/3] virgl: add initial ARB_compute_shader support
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
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