diff --git a/opencl/source/context/context.h b/opencl/source/context/context.h index db62d8a1a9..232463edb2 100644 --- a/opencl/source/context/context.h +++ b/opencl/source/context/context.h @@ -149,6 +149,12 @@ class Context : public BaseObject<_cl_context> { AsyncEventsHandler &getAsyncEventsHandler() const; DeviceBitfield getDeviceBitfieldForAllocation() const; + bool getResolvesRequiredInKernels() const { + return resolvesRequiredInKernels; + } + void setResolvesRequiredInKernels(bool resolves) { + resolvesRequiredInKernels = resolves; + } protected: Context(void(CL_CALLBACK *pfnNotify)(const char *, const void *, size_t, void *) = nullptr, @@ -161,24 +167,26 @@ class Context : public BaseObject<_cl_context> { void setupContextType(); std::set rootDeviceIndices = {}; - uint32_t maxRootDeviceIndex = std::numeric_limits::max(); + std::vector> sharingFunctions; + ClDeviceVector devices; + std::list destructorCallbacks; + std::unique_ptr schedulerBuiltIn; const cl_context_properties *properties = nullptr; size_t numProperties = 0u; void(CL_CALLBACK *contextCallback)(const char *, const void *, size_t, void *) = nullptr; void *userData = nullptr; - std::unique_ptr schedulerBuiltIn; - ClDeviceVector devices; MemoryManager *memoryManager = nullptr; SVMAllocsManager *svmAllocsManager = nullptr; CommandQueue *specialQueue = nullptr; DeviceQueue *defaultDeviceQueue = nullptr; - std::vector> sharingFunctions; DriverDiagnostics *driverDiagnostics = nullptr; - bool interopUserSync = false; + + uint32_t maxRootDeviceIndex = std::numeric_limits::max(); cl_bool preferD3dSharedResources = 0u; ContextType contextType = ContextType::CONTEXT_TYPE_DEFAULT; - std::list destructorCallbacks; + bool interopUserSync = false; + bool resolvesRequiredInKernels = false; }; } // namespace NEO diff --git a/opencl/source/kernel/kernel.cpp b/opencl/source/kernel/kernel.cpp index 604b4fdccc..32db0fac14 100644 --- a/opencl/source/kernel/kernel.cpp +++ b/opencl/source/kernel/kernel.cpp @@ -382,6 +382,9 @@ cl_int Kernel::initialize() { } else { auxTranslationRequired &= hwHelper.requiresAuxResolves(); } + if (auxTranslationRequired) { + program->getContextPtr()->setResolvesRequiredInKernels(true); + } if (usingImages && !usingBuffers) { usingImagesOnly = true; diff --git a/opencl/test/unit_test/kernel/kernel_tests.cpp b/opencl/test/unit_test/kernel/kernel_tests.cpp index cdde5db6b1..39e71a970d 100644 --- a/opencl/test/unit_test/kernel/kernel_tests.cpp +++ b/opencl/test/unit_test/kernel/kernel_tests.cpp @@ -2755,6 +2755,46 @@ TEST(KernelTest, givenFtrRenderCompressedBuffersWhenInitializingArgsWithNonState EXPECT_FALSE(kernel.mockKernel->isAuxTranslationRequired()); } +TEST(KernelTest, WhenAuxTranslationIsRequiredThenKernelSetsRequiredResolvesInContext) { + DebugManagerStateRestore restore; + DebugManager.flags.ForceAuxTranslationEnabled.set(1); + auto device = std::make_unique(MockDevice::createWithNewExecutionEnvironment(nullptr)); + auto hwInfo = device->getRootDeviceEnvironment().getMutableHardwareInfo(); + hwInfo->capabilityTable.ftrRenderCompressedBuffers = true; + + auto context = clUniquePtr(new MockContext(device.get())); + context->contextType = ContextType::CONTEXT_TYPE_UNRESTRICTIVE; + MockKernelWithInternals kernel(*device, context.get()); + kernel.kernelInfo.kernelArgInfo.resize(1); + kernel.kernelInfo.kernelArgInfo[0].metadataExtended = std::make_unique(); + kernel.kernelInfo.kernelArgInfo[0].metadataExtended->type = "char *"; + kernel.kernelInfo.kernelArgInfo[0].isBuffer = true; + kernel.kernelInfo.kernelArgInfo[0].pureStatefulBufferAccess = false; + + kernel.mockKernel->initialize(); + EXPECT_TRUE(context->getResolvesRequiredInKernels()); +} + +TEST(KernelTest, WhenAuxTranslationIsNotRequiredThenKernelDoesNotSetRequiredResolvesInContext) { + DebugManagerStateRestore restore; + DebugManager.flags.ForceAuxTranslationEnabled.set(0); + auto device = std::make_unique(MockDevice::createWithNewExecutionEnvironment(nullptr)); + auto hwInfo = device->getRootDeviceEnvironment().getMutableHardwareInfo(); + hwInfo->capabilityTable.ftrRenderCompressedBuffers = true; + + auto context = clUniquePtr(new MockContext(device.get())); + context->contextType = ContextType::CONTEXT_TYPE_UNRESTRICTIVE; + MockKernelWithInternals kernel(*device, context.get()); + kernel.kernelInfo.kernelArgInfo.resize(1); + kernel.kernelInfo.kernelArgInfo[0].metadataExtended = std::make_unique(); + kernel.kernelInfo.kernelArgInfo[0].metadataExtended->type = "char *"; + kernel.kernelInfo.kernelArgInfo[0].isBuffer = true; + kernel.kernelInfo.kernelArgInfo[0].pureStatefulBufferAccess = true; + + kernel.mockKernel->initialize(); + EXPECT_FALSE(context->getResolvesRequiredInKernels()); +} + TEST(KernelTest, givenDebugVariableSetWhenKernelHasStatefulBufferAccessThenMarkKernelForAuxTranslation) { DebugManagerStateRestore restore; DebugManager.flags.RenderCompressedBuffersEnabled.set(1); diff --git a/opencl/test/unit_test/mocks/mock_context.h b/opencl/test/unit_test/mocks/mock_context.h index 24f4fe7e8a..1c10769cb4 100644 --- a/opencl/test/unit_test/mocks/mock_context.h +++ b/opencl/test/unit_test/mocks/mock_context.h @@ -22,6 +22,7 @@ class MockContext : public Context { using Context::driverDiagnostics; using Context::memoryManager; using Context::preferD3dSharedResources; + using Context::resolvesRequiredInKernels; using Context::setupContextType; using Context::sharingFunctions; using Context::svmAllocsManager;