[Mesa-dev] [PATCH v2 3/6] gallium: add pipe->invalidate_surface()

Rob Clark robdclark at gmail.com
Wed Dec 12 15:48:40 UTC 2018


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



More information about the mesa-dev mailing list