[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