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 <[email protected]> --- 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 _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
