diff --git a/runtime/mem_obj/image.cpp b/runtime/mem_obj/image.cpp index 07de479299..3a121fc1b5 100644 --- a/runtime/mem_obj/image.cpp +++ b/runtime/mem_obj/image.cpp @@ -177,6 +177,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 : Gmm::allowTiling(*imageDesc); + imgInfo.preferRenderCompression = isTilingAllowed; bool zeroCopy = false; bool transferNeeded = false; diff --git a/unit_tests/mem_obj/image_tests.cpp b/unit_tests/mem_obj/image_tests.cpp index 2553cc3d24..9a21d8c438 100644 --- a/unit_tests/mem_obj/image_tests.cpp +++ b/unit_tests/mem_obj/image_tests.cpp @@ -942,3 +942,60 @@ TEST(ImageGetSurfaceFormatInfoTest, givenNullptrFormatWhenGetSurfaceFormatInfoIs auto surfaceFormat = Image::getSurfaceFormatFromTable(0, nullptr); EXPECT_EQ(nullptr, surfaceFormat); } + +class ImageCompressionTests : public ::testing::Test { + public: + class MyMemoryManager : public MockMemoryManager { + public: + GraphicsAllocation *allocateGraphicsMemoryForImage(ImageInfo &imgInfo, Gmm *gmm) override { + mockMethodCalled = true; + capturedImgInfo = imgInfo; + return OsAgnosticMemoryManager::allocateGraphicsMemoryForImage(imgInfo, gmm); + } + ImageInfo capturedImgInfo = {}; + bool mockMethodCalled = false; + }; + + void SetUp() override { + myMemoryManager = new MyMemoryManager(); + mockDevice.reset(Device::create(*platformDevices)); + mockDevice->injectMemoryManager(myMemoryManager); + mockContext.reset(new MockContext(mockDevice.get())); + } + + std::unique_ptr mockDevice; + std::unique_ptr mockContext; + MyMemoryManager *myMemoryManager = nullptr; + + cl_image_desc imageDesc = {}; + cl_image_format imageFormat{CL_RGBA, CL_UNORM_INT8}; + cl_mem_flags flags = CL_MEM_READ_WRITE; + cl_int retVal = CL_SUCCESS; +}; + +TEST_F(ImageCompressionTests, givenTiledImageWhenCreatingAllocationThenPreferRenderCompression) { + imageDesc.image_type = CL_MEM_OBJECT_IMAGE2D; + imageDesc.image_width = 5; + imageDesc.image_height = 5; + + auto surfaceFormat = Image::getSurfaceFormatFromTable(flags, &imageFormat); + + auto image = std::unique_ptr(Image::create(mockContext.get(), flags, surfaceFormat, &imageDesc, nullptr, retVal)); + ASSERT_NE(nullptr, image); + EXPECT_TRUE(image->isTiledImage); + EXPECT_TRUE(myMemoryManager->mockMethodCalled); + EXPECT_TRUE(myMemoryManager->capturedImgInfo.preferRenderCompression); +} + +TEST_F(ImageCompressionTests, givenNonTiledImageWhenCreatingAllocationThenDontPreferRenderCompression) { + imageDesc.image_type = CL_MEM_OBJECT_IMAGE1D; + imageDesc.image_width = 5; + + auto surfaceFormat = Image::getSurfaceFormatFromTable(flags, &imageFormat); + + auto image = std::unique_ptr(Image::create(mockContext.get(), flags, surfaceFormat, &imageDesc, nullptr, retVal)); + ASSERT_NE(nullptr, image); + EXPECT_FALSE(image->isTiledImage); + EXPECT_TRUE(myMemoryManager->mockMethodCalled); + EXPECT_FALSE(myMemoryManager->capturedImgInfo.preferRenderCompression); +}