summaryrefslogtreecommitdiff
path: root/tools/gfx-unit-test/gfx-test-texture-util.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/gfx-unit-test/gfx-test-texture-util.cpp')
-rw-r--r--tools/gfx-unit-test/gfx-test-texture-util.cpp418
1 files changed, 211 insertions, 207 deletions
diff --git a/tools/gfx-unit-test/gfx-test-texture-util.cpp b/tools/gfx-unit-test/gfx-test-texture-util.cpp
index 21e82ab22..a4f86d1d8 100644
--- a/tools/gfx-unit-test/gfx-test-texture-util.cpp
+++ b/tools/gfx-unit-test/gfx-test-texture-util.cpp
@@ -1,15 +1,15 @@
#include "gfx-test-texture-util.h"
-#include "gfx-test-util.h"
-#include "tools/unit-test/slang-unit-test.h"
+#include "gfx-test-util.h"
#include "slang-com-ptr.h"
+#include "tools/unit-test/slang-unit-test.h"
-#include <stdlib.h>
#include <stdio.h>
+#include <stdlib.h>
#ifdef _MSC_VER
#pragma warning(push)
-#pragma warning(disable: 4996)
+#pragma warning(disable : 4996)
#endif
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "external/stb/stb_image_write.h"
@@ -20,8 +20,9 @@
#define GFX_ENABLE_RENDERDOC_INTEGRATION 0
#if GFX_ENABLE_RENDERDOC_INTEGRATION
-# include "external/renderdoc_app.h"
-# include <windows.h>
+#include "external/renderdoc_app.h"
+
+#include <windows.h>
#endif
using namespace Slang;
@@ -29,232 +30,235 @@ using namespace gfx;
namespace gfx_test
{
- TextureAspect getTextureAspect(Format format)
+TextureAspect getTextureAspect(Format format)
+{
+ switch (format)
{
- switch (format)
- {
- case Format::D16_UNORM:
- case Format::D32_FLOAT:
- return TextureAspect::Depth;
- default:
- return TextureAspect::Color;
- }
+ case Format::D16_UNORM:
+ case Format::D32_FLOAT: return TextureAspect::Depth;
+ default: return TextureAspect::Color;
}
+}
- Size getTexelSize(Format format)
- {
- FormatInfo info;
- GFX_CHECK_CALL_ABORT(gfxGetFormatInfo(format, &info));
- return info.blockSizeInBytes / info.pixelsPerBlock;
- }
+Size getTexelSize(Format format)
+{
+ FormatInfo info;
+ GFX_CHECK_CALL_ABORT(gfxGetFormatInfo(format, &info));
+ return info.blockSizeInBytes / info.pixelsPerBlock;
+}
- GfxIndex getSubresourceIndex(GfxIndex mipLevel, GfxCount mipLevelCount, GfxIndex baseArrayLayer)
- {
- return baseArrayLayer * mipLevelCount + mipLevel;
- }
+GfxIndex getSubresourceIndex(GfxIndex mipLevel, GfxCount mipLevelCount, GfxIndex baseArrayLayer)
+{
+ return baseArrayLayer * mipLevelCount + mipLevel;
+}
- RefPtr<ValidationTextureFormatBase> getValidationTextureFormat(Format format)
+RefPtr<ValidationTextureFormatBase> getValidationTextureFormat(Format format)
+{
+ switch (format)
{
- switch (format)
- {
- case Format::R32G32B32A32_TYPELESS: return new ValidationTextureFormat<uint32_t>(4);
- case Format::R32G32B32_TYPELESS: return new ValidationTextureFormat<uint32_t>(3);
- case Format::R32G32_TYPELESS: return new ValidationTextureFormat<uint32_t>(2);
- case Format::R32_TYPELESS: return new ValidationTextureFormat<uint32_t>(1);
-
- case Format::R16G16B16A16_TYPELESS: return new ValidationTextureFormat<uint16_t>(4);
- case Format::R16G16_TYPELESS: return new ValidationTextureFormat<uint16_t>(2);
- case Format::R16_TYPELESS: return new ValidationTextureFormat<uint16_t>(1);
-
- case Format::R8G8B8A8_TYPELESS: return new ValidationTextureFormat<uint8_t>(4);
- case Format::R8G8_TYPELESS: return new ValidationTextureFormat<uint8_t>(2);
- case Format::R8_TYPELESS: return new ValidationTextureFormat<uint8_t>(1);
- case Format::B8G8R8A8_TYPELESS: return new ValidationTextureFormat<uint8_t>(4);
-
- case Format::R32G32B32A32_FLOAT: return new ValidationTextureFormat<float>(4);
- case Format::R32G32B32_FLOAT: return new ValidationTextureFormat<float>(3);
- case Format::R32G32_FLOAT: return new ValidationTextureFormat<float>(2);
- case Format::R32_FLOAT: return new ValidationTextureFormat<float>(1);
-
- case Format::R16G16B16A16_FLOAT: return new ValidationTextureFormat<uint16_t>(4);
- case Format::R16G16_FLOAT: return new ValidationTextureFormat<uint16_t>(2);
- case Format::R16_FLOAT: return new ValidationTextureFormat<uint16_t>(1);
-
- case Format::R64_UINT: return new ValidationTextureFormat<uint64_t>(1);
-
- case Format::R32G32B32A32_UINT: return new ValidationTextureFormat<uint32_t>(4);
- case Format::R32G32B32_UINT: return new ValidationTextureFormat<uint32_t>(3);
- case Format::R32G32_UINT: return new ValidationTextureFormat<uint32_t>(2);
- case Format::R32_UINT: return new ValidationTextureFormat<uint32_t>(1);
-
- case Format::R16G16B16A16_UINT: return new ValidationTextureFormat<uint16_t>(4);
- case Format::R16G16_UINT: return new ValidationTextureFormat<uint16_t>(2);
- case Format::R16_UINT: return new ValidationTextureFormat<uint16_t>(1);
-
- case Format::R8G8B8A8_UINT: return new ValidationTextureFormat<uint8_t>(4);
- case Format::R8G8_UINT: return new ValidationTextureFormat<uint8_t>(2);
- case Format::R8_UINT: return new ValidationTextureFormat<uint8_t>(1);
-
- case Format::R64_SINT: return new ValidationTextureFormat<int64_t>(1);
-
- case Format::R32G32B32A32_SINT: return new ValidationTextureFormat<int32_t>(4);
- case Format::R32G32B32_SINT: return new ValidationTextureFormat<int32_t>(3);
- case Format::R32G32_SINT: return new ValidationTextureFormat<int32_t>(2);
- case Format::R32_SINT: return new ValidationTextureFormat<int32_t>(1);
-
- case Format::R16G16B16A16_SINT: return new ValidationTextureFormat<int16_t>(4);
- case Format::R16G16_SINT: return new ValidationTextureFormat<int16_t>(2);
- case Format::R16_SINT: return new ValidationTextureFormat<int16_t>(1);
-
- case Format::R8G8B8A8_SINT: return new ValidationTextureFormat<int8_t>(4);
- case Format::R8G8_SINT: return new ValidationTextureFormat<int8_t>(2);
- case Format::R8_SINT: return new ValidationTextureFormat<int8_t>(1);
-
- case Format::R16G16B16A16_UNORM: return new ValidationTextureFormat<uint16_t>(4);
- case Format::R16G16_UNORM: return new ValidationTextureFormat<uint16_t>(2);
- case Format::R16_UNORM: return new ValidationTextureFormat<uint16_t>(1);
-
- case Format::R8G8B8A8_UNORM: return new ValidationTextureFormat<uint8_t>(4);
- case Format::R8G8B8A8_UNORM_SRGB: return new ValidationTextureFormat<uint8_t>(4);
- case Format::R8G8_UNORM: return new ValidationTextureFormat<uint8_t>(2);
- case Format::R8_UNORM: return new ValidationTextureFormat<uint8_t>(1);
- case Format::B8G8R8A8_UNORM: return new ValidationTextureFormat<uint8_t>(4);
- case Format::B8G8R8A8_UNORM_SRGB: return new ValidationTextureFormat<uint8_t>(4);
- case Format::B8G8R8X8_UNORM: return new ValidationTextureFormat<uint8_t>(3);
- case Format::B8G8R8X8_UNORM_SRGB: return new ValidationTextureFormat<uint8_t>(3);
-
- case Format::R16G16B16A16_SNORM: return new ValidationTextureFormat<int16_t>(4);
- case Format::R16G16_SNORM: return new ValidationTextureFormat<int16_t>(2);
- case Format::R16_SNORM: return new ValidationTextureFormat<int16_t>(1);
-
- case Format::R8G8B8A8_SNORM: return new ValidationTextureFormat<int8_t>(4);
- case Format::R8G8_SNORM: return new ValidationTextureFormat<int8_t>(2);
- case Format::R8_SNORM: return new ValidationTextureFormat<int8_t>(1);
-
- case Format::D32_FLOAT: return new ValidationTextureFormat<float>(1);
- case Format::D16_UNORM: return new ValidationTextureFormat<uint16_t>(1);
-
- case Format::B4G4R4A4_UNORM: return new PackedValidationTextureFormat<uint16_t>(4, 4, 4, 4);
- case Format::B5G6R5_UNORM: return new PackedValidationTextureFormat<uint16_t>(5, 6, 5, 0);
- case Format::B5G5R5A1_UNORM: return new PackedValidationTextureFormat<uint16_t>(5, 5, 5, 1);
-
- case Format::R9G9B9E5_SHAREDEXP: return new ValidationTextureFormat<uint32_t>(1);
- case Format::R10G10B10A2_TYPELESS: return new PackedValidationTextureFormat<uint32_t>(10, 10, 10, 2);
- case Format::R10G10B10A2_UNORM: return new PackedValidationTextureFormat<uint32_t>(10, 10, 10, 2);
- case Format::R10G10B10A2_UINT: return new PackedValidationTextureFormat<uint32_t>(10, 10, 10, 2);
- case Format::R11G11B10_FLOAT: return new PackedValidationTextureFormat<uint32_t>(11, 11, 10, 0);
-
- // TODO: Add testing support for BC formats
-// BC1_UNORM,
-// BC1_UNORM_SRGB,
-// BC2_UNORM,
-// BC2_UNORM_SRGB,
-// BC3_UNORM,
-// BC3_UNORM_SRGB,
-// BC4_UNORM,
-// BC4_SNORM,
-// BC5_UNORM,
-// BC5_SNORM,
-// BC6H_UF16,
-// BC6H_SF16,
-// BC7_UNORM,
-// BC7_UNORM_SRGB,
- default:
- return nullptr;
- }
+ case Format::R32G32B32A32_TYPELESS: return new ValidationTextureFormat<uint32_t>(4);
+ case Format::R32G32B32_TYPELESS: return new ValidationTextureFormat<uint32_t>(3);
+ case Format::R32G32_TYPELESS: return new ValidationTextureFormat<uint32_t>(2);
+ case Format::R32_TYPELESS: return new ValidationTextureFormat<uint32_t>(1);
+
+ case Format::R16G16B16A16_TYPELESS: return new ValidationTextureFormat<uint16_t>(4);
+ case Format::R16G16_TYPELESS: return new ValidationTextureFormat<uint16_t>(2);
+ case Format::R16_TYPELESS: return new ValidationTextureFormat<uint16_t>(1);
+
+ case Format::R8G8B8A8_TYPELESS: return new ValidationTextureFormat<uint8_t>(4);
+ case Format::R8G8_TYPELESS: return new ValidationTextureFormat<uint8_t>(2);
+ case Format::R8_TYPELESS: return new ValidationTextureFormat<uint8_t>(1);
+ case Format::B8G8R8A8_TYPELESS: return new ValidationTextureFormat<uint8_t>(4);
+
+ case Format::R32G32B32A32_FLOAT: return new ValidationTextureFormat<float>(4);
+ case Format::R32G32B32_FLOAT: return new ValidationTextureFormat<float>(3);
+ case Format::R32G32_FLOAT: return new ValidationTextureFormat<float>(2);
+ case Format::R32_FLOAT: return new ValidationTextureFormat<float>(1);
+
+ case Format::R16G16B16A16_FLOAT: return new ValidationTextureFormat<uint16_t>(4);
+ case Format::R16G16_FLOAT: return new ValidationTextureFormat<uint16_t>(2);
+ case Format::R16_FLOAT: return new ValidationTextureFormat<uint16_t>(1);
+
+ case Format::R64_UINT: return new ValidationTextureFormat<uint64_t>(1);
+
+ case Format::R32G32B32A32_UINT: return new ValidationTextureFormat<uint32_t>(4);
+ case Format::R32G32B32_UINT: return new ValidationTextureFormat<uint32_t>(3);
+ case Format::R32G32_UINT: return new ValidationTextureFormat<uint32_t>(2);
+ case Format::R32_UINT: return new ValidationTextureFormat<uint32_t>(1);
+
+ case Format::R16G16B16A16_UINT: return new ValidationTextureFormat<uint16_t>(4);
+ case Format::R16G16_UINT: return new ValidationTextureFormat<uint16_t>(2);
+ case Format::R16_UINT: return new ValidationTextureFormat<uint16_t>(1);
+
+ case Format::R8G8B8A8_UINT: return new ValidationTextureFormat<uint8_t>(4);
+ case Format::R8G8_UINT: return new ValidationTextureFormat<uint8_t>(2);
+ case Format::R8_UINT: return new ValidationTextureFormat<uint8_t>(1);
+
+ case Format::R64_SINT: return new ValidationTextureFormat<int64_t>(1);
+
+ case Format::R32G32B32A32_SINT: return new ValidationTextureFormat<int32_t>(4);
+ case Format::R32G32B32_SINT: return new ValidationTextureFormat<int32_t>(3);
+ case Format::R32G32_SINT: return new ValidationTextureFormat<int32_t>(2);
+ case Format::R32_SINT: return new ValidationTextureFormat<int32_t>(1);
+
+ case Format::R16G16B16A16_SINT: return new ValidationTextureFormat<int16_t>(4);
+ case Format::R16G16_SINT: return new ValidationTextureFormat<int16_t>(2);
+ case Format::R16_SINT: return new ValidationTextureFormat<int16_t>(1);
+
+ case Format::R8G8B8A8_SINT: return new ValidationTextureFormat<int8_t>(4);
+ case Format::R8G8_SINT: return new ValidationTextureFormat<int8_t>(2);
+ case Format::R8_SINT: return new ValidationTextureFormat<int8_t>(1);
+
+ case Format::R16G16B16A16_UNORM: return new ValidationTextureFormat<uint16_t>(4);
+ case Format::R16G16_UNORM: return new ValidationTextureFormat<uint16_t>(2);
+ case Format::R16_UNORM: return new ValidationTextureFormat<uint16_t>(1);
+
+ case Format::R8G8B8A8_UNORM: return new ValidationTextureFormat<uint8_t>(4);
+ case Format::R8G8B8A8_UNORM_SRGB: return new ValidationTextureFormat<uint8_t>(4);
+ case Format::R8G8_UNORM: return new ValidationTextureFormat<uint8_t>(2);
+ case Format::R8_UNORM: return new ValidationTextureFormat<uint8_t>(1);
+ case Format::B8G8R8A8_UNORM: return new ValidationTextureFormat<uint8_t>(4);
+ case Format::B8G8R8A8_UNORM_SRGB: return new ValidationTextureFormat<uint8_t>(4);
+ case Format::B8G8R8X8_UNORM: return new ValidationTextureFormat<uint8_t>(3);
+ case Format::B8G8R8X8_UNORM_SRGB: return new ValidationTextureFormat<uint8_t>(3);
+
+ case Format::R16G16B16A16_SNORM: return new ValidationTextureFormat<int16_t>(4);
+ case Format::R16G16_SNORM: return new ValidationTextureFormat<int16_t>(2);
+ case Format::R16_SNORM: return new ValidationTextureFormat<int16_t>(1);
+
+ case Format::R8G8B8A8_SNORM: return new ValidationTextureFormat<int8_t>(4);
+ case Format::R8G8_SNORM: return new ValidationTextureFormat<int8_t>(2);
+ case Format::R8_SNORM: return new ValidationTextureFormat<int8_t>(1);
+
+ case Format::D32_FLOAT: return new ValidationTextureFormat<float>(1);
+ case Format::D16_UNORM: return new ValidationTextureFormat<uint16_t>(1);
+
+ case Format::B4G4R4A4_UNORM: return new PackedValidationTextureFormat<uint16_t>(4, 4, 4, 4);
+ case Format::B5G6R5_UNORM: return new PackedValidationTextureFormat<uint16_t>(5, 6, 5, 0);
+ case Format::B5G5R5A1_UNORM: return new PackedValidationTextureFormat<uint16_t>(5, 5, 5, 1);
+
+ case Format::R9G9B9E5_SHAREDEXP: return new ValidationTextureFormat<uint32_t>(1);
+ case Format::R10G10B10A2_TYPELESS:
+ return new PackedValidationTextureFormat<uint32_t>(10, 10, 10, 2);
+ case Format::R10G10B10A2_UNORM:
+ return new PackedValidationTextureFormat<uint32_t>(10, 10, 10, 2);
+ case Format::R10G10B10A2_UINT:
+ return new PackedValidationTextureFormat<uint32_t>(10, 10, 10, 2);
+ case Format::R11G11B10_FLOAT:
+ return new PackedValidationTextureFormat<uint32_t>(11, 11, 10, 0);
+
+ // TODO: Add testing support for BC formats
+ // BC1_UNORM,
+ // BC1_UNORM_SRGB,
+ // BC2_UNORM,
+ // BC2_UNORM_SRGB,
+ // BC3_UNORM,
+ // BC3_UNORM_SRGB,
+ // BC4_UNORM,
+ // BC4_SNORM,
+ // BC5_UNORM,
+ // BC5_SNORM,
+ // BC6H_UF16,
+ // BC6H_SF16,
+ // BC7_UNORM,
+ // BC7_UNORM_SRGB,
+ default: return nullptr;
}
+}
- void generateTextureData(RefPtr<TextureInfo> texture, ValidationTextureFormatBase* validationFormat)
- {
- auto extents = texture->extents;
- auto arrayLayers = texture->arrayLayerCount;
- auto mipLevels = texture->mipLevelCount;
- auto texelSize = getTexelSize(texture->format);
+void generateTextureData(RefPtr<TextureInfo> texture, ValidationTextureFormatBase* validationFormat)
+{
+ auto extents = texture->extents;
+ auto arrayLayers = texture->arrayLayerCount;
+ auto mipLevels = texture->mipLevelCount;
+ auto texelSize = getTexelSize(texture->format);
- for (GfxIndex layer = 0; layer < arrayLayers; ++layer)
+ for (GfxIndex layer = 0; layer < arrayLayers; ++layer)
+ {
+ for (GfxIndex mip = 0; mip < mipLevels; ++mip)
{
- for (GfxIndex mip = 0; mip < mipLevels; ++mip)
+ RefPtr<ValidationTextureData> subresource = new ValidationTextureData();
+
+ auto mipWidth = Math::Max(extents.width >> mip, 1);
+ auto mipHeight = Math::Max(extents.height >> mip, 1);
+ auto mipDepth = Math::Max(extents.depth >> mip, 1);
+ auto mipSize = mipWidth * mipHeight * mipDepth * texelSize;
+ subresource->textureData = malloc(mipSize);
+ SLANG_CHECK_ABORT(subresource->textureData);
+
+ subresource->extents.width = mipWidth;
+ subresource->extents.height = mipHeight;
+ subresource->extents.depth = mipDepth;
+ subresource->strides.x = texelSize;
+ subresource->strides.y = mipWidth * texelSize;
+ subresource->strides.z = mipHeight * subresource->strides.y;
+ texture->subresourceObjects.add(subresource);
+
+ for (int z = 0; z < mipDepth; ++z)
{
- RefPtr<ValidationTextureData> subresource = new ValidationTextureData();
-
- auto mipWidth = Math::Max(extents.width >> mip, 1);
- auto mipHeight = Math::Max(extents.height >> mip, 1);
- auto mipDepth = Math::Max(extents.depth >> mip, 1);
- auto mipSize = mipWidth * mipHeight * mipDepth * texelSize;
- subresource->textureData = malloc(mipSize);
- SLANG_CHECK_ABORT(subresource->textureData);
-
- subresource->extents.width = mipWidth;
- subresource->extents.height = mipHeight;
- subresource->extents.depth = mipDepth;
- subresource->strides.x = texelSize;
- subresource->strides.y = mipWidth * texelSize;
- subresource->strides.z = mipHeight * subresource->strides.y;
- texture->subresourceObjects.add(subresource);
-
- for (int z = 0; z < mipDepth; ++z)
+ for (int y = 0; y < mipHeight; ++y)
{
- for (int y = 0; y < mipHeight; ++y)
+ for (int x = 0; x < mipWidth; ++x)
{
- for (int x = 0; x < mipWidth; ++x)
- {
- auto texel = subresource->getBlockAt(x, y, z);
- validationFormat->initializeTexel(texel, x, y, z, mip, layer);
- }
+ auto texel = subresource->getBlockAt(x, y, z);
+ validationFormat->initializeTexel(texel, x, y, z, mip, layer);
}
}
-
- ITextureResource::SubresourceData subData = {};
- subData.data = subresource->textureData;
- subData.strideY = subresource->strides.y;
- subData.strideZ = subresource->strides.z;
- texture->subresourceDatas.add(subData);
}
+
+ ITextureResource::SubresourceData subData = {};
+ subData.data = subresource->textureData;
+ subData.strideY = subresource->strides.y;
+ subData.strideZ = subresource->strides.z;
+ texture->subresourceDatas.add(subData);
}
}
+}
- List<uint8_t> removePadding(ISlangBlob* pixels, GfxCount width, GfxCount height, Size rowPitch, Size pixelSize)
+List<uint8_t> removePadding(
+ ISlangBlob* pixels,
+ GfxCount width,
+ GfxCount height,
+ Size rowPitch,
+ Size pixelSize)
+{
+ List<uint8_t> buffer;
+ buffer.setCount(height * rowPitch);
+ for (GfxIndex i = 0; i < height; ++i)
{
- List<uint8_t> buffer;
- buffer.setCount(height * rowPitch);
- for (GfxIndex i = 0; i < height; ++i)
- {
- Offset srcOffset = i * rowPitch;
- Offset dstOffset = i * width * pixelSize;
- memcpy(buffer.getBuffer() + dstOffset, (char*)pixels->getBufferPointer() + srcOffset, width * pixelSize);
- }
-
- return buffer;
+ Offset srcOffset = i * rowPitch;
+ Offset dstOffset = i * width * pixelSize;
+ memcpy(
+ buffer.getBuffer() + dstOffset,
+ (char*)pixels->getBufferPointer() + srcOffset,
+ width * pixelSize);
}
- Slang::Result writeImage(
- const char* filename,
- ISlangBlob* pixels,
- uint32_t width,
- uint32_t height)
- {
- int stbResult =
- stbi_write_hdr(filename, width, height, 4, (float*)pixels->getBufferPointer());
+ return buffer;
+}
- return stbResult ? SLANG_OK : SLANG_FAIL;
- }
+Slang::Result writeImage(const char* filename, ISlangBlob* pixels, uint32_t width, uint32_t height)
+{
+ int stbResult = stbi_write_hdr(filename, width, height, 4, (float*)pixels->getBufferPointer());
- Slang::Result writeImage(
- const char* filename,
- ISlangBlob* pixels,
- uint32_t width,
- uint32_t height,
- uint32_t rowPitch,
- uint32_t pixelSize)
- {
- if (rowPitch == width * pixelSize)
- return writeImage(filename, pixels, width, height);
+ return stbResult ? SLANG_OK : SLANG_FAIL;
+}
- List<uint8_t> buffer = removePadding(pixels, width, height, rowPitch, pixelSize);
+Slang::Result writeImage(
+ const char* filename,
+ ISlangBlob* pixels,
+ uint32_t width,
+ uint32_t height,
+ uint32_t rowPitch,
+ uint32_t pixelSize)
+{
+ if (rowPitch == width * pixelSize)
+ return writeImage(filename, pixels, width, height);
- int stbResult =
- stbi_write_hdr(filename, width, height, 4, (float*)buffer.getBuffer());
+ List<uint8_t> buffer = removePadding(pixels, width, height, rowPitch, pixelSize);
- return stbResult ? SLANG_OK : SLANG_FAIL;
- }
+ int stbResult = stbi_write_hdr(filename, width, height, 4, (float*)buffer.getBuffer());
+
+ return stbResult ? SLANG_OK : SLANG_FAIL;
}
+} // namespace gfx_test