diff --git a/engine/assets/builtin/shaders/color-scale-post-process/color-scale-post-process.shader b/engine/assets/builtin/shaders/color-scale-post-process.shader similarity index 89% rename from engine/assets/builtin/shaders/color-scale-post-process/color-scale-post-process.shader rename to engine/assets/builtin/shaders/color-scale-post-process.shader index fcfe6e18..30131e17 100644 --- a/engine/assets/builtin/shaders/color-scale-post-process/color-scale-post-process.shader +++ b/engine/assets/builtin/shaders/color-scale-post-process.shader @@ -10,8 +10,8 @@ Shader "Builtin Color Scale Post Process" float4 gColorScale; }; - Texture2D gSourceColorTexture; - SamplerState gLinearClampSampler; + Texture2D SourceColorTexture; + SamplerState LinearClampSampler; struct VSOutput { @@ -44,7 +44,7 @@ Shader "Builtin Color Scale Post Process" float4 MainPS(VSOutput input) : SV_TARGET { - return gSourceColorTexture.Sample(gLinearClampSampler, input.texcoord) * gColorScale; + return SourceColorTexture.Sample(LinearClampSampler, input.texcoord) * gColorScale; } ENDHLSL SubShader diff --git a/engine/assets/builtin/shaders/depth-only/depth-only.shader b/engine/assets/builtin/shaders/depth-only.shader similarity index 100% rename from engine/assets/builtin/shaders/depth-only/depth-only.shader rename to engine/assets/builtin/shaders/depth-only.shader diff --git a/engine/assets/builtin/shaders/final-color/final-color.shader b/engine/assets/builtin/shaders/final-color.shader similarity index 94% rename from engine/assets/builtin/shaders/final-color/final-color.shader rename to engine/assets/builtin/shaders/final-color.shader index df83b65d..29e2ce2e 100644 --- a/engine/assets/builtin/shaders/final-color/final-color.shader +++ b/engine/assets/builtin/shaders/final-color.shader @@ -14,8 +14,8 @@ Shader "Builtin Final Color" float4 gFinalColorParams; }; - Texture2D gSourceColorTexture; - SamplerState gLinearClampSampler; + Texture2D SourceColorTexture; + SamplerState LinearClampSampler; struct VSOutput { @@ -92,7 +92,7 @@ Shader "Builtin Final Color" float4 MainPS(VSOutput input) : SV_TARGET { - float4 color = gSourceColorTexture.Sample(gLinearClampSampler, input.texcoord); + float4 color = SourceColorTexture.Sample(LinearClampSampler, input.texcoord); color.rgb *= max(gFinalColorParams.x, 0.0f); color *= gColorScale; color.rgb = ApplyToneMapping(color.rgb, gFinalColorParams.z); diff --git a/engine/assets/builtin/shaders/forward-lit/forward-lit.shader b/engine/assets/builtin/shaders/forward-lit.shader similarity index 100% rename from engine/assets/builtin/shaders/forward-lit/forward-lit.shader rename to engine/assets/builtin/shaders/forward-lit.shader diff --git a/engine/assets/builtin/shaders/object-id-outline.shader b/engine/assets/builtin/shaders/object-id-outline.shader new file mode 100644 index 00000000..54ad2981 --- /dev/null +++ b/engine/assets/builtin/shaders/object-id-outline.shader @@ -0,0 +1,133 @@ +Shader "Builtin Object Id Outline" +{ + HLSLINCLUDE + // XC_BUILTIN_OBJECT_ID_OUTLINE_D3D12_SHARED + cbuffer OutlineConstants + { + float4 gViewportSizeAndTexelSize; + float4 gOutlineColor; + float4 gSelectedInfo; + float4 gSelectedObjectColors[256]; + }; + + Texture2D gObjectIdTexture; + + struct VSOutput + { + float4 position : SV_POSITION; + }; + + VSOutput MainVS(uint vertexId : SV_VertexID) + { + // XC_BUILTIN_OBJECT_ID_OUTLINE_D3D12_VS + static const float2 positions[3] = { + float2(-1.0, -1.0), + float2(-1.0, 3.0), + float2( 3.0, -1.0) + }; + + VSOutput output; + output.position = float4(positions[vertexId], 0.0, 1.0); + return output; + } + + int2 ClampPixelCoord(int2 pixelCoord) + { + const int2 maxCoord = int2( + max((int)gViewportSizeAndTexelSize.x - 1, 0), + max((int)gViewportSizeAndTexelSize.y - 1, 0)); + return clamp(pixelCoord, int2(0, 0), maxCoord); + } + + float4 LoadObjectId(int2 pixelCoord) + { + return gObjectIdTexture.Load(int3(ClampPixelCoord(pixelCoord), 0)); + } + + bool IsSelectedObject(float4 objectIdColor) + { + if (objectIdColor.a <= 0.0) { + return false; + } + + const int selectedCount = min((int)gSelectedInfo.x, 256); + [loop] + for (int i = 0; i < selectedCount; ++i) { + const float4 selectedColor = gSelectedObjectColors[i]; + if (all(abs(objectIdColor - selectedColor) <= float4( + 0.0025, + 0.0025, + 0.0025, + 0.0025))) { + return true; + } + } + + return false; + } + + float4 MainPS(VSOutput input) : SV_TARGET + { + // XC_BUILTIN_OBJECT_ID_OUTLINE_D3D12_PS + const int2 pixelCoord = int2(input.position.xy); + const bool debugSelectionMask = gSelectedInfo.y > 0.5; + const bool centerSelected = IsSelectedObject(LoadObjectId(pixelCoord)); + + if (debugSelectionMask) { + return centerSelected ? float4(1.0, 1.0, 1.0, 1.0) : float4(0.0, 0.0, 0.0, 1.0); + } + + if (centerSelected) { + discard; + } + + const int outlineWidth = max((int)gSelectedInfo.z, 1); + float outline = 0.0; + [loop] + for (int y = -2; y <= 2; ++y) { + [loop] + for (int x = -2; x <= 2; ++x) { + if (x == 0 && y == 0) { + continue; + } + + const float distancePixels = length(float2((float)x, (float)y)); + if (distancePixels > outlineWidth) { + continue; + } + + if (!IsSelectedObject(LoadObjectId(pixelCoord + int2(x, y)))) { + continue; + } + + const float weight = saturate( + 1.0 - ((distancePixels - 1.0) / max((float)outlineWidth, 1.0))); + outline = max(outline, weight); + } + } + + if (outline <= 0.001) { + discard; + } + + return float4(gOutlineColor.rgb, gOutlineColor.a * outline); + } + ENDHLSL + SubShader + { + Pass + { + Name "ObjectIdOutline" + Tags { "LightMode" = "ObjectIdOutline" } + Cull Off + ZWrite Off + ZTest Always + Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha + HLSLPROGRAM + #pragma target 4.5 + #pragma vertex MainVS + #pragma fragment MainPS + ENDHLSL + } + } +} diff --git a/engine/assets/builtin/shaders/object-id/object-id.shader b/engine/assets/builtin/shaders/object-id.shader similarity index 100% rename from engine/assets/builtin/shaders/object-id/object-id.shader rename to engine/assets/builtin/shaders/object-id.shader diff --git a/engine/assets/builtin/shaders/object-id/object-id.frag.glsl b/engine/assets/builtin/shaders/object-id/object-id.frag.glsl deleted file mode 100644 index efa34cbb..00000000 --- a/engine/assets/builtin/shaders/object-id/object-id.frag.glsl +++ /dev/null @@ -1,14 +0,0 @@ -// XC_BUILTIN_OBJECT_ID_OPENGL_PS -#version 430 -layout(std140, binding = 0) uniform PerObjectConstants { - mat4 gProjectionMatrix; - mat4 gViewMatrix; - mat4 gModelMatrix; - vec4 gObjectIdColor; -}; - -layout(location = 0) out vec4 fragColor; - -void main() { - fragColor = gObjectIdColor; -} diff --git a/engine/assets/builtin/shaders/object-id/object-id.frag.vk.glsl b/engine/assets/builtin/shaders/object-id/object-id.frag.vk.glsl deleted file mode 100644 index ed9e94d0..00000000 --- a/engine/assets/builtin/shaders/object-id/object-id.frag.vk.glsl +++ /dev/null @@ -1,14 +0,0 @@ -// XC_BUILTIN_OBJECT_ID_VULKAN_PS -#version 450 -layout(set = 0, binding = 0, std140) uniform PerObjectConstants { - mat4 gProjectionMatrix; - mat4 gViewMatrix; - mat4 gModelMatrix; - vec4 gObjectIdColor; -}; - -layout(location = 0) out vec4 fragColor; - -void main() { - fragColor = gObjectIdColor; -} diff --git a/engine/assets/builtin/shaders/object-id/object-id.ps.hlsl b/engine/assets/builtin/shaders/object-id/object-id.ps.hlsl deleted file mode 100644 index 0d77a87c..00000000 --- a/engine/assets/builtin/shaders/object-id/object-id.ps.hlsl +++ /dev/null @@ -1,15 +0,0 @@ -// XC_BUILTIN_OBJECT_ID_D3D12_PS -cbuffer PerObjectConstants : register(b0) { - float4x4 gProjectionMatrix; - float4x4 gViewMatrix; - float4x4 gModelMatrix; - float4 gObjectIdColor; -}; - -struct PSInput { - float4 position : SV_POSITION; -}; - -float4 MainPS(PSInput input) : SV_TARGET { - return gObjectIdColor; -} diff --git a/engine/assets/builtin/shaders/object-id/object-id.vert.glsl b/engine/assets/builtin/shaders/object-id/object-id.vert.glsl deleted file mode 100644 index a2c8085c..00000000 --- a/engine/assets/builtin/shaders/object-id/object-id.vert.glsl +++ /dev/null @@ -1,16 +0,0 @@ -// XC_BUILTIN_OBJECT_ID_OPENGL_VS -#version 430 -layout(location = 0) in vec3 aPosition; - -layout(std140, binding = 0) uniform PerObjectConstants { - mat4 gProjectionMatrix; - mat4 gViewMatrix; - mat4 gModelMatrix; - vec4 gObjectIdColor; -}; - -void main() { - vec4 positionWS = gModelMatrix * vec4(aPosition, 1.0); - vec4 positionVS = gViewMatrix * positionWS; - gl_Position = gProjectionMatrix * positionVS; -} diff --git a/engine/assets/builtin/shaders/object-id/object-id.vert.vk.glsl b/engine/assets/builtin/shaders/object-id/object-id.vert.vk.glsl deleted file mode 100644 index 5e5ebec1..00000000 --- a/engine/assets/builtin/shaders/object-id/object-id.vert.vk.glsl +++ /dev/null @@ -1,16 +0,0 @@ -// XC_BUILTIN_OBJECT_ID_VULKAN_VS -#version 450 -layout(location = 0) in vec3 aPosition; - -layout(set = 0, binding = 0, std140) uniform PerObjectConstants { - mat4 gProjectionMatrix; - mat4 gViewMatrix; - mat4 gModelMatrix; - vec4 gObjectIdColor; -}; - -void main() { - vec4 positionWS = gModelMatrix * vec4(aPosition, 1.0); - vec4 positionVS = gViewMatrix * positionWS; - gl_Position = gProjectionMatrix * positionVS; -} diff --git a/engine/assets/builtin/shaders/object-id/object-id.vs.hlsl b/engine/assets/builtin/shaders/object-id/object-id.vs.hlsl deleted file mode 100644 index fb71b6d9..00000000 --- a/engine/assets/builtin/shaders/object-id/object-id.vs.hlsl +++ /dev/null @@ -1,23 +0,0 @@ -// XC_BUILTIN_OBJECT_ID_D3D12_VS -cbuffer PerObjectConstants : register(b0) { - float4x4 gProjectionMatrix; - float4x4 gViewMatrix; - float4x4 gModelMatrix; - float4 gObjectIdColor; -}; - -struct VSInput { - float3 position : POSITION; -}; - -struct PSInput { - float4 position : SV_POSITION; -}; - -PSInput MainVS(VSInput input) { - PSInput output; - float4 positionWS = mul(gModelMatrix, float4(input.position, 1.0)); - float4 positionVS = mul(gViewMatrix, positionWS); - output.position = mul(gProjectionMatrix, positionVS); - return output; -} diff --git a/engine/assets/builtin/shaders/shadow-caster/shadow-caster.shader b/engine/assets/builtin/shaders/shadow-caster.shader similarity index 100% rename from engine/assets/builtin/shaders/shadow-caster/shadow-caster.shader rename to engine/assets/builtin/shaders/shadow-caster.shader diff --git a/engine/assets/builtin/shaders/skybox/skybox.shader b/engine/assets/builtin/shaders/skybox.shader similarity index 100% rename from engine/assets/builtin/shaders/skybox/skybox.shader rename to engine/assets/builtin/shaders/skybox.shader diff --git a/engine/assets/builtin/shaders/unlit/unlit.shader b/engine/assets/builtin/shaders/unlit.shader similarity index 100% rename from engine/assets/builtin/shaders/unlit/unlit.shader rename to engine/assets/builtin/shaders/unlit.shader diff --git a/engine/assets/builtin/shaders/unlit/unlit.frag.glsl b/engine/assets/builtin/shaders/unlit/unlit.frag.glsl deleted file mode 100644 index ffa81606..00000000 --- a/engine/assets/builtin/shaders/unlit/unlit.frag.glsl +++ /dev/null @@ -1,22 +0,0 @@ -// XC_BUILTIN_UNLIT_OPENGL_PS -#version 430 -layout(binding = 0) uniform sampler2D uBaseColorTexture; - -layout(std140, binding = 0) uniform PerObjectConstants { - mat4 gProjectionMatrix; - mat4 gViewMatrix; - mat4 gModelMatrix; - mat4 gNormalMatrix; -}; - -layout(std140, binding = 1) uniform MaterialConstants { - vec4 gBaseColorFactor; -}; - -in vec2 vTexCoord; - -layout(location = 0) out vec4 fragColor; - -void main() { - fragColor = texture(uBaseColorTexture, vTexCoord) * gBaseColorFactor; -} diff --git a/engine/assets/builtin/shaders/unlit/unlit.frag.vk.glsl b/engine/assets/builtin/shaders/unlit/unlit.frag.vk.glsl deleted file mode 100644 index a6acae3c..00000000 --- a/engine/assets/builtin/shaders/unlit/unlit.frag.vk.glsl +++ /dev/null @@ -1,23 +0,0 @@ -// XC_BUILTIN_UNLIT_VULKAN_PS -#version 450 -layout(set = 2, binding = 0) uniform texture2D uBaseColorTexture; -layout(set = 3, binding = 0) uniform sampler uLinearSampler; - -layout(set = 0, binding = 0, std140) uniform PerObjectConstants { - mat4 gProjectionMatrix; - mat4 gViewMatrix; - mat4 gModelMatrix; - mat4 gNormalMatrix; -}; - -layout(set = 1, binding = 0, std140) uniform MaterialConstants { - vec4 gBaseColorFactor; -}; - -layout(location = 0) in vec2 vTexCoord; - -layout(location = 0) out vec4 fragColor; - -void main() { - fragColor = texture(sampler2D(uBaseColorTexture, uLinearSampler), vTexCoord) * gBaseColorFactor; -} diff --git a/engine/assets/builtin/shaders/unlit/unlit.ps.hlsl b/engine/assets/builtin/shaders/unlit/unlit.ps.hlsl deleted file mode 100644 index cfb44b89..00000000 --- a/engine/assets/builtin/shaders/unlit/unlit.ps.hlsl +++ /dev/null @@ -1,23 +0,0 @@ -// XC_BUILTIN_UNLIT_D3D12_PS -Texture2D gBaseColorTexture : register(t0); -SamplerState gLinearSampler : register(s0); - -cbuffer PerObjectConstants : register(b0) { - float4x4 gProjectionMatrix; - float4x4 gViewMatrix; - float4x4 gModelMatrix; - float4x4 gNormalMatrix; -}; - -cbuffer MaterialConstants : register(b1) { - float4 gBaseColorFactor; -}; - -struct PSInput { - float4 position : SV_POSITION; - float2 texcoord : TEXCOORD0; -}; - -float4 MainPS(PSInput input) : SV_TARGET { - return gBaseColorTexture.Sample(gLinearSampler, input.texcoord) * gBaseColorFactor; -} diff --git a/engine/assets/builtin/shaders/unlit/unlit.vert.glsl b/engine/assets/builtin/shaders/unlit/unlit.vert.glsl deleted file mode 100644 index 8a73bced..00000000 --- a/engine/assets/builtin/shaders/unlit/unlit.vert.glsl +++ /dev/null @@ -1,21 +0,0 @@ -// XC_BUILTIN_UNLIT_OPENGL_VS -#version 430 -layout(location = 0) in vec3 aPosition; -layout(location = 1) in vec3 aNormal; -layout(location = 2) in vec2 aTexCoord; - -layout(std140, binding = 0) uniform PerObjectConstants { - mat4 gProjectionMatrix; - mat4 gViewMatrix; - mat4 gModelMatrix; - mat4 gNormalMatrix; -}; - -out vec2 vTexCoord; - -void main() { - vec4 positionWS = gModelMatrix * vec4(aPosition, 1.0); - vec4 positionVS = gViewMatrix * positionWS; - gl_Position = gProjectionMatrix * positionVS; - vTexCoord = aTexCoord; -} diff --git a/engine/assets/builtin/shaders/unlit/unlit.vert.vk.glsl b/engine/assets/builtin/shaders/unlit/unlit.vert.vk.glsl deleted file mode 100644 index 0aafa5c8..00000000 --- a/engine/assets/builtin/shaders/unlit/unlit.vert.vk.glsl +++ /dev/null @@ -1,21 +0,0 @@ -// XC_BUILTIN_UNLIT_VULKAN_VS -#version 450 -layout(location = 0) in vec3 aPosition; -layout(location = 1) in vec3 aNormal; -layout(location = 2) in vec2 aTexCoord; - -layout(set = 0, binding = 0, std140) uniform PerObjectConstants { - mat4 gProjectionMatrix; - mat4 gViewMatrix; - mat4 gModelMatrix; - mat4 gNormalMatrix; -}; - -layout(location = 0) out vec2 vTexCoord; - -void main() { - vec4 positionWS = gModelMatrix * vec4(aPosition, 1.0); - vec4 positionVS = gViewMatrix * positionWS; - gl_Position = gProjectionMatrix * positionVS; - vTexCoord = aTexCoord; -} diff --git a/engine/assets/builtin/shaders/unlit/unlit.vs.hlsl b/engine/assets/builtin/shaders/unlit/unlit.vs.hlsl deleted file mode 100644 index 52d6e61b..00000000 --- a/engine/assets/builtin/shaders/unlit/unlit.vs.hlsl +++ /dev/null @@ -1,27 +0,0 @@ -// XC_BUILTIN_UNLIT_D3D12_VS -cbuffer PerObjectConstants : register(b0) { - float4x4 gProjectionMatrix; - float4x4 gViewMatrix; - float4x4 gModelMatrix; - float4x4 gNormalMatrix; -}; - -struct VSInput { - float3 position : POSITION; - float3 normal : NORMAL; - float2 texcoord : TEXCOORD0; -}; - -struct PSInput { - float4 position : SV_POSITION; - float2 texcoord : TEXCOORD0; -}; - -PSInput MainVS(VSInput input) { - PSInput output; - float4 positionWS = mul(gModelMatrix, float4(input.position, 1.0f)); - float4 positionVS = mul(gViewMatrix, positionWS); - output.position = mul(gProjectionMatrix, positionVS); - output.texcoord = input.texcoord; - return output; -} diff --git a/engine/include/XCEngine/Rendering/Builtin/BuiltinPassLayoutUtils.h b/engine/include/XCEngine/Rendering/Builtin/BuiltinPassLayoutUtils.h index c4e45d8d..3bb8b9a7 100644 --- a/engine/include/XCEngine/Rendering/Builtin/BuiltinPassLayoutUtils.h +++ b/engine/include/XCEngine/Rendering/Builtin/BuiltinPassLayoutUtils.h @@ -51,9 +51,24 @@ inline bool TryBuildBuiltinPassResourceBindingPlan( case BuiltinPassResourceSemantic::ShadowReceiver: location = &outPlan.shadowReceiver; break; + case BuiltinPassResourceSemantic::Environment: + location = &outPlan.environment; + break; + case BuiltinPassResourceSemantic::PassConstants: + location = &outPlan.passConstants; + break; case BuiltinPassResourceSemantic::BaseColorTexture: location = &outPlan.baseColorTexture; break; + case BuiltinPassResourceSemantic::SourceColorTexture: + location = &outPlan.sourceColorTexture; + break; + case BuiltinPassResourceSemantic::SkyboxPanoramicTexture: + location = &outPlan.skyboxPanoramicTexture; + break; + case BuiltinPassResourceSemantic::SkyboxTexture: + location = &outPlan.skyboxTexture; + break; case BuiltinPassResourceSemantic::LinearClampSampler: location = &outPlan.linearClampSampler; break; @@ -131,7 +146,7 @@ inline void AppendBuiltinPassResourceBinding( bindings.PushBack(desc); } -inline bool TryBuildImplicitBuiltinPassResourceBindings( +inline bool TryBuildBuiltinPassDefaultResourceBindings( const Resources::ShaderPass& shaderPass, Containers::Array& outBindings) { outBindings.Clear(); @@ -241,6 +256,95 @@ inline bool TryBuildImplicitBuiltinPassResourceBindings( return true; } + if (ShaderPassMatchesBuiltinPass(shaderPass, BuiltinMaterialPass::Skybox)) { + AppendBuiltinPassResourceBinding( + outBindings, + "EnvironmentConstants", + Resources::ShaderResourceType::ConstantBuffer, + 0u, + 0u, + "Environment"); + AppendBuiltinPassResourceBinding( + outBindings, + "MaterialConstants", + Resources::ShaderResourceType::ConstantBuffer, + 1u, + 0u, + "Material"); + AppendBuiltinPassResourceBinding( + outBindings, + "SkyboxPanoramicTexture", + Resources::ShaderResourceType::Texture2D, + 2u, + 0u, + "SkyboxPanoramicTexture"); + AppendBuiltinPassResourceBinding( + outBindings, + "SkyboxTexture", + Resources::ShaderResourceType::TextureCube, + 3u, + 0u, + "SkyboxTexture"); + AppendBuiltinPassResourceBinding( + outBindings, + "LinearClampSampler", + Resources::ShaderResourceType::Sampler, + 4u, + 0u, + "LinearClampSampler"); + return true; + } + + if (ShaderPassMatchesBuiltinPass(shaderPass, BuiltinMaterialPass::PostProcess)) { + AppendBuiltinPassResourceBinding( + outBindings, + "PostProcessConstants", + Resources::ShaderResourceType::ConstantBuffer, + 0u, + 0u, + "PassConstants"); + AppendBuiltinPassResourceBinding( + outBindings, + "SourceColorTexture", + Resources::ShaderResourceType::Texture2D, + 1u, + 0u, + "SourceColorTexture"); + AppendBuiltinPassResourceBinding( + outBindings, + "LinearClampSampler", + Resources::ShaderResourceType::Sampler, + 2u, + 0u, + "LinearClampSampler"); + return true; + } + + if (ShaderPassMatchesBuiltinPass(shaderPass, BuiltinMaterialPass::FinalColor)) { + AppendBuiltinPassResourceBinding( + outBindings, + "FinalColorConstants", + Resources::ShaderResourceType::ConstantBuffer, + 0u, + 0u, + "PassConstants"); + AppendBuiltinPassResourceBinding( + outBindings, + "SourceColorTexture", + Resources::ShaderResourceType::Texture2D, + 1u, + 0u, + "SourceColorTexture"); + AppendBuiltinPassResourceBinding( + outBindings, + "LinearClampSampler", + Resources::ShaderResourceType::Sampler, + 2u, + 0u, + "LinearClampSampler"); + return true; + } + return false; } @@ -248,20 +352,15 @@ inline bool TryBuildBuiltinPassResourceBindingPlan( const Resources::ShaderPass& shaderPass, BuiltinPassResourceBindingPlan& outPlan, Containers::String* outError = nullptr) { - if (!shaderPass.resources.Empty()) { - return TryBuildBuiltinPassResourceBindingPlan(shaderPass.resources, outPlan, outError); - } - - Containers::Array implicitBindings; - if (!TryBuildImplicitBuiltinPassResourceBindings(shaderPass, implicitBindings)) { + if (shaderPass.resources.Empty()) { if (outError != nullptr) { - *outError = "Builtin pass does not declare explicit bindings and no implicit contract is available"; + *outError = "Builtin pass must declare explicit resource bindings"; } outPlan = {}; return false; } - return TryBuildBuiltinPassResourceBindingPlan(implicitBindings, outPlan, outError); + return TryBuildBuiltinPassResourceBindingPlan(shaderPass.resources, outPlan, outError); } inline RHI::DescriptorType ToBuiltinPassDescriptorType(Resources::ShaderResourceType type) { @@ -396,10 +495,28 @@ inline bool TryBuildBuiltinPassSetLayouts( case BuiltinPassResourceSemantic::ShadowReceiver: setLayout.usesShadowReceiver = true; break; + case BuiltinPassResourceSemantic::Environment: + setLayout.usesEnvironment = true; + break; + case BuiltinPassResourceSemantic::PassConstants: + setLayout.usesPassConstants = true; + break; case BuiltinPassResourceSemantic::BaseColorTexture: setLayout.usesTexture = true; setLayout.usesBaseColorTexture = true; break; + case BuiltinPassResourceSemantic::SourceColorTexture: + setLayout.usesTexture = true; + setLayout.usesSourceColorTexture = true; + break; + case BuiltinPassResourceSemantic::SkyboxPanoramicTexture: + setLayout.usesTexture = true; + setLayout.usesSkyboxPanoramicTexture = true; + break; + case BuiltinPassResourceSemantic::SkyboxTexture: + setLayout.usesTexture = true; + setLayout.usesSkyboxTexture = true; + break; case BuiltinPassResourceSemantic::ShadowMapTexture: setLayout.usesTexture = true; setLayout.usesShadowMapTexture = true; diff --git a/engine/src/Rendering/Detail/ShaderVariantUtils.h b/engine/src/Rendering/Detail/ShaderVariantUtils.h index 4bb695c7..e9e79c54 100644 --- a/engine/src/Rendering/Detail/ShaderVariantUtils.h +++ b/engine/src/Rendering/Detail/ShaderVariantUtils.h @@ -87,32 +87,16 @@ inline bool TryCollectShaderPassResourceBindings( Containers::Array& outBindings) { outBindings.Clear(); - if (!pass.resources.Empty()) { - outBindings.Reserve(pass.resources.Size()); - for (const Resources::ShaderResourceBindingDesc& binding : pass.resources) { - outBindings.PushBack(binding); - } - return true; + if (pass.resources.Empty()) { + return false; } - return TryBuildImplicitBuiltinPassResourceBindings(pass, outBindings); -} - -inline Containers::String ResolveLegacyHlslBindingDeclarationAlias( - const Resources::ShaderResourceBindingDesc& binding) { - switch (ResolveBuiltinPassResourceSemantic(binding)) { - case BuiltinPassResourceSemantic::BaseColorTexture: - return "gBaseColorTexture"; - case BuiltinPassResourceSemantic::ShadowMapTexture: - return "gShadowMapTexture"; - case BuiltinPassResourceSemantic::LinearClampSampler: - return "gLinearSampler"; - case BuiltinPassResourceSemantic::ShadowMapSampler: - return "gShadowMapSampler"; - case BuiltinPassResourceSemantic::Unknown: - default: - return Containers::String(); + outBindings.Reserve(pass.resources.Size()); + for (const Resources::ShaderResourceBindingDesc& binding : pass.resources) { + outBindings.PushBack(binding); } + + return true; } inline bool TryRewriteHlslRegisterBindingWithName( @@ -201,37 +185,6 @@ inline bool TryRewriteHlslRegisterBinding( return true; } - const Containers::String legacyAlias = ResolveLegacyHlslBindingDeclarationAlias(binding); - if (legacyAlias != binding.name && - TryRewriteHlslRegisterBindingWithName( - sourceText, - legacyAlias, - registerPrefix, - binding.binding, - binding.set, - includeRegisterSpace, - binding.type)) { - return true; - } - - if ((binding.type == Resources::ShaderResourceType::Texture2D || - binding.type == Resources::ShaderResourceType::TextureCube || - binding.type == Resources::ShaderResourceType::Sampler)) { - const Containers::String prefixedName = Containers::String("g") + binding.name; - if (prefixedName != binding.name && - prefixedName != legacyAlias && - TryRewriteHlslRegisterBindingWithName( - sourceText, - prefixedName, - registerPrefix, - binding.binding, - binding.set, - includeRegisterSpace, - binding.type)) { - return true; - } - } - return false; } @@ -243,21 +196,18 @@ inline bool TryBuildRuntimeShaderBindings( outBindings.Clear(); outIncludeRegisterSpace = false; + if (!TryCollectShaderPassResourceBindings(pass, outBindings)) { + return false; + } + if (backend == Resources::ShaderBackend::Vulkan) { outIncludeRegisterSpace = true; - return TryCollectShaderPassResourceBindings(pass, outBindings); + return true; } if (backend != Resources::ShaderBackend::D3D12 && backend != Resources::ShaderBackend::OpenGL) { - return false; - } - - if (!pass.resources.Empty()) { - return false; - } - - if (!TryBuildImplicitBuiltinPassResourceBindings(pass, outBindings)) { + outBindings.Clear(); return false; } diff --git a/engine/src/Resources/Shader/Internal/ShaderRuntimeBuildUtils.cpp b/engine/src/Resources/Shader/Internal/ShaderRuntimeBuildUtils.cpp index 98362895..7345c598 100644 --- a/engine/src/Resources/Shader/Internal/ShaderRuntimeBuildUtils.cpp +++ b/engine/src/Resources/Shader/Internal/ShaderRuntimeBuildUtils.cpp @@ -6,6 +6,7 @@ #include "ShaderFileUtils.h" #include +#include #include #include @@ -207,6 +208,14 @@ ShaderPass BuildConcretePass( for (const ShaderResourceBindingDesc& resourceBinding : pass.resources) { shaderPass.resources.PushBack(resourceBinding); } + if (shaderPass.resources.Empty()) { + Containers::Array defaultBindings; + if (::XCEngine::Rendering::TryBuildBuiltinPassDefaultResourceBindings(shaderPass, defaultBindings)) { + for (const ShaderResourceBindingDesc& resourceBinding : defaultBindings) { + shaderPass.resources.PushBack(resourceBinding); + } + } + } for (const ShaderKeywordDeclaration& keywordDeclaration : pass.keywordDeclarations) { shaderPass.keywordDeclarations.PushBack(keywordDeclaration); } diff --git a/tests/Rendering/unit/test_builtin_forward_pipeline.cpp b/tests/Rendering/unit/test_builtin_forward_pipeline.cpp index 2eac9b81..b172bf0d 100644 --- a/tests/Rendering/unit/test_builtin_forward_pipeline.cpp +++ b/tests/Rendering/unit/test_builtin_forward_pipeline.cpp @@ -74,6 +74,19 @@ std::string EscapeRegexLiteralForTest(const std::string& value) { << source; } +void AppendDefaultBuiltinPassResources(ShaderPass& pass) { + Array bindings; + const bool resolved = TryBuildBuiltinPassDefaultResourceBindings(pass, bindings); + EXPECT_TRUE(resolved); + if (!resolved) { + return; + } + + for (const ShaderResourceBindingDesc& binding : bindings) { + pass.resources.PushBack(binding); + } +} + } // namespace TEST(BuiltinForwardPipeline_Test, UsesFloat3PositionInputLayoutForStaticMeshVertices) { @@ -127,7 +140,7 @@ TEST(BuiltinForwardPipeline_Test, BuiltinForwardShaderUsesAuthoringSurfaceContra const ShaderPass* pass = shader->FindPass("ForwardLit"); ASSERT_NE(pass, nullptr); - EXPECT_TRUE(pass->resources.Empty()); + EXPECT_EQ(pass->resources.Size(), 8u); EXPECT_TRUE(pass->hasFixedFunctionState); EXPECT_EQ(pass->fixedFunctionState.cullMode, MaterialCullMode::Back); EXPECT_TRUE(pass->fixedFunctionState.depthWriteEnable); @@ -156,7 +169,7 @@ TEST(BuiltinForwardPipeline_Test, BuiltinUnlitShaderUsesAuthoringSurfaceContract const ShaderPass* pass = shader->FindPass("Unlit"); ASSERT_NE(pass, nullptr); - EXPECT_TRUE(pass->resources.Empty()); + EXPECT_EQ(pass->resources.Size(), 4u); EXPECT_TRUE(pass->hasFixedFunctionState); EXPECT_EQ(pass->fixedFunctionState.cullMode, MaterialCullMode::Back); EXPECT_TRUE(pass->fixedFunctionState.depthWriteEnable); @@ -602,7 +615,7 @@ TEST(BuiltinForwardPipeline_Test, BuiltinSkyboxShaderUsesAuthoringContract) { const ShaderPass* pass = shader->FindPass("Skybox"); ASSERT_NE(pass, nullptr); - EXPECT_TRUE(pass->resources.Empty()); + EXPECT_EQ(pass->resources.Size(), 5u); EXPECT_TRUE(pass->hasFixedFunctionState); EXPECT_EQ(pass->fixedFunctionState.cullMode, MaterialCullMode::None); EXPECT_FALSE(pass->fixedFunctionState.depthWriteEnable); @@ -636,7 +649,7 @@ TEST(BuiltinForwardPipeline_Test, BuiltinSkyboxShaderUsesAuthoringContract) { delete shader; } -TEST(BuiltinForwardPipeline_Test, BuildsBuiltinPassResourceBindingPlanFromImplicitSkyboxShaderContract) { +TEST(BuiltinForwardPipeline_Test, BuildsBuiltinPassResourceBindingPlanFromLoadedSkyboxShaderContract) { ShaderLoader loader; LoadResult result = loader.Load(GetBuiltinSkyboxShaderPath()); ASSERT_TRUE(result); @@ -674,7 +687,7 @@ TEST(BuiltinForwardPipeline_Test, BuiltinFinalColorShaderUsesAuthoringContract) const ShaderPass* pass = shader->FindPass("FinalColor"); ASSERT_NE(pass, nullptr); - EXPECT_TRUE(pass->resources.Empty()); + EXPECT_EQ(pass->resources.Size(), 3u); EXPECT_TRUE(pass->hasFixedFunctionState); EXPECT_EQ(pass->fixedFunctionState.cullMode, MaterialCullMode::None); EXPECT_FALSE(pass->fixedFunctionState.depthWriteEnable); @@ -699,7 +712,7 @@ TEST(BuiltinForwardPipeline_Test, BuiltinFinalColorShaderUsesAuthoringContract) delete shader; } -TEST(BuiltinForwardPipeline_Test, BuildsBuiltinPassResourceBindingPlanFromImplicitFinalColorShaderContract) { +TEST(BuiltinForwardPipeline_Test, BuildsBuiltinPassResourceBindingPlanFromLoadedFinalColorShaderContract) { ShaderLoader loader; LoadResult result = loader.Load(GetBuiltinFinalColorShaderPath()); ASSERT_TRUE(result); @@ -735,7 +748,7 @@ TEST(BuiltinForwardPipeline_Test, BuiltinColorScalePostProcessShaderUsesAuthorin const ShaderPass* pass = shader->FindPass("ColorScale"); ASSERT_NE(pass, nullptr); - EXPECT_TRUE(pass->resources.Empty()); + EXPECT_EQ(pass->resources.Size(), 3u); EXPECT_TRUE(pass->hasFixedFunctionState); EXPECT_EQ(pass->fixedFunctionState.cullMode, MaterialCullMode::None); EXPECT_FALSE(pass->fixedFunctionState.depthWriteEnable); @@ -748,7 +761,7 @@ TEST(BuiltinForwardPipeline_Test, BuiltinColorScalePostProcessShaderUsesAuthorin delete shader; } -TEST(BuiltinForwardPipeline_Test, BuildsBuiltinPassResourceBindingPlanFromImplicitColorScalePostProcessShaderContract) { +TEST(BuiltinForwardPipeline_Test, BuildsBuiltinPassResourceBindingPlanFromLoadedColorScalePostProcessShaderContract) { ShaderLoader loader; LoadResult result = loader.Load(GetBuiltinColorScalePostProcessShaderPath()); ASSERT_TRUE(result); @@ -806,11 +819,11 @@ TEST(BuiltinForwardPipeline_Test, VulkanRuntimeCompileDescRewritesAuthoringFinal "register(b0)")); EXPECT_TRUE(SourceContainsRegisterBinding( d3d12Source, - "Texture2D gSourceColorTexture", + "Texture2D SourceColorTexture", "register(t0)")); EXPECT_TRUE(SourceContainsRegisterBinding( d3d12Source, - "SamplerState gLinearClampSampler", + "SamplerState LinearClampSampler", "register(s0)")); EXPECT_EQ(d3d12Source.find("space0"), std::string::npos); EXPECT_EQ(d3d12Source.find("space1"), std::string::npos); @@ -832,11 +845,11 @@ TEST(BuiltinForwardPipeline_Test, VulkanRuntimeCompileDescRewritesAuthoringFinal "register(b0, space0)")); EXPECT_TRUE(SourceContainsRegisterBinding( runtimeSource, - "Texture2D gSourceColorTexture", + "Texture2D SourceColorTexture", "register(t0, space1)")); EXPECT_TRUE(SourceContainsRegisterBinding( runtimeSource, - "SamplerState gLinearClampSampler", + "SamplerState LinearClampSampler", "register(s0, space2)")); ShaderCompileDesc vulkanCompileDesc = {}; @@ -932,11 +945,11 @@ TEST(BuiltinForwardPipeline_Test, VulkanRuntimeCompileDescRewritesAuthoringColor "register(b0)")); EXPECT_TRUE(SourceContainsRegisterBinding( d3d12Source, - "Texture2D gSourceColorTexture", + "Texture2D SourceColorTexture", "register(t0)")); EXPECT_TRUE(SourceContainsRegisterBinding( d3d12Source, - "SamplerState gLinearClampSampler", + "SamplerState LinearClampSampler", "register(s0)")); EXPECT_EQ(d3d12Source.find("space0"), std::string::npos); EXPECT_EQ(d3d12Source.find("space1"), std::string::npos); @@ -958,11 +971,11 @@ TEST(BuiltinForwardPipeline_Test, VulkanRuntimeCompileDescRewritesAuthoringColor "register(b0, space0)")); EXPECT_TRUE(SourceContainsRegisterBinding( runtimeSource, - "Texture2D gSourceColorTexture", + "Texture2D SourceColorTexture", "register(t0, space1)")); EXPECT_TRUE(SourceContainsRegisterBinding( runtimeSource, - "SamplerState gLinearClampSampler", + "SamplerState LinearClampSampler", "register(s0, space2)")); ShaderCompileDesc vulkanCompileDesc = {}; @@ -974,7 +987,7 @@ TEST(BuiltinForwardPipeline_Test, VulkanRuntimeCompileDescRewritesAuthoringColor const std::string vulkanSource( reinterpret_cast(vulkanCompileDesc.source.data()), vulkanCompileDesc.source.size()); - EXPECT_NE(vulkanSource.find("gSourceColorTexture.Sample"), std::string::npos); + EXPECT_NE(vulkanSource.find("SourceColorTexture.Sample"), std::string::npos); EXPECT_NE(vulkanSource.find("gColorScale"), std::string::npos); delete shader; @@ -1025,7 +1038,7 @@ TEST(BuiltinForwardPipeline_Test, OpenGLRuntimeTranspilesColorScaleVariantToComb delete shader; } -TEST(BuiltinForwardPipeline_Test, BuildsBuiltinPassResourceBindingPlanFromLoadedImplicitForwardShader) { +TEST(BuiltinForwardPipeline_Test, BuildsBuiltinPassResourceBindingPlanFromLoadedForwardShaderContract) { ShaderLoader loader; LoadResult result = loader.Load(GetBuiltinForwardLitShaderPath()); ASSERT_TRUE(result); @@ -1065,6 +1078,7 @@ TEST(BuiltinForwardPipeline_Test, BuildsBuiltinPassResourceBindingPlanFromBuilti tag.name = "LightMode"; tag.value = "ForwardBase"; pass.tags.PushBack(tag); + AppendDefaultBuiltinPassResources(pass); BuiltinPassResourceBindingPlan plan = {}; String error; @@ -1081,7 +1095,7 @@ TEST(BuiltinForwardPipeline_Test, BuildsBuiltinPassResourceBindingPlanFromBuilti EXPECT_EQ(plan.descriptorSetCount, 8u); } -TEST(BuiltinForwardPipeline_Test, BuildsBuiltinPassResourceBindingPlanFromImplicitUnlitContract) { +TEST(BuiltinForwardPipeline_Test, BuildsBuiltinPassResourceBindingPlanFromLoadedUnlitShaderContract) { ShaderLoader loader; LoadResult result = loader.Load(GetBuiltinUnlitShaderPath()); ASSERT_TRUE(result); @@ -1109,7 +1123,7 @@ TEST(BuiltinForwardPipeline_Test, BuildsBuiltinPassResourceBindingPlanFromImplic delete shader; } -TEST(BuiltinForwardPipeline_Test, UsesNormalizedImplicitSetIndicesForForwardSurfaceResources) { +TEST(BuiltinForwardPipeline_Test, UsesLoadedForwardShaderResourceSetIndices) { ShaderLoader loader; LoadResult result = loader.Load(GetBuiltinForwardLitShaderPath()); ASSERT_TRUE(result); @@ -1120,7 +1134,7 @@ TEST(BuiltinForwardPipeline_Test, UsesNormalizedImplicitSetIndicesForForwardSurf const ShaderPass* pass = shader->FindPass("ForwardLit"); ASSERT_NE(pass, nullptr); - EXPECT_TRUE(pass->resources.Empty()); + EXPECT_EQ(pass->resources.Size(), 8u); BuiltinPassResourceBindingPlan plan = {}; String error; @@ -1138,7 +1152,7 @@ TEST(BuiltinForwardPipeline_Test, UsesNormalizedImplicitSetIndicesForForwardSurf delete shader; } -TEST(BuiltinPassLayout_Test, BuildsSharedSetLayoutsFromImplicitForwardResources) { +TEST(BuiltinPassLayout_Test, BuildsSharedSetLayoutsFromLoadedForwardShaderResources) { ShaderLoader loader; LoadResult result = loader.Load(GetBuiltinForwardLitShaderPath()); ASSERT_TRUE(result); @@ -1149,7 +1163,7 @@ TEST(BuiltinPassLayout_Test, BuildsSharedSetLayoutsFromImplicitForwardResources) const ShaderPass* pass = shader->FindPass("ForwardLit"); ASSERT_NE(pass, nullptr); - EXPECT_TRUE(pass->resources.Empty()); + EXPECT_EQ(pass->resources.Size(), 8u); BuiltinPassResourceBindingPlan plan = {}; String error; @@ -1209,7 +1223,7 @@ TEST(BuiltinDepthStylePass_Test, BuiltinDepthOnlyShaderUsesAuthoringContract) { const ShaderPass* pass = shader->FindPass("DepthOnly"); ASSERT_NE(pass, nullptr); - EXPECT_TRUE(pass->resources.Empty()); + EXPECT_EQ(pass->resources.Size(), 4u); EXPECT_TRUE(pass->hasFixedFunctionState); EXPECT_EQ(pass->fixedFunctionState.cullMode, MaterialCullMode::Back); EXPECT_TRUE(pass->fixedFunctionState.depthWriteEnable); @@ -1229,7 +1243,7 @@ TEST(BuiltinDepthStylePass_Test, BuiltinShadowCasterShaderUsesAuthoringContract) const ShaderPass* pass = shader->FindPass("ShadowCaster"); ASSERT_NE(pass, nullptr); - EXPECT_TRUE(pass->resources.Empty()); + EXPECT_EQ(pass->resources.Size(), 4u); EXPECT_TRUE(pass->hasFixedFunctionState); EXPECT_EQ(pass->fixedFunctionState.cullMode, MaterialCullMode::Back); EXPECT_TRUE(pass->fixedFunctionState.depthWriteEnable); @@ -1249,7 +1263,7 @@ TEST(BuiltinObjectIdPass_Test, BuiltinObjectIdShaderUsesAuthoringContract) { const ShaderPass* pass = shader->FindPass("ObjectId"); ASSERT_NE(pass, nullptr); - EXPECT_TRUE(pass->resources.Empty()); + EXPECT_EQ(pass->resources.Size(), 1u); EXPECT_TRUE(pass->hasFixedFunctionState); EXPECT_EQ(pass->fixedFunctionState.cullMode, MaterialCullMode::Back); EXPECT_TRUE(pass->fixedFunctionState.depthWriteEnable); @@ -1287,7 +1301,7 @@ TEST(BuiltinObjectIdPass_Test, BuildsBuiltinPassResourceBindingPlanFromBuiltinOb delete shader; } -TEST(BuiltinObjectIdPass_Test, BuildsBuiltinPassResourceBindingPlanFromImplicitObjectIdContract) { +TEST(BuiltinObjectIdPass_Test, BuildsBuiltinPassResourceBindingPlanFromExplicitObjectIdContract) { ShaderPass pass = {}; pass.name = "ObjectId"; @@ -1295,6 +1309,7 @@ TEST(BuiltinObjectIdPass_Test, BuildsBuiltinPassResourceBindingPlanFromImplicitO tag.name = "LightMode"; tag.value = "ObjectId"; pass.tags.PushBack(tag); + AppendDefaultBuiltinPassResources(pass); BuiltinPassResourceBindingPlan plan = {}; String error; @@ -1306,7 +1321,7 @@ TEST(BuiltinObjectIdPass_Test, BuildsBuiltinPassResourceBindingPlanFromImplicitO EXPECT_EQ(plan.descriptorSetCount, 1u); } -TEST(BuiltinDepthStylePass_Test, BuildsBuiltinPassResourceBindingPlanFromImplicitDepthOnlyContract) { +TEST(BuiltinDepthStylePass_Test, BuildsBuiltinPassResourceBindingPlanFromExplicitDepthOnlyContract) { ShaderPass pass = {}; pass.name = "DepthOnly"; @@ -1314,6 +1329,7 @@ TEST(BuiltinDepthStylePass_Test, BuildsBuiltinPassResourceBindingPlanFromImplici tag.name = "LightMode"; tag.value = "DepthOnly"; pass.tags.PushBack(tag); + AppendDefaultBuiltinPassResources(pass); BuiltinPassResourceBindingPlan plan = {}; String error; diff --git a/tests/Resources/Shader/test_shader_loader.cpp b/tests/Resources/Shader/test_shader_loader.cpp index f6a28c99..92580952 100644 --- a/tests/Resources/Shader/test_shader_loader.cpp +++ b/tests/Resources/Shader/test_shader_loader.cpp @@ -186,7 +186,7 @@ TEST(ShaderLoader, LoadShaderAuthoringBuildsMultiPassGenericVariants) { const ShaderPass* forwardLitPass = shader->FindPass("ForwardLit"); ASSERT_NE(forwardLitPass, nullptr); ASSERT_EQ(forwardLitPass->tags.Size(), 2u); - EXPECT_TRUE(forwardLitPass->resources.Empty()); + EXPECT_EQ(forwardLitPass->resources.Size(), 8u); ASSERT_NE(FindPassTag(forwardLitPass, "LightMode"), nullptr); ASSERT_NE(FindPassTag(forwardLitPass, "Queue"), nullptr); EXPECT_EQ(FindPassTag(forwardLitPass, "LightMode")->value, "ForwardBase"); @@ -395,7 +395,7 @@ TEST(ShaderLoader, LoadShaderAuthoringBuildsGenericHlslVariants) { EXPECT_EQ(pass->tags[1].value, "200"); EXPECT_EQ(pass->tags[2].name, "LightMode"); EXPECT_EQ(pass->tags[2].value, "ForwardLit"); - EXPECT_TRUE(pass->resources.Empty()); + EXPECT_EQ(pass->resources.Size(), 8u); ASSERT_EQ(pass->keywordDeclarations.Size(), 2u); EXPECT_EQ(pass->keywordDeclarations[0].type, ShaderKeywordDeclarationType::MultiCompile); ASSERT_EQ(pass->keywordDeclarations[0].options.Size(), 2u); @@ -1636,7 +1636,7 @@ TEST(ShaderLoader, AssetDatabaseCreatesShaderArtifactFromAuthoringAndLoaderReads const ShaderPass* pass = shader->FindPass("ForwardLit"); ASSERT_NE(pass, nullptr); ASSERT_EQ(pass->variants.Size(), 4u); - EXPECT_TRUE(pass->resources.Empty()); + EXPECT_EQ(pass->resources.Size(), 8u); const ShaderStageVariant* fragmentVariant = shader->FindVariant("ForwardLit", ShaderType::Fragment, ShaderBackend::OpenGL); @@ -1912,7 +1912,7 @@ TEST(ShaderLoader, LoadBuiltinForwardLitShaderBuildsAuthoringVariants) { ASSERT_EQ(shader->GetProperties().Size(), 3u); ASSERT_EQ(pass->variants.Size(), 8u); ASSERT_EQ(pass->tags.Size(), 1u); - EXPECT_TRUE(pass->resources.Empty()); + EXPECT_EQ(pass->resources.Size(), 8u); EXPECT_TRUE(pass->hasFixedFunctionState); EXPECT_EQ(pass->fixedFunctionState.cullMode, MaterialCullMode::Back); EXPECT_TRUE(pass->fixedFunctionState.depthWriteEnable); @@ -1935,11 +1935,11 @@ TEST(ShaderLoader, LoadBuiltinForwardLitShaderBuildsAuthoringVariants) { EXPECT_EQ(cutoffProperty->type, ShaderPropertyType::Range); EXPECT_EQ(cutoffProperty->semantic, "AlphaCutoff"); - EXPECT_EQ(shader->FindPassResourceBinding("ForwardLit", "PerObjectConstants"), nullptr); - EXPECT_EQ(shader->FindPassResourceBinding("ForwardLit", "LightingConstants"), nullptr); - EXPECT_EQ(shader->FindPassResourceBinding("ForwardLit", "ShadowReceiverConstants"), nullptr); - EXPECT_EQ(shader->FindPassResourceBinding("ForwardLit", "BaseColorTexture"), nullptr); - EXPECT_EQ(shader->FindPassResourceBinding("ForwardLit", "ShadowMapTexture"), nullptr); + EXPECT_NE(shader->FindPassResourceBinding("ForwardLit", "PerObjectConstants"), nullptr); + EXPECT_NE(shader->FindPassResourceBinding("ForwardLit", "LightingConstants"), nullptr); + EXPECT_NE(shader->FindPassResourceBinding("ForwardLit", "ShadowReceiverConstants"), nullptr); + EXPECT_NE(shader->FindPassResourceBinding("ForwardLit", "BaseColorTexture"), nullptr); + EXPECT_NE(shader->FindPassResourceBinding("ForwardLit", "ShadowMapTexture"), nullptr); ASSERT_EQ(pass->keywordDeclarations.Size(), 2u); EXPECT_EQ(pass->keywordDeclarations[0].type, ShaderKeywordDeclarationType::MultiCompile); ASSERT_EQ(pass->keywordDeclarations[0].options.Size(), 2u); @@ -2087,7 +2087,7 @@ TEST(ShaderLoader, LoadBuiltinUnlitShaderBuildsAuthoringVariants) { ASSERT_EQ(shader->GetProperties().Size(), 2u); ASSERT_EQ(pass->variants.Size(), 2u); ASSERT_EQ(pass->tags.Size(), 1u); - EXPECT_TRUE(pass->resources.Empty()); + EXPECT_EQ(pass->resources.Size(), 4u); EXPECT_TRUE(pass->hasFixedFunctionState); EXPECT_EQ(pass->fixedFunctionState.cullMode, MaterialCullMode::Back); EXPECT_TRUE(pass->fixedFunctionState.depthWriteEnable); @@ -2105,7 +2105,7 @@ TEST(ShaderLoader, LoadBuiltinUnlitShaderBuildsAuthoringVariants) { EXPECT_EQ(baseMapProperty->type, ShaderPropertyType::Texture2D); EXPECT_EQ(baseMapProperty->semantic, "BaseColorTexture"); - EXPECT_EQ(shader->FindPassResourceBinding("Unlit", "PerObjectConstants"), nullptr); + EXPECT_NE(shader->FindPassResourceBinding("Unlit", "PerObjectConstants"), nullptr); EXPECT_NE(shader->FindVariant("Unlit", ShaderType::Vertex, ShaderBackend::D3D12), nullptr); EXPECT_NE(shader->FindVariant("Unlit", ShaderType::Fragment, ShaderBackend::D3D12), nullptr); @@ -2162,7 +2162,7 @@ TEST(ShaderLoader, LoadBuiltinObjectIdShaderBuildsAuthoringVariants) { const ShaderPass* pass = shader->FindPass("ObjectId"); ASSERT_NE(pass, nullptr); - EXPECT_TRUE(pass->resources.Empty()); + EXPECT_EQ(pass->resources.Size(), 1u); EXPECT_TRUE(pass->hasFixedFunctionState); EXPECT_EQ(pass->fixedFunctionState.cullMode, MaterialCullMode::Back); EXPECT_TRUE(pass->fixedFunctionState.depthWriteEnable); @@ -2228,7 +2228,7 @@ TEST(ShaderLoader, LoadBuiltinDepthOnlyShaderBuildsAuthoringVariants) { const ShaderPass* pass = shader->FindPass("DepthOnly"); ASSERT_NE(pass, nullptr); ASSERT_EQ(shader->GetProperties().Size(), 3u); - EXPECT_TRUE(pass->resources.Empty()); + EXPECT_EQ(pass->resources.Size(), 4u); EXPECT_TRUE(pass->hasFixedFunctionState); EXPECT_EQ(pass->fixedFunctionState.cullMode, MaterialCullMode::Back); EXPECT_TRUE(pass->fixedFunctionState.depthWriteEnable); @@ -2259,10 +2259,10 @@ TEST(ShaderLoader, LoadBuiltinDepthOnlyShaderBuildsAuthoringVariants) { EXPECT_EQ(baseMapProperty->type, ShaderPropertyType::Texture2D); EXPECT_EQ(baseMapProperty->semantic, "BaseColorTexture"); - EXPECT_EQ(shader->FindPassResourceBinding("DepthOnly", "PerObjectConstants"), nullptr); - EXPECT_EQ(shader->FindPassResourceBinding("DepthOnly", "MaterialConstants"), nullptr); - EXPECT_EQ(shader->FindPassResourceBinding("DepthOnly", "BaseColorTexture"), nullptr); - EXPECT_EQ(shader->FindPassResourceBinding("DepthOnly", "LinearClampSampler"), nullptr); + EXPECT_NE(shader->FindPassResourceBinding("DepthOnly", "PerObjectConstants"), nullptr); + EXPECT_NE(shader->FindPassResourceBinding("DepthOnly", "MaterialConstants"), nullptr); + EXPECT_NE(shader->FindPassResourceBinding("DepthOnly", "BaseColorTexture"), nullptr); + EXPECT_NE(shader->FindPassResourceBinding("DepthOnly", "LinearClampSampler"), nullptr); EXPECT_NE(shader->FindVariant("DepthOnly", ShaderType::Vertex, ShaderBackend::D3D12), nullptr); EXPECT_NE(shader->FindVariant("DepthOnly", ShaderType::Fragment, ShaderBackend::D3D12), nullptr); @@ -2354,7 +2354,7 @@ TEST(ShaderLoader, LoadBuiltinShadowCasterShaderBuildsAuthoringVariants) { const ShaderPass* pass = shader->FindPass("ShadowCaster"); ASSERT_NE(pass, nullptr); ASSERT_EQ(shader->GetProperties().Size(), 3u); - EXPECT_TRUE(pass->resources.Empty()); + EXPECT_EQ(pass->resources.Size(), 4u); EXPECT_TRUE(pass->hasFixedFunctionState); EXPECT_EQ(pass->fixedFunctionState.cullMode, MaterialCullMode::Back); EXPECT_TRUE(pass->fixedFunctionState.depthWriteEnable); @@ -2385,10 +2385,10 @@ TEST(ShaderLoader, LoadBuiltinShadowCasterShaderBuildsAuthoringVariants) { EXPECT_EQ(baseMapProperty->type, ShaderPropertyType::Texture2D); EXPECT_EQ(baseMapProperty->semantic, "BaseColorTexture"); - EXPECT_EQ(shader->FindPassResourceBinding("ShadowCaster", "PerObjectConstants"), nullptr); - EXPECT_EQ(shader->FindPassResourceBinding("ShadowCaster", "MaterialConstants"), nullptr); - EXPECT_EQ(shader->FindPassResourceBinding("ShadowCaster", "BaseColorTexture"), nullptr); - EXPECT_EQ(shader->FindPassResourceBinding("ShadowCaster", "LinearClampSampler"), nullptr); + EXPECT_NE(shader->FindPassResourceBinding("ShadowCaster", "PerObjectConstants"), nullptr); + EXPECT_NE(shader->FindPassResourceBinding("ShadowCaster", "MaterialConstants"), nullptr); + EXPECT_NE(shader->FindPassResourceBinding("ShadowCaster", "BaseColorTexture"), nullptr); + EXPECT_NE(shader->FindPassResourceBinding("ShadowCaster", "LinearClampSampler"), nullptr); EXPECT_NE(shader->FindVariant("ShadowCaster", ShaderType::Vertex, ShaderBackend::D3D12), nullptr); EXPECT_NE(shader->FindVariant("ShadowCaster", ShaderType::Fragment, ShaderBackend::D3D12), nullptr); @@ -2482,7 +2482,7 @@ TEST(ShaderLoader, LoadBuiltinFinalColorShaderBuildsAuthoringVariants) { ASSERT_EQ(shader->GetProperties().Size(), 4u); ASSERT_EQ(pass->variants.Size(), 2u); ASSERT_EQ(pass->tags.Size(), 1u); - EXPECT_TRUE(pass->resources.Empty()); + EXPECT_EQ(pass->resources.Size(), 3u); EXPECT_TRUE(pass->hasFixedFunctionState); EXPECT_EQ(pass->fixedFunctionState.cullMode, MaterialCullMode::None); EXPECT_FALSE(pass->fixedFunctionState.depthWriteEnable); @@ -2533,7 +2533,7 @@ TEST(ShaderLoader, LoadBuiltinFinalColorShaderBuildsAuthoringVariants) { EXPECT_EQ(openglFragment->language, ShaderLanguage::HLSL); EXPECT_EQ(openglFragment->entryPoint, "MainPS"); EXPECT_EQ(openglFragment->profile, "ps_5_0"); - EXPECT_NE(std::string(openglFragment->sourceCode.CStr()).find("gSourceColorTexture.Sample"), std::string::npos); + EXPECT_NE(std::string(openglFragment->sourceCode.CStr()).find("SourceColorTexture.Sample"), std::string::npos); const ShaderStageVariant* vulkanFragment = shader->FindVariant( "FinalColor", @@ -2565,7 +2565,7 @@ TEST(ShaderLoader, LoadBuiltinColorScalePostProcessShaderBuildsAuthoringVariants ASSERT_EQ(shader->GetProperties().Size(), 1u); ASSERT_EQ(pass->variants.Size(), 2u); ASSERT_EQ(pass->tags.Size(), 1u); - EXPECT_TRUE(pass->resources.Empty()); + EXPECT_EQ(pass->resources.Size(), 3u); EXPECT_TRUE(pass->hasFixedFunctionState); EXPECT_EQ(pass->fixedFunctionState.cullMode, MaterialCullMode::None); EXPECT_FALSE(pass->fixedFunctionState.depthWriteEnable); @@ -2604,7 +2604,7 @@ TEST(ShaderLoader, LoadBuiltinColorScalePostProcessShaderBuildsAuthoringVariants EXPECT_EQ(openglFragment->language, ShaderLanguage::HLSL); EXPECT_EQ(openglFragment->entryPoint, "MainPS"); EXPECT_EQ(openglFragment->profile, "ps_5_0"); - EXPECT_NE(std::string(openglFragment->sourceCode.CStr()).find("gSourceColorTexture.Sample"), std::string::npos); + EXPECT_NE(std::string(openglFragment->sourceCode.CStr()).find("SourceColorTexture.Sample"), std::string::npos); const ShaderStageVariant* vulkanFragment = shader->FindVariant( "ColorScale", @@ -2616,7 +2616,7 @@ TEST(ShaderLoader, LoadBuiltinColorScalePostProcessShaderBuildsAuthoringVariants EXPECT_EQ(vulkanFragment->entryPoint, "MainPS"); EXPECT_EQ(vulkanFragment->profile, "ps_5_0"); EXPECT_NE(std::string(vulkanFragment->sourceCode.CStr()).find("gColorScale"), std::string::npos); - EXPECT_NE(std::string(vulkanFragment->sourceCode.CStr()).find("gSourceColorTexture.Sample"), std::string::npos); + EXPECT_NE(std::string(vulkanFragment->sourceCode.CStr()).find("SourceColorTexture.Sample"), std::string::npos); delete shader; }