With my comments addressed, the first 5 patches are:

Reviewed-by: Marek Olšák <marek.ol...@amd.com>

Marek

On Mon, Sep 3, 2018 at 4:44 AM, Marek Olšák <mar...@gmail.com> wrote:
> Same answer as before - the screen.rst documentation is missing.
>
> Marek
>
> On Thu, Aug 30, 2018 at 9:40 AM, Erik Faye-Lund
> <erik.faye-l...@collabora.com> wrote:
>> This moves the evergreen-specific max-sizes out as a driver-cap, so
>> other drivers with less strict requirements also can use hw-atomics.
>>
>> Remove ssbo_atomic as it's no longer needed.
>>
>> We should now be able to use hw-atomics for some stages and not for
>> other, if needed.
>>
>> Signed-off-by: Erik Faye-Lund <erik.faye-l...@collabora.com>
>> ---
>>  src/gallium/drivers/etnaviv/etnaviv_screen.c  |  5 +++++
>>  .../drivers/freedreno/freedreno_screen.c      |  5 +++++
>>  .../drivers/nouveau/nv30/nv30_screen.c        |  2 ++
>>  .../drivers/nouveau/nv50/nv50_screen.c        |  2 ++
>>  .../drivers/nouveau/nvc0/nvc0_screen.c        |  2 ++
>>  src/gallium/drivers/r300/r300_screen.c        |  2 ++
>>  src/gallium/drivers/r600/r600_pipe.c          |  9 +++++++++
>>  src/gallium/drivers/radeonsi/si_get.c         |  2 ++
>>  src/gallium/drivers/svga/svga_screen.c        |  2 ++
>>  src/gallium/drivers/v3d/v3d_screen.c          |  2 ++
>>  src/gallium/drivers/vc4/vc4_screen.c          |  2 ++
>>  src/gallium/drivers/virgl/virgl_screen.c      |  2 ++
>>  src/gallium/include/pipe/p_defines.h          |  2 ++
>>  src/mesa/state_tracker/st_extensions.c        | 20 +++++++++----------
>>  14 files changed, 49 insertions(+), 10 deletions(-)
>>
>> diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c 
>> b/src/gallium/drivers/etnaviv/etnaviv_screen.c
>> index 108b97d35c..95166a2db1 100644
>> --- a/src/gallium/drivers/etnaviv/etnaviv_screen.c
>> +++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c
>> @@ -372,6 +372,11 @@ etna_screen_get_param(struct pipe_screen *pscreen, enum 
>> pipe_cap param)
>>        return 0;
>>     case PIPE_CAP_UMA:
>>        return 1;
>> +
>> +   /* hw atomic counters */
>> +   case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTERS:
>> +   case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTER_BUFFERS:
>> +      return 0;
>>     }
>>
>>     debug_printf("unknown param %d", param);
>> diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c 
>> b/src/gallium/drivers/freedreno/freedreno_screen.c
>> index af44ab698e..e6dfc2e48e 100644
>> --- a/src/gallium/drivers/freedreno/freedreno_screen.c
>> +++ b/src/gallium/drivers/freedreno/freedreno_screen.c
>> @@ -491,6 +491,11 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum 
>> pipe_cap param)
>>                 return 1;
>>         case PIPE_CAP_NATIVE_FENCE_FD:
>>                 return fd_device_version(screen->dev) >= FD_VERSION_FENCE_FD;
>> +
>> +       /* hw atomic counters */
>> +       case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTERS:
>> +       case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTER_BUFFERS:
>> +               return 0;
>>         }
>>         debug_printf("unknown param %d\n", param);
>>         return 0;
>> diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c 
>> b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
>> index d52d8f3988..3fdbadb6c6 100644
>> --- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c
>> +++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
>> @@ -239,6 +239,8 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum 
>> pipe_cap param)
>>     case PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE:
>>     case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS:
>>     case PIPE_CAP_PROGRAMMABLE_SAMPLE_LOCATIONS:
>> +   case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTERS:
>> +   case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTER_BUFFERS:
>>        return 0;
>>
>>     case PIPE_CAP_MAX_GS_INVOCATIONS:
>> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c 
>> b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
>> index cd36795e56..a6dda5dfa0 100644
>> --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
>> +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
>> @@ -293,6 +293,8 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum 
>> pipe_cap param)
>>     case PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE:
>>     case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS:
>>     case PIPE_CAP_PROGRAMMABLE_SAMPLE_LOCATIONS:
>> +   case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTERS:
>> +   case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTER_BUFFERS:
>>        return 0;
>>
>>     case PIPE_CAP_MAX_GS_INVOCATIONS:
>> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c 
>> b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
>> index 446e30dcc8..b628b24d76 100644
>> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
>> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
>> @@ -322,6 +322,8 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum 
>> pipe_cap param)
>>     case PIPE_CAP_CONSTBUF0_FLAGS:
>>     case PIPE_CAP_PACKED_UNIFORMS:
>>     case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES:
>> +   case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTERS:
>> +   case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTER_BUFFERS:
>>        return 0;
>>
>>     case PIPE_CAP_VENDOR_ID:
>> diff --git a/src/gallium/drivers/r300/r300_screen.c 
>> b/src/gallium/drivers/r300/r300_screen.c
>> index d27c2b8f1d..f29d5244ff 100644
>> --- a/src/gallium/drivers/r300/r300_screen.c
>> +++ b/src/gallium/drivers/r300/r300_screen.c
>> @@ -261,6 +261,8 @@ static int r300_get_param(struct pipe_screen* pscreen, 
>> enum pipe_cap param)
>>          case PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE:
>>          case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS:
>>          case PIPE_CAP_PROGRAMMABLE_SAMPLE_LOCATIONS:
>> +        case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTERS:
>> +        case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTER_BUFFERS:
>>              return 0;
>>
>>          case PIPE_CAP_MAX_GS_INVOCATIONS:
>> diff --git a/src/gallium/drivers/r600/r600_pipe.c 
>> b/src/gallium/drivers/r600/r600_pipe.c
>> index cbebf748b7..226e714ffb 100644
>> --- a/src/gallium/drivers/r600/r600_pipe.c
>> +++ b/src/gallium/drivers/r600/r600_pipe.c
>> @@ -548,6 +548,15 @@ static int r600_get_param(struct pipe_screen* pscreen, 
>> enum pipe_cap param)
>>                 return rscreen->b.info.pci_dev;
>>         case PIPE_CAP_PCI_FUNCTION:
>>                 return rscreen->b.info.pci_func;
>> +
>> +       case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTERS:
>> +               if (rscreen->b.family >= CHIP_CEDAR && rscreen->has_atomics)
>> +                       return 8;
>> +               return 0;
>> +       case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTER_BUFFERS:
>> +               if (rscreen->b.family >= CHIP_CEDAR && rscreen->has_atomics)
>> +                       return EG_MAX_ATOMIC_BUFFERS;
>> +               return 0;
>>         }
>>         return 0;
>>  }
>> diff --git a/src/gallium/drivers/radeonsi/si_get.c 
>> b/src/gallium/drivers/radeonsi/si_get.c
>> index d8fc6447b4..39cf2a0524 100644
>> --- a/src/gallium/drivers/radeonsi/si_get.c
>> +++ b/src/gallium/drivers/radeonsi/si_get.c
>> @@ -231,6 +231,8 @@ static int si_get_param(struct pipe_screen *pscreen, 
>> enum pipe_cap param)
>>         case PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE:
>>         case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS:
>>         case PIPE_CAP_PROGRAMMABLE_SAMPLE_LOCATIONS:
>> +       case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTERS:
>> +       case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTER_BUFFERS:
>>                 return 0;
>>
>>         case PIPE_CAP_FENCE_SIGNAL:
>> diff --git a/src/gallium/drivers/svga/svga_screen.c 
>> b/src/gallium/drivers/svga/svga_screen.c
>> index 8cc1980f3a..a7f461f631 100644
>> --- a/src/gallium/drivers/svga/svga_screen.c
>> +++ b/src/gallium/drivers/svga/svga_screen.c
>> @@ -471,6 +471,8 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap 
>> param)
>>     case PIPE_CAP_CONSTBUF0_FLAGS:
>>     case PIPE_CAP_PACKED_UNIFORMS:
>>     case PIPE_CAP_PROGRAMMABLE_SAMPLE_LOCATIONS:
>> +   case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTERS:
>> +   case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTER_BUFFERS:
>>        return 0;
>>     case PIPE_CAP_MAX_GS_INVOCATIONS:
>>        return 32;
>> diff --git a/src/gallium/drivers/v3d/v3d_screen.c 
>> b/src/gallium/drivers/v3d/v3d_screen.c
>> index 14a40cb5b7..9bad4f40cf 100644
>> --- a/src/gallium/drivers/v3d/v3d_screen.c
>> +++ b/src/gallium/drivers/v3d/v3d_screen.c
>> @@ -273,6 +273,8 @@ v3d_screen_get_param(struct pipe_screen *pscreen, enum 
>> pipe_cap param)
>>          case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS:
>>          case PIPE_CAP_PACKED_UNIFORMS:
>>          case PIPE_CAP_PROGRAMMABLE_SAMPLE_LOCATIONS:
>> +        case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTERS:
>> +        case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTER_BUFFERS:
>>                  return 0;
>>
>>                  /* Geometry shader output, unsupported. */
>> diff --git a/src/gallium/drivers/vc4/vc4_screen.c 
>> b/src/gallium/drivers/vc4/vc4_screen.c
>> index e22ec6754a..a000742207 100644
>> --- a/src/gallium/drivers/vc4/vc4_screen.c
>> +++ b/src/gallium/drivers/vc4/vc4_screen.c
>> @@ -301,6 +301,8 @@ vc4_screen_get_param(struct pipe_screen *pscreen, enum 
>> pipe_cap param)
>>          case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS:
>>          case PIPE_CAP_PACKED_UNIFORMS:
>>          case PIPE_CAP_PROGRAMMABLE_SAMPLE_LOCATIONS:
>> +        case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTERS:
>> +        case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTER_BUFFERS:
>>                  return 0;
>>
>>                  /* Stream output. */
>> diff --git a/src/gallium/drivers/virgl/virgl_screen.c 
>> b/src/gallium/drivers/virgl/virgl_screen.c
>> index 4fe57611cf..1a9e4bc383 100644
>> --- a/src/gallium/drivers/virgl/virgl_screen.c
>> +++ b/src/gallium/drivers/virgl/virgl_screen.c
>> @@ -316,6 +316,8 @@ virgl_get_param(struct pipe_screen *screen, enum 
>> pipe_cap param)
>>     case PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE:
>>     case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS:
>>     case PIPE_CAP_PROGRAMMABLE_SAMPLE_LOCATIONS:
>> +   case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTERS:
>> +   case PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTER_BUFFERS:
>>        return 0;
>>     case PIPE_CAP_MAX_GS_INVOCATIONS:
>>        return 32;
>> diff --git a/src/gallium/include/pipe/p_defines.h 
>> b/src/gallium/include/pipe/p_defines.h
>> index b7c7d8fcbd..bdd3f4680f 100644
>> --- a/src/gallium/include/pipe/p_defines.h
>> +++ b/src/gallium/include/pipe/p_defines.h
>> @@ -819,6 +819,8 @@ enum pipe_cap
>>     PIPE_CAP_MAX_SHADER_BUFFER_SIZE,
>>     PIPE_CAP_TEXTURE_MIRROR_CLAMP_TO_EDGE,
>>     PIPE_CAP_MAX_COMBINED_SHADER_BUFFERS,
>> +   PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTERS,
>> +   PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTER_BUFFERS,
>>  };
>>
>>  /**
>> diff --git a/src/mesa/state_tracker/st_extensions.c 
>> b/src/mesa/state_tracker/st_extensions.c
>> index d5aad2d748..1c1182d0b0 100644
>> --- a/src/mesa/state_tracker/st_extensions.c
>> +++ b/src/mesa/state_tracker/st_extensions.c
>> @@ -83,7 +83,6 @@ void st_init_limits(struct pipe_screen *screen,
>>     unsigned sh;
>>     bool can_ubo = true;
>>     int temp;
>> -   bool ssbo_atomic = true;
>>
>>     c->MaxTextureLevels
>>        = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS),
>> @@ -251,7 +250,6 @@ void st_init_limits(struct pipe_screen *screen,
>>            * for separate atomic counters get the actual hw limits
>>            * per stage on atomic counters and buffers
>>            */
>> -         ssbo_atomic = false;
>>           pc->MaxAtomicCounters = temp;
>>           pc->MaxAtomicBuffers = screen->get_shader_param(screen, sh, 
>> PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS);
>>        } else {
>> @@ -445,21 +443,23 @@ void st_init_limits(struct pipe_screen *screen,
>>     c->MaxAtomicBufferSize =
>>        c->Program[MESA_SHADER_FRAGMENT].MaxAtomicCounters * 
>> ATOMIC_COUNTER_SIZE;
>>
>> -   if (!ssbo_atomic) {
>> -      /* on all HW with separate atomic (evergreen) the following
>> -         lines are true. not sure it's worth adding CAPs for this at this
>> -         stage. */
>> -      c->MaxCombinedAtomicCounters = 
>> c->Program[MESA_SHADER_FRAGMENT].MaxAtomicCounters;
>> -      c->MaxCombinedAtomicBuffers = 
>> c->Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers;
>> -   } else {
>> +   c->MaxCombinedAtomicBuffers =
>> +      screen->get_param(screen,
>> +                        PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTER_BUFFERS);
>> +   if (!c->MaxCombinedAtomicBuffers) {
>>        c->MaxCombinedAtomicBuffers =
>>           c->Program[MESA_SHADER_VERTEX].MaxAtomicBuffers +
>>           c->Program[MESA_SHADER_TESS_CTRL].MaxAtomicBuffers +
>>           c->Program[MESA_SHADER_TESS_EVAL].MaxAtomicBuffers +
>>           c->Program[MESA_SHADER_GEOMETRY].MaxAtomicBuffers +
>>           c->Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers;
>> -      assert(c->MaxCombinedAtomicBuffers <= MAX_COMBINED_ATOMIC_BUFFERS);
>>     }
>> +   assert(c->MaxCombinedAtomicBuffers <= MAX_COMBINED_ATOMIC_BUFFERS);
>> +
>> +   c->MaxCombinedAtomicCounters =
>> +      screen->get_param(screen, PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTERS);
>> +   if (!c->MaxCombinedAtomicCounters)
>> +      c->MaxCombinedAtomicCounters = MAX_ATOMIC_COUNTERS;
>>
>>     if (c->MaxCombinedAtomicBuffers > 0) {
>>        extensions->ARB_shader_atomic_counters = GL_TRUE;
>> --
>> 2.17.1
>>
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to