summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2016-12-02 02:18:25 +0100
committerEmil Velikov <emil.l.velikov@gmail.com>2016-12-16 18:52:24 +0000
commit6d919a6fc6e236fc001e6a61a1d4288830020a60 (patch)
tree844691df048450b030fe5d5cd37233efa3c09109
parentf71c3734ced0d33693422abe1ed83774fa1e3851 (diff)
radeonsi: always restore sampler states when unbinding sampler views
Cc: 13.0 12.0 <mesa-stable@lists.freedesktop.org> (cherry picked from commit b3a2aa9cba46bd6c8de22390b3b1ce9ac6c27988)
-rw-r--r--src/gallium/drivers/radeonsi/si_descriptors.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c
index fe4cb2968de..dc84d495519 100644
--- a/src/gallium/drivers/radeonsi/si_descriptors.c
+++ b/src/gallium/drivers/radeonsi/si_descriptors.c
@@ -311,6 +311,7 @@ static void si_set_sampler_view(struct si_context *sctx,
unsigned slot, struct pipe_sampler_view *view)
{
struct si_sampler_view *rview = (struct si_sampler_view*)view;
+ uint32_t *desc = views->desc.list + slot * 16;
if (view && view->texture && view->texture->target != PIPE_BUFFER &&
G_008F28_COMPRESSION_EN(rview->state[6]) &&
@@ -346,9 +347,14 @@ static void si_set_sampler_view(struct si_context *sctx,
views->desc.enabled_mask |= 1u << slot;
} else {
pipe_sampler_view_reference(&views->views[slot], NULL);
- memcpy(views->desc.list + slot*16, null_texture_descriptor, 8*4);
+ memcpy(desc, null_texture_descriptor, 8*4);
/* Only clear the lower dwords of FMASK. */
- memcpy(views->desc.list + slot*16 + 8, null_texture_descriptor, 4*4);
+ memcpy(desc + 8, null_texture_descriptor, 4*4);
+ /* Re-set the sampler state if we are transitioning from FMASK. */
+ if (views->sampler_states[slot])
+ memcpy(desc + 12,
+ views->sampler_states[slot], 4*4);
+
views->desc.enabled_mask &= ~(1u << slot);
}