diff --git a/runtime/mem_obj/image.h b/runtime/mem_obj/image.h index 41f44351ef..67659deb81 100644 --- a/runtime/mem_obj/image.h +++ b/runtime/mem_obj/image.h @@ -230,7 +230,8 @@ class Image : public MemObj { template class ImageHw : public Image { - typedef typename GfxFamily::RENDER_SURFACE_STATE RENDER_SURFACE_STATE; + using RENDER_SURFACE_STATE = typename GfxFamily::RENDER_SURFACE_STATE; + using AUXILIARY_SURFACE_MODE = typename RENDER_SURFACE_STATE::AUXILIARY_SURFACE_MODE; public: ImageHw(Context *context, @@ -258,7 +259,8 @@ class ImageHw : public Image { } void setImageArg(void *memory, bool setAsMediaBlockImage) override; - void setAuxSurfaceStateParams(RENDER_SURFACE_STATE *surfaceState); + void setAuxParamsForMultisamples(RENDER_SURFACE_STATE *surfaceState); + void setAuxParamsForCCS(RENDER_SURFACE_STATE *surfaceState, Gmm *gmm); void setMediaImageArg(void *memory) override; void setMediaSurfaceRotation(void *memory) override; void setSurfaceMemoryObjectControlStateIndexToMocsTable(void *memory, uint32_t value) override; diff --git a/runtime/mem_obj/image.inl b/runtime/mem_obj/image.inl index 36e3e74fb3..7218e13c23 100644 --- a/runtime/mem_obj/image.inl +++ b/runtime/mem_obj/image.inl @@ -40,9 +40,9 @@ union SURFACE_STATE_BUFFER_LENGTH { template void ImageHw::setImageArg(void *memory, bool setAsMediaBlockImage) { - using AUXILIARY_SURFACE_MODE = typename RENDER_SURFACE_STATE::AUXILIARY_SURFACE_MODE; using SURFACE_FORMAT = typename RENDER_SURFACE_STATE::SURFACE_FORMAT; auto surfaceState = reinterpret_cast(memory); + auto gmm = getGraphicsAllocation()->gmm; auto imageCount = std::max(getImageDesc().image_depth, getImageDesc().image_array_size); if (imageCount == 0) { @@ -60,11 +60,9 @@ void ImageHw::setImageArg(void *memory, bool setAsMediaBlockImage) { auto hAlign = RENDER_SURFACE_STATE::SURFACE_HORIZONTAL_ALIGNMENT_HALIGN_4; auto vAlign = RENDER_SURFACE_STATE::SURFACE_VERTICAL_ALIGNMENT_VALIGN_4; - if (getGraphicsAllocation()->gmm) { - hAlign = static_cast( - getGraphicsAllocation()->gmm->getRenderHAlignment()); - vAlign = static_cast( - getGraphicsAllocation()->gmm->getRenderVAlignment()); + if (gmm) { + hAlign = static_cast(gmm->getRenderHAlignment()); + vAlign = static_cast(gmm->getRenderVAlignment()); } if (cubeFaceIndex != __GMM_NO_CUBE_MAP) { @@ -148,7 +146,7 @@ void ImageHw::setImageArg(void *memory, bool setAsMediaBlockImage) { tileMode = RENDER_SURFACE_STATE::TILE_MODE_YMAJOR; } } else { - auto tileWalk = getGraphicsAllocation()->gmm->gmmResourceInfo->getTileType(); + auto tileWalk = gmm->gmmResourceInfo->getTileType(); tileMode = static_cast(Gmm::getRenderTileMode(tileWalk)); } surfaceState->setTileMode(tileMode); @@ -169,32 +167,41 @@ void ImageHw::setImageArg(void *memory, bool setAsMediaBlockImage) { surfaceState->setNumberOfMultisamples((typename RENDER_SURFACE_STATE::NUMBER_OF_MULTISAMPLES)mcsSurfaceInfo.multisampleCount); surfaceState->setMultisampledSurfaceStorageFormat(RENDER_SURFACE_STATE::MULTISAMPLED_SURFACE_STORAGE_FORMAT::MULTISAMPLED_SURFACE_STORAGE_FORMAT_MSS); - setAuxSurfaceStateParams(surfaceState); + if (imageDesc.num_samples > 1) { + setAuxParamsForMultisamples(surfaceState); + } else if (gmm && gmm->isRenderCompressed) { + setAuxParamsForCCS(surfaceState, gmm); + } } template -void ImageHw::setAuxSurfaceStateParams(RENDER_SURFACE_STATE *surfaceState) { - using AUXILIARY_SURFACE_MODE = typename RENDER_SURFACE_STATE::AUXILIARY_SURFACE_MODE; - auto gmm = getGraphicsAllocation()->gmm; +void ImageHw::setAuxParamsForMultisamples(RENDER_SURFACE_STATE *surfaceState) { + if (getMcsAllocation()) { + auto mcsGmm = getMcsAllocation()->gmm; + auto gmmFlags = mcsGmm->gmmResourceInfo->getResourceFlags(); - if (imageDesc.num_samples > 1) { - if (getMcsAllocation()) { + if (gmmFlags->Gpu.CCS) { // Ignore MCS allocation when Color Control Surface is available + setAuxParamsForCCS(surfaceState, mcsGmm); + } else { surfaceState->setAuxiliarySurfaceMode((typename RENDER_SURFACE_STATE::AUXILIARY_SURFACE_MODE)1); surfaceState->setAuxiliarySurfacePitch(mcsSurfaceInfo.pitch); surfaceState->setAuxiliarySurfaceQpitch(mcsSurfaceInfo.qPitch); surfaceState->setAuxiliarySurfaceBaseAddress(mcsAllocation->getGpuAddress()); - } else if (isDepthFormat(imageFormat)) { - surfaceState->setMultisampledSurfaceStorageFormat(RENDER_SURFACE_STATE::MULTISAMPLED_SURFACE_STORAGE_FORMAT::MULTISAMPLED_SURFACE_STORAGE_FORMAT_DEPTH_STENCIL); } - } else if (gmm && gmm->isRenderCompressed) { - surfaceState->setAuxiliarySurfaceMode((typename RENDER_SURFACE_STATE::AUXILIARY_SURFACE_MODE)5); - surfaceState->setAuxiliarySurfacePitch(std::max(gmm->gmmResourceInfo->getRenderAuxPitchTiles(), 1u)); - surfaceState->setAuxiliarySurfaceQpitch(gmm->gmmResourceInfo->getAuxQPitch()); - surfaceState->setAuxiliarySurfaceBaseAddress(surfaceState->getSurfaceBaseAddress() + - gmm->gmmResourceInfo->getUnifiedAuxSurfaceOffset(GMM_UNIFIED_AUX_TYPE::GMM_AUX_CCS)); + } else if (isDepthFormat(imageFormat)) { + surfaceState->setMultisampledSurfaceStorageFormat(RENDER_SURFACE_STATE::MULTISAMPLED_SURFACE_STORAGE_FORMAT::MULTISAMPLED_SURFACE_STORAGE_FORMAT_DEPTH_STENCIL); } } +template +void ImageHw::setAuxParamsForCCS(RENDER_SURFACE_STATE *surfaceState, Gmm *gmm) { + surfaceState->setAuxiliarySurfaceMode((AUXILIARY_SURFACE_MODE)5); + surfaceState->setAuxiliarySurfacePitch(std::max(gmm->gmmResourceInfo->getRenderAuxPitchTiles(), 1u)); + surfaceState->setAuxiliarySurfaceQpitch(gmm->gmmResourceInfo->getAuxQPitch()); + surfaceState->setAuxiliarySurfaceBaseAddress(surfaceState->getSurfaceBaseAddress() + + gmm->gmmResourceInfo->getUnifiedAuxSurfaceOffset(GMM_UNIFIED_AUX_TYPE::GMM_AUX_CCS)); +} + template void ImageHw::setMediaImageArg(void *memory) { using MEDIA_SURFACE_STATE = typename GfxFamily::MEDIA_SURFACE_STATE; diff --git a/unit_tests/mem_obj/image_set_arg_tests.cpp b/unit_tests/mem_obj/image_set_arg_tests.cpp index ac5da35e7c..067bd0b1be 100644 --- a/unit_tests/mem_obj/image_set_arg_tests.cpp +++ b/unit_tests/mem_obj/image_set_arg_tests.cpp @@ -405,10 +405,11 @@ HWTEST_F(ImageSetArgTest, clSetKernelArgImage1Darray) { delete image1Darray; } -HWTEST_F(ImageSetArgTest, givenMcsAllocationWhenSetArgIsCalledThenProgramAuxFields) { +HWTEST_F(ImageSetArgTest, givenMcsAllocationWithoutCcsWhenSetArgIsCalledThenProgramAuxFieldsForMultisamples) { typedef typename FamilyType::RENDER_SURFACE_STATE RENDER_SURFACE_STATE; McsSurfaceInfo msi = {10, 20, 3}; auto mcsAlloc = context->getMemoryManager()->allocateGraphicsMemory(4096); + mcsAlloc->gmm = Gmm::create(nullptr, 1, false); cl_image_desc imgDesc = Image2dDefaults::imageDesc; imgDesc.num_samples = 8; @@ -417,6 +418,9 @@ HWTEST_F(ImageSetArgTest, givenMcsAllocationWhenSetArgIsCalledThenProgramAuxFiel image->setMcsAllocation(mcsAlloc); cl_mem memObj = image; + auto mockMcsGmmResInfo = reinterpret_cast *>(mcsAlloc->gmm->gmmResourceInfo.get()); + EXPECT_EQ(0u, mockMcsGmmResInfo->getResourceFlags()->Gpu.CCS); + retVal = clSetKernelArg( pKernel, 0, @@ -478,6 +482,7 @@ HWTEST_F(ImageSetArgTest, givenMcsAllocationAndRenderCompressionWhenSetArgOnMult typedef typename FamilyType::RENDER_SURFACE_STATE RENDER_SURFACE_STATE; McsSurfaceInfo msi = {10, 20, 3}; auto mcsAlloc = context->getMemoryManager()->allocateGraphicsMemory(4096); + mcsAlloc->gmm = Gmm::create(nullptr, 1, false); cl_image_desc imgDesc = Image2dDefaults::imageDesc; imgDesc.num_samples = 8; @@ -530,6 +535,42 @@ HWTEST_F(ImageSetArgTest, givenDepthFormatAndRenderCompressionWhenSetArgOnMultis EXPECT_EQ(0u, surfaceState->getAuxiliarySurfaceBaseAddress()); } +HWTEST_F(ImageSetArgTest, givenMcsAllocationWithCcsWhenSetArgIsCalledThenProgramAuxFieldsForCcs) { + typedef typename FamilyType::RENDER_SURFACE_STATE RENDER_SURFACE_STATE; + McsSurfaceInfo msi = {10, 20, 3}; + auto mcsAlloc = context->getMemoryManager()->allocateGraphicsMemory(4096); + mcsAlloc->gmm = Gmm::create(nullptr, 1, false); + cl_image_desc imgDesc = Image2dDefaults::imageDesc; + imgDesc.num_samples = 8; + + auto image = std::unique_ptr(Image2dHelper<>::create(context, &imgDesc)); + image->setMcsSurfaceInfo(msi); + image->setMcsAllocation(mcsAlloc); + cl_mem memObj = image.get(); + + uint32_t expectedRenderAuxPitchTiles = 30; + uint32_t expectedAuxQPitch = 60; + uint64_t expectedAuxSurfaceOffset = 0x10000; + + auto mockMcsGmmResInfo = reinterpret_cast *>(mcsAlloc->gmm->gmmResourceInfo.get()); + mockMcsGmmResInfo->mockResourceCreateParams.Flags.Gpu.CCS = 1; + EXPECT_EQ(1u, mockMcsGmmResInfo->getResourceFlags()->Gpu.CCS); + EXPECT_CALL(*mockMcsGmmResInfo, getRenderAuxPitchTiles()).Times(1).WillOnce(Return(expectedRenderAuxPitchTiles)); + EXPECT_CALL(*mockMcsGmmResInfo, getAuxQPitch()).Times(1).WillOnce(Return(expectedAuxQPitch)); + EXPECT_CALL(*mockMcsGmmResInfo, getUnifiedAuxSurfaceOffset(GMM_UNIFIED_AUX_TYPE::GMM_AUX_CCS)).Times(1).WillOnce(Return(expectedAuxSurfaceOffset)); + + retVal = clSetKernelArg(pKernel, 0, sizeof(memObj), &memObj); + ASSERT_EQ(CL_SUCCESS, retVal); + + auto surfaceState = reinterpret_cast(ptrOffset(pKernel->getSurfaceStateHeap(), + pKernelInfo->kernelArgInfo[0].offsetHeap)); + + EXPECT_TRUE(surfaceState->getAuxiliarySurfaceMode() == (typename RENDER_SURFACE_STATE::AUXILIARY_SURFACE_MODE)5); + EXPECT_EQ(expectedRenderAuxPitchTiles, surfaceState->getAuxiliarySurfacePitch()); + EXPECT_EQ(expectedAuxQPitch, surfaceState->getAuxiliarySurfaceQpitch()); + EXPECT_EQ(surfaceState->getSurfaceBaseAddress() + expectedAuxSurfaceOffset, surfaceState->getAuxiliarySurfaceBaseAddress()); +} + HWTEST_F(ImageSetArgTest, clSetKernelArgImage1Dbuffer) { typedef typename FamilyType::RENDER_SURFACE_STATE RENDER_SURFACE_STATE;