winsys/amdgpu: set flags correctly when allocating depth-stencil buffers
authorMarek Olšák <marek.olsak@amd.com>
Thu, 19 May 2016 18:10:10 +0000 (20:10 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Wed, 1 Jun 2016 15:35:30 +0000 (17:35 +0200)
This mimics Vulkan. It also documents how to fix stencil texturing.

Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
src/gallium/winsys/amdgpu/drm/amdgpu_surface.c

index 9da4faf0b8ef6da67b21463e66168a8e140b7b4d..d68c68844b01c91f1119dafc2bafd5f7ed6ca753 100644 (file)
@@ -337,7 +337,6 @@ static int amdgpu_surface_init(struct radeon_winsys *rws,
 
    AddrSurfInfoIn.flags.color = !(surf->flags & RADEON_SURF_Z_OR_SBUFFER);
    AddrSurfInfoIn.flags.depth = (surf->flags & RADEON_SURF_ZBUFFER) != 0;
-   AddrSurfInfoIn.flags.stencil = (surf->flags & RADEON_SURF_SBUFFER) != 0;
    AddrSurfInfoIn.flags.cube = type == RADEON_SURF_TYPE_CUBEMAP;
    AddrSurfInfoIn.flags.display = (surf->flags & RADEON_SURF_SCANOUT) != 0;
    AddrSurfInfoIn.flags.pow2Pad = surf->last_level > 0;
@@ -346,7 +345,12 @@ static int amdgpu_surface_init(struct radeon_winsys *rws,
                                         !(surf->flags & RADEON_SURF_SCANOUT) &&
                                         !compressed && AddrDccIn.numSamples <= 1;
 
-   /* This disables incorrect calculations (hacks) in addrlib. */
+   AddrSurfInfoIn.flags.noStencil = (surf->flags & RADEON_SURF_SBUFFER) == 0;
+   AddrSurfInfoIn.flags.compressZ = AddrSurfInfoIn.flags.depth;
+
+   /* TODO: update addrlib to a newer version, remove this, and
+    * set flags.matchStencilTileCfg = 1 to fix stencil texturing.
+    */
    AddrSurfInfoIn.flags.noStencil = 1;
 
    /* Set preferred macrotile parameters. This is usually required
@@ -413,6 +417,8 @@ static int amdgpu_surface_init(struct radeon_winsys *rws,
    /* Calculate texture layout information for stencil. */
    if (surf->flags & RADEON_SURF_SBUFFER) {
       AddrSurfInfoIn.bpp = 8;
+      AddrSurfInfoIn.flags.depth = 0;
+      AddrSurfInfoIn.flags.stencil = 1;
       /* This will be ignored if AddrSurfInfoIn.pTileInfo is NULL. */
       AddrTileInfoIn.tileSplitBytes = surf->stencil_tile_split;