[Mesa-dev] [PATCH 10/13] gallium: the other drivers don't support ARB_buffer_storage

Marek Olšák maraeo at gmail.com
Fri Jan 31 04:18:21 PST 2014


Hi Roland,

The persistent and coherent flags are only for buffers.

It's unfortunate that buffer and texture transfers share the same
interface, because their implementation is vastly different in
hardware drivers. For textures, we only need 3 modes of transfers:
read, readwrite, and write+discard. Buffer transfers are generally
more complex, supporting flags like unsynchronized, dont_block, 2
discard flags, persistent, and coherent.

Marek

On Fri, Jan 31, 2014 at 4:02 AM, Roland Scheidegger <sroland at vmware.com> wrote:
> softpipe has tile caches though (for textures and render targets). I'm
> not sure if they'd be flushed whenever needed or if that would even be a
> problem.
> As for llvmpipe, there's no caches there, I'm not sure if there could be
> other problems.
>
> Roland
>
> Am 31.01.2014 00:44, schrieb Marek Olšák:
>> I guess softpipe should be fine. I'm not sure about llvmpipe and its
>> parallelism.
>>
>> Marek
>>
>> On Thu, Jan 30, 2014 at 11:55 PM, Fredrik Höglund <fredrik at kde.org> wrote:
>>> On Thursday 30 January 2014, Marek Olšák wrote:
>>>> From: Marek Olšák <marek.olsak at amd.com>
>>>>
>>>> ---
>>>>  src/gallium/drivers/freedreno/freedreno_screen.c | 1 +
>>>>  src/gallium/drivers/i915/i915_screen.c           | 1 +
>>>>  src/gallium/drivers/ilo/ilo_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/softpipe/sp_screen.c         | 1 +
>>>>  src/gallium/drivers/svga/svga_screen.c           | 1 +
>>>>  9 files changed, 9 insertions(+)
>>>>
>>>> diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c
>>>> index c10efd8..250570d 100644
>>>> --- a/src/gallium/drivers/freedreno/freedreno_screen.c
>>>> +++ b/src/gallium/drivers/freedreno/freedreno_screen.c
>>>> @@ -201,6 +201,7 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>>>>       case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
>>>>       case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
>>>>          case PIPE_CAP_TGSI_VS_LAYER:
>>>> +        case PIPE_CAP_BUFFER_TRANSFER_PERSISTENT_COHERENT:
>>>>               return 0;
>>>>
>>>>       /* Stream output. */
>>>> diff --git a/src/gallium/drivers/i915/i915_screen.c b/src/gallium/drivers/i915/i915_screen.c
>>>> index c9f2c35..7920b4f 100644
>>>> --- a/src/gallium/drivers/i915/i915_screen.c
>>>> +++ b/src/gallium/drivers/i915/i915_screen.c
>>>> @@ -225,6 +225,7 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap cap)
>>>>     case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
>>>>     case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
>>>>     case PIPE_CAP_TGSI_VS_LAYER:
>>>> +   case PIPE_CAP_BUFFER_TRANSFER_PERSISTENT_COHERENT:
>>>>        return 0;
>>>>
>>>>     case PIPE_CAP_GLSL_FEATURE_LEVEL:
>>>> diff --git a/src/gallium/drivers/ilo/ilo_screen.c b/src/gallium/drivers/ilo/ilo_screen.c
>>>> index 2c68fcd..c75195b 100644
>>>> --- a/src/gallium/drivers/ilo/ilo_screen.c
>>>> +++ b/src/gallium/drivers/ilo/ilo_screen.c
>>>> @@ -430,6 +430,7 @@ ilo_get_param(struct pipe_screen *screen, enum pipe_cap param)
>>>>     case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
>>>>        return true;
>>>>     case PIPE_CAP_TGSI_VS_LAYER:
>>>> +   case PIPE_CAP_BUFFER_TRANSFER_PERSISTENT_COHERENT:
>>>>        return 0;
>>>>
>>>>     default:
>>>> diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c
>>>> index 5643fbe..ed21401 100644
>>>> --- a/src/gallium/drivers/llvmpipe/lp_screen.c
>>>> +++ b/src/gallium/drivers/llvmpipe/lp_screen.c
>>>> @@ -231,6 +231,7 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
>>>>     case PIPE_CAP_ENDIANNESS:
>>>>        return PIPE_ENDIAN_NATIVE;
>>>>     case PIPE_CAP_TGSI_VS_LAYER:
>>>> +   case PIPE_CAP_BUFFER_TRANSFER_PERSISTENT_COHERENT:
>>>>        return 0;
>>>>     }
>>>>     /* should only get here on unhandled cases */
>>>> diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
>>>> index 787802d..3df6e64 100644
>>>> --- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c
>>>> +++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
>>>> @@ -124,6 +124,7 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>>>>     case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
>>>>     case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
>>>>     case PIPE_CAP_TGSI_VS_LAYER:
>>>> +   case PIPE_CAP_BUFFER_TRANSFER_PERSISTENT_COHERENT:
>>>>        return 0;
>>>>     case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
>>>>     case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
>>>> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
>>>> index 2b6ec3a..333f0b1 100644
>>>> --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
>>>> +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
>>>> @@ -193,6 +193,7 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>>>>     case PIPE_CAP_ENDIANNESS:
>>>>        return PIPE_ENDIAN_LITTLE;
>>>>     case PIPE_CAP_TGSI_VS_LAYER:
>>>> +   case PIPE_CAP_BUFFER_TRANSFER_PERSISTENT_COHERENT:
>>>>        return 0;
>>>>     default:
>>>>        NOUVEAU_ERR("unknown PIPE_CAP %d\n", param);
>>>> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
>>>> index 752d72b..b60740f 100644
>>>> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
>>>> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
>>>> @@ -171,6 +171,7 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>>>>     case PIPE_CAP_ENDIANNESS:
>>>>        return PIPE_ENDIAN_LITTLE;
>>>>     case PIPE_CAP_TGSI_VS_LAYER:
>>>> +   case PIPE_CAP_BUFFER_TRANSFER_PERSISTENT_COHERENT:
>>>>        return 0;
>>>>     default:
>>>>        NOUVEAU_ERR("unknown PIPE_CAP %d\n", param);
>>>> diff --git a/src/gallium/drivers/softpipe/sp_screen.c b/src/gallium/drivers/softpipe/sp_screen.c
>>>> index ed29cea..1f9fe32 100644
>>>> --- a/src/gallium/drivers/softpipe/sp_screen.c
>>>> +++ b/src/gallium/drivers/softpipe/sp_screen.c
>>>> @@ -183,6 +183,7 @@ softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
>>>>     case PIPE_CAP_ENDIANNESS:
>>>>        return PIPE_ENDIAN_NATIVE;
>>>>     case PIPE_CAP_TGSI_VS_LAYER:
>>>> +   case PIPE_CAP_BUFFER_TRANSFER_PERSISTENT_COHERENT:
>>>>        return 0;
>>>>     }
>>>>     /* should only get here on unhandled cases */
>>>> diff --git a/src/gallium/drivers/svga/svga_screen.c b/src/gallium/drivers/svga/svga_screen.c
>>>> index e039e8d..9e97567 100644
>>>> --- a/src/gallium/drivers/svga/svga_screen.c
>>>> +++ b/src/gallium/drivers/svga/svga_screen.c
>>>> @@ -265,6 +265,7 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param)
>>>>     case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
>>>>     case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
>>>>     case PIPE_CAP_TGSI_VS_LAYER:
>>>> +   case PIPE_CAP_BUFFER_TRANSFER_PERSISTENT_COHERENT:
>>>>        return 0;
>>>>     case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
>>>>        return 1;
>>>
>>> Would softpipe and llvmpipe need anything other than a no-op
>>> memory_barrier() implementation to support this extension?
>>>
>>> At any rate:
>>>
>>> Reviewed-by: Fredrik Höglund <fredrik at kde.org>
>>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://urldefense.proofpoint.com/v1/url?u=http://lists.freedesktop.org/mailman/listinfo/mesa-dev&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=F4msKE2WxRzA%2BwN%2B25muztFm5TSPwE8HKJfWfR2NgfY%3D%0A&m=HgyniQxQAPXhd9rtwla5kzc120VM5rx%2B4kXbHRT6SsM%3D%0A&s=6a6883c5bbd710eeadc0b9ff21374dba83ab9d57ab138c8f428514c735a9060d
>>


More information about the mesa-dev mailing list