[Mesa-dev] [PATCH 04/10] freedreno: implement user constant buffers

Rob Clark robdclark at gmail.com
Wed Jan 10 20:36:29 UTC 2018


On Wed, Jan 10, 2018 at 3:33 PM, Rob Clark <robdclark at gmail.com> wrote:
> On Wed, Jan 10, 2018 at 2:49 PM, Marek Olšák <maraeo at gmail.com> wrote:
>> From: Marek Olšák <marek.olsak at amd.com>
>>
>> ---
>>  src/gallium/drivers/freedreno/freedreno_screen.c |  4 +---
>>  src/gallium/drivers/freedreno/freedreno_state.c  | 13 +++++++++++++
>>  2 files changed, 14 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c
>> index 315b73a..639fbe7 100644
>> --- a/src/gallium/drivers/freedreno/freedreno_screen.c
>> +++ b/src/gallium/drivers/freedreno/freedreno_screen.c
>> @@ -177,28 +177,26 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>>         case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
>>         case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
>>         case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
>>         case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
>>         case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
>>         case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
>>         case PIPE_CAP_STRING_MARKER:
>>         case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
>>         case PIPE_CAP_TEXTURE_BARRIER:
>>         case PIPE_CAP_INVALIDATE_BUFFER:
>> +       case PIPE_CAP_USER_CONSTANT_BUFFERS:
>>                 return 1;
>>
>>         case PIPE_CAP_VERTEXID_NOBASE:
>>                 return is_a3xx(screen) || is_a4xx(screen);
>>
>> -       case PIPE_CAP_USER_CONSTANT_BUFFERS:
>> -               return is_a4xx(screen) ? 0 : 1;
>> -
>>         case PIPE_CAP_COMPUTE:
>>                 return has_compute(screen);
>>
>>         case PIPE_CAP_SHADER_STENCIL_EXPORT:
>>         case PIPE_CAP_TGSI_TEXCOORD:
>>         case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
>>         case PIPE_CAP_TEXTURE_MULTISAMPLE:
>>         case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
>>         case PIPE_CAP_QUERY_MEMORY_INFO:
>>         case PIPE_CAP_PCI_GROUP:
>> diff --git a/src/gallium/drivers/freedreno/freedreno_state.c b/src/gallium/drivers/freedreno/freedreno_state.c
>> index dd42aa0..9f0c490 100644
>> --- a/src/gallium/drivers/freedreno/freedreno_state.c
>> +++ b/src/gallium/drivers/freedreno/freedreno_state.c
>> @@ -24,20 +24,21 @@
>>   *
>>   * Authors:
>>   *    Rob Clark <robclark at freedesktop.org>
>>   */
>>
>>  #include "pipe/p_state.h"
>>  #include "util/u_dual_blend.h"
>>  #include "util/u_string.h"
>>  #include "util/u_memory.h"
>>  #include "util/u_helpers.h"
>> +#include "util/u_upload_mgr.h"
>>
>>  #include "freedreno_state.h"
>>  #include "freedreno_context.h"
>>  #include "freedreno_resource.h"
>>  #include "freedreno_texture.h"
>>  #include "freedreno_gmem.h"
>>  #include "freedreno_query_hw.h"
>>  #include "freedreno_util.h"
>>
>>  /* All the generic state handling.. In case of CSO's that are specific
>> @@ -88,20 +89,32 @@ fd_set_sample_mask(struct pipe_context *pctx, unsigned sample_mask)
>>   * previous values.
>>   * index>0 will be UBO's.. well, I'll worry about that later
>>   */
>>  static void
>>  fd_set_constant_buffer(struct pipe_context *pctx,
>>                 enum pipe_shader_type shader, uint index,
>>                 const struct pipe_constant_buffer *cb)
>>  {
>>         struct fd_context *ctx = fd_context(pctx);
>>         struct fd_constbuf_stateobj *so = &ctx->constbuf[shader];
>> +       struct pipe_constant_buffer c;
>> +
>> +       if (is_a4xx(ctx->screen) && cb && cb->user_buffer) {
>> +               c.buffer = NULL;
>> +               c.buffer_size = cb->buffer_size;
>> +               c.user_buffer = NULL;
>> +
>> +               u_upload_data(pctx->const_uploader, 0, cb->buffer_size, 64,
>> +                             cb->user_buffer, &c.buffer_offset, &c.buffer);
>> +               u_upload_unmap(pctx->const_uploader);
>> +               cb = &c;
>> +       }
>
> It's probably ok to just drop this.. actually all of a3xx+ can do
> non-user uniform buffer (I just haven't worked out the alignment
> constraints on other gens)..
>
> Really I just wanted a way to say kinda the opposite thing as this cap
> to the state tracker (ie. that I could do both user and non-user)
>

btw, wouldn't u_threaded prefer non-user cb's?  That way you get a
refcnt'd ptr to pass thru the queue between threads..

(That was kinda why I originally added non-user cb support in a4xx,
when I was experimenting w/ a generic render reordering pipe driver
shim thing)


> BR,
> -R
>
>>
>>         util_copy_constant_buffer(&so->cb[index], cb);
>>
>>         /* Note that the state tracker can unbind constant buffers by
>>          * passing NULL here.
>>          */
>>         if (unlikely(!cb)) {
>>                 so->enabled_mask &= ~(1 << index);
>>                 so->dirty_mask &= ~(1 << index);
>>                 return;
>> --
>> 2.7.4
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list