summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/radeon/r600_texture.c
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2016-06-21 16:16:15 +0200
committerMarek Olšák <marek.olsak@amd.com>2016-06-29 20:12:00 +0200
commit9124457bff70686ea804d7e35fb63bea5db5a8a2 (patch)
tree9e9b1bdd9e42caab06096e6c446bb41632f5b1be /src/gallium/drivers/radeon/r600_texture.c
parentfa7c927625ec1904a659edfdd677b5752165590a (diff)
downloadexternal_mesa3d-9124457bff70686ea804d7e35fb63bea5db5a8a2.zip
external_mesa3d-9124457bff70686ea804d7e35fb63bea5db5a8a2.tar.gz
external_mesa3d-9124457bff70686ea804d7e35fb63bea5db5a8a2.tar.bz2
gallium/radeon: add state setup for a separate DCC buffer
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
Diffstat (limited to 'src/gallium/drivers/radeon/r600_texture.c')
-rw-r--r--src/gallium/drivers/radeon/r600_texture.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/gallium/drivers/radeon/r600_texture.c b/src/gallium/drivers/radeon/r600_texture.c
index 50f5025..c45c5f2 100644
--- a/src/gallium/drivers/radeon/r600_texture.c
+++ b/src/gallium/drivers/radeon/r600_texture.c
@@ -387,6 +387,8 @@ static bool r600_texture_discard_dcc(struct r600_common_screen *rscreen,
if (!r600_can_disable_dcc(rtex))
return false;
+ assert(rtex->dcc_separate_buffer == NULL);
+
/* Disable DCC. */
rtex->dcc_offset = 0;
@@ -564,6 +566,7 @@ static void r600_texture_destroy(struct pipe_screen *screen,
r600_resource_reference(&rtex->cmask_buffer, NULL);
}
pb_reference(&resource->buf, NULL);
+ r600_resource_reference(&rtex->dcc_separate_buffer, NULL);
FREE(rtex);
}
@@ -1800,12 +1803,21 @@ void vi_dcc_clear_level(struct r600_common_context *rctx,
struct r600_texture *rtex,
unsigned level, unsigned clear_value)
{
- struct pipe_resource *dcc_buffer = &rtex->resource.b.b;
- uint64_t dcc_offset = rtex->dcc_offset +
- rtex->surface.level[level].dcc_offset;
+ struct pipe_resource *dcc_buffer;
+ uint64_t dcc_offset;
assert(rtex->dcc_offset && rtex->surface.level[level].dcc_enabled);
+ if (rtex->dcc_separate_buffer) {
+ dcc_buffer = &rtex->dcc_separate_buffer->b.b;
+ dcc_offset = 0;
+ } else {
+ dcc_buffer = &rtex->resource.b.b;
+ dcc_offset = rtex->dcc_offset;
+ }
+
+ dcc_offset += rtex->surface.level[level].dcc_offset;
+
rctx->clear_buffer(&rctx->b, dcc_buffer, dcc_offset,
rtex->surface.level[level].dcc_fast_clear_size,
clear_value, R600_COHERENCY_CB_META);