From: Marek Olšák <marek.ol...@amd.com>

Simply ignore the "scanout" flag if the surface dimensions are unlikely
to be used by DCE.

This enables DCC for all X pixmaps that are not on the list of displayable
dimensions.

Also ignore the "scanout" flag for non-2D, non-color, and AA surfaces.

Any suggestions how to reduce the size of the list?
---
 src/gallium/drivers/radeon/Makefile.sources      |   1 +
 src/gallium/drivers/radeon/display_resolutions.h | 239 +++++++++++++++++++++++
 src/gallium/drivers/radeon/r600_texture.c        |  33 +++-
 3 files changed, 270 insertions(+), 3 deletions(-)
 create mode 100644 src/gallium/drivers/radeon/display_resolutions.h

diff --git a/src/gallium/drivers/radeon/Makefile.sources 
b/src/gallium/drivers/radeon/Makefile.sources
index 6fbed81..01bf07d 100644
--- a/src/gallium/drivers/radeon/Makefile.sources
+++ b/src/gallium/drivers/radeon/Makefile.sources
@@ -1,5 +1,6 @@
 C_SOURCES := \
        cayman_msaa.c \
+       display_resolutions.h \
        r600_buffer_common.c \
        r600_cs.h \
        r600d_common.h \
diff --git a/src/gallium/drivers/radeon/display_resolutions.h 
b/src/gallium/drivers/radeon/display_resolutions.h
new file mode 100644
index 0000000..5f9bdce
--- /dev/null
+++ b/src/gallium/drivers/radeon/display_resolutions.h
@@ -0,0 +1,239 @@
+/*
+ * Copyright 2016 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/* Surface dimensions not listed here will always use a NON-DISPLAYABLE layout
+ * and possibly DCC.
+ *
+ * Add all possible display resolutions and cursor sizes here.
+ */
+
+/* From Wikipedia mostly: */
+static unsigned resolutions[] = {
+       16, 16,
+       32, 32,
+       40, 30,
+       42, 11,
+       42, 32,
+       48, 32,
+       60, 40,
+       64, 64,
+       72, 64,
+       75, 64,
+       84, 48,
+       96, 64,
+       96, 65,
+       96, 96,
+       102, 64,
+       120, 90,
+       128, 36,
+       128, 48,
+       128, 96,
+       128, 128,
+       140, 192,
+       144, 168,
+       150, 40,
+       160, 102,
+       160, 120,
+       160, 144,
+       160, 152,
+       160, 160,
+       160, 200,
+       160, 256,
+       176, 144,
+       208, 176,
+       208, 208,
+       220, 176,
+       224, 144,
+       240, 64,
+       240, 160,
+       240, 240,
+       256, 192,
+       256, 256,
+       272, 340,
+       280, 192,
+       310, 576,
+       312, 390,
+       320, 192,
+       320, 200,
+       320, 208,
+       320, 224,
+       320, 240,
+       320, 256,
+       320, 320,
+       352, 240,
+       352, 288,
+       352, 480,
+       352, 576,
+       370, 576,
+       376, 240,
+       380, 480,
+       384, 288,
+       400, 240,
+       400, 270,
+       400, 300,
+       416, 352,
+       432, 128,
+       432, 240,
+       440, 480,
+       480, 234,
+       480, 250,
+       480, 272,
+       480, 320,
+       480, 480,
+       480, 500,
+       480, 576,
+       512, 256,
+       512, 342,
+       512, 384,
+       520, 432,
+       520, 576,
+       530, 480,
+       544, 576,
+       560, 192,
+       570, 576,
+       580, 480,
+       600, 480,
+       640, 200,
+       640, 240,
+       640, 256,
+       640, 320,
+       640, 350,
+       640, 360,
+       640, 400,
+       640, 480,
+       640, 512,
+       704, 480,
+       704, 576,
+       720, 348,
+       720, 350,
+       720, 364,
+       720, 480,
+       720, 486,
+       720, 576,
+       768, 480,
+       768, 576,
+       800, 240,
+       800, 352,
+       800, 480,
+       800, 600,
+       832, 624,
+       848, 480,
+       852, 480,
+       854, 480,
+       960, 540,
+       960, 544,
+       960, 640,
+       960, 720,
+       1024, 576,
+       1024, 600,
+       1024, 640,
+       1024, 768,
+       1024, 800,
+       1024, 1024,
+       1120, 832,
+       1136, 640,
+       1152, 720,
+       1152, 768,
+       1152, 864,
+       1152, 900,
+       1280, 720,
+       1280, 768,
+       1280, 800,
+       1280, 854,
+       1280, 960,
+       1280, 1024,
+       1280, 1080,
+       1334, 750,
+       1366, 768,
+       1400, 1050,
+       1408, 1152,
+       1440, 900,
+       1440, 960,
+       1440, 1024,
+       1440, 1080,
+       1600, 768,
+       1600, 900,
+       1600, 1024,
+       1600, 1200,
+       1600, 1280,
+       1680, 1050,
+       1776, 1000,
+       1792, 1344,
+       1800, 1440,
+       1828, 1332,
+       1856, 1392,
+       1920, 1080,
+       1920, 1200,
+       1920, 1280,
+       1920, 1400,
+       1920, 1440,
+       1998, 1080,
+       2048, 858,
+       2048, 1152,
+       2048, 1280,
+       2048, 1536,
+       2048, 1556,
+       2160, 1440,
+       2304, 1440,
+       2304, 1728,
+       2538, 1080,
+       2560, 1080,
+       2560, 1440,
+       2560, 1600,
+       2560, 1700,
+       2560, 1800,
+       2560, 1920,
+       2560, 2048,
+       2732, 2048,
+       2736, 1824,
+       2800, 2100,
+       2880, 1800,
+       2880, 900,
+       3000, 2000,
+       3200, 1800,
+       3200, 2048,
+       3200, 2400,
+       3440, 1440,
+       3656, 2664,
+       3840, 2160,
+       3840, 2400,
+       3996, 2160,
+       4096, 1714,
+       4096, 2160,
+       4096, 2304,
+       4096, 3072,
+       4096, 3112,
+       5120, 2160,
+       5120, 2880,
+       5120, 3200,
+       5120, 4096,
+       5616, 4096,
+       6144, 3160,
+       6400, 4096,
+       6400, 4800,
+       7680, 4320,
+       7680, 4800,
+       8192, 4608,
+       8192, 8192,
+       28000, 9334,
+};
diff --git a/src/gallium/drivers/radeon/r600_texture.c 
b/src/gallium/drivers/radeon/r600_texture.c
index 920cc21..ac9bc7f 100644
--- a/src/gallium/drivers/radeon/r600_texture.c
+++ b/src/gallium/drivers/radeon/r600_texture.c
@@ -202,6 +202,31 @@ static unsigned r600_texture_get_offset(struct 
r600_texture *rtex, unsigned leve
               box->x / util_format_get_blockwidth(format) * 
util_format_get_blocksize(format);
 }
 
