From 694524c7bdcea2be2ba0d526ffed7132639e72d8 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 22 May 2019 16:09:18 +0100 Subject: [PATCH] Allow querying the shader encoding supported by custom shaders * This is distinct from target shaders in the remote proxy case - custom shaders are built locally. --- qrenderdoc/Code/CaptureContext.cpp | 1 + qrenderdoc/Code/CaptureContext.h | 3 ++- qrenderdoc/Code/Interface/QRDInterface.h | 11 ++++++++++- qrenderdoc/Windows/PythonShell.cpp | 4 ++++ renderdoc/api/replay/renderdoc_replay.h | 15 +++++++++++++++ renderdoc/core/image_viewer.cpp | 4 ++++ renderdoc/core/replay_proxy.h | 8 ++++++++ renderdoc/driver/d3d11/d3d11_replay.h | 4 ++++ renderdoc/driver/d3d12/d3d12_replay.h | 4 ++++ renderdoc/driver/gl/gl_replay.h | 1 + renderdoc/driver/vulkan/vk_replay.h | 4 ++++ renderdoc/replay/replay_controller.cpp | 7 +++++++ renderdoc/replay/replay_controller.h | 1 + renderdoc/replay/replay_driver.h | 1 + 14 files changed, 66 insertions(+), 2 deletions(-) diff --git a/qrenderdoc/Code/CaptureContext.cpp b/qrenderdoc/Code/CaptureContext.cpp index b39c4cc3a..3e1ae351c 100644 --- a/qrenderdoc/Code/CaptureContext.cpp +++ b/qrenderdoc/Code/CaptureContext.cpp @@ -820,6 +820,7 @@ void CaptureContext::LoadCaptureThreaded(const QString &captureFile, const QStri m_APIProps = r->GetAPIProperties(); + m_CustomEncodings = r->GetCustomShaderEncodings(); m_TargetEncodings = r->GetTargetShaderEncodings(); m_PostloadProgress = 0.2f; diff --git a/qrenderdoc/Code/CaptureContext.h b/qrenderdoc/Code/CaptureContext.h index d5fdf3c01..2ef50fdbd 100644 --- a/qrenderdoc/Code/CaptureContext.h +++ b/qrenderdoc/Code/CaptureContext.h @@ -141,6 +141,7 @@ public: CaptureModifications GetCaptureModifications() override { return m_CaptureMods; } const FrameDescription &FrameInfo() override { return m_FrameInfo; } const APIProperties &APIProps() override { return m_APIProps; } + rdcarray CustomShaderEncodings() override { return m_CustomEncodings; } rdcarray TargetShaderEncodings() override { return m_TargetEncodings; } uint32_t CurSelectedEvent() override { return m_SelectedEventID; } uint32_t CurEvent() override { return m_EventID; } @@ -332,7 +333,7 @@ private: const rdcarray *m_Drawcalls; rdcarray m_EmptyDraws; - rdcarray m_TargetEncodings; + rdcarray m_CustomEncodings, m_TargetEncodings; APIProperties m_APIProps; FrameDescription m_FrameInfo; const DrawcallDescription *m_FirstDrawcall = NULL; diff --git a/qrenderdoc/Code/Interface/QRDInterface.h b/qrenderdoc/Code/Interface/QRDInterface.h index d453ef043..9bd562446 100644 --- a/qrenderdoc/Code/Interface/QRDInterface.h +++ b/qrenderdoc/Code/Interface/QRDInterface.h @@ -532,7 +532,7 @@ DECLARE_REFLECTION_STRUCT(IPythonShell); DOCUMENT(R"(A shader window used for viewing, editing, or debugging. -.. function:: SaveCallback(context, viewer, files) +.. function:: SaveCallback(context, viewer, encoding, flags, entry, compiled) Not a member function - the signature for any ``SaveCallback`` callbacks. @@ -1228,6 +1228,15 @@ building target shaders for the currently loaded capture. See )"); virtual rdcarray TargetShaderEncodings() = 0; + DOCUMENT(R"(Retrieve the list of :class:`~renderdoc.ShaderEncoding` that are available for +building custom shaders for the currently loaded capture. See +:meth:`~renderdoc.ReplayController.BuildCustomShader`. + +:return: The available encodings. +:rtype: ``list`` of :class:`~renderdoc.ShaderEncoding` +)"); + virtual rdcarray CustomShaderEncodings() = 0; + DOCUMENT(R"(Retrieve the currently selected :data:`eventId `. In most cases, prefer using :meth:`CurEvent`. See :meth:`CaptureViewer.OnSelectedEventChanged` for more diff --git a/qrenderdoc/Windows/PythonShell.cpp b/qrenderdoc/Windows/PythonShell.cpp index 0e302c5ae..f551fb148 100644 --- a/qrenderdoc/Windows/PythonShell.cpp +++ b/qrenderdoc/Windows/PythonShell.cpp @@ -69,6 +69,10 @@ struct CaptureContextInvoker : ICaptureContext { return m_Ctx.TargetShaderEncodings(); } + virtual rdcarray CustomShaderEncodings() override + { + return m_Ctx.CustomShaderEncodings(); + } virtual uint32_t CurSelectedEvent() override { return m_Ctx.CurSelectedEvent(); } virtual uint32_t CurEvent() override { return m_Ctx.CurEvent(); } virtual const DrawcallDescription *CurSelectedDrawcall() override diff --git a/renderdoc/api/replay/renderdoc_replay.h b/renderdoc/api/replay/renderdoc_replay.h index bb3db9d61..e640d7b3d 100644 --- a/renderdoc/api/replay/renderdoc_replay.h +++ b/renderdoc/api/replay/renderdoc_replay.h @@ -1039,6 +1039,21 @@ of the compile process or using alternate/updated tools. )"); virtual rdcarray GetTargetShaderEncodings() = 0; + DOCUMENT(R"(Retrieve the list of supported :class:`ShaderEncoding` which can be build using +:meth:`BuildCustomShader`. + +The list is sorted in priority order, so if the caller has a shader in a form but could +compile/translate it to another, prefer to satisfy the first encoding before later encodings. + +This typically means the 'native' encoding is listed first, and then subsequent encodings are +compiled internally - so compiling externally could be preferable as it allows better customisation +of the compile process or using alternate/updated tools. + +:return: The list of target shader encodings available. +:rtype: ``list`` of :class:`ShaderEncoding` +)"); + virtual rdcarray GetCustomShaderEncodings() = 0; + DOCUMENT(R"(Replace one resource with another for subsequent replay and analysis work. This is commonly used for modifying the capture by selectively replacing resources with newly diff --git a/renderdoc/core/image_viewer.cpp b/renderdoc/core/image_viewer.cpp index 8303d536d..3de28baec 100644 --- a/renderdoc/core/image_viewer.cpp +++ b/renderdoc/core/image_viewer.cpp @@ -141,6 +141,10 @@ public: { return m_Proxy->GetTargetShaderEncodings(); } + rdcarray GetCustomShaderEncodings() + { + return m_Proxy->GetCustomShaderEncodings(); + } void BuildCustomShader(std::string source, std::string entry, const ShaderCompileFlags &compileFlags, ShaderStage type, ResourceId *id, std::string *errors) diff --git a/renderdoc/core/replay_proxy.h b/renderdoc/core/replay_proxy.h index 3ba53d8df..4ae095728 100644 --- a/renderdoc/core/replay_proxy.h +++ b/renderdoc/core/replay_proxy.h @@ -418,6 +418,14 @@ public: } } + rdcarray GetCustomShaderEncodings() + { + if(m_Proxy) + return m_Proxy->GetCustomShaderEncodings(); + + return {}; + } + void FreeCustomShader(ResourceId id) { if(m_Proxy) diff --git a/renderdoc/driver/d3d11/d3d11_replay.h b/renderdoc/driver/d3d11/d3d11_replay.h index ec6e131b9..000859497 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.h +++ b/renderdoc/driver/d3d11/d3d11_replay.h @@ -181,6 +181,10 @@ public: void GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t mip, const GetTextureDataParams ¶ms, bytebuf &data); + rdcarray GetCustomShaderEncodings() + { + return {ShaderEncoding::DXBC, ShaderEncoding::HLSL}; + } rdcarray GetTargetShaderEncodings() { return {ShaderEncoding::DXBC, ShaderEncoding::HLSL}; diff --git a/renderdoc/driver/d3d12/d3d12_replay.h b/renderdoc/driver/d3d12/d3d12_replay.h index 4b419516b..c7cee7508 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.h +++ b/renderdoc/driver/d3d12/d3d12_replay.h @@ -142,6 +142,10 @@ public: void GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t mip, const GetTextureDataParams ¶ms, bytebuf &data); + rdcarray GetCustomShaderEncodings() + { + return {ShaderEncoding::DXBC, ShaderEncoding::HLSL}; + } rdcarray GetTargetShaderEncodings() { return {ShaderEncoding::DXBC, ShaderEncoding::HLSL}; diff --git a/renderdoc/driver/gl/gl_replay.h b/renderdoc/driver/gl/gl_replay.h index b600c1802..15e6233bd 100644 --- a/renderdoc/driver/gl/gl_replay.h +++ b/renderdoc/driver/gl/gl_replay.h @@ -171,6 +171,7 @@ public: void RenderMesh(uint32_t eventId, const std::vector &secondaryDraws, const MeshDisplay &cfg); + rdcarray GetCustomShaderEncodings() { return {ShaderEncoding::GLSL}; } rdcarray GetTargetShaderEncodings() { return {ShaderEncoding::GLSL}; } void BuildTargetShader(ShaderEncoding sourceEncoding, bytebuf source, std::string entry, const ShaderCompileFlags &compileFlags, ShaderStage type, ResourceId *id, diff --git a/renderdoc/driver/vulkan/vk_replay.h b/renderdoc/driver/vulkan/vk_replay.h index a19d8e856..1730aedcd 100644 --- a/renderdoc/driver/vulkan/vk_replay.h +++ b/renderdoc/driver/vulkan/vk_replay.h @@ -312,6 +312,10 @@ public: void RenderMesh(uint32_t eventId, const std::vector &secondaryDraws, const MeshDisplay &cfg); + rdcarray GetCustomShaderEncodings() + { + return {ShaderEncoding::SPIRV, ShaderEncoding::GLSL}; + } rdcarray GetTargetShaderEncodings() { return {ShaderEncoding::SPIRV, ShaderEncoding::GLSL}; diff --git a/renderdoc/replay/replay_controller.cpp b/renderdoc/replay/replay_controller.cpp index b87afaabd..ed5bcb63a 100644 --- a/renderdoc/replay/replay_controller.cpp +++ b/renderdoc/replay/replay_controller.cpp @@ -1908,6 +1908,13 @@ void ReplayController::Shutdown() delete this; } +rdcarray ReplayController::GetCustomShaderEncodings() +{ + CHECK_REPLAY_THREAD(); + + return m_pDevice->GetCustomShaderEncodings(); +} + rdcarray ReplayController::GetTargetShaderEncodings() { CHECK_REPLAY_THREAD(); diff --git a/renderdoc/replay/replay_controller.h b/renderdoc/replay/replay_controller.h index d2bb6691b..a2d4ec94a 100644 --- a/renderdoc/replay/replay_controller.h +++ b/renderdoc/replay/replay_controller.h @@ -158,6 +158,7 @@ public: ShaderStage type); void FreeCustomShader(ResourceId id); + rdcarray GetCustomShaderEncodings(); rdcarray GetTargetShaderEncodings(); rdcpair BuildTargetShader(const char *entry, ShaderEncoding sourceEncoding, bytebuf source, diff --git a/renderdoc/replay/replay_driver.h b/renderdoc/replay/replay_driver.h index 00b7c76a3..e2868c9e9 100644 --- a/renderdoc/replay/replay_driver.h +++ b/renderdoc/replay/replay_driver.h @@ -217,6 +217,7 @@ public: virtual void BuildCustomShader(std::string source, std::string entry, const ShaderCompileFlags &compileFlags, ShaderStage type, ResourceId *id, std::string *errors) = 0; + virtual rdcarray GetCustomShaderEncodings() = 0; virtual ResourceId ApplyCustomShader(ResourceId shader, ResourceId texid, uint32_t mip, uint32_t arrayIdx, uint32_t sampleIdx, CompType typeHint) = 0; virtual void FreeCustomShader(ResourceId id) = 0;