summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/svga/svga_surface.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/svga/svga_surface.c')
-rw-r--r--src/gallium/drivers/svga/svga_surface.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/gallium/drivers/svga/svga_surface.c b/src/gallium/drivers/svga/svga_surface.c
index d0dc58d10f3b..cbeaa2390cd8 100644
--- a/src/gallium/drivers/svga/svga_surface.c
+++ b/src/gallium/drivers/svga/svga_surface.c
@@ -416,10 +416,11 @@ create_backed_surface_view(struct svga_context *svga, struct svga_surface *s)
s->backed = svga_surface(backed_view);
}
- else {
+ else if (s->backed->age < tex->age) {
/*
* There is already an existing backing surface, but we still need to
- * sync the handles.
+ * sync the backing resource if the original resource has been modified
+ * since the last copy.
*/
struct svga_surface *bs = s->backed;
unsigned int layer, zslice;
@@ -445,6 +446,7 @@ create_backed_surface_view(struct svga_context *svga, struct svga_surface *s)
}
svga_mark_surface_dirty(&s->backed->base);
+ s->backed->age = tex->age;
SVGA_STATS_TIME_POP(svga_sws(svga));
@@ -647,8 +649,11 @@ svga_mark_surface_dirty(struct pipe_surface *surf)
/* Increment the view_age and texture age for this surface's mipmap
* level so that any sampler views into the texture are re-validated too.
+ * Note: we age the texture for backed surface view only when the
+ * backed surface is propagated to the original surface.
*/
- svga_age_texture_view(tex, surf->u.tex.level);
+ if (s->handle == tex->handle)
+ svga_age_texture_view(tex, surf->u.tex.level);
}
@@ -742,6 +747,9 @@ svga_propagate_surface(struct svga_context *svga, struct pipe_surface *surf,
1);
svga_define_texture_level(tex, layer + i, surf->u.tex.level);
}
+
+ /* Sync the surface view age with the texture age */
+ s->age = tex->age;
}
SVGA_STATS_TIME_POP(ss->sws);