[Mesa-dev] [PATCH 4/4] radeonsi: force non-displayable tiling based on surface dimensions

Gustaw Smolarczyk wielkiegie at gmail.com
Fri Jun 3 15:18:41 UTC 2016


2016-06-03 12:52 GMT+02:00 Marek Olšák <maraeo at gmail.com>:
> From: Marek Olšák <marek.olsak at 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 at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list