diff --git a/level_zero/core/source/kernel/kernel_imp.cpp b/level_zero/core/source/kernel/kernel_imp.cpp index 9af3dbc420..5e3e01d891 100644 --- a/level_zero/core/source/kernel/kernel_imp.cpp +++ b/level_zero/core/source/kernel/kernel_imp.cpp @@ -887,18 +887,23 @@ ze_result_t KernelImp::initialize(const ze_kernel_desc_t *desc) { kernelDescriptor.kernelAttributes.hasNonKernelArgAtomic; if (this->usesRayTracing()) { - uint32_t bvhLevels = NEO::RayTracingHelper::maxBvhLevels; - neoDevice->initializeRayTracing(bvhLevels); - auto rtDispatchGlobals = neoDevice->getRTDispatchGlobals(bvhLevels); - if (rtDispatchGlobals == nullptr) { - return ZE_RESULT_ERROR_OUT_OF_HOST_MEMORY; - } - this->residencyContainer.push_back(neoDevice->getRTMemoryBackedBuffer()); - this->residencyContainer.push_back(rtDispatchGlobals); + if (this->getImmutableData()->getDescriptor().payloadMappings.implicitArgs.rtDispatchGlobals.pointerSize > 0) { + uint32_t bvhLevels = NEO::RayTracingHelper::maxBvhLevels; + neoDevice->initializeRayTracing(bvhLevels); + auto rtDispatchGlobals = neoDevice->getRTDispatchGlobals(bvhLevels); + if (rtDispatchGlobals == nullptr) { + return ZE_RESULT_ERROR_OUT_OF_HOST_MEMORY; + } + this->residencyContainer.push_back(neoDevice->getRTMemoryBackedBuffer()); + this->residencyContainer.push_back(rtDispatchGlobals); - NEO::patchPointer(ArrayRef(crossThreadData.get(), crossThreadDataSize), - this->getImmutableData()->getDescriptor().payloadMappings.implicitArgs.rtDispatchGlobals, - static_cast(rtDispatchGlobals->getGpuAddressToPatch())); + NEO::patchPointer(ArrayRef(crossThreadData.get(), crossThreadDataSize), + this->getImmutableData()->getDescriptor().payloadMappings.implicitArgs.rtDispatchGlobals, + static_cast(rtDispatchGlobals->getGpuAddressToPatch())); + } else { + neoDevice->initializeRayTracing(0); + this->residencyContainer.push_back(neoDevice->getRTMemoryBackedBuffer()); + } } return ZE_RESULT_SUCCESS; diff --git a/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp b/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp index 3c4a598cb8..99d78d6200 100644 --- a/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp +++ b/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp @@ -608,6 +608,7 @@ TEST_F(KernelImmutableDataTests, whenHasRTCallsIsTrueThenRayTracingIsInitialized std::unique_ptr mockKernelImmutableData = std::make_unique(32u); mockKernelImmutableData->kernelDescriptor = &mockDescriptor; + mockDescriptor.payloadMappings.implicitArgs.rtDispatchGlobals.pointerSize = 4; ModuleBuildLog *moduleBuildLog = nullptr; module = std::make_unique(device, @@ -643,6 +644,81 @@ TEST_F(KernelImmutableDataTests, whenHasRTCallsIsTrueThenRayTracingIsInitialized 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 mockKernelImmutableData = + std::make_unique(32u); + mockKernelImmutableData->kernelDescriptor = &mockDescriptor; + + ModuleBuildLog *moduleBuildLog = nullptr; + module = std::make_unique(device, + moduleBuildLog, + ModuleType::User, + 32u, + mockKernelImmutableData.get()); + module->maxGroupSize = 10; + + std::unique_ptr kernel; + kernel = std::make_unique(module.get()); + + ze_kernel_desc_t kernelDesc = {}; + kernelDesc.pKernelName = "rt_test"; + + auto immDataVector = + const_cast> *>(&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 mockKernelImmutableData = + std::make_unique(32u); + mockKernelImmutableData->kernelDescriptor = &mockDescriptor; + + ModuleBuildLog *moduleBuildLog = nullptr; + module = std::make_unique(device, + moduleBuildLog, + ModuleType::User, + 32u, + mockKernelImmutableData.get()); + module->maxGroupSize = 10; + + std::unique_ptr kernel; + kernel = std::make_unique(module.get()); + + ze_kernel_desc_t kernelDesc = {}; + kernelDesc.pKernelName = "rt_test"; + auto immDataVector = + const_cast> *>(&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) { KernelDescriptorRTCallsFalse mockDescriptor = {}; mockDescriptor.kernelMetadata.kernelName = "rt_test"; @@ -677,42 +753,6 @@ TEST_F(KernelImmutableDataTests, whenHasRTCallsIsFalseThenRayTracingIsNotInitial 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 mockKernelImmutableData = - std::make_unique(32u); - mockKernelImmutableData->kernelDescriptor = &mockDescriptor; - - ModuleBuildLog *moduleBuildLog = nullptr; - module = std::make_unique(device, - moduleBuildLog, - ModuleType::User, - 32u, - mockKernelImmutableData.get()); - module->maxGroupSize = 10; - - std::unique_ptr kernel; - kernel = std::make_unique(module.get()); - - ze_kernel_desc_t kernelDesc = {}; - kernelDesc.pKernelName = "rt_test"; - auto immDataVector = - const_cast> *>(&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) { KernelDescriptorRTCallsTrue mockDescriptor = {}; mockDescriptor.kernelMetadata.kernelName = "rt_test"; @@ -723,6 +763,7 @@ TEST_F(KernelImmutableDataTests, whenHasRTCallsIsTrueThenCrossThreadDataIsPatche std::unique_ptr mockKernelImmutableData = std::make_unique(32u); mockKernelImmutableData->kernelDescriptor = &mockDescriptor; + mockDescriptor.payloadMappings.implicitArgs.rtDispatchGlobals.pointerSize = 4; ModuleBuildLog *moduleBuildLog = nullptr; module = std::make_unique(device, diff --git a/shared/source/device/device.cpp b/shared/source/device/device.cpp index 61a6d2122b..088b847662 100644 --- a/shared/source/device/device.cpp +++ b/shared/source/device/device.cpp @@ -43,12 +43,8 @@ Device::~Device() { } finalizeRayTracing(); - getMemoryManager()->freeGraphicsMemory(rtMemoryBackedBuffer); - rtMemoryBackedBuffer = nullptr; DEBUG_BREAK_IF(nullptr == executionEnvironment->memoryManager.get()); - getMemoryManager()->freeGraphicsMemory(rtMemoryBackedBuffer); - rtMemoryBackedBuffer = nullptr; if (performanceCounters) { performanceCounters->shutdown();