mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-25 07:54:15 +01:00
50 lines
1.4 KiB
C++
50 lines
1.4 KiB
C++
|
#include "d3d8_device.h"
|
||
|
#include "d3d8_state_block.h"
|
||
|
|
||
|
HRESULT dxvk::D3D8StateBlock::Capture() {
|
||
|
if (unlikely(m_stateBlock == nullptr))
|
||
|
return D3DERR_INVALIDCALL;
|
||
|
|
||
|
if (m_capture.vs) m_device->GetVertexShader(&m_vertexShader);
|
||
|
if (m_capture.ps) m_device->GetPixelShader(&m_pixelShader);
|
||
|
|
||
|
for (DWORD stage = 0; stage < m_textures.size(); stage++) {
|
||
|
if (m_capture.textures.get(stage))
|
||
|
m_textures[stage] = m_device->m_textures[stage].ptr();
|
||
|
}
|
||
|
|
||
|
if (m_capture.indices) {
|
||
|
m_baseVertexIndex = m_device->m_baseVertexIndex;
|
||
|
m_indices = m_device->m_indices.ptr();
|
||
|
}
|
||
|
|
||
|
if (m_capture.swvp)
|
||
|
m_device->GetRenderState(D3DRS_SOFTWAREVERTEXPROCESSING, (DWORD*)&m_isSWVP);
|
||
|
|
||
|
return m_stateBlock->Capture();
|
||
|
}
|
||
|
|
||
|
HRESULT dxvk::D3D8StateBlock::Apply() {
|
||
|
if (unlikely(m_stateBlock == nullptr))
|
||
|
return D3DERR_INVALIDCALL;
|
||
|
|
||
|
HRESULT res = m_stateBlock->Apply();
|
||
|
|
||
|
if (m_capture.vs) m_device->SetVertexShader(m_vertexShader);
|
||
|
if (m_capture.ps) m_device->SetPixelShader(m_pixelShader);
|
||
|
|
||
|
for (DWORD stage = 0; stage < m_textures.size(); stage++) {
|
||
|
if (m_capture.textures.get(stage))
|
||
|
m_device->SetTexture(stage, m_textures[stage]);
|
||
|
}
|
||
|
|
||
|
if (m_capture.indices)
|
||
|
m_device->SetIndices(m_indices, m_baseVertexIndex);
|
||
|
|
||
|
// This was a very easy footgun for D3D8 applications.
|
||
|
if (m_capture.swvp)
|
||
|
m_device->SetRenderState(D3DRS_SOFTWAREVERTEXPROCESSING, m_isSWVP);
|
||
|
|
||
|
return res;
|
||
|
}
|