[Mesa-dev] [PATCH 03/17] gallium/cso: add support for compute shaders

Samuel Pitoiset samuel.pitoiset at gmail.com
Tue Jan 26 06:57:23 PST 2016



On 01/26/2016 11:30 AM, Marek Olšák wrote:
> Functions cso_save_compute_shader & cso_restore_compute_shader, and
> the compute_shader_saved variable can be removed. There is no use for
> them as far as I can see.

Yeah, because the next patch ("gallium: disable compute shaders for meta 
ops") is going to be removed.

>
> Marek
>
> On Sun, Jan 24, 2016 at 10:09 PM, Samuel Pitoiset
> <samuel.pitoiset at gmail.com> wrote:
>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>> ---
>>   src/gallium/auxiliary/cso_cache/cso_context.c | 53 +++++++++++++++++++++++++++
>>   src/gallium/auxiliary/cso_cache/cso_context.h |  6 +++
>>   2 files changed, 59 insertions(+)
>>
>> diff --git a/src/gallium/auxiliary/cso_cache/cso_context.c b/src/gallium/auxiliary/cso_cache/cso_context.c
>> index 6b29b20..ddcd1cc 100644
>> --- a/src/gallium/auxiliary/cso_cache/cso_context.c
>> +++ b/src/gallium/auxiliary/cso_cache/cso_context.c
>> @@ -69,6 +69,7 @@ struct cso_context {
>>
>>      boolean has_geometry_shader;
>>      boolean has_tessellation;
>> +   boolean has_compute_shader;
>>      boolean has_streamout;
>>
>>      struct pipe_sampler_view *fragment_views[PIPE_MAX_SHADER_SAMPLER_VIEWS];
>> @@ -106,6 +107,7 @@ struct cso_context {
>>      void *geometry_shader, *geometry_shader_saved;
>>      void *tessctrl_shader, *tessctrl_shader_saved;
>>      void *tesseval_shader, *tesseval_shader_saved;
>> +   void *compute_shader, *compute_shader_saved;
>>      void *velements, *velements_saved;
>>      struct pipe_query *render_condition, *render_condition_saved;
>>      uint render_condition_mode, render_condition_mode_saved;
>> @@ -272,6 +274,10 @@ struct cso_context *cso_create_context( struct pipe_context *pipe )
>>                                   PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0) {
>>         ctx->has_tessellation = TRUE;
>>      }
>> +   if (pipe->screen->get_shader_param(pipe->screen, PIPE_SHADER_COMPUTE,
>> +                                      PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0) {
>> +      ctx->has_compute_shader = TRUE;
>> +   }
>>      if (pipe->screen->get_param(pipe->screen,
>>                                  PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS) != 0) {
>>         ctx->has_streamout = TRUE;
>> @@ -333,6 +339,10 @@ void cso_destroy_context( struct cso_context *ctx )
>>            ctx->pipe->bind_tes_state(ctx->pipe, NULL);
>>            ctx->pipe->set_constant_buffer(ctx->pipe, PIPE_SHADER_TESS_EVAL, 0, NULL);
>>         }
>> +      if (ctx->has_compute_shader) {
>> +         ctx->pipe->bind_compute_state(ctx->pipe, NULL);
>> +         ctx->pipe->set_constant_buffer(ctx->pipe, PIPE_SHADER_COMPUTE, 0, NULL);
>> +      }
>>         ctx->pipe->bind_vertex_elements_state( ctx->pipe, NULL );
>>
>>         if (ctx->has_streamout)
>> @@ -907,6 +917,49 @@ void cso_restore_tesseval_shader(struct cso_context *ctx)
>>      ctx->tesseval_shader_saved = NULL;
>>   }
>>
>> +void cso_set_compute_shader_handle(struct cso_context *ctx, void *handle)
>> +{
>> +   assert(ctx->has_compute_shader || !handle);
>> +
>> +   if (ctx->has_compute_shader && ctx->compute_shader != handle) {
>> +      ctx->compute_shader = handle;
>> +      ctx->pipe->bind_compute_state(ctx->pipe, handle);
>> +   }
>> +}
>> +
>> +void cso_delete_compute_shader(struct cso_context *ctx, void *handle)
>> +{
>> +    if (handle == ctx->compute_shader) {
>> +      /* unbind before deleting */
>> +      ctx->pipe->bind_compute_state(ctx->pipe, NULL);
>> +      ctx->compute_shader = NULL;
>> +   }
>> +   ctx->pipe->delete_compute_state(ctx->pipe, handle);
>> +}
>> +
>> +void cso_save_compute_shader(struct cso_context *ctx)
>> +{
>> +   if (!ctx->has_compute_shader) {
>> +      return;
>> +   }
>> +
>> +   assert(!ctx->compute_shader_saved);
>> +   ctx->compute_shader_saved = ctx->compute_shader;
>> +}
>> +
>> +void cso_restore_compute_shader(struct cso_context *ctx)
>> +{
>> +   if (!ctx->has_compute_shader) {
>> +      return;
>> +   }
>> +
>> +   if (ctx->compute_shader_saved != ctx->compute_shader) {
>> +      ctx->pipe->bind_compute_state(ctx->pipe, ctx->compute_shader_saved);
>> +      ctx->compute_shader = ctx->compute_shader_saved;
>> +   }
>> +   ctx->compute_shader_saved = NULL;
>> +}
>> +
>>   enum pipe_error
>>   cso_set_vertex_elements(struct cso_context *ctx,
>>                           unsigned count,
>> diff --git a/src/gallium/auxiliary/cso_cache/cso_context.h b/src/gallium/auxiliary/cso_cache/cso_context.h
>> index f0a2739..97f18c7 100644
>> --- a/src/gallium/auxiliary/cso_cache/cso_context.h
>> +++ b/src/gallium/auxiliary/cso_cache/cso_context.h
>> @@ -151,6 +151,12 @@ void cso_save_tesseval_shader(struct cso_context *cso);
>>   void cso_restore_tesseval_shader(struct cso_context *cso);
>>
>>
>> +void cso_set_compute_shader_handle(struct cso_context *ctx, void *handle);
>> +void cso_delete_compute_shader(struct cso_context *ctx, void *handle);
>> +void cso_save_compute_shader(struct cso_context *cso);
>> +void cso_restore_compute_shader(struct cso_context *cso);
>> +
>> +
>>   void cso_set_framebuffer(struct cso_context *cso,
>>                            const struct pipe_framebuffer_state *fb);
>>   void cso_save_framebuffer(struct cso_context *cso);
>> --
>> 2.6.4
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev

-- 
-Samuel


More information about the mesa-dev mailing list