From 46d283d0b63cbf65cfe4edc5ce34c6b0f39500c9 Mon Sep 17 00:00:00 2001 From: StarBeats <977663818@qq.com> Date: Wed, 11 Dec 2024 17:42:08 +0800 Subject: [PATCH] dx12 vrs --- .../Plugins/Windows/GfxPluginNativeRender.dll | Bin 195072 -> 274944 bytes Assets/Settings/Mobile/Mobile_High.asset | 4 +- .../LowQualityVolumeProfile.asset | 4 +- .../.vscode/compile_commands.json | 12 +- NativeRenderPlugin/PlatformBase.h | 78 +- NativeRenderPlugin/RenderAPI.h | 4 +- NativeRenderPlugin/RenderAPI_D3D11.cpp | 223 +-- NativeRenderPlugin/RenderAPI_D3D12.cpp | 1557 +---------------- NativeRenderPlugin/RenderAPI_Vulkan.cpp | 2 +- NativeRenderPlugin/RenderingPlugin.cpp | 70 +- NativeRenderPlugin/xmake.lua | 18 + .../Runtime/Passes/DrawObjectsPass.cs | 23 +- .../NatvieHelper/RenderingPlugin.cs | 24 +- .../Runtime/SuperRendering/SR/Scripts/GSR.cs | 1 - .../Runtime/SuperRendering/SR/Scripts/SR.cs | 5 + .../Runtime/SuperRendering/SRSettings.cs | 2 + Packages/manifest.json | 2 +- Packages/packages-lock.json | 4 +- ProjectSettings/ProjectSettings.asset | 5 +- ProjectSettings/ProjectVersion.txt | 6 +- UserSettings/EditorUserSettings.asset | 10 +- UserSettings/Layouts/default-2022.dwlt | 993 ++++++----- 22 files changed, 770 insertions(+), 2277 deletions(-) diff --git a/Assets/Plugins/Windows/GfxPluginNativeRender.dll b/Assets/Plugins/Windows/GfxPluginNativeRender.dll index 3c111406a0be8bff70c9feeacf3e57582e700267..da471a71d7a2c81a6f90472840969fdff492ff63 100644 GIT binary patch literal 274944 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%0AA?ao6Dy<~7585OvI^d21ZN{a zkV*;vE$9HBu+9i#P~?HYGYH&4ssC^^KoMP!mP(XEUS>=X+>d6H|2~k|rK1nu$I7(- zw}Og9H-qSe-Mw5RN0;he7!hg2a*1muptIDiT>hX8A|x@Wz+Inu3u-+Wv4CmBQW~

L9m@8ZKM8zr_GH88B6$XPAzk1dnD|oI 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 diff --git a/Assets/Settings/Mobile/Mobile_High.asset b/Assets/Settings/Mobile/Mobile_High.asset index 57dc1a0..1439f87 100644 --- a/Assets/Settings/Mobile/Mobile_High.asset +++ b/Assets/Settings/Mobile/Mobile_High.asset @@ -38,7 +38,7 @@ MonoBehaviour: m_MainLightRenderingMode: 1 m_MainLightShadowsSupported: 1 m_MainLightShadowmapResolution: 1024 - m_AdditionalLightsRenderingMode: 1 + m_AdditionalLightsRenderingMode: 2 m_AdditionalLightsPerObjectLimit: 4 m_AdditionalLightShadowsSupported: 0 m_AdditionalLightsShadowmapResolution: 2048 @@ -116,4 +116,4 @@ MonoBehaviour: m_ShadowCascades: 0 superResolution: 0 sSRenderScale: 0 - vrsRate: 0 + vrsRate: 3 diff --git a/Assets/Settings/VolumeProfiles/LowQualityVolumeProfile.asset b/Assets/Settings/VolumeProfiles/LowQualityVolumeProfile.asset index dca5749..babaaff 100644 --- a/Assets/Settings/VolumeProfiles/LowQualityVolumeProfile.asset +++ b/Assets/Settings/VolumeProfiles/LowQualityVolumeProfile.asset @@ -181,10 +181,10 @@ MonoBehaviour: m_OverrideState: 0 m_Value: 3 hueShiftAmount: - m_OverrideState: 0 + m_OverrideState: 1 m_Value: 0 detectPaperWhite: - m_OverrideState: 0 + m_OverrideState: 1 m_Value: 0 paperWhite: m_OverrideState: 0 diff --git a/NativeRenderPlugin/.vscode/compile_commands.json b/NativeRenderPlugin/.vscode/compile_commands.json index bd55541..2b36e60 100644 --- a/NativeRenderPlugin/.vscode/compile_commands.json +++ b/NativeRenderPlugin/.vscode/compile_commands.json @@ -1,31 +1,31 @@ [ { "directory": "G:\\TJURP\\NativeRenderPlugin", - "arguments": ["C:\\Users\\xinyt\\AppData\\Local\\OpenHarmony\\Sdk\\12\\native\\llvm\\bin\\clang.exe", "-c", "-Qunused-arguments", "-D__MUSL__", "--target=aarch64-linux-ohos", "--sysroot=C:/Users/xinyt/AppData/Local/OpenHarmony/Sdk/12/native/sysroot", "-fPIC", "-std=c++20", "-Igl3w", "-IUnity", "-DSUPPORT_VULKAN=1", "-DSUPPORT_OPENGL_UNIFIED=1", "-DSUPPORT_OPENGL_ES=1", "-DOHOS=1", "-IC:\\Program Files\\Huawei\\DevEco Studio\\sdk\\default\\hms\\native\\sysroot\\usr\\include", "-DMYCLANG", "-DOHOS_STL=c++_shared", "-o", "build\\.objs\\GfxPluginNativeRender\\harmonyos\\aarch64\\debug\\RenderAPI.cpp.o", "RenderAPI.cpp"], + "arguments": ["C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.41.34120\\bin\\HostX64\\x64\\cl.exe", "/c", "/nologo", "/std:c++20", "/Igl3w", "/IUnity", "/IC:\\VulkanSDK\\1.3.283.0\\Include", "/DNOMINMAX", "/DSUPPORT_D3D11=1", "/DSUPPORT_D3D12=1", "/DSUPPORT_VULKAN=1", "/EHsc", "/Fobuild\\.objs\\GfxPluginNativeRender\\windows\\x64\\release\\RenderAPI.cpp.obj", "RenderAPI.cpp"], "file": "RenderAPI.cpp" }, { "directory": "G:\\TJURP\\NativeRenderPlugin", - "arguments": ["C:\\Users\\xinyt\\AppData\\Local\\OpenHarmony\\Sdk\\12\\native\\llvm\\bin\\clang.exe", "-c", "-Qunused-arguments", "-D__MUSL__", "--target=aarch64-linux-ohos", "--sysroot=C:/Users/xinyt/AppData/Local/OpenHarmony/Sdk/12/native/sysroot", "-fPIC", "-std=c++20", "-Igl3w", "-IUnity", "-DSUPPORT_VULKAN=1", "-DSUPPORT_OPENGL_UNIFIED=1", "-DSUPPORT_OPENGL_ES=1", "-DOHOS=1", "-IC:\\Program Files\\Huawei\\DevEco Studio\\sdk\\default\\hms\\native\\sysroot\\usr\\include", "-DMYCLANG", "-DOHOS_STL=c++_shared", "-o", "build\\.objs\\GfxPluginNativeRender\\harmonyos\\aarch64\\debug\\RenderAPI_D3D11.cpp.o", "RenderAPI_D3D11.cpp"], + "arguments": ["C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.41.34120\\bin\\HostX64\\x64\\cl.exe", "/c", "/nologo", "/std:c++20", "/Igl3w", "/IUnity", "/IC:\\VulkanSDK\\1.3.283.0\\Include", "/DNOMINMAX", "/DSUPPORT_D3D11=1", "/DSUPPORT_D3D12=1", "/DSUPPORT_VULKAN=1", "/EHsc", "/Fobuild\\.objs\\GfxPluginNativeRender\\windows\\x64\\release\\RenderAPI_D3D11.cpp.obj", "RenderAPI_D3D11.cpp"], "file": "RenderAPI_D3D11.cpp" }, { "directory": "G:\\TJURP\\NativeRenderPlugin", - "arguments": ["C:\\Users\\xinyt\\AppData\\Local\\OpenHarmony\\Sdk\\12\\native\\llvm\\bin\\clang.exe", "-c", "-Qunused-arguments", "-D__MUSL__", "--target=aarch64-linux-ohos", "--sysroot=C:/Users/xinyt/AppData/Local/OpenHarmony/Sdk/12/native/sysroot", "-fPIC", "-std=c++20", "-Igl3w", "-IUnity", "-DSUPPORT_VULKAN=1", "-DSUPPORT_OPENGL_UNIFIED=1", "-DSUPPORT_OPENGL_ES=1", "-DOHOS=1", "-IC:\\Program Files\\Huawei\\DevEco Studio\\sdk\\default\\hms\\native\\sysroot\\usr\\include", "-DMYCLANG", "-DOHOS_STL=c++_shared", "-o", "build\\.objs\\GfxPluginNativeRender\\harmonyos\\aarch64\\debug\\RenderAPI_D3D12.cpp.o", "RenderAPI_D3D12.cpp"], + "arguments": ["C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.41.34120\\bin\\HostX64\\x64\\cl.exe", "/c", "/nologo", "/std:c++20", "/Igl3w", "/IUnity", "/IC:\\VulkanSDK\\1.3.283.0\\Include", "/DNOMINMAX", "/DSUPPORT_D3D11=1", "/DSUPPORT_D3D12=1", "/DSUPPORT_VULKAN=1", "/EHsc", "/Fobuild\\.objs\\GfxPluginNativeRender\\windows\\x64\\release\\RenderAPI_D3D12.cpp.obj", "RenderAPI_D3D12.cpp"], "file": "RenderAPI_D3D12.cpp" }, { "directory": "G:\\TJURP\\NativeRenderPlugin", - "arguments": ["C:\\Users\\xinyt\\AppData\\Local\\OpenHarmony\\Sdk\\12\\native\\llvm\\bin\\clang.exe", "-c", "-Qunused-arguments", "-D__MUSL__", "--target=aarch64-linux-ohos", "--sysroot=C:/Users/xinyt/AppData/Local/OpenHarmony/Sdk/12/native/sysroot", "-fPIC", "-std=c++20", "-Igl3w", "-IUnity", "-DSUPPORT_VULKAN=1", "-DSUPPORT_OPENGL_UNIFIED=1", "-DSUPPORT_OPENGL_ES=1", "-DOHOS=1", "-IC:\\Program Files\\Huawei\\DevEco Studio\\sdk\\default\\hms\\native\\sysroot\\usr\\include", "-DMYCLANG", "-DOHOS_STL=c++_shared", "-o", "build\\.objs\\GfxPluginNativeRender\\harmonyos\\aarch64\\debug\\RenderAPI_OpenGLCoreES.cpp.o", "RenderAPI_OpenGLCoreES.cpp"], + "arguments": ["C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.41.34120\\bin\\HostX64\\x64\\cl.exe", "/c", "/nologo", "/std:c++20", "/Igl3w", "/IUnity", "/IC:\\VulkanSDK\\1.3.283.0\\Include", "/DNOMINMAX", "/DSUPPORT_D3D11=1", "/DSUPPORT_D3D12=1", "/DSUPPORT_VULKAN=1", "/EHsc", "/Fobuild\\.objs\\GfxPluginNativeRender\\windows\\x64\\release\\RenderAPI_OpenGLCoreES.cpp.obj", "RenderAPI_OpenGLCoreES.cpp"], "file": "RenderAPI_OpenGLCoreES.cpp" }, { "directory": "G:\\TJURP\\NativeRenderPlugin", - "arguments": ["C:\\Users\\xinyt\\AppData\\Local\\OpenHarmony\\Sdk\\12\\native\\llvm\\bin\\clang.exe", "-c", "-Qunused-arguments", "-D__MUSL__", "--target=aarch64-linux-ohos", "--sysroot=C:/Users/xinyt/AppData/Local/OpenHarmony/Sdk/12/native/sysroot", "-fPIC", "-std=c++20", "-Igl3w", "-IUnity", "-DSUPPORT_VULKAN=1", "-DSUPPORT_OPENGL_UNIFIED=1", "-DSUPPORT_OPENGL_ES=1", "-DOHOS=1", "-IC:\\Program Files\\Huawei\\DevEco Studio\\sdk\\default\\hms\\native\\sysroot\\usr\\include", "-DMYCLANG", "-DOHOS_STL=c++_shared", "-o", "build\\.objs\\GfxPluginNativeRender\\harmonyos\\aarch64\\debug\\RenderAPI_Vulkan.cpp.o", "RenderAPI_Vulkan.cpp"], + "arguments": ["C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.41.34120\\bin\\HostX64\\x64\\cl.exe", "/c", "/nologo", "/std:c++20", "/Igl3w", "/IUnity", "/IC:\\VulkanSDK\\1.3.283.0\\Include", "/DNOMINMAX", "/DSUPPORT_D3D11=1", "/DSUPPORT_D3D12=1", "/DSUPPORT_VULKAN=1", "/EHsc", "/Fobuild\\.objs\\GfxPluginNativeRender\\windows\\x64\\release\\RenderAPI_Vulkan.cpp.obj", "RenderAPI_Vulkan.cpp"], "file": "RenderAPI_Vulkan.cpp" }, { "directory": "G:\\TJURP\\NativeRenderPlugin", - "arguments": ["C:\\Users\\xinyt\\AppData\\Local\\OpenHarmony\\Sdk\\12\\native\\llvm\\bin\\clang.exe", "-c", "-Qunused-arguments", "-D__MUSL__", "--target=aarch64-linux-ohos", "--sysroot=C:/Users/xinyt/AppData/Local/OpenHarmony/Sdk/12/native/sysroot", "-fPIC", "-std=c++20", "-Igl3w", "-IUnity", "-DSUPPORT_VULKAN=1", "-DSUPPORT_OPENGL_UNIFIED=1", "-DSUPPORT_OPENGL_ES=1", "-DOHOS=1", "-IC:\\Program Files\\Huawei\\DevEco Studio\\sdk\\default\\hms\\native\\sysroot\\usr\\include", "-DMYCLANG", "-DOHOS_STL=c++_shared", "-o", "build\\.objs\\GfxPluginNativeRender\\harmonyos\\aarch64\\debug\\RenderingPlugin.cpp.o", "RenderingPlugin.cpp"], + "arguments": ["C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.41.34120\\bin\\HostX64\\x64\\cl.exe", "/c", "/nologo", "/std:c++20", "/Igl3w", "/IUnity", "/IC:\\VulkanSDK\\1.3.283.0\\Include", "/DNOMINMAX", "/DSUPPORT_D3D11=1", "/DSUPPORT_D3D12=1", "/DSUPPORT_VULKAN=1", "/EHsc", "/Fobuild\\.objs\\GfxPluginNativeRender\\windows\\x64\\release\\RenderingPlugin.cpp.obj", "RenderingPlugin.cpp"], "file": "RenderingPlugin.cpp" }] diff --git a/NativeRenderPlugin/PlatformBase.h b/NativeRenderPlugin/PlatformBase.h index fa4fb6d..d3b45f0 100644 --- a/NativeRenderPlugin/PlatformBase.h +++ b/NativeRenderPlugin/PlatformBase.h @@ -42,46 +42,46 @@ // Which graphics device APIs we possibly support? -#if UNITY_METRO - #define SUPPORT_D3D11 1 - #if WINDOWS_UWP - #define SUPPORT_D3D12 1 - #endif -#elif UNITY_WIN - #ifndef SUPPORT_VULKAN - #define SUPPORT_D3D11 1 // comment this out if you don't have D3D11 header/library files - #define SUPPORT_D3D12 0 // comment this out if you don't have D3D12 header/library files - #define SUPPORT_OPENGL_UNIFIED 1 - #define SUPPORT_OPENGL_CORE 1 - #define SUPPORT_VULKAN 0 // Requires Vulkan SDK to be installed - #else - #define SUPPORT_D3D11 0 // comment this out if you don't have D3D11 header/library files - #define SUPPORT_D3D12 0 // comment this out if you don't have D3D12 header/library files - #endif -#elif UNITY_IOS || UNITY_TVOS || UNITY_ANDROID || UNITY_WEBGL - #ifndef SUPPORT_OPENGL_UNIFIED - #define SUPPORT_OPENGL_UNIFIED SUPPORT_OPENGL_ES - #endif - #ifndef SUPPORT_VULKAN - #define SUPPORT_VULKAN 0 - #endif -#elif UNITY_OSX || UNITY_LINUX - #define SUPPORT_OPENGL_UNIFIED 1 - #define SUPPORT_OPENGL_CORE 1 -#elif UNITY_EMBEDDED_LINUX - #define SUPPORT_OPENGL_UNIFIED 1 - #define SUPPORT_OPENGL_ES 1 - #ifndef SUPPORT_VULKAN - #define SUPPORT_VULKAN 0 - #endif -#elif UNITY_QNX - #define SUPPORT_OPENGL_UNIFIED 1 - #define SUPPORT_OPENGL_ES 1 -#endif +// #if UNITY_METRO +// #define SUPPORT_D3D11 1 +// #if WINDOWS_UWP +// #define SUPPORT_D3D12 1 +// #endif +// #elif UNITY_WIN +// // #ifndef SUPPORT_VULKAN +// // #define SUPPORT_D3D11 1 // comment this out if you don't have D3D11 header/library files +// // #define SUPPORT_D3D12 0 // comment this out if you don't have D3D12 header/library files +// // #define SUPPORT_OPENGL_UNIFIED 1 +// // #define SUPPORT_OPENGL_CORE 1 +// // #define SUPPORT_VULKAN 0 // Requires Vulkan SDK to be installed +// // #else +// // #define SUPPORT_D3D11 0 // comment this out if you don't have D3D11 header/library files +// // #define SUPPORT_D3D12 0 // comment this out if you don't have D3D12 header/library files +// // #endif +// #elif UNITY_IOS || UNITY_TVOS || UNITY_ANDROID || UNITY_WEBGL +// #ifndef SUPPORT_OPENGL_UNIFIED +// #define SUPPORT_OPENGL_UNIFIED SUPPORT_OPENGL_ES +// #endif +// #ifndef SUPPORT_VULKAN +// #define SUPPORT_VULKAN 0 +// #endif +// #elif UNITY_OSX || UNITY_LINUX +// #define SUPPORT_OPENGL_UNIFIED 1 +// #define SUPPORT_OPENGL_CORE 1 +// #elif UNITY_EMBEDDED_LINUX +// #define SUPPORT_OPENGL_UNIFIED 1 +// #define SUPPORT_OPENGL_ES 1 +// #ifndef SUPPORT_VULKAN +// #define SUPPORT_VULKAN 0 +// #endif +// #elif UNITY_QNX +// #define SUPPORT_OPENGL_UNIFIED 1 +// #define SUPPORT_OPENGL_ES 1 +// #endif -#if UNITY_IOS || UNITY_TVOS || UNITY_OSX - #define SUPPORT_METAL 1 -#endif +// #if UNITY_IOS || UNITY_TVOS || UNITY_OSX +// #define SUPPORT_METAL 1 +// #endif diff --git a/NativeRenderPlugin/RenderAPI.h b/NativeRenderPlugin/RenderAPI.h index 690e7a1..e0eb23c 100644 --- a/NativeRenderPlugin/RenderAPI.h +++ b/NativeRenderPlugin/RenderAPI.h @@ -20,6 +20,7 @@ enum GraphicsFeature METAL_FX_TEMPORAL_SR, VIVO_TEMPORAL_SR, QCOM_AFME, + XESS13, MAX_CNT }; @@ -57,9 +58,6 @@ public: // Reversed Z is used on modern platforms, and improves depth buffer precision. virtual bool getUsesReverseZ() = 0; - // Returns the native resource pointer to either unity render buffer or - // to the resource created by the plugin (i.e ID3D12Resource* in case of DX12) - virtual void* getRenderTexture() { return nullptr; } // Sets the underlying resource to unity RenderBuffer // see https://docs.unity3d.com/ScriptReference/RenderBuffer.html diff --git a/NativeRenderPlugin/RenderAPI_D3D11.cpp b/NativeRenderPlugin/RenderAPI_D3D11.cpp index ec8a941..e963172 100644 --- a/NativeRenderPlugin/RenderAPI_D3D11.cpp +++ b/NativeRenderPlugin/RenderAPI_D3D11.cpp @@ -16,32 +16,13 @@ public: RenderAPI_D3D11(); virtual ~RenderAPI_D3D11() { } - virtual void ProcessDeviceEvent(UnityGfxDeviceEventType type, IUnityInterfaces* interfaces); + virtual void processDeviceEvent(UnityGfxDeviceEventType type, IUnityInterfaces* interfaces); - virtual bool GetUsesReverseZ() { return (int)m_Device->GetFeatureLevel() >= (int)D3D_FEATURE_LEVEL_10_0; } - - virtual void DrawSimpleTriangles(const float worldMatrix[16], int triangleCount, const void* verticesFloat3Byte4); - - virtual void* BeginModifyTexture(void* textureHandle, int textureWidth, int textureHeight, int* outRowPitch); - virtual void EndModifyTexture(void* textureHandle, int textureWidth, int textureHeight, int rowPitch, void* dataPtr); - - virtual void* BeginModifyVertexBuffer(void* bufferHandle, size_t* outBufferSize); - virtual void EndModifyVertexBuffer(void* bufferHandle); - -private: - void CreateResources(); - void ReleaseResources(); + virtual bool getUsesReverseZ() { return (int)m_Device->GetFeatureLevel() >= (int)D3D_FEATURE_LEVEL_10_0; } + virtual void initSupportFeature() override; private: ID3D11Device* m_Device; - ID3D11Buffer* m_VB; // vertex buffer - ID3D11Buffer* m_CB; // constant buffer - ID3D11VertexShader* m_VertexShader; - ID3D11PixelShader* m_PixelShader; - ID3D11InputLayout* m_InputLayout; - ID3D11RasterizerState* m_RasterState; - ID3D11BlendState* m_BlendState; - ID3D11DepthStencilState* m_DepthState; }; @@ -74,50 +55,15 @@ float4 PS(float4 color : COLOR) : SV_TARGET // fxc /Tvs_4_0_level_9_3 /EVS source.hlsl /Fh outVS.h /Qstrip_reflect /Qstrip_debug /Qstrip_priv // fxc /Tps_4_0_level_9_3 /EPS source.hlsl /Fh outPS.h /Qstrip_reflect /Qstrip_debug /Qstrip_priv // and results pasted & formatted to take less lines here -const BYTE kVertexShaderCode[] = -{ - 68,88,66,67,86,189,21,50,166,106,171,1,10,62,115,48,224,137,163,129,1,0,0,0,168,2,0,0,4,0,0,0,48,0,0,0,0,1,0,0,4,2,0,0,84,2,0,0, - 65,111,110,57,200,0,0,0,200,0,0,0,0,2,254,255,148,0,0,0,52,0,0,0,1,0,36,0,0,0,48,0,0,0,48,0,0,0,36,0,1,0,48,0,0,0,0,0, - 4,0,1,0,0,0,0,0,0,0,0,0,1,2,254,255,31,0,0,2,5,0,0,128,0,0,15,144,31,0,0,2,5,0,1,128,1,0,15,144,5,0,0,3,0,0,15,128, - 0,0,85,144,2,0,228,160,4,0,0,4,0,0,15,128,1,0,228,160,0,0,0,144,0,0,228,128,4,0,0,4,0,0,15,128,3,0,228,160,0,0,170,144,0,0,228,128, - 2,0,0,3,0,0,15,128,0,0,228,128,4,0,228,160,4,0,0,4,0,0,3,192,0,0,255,128,0,0,228,160,0,0,228,128,1,0,0,2,0,0,12,192,0,0,228,128, - 1,0,0,2,0,0,15,224,1,0,228,144,255,255,0,0,83,72,68,82,252,0,0,0,64,0,1,0,63,0,0,0,89,0,0,4,70,142,32,0,0,0,0,0,4,0,0,0, - 95,0,0,3,114,16,16,0,0,0,0,0,95,0,0,3,242,16,16,0,1,0,0,0,101,0,0,3,242,32,16,0,0,0,0,0,103,0,0,4,242,32,16,0,1,0,0,0, - 1,0,0,0,104,0,0,2,1,0,0,0,54,0,0,5,242,32,16,0,0,0,0,0,70,30,16,0,1,0,0,0,56,0,0,8,242,0,16,0,0,0,0,0,86,21,16,0, - 0,0,0,0,70,142,32,0,0,0,0,0,1,0,0,0,50,0,0,10,242,0,16,0,0,0,0,0,70,142,32,0,0,0,0,0,0,0,0,0,6,16,16,0,0,0,0,0, - 70,14,16,0,0,0,0,0,50,0,0,10,242,0,16,0,0,0,0,0,70,142,32,0,0,0,0,0,2,0,0,0,166,26,16,0,0,0,0,0,70,14,16,0,0,0,0,0, - 0,0,0,8,242,32,16,0,1,0,0,0,70,14,16,0,0,0,0,0,70,142,32,0,0,0,0,0,3,0,0,0,62,0,0,1,73,83,71,78,72,0,0,0,2,0,0,0, - 8,0,0,0,56,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,7,7,0,0,65,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,1,0,0,0, - 15,15,0,0,80,79,83,73,84,73,79,78,0,67,79,76,79,82,0,171,79,83,71,78,76,0,0,0,2,0,0,0,8,0,0,0,56,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,0,0,0,0,15,0,0,0,62,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,15,0,0,0,67,79,76,79,82,0,83,86,95,80,111,115, - 105,116,105,111,110,0,171,171 -}; -const BYTE kPixelShaderCode[]= -{ - 68,88,66,67,196,65,213,199,14,78,29,150,87,236,231,156,203,125,244,112,1,0,0,0,32,1,0,0,4,0,0,0,48,0,0,0,124,0,0,0,188,0,0,0,236,0,0,0, - 65,111,110,57,68,0,0,0,68,0,0,0,0,2,255,255,32,0,0,0,36,0,0,0,0,0,36,0,0,0,36,0,0,0,36,0,0,0,36,0,0,0,36,0,1,2,255,255, - 31,0,0,2,0,0,0,128,0,0,15,176,1,0,0,2,0,8,15,128,0,0,228,176,255,255,0,0,83,72,68,82,56,0,0,0,64,0,0,0,14,0,0,0,98,16,0,3, - 242,16,16,0,0,0,0,0,101,0,0,3,242,32,16,0,0,0,0,0,54,0,0,5,242,32,16,0,0,0,0,0,70,30,16,0,0,0,0,0,62,0,0,1,73,83,71,78, - 40,0,0,0,1,0,0,0,8,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,15,15,0,0,67,79,76,79,82,0,171,171,79,83,71,78, - 44,0,0,0,1,0,0,0,8,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,15,0,0,0,83,86,95,84,65,82,71,69,84,0,171,171 -}; RenderAPI_D3D11::RenderAPI_D3D11() : m_Device(NULL) - , m_VB(NULL) - , m_CB(NULL) - , m_VertexShader(NULL) - , m_PixelShader(NULL) - , m_InputLayout(NULL) - , m_RasterState(NULL) - , m_BlendState(NULL) - , m_DepthState(NULL) { } -void RenderAPI_D3D11::ProcessDeviceEvent(UnityGfxDeviceEventType type, IUnityInterfaces* interfaces) +void RenderAPI_D3D11::processDeviceEvent(UnityGfxDeviceEventType type, IUnityInterfaces* interfaces) { switch (type) { @@ -125,175 +71,16 @@ void RenderAPI_D3D11::ProcessDeviceEvent(UnityGfxDeviceEventType type, IUnityInt { IUnityGraphicsD3D11* d3d = interfaces->Get(); m_Device = d3d->GetDevice(); - CreateResources(); break; } case kUnityGfxDeviceEventShutdown: - ReleaseResources(); break; } } - -void RenderAPI_D3D11::CreateResources() +void RenderAPI_D3D11::initSupportFeature() { - D3D11_BUFFER_DESC desc; - memset(&desc, 0, sizeof(desc)); - - // vertex buffer - desc.Usage = D3D11_USAGE_DEFAULT; - desc.ByteWidth = 1024; - desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - m_Device->CreateBuffer(&desc, NULL, &m_VB); - - // constant buffer - desc.Usage = D3D11_USAGE_DEFAULT; - desc.ByteWidth = 64; // hold 1 matrix - desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - desc.CPUAccessFlags = 0; - m_Device->CreateBuffer(&desc, NULL, &m_CB); - - // shaders - HRESULT hr; - hr = m_Device->CreateVertexShader(kVertexShaderCode, sizeof(kVertexShaderCode), nullptr, &m_VertexShader); - if (FAILED(hr)) - OutputDebugStringA("Failed to create vertex shader.\n"); - hr = m_Device->CreatePixelShader(kPixelShaderCode, sizeof(kPixelShaderCode), nullptr, &m_PixelShader); - if (FAILED(hr)) - OutputDebugStringA("Failed to create pixel shader.\n"); - - // input layout - if (m_VertexShader) - { - D3D11_INPUT_ELEMENT_DESC s_DX11InputElementDesc[] = - { - { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - }; - m_Device->CreateInputLayout(s_DX11InputElementDesc, 2, kVertexShaderCode, sizeof(kVertexShaderCode), &m_InputLayout); - } - - // render states - D3D11_RASTERIZER_DESC rsdesc; - memset(&rsdesc, 0, sizeof(rsdesc)); - rsdesc.FillMode = D3D11_FILL_SOLID; - rsdesc.CullMode = D3D11_CULL_NONE; - rsdesc.DepthClipEnable = TRUE; - m_Device->CreateRasterizerState(&rsdesc, &m_RasterState); - - D3D11_DEPTH_STENCIL_DESC dsdesc; - memset(&dsdesc, 0, sizeof(dsdesc)); - dsdesc.DepthEnable = TRUE; - dsdesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; - dsdesc.DepthFunc = GetUsesReverseZ() ? D3D11_COMPARISON_GREATER_EQUAL : D3D11_COMPARISON_LESS_EQUAL; - m_Device->CreateDepthStencilState(&dsdesc, &m_DepthState); - - D3D11_BLEND_DESC bdesc; - memset(&bdesc, 0, sizeof(bdesc)); - bdesc.RenderTarget[0].BlendEnable = FALSE; - bdesc.RenderTarget[0].RenderTargetWriteMask = 0xF; - m_Device->CreateBlendState(&bdesc, &m_BlendState); } -void RenderAPI_D3D11::ReleaseResources() -{ - SAFE_RELEASE(m_VB); - SAFE_RELEASE(m_CB); - SAFE_RELEASE(m_VertexShader); - SAFE_RELEASE(m_PixelShader); - SAFE_RELEASE(m_InputLayout); - SAFE_RELEASE(m_RasterState); - SAFE_RELEASE(m_BlendState); - SAFE_RELEASE(m_DepthState); -} - - -void RenderAPI_D3D11::DrawSimpleTriangles(const float worldMatrix[16], int triangleCount, const void* verticesFloat3Byte4) -{ - ID3D11DeviceContext* ctx = NULL; - m_Device->GetImmediateContext(&ctx); - - // Set basic render state - ctx->OMSetDepthStencilState(m_DepthState, 0); - ctx->RSSetState(m_RasterState); - ctx->OMSetBlendState(m_BlendState, NULL, 0xFFFFFFFF); - - // Update constant buffer - just the world matrix in our case - ctx->UpdateSubresource(m_CB, 0, NULL, worldMatrix, 64, 0); - - // Set shaders - ctx->VSSetConstantBuffers(0, 1, &m_CB); - ctx->VSSetShader(m_VertexShader, NULL, 0); - ctx->PSSetShader(m_PixelShader, NULL, 0); - - // Update vertex buffer - const int kVertexSize = 12 + 4; - ctx->UpdateSubresource(m_VB, 0, NULL, verticesFloat3Byte4, triangleCount * 3 * kVertexSize, 0); - - // set input assembler data and draw - ctx->IASetInputLayout(m_InputLayout); - ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - UINT stride = kVertexSize; - UINT offset = 0; - ctx->IASetVertexBuffers(0, 1, &m_VB, &stride, &offset); - ctx->Draw(triangleCount * 3, 0); - - ctx->Release(); -} - - -void* RenderAPI_D3D11::BeginModifyTexture(void* textureHandle, int textureWidth, int textureHeight, int* outRowPitch) -{ - const int rowPitch = textureWidth * 4; - // Just allocate a system memory buffer here for simplicity - unsigned char* data = new unsigned char[rowPitch * textureHeight]; - *outRowPitch = rowPitch; - return data; -} - - -void RenderAPI_D3D11::EndModifyTexture(void* textureHandle, int textureWidth, int textureHeight, int rowPitch, void* dataPtr) -{ - ID3D11Texture2D* d3dtex = (ID3D11Texture2D*)textureHandle; - assert(d3dtex); - - ID3D11DeviceContext* ctx = NULL; - m_Device->GetImmediateContext(&ctx); - // Update texture data, and free the memory buffer - ctx->UpdateSubresource(d3dtex, 0, NULL, dataPtr, rowPitch, 0); - delete[] (unsigned char*)dataPtr; - ctx->Release(); -} - - -void* RenderAPI_D3D11::BeginModifyVertexBuffer(void* bufferHandle, size_t* outBufferSize) -{ - ID3D11Buffer* d3dbuf = (ID3D11Buffer*)bufferHandle; - assert(d3dbuf); - D3D11_BUFFER_DESC desc; - d3dbuf->GetDesc(&desc); - *outBufferSize = desc.ByteWidth; - - ID3D11DeviceContext* ctx = NULL; - m_Device->GetImmediateContext(&ctx); - D3D11_MAPPED_SUBRESOURCE mapped; - ctx->Map(d3dbuf, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped); - ctx->Release(); - - return mapped.pData; -} - - -void RenderAPI_D3D11::EndModifyVertexBuffer(void* bufferHandle) -{ - ID3D11Buffer* d3dbuf = (ID3D11Buffer*)bufferHandle; - assert(d3dbuf); - - ID3D11DeviceContext* ctx = NULL; - m_Device->GetImmediateContext(&ctx); - ctx->Unmap(d3dbuf, 0); - ctx->Release(); -} - #endif // #if SUPPORT_D3D11 diff --git a/NativeRenderPlugin/RenderAPI_D3D12.cpp b/NativeRenderPlugin/RenderAPI_D3D12.cpp index 53da353..4b373ae 100644 --- a/NativeRenderPlugin/RenderAPI_D3D12.cpp +++ b/NativeRenderPlugin/RenderAPI_D3D12.cpp @@ -12,7 +12,6 @@ #include #include #include -#include "d3dx12.h" #include "Unity/IUnityGraphicsD3D12.h" #include #include @@ -50,236 +49,6 @@ dxc -T ps_6_0 -E PSMain -Fo pixel_shader .\shaders.hlsl -Qstrip_reflect -Qstrip_debug */ -const BYTE vertex_shader[] = -{ - 68,88,66,67,128,57,232,34,242,147,249,9,179,113,162,105,42,26,31, - 250,1,0,0,0,109,9,0,0,6,0,0,0,56,0,0,0,72,0,0, - 0,167,0,0,0,9,1,0,0,237,1,0,0,9,2,0,0,83,70,73, - 48,8,0,0,0,0,0,0,0,0,0,0,0,73,83,71,49,87,0,0, - 0,2,0,0,0,8,0,0,0,0,0,0,0,72,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,0,0,0,0,7,7,0,0,0,0,0, - 0,0,0,0,0,81,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,1,0,0,0,15,15,0,0,0,0,0,0,80,79,83,73,84,73,79, - 78,0,67,79,76,79,82,0,79,83,71,49,90,0,0,0,2,0,0,0, - 8,0,0,0,0,0,0,0,72,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0, - 78,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0, - 15,0,0,0,0,0,0,0,67,79,76,79,82,0,83,86,95,80,111,115, - 105,116,105,111,110,0,80,83,86,48,220,0,0,0,48,0,0,0,1,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255, - 255,255,1,0,0,0,2,2,0,2,2,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,24,0,0,0,2,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,24,0, - 0,0,0,80,79,83,73,84,73,79,78,0,67,79,76,79,82,0,67,79, - 76,79,82,0,0,0,1,0,0,0,0,0,0,0,16,0,0,0,1,0, - 0,0,0,0,0,0,1,0,67,0,3,0,0,0,10,0,0,0,0,0, - 0,0,1,1,68,0,3,0,0,0,16,0,0,0,0,0,0,0,1,0, - 68,0,3,2,0,0,0,0,0,0,0,0,0,0,1,1,68,3,3,4, - 0,0,240,0,0,0,240,0,0,0,240,0,0,0,0,0,0,0,1,0, - 0,0,2,0,0,0,4,0,0,0,8,0,0,0,72,65,83,72,20,0, - 0,0,0,0,0,0,104,176,13,123,21,10,21,217,124,92,148,133,249,234, - 46,114,68,88,73,76,92,7,0,0,96,0,1,0,215,1,0,0,68,88, - 73,76,0,1,0,0,16,0,0,0,68,7,0,0,66,67,192,222,33,12, - 0,0,206,1,0,0,11,130,32,0,2,0,0,0,19,0,0,0,7,129, - 35,145,65,200,4,73,6,16,50,57,146,1,132,12,37,5,8,25,30,4, - 139,98,128,20,69,2,66,146,11,66,164,16,50,20,56,8,24,75,10,50, - 82,136,72,144,20,32,67,70,136,165,0,25,50,66,228,72,14,144,145,34, - 196,80,65,81,129,140,225,131,229,138,4,41,70,6,81,24,0,0,8,0, - 0,0,27,140,224,255,255,255,255,7,64,2,168,13,132,240,255,255,255,255, - 3,32,109,48,134,255,255,255,255,31,0,9,168,0,73,24,0,0,3,0, - 0,0,19,130,96,66,32,76,8,6,0,0,0,0,137,32,0,0,35,0, - 0,0,50,34,72,9,32,100,133,4,147,34,164,132,4,147,34,227,132,161, - 144,20,18,76,138,140,11,132,164,76,16,104,35,0,37,0,20,102,0,230, - 8,192,96,142,0,41,198,32,132,20,66,166,24,128,16,82,6,161,163,134, - 203,159,176,135,144,124,110,163,138,149,152,252,226,182,17,49,198,24,84,238, - 25,46,127,194,30,66,242,67,160,25,22,2,5,171,16,138,48,66,173,20, - 131,140,49,232,205,17,4,197,96,164,16,18,73,14,4,12,35,16,67,18, - 212,123,14,71,154,22,0,115,168,201,55,49,110,67,129,165,155,10,4,0, - 0,0,19,20,114,192,135,116,96,135,54,104,135,121,104,3,114,192,135,13, - 175,80,14,109,208,14,122,80,14,109,0,15,122,48,7,114,160,7,115,32, - 7,109,144,14,113,160,7,115,32,7,109,144,14,120,160,7,115,32,7,109, - 144,14,113,96,7,122,48,7,114,208,6,233,48,7,114,160,7,115,32,7, - 109,144,14,118,64,7,122,96,7,116,208,6,230,16,7,118,160,7,115,32, - 7,109,96,14,115,32,7,122,48,7,114,208,6,230,96,7,116,160,7,118, - 64,7,109,224,14,120,160,7,113,96,7,122,48,7,114,160,7,118,64,7, - 67,158,0,0,0,0,0,0,0,0,0,0,0,134,60,6,16,0,1,0, - 0,0,0,0,0,0,12,121,16,32,0,4,0,0,0,0,0,0,0,24, - 242,52,64,0,12,0,0,0,0,0,0,0,48,228,121,128,0,8,0,0, - 0,0,0,0,0,96,200,35,1,1,48,0,0,0,0,0,0,0,64,22, - 8,0,14,0,0,0,50,30,152,20,25,17,76,144,140,9,38,71,198,4, - 67,34,37,48,2,80,12,5,24,80,6,229,80,30,84,74,98,4,160,12, - 10,161,8,8,207,0,80,30,75,65,16,248,128,15,248,0,2,129,64,0, - 0,0,121,24,0,0,87,0,0,0,26,3,76,144,70,2,19,196,49,32, - 195,27,67,129,147,75,179,11,163,43,75,1,137,113,185,113,129,113,153,193, - 201,177,1,65,129,145,137,49,195,49,155,41,139,73,217,16,4,19,4,194, - 152,32,16,199,6,97,32,38,8,4,178,65,24,12,10,118,115,27,6,196, - 32,38,8,152,68,96,130,64,36,27,16,66,89,8,98,96,128,13,65,179, - 129,0,0,7,152,32,100,211,134,0,154,32,8,0,5,171,41,34,80,79, - 83,73,84,73,79,78,19,132,162,153,32,20,206,134,128,152,32,20,207,4, - 129,80,38,8,196,178,65,200,180,13,11,65,85,214,101,13,24,97,109,44, - 134,158,152,158,164,38,8,5,52,65,32,152,13,66,246,109,88,134,174,178, - 46,107,240,6,11,12,54,8,92,24,76,16,138,104,195,66,116,149,117,141, - 193,224,17,22,24,112,153,178,250,130,122,155,75,163,75,123,115,219,176,12, - 101,80,97,151,55,120,131,5,6,27,4,50,48,131,13,131,24,156,1,176, - 161,144,38,52,120,128,42,108,108,118,109,46,105,100,101,110,116,83,130,160, - 10,25,158,139,93,153,220,92,218,155,219,148,128,104,66,134,231,98,23,198, - 102,87,38,55,37,48,234,144,225,185,204,161,133,145,149,201,53,189,145,149, - 177,77,9,144,50,100,120,46,114,101,115,111,117,114,99,101,115,83,2,167, - 14,25,158,139,93,90,217,93,18,217,20,93,24,93,217,148,0,170,67,134, - 231,82,230,70,39,151,7,245,150,230,70,55,55,37,64,3,0,0,121,24, - 0,0,76,0,0,0,51,8,128,28,196,225,28,102,20,1,61,136,67,56, - 132,195,140,66,128,7,121,120,7,115,152,113,12,230,0,15,237,16,14,244, - 128,14,51,12,66,30,194,193,29,206,161,28,102,48,5,61,136,67,56,132, - 131,27,204,3,61,200,67,61,140,3,61,204,120,140,116,112,7,123,8,7, - 121,72,135,112,112,7,122,112,3,118,120,135,112,32,135,25,204,17,14,236, - 144,14,225,48,15,110,48,15,227,240,14,240,80,14,51,16,196,29,222,33, - 28,216,33,29,194,97,30,102,48,137,59,188,131,59,208,67,57,180,3,60, - 188,131,60,132,3,59,204,240,20,118,96,7,123,104,7,55,104,135,114,104, - 7,55,128,135,112,144,135,112,96,7,118,40,7,118,248,5,118,120,135,119, - 128,135,95,8,135,113,24,135,114,152,135,121,152,129,44,238,240,14,238,224, - 14,245,192,14,236,48,3,98,200,161,28,228,161,28,204,161,28,228,161,28, - 220,97,28,202,33,28,196,129,29,202,97,6,214,144,67,57,200,67,57,152, - 67,57,200,67,57,184,195,56,148,67,56,136,3,59,148,195,47,188,131,60, - 252,130,59,212,3,59,176,195,12,196,33,7,124,112,3,122,40,135,118,128, - 135,25,209,67,14,248,224,6,228,32,14,231,224,6,246,16,14,242,192,14, - 225,144,15,239,80,15,244,0,0,0,113,32,0,0,24,0,0,0,6,32, - 188,172,13,108,195,229,59,143,47,4,84,81,16,81,233,0,67,73,24,128, - 128,249,197,109,91,129,52,92,190,243,248,66,68,0,19,17,2,205,176,16, - 22,48,13,151,239,60,254,226,0,131,216,60,212,228,23,183,109,2,213,112, - 249,206,227,75,147,19,17,40,53,61,212,228,23,183,109,4,210,112,249,206, - 227,79,68,52,33,64,132,249,197,109,3,0,0,0,97,32,0,0,122,0, - 0,0,19,4,65,44,16,0,0,0,5,0,0,0,68,138,171,20,10,97, - 6,160,236,74,174,8,168,148,0,197,17,0,0,0,35,6,9,0,130,96, - 32,97,4,99,89,193,136,65,2,128,32,24,24,29,130,93,208,49,98,144, - 0,32,8,6,134,151,100,24,129,140,24,36,0,8,130,129,241,41,90,246, - 36,35,6,9,0,130,96,96,128,193,178,105,146,50,98,144,0,32,8,6, - 70,24,48,219,70,45,35,6,9,0,130,96,96,136,65,195,113,8,51,98, - 144,0,32,8,6,198,24,56,93,55,53,35,6,7,0,130,96,208,136,65, - 131,120,163,9,1,48,154,32,4,163,9,131,48,154,64,12,35,6,7,0, - 130,96,208,156,129,212,144,193,104,66,0,140,38,8,193,104,194,32,140,38, - 16,195,136,193,1,128,32,24,52,108,112,73,213,104,66,0,140,38,8,193, - 104,194,32,140,38,16,195,136,193,1,128,32,24,52,113,192,93,106,48,154, - 16,0,163,9,66,48,154,48,8,163,9,196,96,211,37,159,17,3,4,0, - 65,48,120,236,192,12,158,43,24,49,64,0,16,4,131,231,14,206,96,185, - 2,11,14,232,152,181,201,103,196,0,1,64,16,12,30,61,80,3,105,11, - 70,12,16,0,4,193,224,217,131,53,112,182,192,2,5,58,150,125,242,25, - 49,64,0,16,4,131,199,15,220,160,250,130,17,3,4,0,65,48,120,254, - 224,13,162,47,176,160,129,142,113,99,32,159,17,3,4,0,65,48,120,68, - 65,14,176,49,8,70,12,16,0,4,193,224,25,133,57,160,198,32,176,0, - 130,206,136,65,2,128,32,24,32,167,64,7,163,32,10,123,208,140,24,36, - 0,8,130,1,114,10,116,48,10,162,224,6,201,136,65,2,128,32,24,32, - 167,64,7,163,32,10,120,80,140,24,36,0,8,130,1,114,10,116,48,10, - 162,160,7,193,136,65,2,128,32,24,32,167,64,7,162,32,10,123,176,6, - 35,6,9,0,130,96,128,156,2,29,136,130,40,184,129,26,140,24,36,0, - 8,130,1,114,10,116,32,10,162,128,7,105,48,98,144,0,32,8,6,200, - 41,208,129,40,136,130,30,160,1,2,0,0,0,0 -}; - -const BYTE pixel_shader[] = -{ - 68,88,66,67,155,38,61,235,152,175,36,0,5,163,174,225,114,25,46, - 165,1,0,0,0,48,6,0,0,6,0,0,0,56,0,0,0,72,0,0, - 0,126,0,0,0,184,0,0,0,64,1,0,0,92,1,0,0,83,70,73, - 48,8,0,0,0,0,0,0,0,0,0,0,0,73,83,71,49,46,0,0, - 0,1,0,0,0,8,0,0,0,0,0,0,0,40,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,0,0,0,0,15,15,0,0,0,0,0, - 0,67,79,76,79,82,0,79,83,71,49,50,0,0,0,1,0,0,0,8, - 0,0,0,0,0,0,0,40,0,0,0,0,0,0,0,64,0,0,0,3, - 0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,83,86,95,84,97, - 114,103,101,116,0,80,83,86,48,128,0,0,0,48,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255, - 255,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,8,0,0,0,0,67,79,76,79,82,0, - 0,1,0,0,0,0,0,0,0,16,0,0,0,1,0,0,0,0,0,0, - 0,1,0,68,0,3,2,0,0,0,0,0,0,0,0,0,0,1,0,68, - 16,3,0,0,0,1,0,0,0,2,0,0,0,4,0,0,0,8,0,0, - 0,72,65,83,72,20,0,0,0,0,0,0,0,12,2,178,107,86,235,87, - 236,39,12,117,190,13,71,209,140,68,88,73,76,204,4,0,0,96,0,0, - 0,51,1,0,0,68,88,73,76,0,1,0,0,16,0,0,0,180,4,0, - 0,66,67,192,222,33,12,0,0,42,1,0,0,11,130,32,0,2,0,0, - 0,19,0,0,0,7,129,35,145,65,200,4,73,6,16,50,57,146,1,132, - 12,37,5,8,25,30,4,139,98,128,16,69,2,66,146,11,66,132,16,50, - 20,56,8,24,75,10,50,66,136,72,144,20,32,67,70,136,165,0,25,50, - 66,228,72,14,144,17,34,196,80,65,81,129,140,225,131,229,138,4,33,70, - 6,81,24,0,0,6,0,0,0,27,140,224,255,255,255,255,7,64,2,168, - 13,132,240,255,255,255,255,3,32,1,0,0,0,73,24,0,0,2,0,0, - 0,19,130,96,66,32,0,0,0,137,32,0,0,15,0,0,0,50,34,8, - 9,32,100,133,4,19,34,164,132,4,19,34,227,132,161,144,20,18,76,136, - 140,11,132,132,76,16,48,35,0,37,0,138,25,128,57,2,48,152,35,64, - 138,49,68,84,68,86,12,32,162,26,194,129,128,52,32,0,0,19,20,114, - 192,135,116,96,135,54,104,135,121,104,3,114,192,135,13,175,80,14,109,208, - 14,122,80,14,109,0,15,122,48,7,114,160,7,115,32,7,109,144,14,113, - 160,7,115,32,7,109,144,14,120,160,7,115,32,7,109,144,14,113,96,7, - 122,48,7,114,208,6,233,48,7,114,160,7,115,32,7,109,144,14,118,64, - 7,122,96,7,116,208,6,230,16,7,118,160,7,115,32,7,109,96,14,115, - 32,7,122,48,7,114,208,6,230,96,7,116,160,7,118,64,7,109,224,14, - 120,160,7,113,96,7,122,48,7,114,160,7,118,64,7,67,158,0,0,0, - 0,0,0,0,0,0,0,0,134,60,6,16,0,1,0,0,0,0,0,0, - 0,12,121,16,32,0,4,0,0,0,0,0,0,0,200,2,1,11,0,0, - 0,50,30,152,16,25,17,76,144,140,9,38,71,198,4,67,162,18,24,1, - 40,134,50,40,15,170,146,24,1,40,130,66,40,16,218,177,12,130,8,4, - 2,1,0,0,0,121,24,0,0,65,0,0,0,26,3,76,144,70,2,19, - 196,49,32,195,27,67,129,147,75,179,11,163,43,75,1,137,113,185,113,129, - 113,153,193,201,177,1,65,129,145,137,49,195,49,155,41,139,73,217,16,4, - 19,4,98,152,32,16,196,6,97,32,38,8,68,177,65,24,12,10,112,115, - 27,6,196,32,38,8,75,179,33,80,38,8,2,64,1,106,138,197,208,19, - 211,147,212,4,161,64,38,8,69,178,33,32,38,8,133,50,65,40,150,9, - 2,97,76,16,136,99,131,64,85,27,22,194,121,160,72,26,38,2,178,54, - 4,23,147,41,171,47,170,48,185,179,50,186,9,66,193,108,88,136,236,209, - 34,104,152,8,200,218,16,108,27,6,140,3,54,20,76,211,1,64,21,54, - 54,187,54,151,52,178,50,55,186,41,65,80,133,12,207,197,174,76,110,46, - 237,205,109,74,64,52,33,195,115,177,11,99,179,43,147,155,18,24,117,200, - 240,92,230,208,194,200,202,228,154,222,200,202,216,166,4,72,29,50,60,23, - 187,180,178,187,36,178,41,186,48,186,178,41,129,82,135,12,207,165,204,141, - 78,46,15,234,45,205,141,110,110,74,208,1,0,121,24,0,0,76,0,0, - 0,51,8,128,28,196,225,28,102,20,1,61,136,67,56,132,195,140,66,128, - 7,121,120,7,115,152,113,12,230,0,15,237,16,14,244,128,14,51,12,66, - 30,194,193,29,206,161,28,102,48,5,61,136,67,56,132,131,27,204,3,61, - 200,67,61,140,3,61,204,120,140,116,112,7,123,8,7,121,72,135,112,112, - 7,122,112,3,118,120,135,112,32,135,25,204,17,14,236,144,14,225,48,15, - 110,48,15,227,240,14,240,80,14,51,16,196,29,222,33,28,216,33,29,194, - 97,30,102,48,137,59,188,131,59,208,67,57,180,3,60,188,131,60,132,3, - 59,204,240,20,118,96,7,123,104,7,55,104,135,114,104,7,55,128,135,112, - 144,135,112,96,7,118,40,7,118,248,5,118,120,135,119,128,135,95,8,135, - 113,24,135,114,152,135,121,152,129,44,238,240,14,238,224,14,245,192,14,236, - 48,3,98,200,161,28,228,161,28,204,161,28,228,161,28,220,97,28,202,33, - 28,196,129,29,202,97,6,214,144,67,57,200,67,57,152,67,57,200,67,57, - 184,195,56,148,67,56,136,3,59,148,195,47,188,131,60,252,130,59,212,3, - 59,176,195,12,196,33,7,124,112,3,122,40,135,118,128,135,25,209,67,14, - 248,224,6,228,32,14,231,224,6,246,16,14,242,192,14,225,144,15,239,80, - 15,244,0,0,0,113,32,0,0,10,0,0,0,6,32,164,172,5,76,195, - 229,59,143,191,56,192,32,54,15,53,249,197,109,155,64,53,92,190,243,248, - 210,228,68,4,74,77,15,53,249,197,109,3,0,97,32,0,0,30,0,0, - 0,19,4,65,44,16,0,0,0,3,0,0,0,68,133,48,3,80,10,84, - 37,80,6,0,0,35,6,9,0,130,96,96,72,197,243,40,196,136,65,2, - 128,32,24,24,147,1,65,67,49,98,144,0,32,8,6,6,117,68,209,98, - 140,24,36,0,8,130,129,81,33,146,68,28,35,6,9,0,130,96,128,84, - 199,52,57,196,136,65,2,128,32,24,32,213,49,77,198,48,98,144,0,32, - 8,6,72,117,76,83,35,140,24,36,0,8,130,1,82,29,211,84,4,8, - 0,0,0,0,0 -}; - -struct Vec3 -{ - float x; - float y; - float z; -}; - -struct Vec4 -{ - float x; - float y; - float z; - float w; -}; - -struct Vertex -{ - Vec3 position; - Vec4 color; -}; - static void handle_hr(HRESULT hr, const char* error = "") { if (FAILED(hr)) @@ -311,35 +80,9 @@ public: RenderAPI_D3D12(); virtual ~RenderAPI_D3D12() override { } - virtual void ProcessDeviceEvent(UnityGfxDeviceEventType type, IUnityInterfaces* interfaces) override; - virtual bool GetUsesReverseZ() override { return true; } + virtual void processDeviceEvent(UnityGfxDeviceEventType type, IUnityInterfaces* interfaces) override; + virtual bool getUsesReverseZ() override { return true; } - //----------------------------------------------------------- - // These functions will be called from unity render thread, - // see kUnityD3D12GraphicsQueueAccess_DontCare - - // Demonstrates how to use the CommandRecordingState - virtual void DrawSimpleTriangles(const float worldMatrix[16], int triangleCount, const void* verticesFloat3Byte4) override; - - // These demonstrate how to submit work via ExecuteCommandList - virtual void* BeginModifyTexture(void* textureHandle, int textureWidth, int textureHeight, int* outRowPitch) override; - virtual void EndModifyTexture(void* textureHandle, int textureWidth, int textureHeight, int rowPitch, void* dataPtr) override; - virtual void* BeginModifyVertexBuffer(void* bufferHandle, size_t* outBufferSize) override; - virtual void EndModifyVertexBuffer(void* bufferHandle) override; - virtual void drawToRenderTexture() override; - //----------------------------------------------------------- - - //----------------------------------------------------------- - // These functions will be called from unity submission thread, - // see kUnityD3D12GraphicsQueueAccess_Allow - - // Demonstrates how to submit work to unity command queue - // directly via GetCommandQueue - virtual void drawToPluginTexture() override; - //----------------------------------------------------------- - - virtual void* getRenderTexture() override; - virtual void setRenderTextureResource(UnityRenderBuffer rb) override; virtual bool isSwapChainAvailable() override; virtual unsigned int getPresentFlags() override; @@ -347,112 +90,14 @@ public: virtual unsigned int getBackbufferWidth() override; virtual unsigned int getBackbufferHeight() override; -private: - UINT64 align_pow2(UINT64 value); - // Aligns texture to power of 2 boundary - UINT64 get_aligned_size(int width, int height, int pixelSize, int rowPitch); + virtual void enableVRS(int vrsEnum) override; + virtual void disableVRS() override; - // Creates a new buffer on D3D12_HEAP_TYPE_UPLOAD when resource points to a nullptr. - // When resource points to a existing ID3D12Resource* we only check if it's big enough - // to hold the size, if not return false - bool get_upload_resource(ID3D12Resource** resource, UINT64 size, LPCWSTR name); + virtual void initSupportFeature() override; - // Creates dx12 buffer, if heapType allows CPU-access the resource will be also mapped - bool create_D3D12_buffer(size_t sizeInBytes, D3D12_HEAP_TYPE heapType, D3D12_RESOURCE_FLAGS resourceFlags, D3D12_RESOURCE_STATES initialResourceState, LPCWSTR resourceName, D3D12MemoryObject* buffer); - - // Creates two buffers; one on D3D12_HEAP_TYPE_UPLOAD and one on D3D12_HEAP_TYPE_DEFAULT, - // copies contents from initData to -> upload buffer -> default buffer - bool create_D3D12_default_buffer(ID3D12GraphicsCommandList* cmdLst, const void* initData, unsigned int bufferSizeInBytes, LPCWSTR uploadHeapResourceName, LPCWSTR defaultHeapResourceName, D3D12DefaultBufferMemoryObject& outMemoryObj); - - ID3D12PipelineState* create_triangle_pipeline(); - void create_triangle_input_layout(); - bool create_triangle_root_signature(); - - // Push buffer to deletion queue - void safe_destroy(unsigned long long frameNumber, const D3D12MemoryObject& buffer); - - // Processes deletion queue - void garbage_collect(bool force = false); - - // Destroy buffer without deletion queue - void immediate_destroy_d3d12_buffer(D3D12MemoryObject& buffer); - - // Creates and initializes all resources that are used across multiple frames - void initialize_and_create_resources(); - void release_resources(); - - // Records commands that draw a single triangle to target_texture - void record_draw_cmd_list(ID3D12CommandAllocator* cmd_alloc, ID3D12GraphicsCommandList* cmd, ID3D12RootSignature* rootsig, D3D12_CPU_DESCRIPTOR_HANDLE rtv_handle, D3D12_VERTEX_BUFFER_VIEW* vbview, const float* world_matrix, D3D12_VIEWPORT* viewport, ID3D12PipelineState* pso, ID3D12Resource* target_texture, D3D12_RESOURCE_STATES target_state); - - // Demonstrates how to submit work to unity worker thread via ExecuteCommandList API - UINT64 submit_cmd_to_unity_worker(ID3D12GraphicsCommandList* cmd, UnityGraphicsD3D12ResourceState* resource_states, int state_count); - - // Creates a texture that can be used as render target - ID3D12Resource* create_render_texture(); - void create_render_texture_rtv(ID3D12DescriptorHeap* desc_heap, ID3D12Resource* target, UINT offset); - - void transition_barrier(ID3D12GraphicsCommandList* cmd, ID3D12Resource* resource, D3D12_RESOURCE_STATES before, D3D12_RESOURCE_STATES after); - - // When unity frame fence changes we can be sure that previously submitted command lists have finished executing - void wait_for_unity_frame_fence(UINT64 fence_value); - - // Wait on any user provided fence - void wait_on_fence(UINT64 fence_value, ID3D12Fence* fence, HANDLE fence_event); - - DXGI_FORMAT typeless_fmt_to_typed(DXGI_FORMAT format); - - typedef std::vector D3D12Buffers; - typedef std::map DeleteQueue; - typedef std::unordered_map MappedVertexBuffers; IUnityGraphicsD3D12v7* s_d3d12; - - ID3D12Resource* s_upload_texture; - ID3D12Resource* s_upload_buffer; - ID3D12PipelineState* m_triangle_pso; - D3D12_INPUT_ELEMENT_DESC m_triangle_layout[2]; - ID3D12RootSignature* m_triangle_rootsig; - D3D12DefaultBufferMemoryObject m_triangle_vertex_buffer; - ID3D12DescriptorHeap* m_triangle_rtv_desc_heap; - ID3D12DescriptorHeap* m_triangle_dsv_desc_heap; - DeleteQueue m_DeleteQueue; - MappedVertexBuffers m_mapped_triangle_vertex_buffers; - - ID3D12DescriptorHeap* m_texture_rtv_desc_heap; - UINT m_texture_rtv_desc_size; - ID3D12Resource* m_render_texture_vertex_buffer; - D3D12_VERTEX_BUFFER_VIEW m_texture_vertex_buffer_view; - std::atomic m_render_texture; - std::atomic m_plugin_texture; - UINT m_texture_width = 256; - UINT m_texture_height = 256; - ID3D12CommandAllocator* m_render_texture_cmd_allocator; - ID3D12GraphicsCommandList* m_render_texture_cmd_list; - ID3D12CommandAllocator* m_plugin_texture_cmd_allocator; - ID3D12GraphicsCommandList* m_plugin_texture_cmd_list; - ID3DBlob* m_render_texture_root_blob; - ID3D12RootSignature* m_texture_root_sig; - ID3D12PipelineState* m_texture_pso; - std::atomic m_are_resources_initialized = false; - - UINT64 m_plugin_texture_fence_value = 0; - ID3D12Fence* m_plugin_texture_fence; - HANDLE m_plugin_texture_fence_event; - - ID3D12CommandAllocator* m_vertex_copy_cmd_allocator; - ID3D12GraphicsCommandList* m_vertex_copy_cmd_list; - - ID3D12CommandAllocator* m_texture_copy_cmd_allocator; - ID3D12GraphicsCommandList* m_texture_copy_cmd_list; - - UINT64 m_vertex_copy_fence = 0; - UINT64 m_texture_copy_fence = 0; - UINT64 m_render_texture_draw_fence = 0; - - HANDLE m_fence_event; - - bool m_is_render_texture_created_by_unity = false; }; RenderAPI* CreateRenderAPI_D3D12() @@ -460,21 +105,9 @@ RenderAPI* CreateRenderAPI_D3D12() return new RenderAPI_D3D12(); } -const UINT kNodeMask = 0; RenderAPI_D3D12::RenderAPI_D3D12() : s_d3d12(NULL) - , s_upload_texture(NULL) - , s_upload_buffer(NULL) - , m_triangle_pso(NULL) - , m_triangle_rootsig(NULL) - , m_triangle_rtv_desc_heap(NULL) - , m_triangle_dsv_desc_heap(NULL) - , m_texture_rtv_desc_heap(NULL) - , m_texture_rtv_desc_size(NULL) - , m_render_texture_vertex_buffer(NULL) - , m_render_texture_cmd_allocator(NULL) - , m_render_texture_cmd_list(NULL) { } @@ -484,260 +117,9 @@ UINT64 CalcByteAlignedValue(unsigned int byteSize, unsigned int byteAlignment) return (byteSize + byteAlignmentMinusOne) & ~byteAlignmentMinusOne; } -UINT64 RenderAPI_D3D12::align_pow2(UINT64 value) -{ - UINT64 aligned = static_cast(pow(2, (int)log2(value))); - return aligned >= value ? aligned : aligned * 2; -} -UINT64 RenderAPI_D3D12::get_aligned_size(int width, int height, int pixelSize, int rowPitch) -{ - UINT64 size = width * height * pixelSize; - size = align_pow2(size); - - if (size < D3D12_SMALL_RESOURCE_PLACEMENT_ALIGNMENT) - { - return D3D12_SMALL_RESOURCE_PLACEMENT_ALIGNMENT; - } - else if (width * pixelSize < rowPitch) - { - return rowPitch * height; - } - else - { - return size; - } -} - -bool RenderAPI_D3D12::create_D3D12_default_buffer(ID3D12GraphicsCommandList* cmdLst, const void* initData, unsigned int bufferSizeInBytes, LPCWSTR uploadHeapResourceName, LPCWSTR defaultHeapResourceName, D3D12DefaultBufferMemoryObject& outMemoryObj) -{ - if (!cmdLst) - return false; - - if (!create_D3D12_buffer(bufferSizeInBytes, D3D12_HEAP_TYPE_UPLOAD, D3D12_RESOURCE_FLAG_NONE, D3D12_RESOURCE_STATE_GENERIC_READ, uploadHeapResourceName, &outMemoryObj.uploadResource)) - return false; - - if (!create_D3D12_buffer(bufferSizeInBytes, D3D12_HEAP_TYPE_DEFAULT, D3D12_RESOURCE_FLAG_NONE, D3D12_RESOURCE_STATE_COMMON, defaultHeapResourceName, &outMemoryObj.defaultResource)) - return false; - - ID3D12Resource* uploadResource = outMemoryObj.uploadResource.resource; - ID3D12Resource* defaultResource = outMemoryObj.defaultResource.resource; - - D3D12_SUBRESOURCE_DATA subResourceDataDesc; - subResourceDataDesc.pData = initData; - subResourceDataDesc.RowPitch = outMemoryObj.uploadResource.deviceMemorySize; - subResourceDataDesc.SlicePitch = subResourceDataDesc.RowPitch; - - transition_barrier(cmdLst, defaultResource, D3D12_RESOURCE_STATE_COMMON, D3D12_RESOURCE_STATE_COPY_DEST); - UpdateSubresources<1>(cmdLst, defaultResource, uploadResource, 0, 0, 1, &subResourceDataDesc); - transition_barrier(cmdLst, defaultResource, D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_COMMON); - - return true; -} - -bool RenderAPI_D3D12::create_D3D12_buffer(size_t sizeInBytes, D3D12_HEAP_TYPE heapType, D3D12_RESOURCE_FLAGS resourceFlags, D3D12_RESOURCE_STATES initialResourceState, LPCWSTR resourceName, D3D12MemoryObject* buffer) -{ - ID3D12Device* device = s_d3d12->GetDevice(); - - UINT64 alignedBufferSizeInBytes = CalcByteAlignedValue(static_cast(sizeInBytes), 256); - - HRESULT hr = S_OK; - - CD3DX12_HEAP_PROPERTIES heap_props = CD3DX12_HEAP_PROPERTIES(heapType); - CD3DX12_RESOURCE_DESC resource_desc = CD3DX12_RESOURCE_DESC::Buffer(alignedBufferSizeInBytes, resourceFlags); - - ReturnOnFail( - device->CreateCommittedResource( - &heap_props, - D3D12_HEAP_FLAG_NONE, - &resource_desc, - initialResourceState, - NULL, - IID_PPV_ARGS(&buffer->resource)), - hr, - "CreateD3D12Buffer Failed\n", - false - ); - - if (heapType == D3D12_HEAP_TYPE_UPLOAD) - { - hr = buffer->resource->Map(0, NULL, &buffer->mapped); - if (FAILED(hr)) - { - OutputDebugStringA("Failed to map buffer.\n"); - buffer->resource->Release(); - buffer->resource = NULL; - return false; - } - } - else - buffer->mapped = NULL; - - buffer->heapType = heapType; - buffer->resourceFlags = resourceFlags; - buffer->deviceMemorySize = alignedBufferSizeInBytes; - buffer->resourceFlags = resourceFlags; - - if (resourceName != NULL) - buffer->resource->SetName(resourceName); - - return true; -} - -void RenderAPI_D3D12::create_triangle_input_layout() -{ - m_triangle_layout[0] = D3D12_INPUT_ELEMENT_DESC( - { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 } - ); - - m_triangle_layout[1] = D3D12_INPUT_ELEMENT_DESC( - { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, D3D12_APPEND_ALIGNED_ELEMENT, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 } - ); -} - -bool RenderAPI_D3D12::create_triangle_root_signature() -{ - HRESULT hr = S_OK; - CD3DX12_ROOT_PARAMETER slotRootParameter[1]; - - slotRootParameter[0].InitAsConstants(64, 0, 0, D3D12_SHADER_VISIBILITY_ALL); - - CD3DX12_ROOT_SIGNATURE_DESC rsDesc(1, slotRootParameter, 0, NULL, D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT); - ID3DBlob* serializedRootSigBlob = NULL; - ID3DBlob* errorBlob = NULL; - - ReturnOnFail( - D3D12SerializeRootSignature(&rsDesc, D3D_ROOT_SIGNATURE_VERSION_1, &serializedRootSigBlob, &errorBlob), - hr, - "D3D12SerializeRootSignature Failed\n", - false - ); - - ID3D12Device* device = s_d3d12->GetDevice(); - ReturnOnFail( - device->CreateRootSignature(0, serializedRootSigBlob->GetBufferPointer(), serializedRootSigBlob->GetBufferSize(), __uuidof(ID3D12RootSignature), reinterpret_cast(&m_triangle_rootsig)); , - hr, - "CreateRootSignature Failed\n", - false - ); - - return true; -} - -ID3D12PipelineState* RenderAPI_D3D12::create_triangle_pipeline() -{ - HRESULT hr = S_OK; - - if (!create_triangle_root_signature()) - return NULL; - - create_triangle_input_layout(); - - D3D12_GRAPHICS_PIPELINE_STATE_DESC desc; - ZeroMemory(&desc, sizeof(D3D12_GRAPHICS_PIPELINE_STATE_DESC)); - - desc.InputLayout = { m_triangle_layout, 2 }; - desc.pRootSignature = m_triangle_rootsig; - desc.VS = { - vertex_shader, - sizeof(vertex_shader) - }; - - desc.PS = { - pixel_shader, - sizeof(pixel_shader) - }; - - desc.RasterizerState = CD3DX12_RASTERIZER_DESC(D3D12_DEFAULT); - desc.RasterizerState.MultisampleEnable = true; - desc.RasterizerState.CullMode = D3D12_CULL_MODE_NONE; - - desc.BlendState = CD3DX12_BLEND_DESC(D3D12_DEFAULT); - desc.BlendState.RenderTarget[0].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL; - - desc.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC(D3D12_DEFAULT); - desc.DepthStencilState.DepthEnable = true; - desc.DepthStencilState.DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL; // Unity uses reverse z depth - desc.DepthStencilState.DepthFunc = D3D12_COMPARISON_FUNC_GREATER_EQUAL; - - desc.SampleMask = UINT_MAX; - desc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; - desc.NumRenderTargets = 1; - desc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM; - desc.SampleDesc.Count = 1; - desc.SampleDesc.Quality = 0; - desc.DSVFormat = DXGI_FORMAT_D32_FLOAT_S8X24_UINT; - - ID3D12Device* device = s_d3d12->GetDevice(); - ReturnOnFail( - device->CreateGraphicsPipelineState(&desc, __uuidof(ID3D12PipelineState), reinterpret_cast(&m_triangle_pso)), - hr, - "CreateGraphicsPipelineState Failed\n", - NULL - ); - - return m_triangle_pso; -} - -bool RenderAPI_D3D12::get_upload_resource(ID3D12Resource** outResource, UINT64 size, LPCWSTR name) -{ - ID3D12Resource*& resource = *outResource; - if (resource) - { - D3D12_RESOURCE_DESC desc = resource->GetDesc(); - if (desc.Width == size) - return true; - else - { - resource->Release(); - return false; - } - } - - // Texture upload buffer - D3D12_HEAP_PROPERTIES heapProps = {}; - heapProps.Type = D3D12_HEAP_TYPE_UPLOAD; - heapProps.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; - heapProps.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; - heapProps.CreationNodeMask = kNodeMask; - heapProps.VisibleNodeMask = kNodeMask; - - D3D12_RESOURCE_DESC heapDesc = {}; - heapDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; - heapDesc.Alignment = 0; - heapDesc.Width = size; - heapDesc.Height = 1; - heapDesc.DepthOrArraySize = 1; - heapDesc.MipLevels = 1; - heapDesc.Format = DXGI_FORMAT_UNKNOWN; - heapDesc.SampleDesc.Count = 1; - heapDesc.SampleDesc.Quality = 0; - heapDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; - heapDesc.Flags = D3D12_RESOURCE_FLAG_NONE; - - HRESULT hr = S_OK; - ID3D12Device* device = s_d3d12->GetDevice(); - ReturnOnFail( - device->CreateCommittedResource( - &heapProps, - D3D12_HEAP_FLAG_NONE, - &heapDesc, - D3D12_RESOURCE_STATE_GENERIC_READ, - nullptr, - IID_PPV_ARGS(&resource)), - hr, - "CreateCommittedResource Failed\n", - false - ); - - if (name != NULL) - resource->SetName(name); - - return true; -} - -void RenderAPI_D3D12::ProcessDeviceEvent(UnityGfxDeviceEventType type, IUnityInterfaces* interfaces) +void RenderAPI_D3D12::processDeviceEvent(UnityGfxDeviceEventType type, IUnityInterfaces* interfaces) { switch (type) { @@ -755,878 +137,13 @@ void RenderAPI_D3D12::ProcessDeviceEvent(UnityGfxDeviceEventType type, IUnityInt config_2.flags = kUnityD3D12EventConfigFlag_SyncWorkerThreads | kUnityD3D12EventConfigFlag_ModifiesCommandBuffersState | kUnityD3D12EventConfigFlag_EnsurePreviousFrameSubmission; config_2.ensureActiveRenderTextureIsBound = false; s_d3d12->ConfigureEvent(2, &config_2); - - initialize_and_create_resources(); + initSupportFeature(); break; case kUnityGfxDeviceEventShutdown: - release_resources(); break; } } -void RenderAPI_D3D12::DrawSimpleTriangles(const float worldMatrix[16], int triangleCount, const void* verticesFloat3Byte4) -{ - UnityGraphicsD3D12RecordingState recordingState; - if (!s_d3d12->CommandRecordingState(&recordingState)) - return; - - if (m_triangle_pso == NULL) - { - m_triangle_pso = create_triangle_pipeline(); - } - - if (m_triangle_pso != NULL) - { - ID3D12GraphicsCommandList* cmdLst = recordingState.commandList; - - garbage_collect(); - - const int kVertexSize = 12 + 4; // 12 bytes for position and 4 bytes for color - const UINT vertexBufferSizeInBytes = kVertexSize * 3 * triangleCount; - if (!create_D3D12_default_buffer(cmdLst, verticesFloat3Byte4, vertexBufferSizeInBytes, D3D12_UPLOAD_HEAP_TRIANGLE_BUFFER_NAME, D3D12_DEFAULT_HEAP_TRIANGLE_BUFFER_NAME, m_triangle_vertex_buffer)) - return; - - cmdLst->SetPipelineState(m_triangle_pso); - cmdLst->SetGraphicsRootSignature(m_triangle_rootsig); - cmdLst->SetGraphicsRoot32BitConstants(0, 64, worldMatrix, 0); - - D3D12_VERTEX_BUFFER_VIEW vbView; - vbView.BufferLocation = m_triangle_vertex_buffer.defaultResource.resource->GetGPUVirtualAddress(); - vbView.SizeInBytes = vertexBufferSizeInBytes; - vbView.StrideInBytes = kVertexSize; - - cmdLst->IASetVertexBuffers(0, 1, &vbView); - cmdLst->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - cmdLst->DrawInstanced(triangleCount * 3, 1, 0, 0); - - UINT64 nextval = s_d3d12->GetNextFrameFenceValue(); - - ID3D12Fence* fence = s_d3d12->GetFrameFence(); - UINT64 lastCompletedFenceValue = fence->GetCompletedValue(); - lastCompletedFenceValue += 3; - safe_destroy(lastCompletedFenceValue, m_triangle_vertex_buffer.uploadResource); - safe_destroy(lastCompletedFenceValue, m_triangle_vertex_buffer.defaultResource); - } -} - -void RenderAPI_D3D12::safe_destroy(unsigned long long frameNumber, const D3D12MemoryObject& buffer) -{ - m_DeleteQueue[frameNumber].push_back(buffer); -} - -void RenderAPI_D3D12::garbage_collect(bool force /*= false*/) -{ - ID3D12Fence* fence = s_d3d12->GetFrameFence(); - UINT64 lastCompletedFenceValue = fence->GetCompletedValue(); - - DeleteQueue::iterator it = m_DeleteQueue.begin(); - while (it != m_DeleteQueue.end()) - { - if (force || it->first <= lastCompletedFenceValue) - { - for (size_t i = 0; i < it->second.size(); ++i) - immediate_destroy_d3d12_buffer(it->second[i]); - m_DeleteQueue.erase(it++); - } - else - ++it; - } -} - -void RenderAPI_D3D12::immediate_destroy_d3d12_buffer(D3D12MemoryObject& buffer) -{ - if (buffer.resource == NULL) - return; - - if (buffer.mapped) - { - buffer.resource->Unmap(0, NULL); - buffer.mapped = 0; - } - - SAFE_RELEASE(buffer.resource); -} - -void RenderAPI_D3D12::initialize_and_create_resources() -{ - if (m_are_resources_initialized) - return; - - ID3D12Device* device = s_d3d12->GetDevice(); - assert(device != nullptr); - - UnityGraphicsD3D12PhysicalVideoMemoryControlValues control_values; - control_values.reservation = 64000000; - control_values.systemMemoryThreshold = 64000000; - control_values.residencyHysteresisThreshold = 128000000; - control_values.nonEvictableRelativeThreshold = 0.25; - s_d3d12->SetPhysicalVideoMemoryControlValues(&control_values); - - constexpr Vertex vertices[] { - // position color - // <---------------> <--------------------> - {{ 0.0f, 1.0f, 0.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } }, - {{ 1.0f, -1.0f, 0.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } }, - {{ -1.0f, -1.0f, 0.0f }, { 0.0f, 0.0f, 1.0f, 1.0f } } - }; - - D3D12_INPUT_ELEMENT_DESC position = {}; - position.SemanticName = "POSITION"; - position.SemanticIndex = 0; - position.Format = DXGI_FORMAT_R32G32B32_FLOAT; - position.AlignedByteOffset = 0; - position.InputSlotClass = D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA; - position.InstanceDataStepRate = 0; - - D3D12_INPUT_ELEMENT_DESC color = {}; - color.SemanticName = "COLOR"; - color.SemanticIndex = 0; - color.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; - color.AlignedByteOffset = 12; - color.InputSlotClass = D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA; - color.InstanceDataStepRate = 0; - - D3D12_INPUT_ELEMENT_DESC input_element_desc[] = {position, color}; - - D3D12_RESOURCE_DESC vertex_buffer_desc = {}; - vertex_buffer_desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; - vertex_buffer_desc.Alignment = 0; - vertex_buffer_desc.Width = sizeof(vertices); - vertex_buffer_desc.Height = 1; - vertex_buffer_desc.DepthOrArraySize = 1; - vertex_buffer_desc.MipLevels = 1; - vertex_buffer_desc.Format = DXGI_FORMAT_UNKNOWN; - vertex_buffer_desc.SampleDesc.Count = 1; - vertex_buffer_desc.SampleDesc.Quality = 0; - vertex_buffer_desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; - vertex_buffer_desc.Flags = D3D12_RESOURCE_FLAG_NONE; - - D3D12_HEAP_PROPERTIES vertex_buffer_heap_props = {}; - vertex_buffer_heap_props.Type = D3D12_HEAP_TYPE_UPLOAD; - vertex_buffer_heap_props.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; - vertex_buffer_heap_props.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; - vertex_buffer_heap_props.CreationNodeMask = 1; - vertex_buffer_heap_props.VisibleNodeMask = 1; - - handle_hr(device->CreateCommittedResource(&vertex_buffer_heap_props, D3D12_HEAP_FLAG_NONE, &vertex_buffer_desc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(&m_render_texture_vertex_buffer)), - "Failed to create vertex buffer for render texture\n"); - - char* data; - D3D12_RANGE read_range{ 0, 0 }; - handle_hr(m_render_texture_vertex_buffer->Map(0, &read_range, reinterpret_cast(&data))); - memcpy(data, vertices, sizeof(vertices)); - m_render_texture_vertex_buffer->Unmap(0, nullptr); - - m_texture_vertex_buffer_view = {}; - m_texture_vertex_buffer_view.BufferLocation = m_render_texture_vertex_buffer->GetGPUVirtualAddress(); - m_texture_vertex_buffer_view.SizeInBytes = sizeof(vertices); - m_texture_vertex_buffer_view.StrideInBytes = sizeof(Vertex); - - // 1st descriptor is for m_render_texture and 2nd one is for m_plugin_texture - D3D12_DESCRIPTOR_HEAP_DESC rtv_heap_desc = {}; - rtv_heap_desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV; - rtv_heap_desc.NumDescriptors = 2; - rtv_heap_desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE; - rtv_heap_desc.NodeMask = 0; - - handle_hr(device->CreateDescriptorHeap(&rtv_heap_desc, IID_PPV_ARGS(&m_texture_rtv_desc_heap)), - "Failed to create descriptor heap for render texture RTVs\n"); - - m_texture_rtv_desc_size = device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV); - - // When Unity does create it's own RenderBuffer and passes it to the plugin - // using setRenderTexture() we don't have to create one here. - if (!m_is_render_texture_created_by_unity) - m_render_texture = create_render_texture(); - - m_plugin_texture = create_render_texture(); - - create_render_texture_rtv(m_texture_rtv_desc_heap, m_render_texture, 0); - create_render_texture_rtv(m_texture_rtv_desc_heap, m_plugin_texture, 1); - - m_render_texture.load()->SetName(L"plugin render texture\n"); - - // we store the world matrix in the root signature - D3D12_ROOT_CONSTANTS root_constants = {}; - root_constants.ShaderRegister = 0; - root_constants.RegisterSpace = 0; - root_constants.Num32BitValues = 64; // maximum size for root sig - - D3D12_ROOT_PARAMETER root_param = {}; - root_param.ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS; - root_param.Constants = root_constants; - root_param.ShaderVisibility = D3D12_SHADER_VISIBILITY_VERTEX; - - D3D12_ROOT_SIGNATURE_DESC root_signature_desc = {}; - root_signature_desc.NumParameters = 1; - root_signature_desc.pParameters = &root_param; - root_signature_desc.NumStaticSamplers = 0; - root_signature_desc.pStaticSamplers = nullptr; - root_signature_desc.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT; - - handle_hr(D3D12SerializeRootSignature(&root_signature_desc, D3D_ROOT_SIGNATURE_VERSION_1, &m_render_texture_root_blob, nullptr), - "Failed to serialize root signature for render texture\n"); - handle_hr(device->CreateRootSignature(0, m_render_texture_root_blob->GetBufferPointer(), m_render_texture_root_blob->GetBufferSize(), IID_PPV_ARGS(&m_texture_root_sig)), - "Failed to create root signature for render texture\n"); - - D3D12_RASTERIZER_DESC rasterizer_desc = {}; - rasterizer_desc.FillMode = D3D12_FILL_MODE_SOLID; - rasterizer_desc.CullMode = D3D12_CULL_MODE_NONE; - rasterizer_desc.FrontCounterClockwise = FALSE; - rasterizer_desc.DepthBias = D3D12_DEFAULT_DEPTH_BIAS; - rasterizer_desc.DepthBiasClamp = D3D12_DEFAULT_DEPTH_BIAS_CLAMP; - rasterizer_desc.SlopeScaledDepthBias = 0; - rasterizer_desc.MultisampleEnable = FALSE; - rasterizer_desc.MultisampleEnable = FALSE; - rasterizer_desc.AntialiasedLineEnable = FALSE; - rasterizer_desc.ForcedSampleCount = 0; - rasterizer_desc.ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF; - - D3D12_RENDER_TARGET_BLEND_DESC render_target_blend_desc = {}; - render_target_blend_desc.BlendEnable = FALSE; - render_target_blend_desc.LogicOpEnable = FALSE; - render_target_blend_desc.SrcBlend = D3D12_BLEND_ONE; - render_target_blend_desc.DestBlend = D3D12_BLEND_ZERO; - render_target_blend_desc.BlendOp = D3D12_BLEND_OP_ADD; - render_target_blend_desc.SrcBlendAlpha = D3D12_BLEND_ONE; - render_target_blend_desc.DestBlendAlpha = D3D12_BLEND_ZERO; - render_target_blend_desc.BlendOpAlpha = D3D12_BLEND_OP_ADD; - render_target_blend_desc.LogicOp = D3D12_LOGIC_OP_NOOP; - render_target_blend_desc.RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL; - - D3D12_BLEND_DESC blend_desc = {}; - blend_desc.AlphaToCoverageEnable = FALSE; - blend_desc.IndependentBlendEnable = FALSE; - blend_desc.RenderTarget[0] = render_target_blend_desc; - - D3D12_DEPTH_STENCIL_DESC depth_stencil_desc = {}; - depth_stencil_desc.DepthEnable = FALSE; - depth_stencil_desc.DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ZERO; - depth_stencil_desc.DepthFunc = D3D12_COMPARISON_FUNC_NEVER; - depth_stencil_desc.StencilEnable = FALSE; - - D3D12_SHADER_BYTECODE vertex_bytecode = {}; - vertex_bytecode.pShaderBytecode = (void*)(vertex_shader); - vertex_bytecode.BytecodeLength = sizeof(vertex_shader); - - D3D12_SHADER_BYTECODE pixel_bytecode = {}; - pixel_bytecode.pShaderBytecode = (void*)(pixel_shader); - pixel_bytecode.BytecodeLength = sizeof(pixel_shader); - - D3D12_INPUT_LAYOUT_DESC input_layout_desc = {}; - input_layout_desc.pInputElementDescs = input_element_desc; - input_layout_desc.NumElements = _countof(input_element_desc); - - DXGI_SAMPLE_DESC dxgi_sample_desc = {}; - dxgi_sample_desc.Count = 1; - dxgi_sample_desc.Quality = 0; - - D3D12_GRAPHICS_PIPELINE_STATE_DESC pso_desc = {}; - pso_desc.pRootSignature = m_texture_root_sig; - pso_desc.VS = vertex_bytecode; - pso_desc.PS = pixel_bytecode; - pso_desc.DS = { nullptr, 0 }; - pso_desc.HS = { nullptr, 0 }; - pso_desc.GS = { nullptr, 0 }; - pso_desc.StreamOutput = {}; - pso_desc.BlendState = blend_desc; - pso_desc.SampleMask = 1; - pso_desc.RasterizerState = rasterizer_desc; - pso_desc.DepthStencilState = depth_stencil_desc; - pso_desc.InputLayout = input_layout_desc; - pso_desc.IBStripCutValue = {}; - pso_desc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; - pso_desc.NumRenderTargets = 1; - pso_desc.RTVFormats[0] = {DXGI_FORMAT_R8G8B8A8_UNORM}; - pso_desc.DSVFormat = {}; - pso_desc.SampleDesc = dxgi_sample_desc; - pso_desc.NodeMask = 0; - pso_desc.CachedPSO = { nullptr, 0 }; - pso_desc.Flags = D3D12_PIPELINE_STATE_FLAG_NONE; - - handle_hr(device->CreateGraphicsPipelineState(&pso_desc, IID_PPV_ARGS(&m_texture_pso)), - "Failed to create PSO for render texture\n"); - handle_hr(device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&m_render_texture_cmd_allocator)), - "Failed to create cmd allocator for render texture\n"); - handle_hr(device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, m_render_texture_cmd_allocator, nullptr, IID_PPV_ARGS(&m_render_texture_cmd_list)), - "Failed to create cmd list for render texture\n"); - - handle_hr(device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&m_plugin_texture_cmd_allocator)), - "Failed to create cmd allocator for plugin texture\n"); - - handle_hr(device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, m_plugin_texture_cmd_allocator, nullptr, IID_PPV_ARGS(&m_plugin_texture_cmd_list)), - "Failed to create cmd list for render texture2\n"); - - handle_hr(device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&m_texture_copy_cmd_allocator)), - "Failed to create cmd allocator for texture copy\n"); - - handle_hr(device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&m_vertex_copy_cmd_allocator)), - "Failed to create cmd allocator for vertex copy\n"); - - handle_hr(device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, m_texture_copy_cmd_allocator, nullptr, IID_PPV_ARGS(&m_texture_copy_cmd_list)), - "Failed to create texture copy cmd list\n"); - - handle_hr(device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, m_vertex_copy_cmd_allocator, nullptr, IID_PPV_ARGS(&m_vertex_copy_cmd_list)), - "Failed to create vertex copy cmd list\n"); - - handle_hr(device->CreateFence(m_plugin_texture_fence_value, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&m_plugin_texture_fence)), - "Failed to create fence for plugin texture"); - - m_texture_copy_cmd_allocator->SetName(L"texture copy cmd allocator"); - m_vertex_copy_cmd_allocator->SetName(L"vertex copy cmd allocator"); - m_render_texture_cmd_allocator->SetName(L"render texture cmd allocator"); - - m_vertex_copy_cmd_list->SetName(L"vertex copy cmd list"); - m_texture_copy_cmd_list->SetName(L"texture copy cmd list"); - m_render_texture_cmd_list->SetName(L"render texture cmd list"); - - handle_hr(m_vertex_copy_cmd_list->Close(), "Failed to close cmd list for vertex copy\n"); - handle_hr(m_texture_copy_cmd_list->Close(), "Failed to close cmd list for texture copy\n"); - handle_hr(m_render_texture_cmd_list->Close(), "Failed to close cmd list for render texture\n"); - handle_hr(m_plugin_texture_cmd_list->Close(), "Failed to close cmd list for plugin texture\n"); - - m_fence_event = CreateEvent(NULL, false, false, nullptr); - m_plugin_texture_fence_event = CreateEvent(NULL, false, false, nullptr); - - D3D12_DESCRIPTOR_HEAP_DESC rtvDesc = {}; - rtvDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV; - rtvDesc.NumDescriptors = 1; - rtvDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE; - rtvDesc.NodeMask = 0; - - handle_hr(device->CreateDescriptorHeap(&rtvDesc, IID_PPV_ARGS(&m_triangle_rtv_desc_heap)), - "CreateDescriptorHeap Failed\n"); - - D3D12_DESCRIPTOR_HEAP_DESC dsvDesc = {}; - dsvDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV; - dsvDesc.NumDescriptors = 1; - dsvDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE; - dsvDesc.NodeMask = 0; - - handle_hr(device->CreateDescriptorHeap(&dsvDesc, IID_PPV_ARGS(&m_triangle_dsv_desc_heap)), - "CreateDescriptorHeap Failed\n"); - - m_are_resources_initialized = true; -} - -void RenderAPI_D3D12::release_resources() -{ - SAFE_RELEASE(m_render_texture_cmd_list); - SAFE_RELEASE(m_render_texture_cmd_allocator); - SAFE_RELEASE(m_plugin_texture_cmd_list); - SAFE_RELEASE(m_plugin_texture_cmd_allocator); - SAFE_RELEASE(m_texture_pso); - SAFE_RELEASE(m_texture_root_sig); - SAFE_RELEASE(m_render_texture_root_blob); - SAFE_RELEASE(m_texture_rtv_desc_heap); - if (!m_is_render_texture_created_by_unity) - { - ID3D12Resource* render_texture = m_render_texture.load(); - if (render_texture) - { - render_texture->Release(); - m_render_texture = nullptr; - } - } - SAFE_RELEASE(m_render_texture_vertex_buffer); - SAFE_RELEASE(m_triangle_pso); - SAFE_RELEASE(m_triangle_rootsig); - SAFE_RELEASE(m_triangle_rtv_desc_heap); - SAFE_RELEASE(m_triangle_dsv_desc_heap); - SAFE_RELEASE(s_upload_texture); - SAFE_RELEASE(s_upload_buffer); - SAFE_RELEASE(m_vertex_copy_cmd_list); - SAFE_RELEASE(m_texture_copy_cmd_list); - SAFE_RELEASE(m_vertex_copy_cmd_allocator); - SAFE_RELEASE(m_texture_copy_cmd_allocator); - - if (ID3D12Resource* plugin_texture = m_plugin_texture.load()) - { - plugin_texture->Release(); - m_plugin_texture = nullptr; - } - - CloseHandle(m_fence_event); - CloseHandle(m_plugin_texture_fence_event); - - garbage_collect(true); - m_mapped_triangle_vertex_buffers.clear(); -} - -void RenderAPI_D3D12::record_draw_cmd_list(ID3D12CommandAllocator* cmd_alloc, ID3D12GraphicsCommandList* cmd, ID3D12RootSignature* rootsig, D3D12_CPU_DESCRIPTOR_HANDLE rtv_handle, D3D12_VERTEX_BUFFER_VIEW* vbview, const float* world_matrix, D3D12_VIEWPORT* viewport, ID3D12PipelineState* pso, ID3D12Resource* target, D3D12_RESOURCE_STATES target_state) -{ - constexpr FLOAT clear_color[4] = { 0.5f, 0.5f, 0.5f, 1.f }; - - handle_hr(cmd_alloc->Reset(), "Failed to reset cmd allocator\n"); - handle_hr(cmd->Reset(cmd_alloc, pso), "Failed to reset cmd list\n"); - - cmd->SetGraphicsRootSignature(rootsig); - cmd->SetGraphicsRoot32BitConstants(0, 64, world_matrix, 0); - - if (target_state != D3D12_RESOURCE_STATE_RENDER_TARGET) - { - transition_barrier(cmd, target, target_state, D3D12_RESOURCE_STATE_RENDER_TARGET); - } - - cmd->OMSetRenderTargets(1, &rtv_handle, FALSE, nullptr); - cmd->ClearRenderTargetView(rtv_handle, clear_color, 0, nullptr); - - D3D12_RECT scissor; - scissor.left = 0; - scissor.top = 0; - scissor.right = static_cast(viewport->Width); - scissor.bottom = static_cast(viewport->Height); - - cmd->RSSetViewports(1, viewport); - cmd->RSSetScissorRects(1, &scissor); - cmd->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - cmd->IASetVertexBuffers(0, 1, vbview); - - const UINT vertices = vbview->SizeInBytes / vbview->StrideInBytes; - - cmd->DrawInstanced(vertices, 1, 0, 0); - - if (target_state != D3D12_RESOURCE_STATE_RENDER_TARGET) - { - transition_barrier(cmd, target, D3D12_RESOURCE_STATE_RENDER_TARGET, target_state); - } - - handle_hr(cmd->Close(), "Failed to close draw cmd list\n"); -} - -UINT64 RenderAPI_D3D12::submit_cmd_to_unity_worker(ID3D12GraphicsCommandList* cmd, UnityGraphicsD3D12ResourceState* resource_states, int state_count) -{ - return s_d3d12->ExecuteCommandList(cmd, state_count, resource_states); -} - -ID3D12Resource* RenderAPI_D3D12::create_render_texture() -{ - ID3D12Device* device = s_d3d12->GetDevice(); - - DXGI_SAMPLE_DESC dxgi_sample_desc = {}; - dxgi_sample_desc.Count = 1; - dxgi_sample_desc.Quality = 0; - - D3D12_RESOURCE_DESC render_texture_desc = {}; - render_texture_desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; - render_texture_desc.Width = m_texture_width; - render_texture_desc.Height = m_texture_height; - render_texture_desc.DepthOrArraySize = 1; - render_texture_desc.MipLevels = 1; - render_texture_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - render_texture_desc.SampleDesc = dxgi_sample_desc; - render_texture_desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN; - render_texture_desc.Flags = D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET; - - D3D12_HEAP_PROPERTIES render_texture_heap_props = {}; - render_texture_heap_props.Type = D3D12_HEAP_TYPE_DEFAULT; - render_texture_heap_props.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; - render_texture_heap_props.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; - render_texture_heap_props.CreationNodeMask = 1; - render_texture_heap_props.VisibleNodeMask = 1; - - ID3D12Resource* pRendertex; - handle_hr(device->CreateCommittedResource(&render_texture_heap_props, D3D12_HEAP_FLAG_NONE, &render_texture_desc, D3D12_RESOURCE_STATE_RENDER_TARGET, nullptr, IID_PPV_ARGS(&pRendertex)), - "Failed to create a render texture\n"); - - return pRendertex; -} - -void RenderAPI_D3D12::create_render_texture_rtv(ID3D12DescriptorHeap* heap, ID3D12Resource* target, UINT offset) -{ - CD3DX12_CPU_DESCRIPTOR_HANDLE rtv_handle{ heap->GetCPUDescriptorHandleForHeapStart() }; - rtv_handle.Offset(offset, m_texture_rtv_desc_size); - - D3D12_TEX2D_RTV rtv; - rtv.MipSlice = 0; - rtv.PlaneSlice = 0; - - D3D12_RENDER_TARGET_VIEW_DESC desc; - desc.Format = typeless_fmt_to_typed(target->GetDesc().Format); - desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D; - desc.Texture2D = rtv; - - s_d3d12->GetDevice()->CreateRenderTargetView(target, &desc, rtv_handle); -} - -void RenderAPI_D3D12::transition_barrier(ID3D12GraphicsCommandList* cmd, ID3D12Resource* resource, D3D12_RESOURCE_STATES before, D3D12_RESOURCE_STATES after) -{ - D3D12_RESOURCE_TRANSITION_BARRIER transition = {}; - transition.pResource = resource; - transition.Subresource = 0; - transition.StateBefore = before; - transition.StateAfter = after; - - D3D12_RESOURCE_BARRIER barrier = {}; - barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; - barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; - barrier.Transition = transition; - - cmd->ResourceBarrier(1, &barrier); -} - -void RenderAPI_D3D12::wait_for_unity_frame_fence(UINT64 fence_value) -{ - ID3D12Fence* unity_fence = s_d3d12->GetFrameFence(); - UINT64 current_fence_value = unity_fence->GetCompletedValue(); - - if (current_fence_value < fence_value) - { - handle_hr(unity_fence->SetEventOnCompletion(fence_value, m_fence_event), "Failed to set fence event on completion\n"); - WaitForSingleObject(m_fence_event, INFINITE); - } -} - -void RenderAPI_D3D12::wait_on_fence(UINT64 fence_value, ID3D12Fence* fence, HANDLE fence_event) -{ - UINT64 current_fence_value = fence->GetCompletedValue(); - - if (current_fence_value < fence_value) - { - handle_hr(fence->SetEventOnCompletion(fence_value, fence_event)); - WaitForSingleObject(fence_event, INFINITE); - } -} - -DXGI_FORMAT RenderAPI_D3D12::typeless_fmt_to_typed(DXGI_FORMAT format) -{ - switch (format) - { - case DXGI_FORMAT_R32G32B32A32_TYPELESS: - return DXGI_FORMAT_R32G32B32A32_UINT; - - case DXGI_FORMAT_R32G32B32_TYPELESS: - return DXGI_FORMAT_R32G32B32_UINT; - - case DXGI_FORMAT_R16G16B16A16_TYPELESS: - return DXGI_FORMAT_R16G16B16A16_UNORM; - - case DXGI_FORMAT_R32G32_TYPELESS: - return DXGI_FORMAT_R32G32_UINT; - - case DXGI_FORMAT_R32G8X24_TYPELESS: - return DXGI_FORMAT_X32_TYPELESS_G8X24_UINT; - - case DXGI_FORMAT_R10G10B10A2_TYPELESS: - return DXGI_FORMAT_X32_TYPELESS_G8X24_UINT; - - case DXGI_FORMAT_R8G8B8A8_TYPELESS: - return DXGI_FORMAT_R8G8B8A8_UNORM; - - case DXGI_FORMAT_R16G16_TYPELESS: - return DXGI_FORMAT_R16G16_UNORM; - - case DXGI_FORMAT_R32_TYPELESS: - return DXGI_FORMAT_R32_UINT; - - case DXGI_FORMAT_R24G8_TYPELESS: - return DXGI_FORMAT_R24_UNORM_X8_TYPELESS; - - case DXGI_FORMAT_R8G8_TYPELESS: - return DXGI_FORMAT_R8G8_UNORM; - - case DXGI_FORMAT_R16_TYPELESS: - return DXGI_FORMAT_R16_UNORM; - - case DXGI_FORMAT_R8_TYPELESS: - return DXGI_FORMAT_R8_UNORM; - - case DXGI_FORMAT_BC1_TYPELESS: - return DXGI_FORMAT_BC1_UNORM; - - case DXGI_FORMAT_BC2_TYPELESS: - return DXGI_FORMAT_BC2_UNORM; - - case DXGI_FORMAT_BC3_TYPELESS: - return DXGI_FORMAT_BC3_UNORM; - - case DXGI_FORMAT_BC4_TYPELESS: - return DXGI_FORMAT_BC4_UNORM; - - case DXGI_FORMAT_BC5_TYPELESS: - return DXGI_FORMAT_BC5_UNORM; - - case DXGI_FORMAT_B8G8R8A8_TYPELESS: - return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; - - case DXGI_FORMAT_B8G8R8X8_TYPELESS: - return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB; - - case DXGI_FORMAT_BC6H_TYPELESS: - return DXGI_FORMAT_BC6H_UF16; - - case DXGI_FORMAT_BC7_TYPELESS: - return DXGI_FORMAT_BC7_UNORM; - - default: - return format; - } -} - -void* RenderAPI_D3D12::BeginModifyTexture(void* textureHandle, int textureWidth, int textureHeight, int* outRowPitch) -{ - wait_for_unity_frame_fence(m_texture_copy_fence); - - // Fill data - // Clamp to minimum rowPitch of RGBA32 - *outRowPitch = static_cast(max(align_pow2(textureWidth * 4), 256)); - const UINT64 kDataSize = get_aligned_size(textureWidth, textureHeight, 4, *outRowPitch); - if (!get_upload_resource(&s_upload_texture, kDataSize, D3D12_UPLOAD_HEAP_TEXTURE_BUFFER_NAME)) - return NULL; - - void* mapped = NULL; - s_upload_texture->Map(0, NULL, &mapped); - return mapped; -} - -void RenderAPI_D3D12::EndModifyTexture(void* textureHandle, int textureWidth, int textureHeight, int rowPitch, void* dataPtr) -{ - ID3D12Device* device = s_d3d12->GetDevice(); - - const UINT64 kDataSize = get_aligned_size(textureWidth, textureHeight, 4, rowPitch); - if (!get_upload_resource(&s_upload_texture, kDataSize, D3D12_UPLOAD_HEAP_TEXTURE_BUFFER_NAME)) - return; - - s_upload_texture->Unmap(0, 0); - - ID3D12Resource* resource = (ID3D12Resource*)textureHandle; - D3D12_RESOURCE_DESC desc = resource->GetDesc(); - assert(desc.Width == textureWidth); - assert(desc.Height == textureHeight); - - D3D12_TEXTURE_COPY_LOCATION srcLoc = {}; - srcLoc.pResource = s_upload_texture; - srcLoc.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; - device->GetCopyableFootprints(&desc, 0, 1, 0, &srcLoc.PlacedFootprint, nullptr, nullptr, nullptr); - - D3D12_TEXTURE_COPY_LOCATION dstLoc = {}; - dstLoc.pResource = resource; - dstLoc.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; - dstLoc.SubresourceIndex = 0; - - m_texture_copy_cmd_allocator->Reset(); - m_texture_copy_cmd_list->Reset(m_texture_copy_cmd_allocator, nullptr); - transition_barrier(m_texture_copy_cmd_list, resource, D3D12_RESOURCE_STATE_COMMON, D3D12_RESOURCE_STATE_COPY_DEST); - m_texture_copy_cmd_list->CopyTextureRegion(&dstLoc, 0, 0, 0, &srcLoc, nullptr); - transition_barrier(m_texture_copy_cmd_list, resource, D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_COMMON); - m_texture_copy_cmd_list->Close(); - - UnityGraphicsD3D12ResourceState resource_states = {}; - resource_states.resource = resource; - resource_states.expected = D3D12_RESOURCE_STATE_COMMON; - resource_states.current = D3D12_RESOURCE_STATE_COMMON; - - m_texture_copy_fence = submit_cmd_to_unity_worker(m_texture_copy_cmd_list, &resource_states, 1); -} - -void* RenderAPI_D3D12::BeginModifyVertexBuffer(void* bufferHandle, size_t* outBufferSize) -{ - wait_for_unity_frame_fence(m_vertex_copy_fence); - - if (bufferHandle == NULL) - return NULL; - - ID3D12Resource* unity_vertex_buffer = reinterpret_cast(bufferHandle); - D3D12_RESOURCE_DESC desc = unity_vertex_buffer->GetDesc(); - *outBufferSize = static_cast(desc.Width); - - if (!get_upload_resource(&s_upload_buffer, desc.Width, D3D12_UPLOAD_HEAP_VERTEX_BUFFER_NAME)) - return NULL; - - MappedVertexBuffers::iterator it = m_mapped_triangle_vertex_buffers.find(bufferHandle); - if (it == m_mapped_triangle_vertex_buffers.end()) - m_mapped_triangle_vertex_buffers.insert(std::make_pair(bufferHandle, reinterpret_cast(new int()))); - - HRESULT hr = s_upload_buffer->Map(0, 0, &m_mapped_triangle_vertex_buffers[bufferHandle]); - return m_mapped_triangle_vertex_buffers[bufferHandle]; -} - -void RenderAPI_D3D12::EndModifyVertexBuffer(void* bufferHandle) -{ - m_vertex_copy_cmd_allocator->Reset(); - m_vertex_copy_cmd_list->Reset(m_vertex_copy_cmd_allocator, nullptr); - - if (bufferHandle == NULL) - return; - - UnityGraphicsD3D12RecordingState recordingState; - if (!s_d3d12->CommandRecordingState(&recordingState)) - return; - - ID3D12Resource* unity_vertex_buffer = reinterpret_cast(bufferHandle); - D3D12_RESOURCE_DESC desc = unity_vertex_buffer->GetDesc(); - if (!get_upload_resource(&s_upload_buffer, desc.Width, D3D12_UPLOAD_HEAP_VERTEX_BUFFER_NAME)) - return; - - assert(desc.Height == 1); - - s_upload_buffer->Unmap(0, 0); - - D3D12_HEAP_PROPERTIES heap_props; - handle_hr(unity_vertex_buffer->GetHeapProperties(&heap_props, nullptr), "Failed to get heap properties for unitys vertex buffer"); - - // On DX12 Mesh.MarkDynamic() doesn't guarantee the underlying resource to be CPU mappable. In the case when it's not we need to - // place correct transition barriers before and after the copy command. - - if (heap_props.Type == D3D12_HEAP_TYPE_DEFAULT) - transition_barrier(m_vertex_copy_cmd_list, unity_vertex_buffer, D3D12_RESOURCE_STATE_COMMON, D3D12_RESOURCE_STATE_COPY_DEST); - - m_vertex_copy_cmd_list->CopyBufferRegion(unity_vertex_buffer, 0, s_upload_buffer, 0, desc.Width); - - if (heap_props.Type == D3D12_HEAP_TYPE_DEFAULT) - transition_barrier(m_vertex_copy_cmd_list, unity_vertex_buffer, D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_COMMON); - - handle_hr(m_vertex_copy_cmd_list->Close(), "Failed to close vertex copy cmd list"); - - UnityGraphicsD3D12ResourceState resource_states = {}; - if (heap_props.Type == D3D12_HEAP_TYPE_DEFAULT) - { - resource_states.resource = unity_vertex_buffer; - resource_states.expected = D3D12_RESOURCE_STATE_COMMON; - resource_states.current = D3D12_RESOURCE_STATE_COMMON; - } - - m_vertex_copy_fence = submit_cmd_to_unity_worker(m_vertex_copy_cmd_list, &resource_states, 1); -} - -void RenderAPI_D3D12::drawToPluginTexture() -{ - if (!m_plugin_texture) - return; - - wait_on_fence(m_plugin_texture_fence_value, m_plugin_texture_fence, m_plugin_texture_fence_event); - - // Draw the triangle upside down - constexpr float world_matrix[16] = { 1, 0, 0, 0, - 0,-1, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1 }; - - D3D12_VIEWPORT viewport = {}; - viewport.TopLeftX = 0; - viewport.TopLeftY = 0; - viewport.Width = static_cast(m_texture_width); - viewport.Height = static_cast(m_texture_height); - viewport.MinDepth = D3D12_MIN_DEPTH; - viewport.MaxDepth = D3D12_MAX_DEPTH; - - CD3DX12_CPU_DESCRIPTOR_HANDLE rtv_handle { m_texture_rtv_desc_heap->GetCPUDescriptorHandleForHeapStart() }; - rtv_handle.Offset(1, m_texture_rtv_desc_size); - - // We can reuse some of the resources for both plugin_texture and render_texture - record_draw_cmd_list(m_plugin_texture_cmd_allocator, - m_plugin_texture_cmd_list, - m_texture_root_sig, - rtv_handle, - &m_texture_vertex_buffer_view, - world_matrix, &viewport, - m_texture_pso, - m_plugin_texture, - D3D12_RESOURCE_STATE_RENDER_TARGET); - - ID3D12CommandQueue* unity_command_queue = s_d3d12->GetCommandQueue(); - unity_command_queue->ExecuteCommandLists(1, (ID3D12CommandList**)&m_plugin_texture_cmd_list); - unity_command_queue->Signal(m_plugin_texture_fence, ++m_plugin_texture_fence_value); -} - -void RenderAPI_D3D12::drawToRenderTexture() -{ - wait_for_unity_frame_fence(m_render_texture_draw_fence); - - if (!m_render_texture) - return; - - // Draw the triangle upright - constexpr float world_matrix[16] = { 1, 0, 0, 0, - 0, 1, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1 }; - - D3D12_VIEWPORT viewport = {}; - viewport.TopLeftX = 0; - viewport.TopLeftY = 0; - viewport.Width = static_cast(m_texture_width); - viewport.Height = static_cast(m_texture_height); - viewport.MinDepth = D3D12_MIN_DEPTH; - viewport.MaxDepth = D3D12_MAX_DEPTH; - - CD3DX12_CPU_DESCRIPTOR_HANDLE rtv_handle { m_texture_rtv_desc_heap->GetCPUDescriptorHandleForHeapStart() }; - rtv_handle.Offset(0, m_texture_rtv_desc_size); - - D3D12_RESOURCE_STATES target_state; - if (m_is_render_texture_created_by_unity) - { - target_state = D3D12_RESOURCE_STATE_COMMON; - } - else - { - target_state = D3D12_RESOURCE_STATE_RENDER_TARGET; - } - - record_draw_cmd_list(m_render_texture_cmd_allocator, - m_render_texture_cmd_list, - m_texture_root_sig, - rtv_handle, - &m_texture_vertex_buffer_view, - world_matrix, &viewport, - m_texture_pso, - m_render_texture, - target_state); - - UnityGraphicsD3D12ResourceState resource_states; - resource_states.resource = m_render_texture; - resource_states.expected = D3D12_RESOURCE_STATE_COMMON; - resource_states.current = D3D12_RESOURCE_STATE_COMMON; - - m_render_texture_draw_fence = submit_cmd_to_unity_worker(m_render_texture_cmd_list, &resource_states, 1); -} - -void* RenderAPI_D3D12::getRenderTexture() -{ - return reinterpret_cast(m_render_texture.load()); -} - -void RenderAPI_D3D12::setRenderTextureResource(UnityRenderBuffer rb) -{ - // Release existing resource if there is already one that wasn't created by Unity C# script - if (!m_is_render_texture_created_by_unity && m_render_texture) - { - m_render_texture.load()->Release(); - m_render_texture = nullptr; - } - - // rb == nullptr is used to signal that the previously used UnityRenderBuffer - // is not available anymore (i.e when it gets destroyed) - if (!rb) - { - m_render_texture = nullptr; - m_is_render_texture_created_by_unity = false; - return; - } - - // TextureFromRenderBuffer might not be immediately available when this function is called. - ID3D12Resource* rb_resource = nullptr; - while (!rb_resource) - { - rb_resource = s_d3d12->TextureFromRenderBuffer(rb); - } - - D3D12_RESOURCE_DESC desc = rb_resource->GetDesc(); - m_texture_width = desc.Width; - m_texture_height = desc.Height; - assert(desc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE2D); - assert(desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET); - - m_render_texture = rb_resource; - - // we need to update the rtv if we won't be calling initialize_render_texture_resources() after - // (when it's already initialized) - if (m_are_resources_initialized) - create_render_texture_rtv(m_texture_rtv_desc_heap, m_render_texture, 0); - - m_is_render_texture_created_by_unity = true; -} - bool RenderAPI_D3D12::isSwapChainAvailable() { return s_d3d12->GetSwapChain(); @@ -1666,6 +183,66 @@ unsigned int RenderAPI_D3D12::getBackbufferHeight() return desc.BufferDesc.Height; } +static D3D12_SHADING_RATE vrs_argment_size_table[] = { + D3D12_SHADING_RATE_1X1, + D3D12_SHADING_RATE_2X1, + D3D12_SHADING_RATE_1X2, + D3D12_SHADING_RATE_2X2, + D3D12_SHADING_RATE_4X2, + D3D12_SHADING_RATE_2X4, + D3D12_SHADING_RATE_4X4 +}; + +void RenderAPI_D3D12::enableVRS(int vrsEnum) +{ + UnityGraphicsD3D12RecordingState recordingState; + if (!s_d3d12->CommandRecordingState(&recordingState)) + { + return; + } + ID3D12GraphicsCommandList* cmdLst = recordingState.commandList; + reinterpret_cast(cmdLst)->RSSetShadingRate(vrs_argment_size_table[vrsEnum], nullptr); +} + +void RenderAPI_D3D12::disableVRS() +{ + UnityGraphicsD3D12RecordingState recordingState; + if (!s_d3d12->CommandRecordingState(&recordingState)) + { + return; + } + ID3D12GraphicsCommandList* cmdLst = recordingState.commandList; + reinterpret_cast(cmdLst)->RSSetShadingRate(D3D12_SHADING_RATE_1X1, nullptr); +} + +void RenderAPI_D3D12::initSupportFeature() +{ + D3D12_FEATURE_DATA_D3D12_OPTIONS6 options = {}; + s_d3d12->GetDevice()->CheckFeatureSupport( + D3D12_FEATURE_D3D12_OPTIONS6, + &options, + sizeof(options)); + if (options.VariableShadingRateTier == D3D12_VARIABLE_SHADING_RATE_TIER_1) + { + support_features[GraphicsFeature::VRS_DRAW] = true; + } + else if (options.VariableShadingRateTier == D3D12_VARIABLE_SHADING_RATE_TIER_2) + { + support_features[GraphicsFeature::VRS_DRAW] = true; + support_features[GraphicsFeature::VRS_PRIMITIVE] = true; + support_features[GraphicsFeature::VRS_ATTACHMENT] = true; + } + + if (options.AdditionalShadingRatesSupported) + { + // xxx: 一般用不到这么高级别 + // 表示支持 2x4、4x2 和 4x4 + } + + + support_features[GraphicsFeature::XESS13] = true; +} + #undef ReturnOnFail #endif // #if SUPPORT_D3D12 diff --git a/NativeRenderPlugin/RenderAPI_Vulkan.cpp b/NativeRenderPlugin/RenderAPI_Vulkan.cpp index 2ff2a09..e306140 100644 --- a/NativeRenderPlugin/RenderAPI_Vulkan.cpp +++ b/NativeRenderPlugin/RenderAPI_Vulkan.cpp @@ -522,7 +522,7 @@ void RenderAPI_Vulkan::disableVRS() vrs_enable = false; } -void RenderAPI_Vulkan::enableFGExtrapolation() +void RenderAPI_Vulkan::enableFGExtrapolation(void* data) { } diff --git a/NativeRenderPlugin/RenderingPlugin.cpp b/NativeRenderPlugin/RenderingPlugin.cpp index 78a2e43..3d7ebea 100644 --- a/NativeRenderPlugin/RenderingPlugin.cpp +++ b/NativeRenderPlugin/RenderingPlugin.cpp @@ -128,7 +128,7 @@ static void UNITY_INTERFACE_API OnRenderEventAndData(int eventID, void *data) } case NativeRenderingEvent::EnableFGExtrapolation: { - s_current_api->enableFGExtrapolation(); + s_current_api->enableFGExtrapolation(data); break; } case NativeRenderingEvent::DisableFGExtrapolation: @@ -171,37 +171,37 @@ extern "C" UNITY_INTERFACE_EXPORT bool GetFeatureSupport(int feature) // DX12 plugin specific // -------------------------------------------------------------------------- -extern "C" UNITY_INTERFACE_EXPORT void *UNITY_INTERFACE_API GetRenderTexture() -{ - return s_current_api->getRenderTexture(); -} - -extern "C" UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API SetRenderTexture(UnityRenderBuffer rb) -{ - s_current_api->setRenderTextureResource(rb); -} - -extern "C" UNITY_INTERFACE_EXPORT bool UNITY_INTERFACE_API IsSwapChainAvailable() -{ - return s_current_api->isSwapChainAvailable(); -} - -extern "C" UNITY_INTERFACE_EXPORT unsigned int UNITY_INTERFACE_API GetPresentFlags() -{ - return s_current_api->getPresentFlags(); -} - -extern "C" UNITY_INTERFACE_EXPORT unsigned int UNITY_INTERFACE_API GetSyncInterval() -{ - return s_current_api->getSyncInterval(); -} - -extern "C" UNITY_INTERFACE_EXPORT unsigned int UNITY_INTERFACE_API GetBackBufferWidth() -{ - return s_current_api->getBackbufferHeight(); -} - -extern "C" UNITY_INTERFACE_EXPORT unsigned int UNITY_INTERFACE_API GetBackBufferHeight() -{ - return s_current_api->getBackbufferWidth(); -} +//extern "C" UNITY_INTERFACE_EXPORT void *UNITY_INTERFACE_API GetRenderTexture() +//{ +// return s_current_api->getRenderTexture(); +//} +// +//extern "C" UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API SetRenderTexture(UnityRenderBuffer rb) +//{ +// s_current_api->setRenderTextureResource(rb); +//} +// +//extern "C" UNITY_INTERFACE_EXPORT bool UNITY_INTERFACE_API IsSwapChainAvailable() +//{ +// return s_current_api->isSwapChainAvailable(); +//} +// +//extern "C" UNITY_INTERFACE_EXPORT unsigned int UNITY_INTERFACE_API GetPresentFlags() +//{ +// return s_current_api->getPresentFlags(); +//} +// +//extern "C" UNITY_INTERFACE_EXPORT unsigned int UNITY_INTERFACE_API GetSyncInterval() +//{ +// return s_current_api->getSyncInterval(); +//} +// +//extern "C" UNITY_INTERFACE_EXPORT unsigned int UNITY_INTERFACE_API GetBackBufferWidth() +//{ +// return s_current_api->getBackbufferHeight(); +//} +// +//extern "C" UNITY_INTERFACE_EXPORT unsigned int UNITY_INTERFACE_API GetBackBufferHeight() +//{ +// return s_current_api->getBackbufferWidth(); +//} diff --git a/NativeRenderPlugin/xmake.lua b/NativeRenderPlugin/xmake.lua index 4f72b3b..96520ae 100644 --- a/NativeRenderPlugin/xmake.lua +++ b/NativeRenderPlugin/xmake.lua @@ -7,6 +7,14 @@ if (is_plat("windows")) then add_cxflags("/EHsc") end +option("use_dx11") + set_showmenu(true) + set_default(false) + +option("use_dx12") + set_showmenu(true) + set_default(false) + option("use_vulkan") set_showmenu(true) set_default(false) @@ -30,6 +38,16 @@ target("GfxPluginNativeRender") add_linkdirs("C:/VulkanSDK/1.3.283.0/Lib") end + if is_plat("windows") then + set_kind("shared") + if has_config("use_dx11") then + add_defines("SUPPORT_D3D11=1") + end + if has_config("use_dx12") then + add_defines("SUPPORT_D3D12=1") + end + end + if has_config("use_vulkan") then set_kind("shared") add_defines("SUPPORT_VULKAN=1") diff --git a/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/Passes/DrawObjectsPass.cs b/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/Passes/DrawObjectsPass.cs index 96211db..bc7f4cd 100644 --- a/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/Passes/DrawObjectsPass.cs +++ b/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/Passes/DrawObjectsPass.cs @@ -248,11 +248,28 @@ namespace UnityEngine.Rendering.Universal.Internal cmd.IssuePluginEventAndData(RenderingPlugin.GetRenderEventAndDataFunc(), (int)RenderingPlugin.NativeRenderingEvent.EnableVRS, p); context.ExecuteCommandBuffer(cmd); cmd.Clear(); + +#if DX12 + // DX12 下会 context.DrawRenderers 重新设置 view port 和 scissor rect + cmd.SetViewport(camera.pixelRect); + cmd.EnableScissorRect(camera.pixelRect); +#endif } - +#if DX12 + RendererUtils.RendererListDesc rendererListDesc = new (data.m_ShaderTagIdList.ToArray(), renderingData.cullResults,camera); + rendererListDesc.layerMask = camera.cullingMask; + rendererListDesc.sortingCriteria = sortFlags; + rendererListDesc.renderQueueRange = filterSettings.renderQueueRange; + rendererListDesc.layerMask = filterSettings.layerMask; + rendererListDesc.excludeObjectMotionVectors = false; + rendererListDesc.rendererConfiguration = drawSettings.perObjectData; + rendererListDesc.stateBlock = data.m_RenderStateBlock; + cmd.DrawRendererList(context.CreateRendererList(rendererListDesc)); +#else context.DrawRenderers(renderingData.cullResults, ref drawSettings, ref filterSettings, ref data.m_RenderStateBlock); - - if(asset.VRSRate != RenderingPlugin.VRSPluginShadingRate.X1_PER_PIXEL) +#endif + + if (asset.VRSRate != RenderingPlugin.VRSPluginShadingRate.X1_PER_PIXEL) { cmd.IssuePluginEventAndData(RenderingPlugin.GetRenderEventAndDataFunc(), (int)RenderingPlugin.NativeRenderingEvent.DisableVRS, IntPtr.Zero); } diff --git a/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/SuperRendering/NatvieHelper/RenderingPlugin.cs b/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/SuperRendering/NatvieHelper/RenderingPlugin.cs index 59fa3de..7238d78 100644 --- a/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/SuperRendering/NatvieHelper/RenderingPlugin.cs +++ b/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/SuperRendering/NatvieHelper/RenderingPlugin.cs @@ -1,5 +1,7 @@ using System; +using System.Collections.Generic; using System.Runtime.InteropServices; + namespace X.Rendering.Feature { public static class RenderingPlugin @@ -64,13 +66,31 @@ namespace X.Rendering.Feature METAL_FX_TEMPORAL_SR, VIVO_TEMPORAL_SR, QCOM_AFME, + XESS13, MAX_CNT }; - public static bool GetFeatureSupport(GraphicsFeature feature) + static Dictionary featureSupports = null; + + public static void InitSupportFeatures() { - return GetFeatureSupport((int)feature); + featureSupports = new(); + UnityEngine.Debug.Log(UnityEngine.SystemInfo.graphicsDeviceType); + for (int i = 0; i < (int)GraphicsFeature.MAX_CNT; ++i) + { + featureSupports[(GraphicsFeature)i] = GetFeatureSupport(i); + UnityEngine.Debug.Log($"feature->{(GraphicsFeature)i}:{featureSupports[(GraphicsFeature)i]}"); + } } + public static bool GetFeatureSupport(GraphicsFeature feature) + { + if (featureSupports != null) + { + return featureSupports[feature]; + } + + return GetFeatureSupport((int)feature); + } } } \ No newline at end of file diff --git a/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/SuperRendering/SR/Scripts/GSR.cs b/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/SuperRendering/SR/Scripts/GSR.cs index 3acb584..c92b9c1 100644 --- a/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/SuperRendering/SR/Scripts/GSR.cs +++ b/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/SuperRendering/SR/Scripts/GSR.cs @@ -36,7 +36,6 @@ namespace X.Rendering.Feature //} } - public override void Create() { gsr1 = new GSRV1(v1settings); diff --git a/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/SuperRendering/SR/Scripts/SR.cs b/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/SuperRendering/SR/Scripts/SR.cs index e2ad6d7..5cad6e7 100644 --- a/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/SuperRendering/SR/Scripts/SR.cs +++ b/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/SuperRendering/SR/Scripts/SR.cs @@ -22,6 +22,11 @@ namespace X.Rendering.Feature DLSS1, DLSS2, DLSS3, + ///

+ /// Intel XeSS 1.3.1 + /// + /// + XESS13, } public enum ERenderScale diff --git a/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/SuperRendering/SRSettings.cs b/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/SuperRendering/SRSettings.cs index fdbe611..2c0fd27 100644 --- a/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/SuperRendering/SRSettings.cs +++ b/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/SuperRendering/SRSettings.cs @@ -23,6 +23,7 @@ namespace UnityEngine.Rendering.Universal var renderer = GetRenderer(this.m_DefaultRendererIndex); foreach (var item in renderer.rendererFeatures) { + if (item is ISuperResolutionFeature isr) { isr.SetSR(superResolution); @@ -58,6 +59,7 @@ namespace UnityEngine.Rendering.Universal protected override void OnValidate() { base.OnValidate(); + RenderingPlugin.InitSupportFeatures(); UpdateSSSettings(); } } diff --git a/Packages/manifest.json b/Packages/manifest.json index dd90cc8..62bf514 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -5,7 +5,7 @@ "com.unity.ide.rider": "3.0.31", "com.unity.ide.visualstudio": "2.0.22", "com.unity.ide.vscode": "1.2.5", - "com.unity.inputsystem": "1.7.0", + "com.unity.inputsystem": "1.11.0", "com.unity.learn.iet-framework": "3.1.3", "com.unity.memoryprofiler": "1.1.1", "com.unity.recorder": "4.0.3", diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index 851a02d..a5eed86 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -1,7 +1,7 @@ { "dependencies": { "com.unity.burst": { - "version": "1.8.16", + "version": "1.8.17", "depth": 1, "source": "registry", "dependencies": { @@ -66,7 +66,7 @@ "url": "https://packages.tuanjie.cn" }, "com.unity.inputsystem": { - "version": "1.7.0", + "version": "1.11.0", "depth": 0, "source": "registry", "dependencies": { diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 8559c88..e9ff1dc 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -266,7 +266,6 @@ PlayerSettings: - {fileID: 0} - {fileID: 0} - {fileID: 0} - - {fileID: 11400000, guid: 9e7be553448fa2546aea5752021cbcf7, type: 2} metroInputSource: 0 wsaTransparentSwapchain: 0 m_HolographicPauseOnTrackingLoss: 1 @@ -770,7 +769,7 @@ PlayerSettings: m_APIs: 0b000000 m_Automatic: 0 - m_BuildTarget: WindowsStandaloneSupport - m_APIs: 15000000 + m_APIs: 120000001500000002000000 m_Automatic: 0 - m_BuildTarget: LinuxStandaloneSupport m_APIs: 15000000 @@ -1172,7 +1171,7 @@ PlayerSettings: hmiPlayerDataPath: hmiForceSRGBBlit: 1 embeddedLinuxEnableGamepadInput: 1 - hmiLogStartupTiming: 0 + logStartupTiming: 0 hmiCpuConfiguration: openHarmonySplashScreen: {fileID: 0} openHarmonySplashScreenScale: 0 diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt index b0b64a9..d9a9dc0 100644 --- a/ProjectSettings/ProjectVersion.txt +++ b/ProjectSettings/ProjectVersion.txt @@ -1,3 +1,3 @@ -m_EditorVersion: 2022.3.38t1 -m_EditorVersionWithRevision: 2022.3.38t1 (2816c3a8c7c3) -m_TuanjieEditorVersion: 1.3.1 +m_EditorVersion: 2022.3.48t1 +m_EditorVersionWithRevision: 2022.3.48t1 (8ad5b9288c6b) +m_TuanjieEditorVersion: 1.3.4 diff --git a/UserSettings/EditorUserSettings.asset b/UserSettings/EditorUserSettings.asset index 5e44265..c3d7d29 100644 --- a/UserSettings/EditorUserSettings.asset +++ b/UserSettings/EditorUserSettings.asset @@ -9,17 +9,17 @@ EditorUserSettings: value: 0257020252075b0b5a0b5b2345715a444f4e402b7a2d22667f7c4b35e7b16769 flags: 0 RecentlyUsedSceneGuid-1: - value: 5a57555407545f0b5e0f5f764277594914161e2b787977692b714e64e4b2363b - flags: 0 - RecentlyUsedSceneGuid-2: value: 01060c075556080e0956597315775b14104e4179282b25662b2c1c31b7b63068 flags: 0 - RecentlyUsedSceneGuid-3: + RecentlyUsedSceneGuid-2: value: 5b00515154055e035459547042705a44154f1e2c2e2e7f677e7d4567e1b9376d flags: 0 - RecentlyUsedSceneGuid-4: + RecentlyUsedSceneGuid-3: value: 57050d5004060d590f56087046700f4445164c7e7a7824312e7c4e6bb0e1376d flags: 0 + RecentlyUsedSceneGuid-4: + value: 5a57555407545f0b5e0f5f764277594914161e2b787977692b714e64e4b2363b + flags: 0 vcSharedLogLevel: value: 0d5e400f0650 flags: 0 diff --git a/UserSettings/Layouts/default-2022.dwlt b/UserSettings/Layouts/default-2022.dwlt index 16bec92..2eeb2b9 100644 --- a/UserSettings/Layouts/default-2022.dwlt +++ b/UserSettings/Layouts/default-2022.dwlt @@ -1,6 +1,30 @@ %YAML 1.1 %TAG !u! tag:yousandi.cn,2023: --- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 12004, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_PixelRect: + serializedVersion: 2 + x: 494 + y: 134 + width: 1551 + height: 1099 + m_ShowMode: 0 + m_Title: Project Settings + m_RootView: {fileID: 4} + m_MinSize: {x: 310, y: 221} + m_MaxSize: {x: 4000, y: 4021} + m_Maximized: 0 +--- !u!114 &2 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -20,11 +44,115 @@ MonoBehaviour: height: 1331 m_ShowMode: 4 m_Title: Console - m_RootView: {fileID: 8} - m_MinSize: {x: 875, y: 300} + m_RootView: {fileID: 13} + m_MinSize: {x: 875, y: 321} m_MaxSize: {x: 10000, y: 10000} m_Maximized: 0 ---- !u!114 &2 +--- !u!114 &3 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} + m_Name: ProjectSettingsWindow + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 1551 + height: 1099 + m_MinSize: {x: 310, y: 221} + m_MaxSize: {x: 4000, y: 4021} + m_ActualView: {fileID: 17} + m_Panes: + - {fileID: 17} + m_Selected: 0 + m_LastSelected: 0 +--- !u!114 &4 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: + - {fileID: 3} + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 1551 + height: 1099 + m_MinSize: {x: 310, y: 221} + m_MaxSize: {x: 4000, y: 4021} + vertical: 0 + controlID: 453 + draggingID: 0 +--- !u!114 &5 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} + m_Name: GameView + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 439 + y: 0 + width: 1662 + height: 759 + m_MinSize: {x: 202, y: 221} + m_MaxSize: {x: 4002, y: 4021} + m_ActualView: {fileID: 22} + m_Panes: + - {fileID: 22} + - {fileID: 18} + m_Selected: 0 + m_LastSelected: 1 +--- !u!114 &6 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: + - {fileID: 11} + - {fileID: 5} + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 2101 + height: 759 + m_MinSize: {x: 200, y: 50} + m_MaxSize: {x: 16192, y: 8096} + vertical: 0 + controlID: 40 + draggingID: 0 +--- !u!114 &7 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -45,12 +173,12 @@ MonoBehaviour: height: 522 m_MinSize: {x: 102, y: 121} m_MaxSize: {x: 4002, y: 4021} - m_ActualView: {fileID: 19} + m_ActualView: {fileID: 23} m_Panes: - - {fileID: 19} + - {fileID: 23} m_Selected: 0 m_LastSelected: 0 ---- !u!114 &3 +--- !u!114 &8 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -63,8 +191,8 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Children: + - {fileID: 12} - {fileID: 7} - - {fileID: 2} m_Position: serializedVersion: 2 x: 0 @@ -74,9 +202,9 @@ MonoBehaviour: m_MinSize: {x: 200, y: 50} m_MaxSize: {x: 16192, y: 8096} vertical: 0 - controlID: 68 + controlID: 130 draggingID: 0 ---- !u!114 &4 +--- !u!114 &9 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -89,8 +217,8 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Children: - - {fileID: 11} - - {fileID: 5} + - {fileID: 16} + - {fileID: 10} m_Position: serializedVersion: 2 x: 0 @@ -100,9 +228,9 @@ MonoBehaviour: m_MinSize: {x: 300, y: 100} m_MaxSize: {x: 24288, y: 16192} vertical: 0 - controlID: 171 + controlID: 38 draggingID: 0 ---- !u!114 &5 +--- !u!114 &10 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -123,12 +251,12 @@ MonoBehaviour: height: 1281 m_MinSize: {x: 276, y: 71} m_MaxSize: {x: 4001, y: 4021} - m_ActualView: {fileID: 15} + m_ActualView: {fileID: 20} m_Panes: - - {fileID: 15} + - {fileID: 20} m_Selected: 0 m_LastSelected: 0 ---- !u!114 &6 +--- !u!114 &11 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -138,23 +266,23 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 1 m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} - m_Name: + m_Name: SceneHierarchyWindow m_EditorClassIdentifier: m_Children: [] m_Position: serializedVersion: 2 x: 0 y: 0 - width: 516 + width: 439 height: 759 m_MinSize: {x: 201, y: 221} m_MaxSize: {x: 4001, y: 4021} - m_ActualView: {fileID: 16} + m_ActualView: {fileID: 21} m_Panes: - - {fileID: 16} + - {fileID: 21} m_Selected: 0 m_LastSelected: 0 ---- !u!114 &7 +--- !u!114 &12 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -175,12 +303,12 @@ MonoBehaviour: height: 522 m_MinSize: {x: 231, y: 271} m_MaxSize: {x: 10001, y: 10021} - m_ActualView: {fileID: 14} + m_ActualView: {fileID: 19} m_Panes: - - {fileID: 14} + - {fileID: 19} m_Selected: 0 m_LastSelected: 0 ---- !u!114 &8 +--- !u!114 &13 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -193,9 +321,9 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Children: + - {fileID: 14} - {fileID: 9} - - {fileID: 4} - - {fileID: 10} + - {fileID: 15} m_Position: serializedVersion: 2 x: 0 @@ -208,7 +336,7 @@ MonoBehaviour: m_TopViewHeight: 30 m_UseBottomView: 1 m_BottomViewHeight: 20 ---- !u!114 &9 +--- !u!114 &14 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -230,7 +358,7 @@ MonoBehaviour: m_MinSize: {x: 0, y: 0} m_MaxSize: {x: 0, y: 0} m_LastLoadedLayoutName: ---- !u!114 &10 +--- !u!114 &15 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -251,33 +379,7 @@ MonoBehaviour: height: 20 m_MinSize: {x: 0, y: 0} m_MaxSize: {x: 0, y: 0} ---- !u!114 &11 -MonoBehaviour: - m_ObjectHideFlags: 52 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 1 - m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0} - m_Name: - m_EditorClassIdentifier: - m_Children: - - {fileID: 12} - - {fileID: 3} - m_Position: - serializedVersion: 2 - x: 0 - y: 0 - width: 2101 - height: 1281 - m_MinSize: {x: 200, y: 100} - m_MaxSize: {x: 16192, y: 16192} - vertical: 1 - controlID: 40 - draggingID: 0 ---- !u!114 &12 +--- !u!114 &16 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -291,301 +393,18 @@ MonoBehaviour: m_EditorClassIdentifier: m_Children: - {fileID: 6} - - {fileID: 13} + - {fileID: 8} m_Position: serializedVersion: 2 x: 0 y: 0 width: 2101 - height: 759 - m_MinSize: {x: 200, y: 50} - m_MaxSize: {x: 16192, y: 8096} - vertical: 0 - controlID: 41 + height: 1281 + m_MinSize: {x: 200, y: 100} + m_MaxSize: {x: 16192, y: 16192} + vertical: 1 + controlID: 39 draggingID: 0 ---- !u!114 &13 -MonoBehaviour: - m_ObjectHideFlags: 52 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 1 - m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} - m_Name: GameView - m_EditorClassIdentifier: - m_Children: [] - m_Position: - serializedVersion: 2 - x: 516 - y: 0 - width: 1585 - height: 759 - m_MinSize: {x: 202, y: 221} - m_MaxSize: {x: 4002, y: 4021} - m_ActualView: {fileID: 18} - m_Panes: - - {fileID: 17} - - {fileID: 18} - m_Selected: 1 - m_LastSelected: 0 ---- !u!114 &14 -MonoBehaviour: - m_ObjectHideFlags: 52 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 1 - m_Script: {fileID: 12014, guid: 0000000000000000e000000000000000, type: 0} - m_Name: - m_EditorClassIdentifier: - m_MinSize: {x: 230, y: 250} - m_MaxSize: {x: 10000, y: 10000} - m_TitleContent: - m_Text: Project - m_Image: {fileID: -5467254957812901981, guid: 0000000000000000d000000000000000, type: 0} - m_Tooltip: - m_Pos: - serializedVersion: 2 - x: 9 - y: 841 - width: 1399 - height: 501 - m_SerializedDataModeController: - m_DataMode: 0 - m_PreferredDataMode: 0 - m_SupportedDataModes: - isAutomatic: 1 - m_ViewDataDictionary: {fileID: 0} - m_OverlayCanvas: - m_LastAppliedPresetName: Default - m_SaveData: [] - m_OverlaysVisible: 1 - m_SearchFilter: - m_NameFilter: - m_ClassNames: [] - m_AssetLabels: [] - m_AssetBundleNames: [] - m_ReferencingInstanceIDs: - m_SceneHandles: - m_ShowAllHits: 0 - m_SkipHidden: 0 - m_SearchArea: 1 - m_Folders: - - Assets/Settings/Mobile - m_Globs: [] - m_OriginalText: - m_ImportLogFlags: 0 - m_FilterByTypeIntersection: 0 - m_ViewMode: 1 - m_StartGridSize: 16 - m_LastFolders: - - Assets/Settings/Mobile - m_LastFoldersGridSize: 16 - m_LastProjectPath: G:\TJURP - m_LockTracker: - m_IsLocked: 0 - m_FolderTreeState: - scrollPos: {x: 0, y: 40} - m_SelectedIDs: a6800000 - m_LastClickedID: 32934 - m_ExpandedIDs: 00000000f07d0000f27d0000f47d0000f67d0000f87d0000fa7d0000fc7d0000fe7d0000007e0000027e0000047e0000067e0000087e00000a7e000000ca9a3bffffff7f - m_RenameOverlay: - m_UserAcceptedRename: 0 - m_Name: - m_OriginalName: - m_EditFieldRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 0 - height: 0 - m_UserData: 0 - m_IsWaitingForDelay: 0 - m_IsRenaming: 0 - m_OriginalEventType: 11 - m_IsRenamingFilename: 1 - m_ClientGUIView: {fileID: 7} - m_SearchString: - m_CreateAssetUtility: - m_EndAction: {fileID: 0} - m_InstanceID: 0 - m_Path: - m_Icon: {fileID: 0} - m_ResourceFile: - m_AssetTreeState: - scrollPos: {x: 0, y: 0} - m_SelectedIDs: - m_LastClickedID: 0 - m_ExpandedIDs: 00000000f07d0000f27d0000f47d0000f67d0000f87d0000fa7d0000fc7d0000fe7d0000007e0000027e0000047e0000067e0000087e00000a7e0000 - m_RenameOverlay: - m_UserAcceptedRename: 0 - m_Name: - m_OriginalName: - m_EditFieldRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 0 - height: 0 - m_UserData: 0 - m_IsWaitingForDelay: 0 - m_IsRenaming: 0 - m_OriginalEventType: 11 - m_IsRenamingFilename: 1 - m_ClientGUIView: {fileID: 0} - m_SearchString: - m_CreateAssetUtility: - m_EndAction: {fileID: 0} - m_InstanceID: 0 - m_Path: - m_Icon: {fileID: 0} - m_ResourceFile: - m_ListAreaState: - m_SelectedInstanceIDs: - m_LastClickedInstanceID: 0 - m_HadKeyboardFocusLastEvent: 0 - m_ExpandedInstanceIDs: c623000000000000 - m_RenameOverlay: - m_UserAcceptedRename: 0 - m_Name: - m_OriginalName: - m_EditFieldRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 0 - height: 0 - m_UserData: 0 - m_IsWaitingForDelay: 0 - m_IsRenaming: 0 - m_OriginalEventType: 11 - m_IsRenamingFilename: 1 - m_ClientGUIView: {fileID: 7} - m_CreateAssetUtility: - m_EndAction: {fileID: 0} - m_InstanceID: 0 - m_Path: - m_Icon: {fileID: 0} - m_ResourceFile: - m_NewAssetIndexInList: -1 - m_ScrollPosition: {x: 0, y: 0} - m_GridSize: 16 - m_SkipHiddenPackages: 0 - m_DirectoriesAreaWidth: 207 ---- !u!114 &15 -MonoBehaviour: - m_ObjectHideFlags: 52 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 1 - m_Script: {fileID: 12019, guid: 0000000000000000e000000000000000, type: 0} - m_Name: - m_EditorClassIdentifier: - m_MinSize: {x: 275, y: 50} - m_MaxSize: {x: 4000, y: 4000} - m_TitleContent: - m_Text: Inspector - m_Image: {fileID: -2667387946076563598, guid: 0000000000000000d000000000000000, type: 0} - m_Tooltip: - m_Pos: - serializedVersion: 2 - x: 2110 - y: 82 - width: 440 - height: 1260 - m_SerializedDataModeController: - m_DataMode: 0 - m_PreferredDataMode: 0 - m_SupportedDataModes: - isAutomatic: 1 - m_ViewDataDictionary: {fileID: 0} - m_OverlayCanvas: - m_LastAppliedPresetName: Default - m_SaveData: [] - m_OverlaysVisible: 1 - m_ObjectsLockedBeforeSerialization: [] - m_InstanceIDsLockedBeforeSerialization: - m_PreviewResizer: - m_CachedPref: 482 - m_ControlHash: -371814159 - m_PrefName: Preview_InspectorPreview - m_LastInspectedObjectInstanceID: -1 - m_LastVerticalScrollValue: 0 - m_GlobalObjectId: - m_InspectorMode: 0 - m_LockTracker: - m_IsLocked: 0 - m_PreviewWindow: {fileID: 0} ---- !u!114 &16 -MonoBehaviour: - m_ObjectHideFlags: 52 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 1 - m_Script: {fileID: 12061, guid: 0000000000000000e000000000000000, type: 0} - m_Name: - m_EditorClassIdentifier: - m_MinSize: {x: 200, y: 200} - m_MaxSize: {x: 4000, y: 4000} - m_TitleContent: - m_Text: Hierarchy - m_Image: {fileID: 7966133145522015247, guid: 0000000000000000d000000000000000, type: 0} - m_Tooltip: - m_Pos: - serializedVersion: 2 - x: 9 - y: 82 - width: 515 - height: 738 - m_SerializedDataModeController: - m_DataMode: 0 - m_PreferredDataMode: 0 - m_SupportedDataModes: - isAutomatic: 1 - m_ViewDataDictionary: {fileID: 0} - m_OverlayCanvas: - m_LastAppliedPresetName: Default - m_SaveData: [] - m_OverlaysVisible: 1 - m_SceneHierarchy: - m_TreeViewState: - scrollPos: {x: 0, y: 0} - m_SelectedIDs: - m_LastClickedID: 0 - m_ExpandedIDs: 3afaffff - m_RenameOverlay: - m_UserAcceptedRename: 0 - m_Name: - m_OriginalName: - m_EditFieldRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 0 - height: 0 - m_UserData: 0 - m_IsWaitingForDelay: 0 - m_IsRenaming: 0 - m_OriginalEventType: 11 - m_IsRenamingFilename: 0 - m_ClientGUIView: {fileID: 6} - m_SearchString: - m_ExpandedScenes: [] - m_CurrenRootInstanceID: 0 - m_LockTracker: - m_IsLocked: 0 - m_CurrentSortingName: TransformSorting - m_WindowGUID: 4c969a2b90040154d917609493e03593 --- !u!114 &17 MonoBehaviour: m_ObjectHideFlags: 52 @@ -594,11 +413,72 @@ MonoBehaviour: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 0} m_Enabled: 1 - m_EditorHideFlags: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 13854, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 310, y: 200} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Project Settings + m_Image: {fileID: -5712115415447495865, guid: 0000000000000000d000000000000000, type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 494 + y: 134 + width: 1551 + height: 1078 + m_SerializedDataModeController: + m_DataMode: 0 + m_PreferredDataMode: 0 + m_SupportedDataModes: + isAutomatic: 1 + m_ViewDataDictionary: {fileID: 0} + m_OverlayCanvas: + m_LastAppliedPresetName: Default + m_SaveData: [] + m_OverlaysVisible: 1 + m_PosLeft: {x: 0, y: 0} + m_PosRight: {x: 0, y: 0} + m_Scope: 1 + m_SplitterFlex: 0.2 + m_SearchText: + m_TreeViewState: + scrollPos: {x: 0, y: 0} + m_SelectedIDs: 4dcf9b58 + m_LastClickedID: 1486606157 + m_ExpandedIDs: 53336be2000000007f0eae07 + m_RenameOverlay: + m_UserAcceptedRename: 0 + m_Name: + m_OriginalName: + m_EditFieldRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + m_UserData: 0 + m_IsWaitingForDelay: 0 + m_IsRenaming: 0 + m_OriginalEventType: 11 + m_IsRenamingFilename: 0 + m_ClientGUIView: {fileID: 0} + m_SearchString: +--- !u!114 &18 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 m_Script: {fileID: 12013, guid: 0000000000000000e000000000000000, type: 0} m_Name: m_EditorClassIdentifier: - m_MinSize: {x: 200, y: 200} + m_MinSize: {x: 100, y: 100} m_MaxSize: {x: 4000, y: 4000} m_TitleContent: m_Text: Scene @@ -606,9 +486,9 @@ MonoBehaviour: m_Tooltip: m_Pos: serializedVersion: 2 - x: 525 + x: 448 y: 82 - width: 1583 + width: 1660 height: 738 m_SerializedDataModeController: m_DataMode: 0 @@ -624,8 +504,8 @@ MonoBehaviour: floating: 0 collapsed: 0 displayed: 1 - snapOffset: {x: -171, y: -26} - snapOffsetDelta: {x: 0, y: 0} + snapOffset: {x: 0, y: 0} + snapOffsetDelta: {x: -171, y: -26} snapCorner: 3 id: Tool Settings index: 0 @@ -879,55 +759,16 @@ MonoBehaviour: layout: 4 size: {x: 0, y: 0} sizeOverriden: 0 - - dockPosition: 0 - containerId: overlay-toolbar__left - floating: 0 - collapsed: 0 - displayed: 0 - snapOffset: {x: 0, y: 0} - snapOffsetDelta: {x: 0, y: 0} - snapCorner: 0 - id: Scene View/Visual Effect Model - index: 0 - layout: 0 - size: {x: 0, y: 0} - sizeOverriden: 0 - - dockPosition: 0 - containerId: overlay-toolbar__left - floating: 0 - collapsed: 0 - displayed: 0 - snapOffset: {x: 0, y: 0} - snapOffsetDelta: {x: 0, y: 0} - snapCorner: 0 - id: Scene View/Visual Effect - index: 1 - layout: 0 - size: {x: 0, y: 0} - sizeOverriden: 0 - - dockPosition: 0 - containerId: overlay-toolbar__left - floating: 0 - collapsed: 0 - displayed: 0 - snapOffset: {x: 0, y: 0} - snapOffsetDelta: {x: 0, y: 0} - snapCorner: 0 - id: Scene View/Visual Effect Event Tester - index: 2 - layout: 0 - size: {x: 0, y: 0} - sizeOverriden: 0 - dockPosition: 1 - containerId: overlay-toolbar__top + containerId: overlay-container--right floating: 0 - collapsed: 1 + collapsed: 0 displayed: 1 - snapOffset: {x: -209.33337, y: -245.33331} + snapOffset: {x: 48, y: 48} snapOffsetDelta: {x: 0, y: 0} - snapCorner: 3 - id: AINavigationOverlay - index: 2 + snapCorner: 0 + id: UnityEditor.SceneViewCameraOverlay + index: 10 layout: 4 size: {x: 0, y: 0} sizeOverriden: 0 @@ -957,19 +798,6 @@ MonoBehaviour: layout: 4 size: {x: 0, y: 0} sizeOverriden: 0 - - dockPosition: 1 - containerId: overlay-container--right - floating: 0 - collapsed: 0 - displayed: 0 - snapOffset: {x: 48, y: 48} - snapOffsetDelta: {x: 0, y: 0} - snapCorner: 0 - id: Cinemachine Tool Settings - index: 9 - layout: 4 - size: {x: 0, y: 0} - sizeOverriden: 0 - dockPosition: 1 containerId: overlay-container--right floating: 0 @@ -983,33 +811,20 @@ MonoBehaviour: layout: 4 size: {x: 0, y: 0} sizeOverriden: 0 - - dockPosition: 1 - containerId: overlay-container--right - floating: 0 - collapsed: 0 - displayed: 1 - snapOffset: {x: 48, y: 48} - snapOffsetDelta: {x: 0, y: 0} - snapCorner: 0 - id: UnityEditor.SceneViewCameraOverlay - index: 10 - layout: 4 - size: {x: 0, y: 0} - sizeOverriden: 0 m_OverlaysVisible: 1 - m_WindowGUID: cc27987af1a868c49b0894db9c0f5429 + m_WindowGUID: ae7e36a06047c3147af1082d5aace6a8 m_Gizmos: 1 m_OverrideSceneCullingMask: 6917529027641081856 m_SceneIsLit: 1 m_SceneLighting: 1 - m_2DMode: 1 + m_2DMode: 0 m_isRotationLocked: 0 m_PlayAudio: 0 m_AudioPlay: 0 m_Position: - m_Target: {x: 741.2015, y: 1097.4281, z: 82.08899} + m_Target: {x: -12.694475, y: -1.2633355, z: -116.92392} speed: 2 - m_Value: {x: 741.2015, y: 1097.4281, z: 82.08899} + m_Value: {x: -12.694475, y: -1.2633355, z: -116.92392} m_RenderMode: 0 m_CameraMode: drawMode: 0 @@ -1018,7 +833,7 @@ MonoBehaviour: m_ValidateTrueMetals: 0 m_DoValidateTrueMetals: 0 m_SceneViewState: - m_AlwaysRefresh: 1 + m_AlwaysRefresh: 0 showFog: 1 showSkybox: 1 showFlares: 1 @@ -1036,14 +851,6 @@ MonoBehaviour: m_Pivot: {x: 0, y: 0, z: 0} m_Size: {x: 0, y: 0} yGrid: - m_Fade: - m_Target: 0 - speed: 2 - m_Value: 0 - m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.4} - m_Pivot: {x: 0, y: 0, z: 0} - m_Size: {x: 1, y: 1} - zGrid: m_Fade: m_Target: 1 speed: 2 @@ -1051,25 +858,33 @@ MonoBehaviour: m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.4} m_Pivot: {x: 0, y: 0, z: 0} m_Size: {x: 1, y: 1} + zGrid: + m_Fade: + m_Target: 0 + speed: 2 + m_Value: 0 + m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.4} + m_Pivot: {x: 0, y: 0, z: 0} + m_Size: {x: 0, y: 0} m_ShowGrid: 1 m_GridAxis: 1 m_gridOpacity: 0.5 m_Rotation: - m_Target: {x: 0, y: 0, z: 0, w: 1} + m_Target: {x: -0.018844485, y: 0.9119891, z: -0.40760815, w: -0.042162955} speed: 2 - m_Value: {x: 0, y: 0, z: 0, w: 1} + m_Value: {x: -0.018844472, y: 0.91198844, z: -0.40760785, w: -0.042162925} m_Size: - m_Target: 890.40814 + m_Target: 10 speed: 2 - m_Value: 890.40814 + m_Value: 10 m_Ortho: - m_Target: 1 + m_Target: 0 speed: 2 - m_Value: 1 + m_Value: 0 m_CameraSettings: m_Speed: 1 m_SpeedNormalized: 0.5 - m_SpeedMin: 0.001 + m_SpeedMin: 0.01 m_SpeedMax: 2 m_EasingEnabled: 1 m_EasingDuration: 0.4 @@ -1081,14 +896,270 @@ MonoBehaviour: m_OcclusionCulling: 0 m_EnableGDRP: 1 m_BackfaceCulling: 0 - m_LastSceneViewRotation: {x: -0.08717229, y: 0.89959055, z: -0.21045254, w: -0.3726226} + m_LastSceneViewRotation: {x: 0, y: 0, z: 0, w: 0} m_LastSceneViewOrtho: 0 m_ReplacementShader: {fileID: 0} m_ReplacementString: m_SceneVisActive: 1 m_LastLockedObject: {fileID: 0} m_ViewIsLockedToObject: 0 ---- !u!114 &18 +--- !u!114 &19 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12014, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 230, y: 250} + m_MaxSize: {x: 10000, y: 10000} + m_TitleContent: + m_Text: Project + m_Image: {fileID: -5467254957812901981, guid: 0000000000000000d000000000000000, type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 9 + y: 841 + width: 1399 + height: 501 + m_SerializedDataModeController: + m_DataMode: 0 + m_PreferredDataMode: 0 + m_SupportedDataModes: + isAutomatic: 1 + m_ViewDataDictionary: {fileID: 0} + m_OverlayCanvas: + m_LastAppliedPresetName: Default + m_SaveData: [] + m_OverlaysVisible: 1 + m_SearchFilter: + m_NameFilter: + m_ClassNames: [] + m_AssetLabels: [] + m_AssetBundleNames: [] + m_ReferencingInstanceIDs: + m_SceneHandles: + m_ShowAllHits: 0 + m_SkipHidden: 0 + m_SearchArea: 1 + m_Folders: + - Assets/Settings/Mobile + m_Globs: [] + m_OriginalText: + m_ImportLogFlags: 0 + m_FilterByTypeIntersection: 0 + m_ViewMode: 1 + m_StartGridSize: 16 + m_LastFolders: + - Assets/Settings/Mobile + m_LastFoldersGridSize: 16 + m_LastProjectPath: G:\TJURP + m_LockTracker: + m_IsLocked: 0 + m_FolderTreeState: + scrollPos: {x: 0, y: 0} + m_SelectedIDs: 72bb0000 + m_LastClickedID: 47986 + m_ExpandedIDs: 0000000042b8000044b8000046b8000048b800004ab800004cb800004eb8000050b8000052b8000054b8000056b8000058b800005ab800005cb800005eb8000060b8000000ca9a3bffffff7f + m_RenameOverlay: + m_UserAcceptedRename: 0 + m_Name: + m_OriginalName: + m_EditFieldRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + m_UserData: 0 + m_IsWaitingForDelay: 0 + m_IsRenaming: 0 + m_OriginalEventType: 11 + m_IsRenamingFilename: 1 + m_ClientGUIView: {fileID: 12} + m_SearchString: + m_CreateAssetUtility: + m_EndAction: {fileID: 0} + m_InstanceID: 0 + m_Path: + m_Icon: {fileID: 0} + m_ResourceFile: + m_AssetTreeState: + scrollPos: {x: 0, y: 0} + m_SelectedIDs: + m_LastClickedID: 0 + m_ExpandedIDs: 0000000042b8000044b8000046b8000048b800004ab800004cb800004eb8000050b8000052b8000054b8000056b8000058b800005ab800005cb800005eb8000060b80000 + m_RenameOverlay: + m_UserAcceptedRename: 0 + m_Name: + m_OriginalName: + m_EditFieldRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + m_UserData: 0 + m_IsWaitingForDelay: 0 + m_IsRenaming: 0 + m_OriginalEventType: 11 + m_IsRenamingFilename: 1 + m_ClientGUIView: {fileID: 0} + m_SearchString: + m_CreateAssetUtility: + m_EndAction: {fileID: 0} + m_InstanceID: 0 + m_Path: + m_Icon: {fileID: 0} + m_ResourceFile: + m_ListAreaState: + m_SelectedInstanceIDs: + m_LastClickedInstanceID: 0 + m_HadKeyboardFocusLastEvent: 1 + m_ExpandedInstanceIDs: c6230000000000005aca0000 + m_RenameOverlay: + m_UserAcceptedRename: 0 + m_Name: + m_OriginalName: + m_EditFieldRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + m_UserData: 0 + m_IsWaitingForDelay: 0 + m_IsRenaming: 0 + m_OriginalEventType: 11 + m_IsRenamingFilename: 1 + m_ClientGUIView: {fileID: 12} + m_CreateAssetUtility: + m_EndAction: {fileID: 0} + m_InstanceID: 0 + m_Path: + m_Icon: {fileID: 0} + m_ResourceFile: + m_NewAssetIndexInList: -1 + m_ScrollPosition: {x: 0, y: 0} + m_GridSize: 16 + m_SkipHiddenPackages: 0 + m_DirectoriesAreaWidth: 207 +--- !u!114 &20 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12019, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 275, y: 50} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Inspector + m_Image: {fileID: -2667387946076563598, guid: 0000000000000000d000000000000000, type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 2110 + y: 82 + width: 440 + height: 1260 + m_SerializedDataModeController: + m_DataMode: 0 + m_PreferredDataMode: 0 + m_SupportedDataModes: + isAutomatic: 1 + m_ViewDataDictionary: {fileID: 0} + m_OverlayCanvas: + m_LastAppliedPresetName: Default + m_SaveData: [] + m_OverlaysVisible: 1 + m_ObjectsLockedBeforeSerialization: [] + m_InstanceIDsLockedBeforeSerialization: + m_PreviewResizer: + m_CachedPref: 482 + m_ControlHash: -371814159 + m_PrefName: Preview_InspectorPreview + m_LastInspectedObjectInstanceID: -1 + m_LastVerticalScrollValue: 0 + m_GlobalObjectId: + m_InspectorMode: 0 + m_LockTracker: + m_IsLocked: 0 + m_PreviewWindow: {fileID: 0} +--- !u!114 &21 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12061, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 200, y: 200} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Hierarchy + m_Image: {fileID: 7966133145522015247, guid: 0000000000000000d000000000000000, type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 9 + y: 82 + width: 438 + height: 738 + m_SerializedDataModeController: + m_DataMode: 0 + m_PreferredDataMode: 0 + m_SupportedDataModes: + isAutomatic: 1 + m_ViewDataDictionary: {fileID: 0} + m_OverlayCanvas: + m_LastAppliedPresetName: Default + m_SaveData: [] + m_OverlaysVisible: 1 + m_SceneHierarchy: + m_TreeViewState: + scrollPos: {x: 0, y: 0} + m_SelectedIDs: 48030000 + m_LastClickedID: 0 + m_ExpandedIDs: 3afaffff + m_RenameOverlay: + m_UserAcceptedRename: 0 + m_Name: + m_OriginalName: + m_EditFieldRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + m_UserData: 0 + m_IsWaitingForDelay: 0 + m_IsRenaming: 0 + m_OriginalEventType: 11 + m_IsRenamingFilename: 0 + m_ClientGUIView: {fileID: 11} + m_SearchString: + m_ExpandedScenes: [] + m_CurrenRootInstanceID: 0 + m_LockTracker: + m_IsLocked: 0 + m_CurrentSortingName: TransformSorting + m_WindowGUID: 4c969a2b90040154d917609493e03593 +--- !u!114 &22 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -1108,9 +1179,9 @@ MonoBehaviour: m_Tooltip: m_Pos: serializedVersion: 2 - x: 525 + x: 448 y: 82 - width: 1583 + width: 1660 height: 738 m_SerializedDataModeController: m_DataMode: 0 @@ -1128,7 +1199,7 @@ MonoBehaviour: m_ShowGizmos: 0 m_TargetDisplay: 0 m_ClearColor: {r: 0, g: 0, b: 0, a: 0} - m_TargetSize: {x: 2560, y: 1440} + m_TargetSize: {x: 1920, y: 1080} m_TextureFilterMode: 0 m_TextureHideFlags: 61 m_RenderIMGUI: 1 @@ -1137,16 +1208,16 @@ MonoBehaviour: m_VSyncEnabled: 0 m_Gizmos: 0 m_Stats: 1 - m_SelectedSizes: 0000000000000000000000000a000000000000000000000000000000000000000000000000000000 + m_SelectedSizes: 00000000000000000000000006000000000000000000000000000000000000000000000000000000 m_ZoomArea: m_HRangeLocked: 0 m_VRangeLocked: 0 hZoomLockedByDefault: 0 vZoomLockedByDefault: 0 - m_HBaseRangeMin: -1280 - m_HBaseRangeMax: 1280 - m_VBaseRangeMin: -720 - m_VBaseRangeMax: 720 + m_HBaseRangeMin: -960 + m_HBaseRangeMax: 960 + m_VBaseRangeMin: -540 + m_VBaseRangeMax: 540 m_HAllowExceedBaseRangeMin: 1 m_HAllowExceedBaseRangeMax: 1 m_VAllowExceedBaseRangeMin: 1 @@ -1164,29 +1235,29 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 21 - width: 1583 + width: 1660 height: 717 - m_Scale: {x: 0.49791667, y: 0.49791667} - m_Translation: {x: 791.5, y: 358.5} + m_Scale: {x: 0.6638889, y: 0.6638889} + m_Translation: {x: 830, y: 358.5} m_MarginLeft: 0 m_MarginRight: 0 m_MarginTop: 0 m_MarginBottom: 0 m_LastShownAreaInsideMargins: serializedVersion: 2 - x: -1589.6234 - y: -720 - width: 3179.2468 - height: 1440 + x: -1250.2092 + y: -540 + width: 2500.4185 + height: 1080 m_MinimalGUI: 1 - m_defaultScale: 0.49791667 - m_LastWindowPixelSize: {x: 1583, y: 738} + m_defaultScale: 0.6638889 + m_LastWindowPixelSize: {x: 1660, y: 738} m_ClearInEditMode: 1 m_NoCameraWarning: 1 m_LowResolutionForAspectRatios: 00000001000000000000 m_XRRenderMode: 0 m_RenderTexture: {fileID: 0} ---- !u!114 &19 +--- !u!114 &23 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0}