diff --git a/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.cpp b/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.cpp index e833baa2a2..ca03098028 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.cpp @@ -292,6 +292,9 @@ bool D3D12GSRender::LoadProgram() prop.Blend.RenderTarget[i].RenderTargetWriteMask = mask; prop.IASet = m_IASet; + if (!!rsx::method_registers[NV4097_SET_RESTART_INDEX_ENABLE]) + prop.CutValue = ((rsx::method_registers[NV4097_SET_INDEX_ARRAY_DMA] >> 4) == CELL_GCM_DRAW_INDEX_ARRAY_TYPE_32) ? + D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_0xFFFFFFFF : D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_0xFFFF; m_PSO = m_cachePSO.getGraphicPipelineState(&vertex_program, &fragment_program, prop, std::make_pair(m_device.Get(), m_rootSignatures)); return m_PSO != nullptr; diff --git a/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.h b/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.h index d05ad6149c..721f33d9d7 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.h @@ -16,6 +16,7 @@ struct D3D12PipelineProperties unsigned numMRT : 3; D3D12_DEPTH_STENCIL_DESC DepthStencil; D3D12_RASTERIZER_DESC Rasterization; + D3D12_INDEX_BUFFER_STRIP_CUT_VALUE CutValue; bool operator==(const D3D12PipelineProperties &in) const { @@ -219,6 +220,8 @@ struct D3D12Traits graphicPipelineStateDesc.SampleMask = UINT_MAX; graphicPipelineStateDesc.NodeMask = 1; + graphicPipelineStateDesc.IBStripCutValue = pipelineProperties.CutValue; + extraData.first->CreateGraphicsPipelineState(&graphicPipelineStateDesc, IID_PPV_ARGS(&std::get<0>(*result))); std::get<1>(*result) = vertexProgramData.vertex_shader_inputs; return result;