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