[Mesa-dev] [PATCH v2 33/82] i965: Upload Shader Storage Buffer Object surfaces

Jordan Justen jordan.l.justen at intel.com
Fri Jul 10 15:09:43 PDT 2015


On 2015-06-03 00:01:23, Iago Toral Quiroga wrote:
> Since these are a special kind of UBOs we emit them together reusing the
> same infrastructure, however, we use a RAW surface so we can reuse
> existing untyped read/write/atomic messages which include a pixel mask
> header that we need to set to obtain correct behavior with helper
> invocations of the fragment shader.
> ---
>  src/mesa/drivers/dri/i965/brw_context.h          |  6 +++
>  src/mesa/drivers/dri/i965/brw_wm_surface_state.c | 62 +++++++++++++++++++-----
>  2 files changed, 56 insertions(+), 12 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
> index 01c4283..154d7ae 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.h
> +++ b/src/mesa/drivers/dri/i965/brw_context.h
> @@ -1718,6 +1718,12 @@ void brw_create_constant_surface(struct brw_context *brw,
>                                   uint32_t size,
>                                   uint32_t *out_offset,
>                                   bool dword_pitch);
> +void brw_create_buffer_surface(struct brw_context *brw,
> +                               drm_intel_bo *bo,
> +                               uint32_t offset,
> +                               uint32_t size,
> +                               uint32_t *out_offset,
> +                               bool dword_pitch);
>  void brw_update_buffer_texture_surface(struct gl_context *ctx,
>                                         unsigned unit,
>                                         uint32_t *surf_offset);
> diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> index 160dd2f..e9ccdd6 100644
> --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> @@ -410,6 +410,29 @@ brw_create_constant_surface(struct brw_context *brw,
>  }
>  
>  /**
> + * Create the buffer surface.  Vertex/fragment shader buffer variables will be

Only vertex/fragment? How about 'Shader buffer variables' ...?

Reviewed-by: Jordan Justen <jordan.l.justen at intel.com>

> + * read from / write to this buffer with Data Port Read/Write
> + * instructions/messages.
> + */
> +void
> +brw_create_buffer_surface(struct brw_context *brw,
> +                          drm_intel_bo *bo,
> +                          uint32_t offset,
> +                          uint32_t size,
> +                          uint32_t *out_offset,
> +                          bool dword_pitch)
> +{
> +   /* Use a raw surface so we can reuse existing untyped read/write/atomic
> +    * messages. We need these specifically for the fragment shader since they
> +    * include a pixel mask header that we need to ensure correct behavior
> +    * with helper invocations, which cannot write to the buffer.
> +    */
> +   brw->vtbl.emit_buffer_surface_state(brw, out_offset, bo, offset,
> +                                       BRW_SURFACEFORMAT_RAW,
> +                                       size, 1, true);
> +}
> +
> +/**
>   * Set up a binding table entry for use by stream output logic (transform
>   * feedback).
>   *
> @@ -897,24 +920,39 @@ brw_upload_ubo_surfaces(struct brw_context *brw,
>        &stage_state->surf_offset[prog_data->binding_table.ubo_start];
>  
>     for (int i = 0; i < shader->NumUniformBlocks; i++) {
> -      struct gl_uniform_buffer_binding *binding;
>        struct intel_buffer_object *intel_bo;
>  
> -      binding = &ctx->UniformBufferBindings[shader->UniformBlocks[i].Binding];
> -      intel_bo = intel_buffer_object(binding->BufferObject);
> -      drm_intel_bo *bo =
> -         intel_bufferobj_buffer(brw, intel_bo,
> -                                binding->Offset,
> -                                binding->BufferObject->Size - binding->Offset);
> -
>        /* Because behavior for referencing outside of the binding's size in the
>         * glBindBufferRange case is undefined, we can just bind the whole buffer
>         * glBindBufferBase wants and be a correct implementation.
>         */
> -      brw_create_constant_surface(brw, bo, binding->Offset,
> -                                  bo->size - binding->Offset,
> -                                  &surf_offsets[i],
> -                                  dword_pitch);
> +      if (!shader->UniformBlocks[i].IsShaderStorage) {
> +         struct gl_uniform_buffer_binding *binding;
> +         binding =
> +            &ctx->UniformBufferBindings[shader->UniformBlocks[i].Binding];
> +         intel_bo = intel_buffer_object(binding->BufferObject);
> +         drm_intel_bo *bo =
> +            intel_bufferobj_buffer(brw, intel_bo,
> +                                   binding->Offset,
> +                                   binding->BufferObject->Size - binding->Offset);
> +         brw_create_constant_surface(brw, bo, binding->Offset,
> +                                     bo->size - binding->Offset,
> +                                     &surf_offsets[i],
> +                                     dword_pitch);
> +      } else {
> +         struct gl_shader_storage_buffer_binding *binding;
> +         binding =
> +            &ctx->ShaderStorageBufferBindings[shader->UniformBlocks[i].Binding];
> +         intel_bo = intel_buffer_object(binding->BufferObject);
> +         drm_intel_bo *bo =
> +            intel_bufferobj_buffer(brw, intel_bo,
> +                                   binding->Offset,
> +                                   binding->BufferObject->Size - binding->Offset);
> +         brw_create_buffer_surface(brw, bo, binding->Offset,
> +                                   bo->size - binding->Offset,
> +                                   &surf_offsets[i],
> +                                   dword_pitch);
> +      }
>     }
>  
>     if (shader->NumUniformBlocks)
> -- 
> 1.9.1
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list