From 287b446ef73d9da392ea917fd5efbd15b11da4de Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 26 Jul 2019 19:16:31 -0400 Subject: [PATCH 1/3] D3D/DXShader: Remove duplicate GetByteCode function This is already provided in the base class, which performs the same exact behavior. Given the function in the base class isn't virtual, this also essentially resolves an instance of shadowing. --- Source/Core/VideoBackends/D3D/DXShader.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/Source/Core/VideoBackends/D3D/DXShader.h b/Source/Core/VideoBackends/D3D/DXShader.h index 1913322679..877663adc7 100644 --- a/Source/Core/VideoBackends/D3D/DXShader.h +++ b/Source/Core/VideoBackends/D3D/DXShader.h @@ -16,8 +16,6 @@ public: DXShader(ShaderStage stage, BinaryData bytecode, ID3D11DeviceChild* shader); ~DXShader() override; - const BinaryData& GetByteCode() const { return m_bytecode; } - ID3D11VertexShader* GetD3DVertexShader() const; ID3D11GeometryShader* GetD3DGeometryShader() const; ID3D11PixelShader* GetD3DPixelShader() const; From 0ce6264f90e5591a7f28b2545f727809beaa8415 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 26 Jul 2019 19:27:55 -0400 Subject: [PATCH 2/3] D3DCommon/Shader: Create vector via iterators in CreateByteCode() Same behavior, but without unnecessary zeroing of data contents. Instead, we supply the dataset to use directly. --- Source/Core/VideoBackends/D3DCommon/Shader.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Source/Core/VideoBackends/D3DCommon/Shader.cpp b/Source/Core/VideoBackends/D3DCommon/Shader.cpp index 268f75370c..81d88c0968 100644 --- a/Source/Core/VideoBackends/D3DCommon/Shader.cpp +++ b/Source/Core/VideoBackends/D3DCommon/Shader.cpp @@ -132,9 +132,10 @@ bool Shader::CompileShader(D3D_FEATURE_LEVEL feature_level, BinaryData* out_byte AbstractShader::BinaryData Shader::CreateByteCode(const void* data, size_t length) { - BinaryData bytecode(length); - std::memcpy(bytecode.data(), data, length); - return bytecode; + const auto* const begin = static_cast(data); + const auto* const end = begin + length; + + return {begin, end}; } } // namespace D3DCommon From aca02f9734806572183d87b9432e8855adfa132d Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 26 Jul 2019 19:34:27 -0400 Subject: [PATCH 3/3] D3DCommon/Shader: Use std::optional with CompileShader() Allows removing the use of an out parameter, making it nicer to use. --- Source/Core/VideoBackends/D3D/Render.cpp | 6 +++--- Source/Core/VideoBackends/D3D12/DXShader.cpp | 6 +++--- Source/Core/VideoBackends/D3DCommon/Shader.cpp | 10 ++++------ Source/Core/VideoBackends/D3DCommon/Shader.h | 5 +++-- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/Source/Core/VideoBackends/D3D/Render.cpp b/Source/Core/VideoBackends/D3D/Render.cpp index c37871b5fb..e058bd1c66 100644 --- a/Source/Core/VideoBackends/D3D/Render.cpp +++ b/Source/Core/VideoBackends/D3D/Render.cpp @@ -115,11 +115,11 @@ std::unique_ptr Renderer::CreateFramebuffer(AbstractTexture std::unique_ptr Renderer::CreateShaderFromSource(ShaderStage stage, std::string_view source) { - DXShader::BinaryData bytecode; - if (!DXShader::CompileShader(D3D::feature_level, &bytecode, stage, source)) + auto bytecode = DXShader::CompileShader(D3D::feature_level, stage, source); + if (!bytecode) return nullptr; - return DXShader::CreateFromBytecode(stage, std::move(bytecode)); + return DXShader::CreateFromBytecode(stage, std::move(*bytecode)); } std::unique_ptr Renderer::CreateShaderFromBinary(ShaderStage stage, diff --git a/Source/Core/VideoBackends/D3D12/DXShader.cpp b/Source/Core/VideoBackends/D3D12/DXShader.cpp index bd06559152..856d0e8682 100644 --- a/Source/Core/VideoBackends/D3D12/DXShader.cpp +++ b/Source/Core/VideoBackends/D3D12/DXShader.cpp @@ -26,11 +26,11 @@ std::unique_ptr DXShader::CreateFromBytecode(ShaderStage stage, Binary std::unique_ptr DXShader::CreateFromSource(ShaderStage stage, std::string_view source) { - BinaryData bytecode; - if (!CompileShader(g_dx_context->GetFeatureLevel(), &bytecode, stage, source)) + auto bytecode = CompileShader(g_dx_context->GetFeatureLevel(), stage, source); + if (!bytecode) return nullptr; - return CreateFromBytecode(stage, std::move(bytecode)); + return CreateFromBytecode(stage, std::move(*bytecode)); } D3D12_SHADER_BYTECODE DXShader::GetD3DByteCode() const diff --git a/Source/Core/VideoBackends/D3DCommon/Shader.cpp b/Source/Core/VideoBackends/D3DCommon/Shader.cpp index 81d88c0968..3194fd8aa4 100644 --- a/Source/Core/VideoBackends/D3DCommon/Shader.cpp +++ b/Source/Core/VideoBackends/D3DCommon/Shader.cpp @@ -89,8 +89,8 @@ static const char* GetCompileTarget(D3D_FEATURE_LEVEL feature_level, ShaderStage } } -bool Shader::CompileShader(D3D_FEATURE_LEVEL feature_level, BinaryData* out_bytecode, - ShaderStage stage, std::string_view source) +std::optional Shader::CompileShader(D3D_FEATURE_LEVEL feature_level, + ShaderStage stage, std::string_view source) { static constexpr D3D_SHADER_MACRO macros[] = {{"API_D3D", "1"}, {nullptr, nullptr}}; const UINT flags = g_ActiveConfig.bEnableValidationLayer ? @@ -116,7 +116,7 @@ bool Shader::CompileShader(D3D_FEATURE_LEVEL feature_level, BinaryData* out_byte PanicAlert("Failed to compile %s:\nDebug info (%s):\n%s", filename.c_str(), target, static_cast(errors->GetBufferPointer())); - return false; + return std::nullopt; } if (errors && errors->GetBufferSize() > 0) @@ -125,9 +125,7 @@ bool Shader::CompileShader(D3D_FEATURE_LEVEL feature_level, BinaryData* out_byte static_cast(errors->GetBufferPointer())); } - out_bytecode->resize(code->GetBufferSize()); - std::memcpy(out_bytecode->data(), code->GetBufferPointer(), code->GetBufferSize()); - return true; + return CreateByteCode(code->GetBufferPointer(), code->GetBufferSize()); } AbstractShader::BinaryData Shader::CreateByteCode(const void* data, size_t length) diff --git a/Source/Core/VideoBackends/D3DCommon/Shader.h b/Source/Core/VideoBackends/D3DCommon/Shader.h index 2f179c9b0d..08158d6e1e 100644 --- a/Source/Core/VideoBackends/D3DCommon/Shader.h +++ b/Source/Core/VideoBackends/D3DCommon/Shader.h @@ -4,6 +4,7 @@ #pragma once +#include #include #include "VideoBackends/D3DCommon/Common.h" #include "VideoCommon/AbstractShader.h" @@ -19,8 +20,8 @@ public: BinaryData GetBinary() const override; - static bool CompileShader(D3D_FEATURE_LEVEL feature_level, BinaryData* out_bytecode, - ShaderStage stage, std::string_view source); + static std::optional CompileShader(D3D_FEATURE_LEVEL feature_level, ShaderStage stage, + std::string_view source); static BinaryData CreateByteCode(const void* data, size_t length);