radeonsi/gfx9: fix and enable single-sample CMASK fast clear
authorMarek Olšák <marek.olsak@amd.com>
Tue, 28 Mar 2017 01:34:06 +0000 (03:34 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Fri, 31 Mar 2017 19:41:57 +0000 (21:41 +0200)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeon/r600_texture.c
src/gallium/winsys/amdgpu/drm/amdgpu_surface.c

index 77e9becda6acf64d34d7fd4be4403eea98ae892e..d811a77ca869c36151014c6880354a9d11f03ada 100644 (file)
@@ -2639,10 +2639,6 @@ void evergreen_do_fast_color_clear(struct r600_common_context *rctx,
        if (rctx->render_cond)
                return;
 
-       /* TODO: fix CMASK and DCC fast clear */
-       if (rctx->chip_class >= GFX9)
-               return;
-
        for (i = 0; i < fb->nr_cbufs; i++) {
                struct r600_texture *tex;
                unsigned clear_bit = PIPE_CLEAR_COLOR0 << i;
@@ -2710,6 +2706,10 @@ void evergreen_do_fast_color_clear(struct r600_common_context *rctx,
                        uint32_t reset_value;
                        bool clear_words_needed;
 
+                       /* TODO: fix DCC clear */
+                       if (rctx->chip_class >= GFX9)
+                               continue;
+
                        if (rctx->screen->debug_flags & DBG_NO_DCC_CLEAR)
                                continue;
 
index 1e63d6467104e45148776d9a971b690b02f210ea..4d532e397d09bf9d574d09b64e75082c19b544ef 100644 (file)
@@ -655,6 +655,13 @@ static int gfx9_compute_miptree(struct amdgpu_winsys *ws,
    surf->u.gfx9.surf.swizzle_mode = in->swizzleMode;
    surf->u.gfx9.surf.epitch = out.epitchIsHeight ? out.mipChainHeight - 1 :
                                                    out.mipChainPitch - 1;
+
+   /* CMASK fast clear uses these even if FMASK isn't allocated.
+    * FMASK only supports the Z swizzle modes, whose numbers are multiples of 4.
+    */
+   surf->u.gfx9.fmask.swizzle_mode = surf->u.gfx9.surf.swizzle_mode & ~0x3;
+   surf->u.gfx9.fmask.epitch = surf->u.gfx9.surf.epitch;
+
    surf->u.gfx9.surf_slice_size = out.sliceSize;
    surf->u.gfx9.surf_pitch = out.pitch;
    surf->u.gfx9.surf_height = out.height;