[Mesa-dev] [PATCH v2 05/25] gallium: add sparse buffer interface and capability
Nicolai Hähnle
nicolai.haehnle at amd.com
Wed Mar 29 14:46:26 UTC 2017
On 29.03.2017 16:27, Marek Olšák wrote:
> On Wed, Mar 29, 2017 at 12:26 PM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
>> On 28.03.2017 21:46, Marek Olšák wrote:
>>>
>>> On Tue, Mar 28, 2017 at 11:11 AM, Nicolai Hähnle <nhaehnle at gmail.com>
>>> wrote:
>>>>
>>>> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>>>>
>>>> TODO fill out caps in all drivers
>>>>
>>>> v2:
>>>> - explain the resource_commit interface in more detail
>>>> ---
>>>> src/gallium/docs/source/context.rst | 25 +++++++++++++++++++++++++
>>>> src/gallium/docs/source/screen.rst | 3 +++
>>>> src/gallium/include/pipe/p_context.h | 13 +++++++++++++
>>>> src/gallium/include/pipe/p_defines.h | 2 ++
>>>> 4 files changed, 43 insertions(+)
>>>>
>>>> diff --git a/src/gallium/docs/source/context.rst
>>>> b/src/gallium/docs/source/context.rst
>>>> index a053193..5949ff2 100644
>>>> --- a/src/gallium/docs/source/context.rst
>>>> +++ b/src/gallium/docs/source/context.rst
>>>> @@ -611,20 +611,45 @@ for both regular textures as well as for
>>>> framebuffers read via FBFETCH.
>>>> .. _memory_barrier:
>>>>
>>>> memory_barrier
>>>> %%%%%%%%%%%%%%%
>>>>
>>>> This function flushes caches according to which of the PIPE_BARRIER_*
>>>> flags
>>>> are set.
>>>>
>>>>
>>>>
>>>> +.. _resource_commit:
>>>> +
>>>> +resource_commit
>>>> +%%%%%%%%%%%%%%%
>>>> +
>>>> +This function changes the commit state of a part of a sparse resource.
>>>> Sparse
>>>> +resources are created by setting the ``PIPE_RESOURCE_FLAG_SPARSE`` flag
>>>> when
>>>> +calling ``resource_create``. Initially, sparse resources only reserve a
>>>> virtual
>>>> +memory region that is not backed by memory (i.e., it is uncommitted).
>>>> The
>>>> +``resource_commit`` function can be called to commit or uncommit parts
>>>> (or all)
>>>> +of a resource. The driver manages the underlying backing memory.
>>>> +
>>>> +The contents of newly committed memory regions are undefined. Calling
>>>> this
>>>> +function to commit an already committed memory region is allowed and
>>>> leaves its
>>>> +content unchanged. Similarly, calling this function to uncommit an
>>>> already
>>>> +uncommitted memory region is allowed.
>>>> +
>>>> +For buffers, the given box must be aligned to multiples of
>>>> +``PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE``. As an exception to this rule, if
>>>> the size
>>>> +of the buffer is not a multiple of the page size, changing the commit
>>>> state of
>>>> +the last (partial) page requires a box that ends at the end of the
>>>> buffer
>>>> +(i.e., box->x + box->width == buffer->width0).
>>>> +
>>>> +
>>>> +
>>>> .. _pipe_transfer:
>>>>
>>>> PIPE_TRANSFER
>>>> ^^^^^^^^^^^^^
>>>>
>>>> These flags control the behavior of a transfer object.
>>>>
>>>> ``PIPE_TRANSFER_READ``
>>>> Resource contents read back (or accessed directly) at transfer create
>>>> time.
>>>>
>>>> diff --git a/src/gallium/docs/source/screen.rst
>>>> b/src/gallium/docs/source/screen.rst
>>>> index 00c9503..8759639 100644
>>>> --- a/src/gallium/docs/source/screen.rst
>>>> +++ b/src/gallium/docs/source/screen.rst
>>>> @@ -369,20 +369,23 @@ The integer capabilities:
>>>> opcode to retrieve the current value in the framebuffer.
>>>> * ``PIPE_CAP_TGSI_MUL_ZERO_WINS``: Whether TGSI shaders support the
>>>> ``TGSI_PROPERTY_MUL_ZERO_WINS`` shader property.
>>>> * ``PIPE_CAP_DOUBLES``: Whether double precision floating-point
>>>> operations
>>>> are supported.
>>>> * ``PIPE_CAP_INT64``: Whether 64-bit integer operations are supported.
>>>> * ``PIPE_CAP_INT64_DIVMOD``: Whether 64-bit integer division/modulo
>>>> operations are supported.
>>>> * ``PIPE_CAP_TGSI_TEX_TXF_LZ``: Whether TEX_LZ and TXF_LZ opcodes are
>>>> supported.
>>>> +* ``PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE``: The page size of sparse buffers
>>>> in
>>>> + bytes, or 0 if sparse buffers are not supported. The page size must be
>>>> at
>>>> + most 64KB.
>>>>
>>>>
>>>> .. _pipe_capf:
>>>>
>>>> PIPE_CAPF_*
>>>> ^^^^^^^^^^^^^^^^
>>>>
>>>> The floating-point capabilities are:
>>>>
>>>> * ``PIPE_CAPF_MAX_LINE_WIDTH``: The maximum width of a regular line.
>>>> diff --git a/src/gallium/include/pipe/p_context.h
>>>> b/src/gallium/include/pipe/p_context.h
>>>> index a29fff5..4d5535b 100644
>>>> --- a/src/gallium/include/pipe/p_context.h
>>>> +++ b/src/gallium/include/pipe/p_context.h
>>>> @@ -578,20 +578,33 @@ struct pipe_context {
>>>> * Flush any pending framebuffer writes and invalidate texture
>>>> caches.
>>>> */
>>>> void (*texture_barrier)(struct pipe_context *, unsigned flags);
>>>>
>>>> /**
>>>> * Flush caches according to flags.
>>>> */
>>>> void (*memory_barrier)(struct pipe_context *, unsigned flags);
>>>>
>>>> /**
>>>> + * Change the commitment status of a part of the given resource,
>>>> which must
>>>> + * have been created with the PIPE_RESOURCE_FLAG_SPARSE bit.
>>>> + *
>>>> + * \param level The texture level whose commitment should be changed.
>>>> + * \param box The region of the resource whose commitment should be
>>>> changed.
>>>> + * \param commit Whether memory should be committed or un-committed.
>>>> + *
>>>> + * \return false if out of memory, true on success.
>>>> + */
>>>> + bool (*resource_commit)(struct pipe_context *, struct pipe_resource
>>>> *,
>>>> + unsigned level, struct pipe_box *box, bool
>>>> commit);
>>>
>>>
>>> I wonder what the behavior for threaded gallium should be. Possibilities:
>>> 1) Sync the context thread and execute directly.
>>> 2) Ignore the return value, always return true, and execute it
>>> asynchronously.
>>>
>>> If the "false" return value is very unlikely, I may use the second
>>> approach.
>>
>>
>> "false" here means out-of-memory, or some error returned by the kernel on
>> the map operations (which in practice also should always be
>> out-of-memory...). What's the story here for threaded gallium? We're not
>> exactly consistent in reporting out-of-memory errors anyway (on draw calls
>> especially), but maybe that's something to improve...
>
> Well, for example, threaded gallium ignores the return values of
> begin_query and end_query. Those are pretty unlikely to fail. I wonder
> if this is similar.
Yes, they're similar. Obviously I'd expect resource_commit to use more
memory than begin/end_query, but conceptually it's the same thing.
Invalid parameters are caught in mesa/main.
Cheers,
Nicolai
> As long as we can't get a failure due to invalid
> parameters, it should be OK to ignore the out-of-memory error. The
> idea is that games usually shouldn't get out-of-memory errors and if
> they do, they can't deal with them.
>
> Marek
>
More information about the mesa-dev
mailing list