From 9097426babb2d099e9c3cd19fecb3c961209a147 Mon Sep 17 00:00:00 2001 From: Jonas Sideravicius Date: Thu, 22 Apr 2021 16:09:39 +0300 Subject: [PATCH 1/2] adding FB Fetch macros and PLATFORM_SUPPORTS_NATIVE_RENDERPASS --- .../ShaderLibrary/API/Metal.hlsl | 4 ++ .../ShaderLibrary/API/Vulkan.hlsl | 2 + .../ShaderLibrary/Common.hlsl | 71 +++++++++++++++++++ 3 files changed, 77 insertions(+) diff --git a/com.unity.render-pipelines.core/ShaderLibrary/API/Metal.hlsl b/com.unity.render-pipelines.core/ShaderLibrary/API/Metal.hlsl index f74388020bb..a1ce94fe874 100644 --- a/com.unity.render-pipelines.core/ShaderLibrary/API/Metal.hlsl +++ b/com.unity.render-pipelines.core/ShaderLibrary/API/Metal.hlsl @@ -133,3 +133,7 @@ #define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2) #define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2) #define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2) + +#if defined(SHADER_API_MOBILE) +#define PLATFORM_SUPPORTS_NATIVE_RENDERPASS +#endif diff --git a/com.unity.render-pipelines.core/ShaderLibrary/API/Vulkan.hlsl b/com.unity.render-pipelines.core/ShaderLibrary/API/Vulkan.hlsl index da2442be658..60e01c1476e 100644 --- a/com.unity.render-pipelines.core/ShaderLibrary/API/Vulkan.hlsl +++ b/com.unity.render-pipelines.core/ShaderLibrary/API/Vulkan.hlsl @@ -134,3 +134,5 @@ #define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2) #define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2) #define GATHER_ALPHA_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherAlpha(samplerName, coord2) + +#define PLATFORM_SUPPORTS_NATIVE_RENDERPASS diff --git a/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl b/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl index ebd7569ef6e..cbff5cf85f1 100644 --- a/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl +++ b/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl @@ -201,6 +201,77 @@ #define PLATFORM_SUPPORTS_PRIMITIVE_ID_IN_PIXEL_SHADER #endif +#if defined(PLATFORM_SUPPORTS_NATIVE_RENDERPASS) + + #if defined(UNITY_COMPILER_DXC) + + //Subpass inputs are disallowed in non-fragment shader stages with DXC so we need some dummy value to use in the fragment function while it's not bing compiled + #if defined(SHADER_STAGE_FRAGMENT) + #define UNITY_DXC_SUBPASS_INPUT_TYPE_INDEX(type, idx) [[vk::input_attachment_index(idx)]] SubpassInput hlslcc_fbinput_##idx + #define UNITY_DXC_SUBPASS_INPUT_TYPE_INDEX_MS(type, idx) [[vk::input_attachment_index(idx)]] SubpassInputMS hlslcc_fbinput_##idx + #else + //declaring dummy resources here so that non-fragment shader stage automatic bindings wouldn't diverge from the fragment shader (important for vulkan) + #define UNITY_DXC_SUBPASS_INPUT_TYPE_INDEX(type, idx) Texture2D dxc_dummy_fbinput_resource##idx; static type DXC_DummySubpassVariable##idx = type(0).xxxx; + #define UNITY_DXC_SUBPASS_INPUT_TYPE_INDEX_MS(type, idx) Texture2D dxc_dummy_fbinput_resource##idx; static type DXC_DummySubpassVariable##idx = type(0).xxxx + #endif + // Renderpass inputs: Vulkan/Metal subpass input + #define FRAMEBUFFER_INPUT_FLOAT(idx) UNITY_DXC_SUBPASS_INPUT_TYPE_INDEX(float, idx) + #define FRAMEBUFFER_INPUT_FLOAT_MS(idx) UNITY_DXC_SUBPASS_INPUT_TYPE_INDEX_MS(float, idx) + // For halfs + #define FRAMEBUFFER_INPUT_HALF(idx) UNITY_DXC_SUBPASS_INPUT_TYPE_INDEX(half, idx) + #define FRAMEBUFFER_INPUT_HALF_MS(idx) UNITY_DXC_SUBPASS_INPUT_TYPE_INDEX_MS(half, idx) + // For ints + #define FRAMEBUFFER_INPUT_INT(idx) UNITY_DXC_SUBPASS_INPUT_TYPE_INDEX(int, idx) + #define FRAMEBUFFER_INPUT_INT_MS(idx) UNITY_DXC_SUBPASS_INPUT_TYPE_INDEX_MS(int, idx) + // For uints + #define FRAMEBUFFER_INPUT_UINT(idx) UNITY_DXC_SUBPASS_INPUT_TYPE_INDEX(uint, idx) + #define FRAMEBUFFER_INPUT_UINT_MS(idx) UNITY_DXC_SUBPASS_INPUT_TYPE_INDEX_MS(uint, idx) + + #if defined(SHADER_STAGE_FRAGMENT) + #define LOAD_FRAMEBUFFER_INPUT(idx, v2fname) hlslcc_fbinput_##idx.SubpassLoad() + #define LOAD_FRAMEBUFFER_INPUT_MS(idx, sampleIdx, v2fname) hlslcc_fbinput_##idx.SubpassLoad(sampleIdx) + #else + #define LOAD_FRAMEBUFFER_INPUT(idx, v2fname) DXC_DummySubpassVariable##idx + #define LOAD_FRAMEBUFFER_INPUT_MS(idx, sampleIdx, v2fname) DXC_DummySubpassVariable##idx + #endif + #else + // For floats + #define FRAMEBUFFER_INPUT_FLOAT(idx) cbuffer hlslcc_SubpassInput_f_##idx { float4 hlslcc_fbinput_##idx; } + #define FRAMEBUFFER_INPUT_FLOAT_MS(idx) cbuffer hlslcc_SubpassInput_F_##idx { float4 hlslcc_fbinput_##idx[8]; } + // For halfs + #define FRAMEBUFFER_INPUT_HALF(idx) cbuffer hlslcc_SubpassInput_h_##idx { half4 hlslcc_fbinput_##idx; } + #define FRAMEBUFFER_INPUT_HALF_MS(idx) cbuffer hlslcc_SubpassInput_H_##idx { half4 hlslcc_fbinput_##idx[8]; } + // For ints + #define FRAMEBUFFER_INPUT_INT(idx) cbuffer hlslcc_SubpassInput_i_##idx { int4 hlslcc_fbinput_##idx; } + #define FRAMEBUFFER_INPUT_INT_MS(idx) cbuffer hlslcc_SubpassInput_I_##idx { int4 hlslcc_fbinput_##idx[8]; } + // For uints + #define FRAMEBUFFER_INPUT_UINT(idx) cbuffer hlslcc_SubpassInput_u_##idx { uint4 hlslcc_fbinput_##idx; } + #define FRAMEBUFFER_INPUT_UINT_MS(idx) cbuffer hlslcc_SubpassInput_U_##idx { uint4 hlslcc_fbinput_##idx[8]; } + + #define LOAD_FRAMEBUFFER_INPUT(idx, v2fname) hlslcc_fbinput_##idx + #define LOAD_FRAMEBUFFER_INPUT_MS(idx, sampleIdx, v2fname) hlslcc_fbinput_##idx[sampleIdx] + #endif + +#else + +// Renderpass inputs: General fallback paths +#define FRAMEBUFFER_INPUT_FLOAT(idx) TEXTURE2D_FLOAT(_UnityFBInput##idx); float4 _UnityFBInput##idx##_TexelSize +#define FRAMEBUFFER_INPUT_HALF(idx) TEXTURE2D_HALF(_UnityFBInput##idx); float4 _UnityFBInput##idx##_TexelSize +#define FRAMEBUFFER_INPUT_INT(idx) TEXTURE2D_INT(_UnityFBInput##idx); float4 _UnityFBInput##idx##_TexelSize +#define FRAMEBUFFER_INPUT_UINT(idx) TEXTURE2D_UINT(_UnityFBInput##idx); float4 _UnityFBInput##idx##_TexelSize + +#define LOAD_FRAMEBUFFER_INPUT(idx, v2fvertexname) _UnityFBInput##idx.Load(uint3(v2fvertexname.xy, 0)) + +#define FRAMEBUFFER_INPUT_FLOAT_MS(idx) Texture2DMS _UnityFBInput##idx; float4 _UnityFBInput##idx##_TexelSize +#define FRAMEBUFFER_INPUT_HALF_MS(idx) Texture2DMS _UnityFBInput##idx; float4 _UnityFBInput##idx##_TexelSize +#define FRAMEBUFFER_INPUT_INT_MS(idx) Texture2DMS _UnityFBInput##idx; float4 _UnityFBInput##idx##_TexelSize +#define FRAMEBUFFER_INPUT_UINT_MS(idx) Texture2DMS _UnityFBInput##idx; float4 _UnityFBInput##idx##_TexelSize + +#define LOAD_FRAMEBUFFER_INPUT_MS(idx, sampleIdx, v2fvertexname) _UnityFBInput##idx.Load(uint2(v2fvertexname.xy), sampleIdx) + + +#endif + // ---------------------------------------------------------------------------- // Common intrinsic (general implementation of intrinsic available on some platform) // ---------------------------------------------------------------------------- From 17faf71af6e95138b385b810a7d2053777a8cb7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Sideravi=C4=8Dius?= Date: Wed, 28 Apr 2021 17:22:30 +0300 Subject: [PATCH 2/2] Update com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl Co-authored-by: Felipe Lira --- com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl b/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl index cbff5cf85f1..93457366095 100644 --- a/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl +++ b/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl @@ -205,7 +205,7 @@ #if defined(UNITY_COMPILER_DXC) - //Subpass inputs are disallowed in non-fragment shader stages with DXC so we need some dummy value to use in the fragment function while it's not bing compiled + //Subpass inputs are disallowed in non-fragment shader stages with DXC so we need some dummy value to use in the fragment function while it's not being compiled #if defined(SHADER_STAGE_FRAGMENT) #define UNITY_DXC_SUBPASS_INPUT_TYPE_INDEX(type, idx) [[vk::input_attachment_index(idx)]] SubpassInput hlslcc_fbinput_##idx #define UNITY_DXC_SUBPASS_INPUT_TYPE_INDEX_MS(type, idx) [[vk::input_attachment_index(idx)]] SubpassInputMS hlslcc_fbinput_##idx