summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2015-11-09 09:12:20 -0800
committerEric Anholt <[email protected]>2015-11-09 19:17:36 -0800
commit437d7b611972c52fac32cb54038d3b278f66fd5a (patch)
treed62ad62693542a4f6625569d26c77b22b4e3139b
parent5980389bbf98b8186ba6a06392d92b82fa9efad3 (diff)
vc4: Avoid loading undefined (newly-allocated) FBO contents.
Since X has undefined contents in new pixmaps, it will allocate new textures for an FBO and draw to them without an explicit clear. For VC4, it's much faster to emit a clear than the load of the actual undefined memory contents, so just do that instead.
-rw-r--r--src/gallium/drivers/vc4/vc4_state.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/gallium/drivers/vc4/vc4_state.c b/src/gallium/drivers/vc4/vc4_state.c
index 7317695b652..a234ce53b20 100644
--- a/src/gallium/drivers/vc4/vc4_state.c
+++ b/src/gallium/drivers/vc4/vc4_state.c
@@ -420,6 +420,23 @@ vc4_set_framebuffer_state(struct pipe_context *pctx,
cso->width = framebuffer->width;
cso->height = framebuffer->height;
+ /* If we're binding to uninitialized buffers, no need to load their
+ * contents before drawing..
+ */
+ if (cso->cbufs[0]) {
+ struct vc4_resource *rsc =
+ vc4_resource(cso->cbufs[0]->texture);
+ if (!rsc->writes)
+ vc4->cleared |= PIPE_CLEAR_COLOR0;
+ }
+
+ if (cso->zsbuf) {
+ struct vc4_resource *rsc =
+ vc4_resource(cso->zsbuf->texture);
+ if (!rsc->writes)
+ vc4->cleared |= PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL;
+ }
+
/* Nonzero texture mipmap levels are laid out as if they were in
* power-of-two-sized spaces. The renderbuffer config infers its
* stride from the width parameter, so we need to configure our