[Mesa-dev] [PATCH] r300g: enable MSAA on r300-r400, be careful about using color compression

Alex Deucher alexdeucher at gmail.com
Tue Aug 20 07:06:53 PDT 2013


On Sat, Aug 10, 2013 at 8:31 PM, Marek Olšák <maraeo at gmail.com> wrote:
> MSAA was tested by one user on RS690 and it works for him with color
> compression (CMASK) disabled. Our theory is that his chipset lacks CMASK RAM.
>
> Since we don't have hardware documentation about which chipsets actually have
> CMASK RAM, I had to take a guess based on the presence of HiZ.

Reviewed-by: Alex Deucher <alexander.deucher at amd.com>


> ---
>  src/gallium/drivers/r300/r300_chipset.c      | 8 ++++++++
>  src/gallium/drivers/r300/r300_chipset.h      | 2 ++
>  src/gallium/drivers/r300/r300_screen.c       | 5 -----
>  src/gallium/drivers/r300/r300_texture_desc.c | 4 ++++
>  4 files changed, 14 insertions(+), 5 deletions(-)
>
> diff --git a/src/gallium/drivers/r300/r300_chipset.c b/src/gallium/drivers/r300/r300_chipset.c
> index 30e085a..c1f5e3c 100644
> --- a/src/gallium/drivers/r300/r300_chipset.c
> +++ b/src/gallium/drivers/r300/r300_chipset.c
> @@ -84,6 +84,7 @@ void r300_parse_chipset(uint32_t pci_id, struct r300_capabilities* caps)
>      caps->num_vert_fpus = 0;
>      caps->hiz_ram = 0;
>      caps->zmask_ram = 0;
> +    caps->has_cmask = FALSE;
>
>
>      switch (caps->family) {
> @@ -91,6 +92,7 @@ void r300_parse_chipset(uint32_t pci_id, struct r300_capabilities* caps)
>      case CHIP_R350:
>          caps->high_second_pipe = TRUE;
>          caps->num_vert_fpus = 4;
> +        caps->has_cmask = TRUE; /* guessed because there is also HiZ */
>          caps->hiz_ram = R300_HIZ_LIMIT;
>          caps->zmask_ram = PIPE_ZMASK_SIZE;
>          break;
> @@ -105,6 +107,7 @@ void r300_parse_chipset(uint32_t pci_id, struct r300_capabilities* caps)
>      case CHIP_RV380:
>          caps->high_second_pipe = TRUE;
>          caps->num_vert_fpus = 2;
> +        caps->has_cmask = TRUE; /* guessed because there is also HiZ */
>          caps->hiz_ram = R300_HIZ_LIMIT;
>          caps->zmask_ram = RV3xx_ZMASK_SIZE;
>          break;
> @@ -127,24 +130,28 @@ void r300_parse_chipset(uint32_t pci_id, struct r300_capabilities* caps)
>      case CHIP_R481:
>      case CHIP_RV410:
>          caps->num_vert_fpus = 6;
> +        caps->has_cmask = TRUE; /* guessed because there is also HiZ */
>          caps->hiz_ram = R300_HIZ_LIMIT;
>          caps->zmask_ram = PIPE_ZMASK_SIZE;
>          break;
>
>      case CHIP_R520:
>          caps->num_vert_fpus = 8;
> +        caps->has_cmask = TRUE;
>          caps->hiz_ram = R300_HIZ_LIMIT;
>          caps->zmask_ram = PIPE_ZMASK_SIZE;
>          break;
>
>      case CHIP_RV515:
>          caps->num_vert_fpus = 2;
> +        caps->has_cmask = TRUE;
>          caps->hiz_ram = R300_HIZ_LIMIT;
>          caps->zmask_ram = PIPE_ZMASK_SIZE;
>          break;
>
>      case CHIP_RV530:
>          caps->num_vert_fpus = 5;
> +        caps->has_cmask = TRUE;
>          caps->hiz_ram = RV530_HIZ_LIMIT;
>          caps->zmask_ram = PIPE_ZMASK_SIZE;
>          break;
> @@ -153,6 +160,7 @@ void r300_parse_chipset(uint32_t pci_id, struct r300_capabilities* caps)
>      case CHIP_RV560:
>      case CHIP_RV570:
>          caps->num_vert_fpus = 8;
> +        caps->has_cmask = TRUE;
>          caps->hiz_ram = RV530_HIZ_LIMIT;
>          caps->zmask_ram = PIPE_ZMASK_SIZE;
>          break;
> diff --git a/src/gallium/drivers/r300/r300_chipset.h b/src/gallium/drivers/r300/r300_chipset.h
> index f8b5d4e..8e9deb6 100644
> --- a/src/gallium/drivers/r300/r300_chipset.h
> +++ b/src/gallium/drivers/r300/r300_chipset.h
> @@ -55,6 +55,8 @@ struct r300_capabilities {
>      int hiz_ram;
>      /* Some chipsets have zmask ram per pipe some don't. */
>      int zmask_ram;
> +    /* CMASK is for MSAA colorbuffer compression and fast clear. */
> +    boolean has_cmask;
>      /* Compression mode for ZMASK. */
>      enum r300_zmask_compression z_compress;
>      /* Whether or not this is RV350 or newer, including all r400 and r500
> diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c
> index 7ead292..057008c 100644
> --- a/src/gallium/drivers/r300/r300_screen.c
> +++ b/src/gallium/drivers/r300/r300_screen.c
> @@ -441,11 +441,6 @@ static boolean r300_is_format_supported(struct pipe_screen* screen,
>              if (!drm_2_8_0) {
>                  return FALSE;
>              }
> -            /* Only support R500, because I didn't test older chipsets,
> -             * but MSAA should work there too. */
> -            if (!is_r500 && !debug_get_bool_option("RADEON_MSAA", FALSE)) {
> -                return FALSE;
> -            }
>              /* No texturing and scanout. */
>              if (usage & (PIPE_BIND_SAMPLER_VIEW |
>                           PIPE_BIND_DISPLAY_TARGET |
> diff --git a/src/gallium/drivers/r300/r300_texture_desc.c b/src/gallium/drivers/r300/r300_texture_desc.c
> index 8d96b56..8fa98c5 100644
> --- a/src/gallium/drivers/r300/r300_texture_desc.c
> +++ b/src/gallium/drivers/r300/r300_texture_desc.c
> @@ -417,6 +417,10 @@ static void r300_setup_cmask_properties(struct r300_screen *screen,
>      static unsigned cmask_align_y[4] = {16, 16, 16, 32};
>      unsigned pipes, stride, cmask_num_dw, cmask_max_size;
>
> +    if (!screen->caps.has_cmask) {
> +        return;
> +    }
> +
>      /* We need an AA colorbuffer, no mipmaps. */
>      if (tex->b.b.nr_samples <= 1 ||
>          tex->b.b.last_level > 0 ||
> --
> 1.8.1.2
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list