diff --git a/Gems/Atom/RPI/Code/Tests/Image/StreamingImageTests.cpp b/Gems/Atom/RPI/Code/Tests/Image/StreamingImageTests.cpp index f7476c0bc4..f90702d948 100644 --- a/Gems/Atom/RPI/Code/Tests/Image/StreamingImageTests.cpp +++ b/Gems/Atom/RPI/Code/Tests/Image/StreamingImageTests.cpp @@ -433,12 +433,12 @@ namespace UnitTest return poolAsset; } - AZ::Data::Asset BuildTestImage() + AZ::Data::Asset BuildTestImage(AZ::RHI::Format format = AZ::RHI::Format::R8G8B8A8_UNORM) { using namespace AZ; const uint32_t arraySize = 2; - const uint32_t pixelSize = 4; + const uint32_t pixelSize = RHI::GetFormatSize(format); const uint32_t mipCountHead = 1; const uint32_t mipCountMiddle = 2; const uint32_t mipCountTail = 3; @@ -453,7 +453,7 @@ namespace UnitTest RPI::StreamingImageAssetCreator assetCreator; assetCreator.Begin(Data::AssetId(Uuid::CreateRandom())); - RHI::ImageDescriptor imageDesc = RHI::ImageDescriptor::Create2DArray(RHI::ImageBindFlags::ShaderRead, imageWidth, imageHeight, arraySize, RHI::Format::R8G8B8A8_UNORM); + RHI::ImageDescriptor imageDesc = RHI::ImageDescriptor::Create2DArray(RHI::ImageBindFlags::ShaderRead, imageWidth, imageHeight, arraySize, format); imageDesc.m_mipLevels = static_cast(mipCountTotal); assetCreator.SetImageDescriptor(imageDesc); @@ -726,4 +726,41 @@ namespace UnitTest RPI::ImageSystemInterface::Get()->Update(); } + + TEST_F(StreamingImageTests, GetSubImagePixelValues) + { + using namespace AZ; + + Data::Asset imageAsset = BuildTestImage(AZ::RHI::Format::R8_UNORM); + + auto streamingImageAsset = imageAsset.Get(); + EXPECT_NE(streamingImageAsset, nullptr); + + // Validate retrieving one pixel at a time + auto size = streamingImageAsset->GetImageDescriptor().m_size; + for (uint32_t y = 0; y < size.m_height; ++y) + { + for (uint32_t x = 0; x < size.m_width; ++x) + { + auto pixelDataValue = imageAsset->GetSubImagePixelValue(x, y); + auto pixelExpectedValue = static_cast(y * size.m_width + x) / static_cast(std::numeric_limits::max()); + + EXPECT_TRUE(AZ::IsClose(pixelDataValue, pixelExpectedValue)); + } + } + + // Validate retrieving a region of pixels + AZStd::vector pixelValues(size.m_width * size.m_height); + auto topLeft = AZStd::make_pair(0, 0); + auto bottomRight = AZStd::make_pair(size.m_width - 1, size.m_height - 1); + AZStd::span valueSpan(pixelValues.begin(), pixelValues.size()); + streamingImageAsset->GetSubImagePixelValues(topLeft, bottomRight, valueSpan); + for (uint32_t index = 0; index < pixelValues.size(); ++index) + { + auto pixelDataValue = valueSpan[index]; + auto pixelExpectedValue = static_cast(index) / static_cast(std::numeric_limits::max()); + + EXPECT_TRUE(AZ::IsClose(pixelDataValue, pixelExpectedValue)); + } + } }