summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2016-08-26 09:53:47 -0600
committerBrian Paul <[email protected]>2016-08-29 17:46:50 -0600
commit646afc6ff75fca5a961549ffe175877f903ef5c7 (patch)
tree38bcc490220a7cccbf0e1cac62b606897d273060
parentb9b88516f8d3efc902696f1092519e298ceb7cdb (diff)
svga: move surface propagation code into new function
Put new svga_propagate_rendertargets() function where all the other surface propagation code lives. Reviewed-by: Charmaine Lee <[email protected]>
-rw-r--r--src/gallium/drivers/svga/svga_context.c13
-rw-r--r--src/gallium/drivers/svga/svga_surface.c22
-rw-r--r--src/gallium/drivers/svga/svga_surface.h3
3 files changed, 27 insertions, 11 deletions
diff --git a/src/gallium/drivers/svga/svga_context.c b/src/gallium/drivers/svga/svga_context.c
index ffecef59eb9..b3b2728305d 100644
--- a/src/gallium/drivers/svga/svga_context.c
+++ b/src/gallium/drivers/svga/svga_context.c
@@ -408,24 +408,15 @@ void svga_hwtnl_flush_buffer( struct svga_context *svga,
*/
void svga_surfaces_flush(struct svga_context *svga)
{
- struct svga_screen *svgascreen = svga_screen(svga->pipe.screen);
- unsigned i;
-
SVGA_STATS_TIME_PUSH(svga_sws(svga), SVGA_STATS_TIME_SURFACEFLUSH);
/* Emit buffered drawing commands.
*/
svga_hwtnl_flush_retry( svga );
- /* Emit back-copy from render target view to texture.
+ /* Emit back-copy from render target views to textures.
*/
- for (i = 0; i < svgascreen->max_color_buffers; i++) {
- if (svga->curr.framebuffer.cbufs[i])
- svga_propagate_surface(svga, svga->curr.framebuffer.cbufs[i]);
- }
-
- if (svga->curr.framebuffer.zsbuf)
- svga_propagate_surface(svga, svga->curr.framebuffer.zsbuf);
+ svga_propagate_rendertargets(svga);
SVGA_STATS_TIME_POP(svga_sws(svga));
}
diff --git a/src/gallium/drivers/svga/svga_surface.c b/src/gallium/drivers/svga/svga_surface.c
index a11ce4e4448..75e76fb297e 100644
--- a/src/gallium/drivers/svga/svga_surface.c
+++ b/src/gallium/drivers/svga/svga_surface.c
@@ -658,6 +658,28 @@ svga_propagate_surface(struct svga_context *svga, struct pipe_surface *surf)
/**
+ * If any of the render targets are in backing texture views, propagate any
+ * changes to them back to the original texture.
+ */
+void
+svga_propagate_rendertargets(struct svga_context *svga)
+{
+ const unsigned num_cbufs = svga_screen(svga->pipe.screen)->max_color_buffers;
+ unsigned i;
+
+ for (i = 0; i < num_cbufs; i++) {
+ if (svga->curr.framebuffer.cbufs[i]) {
+ svga_propagate_surface(svga, svga->curr.framebuffer.cbufs[i]);
+ }
+ }
+
+ if (svga->curr.framebuffer.zsbuf) {
+ svga_propagate_surface(svga, svga->curr.framebuffer.zsbuf);
+ }
+}
+
+
+/**
* Check if we should call svga_propagate_surface on the surface.
*/
boolean
diff --git a/src/gallium/drivers/svga/svga_surface.h b/src/gallium/drivers/svga/svga_surface.h
index 2f003b22cc6..ed9f37a74a6 100644
--- a/src/gallium/drivers/svga/svga_surface.h
+++ b/src/gallium/drivers/svga/svga_surface.h
@@ -78,6 +78,9 @@ struct svga_surface
extern void
svga_propagate_surface(struct svga_context *svga, struct pipe_surface *surf);
+void
+svga_propagate_rendertargets(struct svga_context *svga);
+
extern boolean
svga_surface_needs_propagation(const struct pipe_surface *surf);