[Mesa-dev] [PATCH 3/6] mesa/st: wire up DiscardFramebuffer

Rob Clark robdclark at gmail.com
Tue Dec 11 22:50:05 UTC 2018


pipe_context::invalidate_resource() is so *almost* what we want, but
with FBOs the fb can be a single layer/level of a pipe_resource, which
makes ::invalidate_resource() not expressive enough.

Signed-off-by: Rob Clark <robdclark at gmail.com>
---
 src/gallium/include/pipe/p_context.h |  8 ++++++++
 src/mesa/state_tracker/st_cb_fbo.c   | 16 ++++++++++++++++
 2 files changed, 24 insertions(+)

diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h
index e07b76d4f03..d4e9179b78a 100644
--- a/src/gallium/include/pipe/p_context.h
+++ b/src/gallium/include/pipe/p_context.h
@@ -803,6 +803,14 @@ struct pipe_context {
    void (*invalidate_resource)(struct pipe_context *ctx,
                                struct pipe_resource *resource);
 
+   /**
+    * Like ->invalidate_surface, but can invalidate a specific layer and level
+    * of a resource.  If the backing surf->texture has just a single layer and
+    * level (like window system buffers) it is equiv to ->invalidate_resource
+    */
+   void (*invalidate_surface)(struct pipe_context *ctx,
+                              struct pipe_surface *surf);
+
    /**
     * Return information about unexpected device resets.
     */
diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c
index 8901a8680ef..3ece1d4a9de 100644
--- a/src/mesa/state_tracker/st_cb_fbo.c
+++ b/src/mesa/state_tracker/st_cb_fbo.c
@@ -758,6 +758,21 @@ st_validate_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb)
    }
 }
 
+static void
+st_discard_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb,
+                       struct gl_renderbuffer_attachment *att)
+{
+   struct st_context *st = st_context(ctx);
+   struct pipe_surface *psurf;
+
+   if (!att->Renderbuffer)
+      return;
+
+   psurf = st_renderbuffer(att->Renderbuffer)->surface;
+
+   if (st->pipe->invalidate_surface)
+      st->pipe->invalidate_surface(st->pipe, psurf);
+}
 
 /**
  * Called via glDrawBuffer.  We only provide this driver function so that we
@@ -936,6 +951,7 @@ st_init_fbo_functions(struct dd_function_table *functions)
    functions->RenderTexture = st_render_texture;
    functions->FinishRenderTexture = st_finish_render_texture;
    functions->ValidateFramebuffer = st_validate_framebuffer;
+   functions->DiscardFramebuffer = st_discard_framebuffer;
 
    functions->DrawBufferAllocate = st_DrawBufferAllocate;
    functions->ReadBuffer = st_ReadBuffer;
-- 
2.19.2



More information about the mesa-dev mailing list