summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorStenzek <stenzek@gmail.com>2019-04-15 21:59:07 +1000
committerStenzek <stenzek@gmail.com>2019-04-16 00:34:34 +1000
commit5cef09e383c7f9c3bf006407d06f68d18b2db438 (patch)
treeaa917f8a501546c53e313a867c6d85699bafb3cb /Source
parent61a656570e2afc7a474c44de5795f5d564043c6c (diff)
D3D12: Support returning pipeline cache data
Diffstat (limited to 'Source')
-rw-r--r--Source/Core/VideoBackends/D3D12/DXPipeline.cpp25
-rw-r--r--Source/Core/VideoBackends/D3D12/DXPipeline.h5
-rw-r--r--Source/Core/VideoBackends/D3D12/Renderer.cpp2
3 files changed, 28 insertions, 4 deletions
diff --git a/Source/Core/VideoBackends/D3D12/DXPipeline.cpp b/Source/Core/VideoBackends/D3D12/DXPipeline.cpp
index 0c896bb425..c32739f803 100644
--- a/Source/Core/VideoBackends/D3D12/DXPipeline.cpp
+++ b/Source/Core/VideoBackends/D3D12/DXPipeline.cpp
@@ -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);
@@ -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
diff --git a/Source/Core/VideoBackends/D3D12/DXPipeline.h b/Source/Core/VideoBackends/D3D12/DXPipeline.h
index 04608cae1f..d0327a0c0e 100644
--- a/Source/Core/VideoBackends/D3D12/DXPipeline.h
+++ b/Source/Core/VideoBackends/D3D12/DXPipeline.h
@@ -19,7 +19,8 @@ public:
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; }
@@ -27,6 +28,8 @@ public:
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;
diff --git a/Source/Core/VideoBackends/D3D12/Renderer.cpp b/Source/Core/VideoBackends/D3D12/Renderer.cpp
index bc7d121bfc..b834ba33e1 100644
--- a/Source/Core/VideoBackends/D3D12/Renderer.cpp
+++ b/Source/Core/VideoBackends/D3D12/Renderer.cpp
@@ -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)