diff --git a/opencl/source/api/api.cpp b/opencl/source/api/api.cpp index ba1d581f78..55567cba10 100644 --- a/opencl/source/api/api.cpp +++ b/opencl/source/api/api.cpp @@ -649,6 +649,10 @@ cl_mem CL_API_CALL clCreateBuffer(cl_context context, size_t size, void *hostPtr, cl_int *errcodeRet) { + if (DebugManager.flags.ForceExtendedBufferSize.get() >= 1) { + size += (MemoryConstants::pageSize * DebugManager.flags.ForceExtendedBufferSize.get()); + } + TRACING_ENTER(clCreateBuffer, &context, &flags, &size, &hostPtr, &errcodeRet); DBG_LOG_INPUTS("cl_context", context, "cl_mem_flags", flags, @@ -674,6 +678,10 @@ cl_mem CL_API_CALL clCreateBufferWithProperties(cl_context context, size_t size, void *hostPtr, cl_int *errcodeRet) { + if (DebugManager.flags.ForceExtendedBufferSize.get() >= 1) { + size += (MemoryConstants::pageSize * DebugManager.flags.ForceExtendedBufferSize.get()); + } + DBG_LOG_INPUTS("cl_context", context, "cl_mem_properties", properties, "cl_mem_flags", flags, @@ -697,6 +705,10 @@ cl_mem CL_API_CALL clCreateBufferWithPropertiesINTEL(cl_context context, size_t size, void *hostPtr, cl_int *errcodeRet) { + if (DebugManager.flags.ForceExtendedBufferSize.get() >= 1) { + size += (MemoryConstants::pageSize * DebugManager.flags.ForceExtendedBufferSize.get()); + } + DBG_LOG_INPUTS("cl_context", context, "cl_mem_properties_intel", properties, "cl_mem_flags", flags, diff --git a/opencl/test/unit_test/api/cl_create_buffer_tests.cpp b/opencl/test/unit_test/api/cl_create_buffer_tests.cpp index 975b47373f..d65b94afb4 100644 --- a/opencl/test/unit_test/api/cl_create_buffer_tests.cpp +++ b/opencl/test/unit_test/api/cl_create_buffer_tests.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2021 Intel Corporation + * Copyright (C) 2018-2022 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -176,6 +176,56 @@ TEST_F(clCreateBufferTests, GivenValidParametersWhenCreatingBufferThenSuccessIsR EXPECT_EQ(CL_SUCCESS, retVal); } +TEST_F(clCreateBufferTests, GivenForceExtendedBufferSizeDebugFlagWhenBufferIsCreatedThenSizeIsProperlyExtended) { + DebugManagerStateRestore restorer; + + unsigned char *pHostMem = nullptr; + cl_mem_flags flags = 0; + constexpr auto bufferSize = 16; + + auto pageSizeNumber = 1; + DebugManager.flags.ForceExtendedBufferSize.set(pageSizeNumber); + auto extendedBufferSize = bufferSize + MemoryConstants::pageSize * pageSizeNumber; + + auto buffer = clCreateBuffer(pContext, flags, bufferSize, pHostMem, &retVal); + + EXPECT_NE(nullptr, buffer); + EXPECT_EQ(CL_SUCCESS, retVal); + + auto bufferObj = NEO::castToObject(buffer); + EXPECT_EQ(extendedBufferSize, bufferObj->getSize()); + + clReleaseMemObject(buffer); + + pageSizeNumber = 4; + DebugManager.flags.ForceExtendedBufferSize.set(pageSizeNumber); + extendedBufferSize = bufferSize + MemoryConstants::pageSize * pageSizeNumber; + + buffer = clCreateBufferWithProperties(pContext, nullptr, flags, bufferSize, pHostMem, &retVal); + + EXPECT_NE(nullptr, buffer); + EXPECT_EQ(CL_SUCCESS, retVal); + + bufferObj = NEO::castToObject(buffer); + EXPECT_EQ(extendedBufferSize, bufferObj->getSize()); + + clReleaseMemObject(buffer); + + pageSizeNumber = 6; + DebugManager.flags.ForceExtendedBufferSize.set(pageSizeNumber); + extendedBufferSize = bufferSize + MemoryConstants::pageSize * pageSizeNumber; + + buffer = clCreateBufferWithPropertiesINTEL(pContext, nullptr, flags, bufferSize, pHostMem, &retVal); + + EXPECT_NE(nullptr, buffer); + EXPECT_EQ(CL_SUCCESS, retVal); + + bufferObj = NEO::castToObject(buffer); + EXPECT_EQ(extendedBufferSize, bufferObj->getSize()); + + clReleaseMemObject(buffer); +} + TEST_F(clCreateBufferTests, GivenNullContextWhenCreatingBufferThenInvalidContextErrorIsReturned) { unsigned char *pHostMem = nullptr; cl_mem_flags flags = 0; diff --git a/opencl/test/unit_test/test_files/igdrcl.config b/opencl/test/unit_test/test_files/igdrcl.config index 6c9c273a24..4936534b3e 100644 --- a/opencl/test/unit_test/test_files/igdrcl.config +++ b/opencl/test/unit_test/test_files/igdrcl.config @@ -365,4 +365,5 @@ UpdateCrossThreadDataSize = 0 ForceBcsEngineIndex = -1 ResolveDependenciesViaPipeControls = -1 ExperimentalEnableSourceLevelDebugger = 0 -Force2dImageAsArray = -1 \ No newline at end of file +Force2dImageAsArray = -1 +ForceExtendedBufferSize = -1 \ No newline at end of file diff --git a/shared/source/debug_settings/debug_variables_base.inl b/shared/source/debug_settings/debug_variables_base.inl index 55d6d66af6..2151c7fd57 100644 --- a/shared/source/debug_settings/debug_variables_base.inl +++ b/shared/source/debug_settings/debug_variables_base.inl @@ -178,6 +178,7 @@ DECLARE_DEBUG_VARIABLE(int32_t, ClosEnabled, -1, "-1: default, 0: disabled, 1: e DECLARE_DEBUG_VARIABLE(int32_t, EngineUsageHint, -1, "-1: default, >=0: engine usage value to use when creating command queue on user selected engine") DECLARE_DEBUG_VARIABLE(int32_t, ForceBcsEngineIndex, -1, "-1: default, >=0 Copy Engine index") DECLARE_DEBUG_VARIABLE(int32_t, Force2dImageAsArray, -1, "-1: default, 0: WA Disabled, 1: Forces surface state of 2dImage to array") +DECLARE_DEBUG_VARIABLE(int32_t, ForceExtendedBufferSize, -1, "-1: default, 0: disabled, >=1: Forces extended buffer size by specify pageSize number in clCreateBuffer, clCreateBufferWithProperties and clCreateBufferWithPropertiesINTEL calls") /*LOGGING FLAGS*/ DECLARE_DEBUG_VARIABLE(int32_t, PrintDriverDiagnostics, -1, "prints driver diagnostics messages to standard output, value corresponds to hint level")