[Mesa-dev] [PATCH] r600: fix FMASK allocation on r600/700
Dave Airlie
airlied at gmail.com
Tue Dec 9 18:11:28 PST 2014
From: Dave Airlie <airlied at redhat.com>
According to NDA docs:
FMASK surfaces are addressed identically a surface with num_samples bits per element, and
log2(num_samples) samples. For example, an FMASK for an 8-sample surface would be addressed
identically to a color surface with 8 bits per element and 3 samples.
Separate the r600 fmask allocation out, and workaround
a bug in the libdrm surface allocation which blocks a 3
sample surface, just round it up to 4.
This fixes hangs with ext_framebuffer_multisample-clip-and-scissor-blit 8 msaa
and destination clipping on my rv635.
Signed-off-by: Dave Airlie <airlied at redhat.com>
---
src/gallium/drivers/radeon/r600_texture.c | 49 +++++++++++++++++++------------
1 file changed, 30 insertions(+), 19 deletions(-)
diff --git a/src/gallium/drivers/radeon/r600_texture.c b/src/gallium/drivers/radeon/r600_texture.c
index fdf4d76..3ca460a 100644
--- a/src/gallium/drivers/radeon/r600_texture.c
+++ b/src/gallium/drivers/radeon/r600_texture.c
@@ -299,27 +299,38 @@ void r600_texture_get_fmask_info(struct r600_common_screen *rscreen,
fmask.flags |= RADEON_SURF_HAS_TILE_MODE_INDEX;
}
- switch (nr_samples) {
- case 2:
- case 4:
- fmask.bpe = 1;
- if (rscreen->chip_class <= CAYMAN) {
- fmask.bankh = 4;
+ if (rscreen->chip_class <= R700) {
+ /*
+ * R600/700 -
+ * FMASK surfaces are addressed identically a surface with num_samples
+ * bits per element, and log2(num_samples) samples.
+ */
+ if (nr_samples != 2 && nr_samples != 4 && nr_samples != 8) {
+ R600_ERR("Invalid sample count for FMASK allocation.\n");
+ return;
}
- break;
- case 8:
- fmask.bpe = 4;
- break;
- default:
- R600_ERR("Invalid sample count for FMASK allocation.\n");
- return;
- }
+ fmask.bpe = nr_samples;
+ fmask.nsamples = log2(nr_samples);
+ /* surface allocator won't do 3 samples */
+ if (fmask.nsamples == 3)
+ fmask.nsamples = 4;
- /* Overallocate FMASK on R600-R700 to fix colorbuffer corruption.
- * This can be fixed by writing a separate FMASK allocator specifically
- * for R600-R700 asics. */
- if (rscreen->chip_class <= R700) {
- fmask.bpe *= 2;
+ } else {
+ switch (nr_samples) {
+ case 2:
+ case 4:
+ fmask.bpe = 1;
+ if (rscreen->chip_class <= CAYMAN) {
+ fmask.bankh = 4;
+ }
+ break;
+ case 8:
+ fmask.bpe = 4;
+ break;
+ default:
+ R600_ERR("Invalid sample count for FMASK allocation.\n");
+ return;
+ }
}
if (rscreen->ws->surface_init(rscreen->ws, &fmask)) {
--
2.1.0
More information about the mesa-dev
mailing list