[D3D12] Prototype multithreaded PSO creation

This commit is contained in:
Triang3l
2019-01-04 00:30:11 +03:00
parent 364cae6cc8
commit 890228b6f3
6 changed files with 255 additions and 59 deletions

View File

@@ -587,9 +587,10 @@ void D3D12CommandProcessor::SetSamplePositions(MsaaSamples sample_positions) {
}
void D3D12CommandProcessor::SetComputePipeline(ID3D12PipelineState* pipeline) {
if (current_pipeline_ != pipeline) {
if (current_external_pipeline_ != pipeline) {
deferred_command_list_->D3DSetPipelineState(pipeline);
current_pipeline_ = pipeline;
current_external_pipeline_ = pipeline;
current_cached_pipeline_ = nullptr;
}
}
@@ -600,9 +601,10 @@ void D3D12CommandProcessor::UnbindRenderTargets() {
void D3D12CommandProcessor::SetExternalGraphicsPipeline(
ID3D12PipelineState* pipeline, bool reset_viewport, bool reset_blend_factor,
bool reset_stencil_ref) {
if (current_pipeline_ != pipeline) {
if (current_external_pipeline_ != pipeline) {
deferred_command_list_->D3DSetPipelineState(pipeline);
current_pipeline_ = pipeline;
current_external_pipeline_ = pipeline;
current_cached_pipeline_ = nullptr;
}
current_graphics_root_signature_ = nullptr;
current_graphics_root_up_to_date_ = 0;
@@ -683,6 +685,10 @@ bool D3D12CommandProcessor::SetupContext() {
pipeline_cache_ = std::make_unique<PipelineCache>(this, register_file_,
IsROVUsedForEDRAM());
if (!pipeline_cache_->Initialize()) {
XELOGE("Failed to initialize the graphics pipeline state cache");
return false;
}
primitive_converter_ =
std::make_unique<PrimitiveConverter>(this, register_file_, memory_);
@@ -1279,17 +1285,19 @@ bool D3D12CommandProcessor::IssueDraw(PrimitiveType primitive_type,
pixel_shader != nullptr ? pixel_shader->GetUsedTextureMask() : 0);
// Create the pipeline if needed and bind it.
ID3D12PipelineState* pipeline;
void* pipeline_handle;
ID3D12RootSignature* root_signature;
if (!pipeline_cache_->ConfigurePipeline(
vertex_shader, pixel_shader, primitive_type_converted,
indexed ? index_buffer_info->format : IndexFormat::kInt16,
pipeline_render_targets, &pipeline, &root_signature)) {
pipeline_render_targets, &pipeline_handle, &root_signature)) {
return false;
}
if (current_pipeline_ != pipeline) {
deferred_command_list_->D3DSetPipelineState(pipeline);
current_pipeline_ = pipeline;
if (current_cached_pipeline_ != pipeline_handle) {
deferred_command_list_->SetPipelineStateHandle(
reinterpret_cast<void*>(pipeline_handle));
current_cached_pipeline_ = pipeline_handle;
current_external_pipeline_ = nullptr;
}
// Update viewport, scissor, blend factor and stencil reference.
@@ -1600,7 +1608,8 @@ bool D3D12CommandProcessor::BeginFrame() {
current_sample_positions_ = MsaaSamples::k1X;
// Reset bindings, particularly because the buffers backing them are recycled.
current_pipeline_ = nullptr;
current_cached_pipeline_ = nullptr;
current_external_pipeline_ = nullptr;
current_graphics_root_signature_ = nullptr;
current_graphics_root_up_to_date_ = 0;
current_view_heap_ = nullptr;
@@ -1656,6 +1665,8 @@ bool D3D12CommandProcessor::EndFrame() {
primitive_converter_->EndFrame();
pipeline_cache_->EndFrame();
render_target_cache_->EndFrame();
texture_cache_->EndFrame();