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);