1b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens//
3b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens// Licensed under the Apache License, Version 2.0 (the "License");
4b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens// you may not use this file except in compliance with the License.
5b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens// You may obtain a copy of the License at
6b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens//
7b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens//    http://www.apache.org/licenses/LICENSE-2.0
8b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens//
9b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens// Unless required by applicable law or agreed to in writing, software
10b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens// distributed under the License is distributed on an "AS IS" BASIS,
11b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens// See the License for the specific language governing permissions and
13b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens// limitations under the License.
14b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
15b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens#include "Direct3DStateBlock8.hpp"
16b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
17b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens#include "Direct3DDevice8.hpp"
18b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens#include "Direct3DBaseTexture8.hpp"
19b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens#include "Direct3DVertexBuffer8.hpp"
20b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens#include "Direct3DIndexBuffer8.hpp"
21b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens#include "Debug.hpp"
22b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
23b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens#include <assert.h>
24b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
25b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capensnamespace D3D8
26b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens{
27b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	Direct3DStateBlock8::Direct3DStateBlock8(Direct3DDevice8 *device, D3DSTATEBLOCKTYPE type) : device(device), type(type)
28b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
29b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		vertexShaderHandle = 0;
30b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		pixelShaderHandle = 0;
31b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		indexBuffer = 0;
32b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
33b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int stream = 0; stream < 16; stream++)
34b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
35b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			streamSource[stream].vertexBuffer = 0;
36b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
37b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
38b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int stage = 0; stage < 8; stage++)
39b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
40b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			texture[stage] = 0;
41b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
42b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
43b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		clear();
44b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
45b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		if(type == D3DSBT_PIXELSTATE || type == D3DSBT_ALL)
46b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
47b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			capturePixelRenderStates();
48b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			capturePixelTextureStates();
49b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			capturePixelShaderStates();
50b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
51b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
52b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		if(type == D3DSBT_VERTEXSTATE || type == D3DSBT_ALL)
53b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
54b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureVertexRenderStates();
55b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureVertexTextureStates();
56b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureLightStates();
57b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureVertexShaderStates();
58b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
59b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
60b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		if(type == D3DSBT_ALL)   // Capture remaining states
61b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
62b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextures();
63b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureVertexTextures();
64b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureDisplacementTextures();
65b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTexturePalette();
66b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureVertexStreams();
67b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureIndexBuffer();
68b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureViewport();
69b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTransforms();
70b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureTransforms();
71b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureClippingPlanes();
72b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureMaterial();
73b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
74b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
75b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
76b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	Direct3DStateBlock8::~Direct3DStateBlock8()
77b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
78b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		clear();
79b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
80b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
81b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	long Direct3DStateBlock8::QueryInterface(const IID &iid, void **object)
82b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
83b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		TRACE("");
84b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
85b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		ASSERT(false);   // Internal object
86b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
87b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		return NOINTERFACE(iid);
88b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
89b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
90b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	unsigned long Direct3DStateBlock8::AddRef()
91b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
92b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		TRACE("");
93b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
94b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		return Unknown::AddRef();
95b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
96b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
97b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	unsigned long Direct3DStateBlock8::Release()
98b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
99b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		TRACE("");
100b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
101b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		return Unknown::Release();
102b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
103b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
104b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	long Direct3DStateBlock8::Apply()
105b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
106b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		TRACE("");
107b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
108b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		if(vertexShaderCaptured)
109b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
110b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			device->SetVertexShader(vertexShaderHandle);
111b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
112b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
113b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		if(pixelShaderCaptured)
114b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
115b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			device->SetPixelShader(pixelShaderHandle);
116b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
117b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
118b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		if(indexBufferCaptured)
119b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
120b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			device->SetIndices(indexBuffer, baseVertexIndex);
121b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
122b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
123b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int state = 0; state < D3DRS_NORMALORDER + 1; state++)
124b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
125b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			if(renderStateCaptured[state])
126b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			{
127b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				device->SetRenderState((D3DRENDERSTATETYPE)state, renderState[state]);
128b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			}
129b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
130b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
131b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int stage = 0; stage < 8; stage++)
132b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
133b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			for(int state = 0; state < D3DTSS_RESULTARG + 1; state++)
134b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			{
135b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				if(textureStageStateCaptured[stage][state])
136b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				{
137b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens					device->SetTextureStageState(stage, (D3DTEXTURESTAGESTATETYPE)state, textureStageState[stage][state]);
138b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				}
139b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			}
140b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
141b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
142b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int stream = 0; stream < 16; stream++)
143b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
144b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			if(streamSourceCaptured[stream])
145b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			{
146b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				device->SetStreamSource(stream, streamSource[stream].vertexBuffer, streamSource[stream].stride);
147b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			}
148b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
149b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
150b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int stage = 0; stage < 8; stage++)
151b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
152b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			if(textureCaptured[stage])
153b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			{
154b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				device->SetTexture(stage, texture[stage]);
155b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			}
156b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
157b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
158b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int state = 0; state < 512; state++)
159b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
160b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			if(transformCaptured[state])
161b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			{
162b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				device->SetTransform((D3DTRANSFORMSTATETYPE)state, &transform[state]);
163b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			}
164b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
165b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
166b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		if(viewportCaptured)
167b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
168b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			device->SetViewport(&viewport);
169b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
170b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
171b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int index = 0; index < 6; index++)
172b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
173b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			if(clipPlaneCaptured[index])
174b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			{
175b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				device->SetClipPlane(index, clipPlane[index]);
176b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			}
177b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
178b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
179b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		return D3D_OK;
180b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
181b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
182b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	long Direct3DStateBlock8::Capture()
183b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
184b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		TRACE("");
185b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
186b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		if(vertexShaderCaptured)
187b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
188b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			device->GetVertexShader(&vertexShaderHandle);
189b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
190b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
191b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		if(pixelShaderCaptured)
192b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
193b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			device->GetPixelShader(&pixelShaderHandle);
194b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
195b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
196b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		if(indexBufferCaptured)
197b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
198b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			if(indexBuffer)
199b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			{
200b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				indexBuffer->Release();
201b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			}
202b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
203b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			device->GetIndices(reinterpret_cast<IDirect3DIndexBuffer8**>(&indexBuffer), &baseVertexIndex);
204b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
205b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
206b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int state = 0; state < D3DRS_NORMALORDER + 1; state++)
207b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
208b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			if(renderStateCaptured[state])
209b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			{
210b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				device->GetRenderState((D3DRENDERSTATETYPE)state, &renderState[state]);
211b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			}
212b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
213b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
214b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int stage = 0; stage < 8; stage++)
215b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
216b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			for(int state = 0; state < D3DTSS_RESULTARG + 1; state++)
217b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			{
218b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				if(textureStageStateCaptured[stage][state])
219b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				{
220b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens					device->GetTextureStageState(stage, (D3DTEXTURESTAGESTATETYPE)state, &textureStageState[stage][state]);
221b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				}
222b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			}
223b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
224b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
225b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int stream = 0; stream < 16; stream++)
226b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
227b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			if(streamSourceCaptured[stream])
228b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			{
229b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				if(streamSource[stream].vertexBuffer)
230b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				{
231b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens					streamSource[stream].vertexBuffer->Release();
232b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				}
233b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
234b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				device->GetStreamSource(stream, reinterpret_cast<IDirect3DVertexBuffer8**>(&streamSource[stream].vertexBuffer), &streamSource[stream].stride);
235b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			}
236b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
237b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
238b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int stage = 0; stage < 8; stage++)
239b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
240b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			if(textureCaptured[stage])
241b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			{
242b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				if(texture[stage])
243b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				{
244b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens					texture[stage]->Release();
245b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				}
246b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
247b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				device->GetTexture(stage, reinterpret_cast<IDirect3DBaseTexture8**>(&texture[stage]));
248b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			}
249b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
250b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
251b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int state = 0; state < 512; state++)
252b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
253b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			if(transformCaptured[state])
254b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			{
255b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				device->GetTransform((D3DTRANSFORMSTATETYPE)state, &transform[state]);
256b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			}
257b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
258b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
259b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		if(viewportCaptured)
260b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
261b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			device->GetViewport(&viewport);
262b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
263b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
264b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int index = 0; index < 6; index++)
265b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
266b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			if(clipPlaneCaptured[index])
267b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			{
268b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				device->GetClipPlane(index, clipPlane[index]);
269b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			}
270b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
271b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
272b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		return D3D_OK;
273b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
274b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
275b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	long Direct3DStateBlock8::GetDevice(IDirect3DDevice8 **device)
276b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
277b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		TRACE("");
278b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
279b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		if(!device)
280b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
281b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			return INVALIDCALL();
282b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
283b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
284b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		this->device->AddRef();
285b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		*device = this->device;
286b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
287b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		return D3D_OK;
288b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
289b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
290b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::lightEnable(unsigned long index, int enable)
291b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
292b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		UNIMPLEMENTED();
293b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
294b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
295b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::setClipPlane(unsigned long index, const float *plane)
296b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
297b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		clipPlaneCaptured[index] = true;
298b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		clipPlane[index][0] = plane[0];
299b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		clipPlane[index][1] = plane[1];
300b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		clipPlane[index][2] = plane[2];
301b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		clipPlane[index][3] = plane[3];
302b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
303b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
304b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::setCurrentTexturePalette(unsigned int paletteNumber)
305b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
306b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		UNIMPLEMENTED();
307b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
308b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
309b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::setFVF(unsigned long FVF)
310b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
311b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		UNIMPLEMENTED();
312b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
313b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
314b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::setIndices(Direct3DIndexBuffer8 *indexData, unsigned int baseVertexIndex)
315b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
316b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		if(indexData) indexData->AddRef();
317b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
318b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		indexBufferCaptured = true;
319b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		indexBuffer = indexData;
320b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		this->baseVertexIndex = baseVertexIndex;
321b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
322b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
323b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::setLight(unsigned long index, const D3DLIGHT8 *light)
324b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
325b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		UNIMPLEMENTED();
326b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
327b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
328b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::setMaterial(const D3DMATERIAL8 *material)
329b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
330b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		UNIMPLEMENTED();
331b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
332b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
333b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::setPixelShader(unsigned long shaderHandle)
334b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
335b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		pixelShaderCaptured = true;
336b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		pixelShaderHandle = shaderHandle;
337b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
338b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
339b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::setPixelShaderConstant(unsigned int startRegister, const void *constantData, unsigned int count)
340b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
341b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		UNIMPLEMENTED();
342b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
343b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
344b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::setRenderState(D3DRENDERSTATETYPE state, unsigned long value)
345b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
346b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		renderStateCaptured[state] = true;
347b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		renderState[state] = value;
348b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
349b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
350b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::setScissorRect(const RECT *rect)
351b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
352b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		UNIMPLEMENTED();
353b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
354b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
355b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::setStreamSource(unsigned int stream, Direct3DVertexBuffer8 *data, unsigned int stride)
356b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
357b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		if(data) data->AddRef();
358b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
359b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		streamSourceCaptured[stream] = true;
360b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		streamSource[stream].vertexBuffer = data;
361b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		streamSource[stream].stride = stride;
362b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
363b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
364b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::setTexture(unsigned long stage, Direct3DBaseTexture8 *texture)
365b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
366b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		if(texture) texture->AddRef();
367b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
368b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		textureCaptured[stage] = true;
369b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		this->texture[stage] = texture;
370b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
371b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
372b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::setTextureStageState(unsigned long stage, D3DTEXTURESTAGESTATETYPE type, unsigned long value)
373b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
374b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		textureStageStateCaptured[stage][type] = true;
375b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		textureStageState[stage][type] = value;
376b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
377b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
378b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::setTransform(D3DTRANSFORMSTATETYPE state, const D3DMATRIX *matrix)
379b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
380b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		transformCaptured[state] = true;
381b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		transform[state] = *matrix;
382b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
383b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
384b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::setViewport(const D3DVIEWPORT8 *viewport)
385b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
386b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		viewportCaptured = true;
387b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		this->viewport = *viewport;
388b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
389b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
390b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::setVertexShader(unsigned long shaderHandle)
391b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
392b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		vertexShaderCaptured = true;
393b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		vertexShaderHandle = shaderHandle;
394b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
395b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
396b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::setVertexShaderConstant(unsigned int startRegister, const void *constantData, unsigned int count)
397b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
398b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		UNIMPLEMENTED();
399b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
400b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
401b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::clear()
402b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
403b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		// Erase capture flags
404b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		vertexShaderCaptured = false;
405b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		pixelShaderCaptured = false;
406b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		indexBufferCaptured = false;
407b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
408b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int state = 0; state < D3DRS_NORMALORDER + 1; state++)
409b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
410b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			renderStateCaptured[state] = false;
411b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
412b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
413b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int stage = 0; stage < 8; stage++)
414b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
415b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			for(int state = 0; state < D3DTSS_RESULTARG + 1; state++)
416b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			{
417b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				textureStageStateCaptured[stage][state] = false;
418b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			}
419b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
420b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
421b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int stream = 0; stream < 16; stream++)
422b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
423b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			streamSourceCaptured[stream] = false;
424b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
425b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
426b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int stage = 0; stage < 8; stage++)
427b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
428b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			textureCaptured[stage] = false;
429b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
430b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
431b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int state = 0; state < 512; state++)
432b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
433b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			transformCaptured[state] = false;
434b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
435b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
436b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		viewportCaptured = false;
437b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
438b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int index = 0; index < 6; index++)
439b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
440b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			clipPlaneCaptured[index] = false;
441b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
442b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
443b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		// Release resources
444b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		vertexShaderHandle = 0;
445b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		pixelShaderHandle = 0;
446b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
447b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		if(indexBuffer)
448b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
449b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			indexBuffer->Release();
450b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			indexBuffer = 0;
451b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
452b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
453b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int stream = 0; stream < 16; stream++)
454b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
455b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			if(streamSource[stream].vertexBuffer)
456b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			{
457b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				streamSource[stream].vertexBuffer->Release();
458b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				streamSource[stream].vertexBuffer = 0;
459b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			}
460b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
461b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
462b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int stage = 0; stage < 8; stage++)
463b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
464b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			if(texture[stage])
465b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			{
466b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				texture[stage]->Release();
467b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				texture[stage] = 0;
468b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			}
469b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
470b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
471b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
472b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::captureRenderState(D3DRENDERSTATETYPE state)
473b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
474b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		device->GetRenderState(state, &renderState[state]);
475b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		renderStateCaptured[state] = true;
476b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
477b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
478b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::captureTextureStageState(unsigned long stage, D3DTEXTURESTAGESTATETYPE type)
479b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
480b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		device->GetTextureStageState(stage, type, &textureStageState[stage][type]);
481b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		textureStageStateCaptured[stage][type] = true;
482b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
483b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
484b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::captureTransform(D3DTRANSFORMSTATETYPE state)
485b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
486b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		device->GetTransform(state, &transform[state]);
487b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		transformCaptured[state] = true;
488b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
489b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
490b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::capturePixelRenderStates()
491b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
492b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_ZENABLE);
493b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_FILLMODE);
494b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_SHADEMODE);
495b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_ZWRITEENABLE);
496b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_ALPHATESTENABLE);
497b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_LASTPIXEL);
498b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_SRCBLEND);
499b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_DESTBLEND);
500b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_ZFUNC);
501b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_ALPHAREF);
502b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_ALPHAFUNC);
503b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_DITHERENABLE);
504b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_FOGSTART);
505b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_FOGEND);
506b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_FOGDENSITY);
507b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_ALPHABLENDENABLE);
508b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_ZBIAS);
509b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_STENCILENABLE);
510b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_STENCILFAIL);
511b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_STENCILZFAIL);
512b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_STENCILPASS);
513b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_STENCILFUNC);
514b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_STENCILREF);
515b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_STENCILMASK);
516b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_STENCILWRITEMASK);
517b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_TEXTUREFACTOR);
518b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_WRAP0);
519b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_WRAP1);
520b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_WRAP2);
521b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_WRAP3);
522b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_WRAP4);
523b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_WRAP5);
524b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_WRAP6);
525b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_WRAP7);
526b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_COLORWRITEENABLE);
527b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_BLENDOP);
528b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
529b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
530b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::capturePixelTextureStates()
531b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
532b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int stage = 0; stage < 8; stage++)
533b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
534b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_COLOROP);
535b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_COLORARG1);
536b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_COLORARG2);
537b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_ALPHAOP);
538b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_ALPHAARG1);
539b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_ALPHAARG2);
540b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_BUMPENVMAT00);
541b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_BUMPENVMAT01);
542b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_BUMPENVMAT10);
543b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_BUMPENVMAT11);
544b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_TEXCOORDINDEX);
545b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_BUMPENVLSCALE);
546b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_BUMPENVLOFFSET);
547b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_TEXTURETRANSFORMFLAGS);
548b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_COLORARG0);
549b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_ALPHAARG0);
550b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_RESULTARG);
551b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
552b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_ADDRESSU);
553b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_ADDRESSV);
554b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_ADDRESSW);
555b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_BORDERCOLOR);
556b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_MAGFILTER);
557b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_MINFILTER);
558b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_MIPFILTER);
559b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_MIPMAPLODBIAS);
560b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_MAXMIPLEVEL);
561b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_MAXANISOTROPY);
562b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
563b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
564b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
565b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::capturePixelShaderStates()
566b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
567b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		pixelShaderCaptured = true;
568b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		device->GetPixelShader(&pixelShaderHandle);
569b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
570b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		device->GetPixelShaderConstant(0, pixelShaderConstant, 8);
571b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
572b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
573b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::captureVertexRenderStates()
574b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
575b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_CULLMODE);
576b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_FOGENABLE);
577b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_FOGCOLOR);
578b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_FOGTABLEMODE);
579b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_FOGSTART);
580b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_FOGEND);
581b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_FOGDENSITY);
582b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_RANGEFOGENABLE);
583b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_AMBIENT);
584b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_COLORVERTEX);
585b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_FOGVERTEXMODE);
586b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_CLIPPING);
587b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_LIGHTING);
588b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_LOCALVIEWER);
589b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_EMISSIVEMATERIALSOURCE);
590b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_AMBIENTMATERIALSOURCE);
591b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_DIFFUSEMATERIALSOURCE);
592b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_SPECULARMATERIALSOURCE);
593b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_VERTEXBLEND);
594b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_CLIPPLANEENABLE);
595b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_POINTSIZE);
596b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_POINTSIZE_MIN);
597b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_POINTSPRITEENABLE);
598b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_POINTSCALEENABLE);
599b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_POINTSCALE_A);
600b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_POINTSCALE_B);
601b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_POINTSCALE_C);
602b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_MULTISAMPLEANTIALIAS);
603b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_MULTISAMPLEMASK);
604b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_PATCHEDGESTYLE);
605b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_POINTSIZE_MAX);
606b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_INDEXEDVERTEXBLENDENABLE);
607b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_TWEENFACTOR);
608b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_NORMALIZENORMALS);
609b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_SPECULARENABLE);
610b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureRenderState(D3DRS_SHADEMODE);
611b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
612b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
613b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::captureVertexTextureStates()
614b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
615b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int stage = 0; stage < 8; stage++)
616b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
617b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_TEXCOORDINDEX);
618b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			captureTextureStageState(stage, D3DTSS_TEXTURETRANSFORMFLAGS);
619b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
620b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
621b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
622b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::captureLightStates()
623b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
624b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int index = 0; index < 8; index++)   // FIXME: Support unlimited index
625b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
626b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			device->GetLight(index, &light[index]);
627b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			lightCaptured[index] = true;
628b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
629b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
630b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int index = 0; index < 8; index++)   // FIXME: Support unlimited index
631b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
632b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			lightEnableState[index] = false;
633b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			device->GetLightEnable(index, &lightEnableState[index]);
634b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			lightEnableCaptured[index] = true;
635b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
636b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
637b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
638b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::captureVertexShaderStates()
639b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
640b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		vertexShaderCaptured = true;
641b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		device->GetVertexShader(&vertexShaderHandle);
642b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
643b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		device->GetVertexShaderConstant(0, vertexShaderConstant[0], 256);
644b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
645b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
646b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::captureTextures()
647b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
648b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int sampler = 0; sampler < 8; sampler++)
649b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
650b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			textureCaptured[sampler] = true;
651b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			device->GetTexture(sampler, reinterpret_cast<IDirect3DBaseTexture8**>(&texture[sampler]));
652b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
653b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			if(texture[sampler])
654b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			{
655b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				texture[sampler]->bind();
656b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				texture[sampler]->Release();
657b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			}
658b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
659b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
660b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
661b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::captureVertexTextures()
662b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
663b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		// FIXME
664b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
665b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
666b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::captureDisplacementTextures()
667b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
668b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		// FIXME
669b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
670b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
671b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::captureTexturePalette()
672b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
673b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		paletteNumberCaptured = true;
674b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		device->GetCurrentTexturePalette(&paletteNumber);
675b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
676b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
677b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::captureVertexStreams()
678b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
679b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int stream = 0; stream < 16; stream++)
680b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
681b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			streamSourceCaptured[stream] = true;
682b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			device->GetStreamSource(stream, reinterpret_cast<IDirect3DVertexBuffer8**>(&streamSource[stream].vertexBuffer),  &streamSource[stream].stride);
683b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
684b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			if(streamSource[stream].vertexBuffer)
685b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			{
686b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				streamSource[stream].vertexBuffer->bind();
687b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens				streamSource[stream].vertexBuffer->Release();
688b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			}
689b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
690b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
691b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
692b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::captureIndexBuffer()
693b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
694b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		indexBufferCaptured = true;
695b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		device->GetIndices(reinterpret_cast<IDirect3DIndexBuffer8**>(&indexBuffer), &baseVertexIndex);
696b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
697b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		if(indexBuffer)
698b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
699b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			indexBuffer->bind();
700b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			indexBuffer->Release();
701b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
702b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
703b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
704b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::captureViewport()
705b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
706b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		device->GetViewport(&viewport);
707b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		viewportCaptured = true;
708b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
709b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
710b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::captureTransforms()
711b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
712b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureTransform(D3DTS_VIEW);
713b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureTransform(D3DTS_PROJECTION);
714b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureTransform(D3DTS_WORLD);
715b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
716b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
717b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::captureTextureTransforms()
718b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
719b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureTransform(D3DTS_TEXTURE0);
720b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureTransform(D3DTS_TEXTURE1);
721b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureTransform(D3DTS_TEXTURE2);
722b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureTransform(D3DTS_TEXTURE3);
723b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureTransform(D3DTS_TEXTURE4);
724b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureTransform(D3DTS_TEXTURE5);
725b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureTransform(D3DTS_TEXTURE6);
726b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		captureTransform(D3DTS_TEXTURE7);
727b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
728b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
729b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::captureClippingPlanes()
730b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
731b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		for(int index = 0; index < 6; index++)
732b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		{
733b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			device->GetClipPlane(index, (float*)&clipPlane[index]);
734b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens			clipPlaneCaptured[index] = true;
735b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		}
736b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
737b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens
738b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	void Direct3DStateBlock8::captureMaterial()
739b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	{
740b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		device->GetMaterial(&material);
741b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens		materialCaptured = true;
742b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens	}
743b2c87ab1e7182a2b2616ba73ff5a9179db6f90a6Nicolas Capens}