From 09c1d474c9cc119aebc905a98d7498d0ee0512c1 Mon Sep 17 00:00:00 2001 From: Maciej Plewka Date: Wed, 6 Sep 2023 12:04:42 +0000 Subject: [PATCH] fix: adjust depth limitations for images Related-To: NEO-8239, HSD-14019991752 Signed-off-by: Maciej Plewka --- level_zero/core/source/image/image_hw.inl | 11 ++++--- opencl/source/mem_obj/image.cpp | 5 +++ opencl/source/mem_obj/image.h | 2 ++ opencl/source/mem_obj/image.inl | 16 ++++++--- .../windows/d3d_sharing_functions.h | 5 +++ opencl/source/sharings/d3d/d3d_texture.cpp | 8 ++++- .../unit_test/d3d_sharing/d3d_tests_part2.cpp | 33 ++++++++++++++++++- opencl/test/unit_test/mem_obj/image_tests.cpp | 13 ++++++++ opencl/test/unit_test/mocks/mock_image.h | 3 +- .../command_container/command_encoder.inl | 4 +++ .../command_container/encode_surface_state.h | 1 + shared/source/image/image_surface_state.h | 11 ++++--- .../command_encoder_tests.cpp | 14 +++++++- .../image/image_surface_state_tests.cpp | 23 ++++++++----- 14 files changed, 123 insertions(+), 26 deletions(-) diff --git a/level_zero/core/source/image/image_hw.inl b/level_zero/core/source/image/image_hw.inl index 374a2da1fe..309703f0ff 100644 --- a/level_zero/core/source/image/image_hw.inl +++ b/level_zero/core/source/image/image_hw.inl @@ -121,12 +121,12 @@ ze_result_t ImageCoreFamily::initialize(Device *device, const ze_ { surfaceState = GfxFamily::cmdInitRenderSurfaceState; - + uint32_t minArrayElement, renderTargetViewExtent, depth; NEO::setImageSurfaceState(&surfaceState, imgInfo, gmm, *gmmHelper, __GMM_NO_CUBE_MAP, this->allocation->getGpuAddress(), surfaceOffsets, - isMediaFormatLayout); + isMediaFormatLayout, minArrayElement, renderTargetViewExtent); - NEO::setImageSurfaceStateDimensions(&surfaceState, imgInfo, __GMM_NO_CUBE_MAP, surfaceType); + NEO::setImageSurfaceStateDimensions(&surfaceState, imgInfo, __GMM_NO_CUBE_MAP, surfaceType, depth); surfaceState.setSurfaceMinLod(0u); surfaceState.setMipCountLod(0u); NEO::setMipTailStartLod(&surfaceState, gmm); @@ -167,11 +167,12 @@ ze_result_t ImageCoreFamily::initialize(Device *device, const ze_ imgInfoRedescirebed.qPitch = imgInfo.qPitch; redescribedSurfaceState = GfxFamily::cmdInitRenderSurfaceState; + uint32_t minArrayElement, renderTargetViewExtent, depth; NEO::setImageSurfaceState(&redescribedSurfaceState, imgInfoRedescirebed, gmm, *gmmHelper, __GMM_NO_CUBE_MAP, this->allocation->getGpuAddress(), surfaceOffsets, - desc->format.layout == ZE_IMAGE_FORMAT_LAYOUT_NV12); + desc->format.layout == ZE_IMAGE_FORMAT_LAYOUT_NV12, minArrayElement, renderTargetViewExtent); - NEO::setImageSurfaceStateDimensions(&redescribedSurfaceState, imgInfoRedescirebed, __GMM_NO_CUBE_MAP, surfaceType); + NEO::setImageSurfaceStateDimensions(&redescribedSurfaceState, imgInfoRedescirebed, __GMM_NO_CUBE_MAP, surfaceType, depth); redescribedSurfaceState.setSurfaceMinLod(0u); redescribedSurfaceState.setMipCountLod(0u); NEO::setMipTailStartLod(&redescribedSurfaceState, gmm); diff --git a/opencl/source/mem_obj/image.cpp b/opencl/source/mem_obj/image.cpp index cf9f872729..4e5f174b3c 100644 --- a/opencl/source/mem_obj/image.cpp +++ b/opencl/source/mem_obj/image.cpp @@ -1664,4 +1664,9 @@ void Image::fillImageRegion(size_t *region) const { region[2] = 1u; } } + +void Image::setAs3DUavOrRtvImage(bool isUavOrRtv) { + is3DUAVOrRTV = isUavOrRtv; +} + } // namespace NEO diff --git a/opencl/source/mem_obj/image.h b/opencl/source/mem_obj/image.h index 34a1ab88c2..3fce093c2a 100644 --- a/opencl/source/mem_obj/image.h +++ b/opencl/source/mem_obj/image.h @@ -205,6 +205,7 @@ class Image : public MemObj { void fillImageRegion(size_t *region) const; static bool validateHandleType(MemoryProperties &memoryProperties, UnifiedSharingMemoryDescription &extMem); + void setAs3DUavOrRtvImage(bool isUavOrRtv); protected: Image(Context *context, @@ -244,6 +245,7 @@ class Image : public MemObj { uint32_t baseMipLevel = 0; uint32_t mipCount = 1; GMM_YUV_PLANE_ENUM plane = GMM_NO_PLANE; + bool is3DUAVOrRTV = false; static bool isValidSingleChannelFormat(const cl_image_format *imageFormat); static bool isValidIntensityFormat(const cl_image_format *imageFormat); diff --git a/opencl/source/mem_obj/image.inl b/opencl/source/mem_obj/image.inl index 3bc53e600c..5d468bbf56 100644 --- a/opencl/source/mem_obj/image.inl +++ b/opencl/source/mem_obj/image.inl @@ -47,7 +47,12 @@ void ImageHw::setImageArg(void *memory, bool setAsMediaBlockImage, ui imgInfo.qPitch = qPitch; imgInfo.surfaceFormat = &getSurfaceFormatInfo().surfaceFormat; - setImageSurfaceState(surfaceState, imgInfo, graphicsAllocation->getDefaultGmm(), *gmmHelper, cubeFaceIndex, graphicsAllocation->getGpuAddress(), surfaceOffsets, isNV12Image(&this->getImageFormat())); + uint32_t renderTargetViewExtent = 0; + uint32_t minArrayElement = 0; + + setImageSurfaceState(surfaceState, imgInfo, graphicsAllocation->getDefaultGmm(), *gmmHelper, cubeFaceIndex, graphicsAllocation->getGpuAddress(), surfaceOffsets, isNV12Image(&this->getImageFormat()), minArrayElement, renderTargetViewExtent); + + uint32_t depth = 0; if (getImageDesc().image_type == CL_MEM_OBJECT_IMAGE1D_BUFFER) { // image1d_buffer is image1d created from buffer. The length of buffer could be larger @@ -55,20 +60,22 @@ void ImageHw::setImageArg(void *memory, bool setAsMediaBlockImage, ui SURFACE_STATE_BUFFER_LENGTH length = {0}; length.length = static_cast(getImageDesc().image_width - 1); + depth = static_cast(length.surfaceState.depth + 1); surfaceState->setWidth(static_cast(length.surfaceState.width + 1)); surfaceState->setHeight(static_cast(length.surfaceState.height + 1)); - surfaceState->setDepth(static_cast(length.surfaceState.depth + 1)); + surfaceState->setDepth(depth); surfaceState->setSurfacePitch(static_cast(getSurfaceFormatInfo().surfaceFormat.imageElementSizeInBytes)); surfaceState->setSurfaceType(RENDER_SURFACE_STATE::SURFACE_TYPE_SURFTYPE_BUFFER); } else { - setImageSurfaceStateDimensions(surfaceState, imgInfo, cubeFaceIndex, surfaceType); + setImageSurfaceStateDimensions(surfaceState, imgInfo, cubeFaceIndex, surfaceType, depth); if (setAsMediaBlockImage) { setWidthForMediaBlockSurfaceState(surfaceState, imgInfo); } } + uint32_t mipCount = this->mipCount > 0 ? this->mipCount - 1 : 0; surfaceState->setSurfaceMinLod(this->baseMipLevel + mipLevel); - surfaceState->setMipCountLod((this->mipCount > 0) ? (this->mipCount - 1) : 0); + surfaceState->setMipCountLod(mipCount); setMipTailStartLod(surfaceState, gmm); cl_channel_order imgChannelOrder = getSurfaceFormatInfo().oclImageFormat.image_channel_order; @@ -101,6 +108,7 @@ void ImageHw::setImageArg(void *memory, bool setAsMediaBlockImage, ui appendSurfaceStateDepthParams(surfaceState, gmm); EncodeSurfaceState::appendImageCompressionParams(surfaceState, graphicsAllocation, gmmHelper, isImageFromBuffer(), this->plane); + EncodeSurfaceState::adjustDepthLimitations(surfaceState, minArrayElement, renderTargetViewExtent, depth, mipCount, is3DUAVOrRTV); appendSurfaceStateParams(surfaceState, rootDeviceIndex, useGlobalAtomics); appendSurfaceStateExt(surfaceState); } diff --git a/opencl/source/os_interface/windows/d3d_sharing_functions.h b/opencl/source/os_interface/windows/d3d_sharing_functions.h index 6cbfd8c18d..63bbea66d4 100644 --- a/opencl/source/os_interface/windows/d3d_sharing_functions.h +++ b/opencl/source/os_interface/windows/d3d_sharing_functions.h @@ -69,6 +69,11 @@ enum D3DResourceFlags { MISC_SHARED_NTHANDLE = 2048 }; +enum D3DBindFLags { + D3D11_BIND_RENDER_TARGET = 0x20L, + D3D11_BIND_UNORDERED_ACCESS = 0x80L, +}; + template class D3DSharingFunctions : public SharingFunctions { typedef typename D3D::D3DDevice D3DDevice; diff --git a/opencl/source/sharings/d3d/d3d_texture.cpp b/opencl/source/sharings/d3d/d3d_texture.cpp index b8ed1712b4..3507587b56 100644 --- a/opencl/source/sharings/d3d/d3d_texture.cpp +++ b/opencl/source/sharings/d3d/d3d_texture.cpp @@ -194,6 +194,10 @@ Image *D3DTexture::create3d(Context *context, D3DTexture3d *d3dTexture, cl_ return nullptr; } } + bool is3DUavOrRtv = false; + if (textureDesc.BindFlags & D3DBindFLags::D3D11_BIND_RENDER_TARGET || textureDesc.BindFlags & D3DBindFLags::D3D11_BIND_UNORDERED_ACCESS) { + is3DUavOrRtv = true; + } if (alloc == nullptr) { err.set(CL_OUT_OF_HOST_MEMORY); return nullptr; @@ -219,7 +223,9 @@ Image *D3DTexture::create3d(Context *context, D3DTexture3d *d3dTexture, cl_ auto multiGraphicsAllocation = MultiGraphicsAllocation(rootDeviceIndex); multiGraphicsAllocation.addAllocation(alloc); - return Image::createSharedImage(context, d3dTextureObj, mcsSurfaceInfo, std::move(multiGraphicsAllocation), nullptr, flags, 0, clSurfaceFormat, imgInfo, __GMM_NO_CUBE_MAP, 0, 0); + auto image = Image::createSharedImage(context, d3dTextureObj, mcsSurfaceInfo, std::move(multiGraphicsAllocation), nullptr, flags, 0, clSurfaceFormat, imgInfo, __GMM_NO_CUBE_MAP, 0, 0); + image->setAs3DUavOrRtvImage(is3DUavOrRtv); + return image; } template diff --git a/opencl/test/unit_test/d3d_sharing/d3d_tests_part2.cpp b/opencl/test/unit_test/d3d_sharing/d3d_tests_part2.cpp index b4c9c1f9b2..ee8cefd43d 100644 --- a/opencl/test/unit_test/d3d_sharing/d3d_tests_part2.cpp +++ b/opencl/test/unit_test/d3d_sharing/d3d_tests_part2.cpp @@ -19,6 +19,7 @@ #include "opencl/source/sharings/d3d/d3d_surface.h" #include "opencl/source/sharings/d3d/d3d_texture.h" #include "opencl/test/unit_test/fixtures/d3d_test_fixture.h" +#include "opencl/test/unit_test/mocks/mock_image.h" #include "gtest/gtest.h" @@ -353,6 +354,33 @@ TYPED_TEST_P(D3DTests, givenSharedNtHandleFlagWhenCreate3dTextureThenGetNtHandle EXPECT_EQ(1u, this->mockSharingFcns->getSharedNTHandleCalled); } +TYPED_TEST_P(D3DTests, givenTextureDescWhenUnorderedAccessViewEnabledThenIsUavOrRtvIsSet) { + this->mockSharingFcns->mockTexture3dDesc.BindFlags |= D3DBindFLags::D3D11_BIND_UNORDERED_ACCESS; + this->mockSharingFcns->getTexture3dDescSetParams = true; + this->mockSharingFcns->getTexture3dDescParamsSet.textureDesc = this->mockSharingFcns->mockTexture3dDesc; + + auto image = std::unique_ptr(D3DTexture::create3d(this->context, reinterpret_cast(&this->dummyD3DTexture), CL_MEM_READ_WRITE, 1, nullptr)); + EXPECT_TRUE(reinterpret_cast(image.get())->is3DUAVOrRTV); +} + +TYPED_TEST_P(D3DTests, givenTextureDescWhenRenderTargetViewEnabledThenIsUavOrRtvIsSet) { + this->mockSharingFcns->mockTexture3dDesc.BindFlags |= D3DBindFLags::D3D11_BIND_RENDER_TARGET; + this->mockSharingFcns->getTexture3dDescSetParams = true; + this->mockSharingFcns->getTexture3dDescParamsSet.textureDesc = this->mockSharingFcns->mockTexture3dDesc; + + auto image = std::unique_ptr(D3DTexture::create3d(this->context, reinterpret_cast(&this->dummyD3DTexture), CL_MEM_READ_WRITE, 1, nullptr)); + EXPECT_TRUE(reinterpret_cast(image.get())->is3DUAVOrRTV); +} + +TYPED_TEST_P(D3DTests, givenTextureDescWhenBindFlagsEqZeroThenIsUavOrRtvIsNotSet) { + this->mockSharingFcns->mockTexture3dDesc.BindFlags = 0; + this->mockSharingFcns->getTexture3dDescSetParams = true; + this->mockSharingFcns->getTexture3dDescParamsSet.textureDesc = this->mockSharingFcns->mockTexture3dDesc; + + auto image = std::unique_ptr(D3DTexture::create3d(this->context, reinterpret_cast(&this->dummyD3DTexture), CL_MEM_READ_WRITE, 1, nullptr)); + EXPECT_FALSE(reinterpret_cast(image.get())->is3DUAVOrRTV); +} + TYPED_TEST_P(D3DTests, WhenFillingBufferDescThenBufferContentIsCorrect) { D3DBufferDesc requestedDesc = {}; D3DBufferDesc expectedDesc = {}; @@ -702,7 +730,10 @@ REGISTER_TYPED_TEST_CASE_P(D3DTests, givenSharedObjectAndNTHandleAndAllocationFailedWhen3dCreatedThenReturnCorrectCode, givenFormatNotSupportedByDxWhenGettingSupportedFormatsThenOnlySupportedFormatsAreReturned, givenUnsupportedFormatWhenCreatingTexture2dThenInvalidImageFormatDescriptorIsReturned, - givenUnsupportedFormatWhenCreatingTexture3dThenInvalidImageFormatDescriptorIsReturned); + givenUnsupportedFormatWhenCreatingTexture3dThenInvalidImageFormatDescriptorIsReturned, + givenTextureDescWhenUnorderedAccessViewEnabledThenIsUavOrRtvIsSet, + givenTextureDescWhenRenderTargetViewEnabledThenIsUavOrRtvIsSet, + givenTextureDescWhenBindFlagsEqZeroThenIsUavOrRtvIsNotSet); INSTANTIATE_TYPED_TEST_CASE_P(D3DSharingTests, D3DTests, D3DTypes); diff --git a/opencl/test/unit_test/mem_obj/image_tests.cpp b/opencl/test/unit_test/mem_obj/image_tests.cpp index 54f6190872..3b26854dd0 100644 --- a/opencl/test/unit_test/mem_obj/image_tests.cpp +++ b/opencl/test/unit_test/mem_obj/image_tests.cpp @@ -32,6 +32,7 @@ #include "opencl/test/unit_test/fixtures/multi_root_device_fixture.h" #include "opencl/test/unit_test/mem_obj/image_compression_fixture.h" #include "opencl/test/unit_test/mocks/mock_context.h" +#include "opencl/test/unit_test/mocks/mock_image.h" #include "opencl/test/unit_test/mocks/mock_platform.h" using namespace NEO; @@ -1882,3 +1883,15 @@ HWTEST2_F(MultiRootDeviceImageTest, givenHostPtrToCopyWhenImageIsCreatedWithMult EXPECT_EQ(1u, image->getMultiGraphicsAllocation().getMigrationSyncData()->getCurrentLocation()); } } + +TEST(ImageTest, givenImageWhenTruePassedToSet3DUavOrRtvThenValueInImageIsSetToTrue) { + MockImageBase img; + img.setAs3DUavOrRtvImage(true); + EXPECT_TRUE(img.is3DUAVOrRTV); +} + +TEST(ImageTest, givenImageWhenFalsePassedToSet3DUavOrRtvThenValueInImageIsSetToFalse) { + MockImageBase img; + img.setAs3DUavOrRtvImage(false); + EXPECT_FALSE(img.is3DUAVOrRTV); +} \ No newline at end of file diff --git a/opencl/test/unit_test/mocks/mock_image.h b/opencl/test/unit_test/mocks/mock_image.h index b1ae852b72..9599715f6f 100644 --- a/opencl/test/unit_test/mocks/mock_image.h +++ b/opencl/test/unit_test/mocks/mock_image.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2021 Intel Corporation + * Copyright (C) 2018-2023 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -18,6 +18,7 @@ namespace NEO { struct MockImageBase : public Image { using Image::imageDesc; using Image::imageFormat; + using Image::is3DUAVOrRTV; MockGraphicsAllocation *graphicsAllocation = nullptr; MockImageBase(uint32_t rootDeviceIndex) diff --git a/shared/source/command_container/command_encoder.inl b/shared/source/command_container/command_encoder.inl index fc8a354986..5829b207e6 100644 --- a/shared/source/command_container/command_encoder.inl +++ b/shared/source/command_container/command_encoder.inl @@ -537,6 +537,10 @@ template void EncodeSurfaceState::appendParamsForImageFromBuffer(R_SURFACE_STATE *surfaceState) { } +template +void EncodeSurfaceState::adjustDepthLimitations(R_SURFACE_STATE *surfaceState, uint32_t minArrayElement, uint32_t renderTargetViewExtent, uint32_t depth, uint32_t mipCount, bool is3DUavOrRtv) { +} + template void EncodeSurfaceState::encodeImplicitScalingParams(const EncodeSurfaceStateArgs &args) {} diff --git a/shared/source/command_container/encode_surface_state.h b/shared/source/command_container/encode_surface_state.h index eb08948947..23daeffeda 100644 --- a/shared/source/command_container/encode_surface_state.h +++ b/shared/source/command_container/encode_surface_state.h @@ -59,6 +59,7 @@ struct EncodeSurfaceState { static void setFlagsForMediaCompression(R_SURFACE_STATE *surfaceState, Gmm *gmm); static void disableCompressionFlags(R_SURFACE_STATE *surfaceState); static void appendParamsForImageFromBuffer(R_SURFACE_STATE *surfaceState); + static void adjustDepthLimitations(R_SURFACE_STATE *surfaceState, uint32_t minArrayElement, uint32_t renderTargetViewExtent, uint32_t depth, uint32_t mipCount, bool is3DUavOrRtv); }; } // namespace NEO \ No newline at end of file diff --git a/shared/source/image/image_surface_state.h b/shared/source/image/image_surface_state.h index f50852ce4c..225621b6ba 100644 --- a/shared/source/image/image_surface_state.h +++ b/shared/source/image/image_surface_state.h @@ -16,7 +16,7 @@ namespace NEO { template -inline void setImageSurfaceState(typename GfxFamily::RENDER_SURFACE_STATE *surfaceState, const ImageInfo &imageInfo, Gmm *gmm, GmmHelper &gmmHelper, uint32_t cubeFaceIndex, uint64_t gpuAddress, const SurfaceOffsets &surfaceOffsets, bool isNV12Format) { +inline void setImageSurfaceState(typename GfxFamily::RENDER_SURFACE_STATE *surfaceState, const ImageInfo &imageInfo, Gmm *gmm, GmmHelper &gmmHelper, uint32_t cubeFaceIndex, uint64_t gpuAddress, const SurfaceOffsets &surfaceOffsets, bool isNV12Format, uint32_t &minimumArrayElement, uint32_t &renderTargetViewExtent) { using RENDER_SURFACE_STATE = typename GfxFamily::RENDER_SURFACE_STATE; using SURFACE_FORMAT = typename RENDER_SURFACE_STATE::SURFACE_FORMAT; using AUXILIARY_SURFACE_MODE = typename RENDER_SURFACE_STATE::AUXILIARY_SURFACE_MODE; @@ -32,8 +32,8 @@ inline void setImageSurfaceState(typename GfxFamily::RENDER_SURFACE_STATE *surfa isImageArray |= (imageInfo.imgDesc.imageType == ImageType::Image2D || imageInfo.imgDesc.imageType == ImageType::Image2DArray) && DebugManager.flags.Force2dImageAsArray.get() == 1; - uint32_t renderTargetViewExtent = static_cast(imageCount); - uint32_t minimumArrayElement = 0; + renderTargetViewExtent = static_cast(imageCount); + minimumArrayElement = 0; auto hAlign = RENDER_SURFACE_STATE::SURFACE_HORIZONTAL_ALIGNMENT_HALIGN_DEFAULT; auto vAlign = RENDER_SURFACE_STATE::SURFACE_VERTICAL_ALIGNMENT_VALIGN_4; @@ -92,7 +92,7 @@ inline void setImageSurfaceState(typename GfxFamily::RENDER_SURFACE_STATE *surfa } template -inline void setImageSurfaceStateDimensions(typename GfxFamily::RENDER_SURFACE_STATE *surfaceState, const ImageInfo &imageInfo, uint32_t cubeFaceIndex, typename GfxFamily::RENDER_SURFACE_STATE::SURFACE_TYPE surfaceType) { +inline void setImageSurfaceStateDimensions(typename GfxFamily::RENDER_SURFACE_STATE *surfaceState, const ImageInfo &imageInfo, uint32_t cubeFaceIndex, typename GfxFamily::RENDER_SURFACE_STATE::SURFACE_TYPE surfaceType, uint32_t &depth) { auto imageCount = std::max(imageInfo.imgDesc.imageDepth, imageInfo.imgDesc.imageArraySize); if (imageCount == 0) { imageCount = 1; @@ -112,9 +112,10 @@ inline void setImageSurfaceStateDimensions(typename GfxFamily::RENDER_SURFACE_ST imageCount = __GMM_MAX_CUBE_FACE - cubeFaceIndex; } + depth = static_cast(imageCount); surfaceState->setWidth(static_cast(imageWidth)); surfaceState->setHeight(static_cast(imageHeight)); - surfaceState->setDepth(static_cast(imageCount)); + surfaceState->setDepth(depth); surfaceState->setSurfacePitch(static_cast(imageInfo.imgDesc.imageRowPitch)); surfaceState->setSurfaceType(surfaceType); } diff --git a/shared/test/unit_test/command_container/command_encoder_tests.cpp b/shared/test/unit_test/command_container/command_encoder_tests.cpp index a3dcd89677..470d075ca6 100644 --- a/shared/test/unit_test/command_container/command_encoder_tests.cpp +++ b/shared/test/unit_test/command_container/command_encoder_tests.cpp @@ -295,4 +295,16 @@ HWTEST2_F(CommandEncoderTests, whenForcingLowQualityFilteringAndAppendSamplerSta EXPECT_EQ(SAMPLER_STATE::LOW_QUALITY_FILTER_DISABLE, state.getLowQualityFilter()); productHelper.adjustSamplerState(&state, *defaultHwInfo); EXPECT_EQ(SAMPLER_STATE::LOW_QUALITY_FILTER_ENABLE, state.getLowQualityFilter()); -} \ No newline at end of file +} + +HWTEST_F(CommandEncoderTests, givenSurfaceStateWhenAdjustDepthLimitationsCalledThenSurfaceStateNotChanged) { + typename FamilyType::RENDER_SURFACE_STATE ss; + uint32_t minArrayElement = 1; + uint32_t renderTargetViewExtent = 1; + uint32_t originalDepth = 10; + uint32_t mipCount = 1; + ss.setDepth(originalDepth); + auto origSS = ss; + EncodeSurfaceState::adjustDepthLimitations(&ss, minArrayElement, renderTargetViewExtent, originalDepth, mipCount, true); + EXPECT_EQ(memcmp(&ss, &origSS, sizeof(typename FamilyType::RENDER_SURFACE_STATE)), 0); +} diff --git a/shared/test/unit_test/image/image_surface_state_tests.cpp b/shared/test/unit_test/image/image_surface_state_tests.cpp index fd931b9778..5a42d223d5 100644 --- a/shared/test/unit_test/image/image_surface_state_tests.cpp +++ b/shared/test/unit_test/image/image_surface_state_tests.cpp @@ -39,7 +39,8 @@ HWTEST_F(ImageSurfaceStateTests, givenImageInfoWhenSetImageSurfaceStateThenPrope const uint64_t gpuAddress = 0x000001a78a8a8000; - setImageSurfaceState(castSurfaceState, imageInfo, mockGmm.get(), *gmmHelper, cubeFaceIndex, gpuAddress, surfaceOffsets, true); + uint32_t minArrayElement, renderTargetViewExtent; + setImageSurfaceState(castSurfaceState, imageInfo, mockGmm.get(), *gmmHelper, cubeFaceIndex, gpuAddress, surfaceOffsets, true, minArrayElement, renderTargetViewExtent); using RENDER_SURFACE_STATE = typename FamilyType::RENDER_SURFACE_STATE; using SURFACE_FORMAT = typename RENDER_SURFACE_STATE::SURFACE_FORMAT; @@ -73,7 +74,7 @@ HWTEST_F(ImageSurfaceStateTests, givenImageInfoWhenSetImageSurfaceStateThenPrope surfaceState = std::make_unique(size); castSurfaceState = reinterpret_cast(surfaceState.get()); - setImageSurfaceState(castSurfaceState, imageInfo, nullptr, *gmmHelper, cubeFaceIndex, gpuAddress, surfaceOffsets, false); + setImageSurfaceState(castSurfaceState, imageInfo, nullptr, *gmmHelper, cubeFaceIndex, gpuAddress, surfaceOffsets, false, minArrayElement, renderTargetViewExtent); EXPECT_EQ(castSurfaceState->getSurfaceHorizontalAlignment(), RENDER_SURFACE_STATE::SURFACE_HORIZONTAL_ALIGNMENT_HALIGN_DEFAULT); EXPECT_EQ(castSurfaceState->getSurfaceVerticalAlignment(), RENDER_SURFACE_STATE::SURFACE_VERTICAL_ALIGNMENT_VALIGN_4); @@ -91,7 +92,8 @@ HWTEST_F(ImageSurfaceStateTests, givenImageInfoWhenSetImageSurfaceStateThenPrope castSurfaceState = reinterpret_cast(surfaceState.get()); typename FamilyType::RENDER_SURFACE_STATE::SURFACE_TYPE surfaceType = RENDER_SURFACE_STATE::SURFACE_TYPE::SURFACE_TYPE_SURFTYPE_3D; - setImageSurfaceStateDimensions(castSurfaceState, imageInfo, cubeFaceIndex, surfaceType); + uint32_t depth; + setImageSurfaceStateDimensions(castSurfaceState, imageInfo, cubeFaceIndex, surfaceType, depth); EXPECT_EQ(castSurfaceState->getWidth(), static_cast(imageInfo.imgDesc.imageWidth)); EXPECT_EQ(castSurfaceState->getHeight(), static_cast(imageInfo.imgDesc.imageHeight)); @@ -129,7 +131,8 @@ HWTEST_F(ImageSurfaceStateTests, givenImage2DWhen2dImageWAIsEnabledThenArrayFlag const uint64_t gpuAddress = 0x000001a78a8a8000; - setImageSurfaceState(castSurfaceState, imageInfo, mockGmm.get(), *gmmHelper, cubeFaceIndex, gpuAddress, surfaceOffsets, true); + uint32_t minArrayElement, renderTargetViewExtent; + setImageSurfaceState(castSurfaceState, imageInfo, mockGmm.get(), *gmmHelper, cubeFaceIndex, gpuAddress, surfaceOffsets, true, minArrayElement, renderTargetViewExtent); EXPECT_TRUE(castSurfaceState->getSurfaceArray()); } @@ -151,8 +154,9 @@ HWTEST_F(ImageSurfaceStateTests, givenImage2DWhen2dImageWAIsDisabledThenArrayFla imageInfo.surfaceFormat = &surfaceFormatInfo; const uint64_t gpuAddress = 0x000001a78a8a8000; + uint32_t minArrayElement, renderTargetViewExtent; - setImageSurfaceState(castSurfaceState, imageInfo, mockGmm.get(), *gmmHelper, cubeFaceIndex, gpuAddress, surfaceOffsets, true); + setImageSurfaceState(castSurfaceState, imageInfo, mockGmm.get(), *gmmHelper, cubeFaceIndex, gpuAddress, surfaceOffsets, true, minArrayElement, renderTargetViewExtent); EXPECT_FALSE(castSurfaceState->getSurfaceArray()); } @@ -174,8 +178,9 @@ HWTEST_F(ImageSurfaceStateTests, givenImage2DArrayOfSize1When2dImageWAIsEnabledT imageInfo.surfaceFormat = &surfaceFormatInfo; const uint64_t gpuAddress = 0x000001a78a8a8000; + uint32_t minArrayElement, renderTargetViewExtent; - setImageSurfaceState(castSurfaceState, imageInfo, mockGmm.get(), *gmmHelper, cubeFaceIndex, gpuAddress, surfaceOffsets, true); + setImageSurfaceState(castSurfaceState, imageInfo, mockGmm.get(), *gmmHelper, cubeFaceIndex, gpuAddress, surfaceOffsets, true, minArrayElement, renderTargetViewExtent); EXPECT_TRUE(castSurfaceState->getSurfaceArray()); } @@ -197,8 +202,9 @@ HWTEST_F(ImageSurfaceStateTests, givenImage2DArrayOfSize1When2dImageWAIsDisabled imageInfo.surfaceFormat = &surfaceFormatInfo; const uint64_t gpuAddress = 0x000001a78a8a8000; + uint32_t minArrayElement, renderTargetViewExtent; - setImageSurfaceState(castSurfaceState, imageInfo, mockGmm.get(), *gmmHelper, cubeFaceIndex, gpuAddress, surfaceOffsets, true); + setImageSurfaceState(castSurfaceState, imageInfo, mockGmm.get(), *gmmHelper, cubeFaceIndex, gpuAddress, surfaceOffsets, true, minArrayElement, renderTargetViewExtent); EXPECT_FALSE(castSurfaceState->getSurfaceArray()); } @@ -220,8 +226,9 @@ HWTEST_F(ImageSurfaceStateTests, givenImage1DWhen2dImageWAIsEnabledThenArrayFlag imageInfo.surfaceFormat = &surfaceFormatInfo; const uint64_t gpuAddress = 0x000001a78a8a8000; + uint32_t minArrayElement, renderTargetViewExtent; - setImageSurfaceState(castSurfaceState, imageInfo, mockGmm.get(), *gmmHelper, cubeFaceIndex, gpuAddress, surfaceOffsets, true); + setImageSurfaceState(castSurfaceState, imageInfo, mockGmm.get(), *gmmHelper, cubeFaceIndex, gpuAddress, surfaceOffsets, true, minArrayElement, renderTargetViewExtent); EXPECT_FALSE(castSurfaceState->getSurfaceArray()); }