@@ -5,37 +5,43 @@ namespace dxvk {
55
66 D3D8StateBlock::D3D8StateBlock (
77 D3D8Device* pDevice,
8- D3DSTATEBLOCKTYPE Type,
8+ D3D8StateBlockType Type,
99 Com<d3d9::IDirect3DStateBlock9>&& pStateBlock)
1010 : m_device(pDevice)
11- , m_stateBlock(std::move(pStateBlock))
12- , m_type(Type)
13- , m_isSWVP(pDevice->GetD3D9 ()->GetSoftwareVertexProcessing()) {
14- if (Type == D3DSBT_VERTEXSTATE || Type == D3DSBT_ALL) {
11+ , m_stateBlock(std::move(pStateBlock)) {
12+ if (Type == D3D8StateBlockType::All) {
13+ m_captures.flags .set (D3D8CapturedStateFlag::Indices);
14+ m_captures.flags .set (D3D8CapturedStateFlag::SWVP);
15+
16+ m_captures.flags .set (D3D8CapturedStateFlag::VertexBuffers);
17+ m_captures.streams .setAll ();
18+
19+ m_captures.flags .set (D3D8CapturedStateFlag::Textures);
20+ m_captures.textures .setAll ();
21+ }
22+
23+ if (Type == D3D8StateBlockType::VertexState || Type == D3D8StateBlockType::All) {
1524 // Lights, D3DTSS_TEXCOORDINDEX and D3DTSS_TEXTURETRANSFORMFLAGS,
1625 // vertex shader, VS constants, and various render states.
17- m_capture. vs = true ;
26+ m_captures. flags . set (D3D8CapturedStateFlag::VertexShader) ;
1827 }
1928
20- if (Type == D3DSBT_PIXELSTATE || Type == D3DSBT_ALL ) {
29+ if (Type == D3D8StateBlockType::PixelState || Type == D3D8StateBlockType::All ) {
2130 // Pixel shader, PS constants, and various RS/TSS states.
22- m_capture. ps = true ;
31+ m_captures. flags . set (D3D8CapturedStateFlag::PixelShader) ;
2332 }
2433
25- if (Type == D3DSBT_ALL) {
26- m_capture.indices = true ;
27- m_capture.swvp = true ;
28- m_capture.textures .setAll ();
29- m_capture.streams .setAll ();
30- }
34+ m_state.textures .fill (nullptr );
35+ m_state.streams .fill (D3D8VBOP ());
3136
32- m_textures.fill (nullptr );
33- m_streams.fill (D3D8VBOP ());
37+ // Automatically capture state on creation via D3D8Device::CreateStateBlock.
38+ if (Type != D3D8StateBlockType::None)
39+ Capture ();
3440 }
3541
3642 // Construct a state block without a D3D9 object
3743 D3D8StateBlock::D3D8StateBlock (D3D8Device* pDevice)
38- : D3D8StateBlock(pDevice, D3DSTATEBLOCKTYPE( 0 ) , nullptr) {
44+ : D3D8StateBlock(pDevice, D3D8StateBlockType::None , nullptr ) {
3945 }
4046
4147 // Attach a D3D9 object to a state block that doesn't have one yet
@@ -51,31 +57,38 @@ namespace dxvk {
5157 if (unlikely (m_stateBlock == nullptr ))
5258 return D3DERR_INVALIDCALL;
5359
54- if (m_capture.vs ) m_device->GetVertexShader (&m_vertexShader);
55- if (m_capture.ps ) m_device->GetPixelShader (&m_pixelShader);
60+ if (m_captures.flags .test (D3D8CapturedStateFlag::Indices)) {
61+ m_state.baseVertexIndex = m_device->m_baseVertexIndex ;
62+ m_state.indices = m_device->m_indices .ptr ();
63+ }
5664
57- for (DWORD stage = 0 ; stage < m_textures.size (); stage++) {
58- if (m_capture.textures .get (stage))
59- m_textures[stage] = m_device->m_textures [stage].ptr ();
65+ if (m_captures.flags .test (D3D8CapturedStateFlag::SWVP)) {
66+ DWORD swvpState;
67+ m_device->GetRenderState (D3DRS_SOFTWAREVERTEXPROCESSING, &swvpState);
68+ m_state.isSWVP = static_cast <bool >(swvpState);
6069 }
6170
62- for (DWORD stream = 0 ; stream < m_streams.size (); stream++) {
63- if (m_capture.streams .get (stream)) {
64- m_streams[stream].buffer = m_device->m_streams [stream].buffer .ptr ();
65- m_streams[stream].stride = m_device->m_streams [stream].stride ;
71+ if (m_captures.flags .test (D3D8CapturedStateFlag::VertexBuffers)) {
72+ for (DWORD stream = 0 ; stream < m_state.streams .size (); stream++) {
73+ if (m_captures.streams .get (stream)) {
74+ m_state.streams [stream].buffer = m_device->m_streams [stream].buffer .ptr ();
75+ m_state.streams [stream].stride = m_device->m_streams [stream].stride ;
76+ }
6677 }
6778 }
6879
69- if (m_capture.indices ) {
70- m_baseVertexIndex = m_device->m_baseVertexIndex ;
71- m_indices = m_device->m_indices .ptr ();
80+ if (m_captures.flags .test (D3D8CapturedStateFlag::Textures)) {
81+ for (DWORD stage = 0 ; stage < m_state.textures .size (); stage++) {
82+ if (m_captures.textures .get (stage))
83+ m_state.textures [stage] = m_device->m_textures [stage].ptr ();
84+ }
7285 }
7386
74- if (m_capture. swvp ) {
75- DWORD swvpState ;
76- m_device-> GetRenderState (D3DRS_SOFTWAREVERTEXPROCESSING, &swvpState);
77- m_isSWVP = static_cast < bool >(swvpState);
78- }
87+ if (m_captures. flags . test (D3D8CapturedStateFlag::VertexShader))
88+ m_device-> GetVertexShader (&m_state. vertexShaderHandle ) ;
89+
90+ if (m_captures. flags . test (D3D8CapturedStateFlag::PixelShader))
91+ m_device-> GetPixelShader (&m_state. pixelShaderHandle );
7992
8093 return m_stateBlock->Capture ();
8194 }
@@ -86,25 +99,32 @@ namespace dxvk {
8699
87100 HRESULT res = m_stateBlock->Apply ();
88101
89- if (m_capture. vs ) m_device-> SetVertexShader (m_vertexShader);
90- if (m_capture. ps ) m_device->SetPixelShader (m_pixelShader );
102+ if (m_captures. flags . test (D3D8CapturedStateFlag::Indices))
103+ m_device->SetIndices (m_state. indices , m_state. baseVertexIndex );
91104
92- for (DWORD stage = 0 ; stage < m_textures.size (); stage++) {
93- if (m_capture.textures .get (stage))
94- m_device->SetTexture (stage, m_textures[stage]);
105+ // This was a very easy footgun for D3D8 applications.
106+ if (m_captures.flags .test (D3D8CapturedStateFlag::SWVP))
107+ m_device->SetRenderState (D3DRS_SOFTWAREVERTEXPROCESSING, static_cast <DWORD>(m_state.isSWVP ));
108+
109+ if (m_captures.flags .test (D3D8CapturedStateFlag::VertexBuffers)) {
110+ for (DWORD stream = 0 ; stream < m_state.streams .size (); stream++) {
111+ if (m_captures.streams .get (stream))
112+ m_device->SetStreamSource (stream, m_state.streams [stream].buffer , m_state.streams [stream].stride );
113+ }
95114 }
96115
97- for (DWORD stream = 0 ; stream < m_streams.size (); stream++) {
98- if (m_capture.streams .get (stream))
99- m_device->SetStreamSource (stream, m_streams[stream].buffer , m_streams[stream].stride );
116+ if (m_captures.flags .test (D3D8CapturedStateFlag::Textures)) {
117+ for (DWORD stage = 0 ; stage < m_state.textures .size (); stage++) {
118+ if (m_captures.textures .get (stage))
119+ m_device->SetTexture (stage, m_state.textures [stage]);
120+ }
100121 }
101122
102- if (m_capture. indices )
103- m_device->SetIndices (m_indices, m_baseVertexIndex );
123+ if (m_captures. flags . test (D3D8CapturedStateFlag::VertexShader) )
124+ m_device->SetVertexShader (m_state. vertexShaderHandle );
104125
105- // This was a very easy footgun for D3D8 applications.
106- if (m_capture.swvp )
107- m_device->SetRenderState (D3DRS_SOFTWAREVERTEXPROCESSING, static_cast <DWORD>(m_isSWVP));
126+ if (m_captures.flags .test (D3D8CapturedStateFlag::PixelShader))
127+ m_device->SetPixelShader (m_state.pixelShaderHandle );
108128
109129 return res;
110130 }
0 commit comments