From 8296fc9d58e38d88bb3050e22fb34bf6c84d3f79 Mon Sep 17 00:00:00 2001 From: "Woloszyn, Wojciech" Date: Mon, 28 May 2018 03:00:38 -0700 Subject: [PATCH] Fix rowpitch and slicepitch calculation on gen8 - If an image is not mipmapped we do not modify hostptr pitches Change-Id: Id2bb7f0f25ad404db13cc8827c0bf0df2593bf23 --- runtime/gen8/image_gen8.cpp | 6 ++++++ unit_tests/gen8/image_tests_gen8.cpp | 22 +++++++++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/runtime/gen8/image_gen8.cpp b/runtime/gen8/image_gen8.cpp index a438f7cd68..ad60b91699 100644 --- a/runtime/gen8/image_gen8.cpp +++ b/runtime/gen8/image_gen8.cpp @@ -38,12 +38,18 @@ void ImageHw::setSurfaceMemoryObjectControlStateIndexToMocsTable(void template <> size_t ImageHw::getHostPtrRowPitchForMap(uint32_t mipLevel) { + if (getImageDesc().num_mip_levels <= 1) { + return getHostPtrRowPitch(); + } size_t mipWidth = (getImageDesc().image_width >> mipLevel) > 0 ? (getImageDesc().image_width >> mipLevel) : 1; return mipWidth * getSurfaceFormatInfo().ImageElementSizeInBytes; } template <> size_t ImageHw::getHostPtrSlicePitchForMap(uint32_t mipLevel) { + if (getImageDesc().num_mip_levels <= 1) { + return getHostPtrSlicePitch(); + } size_t mipHeight = (getImageDesc().image_height >> mipLevel) > 0 ? (getImageDesc().image_height >> mipLevel) : 1; size_t rowPitch = getHostPtrRowPitchForMap(mipLevel); diff --git a/unit_tests/gen8/image_tests_gen8.cpp b/unit_tests/gen8/image_tests_gen8.cpp index f6b309b3b5..924b9d3780 100644 --- a/unit_tests/gen8/image_tests_gen8.cpp +++ b/unit_tests/gen8/image_tests_gen8.cpp @@ -43,7 +43,7 @@ GEN8TEST_F(gen8ImageTests, appendSurfaceStateParamsDoesNothing) { EXPECT_EQ(0, memcmp(&surfaceStateBefore, &surfaceStateAfter, sizeof(RENDER_SURFACE_STATE))); } -GEN8TEST_F(gen8ImageTests, WhenGetHostPtrRowOrSlicePitchForMapIsCalledWithMipLevelZeroThenReturnWidthTimesBytesPerPixelAndRowPitchTimesHeight) { +GEN8TEST_F(gen8ImageTests, WhenGetHostPtrRowOrSlicePitchForMapIsCalledOnMipMappedImageWithMipLevelZeroThenReturnWidthTimesBytesPerPixelAndRowPitchTimesHeight) { MockContext context; cl_image_desc imageDesc{}; imageDesc.image_type = CL_MEM_OBJECT_IMAGE3D; @@ -59,7 +59,7 @@ GEN8TEST_F(gen8ImageTests, WhenGetHostPtrRowOrSlicePitchForMapIsCalledWithMipLev EXPECT_EQ(imageDesc.image_height * rowPitch, slicePitch); } -GEN8TEST_F(gen8ImageTests, WhenGetHostPtrRowOrSlicePitchForMapIsCalledWithMipLevelNonZeroThenReturnScaledWidthTimesBytesPerPixelAndRowPitchTimesScaledHeight) { +GEN8TEST_F(gen8ImageTests, WhenGetHostPtrRowOrSlicePitchForMapIsCalledOnMipMappedImageWithMipLevelNonZeroThenReturnScaledWidthTimesBytesPerPixelAndRowPitchTimesScaledHeight) { MockContext context; cl_image_desc imageDesc{}; imageDesc.image_type = CL_MEM_OBJECT_IMAGE3D; @@ -75,7 +75,7 @@ GEN8TEST_F(gen8ImageTests, WhenGetHostPtrRowOrSlicePitchForMapIsCalledWithMipLev EXPECT_EQ((imageDesc.image_height >> 1) * rowPitch, slicePitch); } -GEN8TEST_F(gen8ImageTests, WhenGetHostPtrRowOrSlicePitchForMapIsCalledWithMipLevelNonZeroThenReturnedScaledWidthTimesBytesPerPixelAndRowPitchTimesScaledHeightCannotBeZero) { +GEN8TEST_F(gen8ImageTests, WhenGetHostPtrRowOrSlicePitchForMapIsCalledOnMipMappedImageWithMipLevelNonZeroThenReturnScaledWidthTimesBytesPerPixelAndRowPitchTimesScaledHeightCannotBeZero) { MockContext context; cl_image_desc imageDesc{}; imageDesc.image_type = CL_MEM_OBJECT_IMAGE3D; @@ -90,3 +90,19 @@ GEN8TEST_F(gen8ImageTests, WhenGetHostPtrRowOrSlicePitchForMapIsCalledWithMipLev EXPECT_EQ(4u, rowPitch); EXPECT_EQ(rowPitch, slicePitch); } + +GEN8TEST_F(gen8ImageTests, WhenGetHostPtrRowOrSlicePitchForMapIsCalledOnNonMipMappedImageThenReturnRowPitchAndSlicePitch) { + MockContext context; + cl_image_desc imageDesc{}; + imageDesc.image_type = CL_MEM_OBJECT_IMAGE3D; + imageDesc.image_width = 5; + imageDesc.image_height = 5; + imageDesc.image_depth = 5; + imageDesc.num_mip_levels = 0; + + std::unique_ptr image(ImageHelper::create(&context, &imageDesc)); + auto rowPitch = image->getHostPtrRowPitchForMap(0u); + auto slicePitch = image->getHostPtrSlicePitchForMap(0u); + EXPECT_EQ(image->getHostPtrRowPitch(), rowPitch); + EXPECT_EQ(image->getHostPtrSlicePitch(), slicePitch); +}