[PATCH 1/2] radeon: force 2D tiling for MSAA surfaces

Jerome Glisse j.glisse at gmail.com
Thu Aug 9 08:00:04 PDT 2012


On Thu, Aug 9, 2012 at 10:37 AM, Marek Olšák <maraeo at gmail.com> wrote:

Reviewed-by: Jerome Glisse <jglisse at redhat.com>

> ---
>  radeon/radeon_surface.c |   24 ++++++++++++++++++++++--
>  1 file changed, 22 insertions(+), 2 deletions(-)
>
> diff --git a/radeon/radeon_surface.c b/radeon/radeon_surface.c
> index 874a092..499e994 100644
> --- a/radeon/radeon_surface.c
> +++ b/radeon/radeon_surface.c
> @@ -154,7 +154,7 @@ static void surf_minify(struct radeon_surface *surf,
>      surf->level[level].nblk_x = (surf->level[level].npix_x + surf->blk_w - 1) / surf->blk_w;
>      surf->level[level].nblk_y = (surf->level[level].npix_y + surf->blk_h - 1) / surf->blk_h;
>      surf->level[level].nblk_z = (surf->level[level].npix_z + surf->blk_d - 1) / surf->blk_d;
> -    if (surf->level[level].mode == RADEON_SURF_MODE_2D) {
> +    if (surf->nsamples == 1 && surf->level[level].mode == RADEON_SURF_MODE_2D) {
>          if (surf->level[level].nblk_x < xalign || surf->level[level].nblk_y < yalign) {
>              surf->level[level].mode = RADEON_SURF_MODE_1D;
>              return;
> @@ -382,6 +382,12 @@ static int r6_surface_init(struct radeon_surface_manager *surf_man,
>      unsigned mode;
>      int r;
>
> +    /* MSAA surfaces support the 2D mode only. */
> +    if (surf->nsamples > 1) {
> +        surf->flags = RADEON_SURF_CLR(surf->flags, MODE);
> +        surf->flags |= RADEON_SURF_SET(RADEON_SURF_MODE_2D, MODE);
> +    }
> +
>      /* tiling mode */
>      mode = (surf->flags >> RADEON_SURF_MODE_SHIFT) & RADEON_SURF_MODE_MASK;
>
> @@ -401,6 +407,10 @@ static int r6_surface_init(struct radeon_surface_manager *surf_man,
>
>      /* force 1d on kernel that can't do 2d */
>      if (!surf_man->hw_info.allow_2d && mode > RADEON_SURF_MODE_1D) {
> +        if (surf->nsamples > 1) {
> +            fprintf(stderr, "radeon: Cannot use 2D tiling for an MSAA surface (%i).\n", __LINE__);
> +            return -EFAULT;
> +        }
>          mode = RADEON_SURF_MODE_1D;
>          surf->flags = RADEON_SURF_CLR(surf->flags, MODE);
>          surf->flags |= RADEON_SURF_SET(mode, MODE);
> @@ -548,7 +558,7 @@ static void eg_surf_minify(struct radeon_surface *surf,
>      surf->level[level].nblk_x = (surf->level[level].npix_x + surf->blk_w - 1) / surf->blk_w;
>      surf->level[level].nblk_y = (surf->level[level].npix_y + surf->blk_h - 1) / surf->blk_h;
>      surf->level[level].nblk_z = (surf->level[level].npix_z + surf->blk_d - 1) / surf->blk_d;
> -    if (surf->level[level].mode == RADEON_SURF_MODE_2D) {
> +    if (surf->nsamples == 1 && surf->level[level].mode == RADEON_SURF_MODE_2D) {
>          if (surf->level[level].nblk_x < mtilew || surf->level[level].nblk_y < mtileh) {
>              surf->level[level].mode = RADEON_SURF_MODE_1D;
>              return;
> @@ -687,6 +697,10 @@ static int eg_surface_sanity(struct radeon_surface_manager *surf_man,
>
>      /* force 1d on kernel that can't do 2d */
>      if (!surf_man->hw_info.allow_2d && mode > RADEON_SURF_MODE_1D) {
> +        if (surf->nsamples > 1) {
> +            fprintf(stderr, "radeon: Cannot use 2D tiling for an MSAA surface (%i).\n", __LINE__);
> +            return -EFAULT;
> +        }
>          mode = RADEON_SURF_MODE_1D;
>          surf->flags = RADEON_SURF_CLR(surf->flags, MODE);
>          surf->flags |= RADEON_SURF_SET(mode, MODE);
> @@ -754,6 +768,12 @@ static int eg_surface_init(struct radeon_surface_manager *surf_man,
>      unsigned mode;
>      int r;
>
> +    /* MSAA surfaces support the 2D mode only. */
> +    if (surf->nsamples > 1) {
> +        surf->flags = RADEON_SURF_CLR(surf->flags, MODE);
> +        surf->flags |= RADEON_SURF_SET(RADEON_SURF_MODE_2D, MODE);
> +    }
> +
>      /* tiling mode */
>      mode = (surf->flags >> RADEON_SURF_MODE_SHIFT) & RADEON_SURF_MODE_MASK;
>
> --
> 1.7.9.5
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel


More information about the dri-devel mailing list