From 9c6d3a2bf66d0cd52be1748d1a9b759f4f3e4aac Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Fri, 26 Feb 2021 03:32:51 +0100 Subject: [PATCH] [d3d11] Fix RSGetViewports and RSGetScissorRects If the output array is non-null, these functons always return the number of valid viewports or scissors actually written to the array. Fixes a wine test failure. --- src/d3d11/d3d11_context.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index b051b5e2..fd58b0dc 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -2974,8 +2974,11 @@ namespace dxvk { UINT* pNumViewports, D3D11_VIEWPORT* pViewports) { D3D10DeviceLock lock = LockContext(); - - if (pViewports != nullptr) { + uint32_t numWritten = m_state.rs.numViewports; + + if (pViewports) { + numWritten = std::min(numWritten, *pNumViewports); + for (uint32_t i = 0; i < *pNumViewports; i++) { if (i < m_state.rs.numViewports) { pViewports[i] = m_state.rs.viewports[i]; @@ -2988,9 +2991,9 @@ namespace dxvk { pViewports[i].MaxDepth = 0.0f; } } - } else { - *pNumViewports = m_state.rs.numViewports; } + + *pNumViewports = numWritten; } @@ -2998,8 +3001,11 @@ namespace dxvk { UINT* pNumRects, D3D11_RECT* pRects) { D3D10DeviceLock lock = LockContext(); + uint32_t numWritten = m_state.rs.numScissors; - if (pRects != nullptr) { + if (pRects) { + numWritten = std::min(numWritten, *pNumRects); + for (uint32_t i = 0; i < *pNumRects; i++) { if (i < m_state.rs.numScissors) { pRects[i] = m_state.rs.scissors[i]; @@ -3010,9 +3016,9 @@ namespace dxvk { pRects[i].bottom = 0; } } - } else { - *pNumRects = m_state.rs.numScissors; } + + *pNumRects = m_state.rs.numScissors; }