refactor: add new parameter to use dedicated memory to initialize surface state

Related-To: NEO-15374

Signed-off-by: Zbigniew Zdanowicz <zbigniew.zdanowicz@intel.com>
This commit is contained in:
Zbigniew Zdanowicz
2025-07-18 16:25:15 +00:00
committed by Compute-Runtime-Automation
parent 74f04acb88
commit 71659807c4
3 changed files with 51 additions and 2 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021-2024 Intel Corporation
* Copyright (C) 2021-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -18,6 +18,7 @@ struct EncodeSurfaceStateArgsBase {
size_t size = 0u;
void *outMemory = nullptr;
void *inTemplateMemory = nullptr;
GraphicsAllocation *allocation = nullptr;
GmmHelper *gmmHelper = nullptr;

View File

@@ -684,7 +684,11 @@ template <typename GfxFamily>
void GfxCoreHelperHw<GfxFamily>::encodeBufferSurfaceState(EncodeSurfaceStateArgs &args) const {
using RENDER_SURFACE_STATE = typename GfxFamily::RENDER_SURFACE_STATE;
auto surfaceState = reinterpret_cast<RENDER_SURFACE_STATE *>(args.outMemory);
*surfaceState = GfxFamily::cmdInitRenderSurfaceState;
if (args.inTemplateMemory != nullptr) {
*surfaceState = *reinterpret_cast<RENDER_SURFACE_STATE *>(args.inTemplateMemory);
} else {
*surfaceState = GfxFamily::cmdInitRenderSurfaceState;
}
EncodeSurfaceState<GfxFamily>::encodeBuffer(args);
}

View File

@@ -365,6 +365,50 @@ HWTEST2_F(CommandEncodeStatesTest, givenCreatedSurfaceStateBufferWhenGpuCoherenc
alignedFree(stateBuffer);
}
HWTEST2_F(CommandEncodeStatesTest, givenTemplateSurfaceStateBufferWhenEncodingSurfaceStateAndTemplatePointerSetThenUseTemplateMemory, MatchAny) {
using RENDER_SURFACE_STATE = typename FamilyType::RENDER_SURFACE_STATE;
void *templateStateBuffer = alignedMalloc(sizeof(RENDER_SURFACE_STATE), sizeof(RENDER_SURFACE_STATE));
ASSERT_NE(nullptr, templateStateBuffer);
RENDER_SURFACE_STATE *templateState = reinterpret_cast<RENDER_SURFACE_STATE *>(templateStateBuffer);
// set unique field not used in encoder
constexpr uint32_t pitch = 4;
templateState->setSurfacePitch(pitch);
void *stateBuffer = alignedMalloc(sizeof(RENDER_SURFACE_STATE), sizeof(RENDER_SURFACE_STATE));
ASSERT_NE(nullptr, stateBuffer);
RENDER_SURFACE_STATE *state = reinterpret_cast<RENDER_SURFACE_STATE *>(stateBuffer);
memset(stateBuffer, 0, sizeof(RENDER_SURFACE_STATE));
size_t size = 0x1000;
uint64_t gpuAddr = 0;
NEO::EncodeSurfaceStateArgs args;
args.outMemory = stateBuffer;
args.inTemplateMemory = templateStateBuffer;
args.graphicsAddress = gpuAddr;
args.size = size;
args.mocs = 1;
args.cpuCoherent = false;
args.numAvailableDevices = 1;
args.gmmHelper = pDevice->getGmmHelper();
args.areMultipleSubDevicesInContext = false;
pDevice->getGfxCoreHelper().encodeBufferSurfaceState(args);
EXPECT_EQ(pitch, state->getSurfacePitch());
memset(stateBuffer, 0, sizeof(RENDER_SURFACE_STATE));
args.inTemplateMemory = nullptr;
pDevice->getGfxCoreHelper().encodeBufferSurfaceState(args);
EXPECT_EQ(1u, state->getSurfacePitch()); // getter adds 1 to default value 0
alignedFree(stateBuffer);
alignedFree(templateStateBuffer);
}
HWTEST2_F(CommandEncodeStatesTest, givenCommandContainerWithDirtyHeapsWhenSetStateBaseAddressCalledThenStateBaseAddressAreNotSet, IsHeapfulSupported) {
using STATE_BASE_ADDRESS = typename FamilyType::STATE_BASE_ADDRESS;
cmdContainer->dirtyHeaps = 0;