1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-20 10:54:16 +01:00

[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.
This commit is contained in:
Philip Rebohle 2021-02-26 03:32:51 +01:00
parent d118d35820
commit 9c6d3a2bf6
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99

View File

@ -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;
}