Hold a pointer to provided shader blob instead of cloning it in D3D12.

This commit is contained in:
Skyth 2024-11-06 13:33:15 +03:00
parent d8512fd6b7
commit 182b5bebc2
2 changed files with 14 additions and 14 deletions

View file

@ -2585,12 +2585,11 @@ namespace RT64 {
assert(format != RenderShaderFormat::UNKNOWN); assert(format != RenderShaderFormat::UNKNOWN);
assert(format == RenderShaderFormat::DXIL); assert(format == RenderShaderFormat::DXIL);
this->data = data;
this->size = size;
this->device = device; this->device = device;
this->format = format; this->format = format;
this->entryPointName = (entryPointName != nullptr) ? std::string(entryPointName) : std::string(); this->entryPointName = (entryPointName != nullptr) ? std::string(entryPointName) : std::string();
const uint8_t *dataBytes = reinterpret_cast<const uint8_t *>(data);
this->d3d = std::vector(dataBytes, dataBytes + size);
} }
D3D12Shader::~D3D12Shader() { } D3D12Shader::~D3D12Shader() { }
@ -2662,8 +2661,8 @@ namespace RT64 {
const D3D12Shader *computeShader = static_cast<const D3D12Shader *>(desc.computeShader); const D3D12Shader *computeShader = static_cast<const D3D12Shader *>(desc.computeShader);
D3D12_COMPUTE_PIPELINE_STATE_DESC psoDesc = {}; D3D12_COMPUTE_PIPELINE_STATE_DESC psoDesc = {};
psoDesc.pRootSignature = rootSignature->rootSignature; psoDesc.pRootSignature = rootSignature->rootSignature;
psoDesc.CS.pShaderBytecode = computeShader->d3d.data(); psoDesc.CS.pShaderBytecode = computeShader->data;
psoDesc.CS.BytecodeLength = computeShader->d3d.size(); psoDesc.CS.BytecodeLength = computeShader->size;
device->d3d->CreateComputePipelineState(&psoDesc, IID_PPV_ARGS(&d3d)); device->d3d->CreateComputePipelineState(&psoDesc, IID_PPV_ARGS(&d3d));
} }
@ -2691,12 +2690,12 @@ namespace RT64 {
const D3D12Shader *pixelShader = static_cast<const D3D12Shader *>(desc.pixelShader); const D3D12Shader *pixelShader = static_cast<const D3D12Shader *>(desc.pixelShader);
D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {}; D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {};
psoDesc.pRootSignature = pipelineLayout->rootSignature; psoDesc.pRootSignature = pipelineLayout->rootSignature;
psoDesc.VS.pShaderBytecode = (vertexShader != nullptr) ? vertexShader->d3d.data() : nullptr; psoDesc.VS.pShaderBytecode = (vertexShader != nullptr) ? vertexShader->data : nullptr;
psoDesc.VS.BytecodeLength = (vertexShader != nullptr) ? vertexShader->d3d.size() : 0; psoDesc.VS.BytecodeLength = (vertexShader != nullptr) ? vertexShader->size : 0;
psoDesc.GS.pShaderBytecode = (geometryShader != nullptr) ? geometryShader->d3d.data() : nullptr; psoDesc.GS.pShaderBytecode = (geometryShader != nullptr) ? geometryShader->data : nullptr;
psoDesc.GS.BytecodeLength = (geometryShader != nullptr) ? geometryShader->d3d.size() : 0; psoDesc.GS.BytecodeLength = (geometryShader != nullptr) ? geometryShader->size : 0;
psoDesc.PS.pShaderBytecode = (pixelShader != nullptr) ? pixelShader->d3d.data() : nullptr; psoDesc.PS.pShaderBytecode = (pixelShader != nullptr) ? pixelShader->data : nullptr;
psoDesc.PS.BytecodeLength = (pixelShader != nullptr) ? pixelShader->d3d.size() : 0; psoDesc.PS.BytecodeLength = (pixelShader != nullptr) ? pixelShader->size : 0;
psoDesc.SampleMask = UINT_MAX; psoDesc.SampleMask = UINT_MAX;
psoDesc.SampleDesc.Count = desc.multisampling.sampleCount; psoDesc.SampleDesc.Count = desc.multisampling.sampleCount;
if (desc.primitiveTopology == RenderPrimitiveTopology::LINE_STRIP || desc.primitiveTopology == RenderPrimitiveTopology::TRIANGLE_STRIP) { if (desc.primitiveTopology == RenderPrimitiveTopology::LINE_STRIP || desc.primitiveTopology == RenderPrimitiveTopology::TRIANGLE_STRIP) {
@ -2842,8 +2841,8 @@ namespace RT64 {
assert(libraryShader != nullptr); assert(libraryShader != nullptr);
D3D12_DXIL_LIBRARY_DESC &libraryDesc = libraryDescs[i]; D3D12_DXIL_LIBRARY_DESC &libraryDesc = libraryDescs[i];
libraryDesc.DXILLibrary.pShaderBytecode = libraryShader->d3d.data(); libraryDesc.DXILLibrary.pShaderBytecode = libraryShader->data;
libraryDesc.DXILLibrary.BytecodeLength = libraryShader->d3d.size(); libraryDesc.DXILLibrary.BytecodeLength = libraryShader->size;
libraryDesc.pExports = &exportDescs[exportsIndexStart]; libraryDesc.pExports = &exportDescs[exportsIndexStart];
libraryDesc.NumExports = exportsIndex - exportsIndexStart; libraryDesc.NumExports = exportsIndex - exportsIndexStart;

View file

@ -315,7 +315,8 @@ namespace RT64 {
}; };
struct D3D12Shader : RenderShader { struct D3D12Shader : RenderShader {
std::vector<uint8_t> d3d; const void* data = nullptr;
uint64_t size = 0;
std::string entryPointName; std::string entryPointName;
D3D12Device *device = nullptr; D3D12Device *device = nullptr;
RenderShaderFormat format = RenderShaderFormat::UNKNOWN; RenderShaderFormat format = RenderShaderFormat::UNKNOWN;