[Mesa-dev] [PATCH v2 3/6] gallium: add pipe->invalidate_surface()
Rob Clark
robdclark at gmail.com
Fri Dec 14 20:51:13 UTC 2018
I don't mind renaming it to invalidate_subsurface() if you prefer
that, but I really prefer that it takes a surface rather than a
resource... pipe_resource is the wrong level to do this.
Even though surfaces are transient, tracking the invalidate state in
the surface works out much easier in the driver. And I don't want to
have to map resource+params back to a surface. If another driver
wants to track this at the resource level, it is easier for them to go
from surface to resource+params, compared to the opposite direction.
BR,
-R
On Fri, Dec 14, 2018 at 3:38 PM Marek Olšák <maraeo at gmail.com> wrote:
>
> Can you please call it invalidate_subresource and inline relevant pipe_surface variables inside the parameters?
>
> Thanks,
> Marek
>
> On Wed, Dec 12, 2018 at 10:48 AM Rob Clark <robdclark at gmail.com> wrote:
>>
>> A new API to implement glInvalidateFramebuffer() and friends. It is
>> similar to invalidate_resource() but can be used to invalidate a
>> specific layer/level, so it is suitable to use for user FBOs in addition
>> to window system framebuffer.
>>
>> Signed-off-by: Rob Clark <robdclark at gmail.com>
>> ---
>> src/gallium/docs/source/context.rst | 18 ++++++++++++++++++
>> src/gallium/include/pipe/p_context.h | 18 ++++++++++++++++++
>> 2 files changed, 36 insertions(+)
>>
>> diff --git a/src/gallium/docs/source/context.rst b/src/gallium/docs/source/context.rst
>> index 20d0df79312..9f3cd49ee31 100644
>> --- a/src/gallium/docs/source/context.rst
>> +++ b/src/gallium/docs/source/context.rst
>> @@ -740,7 +740,25 @@ 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).
>>
>> +.. _invalidate_surface:
>>
>> +invalidate_surface
>> +%%%%%%%%%%%%%%%%%%
>> +
>> +This optional function marks a surface, or a portion of a surface, as invalid,
>> +for example to implement glInvalidateFramebuffer() (and friends). It is
>> +useful in particular for tiler GPUs, as a way to avoid unnecessary transfers
>> +between system memory and tile buffer.
>> +
>> +For example, invalidating a surface after rendering, but before flush, can
>> +be used to avoid tile to system memory transfer (for example, if zs can be
>> +discarded). And an invalidate after flush before rendering can be used to
>> +avoid a system memory to tile buffer transfer.
>> +
>> +Invalidating a partial surface can also be used to avoid unnecessary transfer
>> +from system memory to tile buffer in the case of a scissored clear (which is
>> +implemented via ->draw_vbo() by the state tracker) by invalidating the
>> +scissored region.
>>
>> .. _pipe_transfer:
>>
>> diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h
>> index e07b76d4f03..4dfc87faff6 100644
>> --- a/src/gallium/include/pipe/p_context.h
>> +++ b/src/gallium/include/pipe/p_context.h
>> @@ -803,6 +803,24 @@ struct pipe_context {
>> void (*invalidate_resource)(struct pipe_context *ctx,
>> struct pipe_resource *resource);
>>
>> + /**
>> + * Like ->invalidate_resource, but can invalidate a specific layer and level
>> + * of a resource, and optionally a specific sub-region of the resource (if
>> + * region is not NULL).
>> + *
>> + * If the backing surf->texture has just a single layer and level (like
>> + * window system buffers), and region is NULL, it is equivalent to
>> + * ->invalidate_resource().
>> + *
>> + * \param ctx pipe context
>> + * \param surf surface to invalidate
>> + * \param region NULL to invalidate whole surface, otherwise specifies which
>> + * portion of the surface is invalidated
>> + */
>> + void (*invalidate_surface)(struct pipe_context *ctx,
>> + struct pipe_surface *surf,
>> + const struct pipe_box *region);
>> +
>> /**
>> * Return information about unexpected device resets.
>> */
>> --
>> 2.19.2
>>
>> _______________________________________________
>> 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