+static bool r600_is_really_scanout(const struct radeon_surf *surf)
+{
+#include "display_resolutions.h"
+
+       unsigned w = surf->npix_x;
+       unsigned h = surf->npix_y;
+       unsigned i;
+
+       if (surf->nsamples > 1 ||
+           surf->array_size > 1 ||
+           surf->last_level > 0 ||
+           surf->flags & RADEON_SURF_Z_OR_SBUFFER)
+               return false;
+
+       /* Set the scanout flag for possible display resolutions only. */
+       for (i = 0; i < ARRAY_SIZE(resolutions); i += 2) {
+               /* Check both normal and rotated dimensions. */
+               if ((w == resolutions[i] && h == resolutions[i+1]) ||
+                   (h == resolutions[i] && w == resolutions[i+1]))
+                       return true;
+       }
+
+       return false;
+}
+
 static int r600_init_surface(struct r600_common_screen *rscreen,
                             struct radeon_surf *surface,
                             const struct pipe_resource *ptex,
@@ -266,9 +291,6 @@ static int r600_init_surface(struct r600_common_screen 
*rscreen,
        default:
                return -EINVAL;
        }
-       if (ptex->bind & PIPE_BIND_SCANOUT) {
-               surface->flags |= RADEON_SURF_SCANOUT;
-       }
 
        if (!is_flushed_depth && is_depth) {
                surface->flags |= RADEON_SURF_ZBUFFER;
@@ -281,6 +303,11 @@ static int r600_init_surface(struct r600_common_screen 
*rscreen,
        if (rscreen->chip_class >= SI) {
                surface->flags |= RADEON_SURF_HAS_TILE_MODE_INDEX;
        }
+
+       if (ptex->bind & PIPE_BIND_SCANOUT &&
+           r600_is_really_scanout(surface)) {
+               surface->flags |= RADEON_SURF_SCANOUT;
+       }
        return 0;
 }
 
-- 
2.7.4

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to