diff --git a/public/cl_ext_private.h b/public/cl_ext_private.h index cf63a9662c..d395973445 100644 --- a/public/cl_ext_private.h +++ b/public/cl_ext_private.h @@ -55,4 +55,5 @@ using cl_mem_flags_intel = cl_mem_flags; #define CL_MEM_COMPARE_EQUAL 0u #define CL_MEM_COMPARE_NOT_EQUAL 1u +#define CL_MEM_FORCE_LINEAR_STORAGE_INTEL (1 << 19) #define CL_MEM_FORCE_SHARED_PHYSICAL_MEMORY_INTEL (1 << 20) diff --git a/runtime/mem_obj/image.cpp b/runtime/mem_obj/image.cpp index a0edece464..9f41cdae00 100644 --- a/runtime/mem_obj/image.cpp +++ b/runtime/mem_obj/image.cpp @@ -180,7 +180,7 @@ Image *Image::create(Context *context, auto hostPtrRowPitch = imageDesc->image_row_pitch ? imageDesc->image_row_pitch : imageWidth * surfaceFormat->ImageElementSizeInBytes; auto hostPtrSlicePitch = imageDesc->image_slice_pitch ? imageDesc->image_slice_pitch : hostPtrRowPitch * imageHeight; - auto isTilingAllowed = context->isSharedContext ? false : GmmHelper::allowTiling(*imageDesc); + auto isTilingAllowed = context->isSharedContext ? false : GmmHelper::allowTiling(*imageDesc) && !MemObjHelper::isLinearStorageForced(flags); imgInfo.preferRenderCompression = MemObjHelper::isSuitableForRenderCompression(isTilingAllowed, flags, context->peekContextType(), true); diff --git a/runtime/mem_obj/mem_obj_helper.h b/runtime/mem_obj/mem_obj_helper.h index 4c2adc6951..28d1db92f9 100644 --- a/runtime/mem_obj/mem_obj_helper.h +++ b/runtime/mem_obj/mem_obj_helper.h @@ -127,6 +127,11 @@ class MemObjHelper { return svmProperties; } + static bool isLinearStorageForced(const MemoryProperties &memoryProperties) { + return isValueSet(memoryProperties.flags, CL_MEM_FORCE_LINEAR_STORAGE_INTEL) || + isValueSet(memoryProperties.flags_intel, CL_MEM_FORCE_LINEAR_STORAGE_INTEL); + } + static bool isSuitableForRenderCompression(bool renderCompressed, const MemoryProperties &properties, ContextType contextType, bool preferCompression); protected: diff --git a/unit_tests/mem_obj/image_tests.cpp b/unit_tests/mem_obj/image_tests.cpp index e5162fde3a..931f57239c 100644 --- a/unit_tests/mem_obj/image_tests.cpp +++ b/unit_tests/mem_obj/image_tests.cpp @@ -1113,6 +1113,35 @@ TEST(ImageTest, givenNullHostPtrWhenIsCopyRequiredIsCalledThenFalseIsReturned) { EXPECT_FALSE(Image::isCopyRequired(imgInfo, nullptr)); } +TEST(ImageTest, givenClMemForceLinearStorageSetWhenCreateImageThenDisallowTiling) { + cl_int retVal = CL_SUCCESS; + MockContext context; + cl_image_desc imageDesc = {}; + imageDesc.image_width = 4096; + imageDesc.image_height = 1; + imageDesc.image_depth = 1; + imageDesc.image_type = CL_MEM_OBJECT_IMAGE3D; + + cl_image_format imageFormat = {}; + imageFormat.image_channel_data_type = CL_UNSIGNED_INT8; + imageFormat.image_channel_order = CL_R; + + cl_mem_flags flags = CL_MEM_READ_WRITE | CL_MEM_FORCE_LINEAR_STORAGE_INTEL; + auto surfaceFormat = Image::getSurfaceFormatFromTable(flags, &imageFormat); + + auto image = std::unique_ptr(Image::create( + &context, + flags, + surfaceFormat, + &imageDesc, + nullptr, + retVal)); + + EXPECT_FALSE(image->isTiledImage); + EXPECT_NE(nullptr, image); + EXPECT_EQ(CL_SUCCESS, retVal); +} + TEST(ImageTest, givenAllowedTilingWhenIsCopyRequiredIsCalledThenTrueIsReturned) { ImageInfo imgInfo{}; cl_image_desc imageDesc{}; diff --git a/unit_tests/mem_obj/mem_obj_helper_tests.cpp b/unit_tests/mem_obj/mem_obj_helper_tests.cpp index d8e0f0e743..de5290d6f1 100644 --- a/unit_tests/mem_obj/mem_obj_helper_tests.cpp +++ b/unit_tests/mem_obj/mem_obj_helper_tests.cpp @@ -31,6 +31,26 @@ TEST(MemObjHelper, givenNullPropertiesWhenParsingMemoryPropertiesThenTrueIsRetur EXPECT_TRUE(MemObjHelper::parseMemoryProperties(nullptr, propertiesStruct)); } +TEST(MemObjHelper, givenClMemForceLinearStorageFlagWhenCheckForLinearStorageForceThenReturnProperValue) { + MemoryProperties properties; + + properties.flags |= CL_MEM_FORCE_LINEAR_STORAGE_INTEL; + properties.flags_intel = 0; + EXPECT_TRUE(MemObjHelper::isLinearStorageForced(properties)); + + properties.flags = 0; + properties.flags_intel |= CL_MEM_FORCE_LINEAR_STORAGE_INTEL; + EXPECT_TRUE(MemObjHelper::isLinearStorageForced(properties)); + + properties.flags |= CL_MEM_FORCE_LINEAR_STORAGE_INTEL; + properties.flags_intel |= CL_MEM_FORCE_LINEAR_STORAGE_INTEL; + EXPECT_TRUE(MemObjHelper::isLinearStorageForced(properties)); + + properties.flags = 0; + properties.flags_intel = 0; + EXPECT_FALSE(MemObjHelper::isLinearStorageForced(properties)); +} + TEST(MemObjHelper, givenEmptyPropertiesWhenParsingMemoryPropertiesThenTrueIsReturned) { cl_mem_properties_intel properties[] = {0};