From ed04190d778034a141a0de1c8d63f5415afca18a Mon Sep 17 00:00:00 2001 From: Aravind Gopalakrishnan Date: Tue, 8 Jul 2025 16:03:20 +0000 Subject: [PATCH] fix: Set compression parameter when resource imported Related-To: NEO-12375 Signed-off-by: Aravind Gopalakrishnan --- shared/source/gmm_helper/gmm.cpp | 5 +++ shared/source/helpers/gfx_core_helper.h | 2 ++ .../source/helpers/gfx_core_helper_base.inl | 11 ++++++ .../helpers/gfx_core_helper_xe2_and_later.inl | 11 ++++++ .../compression_tests_xe2_and_later.cpp | 12 +++++++ .../unit_test/gmm_helper/gmm_helper_tests.cpp | 36 +++++++++++++++++++ .../helpers/gfx_core_helper_tests.cpp | 27 ++++++++++++++ 7 files changed, 104 insertions(+) diff --git a/shared/source/gmm_helper/gmm.cpp b/shared/source/gmm_helper/gmm.cpp index 282f29b44a..041d7495b3 100644 --- a/shared/source/gmm_helper/gmm.cpp +++ b/shared/source/gmm_helper/gmm.cpp @@ -77,7 +77,12 @@ Gmm::Gmm(GmmHelper *gmmHelper, const void *alignedPtr, size_t alignedSize, size_ Gmm::Gmm(GmmHelper *gmmHelper, GMM_RESOURCE_INFO *inputGmm) : Gmm(gmmHelper, inputGmm, false) {} Gmm::Gmm(GmmHelper *gmmHelper, GMM_RESOURCE_INFO *inputGmm, bool openingHandle) : gmmHelper(gmmHelper) { + auto &rootDeviceEnvironment = gmmHelper->getRootDeviceEnvironment(); + auto &gfxCoreHelper = rootDeviceEnvironment.getHelper(); gmmResourceInfo.reset(GmmResourceInfo::create(gmmHelper->getClientContext(), inputGmm, openingHandle)); + if (gfxCoreHelper.isCompressionAppliedForImportedResource(*this)) { + compressionEnabled = true; + } applyDebugOverrides(); } diff --git a/shared/source/helpers/gfx_core_helper.h b/shared/source/helpers/gfx_core_helper.h index 72b4a0efe1..241371c66c 100644 --- a/shared/source/helpers/gfx_core_helper.h +++ b/shared/source/helpers/gfx_core_helper.h @@ -146,6 +146,7 @@ class GfxCoreHelper { virtual size_t getTimestampPacketAllocatorAlignment() const = 0; virtual size_t getSingleTimestampPacketSize() const = 0; virtual void applyAdditionalCompressionSettings(Gmm &gmm, bool isNotCompressed) const = 0; + virtual bool isCompressionAppliedForImportedResource(Gmm &gmm) const = 0; virtual void applyRenderCompressionFlag(Gmm &gmm, uint32_t isCompressed) const = 0; virtual bool unTypedDataPortCacheFlushRequired() const = 0; virtual bool isEngineTypeRemappingToHwSpecificRequired() const = 0; @@ -408,6 +409,7 @@ class GfxCoreHelperHw : public GfxCoreHelper { static size_t getSingleTimestampPacketSizeHw(); void applyAdditionalCompressionSettings(Gmm &gmm, bool isNotCompressed) const override; + bool isCompressionAppliedForImportedResource(Gmm &gmm) const override; void applyRenderCompressionFlag(Gmm &gmm, uint32_t isCompressed) const override; diff --git a/shared/source/helpers/gfx_core_helper_base.inl b/shared/source/helpers/gfx_core_helper_base.inl index 15945e5fff..3295c8e7ae 100644 --- a/shared/source/helpers/gfx_core_helper_base.inl +++ b/shared/source/helpers/gfx_core_helper_base.inl @@ -11,6 +11,7 @@ #include "shared/source/execution_environment/root_device_environment.h" #include "shared/source/gmm_helper/gmm.h" #include "shared/source/gmm_helper/gmm_helper.h" +#include "shared/source/gmm_helper/resource_info.h" #include "shared/source/helpers/aligned_memory.h" #include "shared/source/helpers/basic_math.h" #include "shared/source/helpers/bit_helpers.h" @@ -662,6 +663,16 @@ size_t GfxCoreHelperHw::getPreemptionAllocationAlignment() const { template void GfxCoreHelperHw::applyAdditionalCompressionSettings(Gmm &gmm, bool isNotCompressed) const {} +template +bool GfxCoreHelperHw::isCompressionAppliedForImportedResource(Gmm &gmm) const { + auto gmmFlags = gmm.gmmResourceInfo->getResourceFlags(); + if (gmmFlags->Info.MediaCompressed || gmmFlags->Info.RenderCompressed) { + return true; + } + + return false; +} + template void GfxCoreHelperHw::applyRenderCompressionFlag(Gmm &gmm, uint32_t isCompressed) const { gmm.resourceParams.Flags.Info.RenderCompressed = isCompressed; diff --git a/shared/source/helpers/gfx_core_helper_xe2_and_later.inl b/shared/source/helpers/gfx_core_helper_xe2_and_later.inl index 1a75a19537..19cef4f441 100644 --- a/shared/source/helpers/gfx_core_helper_xe2_and_later.inl +++ b/shared/source/helpers/gfx_core_helper_xe2_and_later.inl @@ -6,6 +6,7 @@ */ #include "shared/source/gmm_helper/gmm.h" +#include "shared/source/gmm_helper/resource_info.h" #include "shared/source/helpers/gfx_core_helper.h" namespace NEO { @@ -23,6 +24,16 @@ void GfxCoreHelperHw::applyAdditionalCompressionSettings(Gmm &gmm, bool } } +template <> +bool GfxCoreHelperHw::isCompressionAppliedForImportedResource(Gmm &gmm) const { + auto gmmFlags = gmm.gmmResourceInfo->getResourceFlags(); + if (!gmmFlags->Info.NotCompressed) { + return true; + } + + return false; +} + template const EngineInstancesContainer GfxCoreHelperHw::getGpgpuEngineInstances(const RootDeviceEnvironment &rootDeviceEnvironment) const { auto &hwInfo = *rootDeviceEnvironment.getHardwareInfo(); diff --git a/shared/test/unit_test/gmm_helper/compression_tests_xe2_and_later.cpp b/shared/test/unit_test/gmm_helper/compression_tests_xe2_and_later.cpp index 3d653e8637..4fff0b9cb1 100644 --- a/shared/test/unit_test/gmm_helper/compression_tests_xe2_and_later.cpp +++ b/shared/test/unit_test/gmm_helper/compression_tests_xe2_and_later.cpp @@ -170,6 +170,18 @@ HWTEST2_F(GmmAdditionalCompressionSettingsTests, givenEnabledAndPreferredE2ECWhe EXPECT_TRUE(gmm->isCompressionEnabled()); } +HWTEST2_F(GmmAdditionalCompressionSettingsTests, givenGmmCreatedFromExistingGmmWithCompressionThenCompressionTrueForSecondResource, IsAtLeastXe2HpgCore) { + auto gmm = std::make_unique(getGmmHelper()); + gmm->resourceParams.Flags.Info.NotCompressed = 0; + + auto &gfxCoreHelper = this->executionEnvironment->rootDeviceEnvironments[0]->getHelper(); + gfxCoreHelper.applyAdditionalCompressionSettings(*gmm, false); + EXPECT_EQ(0u, gmm->resourceParams.Flags.Info.NotCompressed); + + auto gmmRes2 = std::make_unique(getGmmHelper(), gmm->gmmResourceInfo->peekGmmResourceInfo(), false); + EXPECT_TRUE(gmmRes2->isCompressionEnabled()); +} + HWTEST2_F(GmmAdditionalCompressionSettingsTests, givenDisabledE2ECAndEnabledDebugFlagWhenApplyingForBuffersThenSetValidFlags, IsAtLeastXe2HpgCore) { DebugManagerStateRestore restore; GmmRequirements gmmRequirements{}; diff --git a/shared/test/unit_test/gmm_helper/gmm_helper_tests.cpp b/shared/test/unit_test/gmm_helper/gmm_helper_tests.cpp index 7400db2625..4f3893d90f 100644 --- a/shared/test/unit_test/gmm_helper/gmm_helper_tests.cpp +++ b/shared/test/unit_test/gmm_helper/gmm_helper_tests.cpp @@ -1446,6 +1446,42 @@ TEST_F(GmmCompressionTests, givenMediaCompressedImageApplyAuxFlagsForImageThenSe EXPECT_TRUE(gmm.isCompressionEnabled()); } +HWTEST2_F(GmmCompressionTests, givenGmmCreatedFromExistingGmmWithRenderCompressionThenCompressionTrueForSecondResource, IsAtMostXeCore) { + GmmRequirements gmmRequirements{}; + gmmRequirements.allowLargePages = true; + gmmRequirements.preferCompressed = false; + MockGmm gmm(getGmmHelper(), nullptr, 1, 0, GMM_RESOURCE_USAGE_OCL_BUFFER, {}, gmmRequirements); + auto flags = gmm.gmmResourceInfo->getResourceFlags(); + flags->Gpu.CCS = true; + flags->Gpu.UnifiedAuxSurface = true; + flags->Info.MediaCompressed = true; + flags->Info.RenderCompressed = false; + gmm.resourceParams.Flags.Info.MediaCompressed = false; + gmm.resourceParams.Flags.Info.RenderCompressed = true; + gmm.setupImageResourceParams(imgInfo, true); + + EXPECT_TRUE(gmm.isCompressionEnabled()); + + auto gmmRes2 = std::make_unique(getGmmHelper(), gmm.gmmResourceInfo->peekGmmResourceInfo(), false); + EXPECT_TRUE(gmmRes2->isCompressionEnabled()); +} + +HWTEST2_F(GmmCompressionTests, givenGmmCreatedFromExistingGmmWithCompressionDisabledThenCompressionFalseForSecondResource, IsAtMostXeCore) { + localPlatformDevice->capabilityTable.ftrRenderCompressedImages = false; + GmmRequirements gmmRequirements{}; + gmmRequirements.allowLargePages = true; + gmmRequirements.preferCompressed = false; + MockGmm gmm(getGmmHelper(), nullptr, 1, 0, GMM_RESOURCE_USAGE_OCL_BUFFER, {}, gmmRequirements); + gmm.resourceParams.Flags.Info.MediaCompressed = false; + gmm.resourceParams.Flags.Info.RenderCompressed = false; + gmm.setupImageResourceParams(imgInfo, false); + + EXPECT_FALSE(gmm.isCompressionEnabled()); + + auto gmmRes2 = std::make_unique(getGmmHelper(), gmm.gmmResourceInfo->peekGmmResourceInfo(), false); + EXPECT_FALSE(gmmRes2->isCompressionEnabled()); +} + TEST_F(GmmCompressionTests, givenRenderCompressedImageApplyAuxFlagsForImageThenSetFlagsToCompressed) { GmmRequirements gmmRequirements{}; gmmRequirements.allowLargePages = true; diff --git a/shared/test/unit_test/helpers/gfx_core_helper_tests.cpp b/shared/test/unit_test/helpers/gfx_core_helper_tests.cpp index 5edd7a7e50..cc298b1cb3 100644 --- a/shared/test/unit_test/helpers/gfx_core_helper_tests.cpp +++ b/shared/test/unit_test/helpers/gfx_core_helper_tests.cpp @@ -11,6 +11,7 @@ #include "shared/source/command_container/command_encoder.h" #include "shared/source/command_container/encode_surface_state.h" #include "shared/source/gmm_helper/gmm_helper.h" +#include "shared/source/gmm_helper/resource_info.h" #include "shared/source/helpers/aligned_memory.h" #include "shared/source/helpers/gfx_core_helper.h" #include "shared/source/helpers/pipe_control_args.h" @@ -1258,6 +1259,32 @@ HWTEST_F(GfxCoreHelperTest, whenSetCompressedFlagThenProperFlagSet) { EXPECT_EQ(0u, gmm->resourceParams.Flags.Info.RenderCompressed); } +HWTEST2_F(GfxCoreHelperTest, whenSetNotCompressedFlagThenProperValueReturned, IsAtLeastXe2HpgCore) { + auto &gfxCoreHelper = getHelper(); + auto gmm = std::make_unique(pDevice->getGmmHelper()); + auto gmmFlags = gmm->gmmResourceInfo->getResourceFlags(); + gmmFlags->Info.NotCompressed = 0; + EXPECT_TRUE(gfxCoreHelper.isCompressionAppliedForImportedResource(*gmm)); +} + +HWTEST2_F(GfxCoreHelperTest, whenSetRenderCompressedFlagThenProperValueReturned, IsAtMostDg2) { + auto &gfxCoreHelper = getHelper(); + auto gmm = std::make_unique(pDevice->getGmmHelper()); + auto gmmFlags = gmm->gmmResourceInfo->getResourceFlags(); + gmmFlags->Info.RenderCompressed = 1; + gmmFlags->Info.MediaCompressed = 0; + EXPECT_TRUE(gfxCoreHelper.isCompressionAppliedForImportedResource(*gmm)); +} + +HWTEST2_F(GfxCoreHelperTest, whenSetMediaCompressedFlagThenProperValueReturned, IsAtMostDg2) { + auto &gfxCoreHelper = getHelper(); + auto gmm = std::make_unique(pDevice->getGmmHelper()); + auto gmmFlags = gmm->gmmResourceInfo->getResourceFlags(); + gmmFlags->Info.RenderCompressed = 0; + gmmFlags->Info.MediaCompressed = 1; + EXPECT_TRUE(gfxCoreHelper.isCompressionAppliedForImportedResource(*gmm)); +} + HWTEST_F(GfxCoreHelperTest, whenAdjustPreemptionSurfaceSizeIsCalledThenCsrSizeDoesntChange) { auto &gfxCoreHelper = getHelper(); size_t csrSize = 1024;