Add support for UnifiedAux+Depth+HiZ w/o CCS
diff --git a/Source/GmmLib/Resource/GmmResourceInfoCommonEx.cpp b/Source/GmmLib/Resource/GmmResourceInfoCommonEx.cpp index ebe7eb9..825318a 100644 --- a/Source/GmmLib/Resource/GmmResourceInfoCommonEx.cpp +++ b/Source/GmmLib/Resource/GmmResourceInfoCommonEx.cpp
@@ -318,7 +318,13 @@ AuxSurf.Type = (AuxSurf.Flags.Gpu.HiZ) ? AuxSurf.Type : RESOURCE_INVALID; AuxSurf.Flags.Info.RenderCompressed = AuxSurf.Flags.Info.MediaCompressed = 0; } - else if(Surf.Flags.Gpu.SeparateStencil && Surf.Flags.Gpu.CCS) //Stencil compression + else if(Surf.Flags.Gpu.Depth && Surf.Flags.Gpu.HiZ && !Surf.Flags.Gpu.CCS) // Depth + HiZ only, CCS is disabled + { + // main surface is depth, AuxSurf is HiZ + Surf.Flags.Gpu.HiZ = 0; //depth buffer, clear HiZ + AuxSurf.Flags.Gpu.IndirectClearColor = 0; //Clear fastClear from HiZ + } + else if(Surf.Flags.Gpu.SeparateStencil && Surf.Flags.Gpu.CCS) //Stencil compression { AuxSurf.Flags.Gpu.SeparateStencil = 0; Surf.Flags.Gpu.CCS = 0;
diff --git a/Source/GmmLib/ULT/GmmGen12ResourceULT.cpp b/Source/GmmLib/ULT/GmmGen12ResourceULT.cpp index 5276ff5..5d3fb16 100644 --- a/Source/GmmLib/ULT/GmmGen12ResourceULT.cpp +++ b/Source/GmmLib/ULT/GmmGen12ResourceULT.cpp
@@ -2202,6 +2202,184 @@ { } +TEST_F(CTestGen12Resource, TestDepthHiZNotCompressedResource) +{ + const uint32_t HAlign = 8; //HiZ alignment (16x4 ie general alignment), [Depth 16bit: 8x8; ow 8x4] + uint32_t VAlign = 4; + + const uint32_t AllocTileSize[1][2] = {128, 32}; //HiZ is TileY + + GMM_RESCREATE_PARAMS gmmParams = {}; + gmmParams.NoGfxMemory = 1; + gmmParams.Flags.Info.TiledY = 1; //Not supported for Depth buffer, but HiZ output is TileY + gmmParams.Flags.Gpu.Depth = 1; //GPU Flags= Depth + HiZ + gmmParams.Flags.Gpu.HiZ = 1; + gmmParams.Flags.Gpu.CCS = 0; + gmmParams.Flags.Info.RenderCompressed = 0; + gmmParams.Flags.Gpu.UnifiedAuxSurface = 1; + + for(uint32_t k = 0; k <= 1; k++) + { + gmmParams.Flags.Gpu.IndirectClearColor = k; + + // Allocate 1x1 surface so that it occupies 1 Tile in X dimension + for(uint32_t j = TEST_BPP_8; j <= TEST_BPP_128; j++) //Depth bpp doesn't matter, Depth px dimensions decide HiZ size in HW + { + { + VAlign = (j == TEST_BPP_16) ? 8 : 4; + } + gmmParams.Format = SetResourceFormat(static_cast<TEST_BPP>(j)); //Only 16,24,32 supported; But driver creates the resource even for other bpps without failing + for(uint32_t i = RESOURCE_2D; i <= RESOURCE_CUBE; i++) //3D doesn't support HiZ + { + gmmParams.Type = static_cast<GMM_RESOURCE_TYPE>(i); + gmmParams.BaseWidth64 = 0x1; + gmmParams.BaseHeight = 0x1; //0x24; //not 1 tile + //gmmParams.MaxLod = 6; --add expectedheight calc- mip0+max{mip1, sum{mip2,...n}} + gmmParams.Depth = 0x1; + + if(i == RESOURCE_1D || i == RESOURCE_3D) // SKL+ 1D and 3D do not support HiZ + { + gmmParams.Flags.Gpu.HiZ = 0; + } + else + { + gmmParams.Flags.Gpu.HiZ = 1; + } + + GMM_RESOURCE_INFO *ResourceInfo = NULL; + ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams); + //EXPECT_NE(NULL, ResourceInfo); + + VerifyResourceHAlign<true>(ResourceInfo, HAlign); + VerifyResourceVAlign<true>(ResourceInfo, VAlign); + uint32_t ExpectedPitch = AllocTileSize[0][0]; + VerifyResourcePitch<true>(ResourceInfo, ExpectedPitch); + VerifyResourcePitchInTiles<true>(ResourceInfo, 1); // 1 tileY wide + uint32_t ExpectedHeight = GMM_ULT_ALIGN(gmmParams.BaseHeight, VAlign); + + if(gmmParams.ArraySize > 1 || gmmParams.Type == RESOURCE_CUBE) + { + uint32_t ExpectedQPitch = GMM_ULT_ALIGN(gmmParams.BaseHeight, VAlign); + ExpectedHeight *= (gmmParams.Type == RESOURCE_CUBE) ? 6 : 1; + + VerifyResourceQPitch<true>(ResourceInfo, ExpectedQPitch); // Each face should be VAlign rows apart within a tile, + } + + VerifyResourceSize<true>(ResourceInfo, + GFX_ALIGN(ExpectedPitch * ExpectedHeight, 1 * PAGE_SIZE)); //1 Tile should be enough + + if(gmmParams.Flags.Gpu.IndirectClearColor) + { + VerifyResourceAuxCCSize<true>(ResourceInfo, PAGE_SIZE); + } + else + { + VerifyResourceAuxCCSize<true>(ResourceInfo, 0); + } + + pGmmULTClientContext->DestroyResInfoObject(ResourceInfo); + } + + // Allocate 2 tiles in X dimension. (muti-tiles Tiles in Y dimension for cube/array) + for(uint32_t i = RESOURCE_2D; i <= RESOURCE_CUBE; i++) + { + gmmParams.Type = static_cast<GMM_RESOURCE_TYPE>(i); + gmmParams.BaseWidth64 = AllocTileSize[0][0] + 0x1; + gmmParams.BaseHeight = (gmmParams.Type == RESOURCE_1D) ? 0x1 : + (gmmParams.Type == RESOURCE_CUBE) ? gmmParams.BaseWidth64 : + VAlign / 2; + gmmParams.ArraySize = (gmmParams.Type != RESOURCE_3D) ? VAlign : 1; + gmmParams.Depth = 0x1; + + if(i == RESOURCE_1D || i == RESOURCE_3D) + { + gmmParams.Flags.Gpu.HiZ = 0; + } + else + { + gmmParams.Flags.Gpu.HiZ = 1; + } + + GMM_RESOURCE_INFO *ResourceInfo; + ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams); + + VerifyResourceHAlign<true>(ResourceInfo, HAlign); + VerifyResourceVAlign<true>(ResourceInfo, VAlign); + uint32_t ExpectedPitch = GFX_ALIGN(gmmParams.BaseWidth * (int)pow(2, j), AllocTileSize[0][0]); + VerifyResourcePitch<true>(ResourceInfo, ExpectedPitch); + VerifyResourcePitchInTiles<true>(ResourceInfo, ExpectedPitch / AllocTileSize[0][0]); + + uint32_t ExpectedQPitch = 0; + if(gmmParams.ArraySize > 1 || gmmParams.Type == RESOURCE_CUBE) + { + ExpectedQPitch = GMM_ULT_ALIGN(gmmParams.BaseHeight, VAlign); + VerifyResourceQPitch<true>(ResourceInfo, ExpectedQPitch); // Each face should be VAlign rows apart within a tile. + } + + VerifyResourceSize<true>(ResourceInfo, // PitchInBytes * Rows where Rows = (__GMM_MAX_CUBE_FACE x QPitch) /2 (Stencil height = halved due to interleaving), then aligned to tile boundary + ((gmmParams.Type == RESOURCE_CUBE) ? + ExpectedPitch * GMM_ULT_ALIGN(ExpectedQPitch * gmmParams.ArraySize * __GMM_MAX_CUBE_FACE, AllocTileSize[0][1]) : //cube + ((gmmParams.ArraySize > 1) ? + ExpectedPitch * GMM_ULT_ALIGN(ExpectedQPitch * gmmParams.ArraySize, AllocTileSize[0][1]) : //array + ExpectedPitch * GMM_ULT_ALIGN(gmmParams.BaseHeight, AllocTileSize[0][1])))); + + if(gmmParams.Flags.Gpu.IndirectClearColor) + { + VerifyResourceAuxCCSize<true>(ResourceInfo, PAGE_SIZE); + } + else + { + VerifyResourceAuxCCSize<true>(ResourceInfo, 0); + } + + pGmmULTClientContext->DestroyResInfoObject(ResourceInfo); + } + + // Allocate 2 tiles in X, 3 tiles in Y dimension (non-arrayed) Multi-tiles for 3D + for(uint32_t i = RESOURCE_2D; i <= RESOURCE_3D; i++) + { + gmmParams.Type = static_cast<GMM_RESOURCE_TYPE>(i); + gmmParams.BaseWidth64 = AllocTileSize[0][0] + 0x1; + gmmParams.BaseHeight = 2 * AllocTileSize[0][1] + 0x1; //Half-Depth Height or QPitch (lod!=0), aligned to 8 required by HW + gmmParams.Depth = (gmmParams.Type == RESOURCE_2D) ? 0x1 : + VAlign + 1; + gmmParams.ArraySize = 1; + + if(i == RESOURCE_1D || i == RESOURCE_3D) + { + gmmParams.Flags.Gpu.HiZ = 0; + } + else + { + gmmParams.Flags.Gpu.HiZ = 1; + } + + GMM_RESOURCE_INFO *ResourceInfo; + ResourceInfo = pGmmULTClientContext->CreateResInfoObject(&gmmParams); + + VerifyResourceHAlign<true>(ResourceInfo, HAlign); + VerifyResourceVAlign<true>(ResourceInfo, VAlign); + uint32_t ExpectedPitch = GFX_ALIGN(gmmParams.BaseWidth * (int)pow(2, j), AllocTileSize[0][0]); + VerifyResourcePitch<true>(ResourceInfo, ExpectedPitch); + VerifyResourcePitchInTiles<true>(ResourceInfo, ExpectedPitch / AllocTileSize[0][0]); // 2 tile wide + + uint32_t TwoDQPitch, ExpectedQPitch = 0; + if(gmmParams.Type == RESOURCE_3D) + { + TwoDQPitch = GMM_ULT_ALIGN(gmmParams.BaseHeight, VAlign); + ExpectedQPitch = GFX_ALIGN(TwoDQPitch, AllocTileSize[0][1]); //Depth slices arranged as 2D-arrayed slices. + VerifyResourceQPitch<true>(ResourceInfo, ExpectedQPitch); + } + else + { + //HiZ for 3D not supported. Driver still allocates like IVB/HSW. + VerifyResourceSize<true>(ResourceInfo, ExpectedPitch * GMM_ULT_ALIGN(gmmParams.BaseHeight, AllocTileSize[0][1])); + } + pGmmULTClientContext->DestroyResInfoObject(ResourceInfo); + } + } + } +} ///TODO Add MSAA/Depth Compressed Resource tests TEST_F(CTestGen12Resource, DISABLED_TestDepthCompressedResource) {
diff --git a/Source/GmmLib/ULT/GmmResourceULT.h b/Source/GmmLib/ULT/GmmResourceULT.h index 0f476dd..d07360f 100644 --- a/Source/GmmLib/ULT/GmmResourceULT.h +++ b/Source/GmmLib/ULT/GmmResourceULT.h
@@ -449,6 +449,21 @@ } ///////////////////////////////////////////////////////////////////////////////////// + /// Verifies if AuxCCSize matches the expected value. Fails test if value doesn't match + /// + /// @param[in] ResourceInfo: ResourceInfo returned by GmmLib + /// @param[in] ExpectedValue: expected value to check against + ///////////////////////////////////////////////////////////////////////////////////// + template <bool Verify> + void VerifyResourceAuxCCSize(GMM_RESOURCE_INFO *ResourceInfo, uint64_t ExpectedValue) + { + if(Verify) + { + EXPECT_EQ(ExpectedValue, ResourceInfo->GetSizeAuxSurface(GMM_AUX_CC)); + } + } + + ///////////////////////////////////////////////////////////////////////////////////// /// Verifies if QPitch matches the expected value. Fails test if value doesn't match /// /// @param[in] ResourceInfo: ResourceInfo returned by GmmLib