Allow Explicit RTDispatch args and remove multi free of rtMemoryBackedBuffer
Signed-off-by: Neil R Spruit <neil.r.spruit@intel.com>
This commit is contained in:
parent
6ab4b566aa
commit
64ca4b3456
|
@ -887,6 +887,7 @@ ze_result_t KernelImp::initialize(const ze_kernel_desc_t *desc) {
|
||||||
kernelDescriptor.kernelAttributes.hasNonKernelArgAtomic;
|
kernelDescriptor.kernelAttributes.hasNonKernelArgAtomic;
|
||||||
|
|
||||||
if (this->usesRayTracing()) {
|
if (this->usesRayTracing()) {
|
||||||
|
if (this->getImmutableData()->getDescriptor().payloadMappings.implicitArgs.rtDispatchGlobals.pointerSize > 0) {
|
||||||
uint32_t bvhLevels = NEO::RayTracingHelper::maxBvhLevels;
|
uint32_t bvhLevels = NEO::RayTracingHelper::maxBvhLevels;
|
||||||
neoDevice->initializeRayTracing(bvhLevels);
|
neoDevice->initializeRayTracing(bvhLevels);
|
||||||
auto rtDispatchGlobals = neoDevice->getRTDispatchGlobals(bvhLevels);
|
auto rtDispatchGlobals = neoDevice->getRTDispatchGlobals(bvhLevels);
|
||||||
|
@ -899,6 +900,10 @@ ze_result_t KernelImp::initialize(const ze_kernel_desc_t *desc) {
|
||||||
NEO::patchPointer(ArrayRef<uint8_t>(crossThreadData.get(), crossThreadDataSize),
|
NEO::patchPointer(ArrayRef<uint8_t>(crossThreadData.get(), crossThreadDataSize),
|
||||||
this->getImmutableData()->getDescriptor().payloadMappings.implicitArgs.rtDispatchGlobals,
|
this->getImmutableData()->getDescriptor().payloadMappings.implicitArgs.rtDispatchGlobals,
|
||||||
static_cast<uintptr_t>(rtDispatchGlobals->getGpuAddressToPatch()));
|
static_cast<uintptr_t>(rtDispatchGlobals->getGpuAddressToPatch()));
|
||||||
|
} else {
|
||||||
|
neoDevice->initializeRayTracing(0);
|
||||||
|
this->residencyContainer.push_back(neoDevice->getRTMemoryBackedBuffer());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ZE_RESULT_SUCCESS;
|
return ZE_RESULT_SUCCESS;
|
||||||
|
|
|
@ -608,6 +608,7 @@ TEST_F(KernelImmutableDataTests, whenHasRTCallsIsTrueThenRayTracingIsInitialized
|
||||||
std::unique_ptr<MockImmutableData> mockKernelImmutableData =
|
std::unique_ptr<MockImmutableData> mockKernelImmutableData =
|
||||||
std::make_unique<MockImmutableData>(32u);
|
std::make_unique<MockImmutableData>(32u);
|
||||||
mockKernelImmutableData->kernelDescriptor = &mockDescriptor;
|
mockKernelImmutableData->kernelDescriptor = &mockDescriptor;
|
||||||
|
mockDescriptor.payloadMappings.implicitArgs.rtDispatchGlobals.pointerSize = 4;
|
||||||
|
|
||||||
ModuleBuildLog *moduleBuildLog = nullptr;
|
ModuleBuildLog *moduleBuildLog = nullptr;
|
||||||
module = std::make_unique<MockModule>(device,
|
module = std::make_unique<MockModule>(device,
|
||||||
|
@ -643,6 +644,81 @@ TEST_F(KernelImmutableDataTests, whenHasRTCallsIsTrueThenRayTracingIsInitialized
|
||||||
EXPECT_EQ(kernel->getResidencyContainer()[residencySize - 1], rtDispatchGlobals);
|
EXPECT_EQ(kernel->getResidencyContainer()[residencySize - 1], rtDispatchGlobals);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(KernelImmutableDataTests, whenHasRTCallsIsTrueButKernelDoesNotHaveRTDGAllocationTokenThenRayTracingStillEnabledWithoutAllocation) {
|
||||||
|
KernelDescriptorRTCallsTrue mockDescriptor = {};
|
||||||
|
mockDescriptor.kernelMetadata.kernelName = "rt_test";
|
||||||
|
for (auto i = 0u; i < 3u; i++) {
|
||||||
|
mockDescriptor.kernelAttributes.requiredWorkgroupSize[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<MockImmutableData> mockKernelImmutableData =
|
||||||
|
std::make_unique<MockImmutableData>(32u);
|
||||||
|
mockKernelImmutableData->kernelDescriptor = &mockDescriptor;
|
||||||
|
|
||||||
|
ModuleBuildLog *moduleBuildLog = nullptr;
|
||||||
|
module = std::make_unique<MockModule>(device,
|
||||||
|
moduleBuildLog,
|
||||||
|
ModuleType::User,
|
||||||
|
32u,
|
||||||
|
mockKernelImmutableData.get());
|
||||||
|
module->maxGroupSize = 10;
|
||||||
|
|
||||||
|
std::unique_ptr<ModuleImmutableDataFixture::MockKernel> kernel;
|
||||||
|
kernel = std::make_unique<ModuleImmutableDataFixture::MockKernel>(module.get());
|
||||||
|
|
||||||
|
ze_kernel_desc_t kernelDesc = {};
|
||||||
|
kernelDesc.pKernelName = "rt_test";
|
||||||
|
|
||||||
|
auto immDataVector =
|
||||||
|
const_cast<std::vector<std::unique_ptr<KernelImmutableData>> *>(&module.get()->getKernelImmutableDataVector());
|
||||||
|
|
||||||
|
immDataVector->push_back(std::move(mockKernelImmutableData));
|
||||||
|
|
||||||
|
auto result = kernel->initialize(&kernelDesc);
|
||||||
|
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
|
||||||
|
EXPECT_NE(nullptr, module.get()->getDevice()->getNEODevice()->getRTMemoryBackedBuffer());
|
||||||
|
|
||||||
|
auto rtDispatchGlobals = neoDevice->getRTDispatchGlobals(NEO::RayTracingHelper::maxBvhLevels);
|
||||||
|
EXPECT_EQ(nullptr, rtDispatchGlobals);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(KernelImmutableDataTests, whenHasRTCallsIsTrueAndNoRTDispatchGlobalsIsAllocatedThenRayTracingIsNotInitialized) {
|
||||||
|
KernelDescriptorRTCallsTrue mockDescriptor = {};
|
||||||
|
mockDescriptor.kernelMetadata.kernelName = "rt_test";
|
||||||
|
for (auto i = 0u; i < 3u; i++) {
|
||||||
|
mockDescriptor.kernelAttributes.requiredWorkgroupSize[i] = 0;
|
||||||
|
}
|
||||||
|
mockDescriptor.payloadMappings.implicitArgs.rtDispatchGlobals.pointerSize = 4;
|
||||||
|
|
||||||
|
NEO::MemoryManager *currMemoryManager = new NEO::FailMemoryManager(0, *neoDevice->executionEnvironment);
|
||||||
|
|
||||||
|
std::unique_ptr<MockImmutableData> mockKernelImmutableData =
|
||||||
|
std::make_unique<MockImmutableData>(32u);
|
||||||
|
mockKernelImmutableData->kernelDescriptor = &mockDescriptor;
|
||||||
|
|
||||||
|
ModuleBuildLog *moduleBuildLog = nullptr;
|
||||||
|
module = std::make_unique<MockModule>(device,
|
||||||
|
moduleBuildLog,
|
||||||
|
ModuleType::User,
|
||||||
|
32u,
|
||||||
|
mockKernelImmutableData.get());
|
||||||
|
module->maxGroupSize = 10;
|
||||||
|
|
||||||
|
std::unique_ptr<ModuleImmutableDataFixture::MockKernel> kernel;
|
||||||
|
kernel = std::make_unique<ModuleImmutableDataFixture::MockKernel>(module.get());
|
||||||
|
|
||||||
|
ze_kernel_desc_t kernelDesc = {};
|
||||||
|
kernelDesc.pKernelName = "rt_test";
|
||||||
|
auto immDataVector =
|
||||||
|
const_cast<std::vector<std::unique_ptr<KernelImmutableData>> *>(&module.get()->getKernelImmutableDataVector());
|
||||||
|
|
||||||
|
immDataVector->push_back(std::move(mockKernelImmutableData));
|
||||||
|
|
||||||
|
neoDevice->injectMemoryManager(currMemoryManager);
|
||||||
|
|
||||||
|
EXPECT_EQ(ZE_RESULT_ERROR_OUT_OF_HOST_MEMORY, kernel->initialize(&kernelDesc));
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(KernelImmutableDataTests, whenHasRTCallsIsFalseThenRayTracingIsNotInitialized) {
|
TEST_F(KernelImmutableDataTests, whenHasRTCallsIsFalseThenRayTracingIsNotInitialized) {
|
||||||
KernelDescriptorRTCallsFalse mockDescriptor = {};
|
KernelDescriptorRTCallsFalse mockDescriptor = {};
|
||||||
mockDescriptor.kernelMetadata.kernelName = "rt_test";
|
mockDescriptor.kernelMetadata.kernelName = "rt_test";
|
||||||
|
@ -677,42 +753,6 @@ TEST_F(KernelImmutableDataTests, whenHasRTCallsIsFalseThenRayTracingIsNotInitial
|
||||||
EXPECT_EQ(nullptr, module.get()->getDevice()->getNEODevice()->getRTMemoryBackedBuffer());
|
EXPECT_EQ(nullptr, module.get()->getDevice()->getNEODevice()->getRTMemoryBackedBuffer());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(KernelImmutableDataTests, whenHasRTCallsIsTrueAndNoRTDispatchGlobalsIsAllocatedThenRayTracingIsNotInitialized) {
|
|
||||||
KernelDescriptorRTCallsTrue mockDescriptor = {};
|
|
||||||
mockDescriptor.kernelMetadata.kernelName = "rt_test";
|
|
||||||
for (auto i = 0u; i < 3u; i++) {
|
|
||||||
mockDescriptor.kernelAttributes.requiredWorkgroupSize[i] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
NEO::MemoryManager *currMemoryManager = new NEO::FailMemoryManager(0, *neoDevice->executionEnvironment);
|
|
||||||
|
|
||||||
std::unique_ptr<MockImmutableData> mockKernelImmutableData =
|
|
||||||
std::make_unique<MockImmutableData>(32u);
|
|
||||||
mockKernelImmutableData->kernelDescriptor = &mockDescriptor;
|
|
||||||
|
|
||||||
ModuleBuildLog *moduleBuildLog = nullptr;
|
|
||||||
module = std::make_unique<MockModule>(device,
|
|
||||||
moduleBuildLog,
|
|
||||||
ModuleType::User,
|
|
||||||
32u,
|
|
||||||
mockKernelImmutableData.get());
|
|
||||||
module->maxGroupSize = 10;
|
|
||||||
|
|
||||||
std::unique_ptr<ModuleImmutableDataFixture::MockKernel> kernel;
|
|
||||||
kernel = std::make_unique<ModuleImmutableDataFixture::MockKernel>(module.get());
|
|
||||||
|
|
||||||
ze_kernel_desc_t kernelDesc = {};
|
|
||||||
kernelDesc.pKernelName = "rt_test";
|
|
||||||
auto immDataVector =
|
|
||||||
const_cast<std::vector<std::unique_ptr<KernelImmutableData>> *>(&module.get()->getKernelImmutableDataVector());
|
|
||||||
|
|
||||||
immDataVector->push_back(std::move(mockKernelImmutableData));
|
|
||||||
|
|
||||||
neoDevice->injectMemoryManager(currMemoryManager);
|
|
||||||
|
|
||||||
EXPECT_EQ(ZE_RESULT_ERROR_OUT_OF_HOST_MEMORY, kernel->initialize(&kernelDesc));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(KernelImmutableDataTests, whenHasRTCallsIsTrueThenCrossThreadDataIsPatched) {
|
TEST_F(KernelImmutableDataTests, whenHasRTCallsIsTrueThenCrossThreadDataIsPatched) {
|
||||||
KernelDescriptorRTCallsTrue mockDescriptor = {};
|
KernelDescriptorRTCallsTrue mockDescriptor = {};
|
||||||
mockDescriptor.kernelMetadata.kernelName = "rt_test";
|
mockDescriptor.kernelMetadata.kernelName = "rt_test";
|
||||||
|
@ -723,6 +763,7 @@ TEST_F(KernelImmutableDataTests, whenHasRTCallsIsTrueThenCrossThreadDataIsPatche
|
||||||
std::unique_ptr<MockImmutableData> mockKernelImmutableData =
|
std::unique_ptr<MockImmutableData> mockKernelImmutableData =
|
||||||
std::make_unique<MockImmutableData>(32u);
|
std::make_unique<MockImmutableData>(32u);
|
||||||
mockKernelImmutableData->kernelDescriptor = &mockDescriptor;
|
mockKernelImmutableData->kernelDescriptor = &mockDescriptor;
|
||||||
|
mockDescriptor.payloadMappings.implicitArgs.rtDispatchGlobals.pointerSize = 4;
|
||||||
|
|
||||||
ModuleBuildLog *moduleBuildLog = nullptr;
|
ModuleBuildLog *moduleBuildLog = nullptr;
|
||||||
module = std::make_unique<MockModule>(device,
|
module = std::make_unique<MockModule>(device,
|
||||||
|
|
|
@ -43,12 +43,8 @@ Device::~Device() {
|
||||||
}
|
}
|
||||||
|
|
||||||
finalizeRayTracing();
|
finalizeRayTracing();
|
||||||
getMemoryManager()->freeGraphicsMemory(rtMemoryBackedBuffer);
|
|
||||||
rtMemoryBackedBuffer = nullptr;
|
|
||||||
|
|
||||||
DEBUG_BREAK_IF(nullptr == executionEnvironment->memoryManager.get());
|
DEBUG_BREAK_IF(nullptr == executionEnvironment->memoryManager.get());
|
||||||
getMemoryManager()->freeGraphicsMemory(rtMemoryBackedBuffer);
|
|
||||||
rtMemoryBackedBuffer = nullptr;
|
|
||||||
|
|
||||||
if (performanceCounters) {
|
if (performanceCounters) {
|
||||||
performanceCounters->shutdown();
|
performanceCounters->shutdown();
|
||||||
|
|
Loading…
Reference in New Issue