Skip to content

Commit

Permalink
D3D12: Support returning pipeline cache data
Browse files Browse the repository at this point in the history
  • Loading branch information
stenzek committed Apr 15, 2019
1 parent 61a6565 commit 5cef09e
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 4 deletions.
25 changes: 23 additions & 2 deletions Source/Core/VideoBackends/D3D12/DXPipeline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,8 @@ static void GetD3DBlendDesc(D3D12_BLEND_DESC* desc, const BlendingState& state)
}
}

std::unique_ptr<DXPipeline> DXPipeline::Create(const AbstractPipelineConfig& config)
std::unique_ptr<DXPipeline> DXPipeline::Create(const AbstractPipelineConfig& config,
const void* cache_data, size_t cache_data_size)
{
DEBUG_ASSERT(config.vertex_shader && config.pixel_shader);

Expand Down Expand Up @@ -202,16 +203,36 @@ std::unique_ptr<DXPipeline> DXPipeline::Create(const AbstractPipelineConfig& con
D3DCommon::GetDSVFormatForAbstractFormat(config.framebuffer_state.depth_texture_format);
desc.SampleDesc.Count = config.framebuffer_state.samples;
desc.NodeMask = 1;
desc.CachedPSO.pCachedBlob = cache_data;
desc.CachedPSO.CachedBlobSizeInBytes = cache_data_size;

ID3D12PipelineState* pso;
HRESULT hr = g_dx_context->GetDevice()->CreateGraphicsPipelineState(&desc, IID_PPV_ARGS(&pso));
CHECK(SUCCEEDED(hr), "Create PSO");
if (FAILED(hr))
{
WARN_LOG(VIDEO, "CreateGraphicsPipelineState() %sfailed with HRESULT %08X",
cache_data ? "with cache data " : "", hr);
return nullptr;
}

const bool use_integer_rtv =
!config.blending_state.blendenable && config.blending_state.logicopenable;
return std::make_unique<DXPipeline>(pso, desc.pRootSignature, config.usage,
GetD3DTopology(config.rasterization_state), use_integer_rtv);
}

AbstractPipeline::CacheData DXPipeline::GetCacheData() const
{
ComPtr<ID3DBlob> blob;
HRESULT hr = m_pipeline->GetCachedBlob(&blob);
if (FAILED(hr))
{
WARN_LOG(VIDEO, "ID3D12Pipeline::GetCachedBlob() failed with HRESULT %08X", hr);
return {};
}

CacheData data(blob->GetBufferSize());
std::memcpy(data.data(), blob->GetBufferPointer(), blob->GetBufferSize());
return data;
}
} // namespace DX12
5 changes: 4 additions & 1 deletion Source/Core/VideoBackends/D3D12/DXPipeline.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,17 @@ class DXPipeline final : public AbstractPipeline
bool use_integer_rtv);
~DXPipeline() override;

static std::unique_ptr<DXPipeline> Create(const AbstractPipelineConfig& config);
static std::unique_ptr<DXPipeline> Create(const AbstractPipelineConfig& config,
const void* cache_data, size_t cache_data_size);

ID3D12PipelineState* GetPipeline() const { return m_pipeline; }
ID3D12RootSignature* GetRootSignature() const { return m_root_signature; }
AbstractPipelineUsage GetUsage() const { return m_usage; }
D3D12_PRIMITIVE_TOPOLOGY GetPrimitiveTopology() const { return m_primitive_topology; }
bool UseIntegerRTV() const { return m_use_integer_rtv; }

CacheData GetCacheData() const override;

private:
ID3D12PipelineState* m_pipeline;
ID3D12RootSignature* m_root_signature;
Expand Down
2 changes: 1 addition & 1 deletion Source/Core/VideoBackends/D3D12/Renderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ std::unique_ptr<AbstractPipeline> Renderer::CreatePipeline(const AbstractPipelin
const void* cache_data,
size_t cache_data_length)
{
return DXPipeline::Create(config);
return DXPipeline::Create(config, cache_data, cache_data_length);
}

u16 Renderer::BBoxRead(int index)
Expand Down

0 comments on commit 5cef09e

Please sign in to comment.