From 88edc7279de780a520c912266ec7dbfac6a8c97c Mon Sep 17 00:00:00 2001 From: "Dunajski, Bartosz" Date: Wed, 13 Jun 2018 12:46:54 +0200 Subject: [PATCH] Improve returned row pitch calculation for multisampled images Change-Id: I2fbf413ba83941682fa2bd0353060cab3f534d1a --- runtime/mem_obj/image.cpp | 7 +++++- unit_tests/api/cl_get_image_info_tests.cpp | 28 ++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/runtime/mem_obj/image.cpp b/runtime/mem_obj/image.cpp index 2fdcb481ac..3f6205e1ca 100644 --- a/runtime/mem_obj/image.cpp +++ b/runtime/mem_obj/image.cpp @@ -706,7 +706,12 @@ cl_int Image::getImageInfo(cl_image_info paramName, case CL_IMAGE_ROW_PITCH: srcParamSize = sizeof(size_t); - srcParam = &hostPtrRowPitch; + if (mcsSurfaceInfo.multisampleCount > 1) { + retParam = imageDesc.image_width * surfFmtInfo.ImageElementSizeInBytes * imageDesc.num_samples; + } else { + retParam = hostPtrRowPitch; + } + srcParam = &retParam; break; case CL_IMAGE_SLICE_PITCH: diff --git a/unit_tests/api/cl_get_image_info_tests.cpp b/unit_tests/api/cl_get_image_info_tests.cpp index b84d0db73d..a2770ad3c0 100644 --- a/unit_tests/api/cl_get_image_info_tests.cpp +++ b/unit_tests/api/cl_get_image_info_tests.cpp @@ -370,4 +370,32 @@ TEST_F(clGetImageInfoTests, imgNumSamples) { ASSERT_EQ(CL_SUCCESS, retVal); ASSERT_EQ(this->imageDesc.num_samples, numSamplesRet); } + +TEST_F(clGetImageInfoTests, givenMultisampleCountForMcsWhenAskingForRowPitchThenReturnNewValueIfGreaterThanOne) { + McsSurfaceInfo mcsInfo = {1, 1, 0}; + imageDesc.num_samples = 16; + size_t receivedRowPitch = 0; + + clReleaseMemObject(image); + image = clCreateImage(pContext, CL_MEM_READ_WRITE, &imageFormat, &imageDesc, nullptr, &retVal); + + auto imageObj = castToObject(image); + auto formatInfo = imageObj->getSurfaceFormatInfo(); + + size_t multisampleRowPitch = imageDesc.image_width * formatInfo.ImageElementSizeInBytes * imageDesc.num_samples; + EXPECT_NE(multisampleRowPitch, imageObj->getHostPtrRowPitch()); + + for (uint32_t multisampleCount = 0; multisampleCount <= 4; multisampleCount++) { + mcsInfo.multisampleCount = multisampleCount; + imageObj->setMcsSurfaceInfo(mcsInfo); + + clGetImageInfo(image, CL_IMAGE_ROW_PITCH, sizeof(size_t), &receivedRowPitch, nullptr); + + if (multisampleCount > 1) { + EXPECT_EQ(multisampleRowPitch, receivedRowPitch); + } else { + EXPECT_EQ(imageObj->getHostPtrRowPitch(), receivedRowPitch); + } + } +} } // namespace ULT