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; 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 268f75370c..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,16 +125,15 @@ 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) { - 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 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);