From 182b5bebc28a04f4a11f89119d4aca1d8b1bb1c2 Mon Sep 17 00:00:00 2001 From: Skyth <19259897+blueskythlikesclouds@users.noreply.github.com> Date: Wed, 6 Nov 2024 13:33:15 +0300 Subject: [PATCH] Hold a pointer to provided shader blob instead of cloning it in D3D12. --- UnleashedRecomp/gpu/rhi/rt64_d3d12.cpp | 25 ++++++++++++------------- UnleashedRecomp/gpu/rhi/rt64_d3d12.h | 3 ++- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/UnleashedRecomp/gpu/rhi/rt64_d3d12.cpp b/UnleashedRecomp/gpu/rhi/rt64_d3d12.cpp index 9dfc246..aa267d3 100644 --- a/UnleashedRecomp/gpu/rhi/rt64_d3d12.cpp +++ b/UnleashedRecomp/gpu/rhi/rt64_d3d12.cpp @@ -2585,12 +2585,11 @@ namespace RT64 { assert(format != RenderShaderFormat::UNKNOWN); assert(format == RenderShaderFormat::DXIL); + this->data = data; + this->size = size; this->device = device; this->format = format; this->entryPointName = (entryPointName != nullptr) ? std::string(entryPointName) : std::string(); - - const uint8_t *dataBytes = reinterpret_cast(data); - this->d3d = std::vector(dataBytes, dataBytes + size); } D3D12Shader::~D3D12Shader() { } @@ -2662,8 +2661,8 @@ namespace RT64 { const D3D12Shader *computeShader = static_cast(desc.computeShader); D3D12_COMPUTE_PIPELINE_STATE_DESC psoDesc = {}; psoDesc.pRootSignature = rootSignature->rootSignature; - psoDesc.CS.pShaderBytecode = computeShader->d3d.data(); - psoDesc.CS.BytecodeLength = computeShader->d3d.size(); + psoDesc.CS.pShaderBytecode = computeShader->data; + psoDesc.CS.BytecodeLength = computeShader->size; device->d3d->CreateComputePipelineState(&psoDesc, IID_PPV_ARGS(&d3d)); } @@ -2691,12 +2690,12 @@ namespace RT64 { const D3D12Shader *pixelShader = static_cast(desc.pixelShader); D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {}; psoDesc.pRootSignature = pipelineLayout->rootSignature; - psoDesc.VS.pShaderBytecode = (vertexShader != nullptr) ? vertexShader->d3d.data() : nullptr; - psoDesc.VS.BytecodeLength = (vertexShader != nullptr) ? vertexShader->d3d.size() : 0; - psoDesc.GS.pShaderBytecode = (geometryShader != nullptr) ? geometryShader->d3d.data() : nullptr; - psoDesc.GS.BytecodeLength = (geometryShader != nullptr) ? geometryShader->d3d.size() : 0; - psoDesc.PS.pShaderBytecode = (pixelShader != nullptr) ? pixelShader->d3d.data() : nullptr; - psoDesc.PS.BytecodeLength = (pixelShader != nullptr) ? pixelShader->d3d.size() : 0; + psoDesc.VS.pShaderBytecode = (vertexShader != nullptr) ? vertexShader->data : nullptr; + psoDesc.VS.BytecodeLength = (vertexShader != nullptr) ? vertexShader->size : 0; + psoDesc.GS.pShaderBytecode = (geometryShader != nullptr) ? geometryShader->data : nullptr; + psoDesc.GS.BytecodeLength = (geometryShader != nullptr) ? geometryShader->size : 0; + psoDesc.PS.pShaderBytecode = (pixelShader != nullptr) ? pixelShader->data : nullptr; + psoDesc.PS.BytecodeLength = (pixelShader != nullptr) ? pixelShader->size : 0; psoDesc.SampleMask = UINT_MAX; psoDesc.SampleDesc.Count = desc.multisampling.sampleCount; if (desc.primitiveTopology == RenderPrimitiveTopology::LINE_STRIP || desc.primitiveTopology == RenderPrimitiveTopology::TRIANGLE_STRIP) { @@ -2842,8 +2841,8 @@ namespace RT64 { assert(libraryShader != nullptr); D3D12_DXIL_LIBRARY_DESC &libraryDesc = libraryDescs[i]; - libraryDesc.DXILLibrary.pShaderBytecode = libraryShader->d3d.data(); - libraryDesc.DXILLibrary.BytecodeLength = libraryShader->d3d.size(); + libraryDesc.DXILLibrary.pShaderBytecode = libraryShader->data; + libraryDesc.DXILLibrary.BytecodeLength = libraryShader->size; libraryDesc.pExports = &exportDescs[exportsIndexStart]; libraryDesc.NumExports = exportsIndex - exportsIndexStart; diff --git a/UnleashedRecomp/gpu/rhi/rt64_d3d12.h b/UnleashedRecomp/gpu/rhi/rt64_d3d12.h index 03f5757..ff62d1b 100644 --- a/UnleashedRecomp/gpu/rhi/rt64_d3d12.h +++ b/UnleashedRecomp/gpu/rhi/rt64_d3d12.h @@ -315,7 +315,8 @@ namespace RT64 { }; struct D3D12Shader : RenderShader { - std::vector d3d; + const void* data = nullptr; + uint64_t size = 0; std::string entryPointName; D3D12Device *device = nullptr; RenderShaderFormat format = RenderShaderFormat::UNKNOWN;