diff --git a/CMakeLists.txt b/CMakeLists.txt index c5c74dc3b..9c72af9ea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -204,11 +204,13 @@ elseif(PLATFORM_ANDROID) elseif(PLATFORM_LINUX) set(GL_SUPPORTED TRUE CACHE INTERNAL "OpenGL is supported on Linux platform") set(VULKAN_SUPPORTED TRUE CACHE INTERNAL "Vulkan is supported on Linux platform") + set(WEBGPU_SUPPORTED TRUE CACHE INTERNAL "WebGPU is supported on Linux platform via Dawn") set(ARCHIVER_SUPPORTED TRUE CACHE INTERNAL "Archiver is supported on Linux platform") target_compile_definitions(Diligent-PublicBuildSettings INTERFACE PLATFORM_LINUX=1) elseif(PLATFORM_MACOS) set(GL_SUPPORTED TRUE CACHE INTERNAL "OpenGL is supported on macOS platform") set(VULKAN_SUPPORTED TRUE CACHE INTERNAL "Vulkan is enabled through MoltenVK on macOS platform") + set(WEBGPU_SUPPORTED TRUE CACHE INTERNAL "WebGPU is supported on macOS platform via Dawn") set(ARCHIVER_SUPPORTED TRUE CACHE INTERNAL "Archiver is supported on macOS platform") target_compile_definitions(Diligent-PublicBuildSettings INTERFACE PLATFORM_MACOS=1 PLATFORM_APPLE=1) elseif(PLATFORM_IOS) diff --git a/Graphics/GraphicsEngineVulkan/src/VulkanTypeConversions.cpp b/Graphics/GraphicsEngineVulkan/src/VulkanTypeConversions.cpp index dcab4e922..81f93561e 100644 --- a/Graphics/GraphicsEngineVulkan/src/VulkanTypeConversions.cpp +++ b/Graphics/GraphicsEngineVulkan/src/VulkanTypeConversions.cpp @@ -74,9 +74,11 @@ class TexFormatToVkFormatMapper m_FmtToVkFmtMap[TEX_FORMAT_R32_FLOAT_X8X24_TYPELESS] = VK_FORMAT_D32_SFLOAT_S8_UINT; m_FmtToVkFmtMap[TEX_FORMAT_X32_TYPELESS_G8X24_UINT] = VK_FORMAT_UNDEFINED; - m_FmtToVkFmtMap[TEX_FORMAT_RGB10A2_TYPELESS] = VK_FORMAT_A2R10G10B10_UNORM_PACK32; - m_FmtToVkFmtMap[TEX_FORMAT_RGB10A2_UNORM] = VK_FORMAT_A2R10G10B10_UNORM_PACK32; - m_FmtToVkFmtMap[TEX_FORMAT_RGB10A2_UINT] = VK_FORMAT_A2R10G10B10_UINT_PACK32; + // RGB10A2 stores R in the low bits (DXGI_FORMAT_R10G10B10A2, GL_RGB10_A2), which is A2B10G10R10 in Vulkan. + // It is also the format of the SPIR-V Rgb10A2/Rgb10a2ui image formats and the one with guaranteed storage support. + m_FmtToVkFmtMap[TEX_FORMAT_RGB10A2_TYPELESS] = VK_FORMAT_A2B10G10R10_UNORM_PACK32; + m_FmtToVkFmtMap[TEX_FORMAT_RGB10A2_UNORM] = VK_FORMAT_A2B10G10R10_UNORM_PACK32; + m_FmtToVkFmtMap[TEX_FORMAT_RGB10A2_UINT] = VK_FORMAT_A2B10G10R10_UINT_PACK32; m_FmtToVkFmtMap[TEX_FORMAT_R11G11B10_FLOAT] = VK_FORMAT_B10G11R11_UFLOAT_PACK32; m_FmtToVkFmtMap[TEX_FORMAT_RGBA8_TYPELESS] = VK_FORMAT_R8G8B8A8_UNORM; @@ -263,18 +265,18 @@ class VkFormatToTexFormatMapper m_VkFmtToTexFmtMap[VK_FORMAT_A8B8G8R8_SINT_PACK32] = TEX_FORMAT_UNKNOWN; m_VkFmtToTexFmtMap[VK_FORMAT_A8B8G8R8_SRGB_PACK32] = TEX_FORMAT_UNKNOWN; - m_VkFmtToTexFmtMap[VK_FORMAT_A2R10G10B10_UNORM_PACK32] = TEX_FORMAT_RGB10A2_UNORM; + m_VkFmtToTexFmtMap[VK_FORMAT_A2R10G10B10_UNORM_PACK32] = TEX_FORMAT_UNKNOWN; m_VkFmtToTexFmtMap[VK_FORMAT_A2R10G10B10_SNORM_PACK32] = TEX_FORMAT_UNKNOWN; m_VkFmtToTexFmtMap[VK_FORMAT_A2R10G10B10_USCALED_PACK32] = TEX_FORMAT_UNKNOWN; m_VkFmtToTexFmtMap[VK_FORMAT_A2R10G10B10_SSCALED_PACK32] = TEX_FORMAT_UNKNOWN; - m_VkFmtToTexFmtMap[VK_FORMAT_A2R10G10B10_UINT_PACK32] = TEX_FORMAT_RGB10A2_UINT; + m_VkFmtToTexFmtMap[VK_FORMAT_A2R10G10B10_UINT_PACK32] = TEX_FORMAT_UNKNOWN; m_VkFmtToTexFmtMap[VK_FORMAT_A2R10G10B10_SINT_PACK32] = TEX_FORMAT_UNKNOWN; - m_VkFmtToTexFmtMap[VK_FORMAT_A2B10G10R10_UNORM_PACK32] = TEX_FORMAT_UNKNOWN; + m_VkFmtToTexFmtMap[VK_FORMAT_A2B10G10R10_UNORM_PACK32] = TEX_FORMAT_RGB10A2_UNORM; m_VkFmtToTexFmtMap[VK_FORMAT_A2B10G10R10_SNORM_PACK32] = TEX_FORMAT_UNKNOWN; m_VkFmtToTexFmtMap[VK_FORMAT_A2B10G10R10_USCALED_PACK32] = TEX_FORMAT_UNKNOWN; m_VkFmtToTexFmtMap[VK_FORMAT_A2B10G10R10_SSCALED_PACK32] = TEX_FORMAT_UNKNOWN; - m_VkFmtToTexFmtMap[VK_FORMAT_A2B10G10R10_UINT_PACK32] = TEX_FORMAT_UNKNOWN; + m_VkFmtToTexFmtMap[VK_FORMAT_A2B10G10R10_UINT_PACK32] = TEX_FORMAT_RGB10A2_UINT; m_VkFmtToTexFmtMap[VK_FORMAT_A2B10G10R10_SINT_PACK32] = TEX_FORMAT_UNKNOWN; m_VkFmtToTexFmtMap[VK_FORMAT_R16_UNORM] = TEX_FORMAT_R16_UNORM; diff --git a/Graphics/GraphicsEngineWebGPU/CMakeLists.txt b/Graphics/GraphicsEngineWebGPU/CMakeLists.txt index e229ab14e..f9a145c51 100644 --- a/Graphics/GraphicsEngineWebGPU/CMakeLists.txt +++ b/Graphics/GraphicsEngineWebGPU/CMakeLists.txt @@ -153,11 +153,12 @@ PUBLIC target_link_libraries(Diligent-GraphicsEngineWebGPU-shared PRIVATE Diligent-BuildSettings - Diligent-GraphicsEngineWebGPU-static PUBLIC Diligent-GraphicsEngineWebGPUInterface ) +target_link_whole_archive(Diligent-GraphicsEngineWebGPU-shared Diligent-GraphicsEngineWebGPU-static) + if(PLATFORM_WIN32) # Do not add 'lib' prefix when building with MinGW set_target_properties(Diligent-GraphicsEngineWebGPU-shared PROPERTIES PREFIX "") diff --git a/Graphics/GraphicsEngineWebGPU/include/pch.h b/Graphics/GraphicsEngineWebGPU/include/pch.h index 1468242e4..0e9fc93b2 100644 --- a/Graphics/GraphicsEngineWebGPU/include/pch.h +++ b/Graphics/GraphicsEngineWebGPU/include/pch.h @@ -31,6 +31,8 @@ #pragma once +#include +#include #include #include diff --git a/Graphics/ShaderTools/include/WGSLShaderResources.hpp b/Graphics/ShaderTools/include/WGSLShaderResources.hpp index 3b3b4b1f4..ff1b58301 100644 --- a/Graphics/ShaderTools/include/WGSLShaderResources.hpp +++ b/Graphics/ShaderTools/include/WGSLShaderResources.hpp @@ -35,6 +35,7 @@ // | | // | Uniform Buffers | Storage Buffers | Textures | Storage Textures | Samplers | Ext Textures | Spec Constants | Resource Names | +#include #include #include diff --git a/Graphics/ShaderTools/include/WGSLUtils.hpp b/Graphics/ShaderTools/include/WGSLUtils.hpp index b0eed0d6a..6d91754c5 100644 --- a/Graphics/ShaderTools/include/WGSLUtils.hpp +++ b/Graphics/ShaderTools/include/WGSLUtils.hpp @@ -26,6 +26,7 @@ #pragma once +#include #include #include #include diff --git a/Graphics/ShaderTools/src/WGSLShaderResources.cpp b/Graphics/ShaderTools/src/WGSLShaderResources.cpp index 27b7352eb..edb15a322 100644 --- a/Graphics/ShaderTools/src/WGSLShaderResources.cpp +++ b/Graphics/ShaderTools/src/WGSLShaderResources.cpp @@ -25,6 +25,10 @@ */ #include "WGSLShaderResources.hpp" + +#include +#include + #include "Align.hpp" #include "StringPool.hpp" #include "WGSLUtils.hpp" diff --git a/Graphics/ShaderTools/src/WGSLUtils.cpp b/Graphics/ShaderTools/src/WGSLUtils.cpp index d8df689b7..6f6b03b52 100644 --- a/Graphics/ShaderTools/src/WGSLUtils.cpp +++ b/Graphics/ShaderTools/src/WGSLUtils.cpp @@ -25,6 +25,7 @@ */ #include +#include #include #include diff --git a/Tests/DiligentCoreAPITest/src/ClearRenderTargetTest.cpp b/Tests/DiligentCoreAPITest/src/ClearRenderTargetTest.cpp index 036e16c1e..486d6a28b 100644 --- a/Tests/DiligentCoreAPITest/src/ClearRenderTargetTest.cpp +++ b/Tests/DiligentCoreAPITest/src/ClearRenderTargetTest.cpp @@ -491,4 +491,67 @@ TEST(ClearRenderTargetTest, LoadOpClear2) TestClearWithLoadOp({0.375f, 0.75, 0.125, 1.0f}, 2); } +// TEX_FORMAT_RGB10A2_UNORM has the layout of DXGI_FORMAT_R10G10B10A2_UNORM and GL_RGB10_A2: red in the low 10 bits +// and alpha in the high 2 bits. Every backend must store a red clear with this layout. +TEST(ClearRenderTargetTest, RGB10A2BitLayout) +{ + GPUTestingEnvironment* pEnv = GPUTestingEnvironment::GetInstance(); + IRenderDevice* pDevice = pEnv->GetDevice(); + IDeviceContext* pContext = pEnv->GetDeviceContext(); + + if ((pDevice->GetTextureFormatInfoExt(TEX_FORMAT_RGB10A2_UNORM).BindFlags & BIND_RENDER_TARGET) == 0) + { + GTEST_SKIP() << "RGB10A2 render targets are not supported by this device"; + } + + GPUTestingEnvironment::ScopedReset EnvironmentAutoReset; + + TextureDesc TexDesc; + TexDesc.Name = "ClearRenderTargetTest.RGB10A2BitLayout"; + TexDesc.Type = RESOURCE_DIM_TEX_2D; + TexDesc.Width = 4; + TexDesc.Height = 4; + TexDesc.Format = TEX_FORMAT_RGB10A2_UNORM; + TexDesc.BindFlags = BIND_RENDER_TARGET; + RefCntAutoPtr pTex; + pDevice->CreateTexture(TexDesc, nullptr, &pTex); + ASSERT_NE(pTex, nullptr); + + TexDesc.Name = "ClearRenderTargetTest.RGB10A2BitLayout staging"; + TexDesc.Usage = USAGE_STAGING; + TexDesc.BindFlags = BIND_NONE; + TexDesc.CPUAccessFlags = CPU_ACCESS_READ; + RefCntAutoPtr pStagingTex; + pDevice->CreateTexture(TexDesc, nullptr, &pStagingTex); + ASSERT_NE(pStagingTex, nullptr); + + ITextureView* pRTVs[] = {pTex->GetDefaultView(TEXTURE_VIEW_RENDER_TARGET)}; + pContext->SetRenderTargets(1, pRTVs, nullptr, RESOURCE_STATE_TRANSITION_MODE_TRANSITION); + constexpr float Red[] = {1, 0, 0, 1}; + pContext->ClearRenderTarget(pRTVs[0], Red, RESOURCE_STATE_TRANSITION_MODE_TRANSITION); + pContext->SetRenderTargets(0, nullptr, nullptr, RESOURCE_STATE_TRANSITION_MODE_NONE); + + pContext->CopyTexture(CopyTextureAttribs{pTex, RESOURCE_STATE_TRANSITION_MODE_TRANSITION, pStagingTex, RESOURCE_STATE_TRANSITION_MODE_TRANSITION}); + pContext->WaitForIdle(); + + // Some Intel D3D11 drivers return null with DO_NOT_WAIT even after WaitForIdle(). + const MAP_FLAGS MapFlags = pDevice->GetDeviceInfo().Type == RENDER_DEVICE_TYPE_D3D11 ? MAP_FLAG_NONE : MAP_FLAG_DO_NOT_WAIT; + MappedTextureSubresource MappedData; + pContext->MapTextureSubresource(pStagingTex, 0, 0, MAP_READ, MapFlags, nullptr, MappedData); + ASSERT_NE(MappedData.pData, nullptr); + + constexpr Uint32 RedTexel = (3u << 30) | 0x3FFu; + for (Uint32 Row = 0; Row < TexDesc.Height; ++Row) + { + const Uint8* pRow = static_cast(MappedData.pData) + Row * MappedData.Stride; + for (Uint32 Col = 0; Col < TexDesc.Width; ++Col) + { + Uint32 Texel = 0; + memcpy(&Texel, pRow + Col * sizeof(Texel), sizeof(Texel)); + EXPECT_EQ(Texel, RedTexel) << "Texel (" << Col << ", " << Row << "): expected red in bits 0-9 and alpha in bits 30-31"; + } + } + pContext->UnmapTextureSubresource(pStagingTex, 0, 0); +} + } // namespace diff --git a/ThirdParty/dawn/CMakeLists.txt b/ThirdParty/dawn/CMakeLists.txt index 61fdd6f00..52027f376 100644 --- a/ThirdParty/dawn/CMakeLists.txt +++ b/ThirdParty/dawn/CMakeLists.txt @@ -34,12 +34,7 @@ endif() set(TINT_BUILD_WGSL_WRITER ON CACHE BOOL "" FORCE) set(TINT_BUILD_WGSL_READER ON CACHE BOOL "" FORCE) set(TINT_BUILD_IR_BINARY OFF CACHE BOOL "" FORCE) -if (PLATFORM_WEB) - set(TINT_BUILD_HLSL_WRITER OFF CACHE BOOL "" FORCE) -else() - set(TINT_BUILD_HLSL_WRITER ON CACHE BOOL "" FORCE) -endif() - +set(TINT_BUILD_HLSL_WRITER OFF CACHE BOOL "" FORCE) set(TINT_BUILD_GLSL_WRITER OFF CACHE BOOL "" FORCE) set(TINT_BUILD_MSL_WRITER OFF CACHE BOOL "" FORCE) set(TINT_BUILD_SPV_WRITER OFF CACHE BOOL "" FORCE) @@ -59,16 +54,25 @@ set(DAWN_USE_WAYLAND OFF CACHE BOOL "" FORCE) set(DAWN_ENABLE_VULKAN OFF CACHE BOOL "" FORCE) set(DAWN_ENABLE_D3D11 OFF CACHE BOOL "" FORCE) +set(DAWN_ENABLE_D3D12 OFF CACHE BOOL "" FORCE) set(DAWN_ENABLE_DESKTOP_GL OFF CACHE BOOL "" FORCE) set(DAWN_ENABLE_OPENGLES OFF CACHE BOOL "" FORCE) -if (PLATFORM_WEB) - set(DAWN_ENABLE_D3D12 OFF CACHE BOOL "" FORCE) -else() - set(DAWN_ENABLE_D3D12 ON CACHE BOOL "" FORCE) +set(DAWN_ENABLE_METAL OFF CACHE BOOL "" FORCE) +set(DAWN_ENABLE_NULL OFF CACHE BOOL "" FORCE) +if (PLATFORM_WIN32) + set(DAWN_ENABLE_D3D12 ON CACHE BOOL "" FORCE) + set(TINT_BUILD_HLSL_WRITER ON CACHE BOOL "" FORCE) +elseif(PLATFORM_MACOS) + set(DAWN_ENABLE_METAL ON CACHE BOOL "" FORCE) + set(TINT_BUILD_MSL_WRITER ON CACHE BOOL "" FORCE) +elseif(PLATFORM_LINUX) + # Use the null device for serialization. Dawn Native references Tint bindings that are only + # defined when a backend writer is built, so enable the HLSL writer as on Windows. + set(DAWN_ENABLE_NULL ON CACHE BOOL "" FORCE) + set(TINT_BUILD_HLSL_WRITER ON CACHE BOOL "" FORCE) endif() set(DAWN_USE_GLFW OFF CACHE BOOL "" FORCE) -set(DAWN_ENABLE_NULL OFF CACHE BOOL "" FORCE) set(DAWN_USE_WINDOWS_UI OFF CACHE BOOL "" FORCE) set(DAWN_ENABLE_SPIRV_VALIDATION OFF CACHE BOOL "" FORCE)