2016-06-03 12:52 GMT+02:00 Marek Olšák <mar...@gmail.com>: > 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[] = { How about adding const here?
Regards, Gustaw > + 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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev