[Mesa-dev] [PATCH] gallium: add CAP for postprocess filters

Timothy Arceri tarceri at itsqueeze.com
Wed Apr 4 03:03:06 UTC 2018


On 04/04/18 12:44, Roland Scheidegger wrote:
> Am 04.04.2018 um 04:32 schrieb Timothy Arceri:
>> On 04/04/18 11:58, Roland Scheidegger wrote:
>>> AFAIK these filters (and I've never looked into them) should be
>>> transparent to hw drivers. Hence a cap bit doesn't make sense, and if
>>> it's broken we shouldn't just paper over this.
>>
>> I created a CAP because the AMD devs have no interest in supporting this
>> feature [1]. Even if they are transparent to drivers I don't see why
>> drivers should be forced to enable them if they don't want to. CCing
>> Marek for his opinion.
> 
> I still don't see why using cap bits for bugs is a good idea.

Well I see it as a CAP for an unwanted feature that just happens to not 
work currently.

> (Even more so if the bug actually would be in the postprocess, but I've
> no idea there really.)

It's crashing in src/gallium/drivers/radeonsi/si_state_draw.c

> 
> Roland
> 
>>
>> [1]
>> https://urldefense.proofpoint.com/v2/url?u=https-3A__bugs.freedesktop.org_show-5Fbug.cgi-3Fid-3D99549-23c3&d=DwICaQ&c=uilaK90D4TOVoH58JNXRgQ&r=_QIjpv-UJ77xEQY8fIYoQtr5qv8wKrPJc7v7_-CYAb0&m=s23eRwsegKslN9P2JpzYmfnEOt7uPtVLO6XI3-BR_h4&s=LnLvs_TtyuJE3MWrA16CVWgkwxKkfKCuXHJDbtO3KGo&e=
>>
>>
>>>
>>> Roland
>>>
>>> Am 03.04.2018 um 13:38 schrieb Timothy Arceri:
>>>> For radeonsi these seem to have been somewhat broken for over a
>>>> year, and as of recently they cause the driver to crash.
>>>>
>>>> This patch adds a CAP for the filters and enables the CAP for all
>>>> driver except radeonsi.
>>>>
>>>> Bugzilla:
>>>> https://urldefense.proofpoint.com/v2/url?u=https-3A__bugs.freedesktop.org_show-5Fbug.cgi-3Fid-3D99549&d=DwIGaQ&c=uilaK90D4TOVoH58JNXRgQ&r=_QIjpv-UJ77xEQY8fIYoQtr5qv8wKrPJc7v7_-CYAb0&m=FsyE0Iv-1HkgmJ_6JgvnISAuUbjQthRX9OcSu3BUhgc&s=5iJ7ErqsBvMPRH06U44_GD_7EvtIFP8hzyKeeDtIxxE&e=
>>>>
>>>> Bugzilla:
>>>> https://urldefense.proofpoint.com/v2/url?u=https-3A__bugs.freedesktop.org_show-5Fbug.cgi-3Fid-3D105026&d=DwIGaQ&c=uilaK90D4TOVoH58JNXRgQ&r=_QIjpv-UJ77xEQY8fIYoQtr5qv8wKrPJc7v7_-CYAb0&m=FsyE0Iv-1HkgmJ_6JgvnISAuUbjQthRX9OcSu3BUhgc&s=PeI7pgvz9cprwPELTcdw_TUZHrtj1tt6KjHa-4rVRtY&e=
>>>>
>>>> ---
>>>>    src/gallium/docs/source/screen.rst               |  2 ++
>>>>    src/gallium/drivers/etnaviv/etnaviv_screen.c     |  1 +
>>>>    src/gallium/drivers/freedreno/freedreno_screen.c |  1 +
>>>>    src/gallium/drivers/i915/i915_screen.c           |  1 +
>>>>    src/gallium/drivers/llvmpipe/lp_screen.c         |  1 +
>>>>    src/gallium/drivers/nouveau/nv30/nv30_screen.c   |  1 +
>>>>    src/gallium/drivers/nouveau/nv50/nv50_screen.c   |  1 +
>>>>    src/gallium/drivers/nouveau/nvc0/nvc0_screen.c   |  1 +
>>>>    src/gallium/drivers/r300/r300_screen.c           |  1 +
>>>>    src/gallium/drivers/r600/r600_pipe.c             |  1 +
>>>>    src/gallium/drivers/radeonsi/si_get.c            |  1 +
>>>>    src/gallium/drivers/softpipe/sp_screen.c         |  1 +
>>>>    src/gallium/drivers/svga/svga_screen.c           |  1 +
>>>>    src/gallium/drivers/swr/swr_screen.cpp           |  1 +
>>>>    src/gallium/drivers/vc4/vc4_screen.c             |  1 +
>>>>    src/gallium/drivers/vc5/vc5_screen.c             |  1 +
>>>>    src/gallium/drivers/virgl/virgl_screen.c         |  2 ++
>>>>    src/gallium/include/pipe/p_defines.h             |  1 +
>>>>    src/gallium/state_trackers/dri/dri_screen.c      | 15 ++++++++-------
>>>>    19 files changed, 28 insertions(+), 7 deletions(-)
>>>>
>>>> diff --git a/src/gallium/docs/source/screen.rst
>>>> b/src/gallium/docs/source/screen.rst
>>>> index 3837360fb40..22aba928580 100644
>>>> --- a/src/gallium/docs/source/screen.rst
>>>> +++ b/src/gallium/docs/source/screen.rst
>>>> @@ -420,6 +420,8 @@ The integer capabilities:
>>>>      by the driver, and the driver can throw assertion failures.
>>>>    * ``PIPE_CAP_PACKED_UNIFORMS``: True if the driver supports packed
>>>> uniforms
>>>>      as opposed to padding to vec4s.
>>>> +* ``PIPE_CAP_PP_FILTERS``: True if the driver supports the
>>>> postprocess filters
>>>> +  available in gallium.
>>>>        .. _pipe_capf:
>>>> diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c
>>>> b/src/gallium/drivers/etnaviv/etnaviv_screen.c
>>>> index 2ae4e86c631..d277ac834db 100644
>>>> --- a/src/gallium/drivers/etnaviv/etnaviv_screen.c
>>>> +++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c
>>>> @@ -140,6 +140,7 @@ etna_screen_get_param(struct pipe_screen
>>>> *pscreen, enum pipe_cap param)
>>>>       case PIPE_CAP_TGSI_TEXCOORD:
>>>>       case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
>>>>       case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
>>>> +   case PIPE_CAP_PP_FILTERS:
>>>>          return 1;
>>>>       case PIPE_CAP_NATIVE_FENCE_FD:
>>>>          return screen->drm_version >= ETNA_DRM_VERSION_FENCE_FD;
>>>> diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c
>>>> b/src/gallium/drivers/freedreno/freedreno_screen.c
>>>> index f338d756dfe..42ab87514d8 100644
>>>> --- a/src/gallium/drivers/freedreno/freedreno_screen.c
>>>> +++ b/src/gallium/drivers/freedreno/freedreno_screen.c
>>>> @@ -186,6 +186,7 @@ fd_screen_get_param(struct pipe_screen *pscreen,
>>>> enum pipe_cap param)
>>>>        case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
>>>>        case PIPE_CAP_TEXTURE_BARRIER:
>>>>        case PIPE_CAP_INVALIDATE_BUFFER:
>>>> +    case PIPE_CAP_PP_FILTERS:
>>>>            return 1;
>>>>          case PIPE_CAP_VERTEXID_NOBASE:
>>>> diff --git a/src/gallium/drivers/i915/i915_screen.c
>>>> b/src/gallium/drivers/i915/i915_screen.c
>>>> index 59d2ec66284..8564a8567e4 100644
>>>> --- a/src/gallium/drivers/i915/i915_screen.c
>>>> +++ b/src/gallium/drivers/i915/i915_screen.c
>>>> @@ -205,6 +205,7 @@ i915_get_param(struct pipe_screen *screen, enum
>>>> pipe_cap cap)
>>>>       case PIPE_CAP_VERTEX_COLOR_CLAMPED:
>>>>       case PIPE_CAP_USER_VERTEX_BUFFERS:
>>>>       case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
>>>> +   case PIPE_CAP_PP_FILTERS:
>>>>          return 1;
>>>>         /* Unsupported features (boolean caps). */
>>>> diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c
>>>> b/src/gallium/drivers/llvmpipe/lp_screen.c
>>>> index 3f5d0327bf9..9290d3ec869 100644
>>>> --- a/src/gallium/drivers/llvmpipe/lp_screen.c
>>>> +++ b/src/gallium/drivers/llvmpipe/lp_screen.c
>>>> @@ -110,6 +110,7 @@ llvmpipe_get_param(struct pipe_screen *screen,
>>>> enum pipe_cap param)
>>>>       case PIPE_CAP_NPOT_TEXTURES:
>>>>       case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
>>>>       case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
>>>> +   case PIPE_CAP_PP_FILTERS:
>>>>          return 1;
>>>>       case PIPE_CAP_SM3:
>>>>          return 1;
>>>> diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c
>>>> b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
>>>> index 1d1fbaad607..d3afd0cf493 100644
>>>> --- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c
>>>> +++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
>>>> @@ -94,6 +94,7 @@ nv30_screen_get_param(struct pipe_screen *pscreen,
>>>> enum pipe_cap param)
>>>>       case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
>>>>       case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
>>>>       case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
>>>> +   case PIPE_CAP_PP_FILTERS:
>>>>          return 1;
>>>>       /* nv35 capabilities */
>>>>       case PIPE_CAP_DEPTH_BOUNDS_TEST:
>>>> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
>>>> b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
>>>> index 6fd2982e3cb..643c4516935 100644
>>>> --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
>>>> +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
>>>> @@ -199,6 +199,7 @@ nv50_screen_get_param(struct pipe_screen
>>>> *pscreen, enum pipe_cap param)
>>>>       case PIPE_CAP_TGSI_CLOCK:
>>>>       case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX:
>>>>       case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
>>>> +   case PIPE_CAP_PP_FILTERS:
>>>>          return 1;
>>>>       case PIPE_CAP_SEAMLESS_CUBE_MAP:
>>>>          return 1; /* class_3d >= NVA0_3D_CLASS; */
>>>> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
>>>> b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
>>>> index b4a2c676f59..eb50f12bf76 100644
>>>> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
>>>> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
>>>> @@ -254,6 +254,7 @@ nvc0_screen_get_param(struct pipe_screen
>>>> *pscreen, enum pipe_cap param)
>>>>       case PIPE_CAP_COMPUTE:
>>>>       case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX:
>>>>       case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
>>>> +   case PIPE_CAP_PP_FILTERS:
>>>>          return 1;
>>>>       case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
>>>>          return nouveau_screen(pscreen)->vram_domain & NOUVEAU_BO_VRAM
>>>> ? 1 : 0;
>>>> diff --git a/src/gallium/drivers/r300/r300_screen.c
>>>> b/src/gallium/drivers/r300/r300_screen.c
>>>> index 8ea2e87ce68..0f49dcd4c04 100644
>>>> --- a/src/gallium/drivers/r300/r300_screen.c
>>>> +++ b/src/gallium/drivers/r300/r300_screen.c
>>>> @@ -111,6 +111,7 @@ static int r300_get_param(struct pipe_screen*
>>>> pscreen, enum pipe_cap param)
>>>>            case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
>>>>            case PIPE_CAP_CLIP_HALFZ:
>>>>            case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
>>>> +        case PIPE_CAP_PP_FILTERS:
>>>>                return 1;
>>>>              case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
>>>> diff --git a/src/gallium/drivers/r600/r600_pipe.c
>>>> b/src/gallium/drivers/r600/r600_pipe.c
>>>> index 43f2dfae7ec..129e4af28e1 100644
>>>> --- a/src/gallium/drivers/r600/r600_pipe.c
>>>> +++ b/src/gallium/drivers/r600/r600_pipe.c
>>>> @@ -302,6 +302,7 @@ static int r600_get_param(struct pipe_screen*
>>>> pscreen, enum pipe_cap param)
>>>>        case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX:
>>>>        case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
>>>>        case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR:
>>>> +    case PIPE_CAP_PP_FILTERS:
>>>>            return 1;
>>>>          case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
>>>> diff --git a/src/gallium/drivers/radeonsi/si_get.c
>>>> b/src/gallium/drivers/radeonsi/si_get.c
>>>> index fc2be33b3e4..2bf997a712a 100644
>>>> --- a/src/gallium/drivers/radeonsi/si_get.c
>>>> +++ b/src/gallium/drivers/radeonsi/si_get.c
>>>> @@ -275,6 +275,7 @@ static int si_get_param(struct pipe_screen
>>>> *pscreen, enum pipe_cap param)
>>>>        case PIPE_CAP_TILE_RASTER_ORDER:
>>>>        case PIPE_CAP_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
>>>>        case PIPE_CAP_CONTEXT_PRIORITY_MASK:
>>>> +    case PIPE_CAP_PP_FILTERS:
>>>>            return 0;
>>>>          case PIPE_CAP_FENCE_SIGNAL:
>>>> diff --git a/src/gallium/drivers/softpipe/sp_screen.c
>>>> b/src/gallium/drivers/softpipe/sp_screen.c
>>>> index 25f6f74f366..46d88b72daa 100644
>>>> --- a/src/gallium/drivers/softpipe/sp_screen.c
>>>> +++ b/src/gallium/drivers/softpipe/sp_screen.c
>>>> @@ -68,6 +68,7 @@ softpipe_get_param(struct pipe_screen *screen, enum
>>>> pipe_cap param)
>>>>       case PIPE_CAP_NPOT_TEXTURES:
>>>>       case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
>>>>       case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
>>>> +   case PIPE_CAP_PP_FILTERS:
>>>>          return 1;
>>>>       case PIPE_CAP_SM3:
>>>>          return 1;
>>>> diff --git a/src/gallium/drivers/svga/svga_screen.c
>>>> b/src/gallium/drivers/svga/svga_screen.c
>>>> index f5f07fa75eb..68c08b1f7bc 100644
>>>> --- a/src/gallium/drivers/svga/svga_screen.c
>>>> +++ b/src/gallium/drivers/svga/svga_screen.c
>>>> @@ -185,6 +185,7 @@ svga_get_param(struct pipe_screen *screen, enum
>>>> pipe_cap param)
>>>>       case PIPE_CAP_NPOT_TEXTURES:
>>>>       case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
>>>>       case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
>>>> +   case PIPE_CAP_PP_FILTERS:
>>>>          return 1;
>>>>       case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
>>>>          /*
>>>> diff --git a/src/gallium/drivers/swr/swr_screen.cpp
>>>> b/src/gallium/drivers/swr/swr_screen.cpp
>>>> index 880a177c399..791f843a6d4 100644
>>>> --- a/src/gallium/drivers/swr/swr_screen.cpp
>>>> +++ b/src/gallium/drivers/swr/swr_screen.cpp
>>>> @@ -245,6 +245,7 @@ swr_get_param(struct pipe_screen *screen, enum
>>>> pipe_cap param)
>>>>       case PIPE_CAP_CULL_DISTANCE:
>>>>       case PIPE_CAP_CUBE_MAP_ARRAY:
>>>>       case PIPE_CAP_DOUBLES:
>>>> +   case PIPE_CAP_PP_FILTERS:
>>>>          return 1;
>>>>         /* MSAA support
>>>> diff --git a/src/gallium/drivers/vc4/vc4_screen.c
>>>> b/src/gallium/drivers/vc4/vc4_screen.c
>>>> index cead71b77cd..9624c91196b 100644
>>>> --- a/src/gallium/drivers/vc4/vc4_screen.c
>>>> +++ b/src/gallium/drivers/vc4/vc4_screen.c
>>>> @@ -146,6 +146,7 @@ vc4_screen_get_param(struct pipe_screen *pscreen,
>>>> enum pipe_cap param)
>>>>            case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY:
>>>>            case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
>>>>            case PIPE_CAP_TEXTURE_BARRIER:
>>>> +        case PIPE_CAP_PP_FILTERS:
>>>>                    return 1;
>>>>              case PIPE_CAP_TILE_RASTER_ORDER:
>>>> diff --git a/src/gallium/drivers/vc5/vc5_screen.c
>>>> b/src/gallium/drivers/vc5/vc5_screen.c
>>>> index 271c2c878bb..e7356cf9c0a 100644
>>>> --- a/src/gallium/drivers/vc5/vc5_screen.c
>>>> +++ b/src/gallium/drivers/vc5/vc5_screen.c
>>>> @@ -110,6 +110,7 @@ vc5_screen_get_param(struct pipe_screen *pscreen,
>>>> enum pipe_cap param)
>>>>            case PIPE_CAP_DRAW_INDIRECT:
>>>>            case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
>>>>            case PIPE_CAP_SIGNED_VERTEX_BUFFER_OFFSET:
>>>> +        case PIPE_CAP_PP_FILTERS:
>>>>                    return 1;
>>>>              case PIPE_CAP_INDEP_BLEND_ENABLE:
>>>> diff --git a/src/gallium/drivers/virgl/virgl_screen.c
>>>> b/src/gallium/drivers/virgl/virgl_screen.c
>>>> index 02613f18663..a6555e2667d 100644
>>>> --- a/src/gallium/drivers/virgl/virgl_screen.c
>>>> +++ b/src/gallium/drivers/virgl/virgl_screen.c
>>>> @@ -198,6 +198,8 @@ virgl_get_param(struct pipe_screen *screen, enum
>>>> pipe_cap param)
>>>>          return vscreen->caps.caps.v1.bset.has_sample_shading;
>>>>       case PIPE_CAP_CULL_DISTANCE:
>>>>          return vscreen->caps.caps.v1.bset.has_cull;
>>>> +   case PIPE_CAP_PP_FILTERS:
>>>> +      return 1;
>>>>       case PIPE_CAP_TEXTURE_GATHER_SM5:
>>>>       case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
>>>>       case PIPE_CAP_FAKE_SW_MSAA:
>>>> diff --git a/src/gallium/include/pipe/p_defines.h
>>>> b/src/gallium/include/pipe/p_defines.h
>>>> index c4ae0532060..25338782f9e 100644
>>>> --- a/src/gallium/include/pipe/p_defines.h
>>>> +++ b/src/gallium/include/pipe/p_defines.h
>>>> @@ -795,6 +795,7 @@ enum pipe_cap
>>>>       PIPE_CAP_FENCE_SIGNAL,
>>>>       PIPE_CAP_CONSTBUF0_FLAGS,
>>>>       PIPE_CAP_PACKED_UNIFORMS,
>>>> +   PIPE_CAP_PP_FILTERS,
>>>>    };
>>>>      /**
>>>> diff --git a/src/gallium/state_trackers/dri/dri_screen.c
>>>> b/src/gallium/state_trackers/dri/dri_screen.c
>>>> index aaee9870776..20ce0723665 100644
>>>> --- a/src/gallium/state_trackers/dri/dri_screen.c
>>>> +++ b/src/gallium/state_trackers/dri/dri_screen.c
>>>> @@ -487,13 +487,14 @@ dri_destroy_screen(__DRIscreen * sPriv)
>>>>    }
>>>>      static void
>>>> -dri_postprocessing_init(struct dri_screen *screen)
>>>> +dri_postprocessing_init(struct dri_screen *screen,
>>>> +                        struct pipe_screen *pscreen)
>>>>    {
>>>> -   unsigned i;
>>>> -
>>>> -   for (i = 0; i < PP_FILTERS; i++) {
>>>> -      screen->pp_enabled[i] =
>>>> driQueryOptioni(&screen->dev->option_cache,
>>>> -                                              pp_filters[i].name);
>>>> +   if (pscreen->get_param(pscreen, PIPE_CAP_PP_FILTERS)) {
>>>> +      for (unsigned i = 0; i < PP_FILTERS; i++) {
>>>> +         screen->pp_enabled[i] =
>>>> driQueryOptioni(&screen->dev->option_cache,
>>>> +                                                 pp_filters[i].name);
>>>> +      }
>>>>       }
>>>>    }
>>>>    @@ -542,7 +543,7 @@ dri_init_screen_helper(struct dri_screen *screen,
>>>>       else
>>>>          screen->target = PIPE_TEXTURE_RECT;
>>>>    -   dri_postprocessing_init(screen);
>>>> +   dri_postprocessing_init(screen, pscreen);
>>>>         screen->st_api->query_versions(screen->st_api, &screen->base,
>>>>                                      &screen->options,
>>>>
>>>
> 
> _______________________________________________
> 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