1d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens//
3d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Licensed under the Apache License, Version 2.0 (the "License");
4d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// you may not use this file except in compliance with the License.
5d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// You may obtain a copy of the License at
6d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens//
7d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens//    http://www.apache.org/licenses/LICENSE-2.0
8d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens//
9d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Unless required by applicable law or agreed to in writing, software
10d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// distributed under the License is distributed on an "AS IS" BASIS,
11d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// See the License for the specific language governing permissions and
13d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// limitations under the License.
14d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
15d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Direct3DDevice9.hpp"
16d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
17d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Direct3D9.hpp"
18d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Direct3DSurface9.hpp"
19d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Direct3DIndexBuffer9.hpp"
20d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Direct3DVertexBuffer9.hpp"
21d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Direct3DTexture9.hpp"
22d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Direct3DVolumeTexture9.hpp"
23d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Direct3DCubeTexture9.hpp"
24d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Direct3DVertexDeclaration9.hpp"
25d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Direct3DSwapChain9.hpp"
26d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Direct3DPixelShader9.hpp"
27d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Direct3DVertexShader9.hpp"
28d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Direct3DStateBlock9.hpp"
29d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Direct3DQuery9.hpp"
30d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Direct3DVolume9.hpp"
31d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
32d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Debug.hpp"
33d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Capabilities.hpp"
34d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Math.hpp"
35d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Renderer.hpp"
36d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Config.hpp"
37d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "FrameBuffer.hpp"
38d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Clipper.hpp"
39d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Configurator.hpp"
40d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Timer.hpp"
41d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Resource.hpp"
42d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
43d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include <assert.h>
44d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
45d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensbool localShaderConstants = true;
46d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
47d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensnamespace D3D9
48d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{
49d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	inline unsigned long FtoDW(float f)
50d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
51d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return (unsigned long&)f;
52d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
53d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
54d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	Direct3DDevice9::Direct3DDevice9(const HINSTANCE instance, Direct3D9 *d3d9, unsigned int adapter, D3DDEVTYPE deviceType, HWND focusWindow, unsigned long behaviourFlags, D3DPRESENT_PARAMETERS *presentParameters) : instance(instance), adapter(adapter), d3d9(d3d9), deviceType(deviceType), focusWindow(focusWindow), behaviourFlags(behaviourFlags)
55d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
56d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		InitializeCriticalSection(&criticalSection);
57d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
58d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		init = true;
59d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		stateRecorder = 0;
60d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
61d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		d3d9->AddRef();
62d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
63d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		context = new sw::Context();
64d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		renderer = new sw::Renderer(context, sw::Direct3D, false);
65d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
66d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		swapChain = 0;
67d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		depthStencil = 0;
68d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		autoDepthStencil = 0;
69d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		renderTarget[0] = 0;
70d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		renderTarget[1] = 0;
71d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		renderTarget[2] = 0;
72d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		renderTarget[3] = 0;
73d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
74d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(int i = 0; i < 16 + 4; i++)
75d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
76d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			texture[i] = 0;
77d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
78d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
79d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		cursor = 0;
80d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
81d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Reset(presentParameters);
82d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
83d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		pixelShader = 0;
84d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		vertexShader = 0;
85d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
86d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		lightsDirty = true;
87d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		pixelShaderDirty = true;
88d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		pixelShaderConstantsBDirty = 0;
89d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		pixelShaderConstantsFDirty = 0;
90d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		pixelShaderConstantsIDirty = 0;
91d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		vertexShaderDirty = true;
92d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		vertexShaderConstantsBDirty = 0;
93d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		vertexShaderConstantsFDirty = 0;
94d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		vertexShaderConstantsIDirty = 0;
95d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
96502836a8df8985544667325ad0fb44d3ac0f40e3Nicolas Capens		for(int i = 0; i < MAX_VERTEX_INPUTS; i++)
97d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
98d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			dataStream[i] = 0;
99d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			streamStride[i] = 0;
100d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			streamOffset[i] = 0;
101d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
102d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			streamSourceFreq[i] = 1;
103d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
104d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
105d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		indexData = 0;
106d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		vertexDeclaration = 0;
107d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
108d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		D3DMATERIAL9 material;
109d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
110d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		material.Diffuse.r = 1.0f;
111d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		material.Diffuse.g = 1.0f;
112d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		material.Diffuse.b = 1.0f;
113d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		material.Diffuse.a = 0.0f;
114d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		material.Ambient.r = 0.0f;
115d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		material.Ambient.g = 0.0f;
116d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		material.Ambient.b = 0.0f;
117d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		material.Ambient.a = 0.0f;
118d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		material.Emissive.r = 0.0f;
119d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		material.Emissive.g = 0.0f;
120d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		material.Emissive.b = 0.0f;
121d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		material.Emissive.a = 0.0f;
122d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		material.Specular.r = 0.0f;
123d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		material.Specular.g = 0.0f;
124d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		material.Specular.b = 0.0f;
125d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		material.Specular.a = 0.0f;
126d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		material.Power = 0.0f;
127d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
128d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetMaterial(&material);
129d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
130d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		D3DMATRIX identity = {1, 0, 0, 0,
131d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		                      0, 1, 0, 0,
132d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		                      0, 0, 1, 0,
133d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		                      0, 0, 0, 1};
134d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
135d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetTransform(D3DTS_VIEW, &identity);
136d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetTransform(D3DTS_PROJECTION, &identity);
137d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetTransform(D3DTS_TEXTURE0, &identity);
138d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetTransform(D3DTS_TEXTURE1, &identity);
139d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetTransform(D3DTS_TEXTURE2, &identity);
140d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetTransform(D3DTS_TEXTURE3, &identity);
141d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetTransform(D3DTS_TEXTURE4, &identity);
142d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetTransform(D3DTS_TEXTURE5, &identity);
143d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetTransform(D3DTS_TEXTURE6, &identity);
144d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetTransform(D3DTS_TEXTURE7, &identity);
145d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
146d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(int i = 0; i < 12; i++)
147d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
148d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetTransform(D3DTS_WORLDMATRIX(i), &identity);
149d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
150d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
151d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(int i = 0; i < MAX_PIXEL_SHADER_CONST; i++)
152d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
153d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			float zero[4] = {0, 0, 0, 0};
154d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
155d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetPixelShaderConstantF(i, zero, 1);
156d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
157d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
158d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(int i = 0; i < MAX_VERTEX_SHADER_CONST; i++)
159d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
160d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			float zero[4] = {0, 0, 0, 0};
161d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
162d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetVertexShaderConstantF(i, zero, 1);
163d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
164d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
165d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(int i = 0; i < 16; i++)
166d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
167d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			int zero[4] = {0, 0, 0, 0};
168d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
169d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetPixelShaderConstantI(i, zero, 1);
170d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetVertexShaderConstantI(i, zero, 1);
171d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetPixelShaderConstantB(i, &zero[0], 1);
172d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetVertexShaderConstantB(i, &zero[0], 1);
173d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
174d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
175d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		init = false;
176d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
177d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!(behaviourFlags & D3DCREATE_FPU_PRESERVE))
178d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
179d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			configureFPU();
180d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
181d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
182d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		instancingEnabled = pixelShaderVersionX >= D3DPS_VERSION(3, 0);
183d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
184d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
185d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	Direct3DDevice9::~Direct3DDevice9()
186d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
187d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		delete renderer;
188d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		renderer = 0;
189d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		delete context;
190d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		context = 0;
191d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
192d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		d3d9->Release();
193d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		d3d9 = 0;
194d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
195d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		swapChain->unbind();
196d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		swapChain = 0;
197d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
198d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(depthStencil)
199d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
200d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			depthStencil->unbind();
201d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			depthStencil = 0;
202d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
203d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
204d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(autoDepthStencil)
205d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
206d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			autoDepthStencil->unbind();
207d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			autoDepthStencil = 0;
208d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
209d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
210d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(int index = 0; index < 4; index++)
211d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
212d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(renderTarget[index])
213d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
214d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderTarget[index]->unbind();
215d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderTarget[index] = 0;
216d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
217d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
218d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
219d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(vertexDeclaration)
220d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
221d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			vertexDeclaration->unbind();
222d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			vertexDeclaration = 0;
223d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
224d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
225d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(int i = 0; i < 16 + 4; i++)
226d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
227d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(texture[i])
228d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
229d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				texture[i]->unbind();
230d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				texture[i] = 0;
231d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
232d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
233d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
234502836a8df8985544667325ad0fb44d3ac0f40e3Nicolas Capens		for(int i = 0; i < MAX_VERTEX_INPUTS; i++)
235d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
236d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(dataStream[i])
237d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
238d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				dataStream[i]->unbind();
239d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				dataStream[i] = 0;
240d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
241d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
242d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
243d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(indexData)
244d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
245d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			indexData->unbind();
246d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			indexData = 0;
247d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
248d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
249d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(pixelShader)
250d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
251d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			pixelShader->unbind();
252d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			pixelShader = 0;
253d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
254d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
255d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(vertexShader)
256d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
257d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			vertexShader->unbind();
258d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			vertexShader = 0;
259d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
260d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
261d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(stateRecorder)
262d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
263d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->unbind();
264d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder = 0;
265d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
266d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
267d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		palette.clear();
268d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
269d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		delete cursor;
270d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
271d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		DeleteCriticalSection(&criticalSection);
272d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
273d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
274d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::QueryInterface(const IID &iid, void **object)
275d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
276d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
277d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
278d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("const IID &iid = 0x%0.8p, void **object = 0x%0.8p", iid, object);
279d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
280d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(iid == IID_IDirect3DDevice9 ||
281d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		   iid == IID_IUnknown)
282d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
283d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			AddRef();
284d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			*object = this;
285d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
286d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return S_OK;
287d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
288d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
289d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*object = 0;
290d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
291d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return NOINTERFACE(iid);
292d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
293d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
294d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	unsigned long Direct3DDevice9::AddRef()
295d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
296d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("void");
297d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
298d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return Unknown::AddRef();
299d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
300d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
301d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	unsigned long Direct3DDevice9::Release()
302d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
303d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("void");
304d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
305d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return Unknown::Release();
306d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
307d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
308d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::BeginScene()
309d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
310d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
311d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
312d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("void");
313d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
314d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
315d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
316d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
317d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::BeginStateBlock()
318d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
319d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
320d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
321d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("void");
322d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
323d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(stateRecorder)
324d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
325d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
326d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
327d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
328d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		stateRecorder = new Direct3DStateBlock9(this, (D3DSTATEBLOCKTYPE)0);
329d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
330d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
331d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
332d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return OUTOFMEMORY();
333d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
334d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
335d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		stateRecorder->bind();
336d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
337d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
338d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
339d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
340d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::Clear(unsigned long count, const D3DRECT *rects, unsigned long flags, unsigned long color, float z, unsigned long stencil)
341d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
342d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
343d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
344d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned long count = %d, const D3DRECT *rects = 0x%0.8p, unsigned long flags = 0x%0.8X, unsigned long color = 0x%0.8X, float z = %f, unsigned long stencil = %d", count, rects, flags, color, z, stencil);
345d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
346d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(rects == 0 && count != 0)
347d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
348d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
349d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
350d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
351d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(flags & (D3DCLEAR_ZBUFFER | D3DCLEAR_STENCIL) && !depthStencil)
352d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
353d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
354d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
355d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
356d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(flags & D3DCLEAR_STENCIL)   // Check for stencil component
357d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
358d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			D3DSURFACE_DESC description;
359d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			depthStencil->GetDesc(&description);
360d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
361d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			switch(description.Format)
362d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
363d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_D15S1:
364d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_D24S8:
365d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_D24X8:
366d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_D24X4S4:
367d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_D24FS8:
368d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_S8_LOCKABLE:   // FIXME: INVALIDCALL when trying to clear depth?
369d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_DF24:
370d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_DF16:
371d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_INTZ:
372d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
373d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_D16_LOCKABLE:
374d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_D32:
375d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_D16:
376d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_D32F_LOCKABLE:
377d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_D32_LOCKABLE:
378d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				return INVALIDCALL();
379d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			default:
380d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				ASSERT(false);
381d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
382d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
383d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
384d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!rects)
385d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
386d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			count = 1;
387d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
388d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			D3DRECT rect;
389d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			rect.x1 = viewport.X;
390d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			rect.x2 = viewport.X + viewport.Width;
391d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			rect.y1 = viewport.Y;
392d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			rect.y2 = viewport.Y + viewport.Height;
393d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
394d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			rects = &rect;
395d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
396d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
397d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(unsigned int i = 0; i < count; i++)
398d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
399d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sw::SliceRect clearRect(rects[i].x1, rects[i].y1, rects[i].x2, rects[i].y2, 0);
400d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
401d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			clearRect.clip(viewport.X, viewport.Y, viewport.X + viewport.Width, viewport.Y + viewport.Height);
402d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
403d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(scissorEnable)
404d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
405d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				clearRect.clip(scissorRect.left, scissorRect.top, scissorRect.right, scissorRect.bottom);
406d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
407d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
408d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(flags & D3DCLEAR_TARGET)
409d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
410d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				for(int index = 0; index < 4; index++)
411d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
412d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					if(renderTarget[index])
413d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					{
414d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						D3DSURFACE_DESC description;
415d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						renderTarget[index]->GetDesc(&description);
416d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
417d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						float rgba[4];
418d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						rgba[0] = (float)(color & 0x00FF0000) / 0x00FF0000;
419d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						rgba[1] = (float)(color & 0x0000FF00) / 0x0000FF00;
420d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						rgba[2] = (float)(color & 0x000000FF) / 0x000000FF;
421d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						rgba[3] = (float)(color & 0xFF000000) / 0xFF000000;
422d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
423d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						if(renderState[D3DRS_SRGBWRITEENABLE] != FALSE && index == 0 && Capabilities::isSRGBwritable(description.Format))
424d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						{
425d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							rgba[0] = sw::linearToSRGB(rgba[0]);
426d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							rgba[1] = sw::linearToSRGB(rgba[1]);
427d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							rgba[2] = sw::linearToSRGB(rgba[2]);
428d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						}
429d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
430d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						renderer->clear(rgba, sw::FORMAT_A32B32G32R32F, renderTarget[index], clearRect, 0xF);
431d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					}
432d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
433d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
434d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
435d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(flags & D3DCLEAR_ZBUFFER)
436d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
437d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				z = sw::clamp01(z);
438d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				depthStencil->clearDepth(z, clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height());
439d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
440d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
441d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(flags & D3DCLEAR_STENCIL)
442d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
443d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				depthStencil->clearStencil(stencil, 0xFF, clearRect.x0, clearRect.y0, clearRect.width(), clearRect.height());
444d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
445d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
446d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
447d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
448d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
449d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
450d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::ColorFill(IDirect3DSurface9 *surface, const RECT *rect, D3DCOLOR color)
451d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
452d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
453d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
454d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("IDirect3DSurface9 *surface = 0x%0.8p, const RECT *rect = 0x%0.8p, D3DCOLOR color = 0x%0.8X", surface, rect, color);
455d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
456d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!surface)
457d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
458d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
459d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
460d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
461d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		D3DSURFACE_DESC description;
462d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
463d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		surface->GetDesc(&description);
464d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
465d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(description.Pool != D3DPOOL_DEFAULT)
466d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
467d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
468d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
469d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
470d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!rect)
471d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
472d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			RECT lock;
473d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
474d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			lock.left = 0;
475d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			lock.top = 0;
476d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			lock.right = description.Width;
477d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			lock.bottom = description.Height;
478d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
479d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			rect = &lock;
480d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
481d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
482d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static_cast<Direct3DSurface9*>(surface)->fill(color, rect->left, rect->top, rect->right - rect->left, rect->bottom - rect->top);
483d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
484d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
485d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
486d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
487d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::CreateAdditionalSwapChain(D3DPRESENT_PARAMETERS *presentParameters, IDirect3DSwapChain9 **swapChain)
488d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
489d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
490d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
491d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("D3DPRESENT_PARAMETERS *presentParameters = 0x%0.8p, IDirect3DSwapChain9 **swapChain = 0x%0.8p", presentParameters, swapChain);
492d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
493d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!swapChain)
494d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
495d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
496d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
497d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
498d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*swapChain = 0;
499d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
500d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!presentParameters)
501d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
502d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
503d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
504d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
505d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(presentParameters->BackBufferCount > 3)
506d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
507d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();   // Maximum of three back buffers
508d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
509d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
510d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*swapChain = new Direct3DSwapChain9(this, presentParameters);
511d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
512d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!*swapChain)
513d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
514d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return OUTOFMEMORY();
515d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
516d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
517d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(GetAvailableTextureMem() == 0)
518d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
519d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			delete *swapChain;
520d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			*swapChain = 0;
521d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
522d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return OUTOFVIDEOMEMORY();
523d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
524d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
525d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		(*swapChain)->AddRef();
526d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
527d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
528d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
529d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
530d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::CreateCubeTexture(unsigned int edgeLength, unsigned int levels, unsigned long usage, D3DFORMAT format, D3DPOOL pool, IDirect3DCubeTexture9 **cubeTexture, void **sharedHandle)
531d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
532d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
533d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
534d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int edgeLength = %d, unsigned int levels = %d, unsigned long usage = %d, D3DFORMAT format = %d, D3DPOOL pool = %d, IDirect3DCubeTexture9 **cubeTexture = 0x%0.8p, void **sharedHandle = 0x%0.8p", edgeLength, levels, usage, format, pool, cubeTexture, sharedHandle);
535d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
536d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*cubeTexture = 0;
537d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
538d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(edgeLength == 0 || (usage & D3DUSAGE_AUTOGENMIPMAP && levels > 1) || d3d9->CheckDeviceFormat(adapter, deviceType, D3DFMT_X8R8G8B8, usage, D3DRTYPE_CUBETEXTURE, format) != D3D_OK)
539d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
540d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
541d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
542d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
543d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*cubeTexture = new Direct3DCubeTexture9(this, edgeLength, levels, usage, format, pool);
544d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
545d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!*cubeTexture)
546d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
547d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return OUTOFMEMORY();
548d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
549d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
550d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(GetAvailableTextureMem() == 0)
551d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
552d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			delete *cubeTexture;
553d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			*cubeTexture = 0;
554d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
555d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return OUTOFVIDEOMEMORY();
556d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
557d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
558d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		(*cubeTexture)->AddRef();
559d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
560d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
561d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
562d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
563d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::CreateDepthStencilSurface(unsigned int width, unsigned int height, D3DFORMAT format, D3DMULTISAMPLE_TYPE multiSample, unsigned long multiSampleQuality, int discard, IDirect3DSurface9 **surface, void **sharedHandle)
564d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
565d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
566d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
567d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int width = %d, unsigned int height = %d, D3DFORMAT format = %d, D3DMULTISAMPLE_TYPE multiSample = %d, unsigned long multiSampleQuality = %d, int discard = %d, IDirect3DSurface9 **surface = 0x%0.8p, void **sharedHandle = 0x%0.8p", width, height, format, multiSample, multiSampleQuality, discard, surface, sharedHandle);
568d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
569d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*surface = 0;
570d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
571d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(width == 0 || height == 0 || d3d9->CheckDeviceFormat(adapter, deviceType, D3DFMT_X8R8G8B8, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, format) != D3D_OK || height > sw::OUTLINE_RESOLUTION)
572d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
573d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
574d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
575d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
576d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool lockable = false;
577d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
578d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		switch(format)
579d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
580d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DFMT_D15S1:
581d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DFMT_D24S8:
582d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DFMT_D24X8:
583d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DFMT_D24X4S4:
584d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DFMT_D24FS8:
585d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DFMT_D32:
586d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DFMT_D16:
587d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DFMT_DF24:
588d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DFMT_DF16:
589d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DFMT_INTZ:
590d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			lockable = false;
591d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			break;
592d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DFMT_S8_LOCKABLE:
593d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DFMT_D16_LOCKABLE:
594d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DFMT_D32F_LOCKABLE:
595d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DFMT_D32_LOCKABLE:
596d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			lockable = true;
597d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			break;
598d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		default:
599d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			ASSERT(false);
600d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
601d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
602d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*surface = new Direct3DSurface9(this, this, width, height, format, D3DPOOL_DEFAULT, multiSample, multiSampleQuality, lockable, D3DUSAGE_DEPTHSTENCIL);
603d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
604d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!*surface)
605d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
606d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return OUTOFMEMORY();
607d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
608d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
609d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(GetAvailableTextureMem() == 0)
610d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
611d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			delete *surface;
612d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			*surface = 0;
613d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
614d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return OUTOFVIDEOMEMORY();
615d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
616d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
617d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		(*surface)->AddRef();
618d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
619d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
620d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
621d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
622d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::CreateIndexBuffer(unsigned int length, unsigned long usage, D3DFORMAT format, D3DPOOL pool, IDirect3DIndexBuffer9 **indexBuffer, void **sharedHandle)
623d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
624d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
625d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
626d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int length = %d, unsigned long usage = %d, D3DFORMAT format = %d, D3DPOOL pool = %d, IDirect3DIndexBuffer9 **indexBuffer = 0x%0.8p, void **sharedHandle = 0x%0.8p", length, usage, format, pool, indexBuffer, sharedHandle);
627d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
628d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*indexBuffer = new Direct3DIndexBuffer9(this, length, usage, format, pool);
629d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
630d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!*indexBuffer)
631d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
632d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return OUTOFMEMORY();
633d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
634d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
635d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(GetAvailableTextureMem() == 0)
636d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
637d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			delete *indexBuffer;
638d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			*indexBuffer = 0;
639d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
640d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return OUTOFVIDEOMEMORY();
641d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
642d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
643d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		(*indexBuffer)->AddRef();
644d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
645d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
646d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
647d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
648d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::CreateOffscreenPlainSurface(unsigned int width, unsigned int height, D3DFORMAT format, D3DPOOL pool, IDirect3DSurface9 **surface, void **sharedHandle)
649d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
650d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
651d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
652d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int width = %d, unsigned int height = %d, D3DFORMAT format = %d, D3DPOOL pool = %d, IDirect3DSurface9 **surface = 0x%0.8p, void **sharedHandle = 0x%0.8p", width, height, format, pool, surface, sharedHandle);
653d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
654d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*surface = 0;
655d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
656d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(width == 0 || height == 0 || d3d9->CheckDeviceFormat(adapter, deviceType, D3DFMT_X8R8G8B8, 0, D3DRTYPE_SURFACE, format) != D3D_OK)   // FIXME: Allow all formats supported by runtime/REF
657d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
658d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
659d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
660d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
661d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(pool == D3DPOOL_MANAGED)
662d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
663d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
664d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
665d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
666d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*surface = new Direct3DSurface9(this, this, width, height, format, pool, D3DMULTISAMPLE_NONE, 0, true, 0);
667d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
668d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!*surface)
669d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
670d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return OUTOFMEMORY();
671d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
672d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
673d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(GetAvailableTextureMem() == 0)
674d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
675d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			delete *surface;
676d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			*surface = 0;
677d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
678d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return OUTOFVIDEOMEMORY();
679d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
680d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
681d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		(*surface)->AddRef();
682d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
683d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
684d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
685d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
686d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::CreatePixelShader(const unsigned long *function, IDirect3DPixelShader9 **shader)
687d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
688d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
689d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
690d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("const unsigned long *function = 0x%0.8p, IDirect3DPixelShader9 **shader = 0x%0.8p", function, shader);
691d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
692d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!shader)
693d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
694d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
695d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
696d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
697d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*shader = 0;
698d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
699d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!sw::PixelShader::validate(function) || function[0] > pixelShaderVersionX)
700d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
701d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();   // Shader contains unsupported operations
702d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
703d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
704d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*shader = new Direct3DPixelShader9(this, function);
705d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
706d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!*shader)
707d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
708d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return OUTOFMEMORY();
709d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
710d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
711d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		(*shader)->AddRef();
712d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
713d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
714d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
715d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
716d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::CreateQuery(D3DQUERYTYPE type, IDirect3DQuery9 **query)
717d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
718d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
719d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
720d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("D3DQUERYTYPE type = %d, IDirect3DQuery9 **query = 0x%0.8p", type, query);
721d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
722d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(query == 0)   // Support checked
723d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
724d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			switch(type)
725d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
726d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_VCACHE:				return D3D_OK;
727d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_RESOURCEMANAGER:		return NOTAVAILABLE();
728d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_VERTEXSTATS:			return NOTAVAILABLE();
729d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_EVENT:				return D3D_OK;
730d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_OCCLUSION:			return D3D_OK;
731d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_TIMESTAMP:			return D3D_OK;
732d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_TIMESTAMPDISJOINT:	return D3D_OK;
733d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_TIMESTAMPFREQ:		return D3D_OK;
734d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_PIPELINETIMINGS:		return NOTAVAILABLE();
735d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_INTERFACETIMINGS:		return NOTAVAILABLE();
736d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_VERTEXTIMINGS:		return NOTAVAILABLE();
737d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_PIXELTIMINGS:			return NOTAVAILABLE();
738d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_BANDWIDTHTIMINGS:		return NOTAVAILABLE();
739d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_CACHEUTILIZATION:		return NOTAVAILABLE();
740d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			default:								ASSERT(false);   return NOTAVAILABLE();
741d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
742d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
743d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
744d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
745d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			switch(type)
746d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
747d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_VCACHE:				break;
748d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_RESOURCEMANAGER:		return NOTAVAILABLE();
749d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_VERTEXSTATS:			return NOTAVAILABLE();
750d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_EVENT:				break;
751d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_OCCLUSION:			break;
752d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_TIMESTAMP:			break;
753d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_TIMESTAMPDISJOINT:	break;
754d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_TIMESTAMPFREQ:		break;
755d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_PIPELINETIMINGS:		return NOTAVAILABLE();
756d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_INTERFACETIMINGS:		return NOTAVAILABLE();
757d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_VERTEXTIMINGS:		return NOTAVAILABLE();
758d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_PIXELTIMINGS:			return NOTAVAILABLE();
759d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_BANDWIDTHTIMINGS:		return NOTAVAILABLE();
760d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DQUERYTYPE_CACHEUTILIZATION:		return NOTAVAILABLE();
761d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			default:								ASSERT(false);   return NOTAVAILABLE();
762d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
763d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
764d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			*query = new Direct3DQuery9(this, type);
765d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
766d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(!*query)
767d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
768d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				return OUTOFMEMORY();
769d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
770d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
771d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			(*query)->AddRef();
772d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
773d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return D3D_OK;
774d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
775d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
776d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
777d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::CreateRenderTarget(unsigned int width, unsigned int height, D3DFORMAT format, D3DMULTISAMPLE_TYPE multiSample, unsigned long multiSampleQuality, int lockable, IDirect3DSurface9 **surface, void **sharedHandle)
778d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
779d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
780d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
781d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int width = %d, unsigned int height = %d, D3DFORMAT format = %d, D3DMULTISAMPLE_TYPE multiSample = %d, unsigned long multiSampleQuality = %d, int lockable = %d, IDirect3DSurface9 **surface = 0x%0.8p, void **sharedHandle = 0x%0.8p", width, height, format, multiSample, multiSampleQuality, lockable, surface, sharedHandle);
782d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
783d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*surface = 0;
784d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
785d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(width == 0 || height == 0 || d3d9->CheckDeviceFormat(adapter, deviceType, D3DFMT_X8R8G8B8, D3DUSAGE_RENDERTARGET, D3DRTYPE_SURFACE, format) != D3D_OK || height > sw::OUTLINE_RESOLUTION)
786d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
787d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
788d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
789d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
790d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*surface = new Direct3DSurface9(this, this, width, height, format, D3DPOOL_DEFAULT, multiSample, multiSampleQuality, lockable != FALSE, D3DUSAGE_RENDERTARGET);
791d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
792d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!*surface)
793d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
794d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return OUTOFMEMORY();
795d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
796d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
797d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(GetAvailableTextureMem() == 0)
798d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
799d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			delete *surface;
800d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			*surface = 0;
801d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
802d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return OUTOFVIDEOMEMORY();
803d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
804d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
805d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		(*surface)->AddRef();
806d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
807d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
808d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
809d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
810d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::CreateStateBlock(D3DSTATEBLOCKTYPE type, IDirect3DStateBlock9 **stateBlock)
811d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
812d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
813d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
814d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("D3DSTATEBLOCKTYPE type = %d, IDirect3DStateBlock9 **stateBlock = 0x%0.8p", type, stateBlock);
815d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
816d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*stateBlock = new Direct3DStateBlock9(this, type);
817d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
818d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!*stateBlock)
819d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
820d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return OUTOFMEMORY();
821d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
822d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
823d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		(*stateBlock)->AddRef();
824d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
825d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
826d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
827d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
828d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::CreateTexture(unsigned int width, unsigned int height, unsigned int levels, unsigned long usage, D3DFORMAT format, D3DPOOL pool, IDirect3DTexture9 **texture, void **sharedHandle)
829d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
830d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
831d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
832d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int width = %d, unsigned int height = %d, unsigned int levels = %d, unsigned long usage = %d, D3DFORMAT format = %d, D3DPOOL pool = %d, IDirect3DTexture9 **texture = 0x%0.8p, void **sharedHandle = 0x%0.8p", width, height, levels, usage, format, pool, texture, sharedHandle);
833d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
834d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*texture = 0;
835d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
836d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(width == 0 || height == 0 || (usage & D3DUSAGE_AUTOGENMIPMAP && levels > 1) || d3d9->CheckDeviceFormat(adapter, deviceType, D3DFMT_X8R8G8B8, usage, D3DRTYPE_TEXTURE, format) != D3D_OK)
837d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
838d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
839d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
840d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
841d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*texture = new Direct3DTexture9(this, width, height, levels, usage, format, pool);
842d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
843d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!*texture)
844d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
845d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return OUTOFMEMORY();
846d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
847d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
848d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(GetAvailableTextureMem() == 0)
849d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
850d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			delete *texture;
851d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			*texture = 0;
852d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
853d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return OUTOFVIDEOMEMORY();
854d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
855d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
856d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		(*texture)->AddRef();
857d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
858d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
859d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
860d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
861d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::CreateVertexBuffer(unsigned int length, unsigned long usage, unsigned long FVF, D3DPOOL pool, IDirect3DVertexBuffer9 **vertexBuffer, void **sharedHandle)
862d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
863d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
864d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
865d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int length = %d, unsigned long usage = %d, unsigned long FVF = 0x%0.8X, D3DPOOL pool = %d, IDirect3DVertexBuffer9 **vertexBuffer = 0x%0.8p, void **sharedHandle = 0x%0.8p", length, usage, FVF, pool, vertexBuffer, sharedHandle);
866d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
867d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*vertexBuffer = new Direct3DVertexBuffer9(this, length, usage, FVF, pool);
868d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
869d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!*vertexBuffer)
870d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
871d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return OUTOFMEMORY();
872d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
873d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
874d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(GetAvailableTextureMem() == 0)
875d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
876d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			delete *vertexBuffer;
877d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			*vertexBuffer = 0;
878d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
879d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return OUTOFVIDEOMEMORY();
880d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
881d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
882d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		(*vertexBuffer)->AddRef();
883d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
884d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
885d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
886d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
887d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::CreateVertexDeclaration(const D3DVERTEXELEMENT9 *vertexElements, IDirect3DVertexDeclaration9 **declaration)
888d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
889d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
890d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
891d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("const D3DVERTEXELEMENT9 *vertexElements = 0x%0.8p, IDirect3DVertexDeclaration9 **declaration = 0x%0.8p", vertexElements, declaration);
892d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
893d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!declaration)
894d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
895d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
896d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
897d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
898d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		const D3DVERTEXELEMENT9 *element = vertexElements;
899d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
900d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		while(element->Stream != 0xFF)
901d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
902d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(element->Type > D3DDECLTYPE_UNUSED)   // FIXME: Check other fields too
903d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
904d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				return FAIL();
905d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
906d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
907d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			element++;
908d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
909d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
910d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*declaration = new Direct3DVertexDeclaration9(this, vertexElements);
911d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
912d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!*declaration)
913d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
914d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return OUTOFMEMORY();
915d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
916d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
917d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		(*declaration)->AddRef();
918d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
919d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
920d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
921d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
922d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::CreateVertexShader(const unsigned long *function, IDirect3DVertexShader9 **shader)
923d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
924d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
925d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
926d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("const unsigned long *function = 0x%0.8p, IDirect3DVertexShader9 **shader = 0x%0.8p", function, shader);
927d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
928d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!shader)
929d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
930d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
931d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
932d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
933d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*shader = 0;
934d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
935d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!sw::VertexShader::validate(function) || function[0] > vertexShaderVersionX)
936d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
937d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();   // Shader contains unsupported operations
938d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
939d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
940d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*shader = new Direct3DVertexShader9(this, function);
941d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
942d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!*shader)
943d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
944d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return OUTOFMEMORY();
945d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
946d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
947d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		(*shader)->AddRef();
948d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
949d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
950d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
951d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
952d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::CreateVolumeTexture(unsigned int width, unsigned int height, unsigned int depth, unsigned int levels, unsigned long usage, D3DFORMAT format, D3DPOOL pool, IDirect3DVolumeTexture9 **volumeTexture, void **sharedHandle)
953d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
954d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
955d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
956d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int width = %d, unsigned int height = %d, unsigned int depth = %d, unsigned int levels = %d, unsigned long usage = %d, D3DFORMAT format = %d, D3DPOOL pool = %d, IDirect3DVolumeTexture9 **volumeTexture = 0x%0.8p, void **sharedHandle = 0x%0.8p", width, height, depth, levels, usage, format, pool, volumeTexture, sharedHandle);
957d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
958d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*volumeTexture = 0;
959d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
960d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(width == 0 || height == 0 || depth == 0 || (usage & D3DUSAGE_AUTOGENMIPMAP && levels > 1) || d3d9->CheckDeviceFormat(adapter, deviceType, D3DFMT_X8R8G8B8, usage, D3DRTYPE_VOLUMETEXTURE, format) != D3D_OK)
961d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
962d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
963d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
964d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
965d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*volumeTexture = new Direct3DVolumeTexture9(this, width, height, depth, levels, usage, format, pool);
966d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
967d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!*volumeTexture)
968d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
969d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return OUTOFMEMORY();
970d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
971d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
972d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(GetAvailableTextureMem() == 0)
973d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
974d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			delete *volumeTexture;
975d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			*volumeTexture = 0;
976d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
977d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return OUTOFVIDEOMEMORY();
978d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
979d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
980d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		(*volumeTexture)->AddRef();
981d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
982d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
983d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
984d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
985d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::DeletePatch(unsigned int handle)
986d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
987d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
988d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
989d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int handle = %d", handle);
990d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
991d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		UNIMPLEMENTED();
992d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
993d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
994d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
995d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
996d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::DrawIndexedPrimitive(D3DPRIMITIVETYPE type, int baseVertexIndex, unsigned int minIndex, unsigned int numVertices, unsigned int startIndex, unsigned int primitiveCount)
997d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
998d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
999d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1000d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("D3DPRIMITIVETYPE type = %d, int baseVertexIndex = %d, unsigned int minIndex = %d, unsigned int numVertices = %d, unsigned int startIndex = %d, unsigned int primitiveCount = %d", type, baseVertexIndex, minIndex, numVertices, startIndex, primitiveCount);
1001d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1002d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!indexData)
1003d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1004d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1005d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1006d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1007d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!bindResources(indexData) || !primitiveCount)
1008d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1009d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return D3D_OK;
1010d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1011d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1012d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		unsigned int indexOffset = startIndex * (indexData->is32Bit() ? 4 : 2);   // FIXME: Doesn't take stream frequencies into account
1013d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1014d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		sw::DrawType drawType;
1015d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1016d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(indexData->is32Bit())
1017d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1018d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			switch(type)
1019d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
1020d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_POINTLIST:     drawType = sw::DRAW_INDEXEDPOINTLIST32;     break;
1021d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_LINELIST:      drawType = sw::DRAW_INDEXEDLINELIST32;      break;
1022d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_LINESTRIP:     drawType = sw::DRAW_INDEXEDLINESTRIP32;     break;
1023d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_TRIANGLELIST:  drawType = sw::DRAW_INDEXEDTRIANGLELIST32;  break;
1024d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_TRIANGLESTRIP: drawType = sw::DRAW_INDEXEDTRIANGLESTRIP32; break;
1025d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_TRIANGLEFAN:   drawType = sw::DRAW_INDEXEDTRIANGLEFAN32;   break;
1026d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			default:
1027d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				ASSERT(false);
1028d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
1029d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1030d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
1031d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1032d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			switch(type)
1033d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
1034d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_POINTLIST:     drawType = sw::DRAW_INDEXEDPOINTLIST16;     break;
1035d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_LINELIST:      drawType = sw::DRAW_INDEXEDLINELIST16;      break;
1036d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_LINESTRIP:     drawType = sw::DRAW_INDEXEDLINESTRIP16;     break;
1037d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_TRIANGLELIST:  drawType = sw::DRAW_INDEXEDTRIANGLELIST16;  break;
1038d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_TRIANGLESTRIP: drawType = sw::DRAW_INDEXEDTRIANGLESTRIP16; break;
1039d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_TRIANGLEFAN:   drawType = sw::DRAW_INDEXEDTRIANGLEFAN16;   break;
1040d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			default:
1041d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				ASSERT(false);
1042d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
1043d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1044d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1045d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if((streamSourceFreq[0] & D3DSTREAMSOURCE_INDEXEDDATA) && instanceData())
1046d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1047d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			int instanceCount = (streamSourceFreq[0] & ~D3DSTREAMSOURCE_INDEXEDDATA);
1048d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1049d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			for(int instance = 0; instance < instanceCount; instance++)
1050d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
1051d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				bindVertexStreams(baseVertexIndex, true, instance);
1052d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->draw(drawType, indexOffset, primitiveCount, instance == 0);
1053d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
1054d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1055d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
1056d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1057d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			bindVertexStreams(baseVertexIndex, false, 0);
1058d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->draw(drawType, indexOffset, primitiveCount);
1059d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1060d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1061d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1062d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1063d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1064d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::DrawIndexedPrimitiveUP(D3DPRIMITIVETYPE type, unsigned int minIndex, unsigned int numVertices, unsigned int primitiveCount, const void *indexData, D3DFORMAT indexDataFormat, const void *vertexStreamZeroData, unsigned int vertexStreamZeroStride)
1065d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1066d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1067d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1068d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("D3DPRIMITIVETYPE type = %d, unsigned int minIndex = %d, unsigned int numVertices = %d, unsigned int primitiveCount = %d, const void *indexData = 0x%0.8p, D3DFORMAT indexDataFormat = %d, const void *vertexStreamZeroData = 0x%0.8p, unsigned int vertexStreamZeroStride = %d", type, minIndex, numVertices, primitiveCount, indexData, indexDataFormat, vertexStreamZeroData, vertexStreamZeroStride);
1069d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1070d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!vertexStreamZeroData || !indexData)
1071d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1072d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1073d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1074d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1075d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int length = (minIndex + numVertices) * vertexStreamZeroStride;
1076d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1077d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Direct3DVertexBuffer9 *vertexBuffer = new Direct3DVertexBuffer9(this, length, 0, 0, D3DPOOL_DEFAULT);
1078d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1079d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void *data;
1080d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		vertexBuffer->Lock(0, 0, &data, 0);
1081d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		memcpy(data, vertexStreamZeroData, length);
1082d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		vertexBuffer->Unlock();
1083d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1084d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetStreamSource(0, vertexBuffer, 0, vertexStreamZeroStride);
1085d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1086d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		switch(type)
1087d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1088d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_POINTLIST:		length = primitiveCount;		break;
1089d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_LINELIST:		length = primitiveCount * 2;	break;
1090d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_LINESTRIP:		length = primitiveCount + 1;	break;
1091d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_TRIANGLELIST:	length = primitiveCount * 3;	break;
1092d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_TRIANGLESTRIP:	length = primitiveCount + 2;	break;
1093d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_TRIANGLEFAN:		length = primitiveCount + 2;	break;
1094d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		default:
1095d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			ASSERT(false);
1096d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1097d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1098d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		length *= indexDataFormat == D3DFMT_INDEX32 ? 4 : 2;
1099d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1100d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Direct3DIndexBuffer9 *indexBuffer = new Direct3DIndexBuffer9(this, length, 0, indexDataFormat, D3DPOOL_DEFAULT);
1101d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1102d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		indexBuffer->Lock(0, 0, &data, 0);
1103d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		memcpy(data, indexData, length);
1104d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		indexBuffer->Unlock();
1105d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1106d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetIndices(indexBuffer);
1107d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1108d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!bindResources(indexBuffer) || !primitiveCount)
1109d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1110d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			vertexBuffer->Release();
1111d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1112d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return D3D_OK;
1113d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1114d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1115d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		sw::DrawType drawType;
1116d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1117d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(indexDataFormat == D3DFMT_INDEX32)
1118d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1119d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			switch(type)
1120d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
1121d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_POINTLIST:     drawType = sw::DRAW_INDEXEDPOINTLIST32;     break;
1122d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_LINELIST:      drawType = sw::DRAW_INDEXEDLINELIST32;      break;
1123d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_LINESTRIP:     drawType = sw::DRAW_INDEXEDLINESTRIP32;     break;
1124d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_TRIANGLELIST:  drawType = sw::DRAW_INDEXEDTRIANGLELIST32;  break;
1125d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_TRIANGLESTRIP: drawType = sw::DRAW_INDEXEDTRIANGLESTRIP32; break;
1126d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_TRIANGLEFAN:   drawType = sw::DRAW_INDEXEDTRIANGLEFAN32;   break;
1127d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			default:
1128d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				ASSERT(false);
1129d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
1130d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1131d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
1132d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1133d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			switch(type)
1134d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
1135d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_POINTLIST:     drawType = sw::DRAW_INDEXEDPOINTLIST16;     break;
1136d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_LINELIST:      drawType = sw::DRAW_INDEXEDLINELIST16;      break;
1137d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_LINESTRIP:     drawType = sw::DRAW_INDEXEDLINESTRIP16;     break;
1138d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_TRIANGLELIST:  drawType = sw::DRAW_INDEXEDTRIANGLELIST16;  break;
1139d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_TRIANGLESTRIP: drawType = sw::DRAW_INDEXEDTRIANGLESTRIP16; break;
1140d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DPT_TRIANGLEFAN:   drawType = sw::DRAW_INDEXEDTRIANGLEFAN16;   break;
1141d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			default:
1142d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				ASSERT(false);
1143d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
1144d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1145d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1146d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bindVertexStreams(0, false, 0);
1147d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		renderer->draw(drawType, 0, primitiveCount);
1148d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1149d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetStreamSource(0, 0, 0, 0);
1150d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetIndices(0);
1151d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1152d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1153d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1154d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1155d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::DrawPrimitive(D3DPRIMITIVETYPE primitiveType, unsigned int startVertex, unsigned int primitiveCount)
1156d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1157d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1158d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1159d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("D3DPRIMITIVETYPE primitiveType = %d, unsigned int startVertex = %d, unsigned int primitiveCount = %d", primitiveType, startVertex, primitiveCount);
1160d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1161d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!bindResources(0) || !primitiveCount)
1162d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1163d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return D3D_OK;
1164d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1165d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1166d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		sw::DrawType drawType;
1167d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1168d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		switch(primitiveType)
1169d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1170d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_POINTLIST:     drawType = sw::DRAW_POINTLIST;     break;
1171d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_LINELIST:      drawType = sw::DRAW_LINELIST;      break;
1172d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_LINESTRIP:     drawType = sw::DRAW_LINESTRIP;     break;
1173d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_TRIANGLELIST:  drawType = sw::DRAW_TRIANGLELIST;  break;
1174d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_TRIANGLESTRIP: drawType = sw::DRAW_TRIANGLESTRIP; break;
1175d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_TRIANGLEFAN:   drawType = sw::DRAW_TRIANGLEFAN;   break;
1176d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		default:
1177d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			ASSERT(false);
1178d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1179d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1180d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bindVertexStreams(startVertex, false, 0);
1181d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		renderer->draw(drawType, 0, primitiveCount);
1182d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1183d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1184d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1185d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1186d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::DrawPrimitiveUP(D3DPRIMITIVETYPE primitiveType, unsigned int primitiveCount, const void *vertexStreamZeroData, unsigned int vertexStreamZeroStride)
1187d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1188d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1189d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1190d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("D3DPRIMITIVETYPE primitiveType = %d, unsigned int primitiveCount = %d, const void *vertexStreamZeroData = 0x%0.8p, unsigned int vertexStreamZeroStride = %d", primitiveType, primitiveCount, vertexStreamZeroData, vertexStreamZeroStride);
1191d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1192d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!vertexStreamZeroData)
1193d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1194d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1195d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1196d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1197d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		IDirect3DVertexBuffer9 *vertexBuffer = 0;
1198d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int length = 0;
1199d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1200d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		switch(primitiveType)
1201d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1202d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_POINTLIST:		length = primitiveCount;		break;
1203d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_LINELIST:		length = primitiveCount * 2;	break;
1204d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_LINESTRIP:		length = primitiveCount + 1;	break;
1205d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_TRIANGLELIST:	length = primitiveCount * 3;	break;
1206d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_TRIANGLESTRIP:	length = primitiveCount + 2;	break;
1207d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_TRIANGLEFAN:		length = primitiveCount + 2;	break;
1208d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		default:
1209d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			ASSERT(false);
1210d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1211d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1212d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		length *= vertexStreamZeroStride;
1213d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1214d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CreateVertexBuffer(length, 0, 0, D3DPOOL_DEFAULT, &vertexBuffer, 0);
1215d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1216d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void *data;
1217d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		vertexBuffer->Lock(0, 0, &data, 0);
1218d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		memcpy(data, vertexStreamZeroData, length);
1219d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		vertexBuffer->Unlock();
1220d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1221d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetStreamSource(0, vertexBuffer, 0, vertexStreamZeroStride);
1222d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1223d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!bindResources(0) || !primitiveCount)
1224d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1225d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			vertexBuffer->Release();
1226d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1227d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return D3D_OK;
1228d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1229d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1230d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		sw::DrawType drawType;
1231d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1232d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		switch(primitiveType)
1233d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1234d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_POINTLIST:     drawType = sw::DRAW_POINTLIST;     break;
1235d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_LINELIST:      drawType = sw::DRAW_LINELIST;      break;
1236d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_LINESTRIP:     drawType = sw::DRAW_LINESTRIP;     break;
1237d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_TRIANGLELIST:  drawType = sw::DRAW_TRIANGLELIST;  break;
1238d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_TRIANGLESTRIP: drawType = sw::DRAW_TRIANGLESTRIP; break;
1239d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DPT_TRIANGLEFAN:   drawType = sw::DRAW_TRIANGLEFAN;   break;
1240d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		default:
1241d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			ASSERT(false);
1242d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1243d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1244d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bindVertexStreams(0, false, 0);
1245d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		renderer->draw(drawType, 0, primitiveCount);
1246d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1247d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetStreamSource(0, 0, 0, 0);
1248d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		vertexBuffer->Release();
1249d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1250d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1251d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1252d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1253d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::DrawRectPatch(unsigned int handle, const float *numSegs, const D3DRECTPATCH_INFO *rectPatchInfo)
1254d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1255d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1256d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1257d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int handle = %d, const float *numSegs = 0x%0.8p, const D3DRECTPATCH_INFO *rectPatchInfo = 0x%0.8p", handle, numSegs, rectPatchInfo);
1258d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1259d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!numSegs || !rectPatchInfo)
1260d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1261d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1262d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1263d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1264d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		UNIMPLEMENTED();
1265d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1266d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1267d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1268d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1269d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::DrawTriPatch(unsigned int handle, const float *numSegs, const D3DTRIPATCH_INFO *triPatchInfo)
1270d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1271d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1272d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1273d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int handle = %d, const float *numSegs = 0x%0.8p, const D3DTRIPATCH_INFO *triPatchInfo = 0x%0.8p", handle, numSegs, triPatchInfo);
1274d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1275d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!numSegs || !triPatchInfo)
1276d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1277d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1278d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1279d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1280d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		UNIMPLEMENTED();
1281d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1282d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1283d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1284d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1285d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::EndScene()
1286d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1287d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1288d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1289d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("void");
1290d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1291d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1292d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1293d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1294d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::EndStateBlock(IDirect3DStateBlock9 **stateBlock)
1295d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1296d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1297d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1298d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("IDirect3DStateBlock9 **stateBlock = 0x%0.8p", stateBlock);
1299d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1300d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateBlock)
1301d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1302d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1303d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1304d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1305d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*stateBlock = 0;
1306d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1307d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
1308d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1309d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1310d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1311d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1312d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*stateBlock = stateRecorder;
1313d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		stateRecorder->AddRef();
1314d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		stateRecorder->unbind();
1315d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		stateRecorder = 0;   // Stop recording
1316d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1317d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1318d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1319d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1320d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::EvictManagedResources()
1321d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1322d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1323d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1324d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("void");
1325d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1326d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		//	UNIMPLEMENTED();   // FIXME
1327d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1328d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1329d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1330d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1331d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	unsigned int Direct3DDevice9::GetAvailableTextureMem()
1332d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1333d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1334d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1335d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("void");
1336d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1337d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int availableMemory = textureMemory - Direct3DResource9::getMemoryUsage();
1338d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(availableMemory < 0) availableMemory = 0;
1339d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1340d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		// Round to nearest MB
1341d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return (availableMemory + 0x80000) & 0xFFF00000;
1342d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1343d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1344d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetBackBuffer(unsigned int swapChainIndex, unsigned int backBufferIndex, D3DBACKBUFFER_TYPE type, IDirect3DSurface9 **backBuffer)
1345d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1346d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1347d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1348d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int swapChainIndex = %d, unsigned int backBufferIndex = %d, D3DBACKBUFFER_TYPE type = %d, IDirect3DSurface9 **backBuffer = 0x%0.8p", swapChainIndex, backBufferIndex, type, backBuffer);
1349d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1350d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(swapChainIndex >= GetNumberOfSwapChains())
1351d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1352d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1353d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1354d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1355d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return swapChain->GetBackBuffer(backBufferIndex, type, backBuffer);
1356d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1357d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1358d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetClipPlane(unsigned long index, float *plane)
1359d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1360d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1361d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1362d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned long index = %d, float *plane = 0x%0.8p", index, plane);
1363d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1364d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!plane || index >= 6)
1365d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1366d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1367d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1368d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1369d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		plane[0] = this->plane[index][0];
1370d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		plane[1] = this->plane[index][1];
1371d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		plane[2] = this->plane[index][2];
1372d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		plane[3] = this->plane[index][3];
1373d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1374d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1375d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1376d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1377d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetClipStatus(D3DCLIPSTATUS9 *clipStatus)
1378d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1379d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1380d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1381d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("D3DCLIPSTATUS9 *clipStatus = 0x%0.8p", clipStatus);
1382d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1383d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!clipStatus)
1384d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1385d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1386d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1387d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1388d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*clipStatus = this->clipStatus;
1389d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1390d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1391d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1392d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1393d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetCreationParameters(D3DDEVICE_CREATION_PARAMETERS *parameters)
1394d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1395d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1396d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1397d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("D3DDEVICE_CREATION_PARAMETERS *parameters = 0x%0.8p", parameters);
1398d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1399d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!parameters)
1400d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1401d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1402d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1403d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1404d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		parameters->AdapterOrdinal = adapter;
1405d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		parameters->BehaviorFlags = behaviourFlags;
1406d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		parameters->DeviceType = deviceType;
1407d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		parameters->hFocusWindow = focusWindow;
1408d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1409d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1410d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1411d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1412d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetCurrentTexturePalette(unsigned int *paletteNumber)
1413d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1414d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1415d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1416d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int *paletteNumber = 0x%0.8p", paletteNumber);
1417d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1418d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!paletteNumber)
1419d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1420d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1421d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1422d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1423d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*paletteNumber = currentPalette;
1424d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1425d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1426d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1427d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1428d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetDepthStencilSurface(IDirect3DSurface9 **depthStencilSurface)
1429d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1430d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1431d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1432d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("IDirect3DSurface9 **depthStencilSurface = 0x%0.8p", depthStencilSurface);
1433d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1434d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!depthStencilSurface)
1435d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1436d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1437d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1438d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1439d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*depthStencilSurface = depthStencil;
1440d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1441d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(depthStencil)
1442d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1443d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			depthStencil->AddRef();
1444d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1445d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
1446d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1447d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return NOTFOUND();
1448d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1449d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1450d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1451d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1452d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1453d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetDeviceCaps(D3DCAPS9 *caps)
1454d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1455d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1456d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1457d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("D3DCAPS9 *caps = 0x%0.8p", caps);
1458d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1459d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, caps);
1460d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1461d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1462d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetDirect3D(IDirect3D9 **d3d9)
1463d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1464d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1465d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1466d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("IDirect3D9 **d3d9 = 0x%0.8p", d3d9);
1467d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1468d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!d3d9)
1469d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1470d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1471d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1472d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1473d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*d3d9 = this->d3d9;
1474d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		this->d3d9->AddRef();
1475d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1476d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1477d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1478d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1479d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetDisplayMode(unsigned int index, D3DDISPLAYMODE *mode)
1480d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1481d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1482d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1483d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int index = %d, D3DDISPLAYMODE *mode = 0x%0.8p", index, mode);
1484d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1485d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(index >= GetNumberOfSwapChains())
1486d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1487d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1488d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1489d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1490d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return swapChain->GetDisplayMode(mode);
1491d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1492d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1493d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetFrontBufferData(unsigned int index, IDirect3DSurface9 *destSurface)
1494d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1495d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1496d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1497d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int index = %d, IDirect3DSurface9 *destSurface = %p", index, destSurface);
1498d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1499d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(index >= GetNumberOfSwapChains())
1500d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1501d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1502d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1503d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1504d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return swapChain->GetFrontBufferData(destSurface);
1505d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1506d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1507d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetFVF(unsigned long *FVF)
1508d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1509d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1510d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1511d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned long *FVF = 0x%0.8p", FVF);
1512d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1513d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!FVF)
1514d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1515d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1516d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1517d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1518d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(vertexDeclaration)
1519d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1520d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			*FVF = vertexDeclaration->getFVF();
1521d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1522d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
1523d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1524d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			*FVF = 0;
1525d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1526d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1527d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1528d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1529d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1530d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void Direct3DDevice9::GetGammaRamp(unsigned int index, D3DGAMMARAMP *ramp)
1531d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1532d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1533d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1534d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int index = %d, D3DGAMMARAMP *ramp = 0x%0.8p", index, ramp);
1535d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1536d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!ramp || index >= GetNumberOfSwapChains())
1537d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1538d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return;
1539d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1540d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1541d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		swapChain->getGammaRamp((sw::GammaRamp*)ramp);
1542d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1543d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1544d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetIndices(IDirect3DIndexBuffer9 **indexData)
1545d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1546d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1547d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1548d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("IDirect3DIndexBuffer9 **indexData = 0x%0.8p", indexData);
1549d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1550d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!indexData)
1551d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1552d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1553d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1554d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1555d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*indexData = this->indexData;
1556d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1557d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(this->indexData)
1558d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1559d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			this->indexData->AddRef();
1560d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1561d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1562d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1563d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1564d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1565d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetLight(unsigned long index, D3DLIGHT9 *light)
1566d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1567d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1568d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1569d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned long index = %d, D3DLIGHT9 *light = 0x%0.8p", index, light);
1570d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1571d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!light)
1572d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1573d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1574d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1575d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1576d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!this->light.exists(index))
1577d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1578d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1579d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1580d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1581d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*light = this->light[index];
1582d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1583d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1584d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1585d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1586d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetLightEnable(unsigned long index, int *enable)
1587d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1588d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1589d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1590d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned long index = %d, int *enable = 0x%0.8p", index, enable);
1591d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1592d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!enable)
1593d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1594d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1595d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1596d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1597d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!light.exists(index))
1598d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1599d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1600d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1601d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1602d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*enable = light[index].enable ? 128 : 0;
1603d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1604d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1605d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1606d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1607d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetMaterial(D3DMATERIAL9 *material)
1608d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1609d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1610d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1611d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("D3DMATERIAL9 *material = 0x%0.8p", material);
1612d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1613d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!material)
1614d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1615d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1616d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1617d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1618d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*material = this->material;
1619d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1620d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1621d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1622d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1623d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	float Direct3DDevice9::GetNPatchMode()
1624d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1625d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1626d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1627d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("void");
1628d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1629d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return 0.0f;   // FIXME: Unimplemented
1630d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1631d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1632d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	unsigned int Direct3DDevice9::GetNumberOfSwapChains()
1633d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1634d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1635d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1636d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("void");
1637d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1638d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return 1;
1639d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1640d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1641d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetPaletteEntries(unsigned int paletteNumber, PALETTEENTRY *entries)
1642d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1643d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1644d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1645d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int paletteNumber = %d, PALETTEENTRY *entries = 0x%0.8p", paletteNumber, entries);
1646d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1647d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(paletteNumber > 0xFFFF || !entries)
1648d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1649d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1650d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1651d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1652d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(int i = 0; i < 256; i++)
1653d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1654d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			entries[i] = palette[paletteNumber].entry[i];
1655d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1656d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1657d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1658d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1659d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1660d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetPixelShader(IDirect3DPixelShader9 **shader)
1661d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1662d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1663d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1664d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("IDirect3DPixelShader9 **shader = 0x%0.8p", shader);
1665d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1666d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!shader)
1667d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1668d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1669d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1670d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1671d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(pixelShader)
1672d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1673d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			pixelShader->AddRef();
1674d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1675d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1676d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*shader = pixelShader;
1677d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1678d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1679d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1680d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1681d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetPixelShaderConstantB(unsigned int startRegister, int *constantData, unsigned int count)
1682d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1683d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1684d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1685d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int startRegister = %d, int *constantData = 0x%0.8p, unsigned int count = %d", startRegister, constantData, count);
1686d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1687d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!constantData)
1688d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1689d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1690d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1691d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1692d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(unsigned int i = 0; i < count; i++)
1693d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1694d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			constantData[i] = pixelShaderConstantB[startRegister + i];
1695d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1696d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1697d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1698d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1699d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1700d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetPixelShaderConstantF(unsigned int startRegister, float *constantData, unsigned int count)
1701d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1702d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1703d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1704d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int startRegister = %d, int *constantData = 0x%0.8p, unsigned int count = %d", startRegister, constantData, count);
1705d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1706d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!constantData)
1707d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1708d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1709d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1710d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1711d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(unsigned int i = 0; i < count; i++)
1712d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1713d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			constantData[i * 4 + 0] = pixelShaderConstantF[startRegister + i][0];
1714d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			constantData[i * 4 + 1] = pixelShaderConstantF[startRegister + i][1];
1715d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			constantData[i * 4 + 2] = pixelShaderConstantF[startRegister + i][2];
1716d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			constantData[i * 4 + 3] = pixelShaderConstantF[startRegister + i][3];
1717d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1718d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1719d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1720d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1721d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1722d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetPixelShaderConstantI(unsigned int startRegister, int *constantData, unsigned int count)
1723d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1724d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1725d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1726d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int startRegister = %d, int *constantData = 0x%0.8p, unsigned int count = %d", startRegister, constantData, count);
1727d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1728d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!constantData)
1729d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1730d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1731d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1732d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1733d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(unsigned int i = 0; i < count; i++)
1734d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1735d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			constantData[i * 4 + 0] = pixelShaderConstantI[startRegister + i][0];
1736d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			constantData[i * 4 + 1] = pixelShaderConstantI[startRegister + i][1];
1737d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			constantData[i * 4 + 2] = pixelShaderConstantI[startRegister + i][2];
1738d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			constantData[i * 4 + 3] = pixelShaderConstantI[startRegister + i][3];
1739d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1740d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1741d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1742d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1743d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1744d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetRasterStatus(unsigned int index, D3DRASTER_STATUS *rasterStatus)
1745d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1746d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1747d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1748d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int swapChain = %d, D3DRASTER_STATUS *rasterStatus = 0x%0.8p", index, rasterStatus);
1749d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1750d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(index >= GetNumberOfSwapChains())
1751d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1752d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1753d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1754d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1755d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return swapChain->GetRasterStatus(rasterStatus);
1756d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1757d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1758d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetRenderState(D3DRENDERSTATETYPE state, unsigned long *value)
1759d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1760d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1761d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1762d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("D3DRENDERSTATETYPE state = %d, unsigned long *value = 0x%0.8p", state, value);
1763d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1764d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!value)
1765d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1766d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1767d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1768d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1769d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*value = renderState[state];
1770d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1771d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1772d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1773d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1774d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetRenderTarget(unsigned long index, IDirect3DSurface9 **renderTarget)
1775d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1776d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1777d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1778d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned long index = %d, IDirect3DSurface9 **renderTarget = 0x%0.8p", index, renderTarget);
1779d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1780d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(index >= 4 || !renderTarget)
1781d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1782d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1783d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1784d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1785d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*renderTarget = 0;
1786d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1787d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!this->renderTarget[index])
1788d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1789d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return NOTFOUND();
1790d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1791d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1792d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*renderTarget = this->renderTarget[index];
1793d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		this->renderTarget[index]->AddRef();
1794d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1795d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1796d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1797d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1798d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetRenderTargetData(IDirect3DSurface9 *renderTarget, IDirect3DSurface9 *destSurface)
1799d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1800d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1801d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1802d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("IDirect3DSurface9 *renderTarget = 0x%0.8p, IDirect3DSurface9 *destSurface = 0x%0.8p", renderTarget, destSurface);
1803d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1804d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!renderTarget || !destSurface)
1805d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1806d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1807d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1808d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1809d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		D3DSURFACE_DESC sourceDescription;
1810d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		D3DSURFACE_DESC destinationDescription;
1811d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1812d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		renderTarget->GetDesc(&sourceDescription);
1813d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		destSurface->GetDesc(&destinationDescription);
1814d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1815d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(sourceDescription.Width  != destinationDescription.Width ||
1816d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		   sourceDescription.Height != destinationDescription.Height ||
1817d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		   sourceDescription.Format != destinationDescription.Format ||
1818d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		   sourceDescription.MultiSampleType != D3DMULTISAMPLE_NONE)
1819d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1820d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1821d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1822d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1823d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(sourceDescription.Format == D3DFMT_A8R8G8B8 ||
1824d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		   sourceDescription.Format == D3DFMT_X8R8G8B8)
1825d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1826d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sw::Surface *source = static_cast<Direct3DSurface9*>(renderTarget);
1827d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sw::Surface *dest = static_cast<Direct3DSurface9*>(destSurface);
1828d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1829d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			void *sourceBuffer = source->lockExternal(0, 0, 0, sw::LOCK_READONLY, sw::PUBLIC);
1830d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			void *destBuffer = dest->lockExternal(0, 0, 0, sw::LOCK_WRITEONLY, sw::PUBLIC);
1831d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1832d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			static void (__cdecl *blitFunction)(void *dst, void *src);
1833d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			static sw::Routine *blitRoutine;
1834d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			static sw::BlitState blitState = {0};
1835d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1836d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sw::BlitState update;
1837d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			update.width = sourceDescription.Width;
1838d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			update.height = sourceDescription.Height;
1839d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			update.sourceFormat = sw::FORMAT_A8R8G8B8;
1840d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			update.destFormat = sw::FORMAT_A8R8G8B8;
1841d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			update.stride = dest->getExternalPitchB();
1842d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			update.cursorHeight = 0;
1843d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			update.cursorWidth = 0;
1844d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1845d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(memcmp(&blitState, &update, sizeof(sw::BlitState)) != 0)
1846d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
1847d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				blitState = update;
1848d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				delete blitRoutine;
1849d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1850d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				blitRoutine = sw::FrameBuffer::copyRoutine(blitState);
1851d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				blitFunction = (void(__cdecl*)(void*, void*))blitRoutine->getEntry();
1852d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
1853d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1854d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			blitFunction(destBuffer, sourceBuffer);
1855d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1856d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			dest->unlockExternal();
1857d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			source->unlockExternal();
1858d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1859d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
1860d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1861d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return UpdateSurface(renderTarget, 0, destSurface, 0);
1862d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1863d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1864d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1865d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1866d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1867d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetSamplerState(unsigned long sampler, D3DSAMPLERSTATETYPE state, unsigned long *value)
1868d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1869d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1870d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1871d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned long sampler = %d, D3DSAMPLERSTATETYPE type = %d, unsigned long *value = 0x%0.8p", sampler, state, value);
1872d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1873d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!value || state < D3DSAMP_ADDRESSU || state > D3DSAMP_DMAPOFFSET)   // FIXME: Set *value to 0?
1874d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1875d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1876d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1877d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1878d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if((sampler >= 16 && sampler <= D3DDMAPSAMPLER) || sampler > D3DVERTEXTEXTURESAMPLER3)
1879d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1880d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1881d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1882d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1883d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(sampler >= D3DVERTEXTEXTURESAMPLER0)
1884d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1885d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sampler = 16 + (sampler - D3DVERTEXTEXTURESAMPLER0);
1886d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1887d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1888d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*value = samplerState[sampler][state];
1889d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1890d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1891d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1892d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1893d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetScissorRect(RECT *rect)
1894d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1895d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1896d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1897d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("RECT *rect = 0x%0.8p", rect);
1898d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1899d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!rect)
1900d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1901d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1902d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1903d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1904d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*rect = scissorRect;
1905d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1906d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1907d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1908d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1909d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	int Direct3DDevice9::GetSoftwareVertexProcessing()
1910d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1911d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1912d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1913d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("void");
1914d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1915d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return softwareVertexProcessing ? TRUE : FALSE;
1916d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1917d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1918d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetStreamSource(unsigned int streamNumber, IDirect3DVertexBuffer9 **streamData, unsigned int *offset, unsigned int *stride)
1919d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1920d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1921d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1922d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int streamNumber = %d, IDirect3DVertexBuffer9 **streamData = 0x%0.8p, unsigned int *offset = 0x%0.8p, unsigned int *stride = 0x%0.8p", streamNumber, streamData, offset, stride);
1923d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1924d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(streamNumber >= 16 || !streamData || !offset || !stride)
1925d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1926d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1927d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1928d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1929d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*streamData = dataStream[streamNumber];
1930d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1931d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(dataStream[streamNumber])
1932d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1933d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			dataStream[streamNumber]->AddRef();
1934d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1935d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1936d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*offset = streamOffset[streamNumber];
1937d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*stride = streamStride[streamNumber];
1938d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1939d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1940d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1941d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1942d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetStreamSourceFreq(unsigned int streamNumber, unsigned int *divider)
1943d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1944d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1945d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1946d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int streamNumber = %d, unsigned int *divider = 0x%0.8p", streamNumber, divider);
1947d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1948d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(streamNumber >= 16 || !divider)
1949d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1950d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1951d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1952d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1953d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*divider = streamSourceFreq[streamNumber];
1954d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1955d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1956d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1957d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1958d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetSwapChain(unsigned int index, IDirect3DSwapChain9 **swapChain)
1959d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1960d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1961d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1962d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int index = %d, IDirect3DSwapChain9 **swapChain = 0x%0.8p", index, swapChain);
1963d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1964d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!swapChain || index >= GetNumberOfSwapChains())
1965d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1966d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1967d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1968d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1969d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*swapChain = this->swapChain;
1970d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1971d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(*swapChain)
1972d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1973d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			(*swapChain)->AddRef();
1974d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1975d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1976d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
1977d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
1978d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1979d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetTexture(unsigned long sampler, IDirect3DBaseTexture9 **texture)
1980d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
1981d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
1982d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1983d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned long sampler = %d, IDirect3DBaseTexture9 **texture = 0x%0.8p", sampler, texture);
1984d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1985d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!texture)
1986d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1987d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1988d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1989d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1990d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*texture = 0;
1991d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1992d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if((sampler >= 16 && sampler <= D3DDMAPSAMPLER) || sampler > D3DVERTEXTEXTURESAMPLER3)
1993d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
1994d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
1995d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
1996d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1997d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*texture = this->texture[sampler];
1998d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
1999d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(this->texture[sampler])
2000d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2001d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			this->texture[sampler]->AddRef();
2002d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2003d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2004d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2005d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2006d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2007d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetTextureStageState(unsigned long stage, D3DTEXTURESTAGESTATETYPE type, unsigned long *value)
2008d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2009d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2010d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2011d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned long stage = %d, D3DTEXTURESTAGESTATETYPE type = %d, unsigned long *value = 0x%0.8p", stage, type, value);
2012d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2013d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!value)
2014d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2015d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
2016d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2017d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2018d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*value = textureStageState[stage][type];
2019d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2020d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2021d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2022d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2023d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetTransform(D3DTRANSFORMSTATETYPE state, D3DMATRIX *matrix)
2024d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2025d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2026d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2027d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("D3DTRANSFORMSTATETYPE state = %d, D3DMATRIX *matrix = 0x%0.8p", state, matrix);
2028d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2029d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!matrix || state < 0 || state > 511)
2030d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2031d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
2032d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2033d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2034d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*matrix = this->matrix[state];
2035d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2036d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2037d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2038d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2039d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetVertexDeclaration(IDirect3DVertexDeclaration9 **declaration)
2040d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2041d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2042d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2043d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("IDirect3DVertexDeclaration9 **declaration = 0x%0.8p", declaration);
2044d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2045d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!declaration)
2046d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2047d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
2048d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2049d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2050d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*declaration = vertexDeclaration;
2051d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2052d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(vertexDeclaration)
2053d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2054d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			vertexDeclaration->AddRef();
2055d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2056d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2057d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2058d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2059d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2060d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetVertexShader(IDirect3DVertexShader9 **shader)
2061d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2062d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2063d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2064d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("IDirect3DVertexShader9 **shader = 0x%0.8p", shader);
2065d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2066d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!shader)
2067d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2068d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
2069d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2070d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2071d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*shader = vertexShader;
2072d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2073d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(vertexShader)
2074d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2075d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			vertexShader->AddRef();
2076d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2077d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2078d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2079d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2080d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2081d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetVertexShaderConstantB(unsigned int startRegister, int *constantData, unsigned int count)
2082d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2083d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2084d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2085d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int startRegister = %d, int *constantData = 0x%0.8p, unsigned int count = %d", startRegister, constantData, count);
2086d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2087d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!constantData)
2088d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2089d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
2090d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2091d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2092d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(unsigned int i = 0; i < count; i++)
2093d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2094d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			constantData[i] = vertexShaderConstantB[startRegister + i];
2095d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2096d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2097d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2098d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2099d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2100d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetVertexShaderConstantF(unsigned int startRegister, float *constantData, unsigned int count)
2101d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2102d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2103d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2104d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int startRegister = %d, int *constantData = 0x%0.8p, unsigned int count = %d", startRegister, constantData, count);
2105d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2106d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!constantData)
2107d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2108d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
2109d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2110d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2111d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(unsigned int i = 0; i < count; i++)
2112d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2113d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			constantData[i * 4 + 0] = vertexShaderConstantF[startRegister + i][0];
2114d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			constantData[i * 4 + 1] = vertexShaderConstantF[startRegister + i][1];
2115d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			constantData[i * 4 + 2] = vertexShaderConstantF[startRegister + i][2];
2116d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			constantData[i * 4 + 3] = vertexShaderConstantF[startRegister + i][3];
2117d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2118d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2119d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2120d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2121d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2122d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetVertexShaderConstantI(unsigned int startRegister, int *constantData, unsigned int count)
2123d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2124d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2125d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2126d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int startRegister = %d, int *constantData = 0x%0.8p, unsigned int count = %d", startRegister, constantData, count);
2127d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2128d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!constantData)
2129d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2130d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
2131d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2132d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2133d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(unsigned int i = 0; i < count; i++)
2134d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2135d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			constantData[i * 4 + 0] = vertexShaderConstantI[startRegister + i][0];
2136d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			constantData[i * 4 + 1] = vertexShaderConstantI[startRegister + i][1];
2137d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			constantData[i * 4 + 2] = vertexShaderConstantI[startRegister + i][2];
2138d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			constantData[i * 4 + 3] = vertexShaderConstantI[startRegister + i][3];
2139d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2140d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2141d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2142d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2143d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2144d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::GetViewport(D3DVIEWPORT9 *viewport)
2145d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2146d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2147d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2148d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("D3DVIEWPORT9 *viewport = 0x%0.8p", viewport);
2149d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2150d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!viewport)
2151d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2152d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
2153d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2154d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2155d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*viewport = this->viewport;
2156d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2157d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2158d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2159d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2160d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::LightEnable(unsigned long index, int enable)
2161d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2162d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2163d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2164d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned long index = %d, int enable = %d", index, enable);
2165d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2166d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!light.exists(index))   // Insert default light
2167d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2168d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			D3DLIGHT9 light;
2169d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2170d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Type = D3DLIGHT_DIRECTIONAL;
2171d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Diffuse.r = 1;
2172d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Diffuse.g = 1;
2173d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Diffuse.b = 1;
2174d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Diffuse.a = 0;
2175d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Specular.r = 0;
2176d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Specular.g = 0;
2177d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Specular.b = 0;
2178d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Specular.a = 0;
2179d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Ambient.r = 0;
2180d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Ambient.g = 0;
2181d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Ambient.b = 0;
2182d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Ambient.a = 0;
2183d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Position.x = 0;
2184d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Position.y = 0;
2185d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Position.z = 0;
2186d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Direction.x = 0;
2187d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Direction.y = 0;
2188d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Direction.z = 1;
2189d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Range = 0;
2190d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Falloff = 0;
2191d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Attenuation0 = 0;
2192d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Attenuation1 = 0;
2193d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Attenuation2 = 0;
2194d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Theta = 0;
2195d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light.Phi = 0;
2196d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2197d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			this->light[index] = light;
2198d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			this->light[index].enable = false;
2199d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2200d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2201d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
2202d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2203d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			light[index].enable = (enable != FALSE);
2204d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2205d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			lightsDirty = true;
2206d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2207d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
2208d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2209d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->lightEnable(index, enable);
2210d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2211d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2212d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2213d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2214d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2215d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::MultiplyTransform(D3DTRANSFORMSTATETYPE state, const D3DMATRIX *matrix)
2216d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2217d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2218d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2219d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("D3DTRANSFORMSTATETYPE state = %d, const D3DMATRIX *matrix = 0x%0.8p", state, matrix);
2220d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2221d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!matrix)
2222d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2223d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
2224d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2225d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2226d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		D3DMATRIX *current = &this->matrix[state];
2227d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2228d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		sw::Matrix C(current->_11, current->_21, current->_31, current->_41,
2229d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		             current->_12, current->_22, current->_32, current->_42,
2230d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		             current->_13, current->_23, current->_33, current->_43,
2231d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		             current->_14, current->_24, current->_34, current->_44);
2232d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2233d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		sw::Matrix M(matrix->_11, matrix->_21, matrix->_31, matrix->_41,
2234d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		             matrix->_12, matrix->_22, matrix->_32, matrix->_42,
2235d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		             matrix->_13, matrix->_23, matrix->_33, matrix->_43,
2236d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		             matrix->_14, matrix->_24, matrix->_34, matrix->_44);
2237d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2238d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		switch(state)
2239d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2240d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DTS_WORLD:
2241d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setModelMatrix(C * M);
2242d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			break;
2243d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DTS_VIEW:
2244d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setViewMatrix(C * M);
2245d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			break;
2246d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DTS_PROJECTION:
2247d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setProjectionMatrix(C * M);
2248d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			break;
2249d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DTS_TEXTURE0:
2250d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setTextureMatrix(0, C * M);
2251d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			break;
2252d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DTS_TEXTURE1:
2253d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setTextureMatrix(1, C * M);
2254d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			break;
2255d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DTS_TEXTURE2:
2256d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setTextureMatrix(2, C * M);
2257d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			break;
2258d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DTS_TEXTURE3:
2259d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setTextureMatrix(3, C * M);
2260d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			break;
2261d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DTS_TEXTURE4:
2262d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setTextureMatrix(4, C * M);
2263d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			break;
2264d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DTS_TEXTURE5:
2265d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setTextureMatrix(5, C * M);
2266d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			break;
2267d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DTS_TEXTURE6:
2268d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setTextureMatrix(6, C * M);
2269d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			break;
2270d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DTS_TEXTURE7:
2271d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setTextureMatrix(7, C * M);
2272d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			break;
2273d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		default:
2274d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(state > 256 && state < 512)
2275d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
2276d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setModelMatrix(C * M, state - 256);
2277d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
2278d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			else ASSERT(false);
2279d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2280d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2281d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2282d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2283d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2284d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::Present(const RECT *sourceRect, const RECT *destRect, HWND destWindowOverride, const RGNDATA *dirtyRegion)
2285d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2286d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2287d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2288d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("const RECT *sourceRect = 0x%0.8p, const RECT *destRect = 0x%0.8p, HWND destWindowOverride = %d, const RGNDATA *dirtyRegion = 0x%0.8p", sourceRect, destRect, destWindowOverride, dirtyRegion);
2289d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2290d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return swapChain->Present(sourceRect, destRect, destWindowOverride, dirtyRegion, 0);
2291d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2292d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2293d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::ProcessVertices(unsigned int srcStartIndex, unsigned int destIndex, unsigned int vertexCount, IDirect3DVertexBuffer9 *destBuffer, IDirect3DVertexDeclaration9 *vertexDeclaration, unsigned long flags)
2294d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2295d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2296d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2297d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int srcStartIndex = %d, unsigned int destIndex = %d, unsigned int vertexCount = %d, IDirect3DVertexBuffer9 *destBuffer = 0x%0.8p, IDirect3DVertexDeclaration9 *vertexDeclaration = 0x%0.8p, unsigned long flags = %d", srcStartIndex, destIndex, vertexCount, destBuffer, vertexDeclaration, flags);
2298d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2299d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!destBuffer)
2300d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2301d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
2302d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2303d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2304d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		UNIMPLEMENTED();
2305d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2306d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2307d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2308d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2309d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::Reset(D3DPRESENT_PARAMETERS *presentParameters)
2310d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2311d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2312d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2313d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("D3DPRESENT_PARAMETERS *presentParameters = 0x%0.8p", presentParameters);
2314d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2315d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!presentParameters)
2316d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2317d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
2318d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2319d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2320d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		deviceWindow = presentParameters->hDeviceWindow;
2321d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2322d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(depthStencil)
2323d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2324d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			depthStencil->unbind();
2325d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			depthStencil = 0;
2326d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2327d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2328d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(autoDepthStencil)
2329d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2330d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			autoDepthStencil->unbind();
2331d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			autoDepthStencil = 0;
2332d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2333d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2334d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(int index = 0; index < 4; index++)
2335d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2336d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(renderTarget[index])
2337d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
2338d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderTarget[index]->unbind();
2339d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderTarget[index] = 0;
2340d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
2341d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2342d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2343d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!swapChain)
2344d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2345d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			swapChain = new Direct3DSwapChain9(this, presentParameters);
2346d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			swapChain->bind();
2347d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2348d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
2349d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2350d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			swapChain->reset(presentParameters);
2351d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2352d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2353d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(presentParameters->EnableAutoDepthStencil != FALSE)
2354d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2355d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			bool lockable = false;
2356d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2357d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			switch(presentParameters->AutoDepthStencilFormat)
2358d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
2359d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_D15S1:
2360d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_D24S8:
2361d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_D24X8:
2362d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_D24X4S4:
2363d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_D24FS8:
2364d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_D32:
2365d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_D16:
2366d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_DF24:
2367d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_DF16:
2368d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_INTZ:
2369d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				lockable = false;
2370d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
2371d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_S8_LOCKABLE:
2372d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_D16_LOCKABLE:
2373d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_D32F_LOCKABLE:
2374d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DFMT_D32_LOCKABLE:
2375d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				lockable = true;
2376d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
2377d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			default:
2378d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				ASSERT(false);
2379d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
2380d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2381d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			autoDepthStencil = new Direct3DSurface9(this, this, presentParameters->BackBufferWidth, presentParameters->BackBufferHeight, presentParameters->AutoDepthStencilFormat, D3DPOOL_DEFAULT, presentParameters->MultiSampleType, presentParameters->MultiSampleQuality, lockable, D3DUSAGE_DEPTHSTENCIL);
2382d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			autoDepthStencil->bind();
2383d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2384d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetDepthStencilSurface(autoDepthStencil);
2385d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2386d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2387d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		IDirect3DSurface9 *renderTarget;
2388d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		swapChain->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &renderTarget);
2389d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderTarget(0, renderTarget);
2390d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		renderTarget->Release();
2391d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2392d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderTarget(1, 0);
2393d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderTarget(2, 0);
2394d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderTarget(3, 0);
2395d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2396d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		softwareVertexProcessing = (behaviourFlags & D3DCREATE_SOFTWARE_VERTEXPROCESSING) == D3DCREATE_SOFTWARE_VERTEXPROCESSING;
2397d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2398d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_ZENABLE, presentParameters->EnableAutoDepthStencil != FALSE ? D3DZB_TRUE : D3DZB_FALSE);
2399d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
2400d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
2401d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
2402d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
2403d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_LASTPIXEL, TRUE);
2404d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
2405d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO);
2406d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
2407d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL);
2408d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_ALPHAREF, 0);
2409d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_ALWAYS);
2410d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_DITHERENABLE, FALSE);
2411d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
2412d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_FOGENABLE, FALSE);
2413d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_SPECULARENABLE, FALSE);
2414d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	//	SetRenderState(D3DRS_ZVISIBLE, 0);
2415d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_FOGCOLOR, 0);
2416d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_NONE);
2417d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_FOGSTART, FtoDW(0.0f));
2418d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_FOGEND, FtoDW(1.0f));
2419d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_FOGDENSITY, FtoDW(1.0f));
2420d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_RANGEFOGENABLE, FALSE);
2421d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_STENCILENABLE, FALSE);
2422d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP);
2423d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP);
2424d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP);
2425d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS);
2426d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_STENCILREF, 0);
2427d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_STENCILMASK, 0xFFFFFFFF);
2428d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_STENCILWRITEMASK, 0xFFFFFFFF);
2429d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_TEXTUREFACTOR, 0xFFFFFFFF);
2430d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_WRAP0, 0);
2431d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_WRAP1, 0);
2432d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_WRAP2, 0);
2433d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_WRAP3, 0);
2434d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_WRAP4, 0);
2435d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_WRAP5, 0);
2436d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_WRAP6, 0);
2437d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_WRAP7, 0);
2438d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_CLIPPING, TRUE);
2439d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_LIGHTING, TRUE);
2440d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_AMBIENT, 0);
2441d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_FOGVERTEXMODE, D3DFOG_NONE);
2442d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_COLORVERTEX, TRUE);
2443d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_LOCALVIEWER, TRUE);
2444d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_NORMALIZENORMALS, FALSE);
2445d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1);
2446d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_SPECULARMATERIALSOURCE, D3DMCS_COLOR2);
2447d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_MATERIAL);
2448d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_EMISSIVEMATERIALSOURCE, D3DMCS_MATERIAL);
2449d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_VERTEXBLEND, D3DVBF_DISABLE);
2450d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_CLIPPLANEENABLE, 0);
2451d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_POINTSIZE, FtoDW(1.0f));
2452d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_POINTSIZE_MIN, FtoDW(1.0f));
2453d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_POINTSPRITEENABLE, FALSE);
2454d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_POINTSCALEENABLE, FALSE);
2455d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_POINTSCALE_A, FtoDW(1.0f));
2456d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_POINTSCALE_B, FtoDW(0.0f));
2457d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_POINTSCALE_C, FtoDW(0.0f));
2458d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, TRUE);
2459d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_MULTISAMPLEMASK, 0xFFFFFFFF);
2460d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_PATCHEDGESTYLE, D3DPATCHEDGE_DISCRETE);
2461d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_DEBUGMONITORTOKEN, D3DDMT_ENABLE);
2462d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_POINTSIZE_MAX, FtoDW(64.0f));
2463d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_INDEXEDVERTEXBLENDENABLE, FALSE);
2464d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_COLORWRITEENABLE, 0x0000000F);
2465d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_TWEENFACTOR, FtoDW(0.0f));
2466d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
2467d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_POSITIONDEGREE, D3DDEGREE_CUBIC);
2468d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_NORMALDEGREE, D3DDEGREE_LINEAR);
2469d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE);
2470d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, FtoDW(0.0f));
2471d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_ANTIALIASEDLINEENABLE, FALSE);
2472d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_MINTESSELLATIONLEVEL, FtoDW(1.0f));
2473d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_MAXTESSELLATIONLEVEL, FtoDW(1.0f));
2474d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_ADAPTIVETESS_X, FtoDW(0.0f));
2475d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_ADAPTIVETESS_Y, FtoDW(0.0f));
2476d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_ADAPTIVETESS_Z, FtoDW(1.0f));
2477d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_ADAPTIVETESS_W, FtoDW(0.0f));
2478d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_ENABLEADAPTIVETESSELLATION, FALSE);
2479d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_TWOSIDEDSTENCILMODE, FALSE);
2480d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_CCW_STENCILFAIL, D3DSTENCILOP_KEEP);
2481d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_CCW_STENCILZFAIL, D3DSTENCILOP_KEEP);
2482d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_CCW_STENCILPASS, D3DSTENCILOP_KEEP);
2483d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_CCW_STENCILFUNC, D3DCMP_ALWAYS);
2484d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_COLORWRITEENABLE1, 0x0000000F);
2485d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_COLORWRITEENABLE2, 0x0000000F);
2486d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_COLORWRITEENABLE3, 0x0000000F);
2487d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_BLENDFACTOR, 0xFFFFFFFF);
2488d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_SRGBWRITEENABLE, 0);
2489d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_DEPTHBIAS, FtoDW(0.0f));
2490d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_WRAP8, 0);
2491d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_WRAP9, 0);
2492d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_WRAP10, 0);
2493d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_WRAP11, 0);
2494d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_WRAP12, 0);
2495d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_WRAP13, 0);
2496d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_WRAP14, 0);
2497d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_WRAP15, 0);
2498d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, FALSE);
2499d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_SRCBLENDALPHA, D3DBLEND_ONE);
2500d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_DESTBLENDALPHA, D3DBLEND_ZERO);
2501d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SetRenderState(D3DRS_BLENDOPALPHA, D3DBLENDOP_ADD);
2502d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2503d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(int i = 0; i < 8; i++)
2504d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2505d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetTextureStageState(i, D3DTSS_COLOROP, i == 0 ? D3DTOP_MODULATE : D3DTOP_DISABLE);
2506d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetTextureStageState(i, D3DTSS_COLORARG1, D3DTA_TEXTURE);
2507d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetTextureStageState(i, D3DTSS_COLORARG2, D3DTA_CURRENT);
2508d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetTextureStageState(i, D3DTSS_ALPHAOP, i == 0 ? D3DTOP_SELECTARG1 : D3DTOP_DISABLE);
2509d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetTextureStageState(i, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
2510d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetTextureStageState(i, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
2511d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetTextureStageState(i, D3DTSS_BUMPENVMAT00, FtoDW(0.0f));
2512d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetTextureStageState(i, D3DTSS_BUMPENVMAT01, FtoDW(0.0f));
2513d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetTextureStageState(i, D3DTSS_BUMPENVMAT10, FtoDW(0.0f));
2514d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetTextureStageState(i, D3DTSS_BUMPENVMAT11, FtoDW(0.0f));
2515d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetTextureStageState(i, D3DTSS_TEXCOORDINDEX, i);
2516d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetTextureStageState(i, D3DTSS_BUMPENVLSCALE, FtoDW(0.0f));
2517d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetTextureStageState(i, D3DTSS_BUMPENVLOFFSET, FtoDW(0.0f));
2518d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetTextureStageState(i, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE);
2519d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetTextureStageState(i, D3DTSS_COLORARG0, D3DTA_CURRENT);
2520d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetTextureStageState(i, D3DTSS_ALPHAARG0, D3DTA_CURRENT);
2521d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetTextureStageState(i, D3DTSS_RESULTARG, D3DTA_CURRENT);
2522d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetTextureStageState(i, D3DTSS_CONSTANT, 0x00000000);
2523d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2524d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2525d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(int i = 0; i <= D3DVERTEXTEXTURESAMPLER3; i = (i != 15) ? (i + 1) : D3DVERTEXTEXTURESAMPLER0)
2526d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2527d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetTexture(i, 0);
2528d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2529d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetSamplerState(i, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
2530d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetSamplerState(i, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
2531d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetSamplerState(i, D3DSAMP_ADDRESSW, D3DTADDRESS_WRAP);
2532d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetSamplerState(i, D3DSAMP_BORDERCOLOR, 0x00000000);
2533d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetSamplerState(i, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
2534d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetSamplerState(i, D3DSAMP_MINFILTER, D3DTEXF_POINT);
2535d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetSamplerState(i, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
2536d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetSamplerState(i, D3DSAMP_MIPMAPLODBIAS, 0);
2537d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetSamplerState(i, D3DSAMP_MAXMIPLEVEL, 0);
2538d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetSamplerState(i, D3DSAMP_MAXANISOTROPY, 1);
2539d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetSamplerState(i, D3DSAMP_SRGBTEXTURE, 0);
2540d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetSamplerState(i, D3DSAMP_ELEMENTINDEX, 0);
2541d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetSamplerState(i, D3DSAMP_DMAPOFFSET, 0);
2542d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2543d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2544d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(int i = 0; i < 6; i++)
2545d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2546d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			float plane[4] = {0, 0, 0, 0};
2547d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2548d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			SetClipPlane(i, plane);
2549d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2550d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2551d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		currentPalette = 0xFFFF;
2552d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2553d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		ShowCursor(FALSE);
2554d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		delete cursor;
2555d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		cursor = 0;
2556d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2557d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2558d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2559d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2560d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetClipPlane(unsigned long index, const float *plane)
2561d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2562d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2563d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2564d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned long index = %d, const float *plane = 0x%0.8p", index, plane);
2565d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2566d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!plane || index >= 6)
2567d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2568d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
2569d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2570d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2571d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
2572d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2573d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			this->plane[index][0] = plane[0];
2574d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			this->plane[index][1] = plane[1];
2575d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			this->plane[index][2] = plane[2];
2576d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			this->plane[index][3] = plane[3];
2577d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2578d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setClipPlane(index, plane);
2579d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2580d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
2581d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2582d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setClipPlane(index, plane);
2583d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2584d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2585d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2586d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2587d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2588d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetClipStatus(const D3DCLIPSTATUS9 *clipStatus)
2589d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2590d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2591d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2592d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("const D3DCLIPSTATUS9 *clipStatus = 0x%0.8p", clipStatus);
2593d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2594d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!clipStatus)
2595d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2596d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
2597d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2598d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2599d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		this->clipStatus = *clipStatus;
2600d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2601d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		UNIMPLEMENTED();
2602d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2603d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2604d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2605d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2606d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetCurrentTexturePalette(unsigned int paletteNumber)
2607d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2608d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2609d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2610d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int paletteNumber = %d", paletteNumber);
2611d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2612d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(paletteNumber > 0xFFFF || palette.find(paletteNumber) == palette.end())
2613d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2614d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
2615d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2616d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2617d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
2618d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2619d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			currentPalette = paletteNumber;
2620d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2621d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sw::Surface::setTexturePalette((unsigned int*)&palette[currentPalette]);
2622d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2623d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
2624d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2625d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setCurrentTexturePalette(paletteNumber);
2626d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2627d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2628d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2629d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2630d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2631d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void Direct3DDevice9::SetCursorPosition(int x, int y, unsigned long flags)
2632d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2633d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2634d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2635d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("int x = %d, int y = %d, unsigned long flags = 0x%0.8X", x, y, flags);
2636d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2637d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		POINT point = {x, y};
2638d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		HWND window = deviceWindow ? deviceWindow : focusWindow;
2639d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		ScreenToClient(window, &point);
2640d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2641d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		sw::FrameBuffer::setCursorPosition(point.x, point.y);
2642d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2643d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2644d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetCursorProperties(unsigned int x0, unsigned int y0, IDirect3DSurface9 *cursorBitmap)
2645d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2646d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2647d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2648d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int x0 = %d, unsigned int y0 = %d, IDirect3DSurface9 *cursorBitmap = 0x%0.8p", x0, y0, cursorBitmap);
2649d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2650d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!cursorBitmap)
2651d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2652d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
2653d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2654d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2655d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		sw::Surface *cursorSurface = static_cast<Direct3DSurface9*>(cursorBitmap);
2656d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2657d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int width = cursorSurface->getWidth();
2658d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int height = cursorSurface->getHeight();
2659d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void *bitmap = cursorSurface->lockExternal(0, 0, 0, sw::LOCK_READONLY, sw::PUBLIC);
2660d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2661d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		delete cursor;
2662d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		cursor = new sw::Surface(0, width, height, 1, sw::FORMAT_A8R8G8B8, false, false);
2663d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2664d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void *buffer = cursor->lockExternal(0, 0, 0, sw::LOCK_DISCARD, sw::PUBLIC);
2665d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		memcpy(buffer, bitmap, width * height * sizeof(unsigned int));
2666d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		cursor->unlockExternal();
2667d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2668d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		cursorSurface->unlockExternal();
2669d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2670d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(showCursor)
2671d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2672d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sw::FrameBuffer::setCursorImage(cursor);
2673d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2674d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
2675d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2676d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sw::FrameBuffer::setCursorImage(0);
2677d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2678d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2679d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		sw::FrameBuffer::setCursorOrigin(x0, y0);
2680d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2681d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2682d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2683d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2684d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetDepthStencilSurface(IDirect3DSurface9 *iDepthStencil)
2685d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2686d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2687d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2688d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("IDirect3DSurface9 *newDepthStencil = 0x%0.8p", iDepthStencil);
2689d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2690d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Direct3DSurface9 *depthStencil = static_cast<Direct3DSurface9*>(iDepthStencil);
2691d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2692d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(this->depthStencil == depthStencil)
2693d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2694d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return D3D_OK;
2695d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2696d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2697d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(depthStencil)
2698d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2699d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			depthStencil->bind();
2700d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2701d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2702d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(this->depthStencil)
2703d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2704d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			this->depthStencil->unbind();
2705d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2706d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2707d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		this->depthStencil = depthStencil;
2708d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2709d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		renderer->setDepthBuffer(depthStencil);
2710d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		renderer->setStencilBuffer(depthStencil);
2711d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2712d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2713d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2714d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2715d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetDialogBoxMode(int enableDialogs)
2716d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2717d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2718d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2719d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("int enableDialogs = %d", enableDialogs);
2720d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2721d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		UNIMPLEMENTED();
2722d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2723d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2724d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2725d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2726d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetFVF(unsigned long FVF)
2727d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2728d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2729d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2730d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned long FVF = 0x%0.8X", FVF);
2731d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2732d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
2733d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2734d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(FVF != 0 || !this->vertexDeclaration)
2735d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
2736d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				Direct3DVertexDeclaration9 *vertexDeclaration = new Direct3DVertexDeclaration9(this, FVF);
2737d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				vertexDeclaration->bind();
2738d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2739d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(this->vertexDeclaration)
2740d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
2741d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					this->vertexDeclaration->unbind();
2742d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
2743d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2744d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				this->vertexDeclaration = vertexDeclaration;
2745d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
2746d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2747d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
2748d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2749d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setFVF(FVF);
2750d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2751d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2752d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2753d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2754d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2755d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void Direct3DDevice9::SetGammaRamp(unsigned int index, unsigned long flags, const D3DGAMMARAMP *ramp)
2756d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2757d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2758d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2759d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int index = %d, unsigned long flags = 0x%0.8X, const D3DGAMMARAMP *ramp = 0x%0.8p", index, flags, ramp);
2760d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2761d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!ramp || index >= GetNumberOfSwapChains())
2762d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2763d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return;
2764d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2765d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2766d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		swapChain->setGammaRamp((sw::GammaRamp*)ramp, flags & D3DSGR_CALIBRATE);
2767d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2768d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2769d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetIndices(IDirect3DIndexBuffer9* iIndexBuffer)
2770d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2771d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2772d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2773d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("IDirect3DIndexBuffer9* indexData = 0x%0.8p", iIndexBuffer);
2774d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2775d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Direct3DIndexBuffer9 *indexBuffer = static_cast<Direct3DIndexBuffer9*>(iIndexBuffer);
2776d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2777d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
2778d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2779d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(this->indexData == indexBuffer)
2780d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
2781d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				return D3D_OK;
2782d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
2783d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2784d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(indexBuffer)
2785d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
2786d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				indexBuffer->bind();
2787d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
2788d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2789d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(this->indexData)
2790d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
2791d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				this->indexData->unbind();
2792d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
2793d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2794d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			this->indexData = indexBuffer;
2795d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2796d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
2797d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2798d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setIndices(indexBuffer);
2799d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2800d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2801d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2802d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2803d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2804d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetLight(unsigned long index, const D3DLIGHT9 *light)
2805d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2806d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2807d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2808d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned long index = %d, const D3DLIGHT9 *light = 0x%0.8p", index, light);
2809d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2810d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!light)
2811d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2812d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
2813d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2814d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2815d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
2816d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2817d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			this->light[index] = *light;
2818d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2819d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			lightsDirty = true;
2820d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2821d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
2822d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2823d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setLight(index, light);
2824d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2825d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2826d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2827d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2828d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2829d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetMaterial(const D3DMATERIAL9 *material)
2830d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2831d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2832d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2833d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("const D3DMATERIAL9 *material = 0x%0.8p", material);
2834d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2835d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!material)
2836d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2837d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();   // FIXME: Correct behaviour?
2838d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2839d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2840d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
2841d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2842d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			this->material = *material;
2843d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2844d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setMaterialAmbient(sw::Color<float>(material->Ambient.r, material->Ambient.g, material->Ambient.b, material->Ambient.a));
2845d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setMaterialDiffuse(sw::Color<float>(material->Diffuse.r, material->Diffuse.g, material->Diffuse.b, material->Diffuse.a));
2846d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setMaterialEmission(sw::Color<float>(material->Emissive.r, material->Emissive.g, material->Emissive.b, material->Emissive.a));
2847d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setMaterialShininess(material->Power);
2848d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setMaterialSpecular(sw::Color<float>(material->Specular.r, material->Specular.g, material->Specular.b, material->Specular.a));
2849d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2850d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
2851d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2852d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setMaterial(material);
2853d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2854d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2855d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2856d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2857d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2858d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetNPatchMode(float segments)
2859d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2860d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2861d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2862d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("float segments = %f", segments);
2863d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2864d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
2865d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2866d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(segments < 1)
2867d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
2868d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				// NOTE: Disable
2869d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
2870d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			else
2871d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
2872d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				UNIMPLEMENTED();
2873d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
2874d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2875d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
2876d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2877d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setNPatchMode(segments);
2878d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2879d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2880d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2881d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2882d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2883d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetPaletteEntries(unsigned int paletteNumber, const PALETTEENTRY *entries)
2884d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2885d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2886d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2887d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int paletteNumber = %d, const PALETTEENTRY *entries = 0x%0.8p", paletteNumber, entries);
2888d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2889d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(paletteNumber > 0xFFFF || !entries)
2890d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2891d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
2892d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2893d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2894d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(int i = 0; i < 256; i++)
2895d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2896d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			palette[paletteNumber].entry[i] = entries[i];
2897d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2898d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2899d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(paletteNumber == currentPalette)
2900d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2901d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sw::Surface::setTexturePalette((unsigned int*)&palette[currentPalette]);
2902d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2903d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2904d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2905d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2906d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2907d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetPixelShader(IDirect3DPixelShader9 *iPixelShader)
2908d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2909d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2910d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2911d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("IDirect3DPixelShader9 *shader = 0x%0.8p", iPixelShader);
2912d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2913d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Direct3DPixelShader9 *pixelShader = static_cast<Direct3DPixelShader9*>(iPixelShader);
2914d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2915d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
2916d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2917d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(this->pixelShader == pixelShader)
2918d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
2919d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				return D3D_OK;
2920d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
2921d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2922d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(pixelShader)
2923d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
2924d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				pixelShader->bind();
2925d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
2926d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2927d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(this->pixelShader)
2928d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
2929d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				this->pixelShader->unbind();
2930d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
2931d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2932d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			this->pixelShader = pixelShader;
2933d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			pixelShaderDirty = true;
2934d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2935d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
2936d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2937d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setPixelShader(pixelShader);
2938d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2939d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2940d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2941d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2942d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2943d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetPixelShaderConstantB(unsigned int startRegister, const int *constantData, unsigned int count)
2944d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2945d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2946d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2947d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int startRegister = %d, const int *constantData = 0x%0.8p, unsigned int count = %d", startRegister, constantData, count);
2948d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2949d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
2950d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2951d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			for(unsigned int i = 0; i < count && startRegister + i < 16; i++)
2952d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
2953d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				pixelShaderConstantB[startRegister + i] = constantData[i];
2954d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
2955d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2956d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			pixelShaderConstantsBDirty = sw::max(startRegister + count, pixelShaderConstantsBDirty);
2957d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			pixelShaderDirty = true;   // Reload DEF constants
2958d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2959d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
2960d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2961d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setPixelShaderConstantB(startRegister, constantData, count);
2962d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2963d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2964d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2965d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2966d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2967d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetPixelShaderConstantF(unsigned int startRegister, const float *constantData, unsigned int count)
2968d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2969d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2970d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2971d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int startRegister = %d, const int *constantData = 0x%0.8p, unsigned int count = %d", startRegister, constantData, count);
2972d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2973d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
2974d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2975d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			for(unsigned int i = 0; i < count && startRegister + i < MAX_PIXEL_SHADER_CONST; i++)
2976d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
2977d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				pixelShaderConstantF[startRegister + i][0] = constantData[i * 4 + 0];
2978d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				pixelShaderConstantF[startRegister + i][1] = constantData[i * 4 + 1];
2979d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				pixelShaderConstantF[startRegister + i][2] = constantData[i * 4 + 2];
2980d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				pixelShaderConstantF[startRegister + i][3] = constantData[i * 4 + 3];
2981d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
2982d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2983d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			pixelShaderConstantsFDirty = sw::max(startRegister + count, pixelShaderConstantsFDirty);
2984d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			pixelShaderDirty = true;   // Reload DEF constants
2985d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2986d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
2987d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
2988d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setPixelShaderConstantF(startRegister, constantData, count);
2989d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
2990d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2991d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
2992d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
2993d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2994d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetPixelShaderConstantI(unsigned int startRegister, const int *constantData, unsigned int count)
2995d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
2996d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
2997d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
2998d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int startRegister = %d, const int *constantData = 0x%0.8p, unsigned int count = %d", startRegister, constantData, count);
2999d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
3000d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
3001d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
3002d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			for(unsigned int i = 0; i < count && startRegister + i < 16; i++)
3003d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
3004d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				pixelShaderConstantI[startRegister + i][0] = constantData[i * 4 + 0];
3005d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				pixelShaderConstantI[startRegister + i][1] = constantData[i * 4 + 1];
3006d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				pixelShaderConstantI[startRegister + i][2] = constantData[i * 4 + 2];
3007d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				pixelShaderConstantI[startRegister + i][3] = constantData[i * 4 + 3];
3008d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
3009d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
3010d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			pixelShaderConstantsIDirty = sw::max(startRegister + count, pixelShaderConstantsIDirty);
3011d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			pixelShaderDirty = true;   // Reload DEF constants
3012d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
3013d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
3014d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
3015d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setPixelShaderConstantI(startRegister, constantData, count);
3016d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
3017d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
3018d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
3019d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
3020d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
3021d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetRenderState(D3DRENDERSTATETYPE state, unsigned long value)
3022d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
3023d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
3024d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
3025d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("D3DRENDERSTATETYPE state = %d, unsigned long value = %d", state, value);
3026d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
3027d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(state < D3DRS_ZENABLE || state > D3DRS_BLENDOPALPHA)
3028d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
3029d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return D3D_OK;   // FIXME: Warning
3030d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
3031d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
3032d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
3033d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
3034d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(!init && renderState[state] == value)
3035d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
3036d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				return D3D_OK;
3037d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
3038d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
3039d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderState[state] = value;
3040d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
3041d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			switch(state)
3042d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
3043d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_ZENABLE:
3044d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3045d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3046d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DZB_TRUE:
3047d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DZB_USEW:
3048d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDepthBufferEnable(true);
3049d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3050d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DZB_FALSE:
3051d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDepthBufferEnable(false);
3052d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3053d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3054d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3055d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3056d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3057d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_FILLMODE:
3058d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3059d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3060d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DFILL_POINT:
3061d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFillMode(sw::FILL_VERTEX);
3062d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3063d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DFILL_WIREFRAME:
3064d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFillMode(sw::FILL_WIREFRAME);
3065d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3066d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DFILL_SOLID:
3067d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFillMode(sw::FILL_SOLID);
3068d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3069d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3070d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3071d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3072d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3073d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_SHADEMODE:
3074d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3075d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3076d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSHADE_FLAT:
3077d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setShadingMode(sw::SHADING_FLAT);
3078d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3079d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSHADE_GOURAUD:
3080d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setShadingMode(sw::SHADING_GOURAUD);
3081d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3082d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSHADE_PHONG:
3083d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3084d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3085d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3086d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3087d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3088d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_ZWRITEENABLE:
3089d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setDepthWriteEnable(value != FALSE);
3090d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3091d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_ALPHATESTENABLE:
3092d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setAlphaTestEnable(value != FALSE);
3093d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3094d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_LASTPIXEL:
3095d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			//	if(!init) UNIMPLEMENTED();   // FIXME
3096d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3097d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_SRCBLEND:
3098d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3099d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3100d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_ZERO:
3101d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactor(sw::BLEND_ZERO);
3102d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3103d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_ONE:
3104d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactor(sw::BLEND_ONE);
3105d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3106d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_SRCCOLOR:
3107d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactor(sw::BLEND_SOURCE);
3108d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3109d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_INVSRCCOLOR:
3110d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactor(sw::BLEND_INVSOURCE);
3111d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3112d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_SRCALPHA:
3113d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactor(sw::BLEND_SOURCEALPHA);
3114d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3115d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_INVSRCALPHA:
3116d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactor(sw::BLEND_INVSOURCEALPHA);
3117d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3118d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_DESTALPHA:
3119d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactor(sw::BLEND_DESTALPHA);
3120d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3121d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_INVDESTALPHA:
3122d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactor(sw::BLEND_INVDESTALPHA);
3123d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3124d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_DESTCOLOR:
3125d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactor(sw::BLEND_DEST);
3126d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3127d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_INVDESTCOLOR:
3128d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactor(sw::BLEND_INVDEST);
3129d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3130d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_SRCALPHASAT:
3131d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactor(sw::BLEND_SRCALPHASAT);
3132d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3133d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_BOTHSRCALPHA:
3134d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactor(sw::BLEND_SOURCEALPHA);
3135d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactor(sw::BLEND_INVSOURCEALPHA);
3136d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3137d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_BOTHINVSRCALPHA:
3138d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactor(sw::BLEND_INVSOURCEALPHA);
3139d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactor(sw::BLEND_SOURCEALPHA);
3140d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3141d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_BLENDFACTOR:
3142d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactor(sw::BLEND_CONSTANT);
3143d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3144d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_INVBLENDFACTOR:
3145d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactor(sw::BLEND_INVCONSTANT);
3146d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3147d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3148d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3149d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3150d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3151d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_DESTBLEND:
3152d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3153d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3154d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_ZERO:
3155d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactor(sw::BLEND_ZERO);
3156d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3157d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_ONE:
3158d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactor(sw::BLEND_ONE);
3159d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3160d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_SRCCOLOR:
3161d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactor(sw::BLEND_SOURCE);
3162d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3163d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_INVSRCCOLOR:
3164d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactor(sw::BLEND_INVSOURCE);
3165d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3166d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_SRCALPHA:
3167d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactor(sw::BLEND_SOURCEALPHA);
3168d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3169d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_INVSRCALPHA:
3170d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactor(sw::BLEND_INVSOURCEALPHA);
3171d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3172d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_DESTALPHA:
3173d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactor(sw::BLEND_DESTALPHA);
3174d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3175d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_INVDESTALPHA:
3176d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactor(sw::BLEND_INVDESTALPHA);
3177d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3178d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_DESTCOLOR:
3179d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactor(sw::BLEND_DEST);
3180d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3181d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_INVDESTCOLOR:
3182d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactor(sw::BLEND_INVDEST);
3183d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3184d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_SRCALPHASAT:
3185d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactor(sw::BLEND_SRCALPHASAT);
3186d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3187d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_BOTHSRCALPHA:
3188d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactor(sw::BLEND_SOURCEALPHA);
3189d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactor(sw::BLEND_INVSOURCEALPHA);
3190d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3191d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_BOTHINVSRCALPHA:
3192d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactor(sw::BLEND_INVSOURCEALPHA);
3193d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactor(sw::BLEND_SOURCEALPHA);
3194d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3195d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_BLENDFACTOR:
3196d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactor(sw::BLEND_CONSTANT);
3197d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3198d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_INVBLENDFACTOR:
3199d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactor(sw::BLEND_INVCONSTANT);
3200d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3201d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3202d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3203d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3204d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3205d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_CULLMODE:
3206d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3207d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3208d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCULL_NONE:
3209d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setCullMode(sw::CULL_NONE);
3210d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3211d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCULL_CCW:
3212d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setCullMode(sw::CULL_COUNTERCLOCKWISE);
3213d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3214d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCULL_CW:
3215d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setCullMode(sw::CULL_CLOCKWISE);
3216d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3217d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3218d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3219d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3220d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3221d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_ZFUNC:
3222d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3223d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3224d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_NEVER:
3225d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDepthCompare(sw::DEPTH_NEVER);
3226d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3227d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_LESS:
3228d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDepthCompare(sw::DEPTH_LESS);
3229d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3230d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_EQUAL:
3231d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDepthCompare(sw::DEPTH_EQUAL);
3232d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3233d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_LESSEQUAL:
3234d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDepthCompare(sw::DEPTH_LESSEQUAL);
3235d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3236d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_GREATER:
3237d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDepthCompare(sw::DEPTH_GREATER);
3238d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3239d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_NOTEQUAL:
3240d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDepthCompare(sw::DEPTH_NOTEQUAL);
3241d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3242d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_GREATEREQUAL:
3243d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDepthCompare(sw::DEPTH_GREATEREQUAL);
3244d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3245d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_ALWAYS:
3246d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDepthCompare(sw::DEPTH_ALWAYS);
3247d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3248d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3249d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3250d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3251d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3252d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_ALPHAREF:
3253d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setAlphaReference(value & 0x000000FF);
3254d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3255d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_ALPHAFUNC:
3256d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3257d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3258d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_NEVER:
3259d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAlphaCompare(sw::ALPHA_NEVER);
3260d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3261d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_LESS:
3262d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAlphaCompare(sw::ALPHA_LESS);
3263d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3264d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_EQUAL:
3265d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAlphaCompare(sw::ALPHA_EQUAL);
3266d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3267d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_LESSEQUAL:
3268d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAlphaCompare(sw::ALPHA_LESSEQUAL);
3269d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3270d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_GREATER:
3271d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAlphaCompare(sw::ALPHA_GREATER);
3272d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3273d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_NOTEQUAL:
3274d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAlphaCompare(sw::ALPHA_NOTEQUAL);
3275d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3276d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_GREATEREQUAL:
3277d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAlphaCompare(sw::ALPHA_GREATEREQUAL);
3278d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3279d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_ALWAYS:
3280d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAlphaCompare(sw::ALPHA_ALWAYS);
3281d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3282d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3283d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3284d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3285d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3286d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_DITHERENABLE:
3287d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			//	if(!init) UNIMPLEMENTED();
3288d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3289d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_ALPHABLENDENABLE:
3290d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setAlphaBlendEnable(value != FALSE);
3291d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3292d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_FOGENABLE:
3293d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setFogEnable(value != FALSE);
3294d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3295d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_FOGCOLOR:
3296d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setFogColor(value);
3297d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3298d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_FOGTABLEMODE:
3299d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3300d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3301d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DFOG_NONE:
3302d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setPixelFogMode(sw::FOG_NONE);
3303d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3304d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DFOG_LINEAR:
3305d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setPixelFogMode(sw::FOG_LINEAR);
3306d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3307d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DFOG_EXP:
3308d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setPixelFogMode(sw::FOG_EXP);
3309d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3310d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DFOG_EXP2:
3311d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setPixelFogMode(sw::FOG_EXP2);
3312d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3313d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3314d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3315d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3316d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3317d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_FOGSTART:
3318d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setFogStart((float&)value);
3319d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3320d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_FOGEND:
3321d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setFogEnd((float&)value);
3322d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3323d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_FOGDENSITY:
3324d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setFogDensity((float&)value);
3325d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3326d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_RANGEFOGENABLE:
3327d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setRangeFogEnable(value != FALSE);
3328d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3329d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_SPECULARENABLE:
3330d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setSpecularEnable(value != FALSE);
3331d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3332d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_STENCILENABLE:
3333d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setStencilEnable(value != FALSE);
3334d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3335d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_STENCILFAIL:
3336d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3337d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3338d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_KEEP:
3339d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilFailOperation(sw::OPERATION_KEEP);
3340d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3341d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_ZERO:
3342d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilFailOperation(sw::OPERATION_ZERO);
3343d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3344d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_REPLACE:
3345d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilFailOperation(sw::OPERATION_REPLACE);
3346d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3347d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_INCRSAT:
3348d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilFailOperation(sw::OPERATION_INCRSAT);
3349d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3350d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_DECRSAT:
3351d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilFailOperation(sw::OPERATION_DECRSAT);
3352d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3353d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_INVERT:
3354d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilFailOperation(sw::OPERATION_INVERT);
3355d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3356d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_INCR:
3357d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilFailOperation(sw::OPERATION_INCR);
3358d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3359d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_DECR:
3360d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilFailOperation(sw::OPERATION_DECR);
3361d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3362d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3363d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3364d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3365d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3366d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_STENCILZFAIL:
3367d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3368d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3369d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_KEEP:
3370d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilZFailOperation(sw::OPERATION_KEEP);
3371d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3372d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_ZERO:
3373d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilZFailOperation(sw::OPERATION_ZERO);
3374d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3375d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_REPLACE:
3376d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilZFailOperation(sw::OPERATION_REPLACE);
3377d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3378d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_INCRSAT:
3379d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilZFailOperation(sw::OPERATION_INCRSAT);
3380d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3381d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_DECRSAT:
3382d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilZFailOperation(sw::OPERATION_DECRSAT);
3383d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3384d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_INVERT:
3385d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilZFailOperation(sw::OPERATION_INVERT);
3386d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3387d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_INCR:
3388d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilZFailOperation(sw::OPERATION_INCR);
3389d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3390d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_DECR:
3391d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilZFailOperation(sw::OPERATION_DECR);
3392d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3393d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3394d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3395d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3396d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3397d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_STENCILPASS:
3398d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3399d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3400d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_KEEP:
3401d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilPassOperation(sw::OPERATION_KEEP);
3402d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3403d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_ZERO:
3404d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilPassOperation(sw::OPERATION_ZERO);
3405d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3406d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_REPLACE:
3407d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilPassOperation(sw::OPERATION_REPLACE);
3408d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3409d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_INCRSAT:
3410d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilPassOperation(sw::OPERATION_INCRSAT);
3411d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3412d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_DECRSAT:
3413d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilPassOperation(sw::OPERATION_DECRSAT);
3414d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3415d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_INVERT:
3416d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilPassOperation(sw::OPERATION_INVERT);
3417d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3418d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_INCR:
3419d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilPassOperation(sw::OPERATION_INCR);
3420d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3421d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_DECR:
3422d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilPassOperation(sw::OPERATION_DECR);
3423d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3424d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3425d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3426d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3427d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3428d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_STENCILFUNC:
3429d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3430d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3431d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_NEVER:
3432d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilCompare(sw::STENCIL_NEVER);
3433d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3434d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_LESS:
3435d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilCompare(sw::STENCIL_LESS);
3436d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3437d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_EQUAL:
3438d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilCompare(sw::STENCIL_EQUAL);
3439d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3440d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_LESSEQUAL:
3441d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilCompare(sw::STENCIL_LESSEQUAL);
3442d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3443d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_GREATER:
3444d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilCompare(sw::STENCIL_GREATER);
3445d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3446d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_NOTEQUAL:
3447d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilCompare(sw::STENCIL_NOTEQUAL);
3448d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3449d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_GREATEREQUAL:
3450d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilCompare(sw::STENCIL_GREATEREQUAL);
3451d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3452d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_ALWAYS:
3453d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilCompare(sw::STENCIL_ALWAYS);
3454d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3455d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3456d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3457d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3458d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3459d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_STENCILREF:
3460d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setStencilReference(value);
3461d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setStencilReferenceCCW(value);
3462d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3463d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_STENCILMASK:
3464d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setStencilMask(value);
3465d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setStencilMaskCCW(value);
3466d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3467d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_STENCILWRITEMASK:
3468d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setStencilWriteMask(value);
3469d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setStencilWriteMaskCCW(value);
3470d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3471d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_TEXTUREFACTOR:
3472d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureFactor(value);
3473d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3474d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_WRAP0:
3475d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureWrap(0, value);
3476d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3477d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_WRAP1:
3478d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureWrap(1, value);
3479d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3480d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_WRAP2:
3481d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureWrap(2, value);
3482d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3483d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_WRAP3:
3484d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureWrap(3, value);
3485d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3486d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_WRAP4:
3487d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureWrap(4, value);
3488d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3489d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_WRAP5:
3490d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureWrap(5, value);
3491d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3492d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_WRAP6:
3493d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureWrap(6, value);
3494d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3495d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_WRAP7:
3496d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureWrap(7, value);
3497d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3498d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_CLIPPING:
3499d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				// Ignored, clipping is always performed
3500d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3501d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_LIGHTING:
3502d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setLightingEnable(value != FALSE);
3503d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3504d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_AMBIENT:
3505d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setGlobalAmbient(value);
3506d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3507d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_FOGVERTEXMODE:
3508d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3509d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3510d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DFOG_NONE:
3511d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setVertexFogMode(sw::FOG_NONE);
3512d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3513d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DFOG_LINEAR:
3514d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setVertexFogMode(sw::FOG_LINEAR);
3515d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3516d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DFOG_EXP:
3517d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setVertexFogMode(sw::FOG_EXP);
3518d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3519d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DFOG_EXP2:
3520d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setVertexFogMode(sw::FOG_EXP2);
3521d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3522d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3523d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3524d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3525d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3526d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_COLORVERTEX:
3527d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setColorVertexEnable(value != FALSE);
3528d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3529d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_LOCALVIEWER:
3530d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setLocalViewer(value != FALSE);
3531d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3532d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_NORMALIZENORMALS:
3533d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setNormalizeNormals(value != FALSE);
3534d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3535d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_DIFFUSEMATERIALSOURCE:
3536d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3537d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3538d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DMCS_MATERIAL:
3539d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDiffuseMaterialSource(sw::MATERIAL_MATERIAL);
3540d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3541d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DMCS_COLOR1:
3542d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDiffuseMaterialSource(sw::MATERIAL_COLOR1);
3543d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3544d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DMCS_COLOR2:
3545d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDiffuseMaterialSource(sw::MATERIAL_COLOR2);
3546d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3547d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3548d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3549d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3550d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3551d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_SPECULARMATERIALSOURCE:
3552d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3553d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3554d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DMCS_MATERIAL:
3555d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSpecularMaterialSource(sw::MATERIAL_MATERIAL);
3556d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3557d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DMCS_COLOR1:
3558d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSpecularMaterialSource(sw::MATERIAL_COLOR1);
3559d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3560d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DMCS_COLOR2:
3561d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSpecularMaterialSource(sw::MATERIAL_COLOR2);
3562d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3563d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3564d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3565d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3566d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3567d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_AMBIENTMATERIALSOURCE:
3568d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3569d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3570d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DMCS_MATERIAL:
3571d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAmbientMaterialSource(sw::MATERIAL_MATERIAL);
3572d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3573d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DMCS_COLOR1:
3574d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAmbientMaterialSource(sw::MATERIAL_COLOR1);
3575d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3576d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DMCS_COLOR2:
3577d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAmbientMaterialSource(sw::MATERIAL_COLOR2);
3578d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3579d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3580d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3581d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3582d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3583d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_EMISSIVEMATERIALSOURCE:
3584d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3585d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3586d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DMCS_MATERIAL:
3587d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setEmissiveMaterialSource(sw::MATERIAL_MATERIAL);
3588d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3589d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DMCS_COLOR1:
3590d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setEmissiveMaterialSource(sw::MATERIAL_COLOR1);
3591d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3592d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DMCS_COLOR2:
3593d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setEmissiveMaterialSource(sw::MATERIAL_COLOR2);
3594d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3595d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3596d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3597d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3598d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3599d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_VERTEXBLEND:
3600d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3601d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3602d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DVBF_DISABLE:
3603d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setVertexBlendMatrixCount(0);
3604d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3605d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DVBF_1WEIGHTS:
3606d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setVertexBlendMatrixCount(2);
3607d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3608d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DVBF_2WEIGHTS:
3609d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setVertexBlendMatrixCount(3);
3610d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3611d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DVBF_3WEIGHTS:
3612d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setVertexBlendMatrixCount(4);
3613d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3614d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DVBF_TWEENING:
3615d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					UNIMPLEMENTED();
3616d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3617d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DVBF_0WEIGHTS:
3618d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setVertexBlendMatrixCount(1);
3619d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3620d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3621d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3622d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3623d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3624d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_CLIPPLANEENABLE:
3625d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setClipFlags(value);
3626d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3627d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_POINTSIZE:
3628d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(value == D3DFMT_INST && pixelShaderVersionX >= D3DPS_VERSION(2, 0))   // ATI hack to enable instancing on SM 2.0 hardware
3629d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3630d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					instancingEnabled = true;
3631d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3632d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				else if(value == D3DFMT_A2M1)   // ATI hack to enable transparency anti-aliasing
3633d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3634d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTransparencyAntialiasing(sw::TRANSPARENCY_ALPHA_TO_COVERAGE);
3635d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAlphaTestEnable(true);
3636d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3637d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				else if(value == D3DFMT_A2M0)   // ATI hack to disable transparency anti-aliasing
3638d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3639d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTransparencyAntialiasing(sw::TRANSPARENCY_NONE);
3640d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAlphaTestEnable(false);
3641d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3642d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				else
3643d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3644d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setPointSize((float&)value);
3645d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3646d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3647d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_POINTSIZE_MIN:
3648d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setPointSizeMin((float&)value);
3649d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3650d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_POINTSPRITEENABLE:
3651d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setPointSpriteEnable(value != FALSE);
3652d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3653d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_POINTSCALEENABLE:
3654d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setPointScaleEnable(value != FALSE);
3655d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3656d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_POINTSCALE_A:
3657d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setPointScaleA((float&)value);
3658d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3659d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_POINTSCALE_B:
3660d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setPointScaleB((float&)value);
3661d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3662d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_POINTSCALE_C:
3663d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setPointScaleC((float&)value);
3664d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3665d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_MULTISAMPLEANTIALIAS:
3666d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			//	if(!init) UNIMPLEMENTED();
3667d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3668d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_MULTISAMPLEMASK:
3669d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				SetRenderTarget(0, renderTarget[0]);   // Sets the multi-sample mask, if maskable
3670d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3671d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_PATCHEDGESTYLE:
3672d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(!init) if(value != D3DPATCHEDGE_DISCRETE) UNIMPLEMENTED();
3673d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3674d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_DEBUGMONITORTOKEN:
3675d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(!init) UNIMPLEMENTED();
3676d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3677d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_POINTSIZE_MAX:
3678d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setPointSizeMax((float&)value);
3679d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3680d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_INDEXEDVERTEXBLENDENABLE:
3681d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setIndexedVertexBlendEnable(value != FALSE);
3682d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3683d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_COLORWRITEENABLE:
3684d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setColorWriteMask(0, value & 0x0000000F);
3685d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3686d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_TWEENFACTOR:
3687d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(!init) UNIMPLEMENTED();
3688d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3689d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_BLENDOP:
3690d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3691d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3692d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLENDOP_ADD:
3693d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setBlendOperation(sw::BLENDOP_ADD);
3694d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3695d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLENDOP_SUBTRACT:
3696d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setBlendOperation(sw::BLENDOP_SUB);
3697d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3698d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLENDOP_REVSUBTRACT:
3699d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setBlendOperation(sw::BLENDOP_INVSUB);
3700d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3701d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLENDOP_MIN:
3702d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setBlendOperation(sw::BLENDOP_MIN);
3703d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3704d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLENDOP_MAX:
3705d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setBlendOperation(sw::BLENDOP_MAX);
3706d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3707d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3708d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3709d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3710d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3711d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_POSITIONDEGREE:
3712d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(!init) UNIMPLEMENTED();
3713d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3714d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_NORMALDEGREE:
3715d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(!init) UNIMPLEMENTED();
3716d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3717d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_SCISSORTESTENABLE:
3718d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				scissorEnable = (value != FALSE);
3719d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3720d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_SLOPESCALEDEPTHBIAS:
3721d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setSlopeDepthBias((float&)value);
3722d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3723d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_ANTIALIASEDLINEENABLE:
3724d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(!init) if(value != FALSE) UNIMPLEMENTED();
3725d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3726d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_MINTESSELLATIONLEVEL:
3727d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(!init) UNIMPLEMENTED();
3728d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3729d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_MAXTESSELLATIONLEVEL:
3730d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(!init) UNIMPLEMENTED();
3731d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3732d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_ADAPTIVETESS_X:
3733d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(!init) if((float&)value != 0.0f) UNIMPLEMENTED();
3734d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3735d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_ADAPTIVETESS_Y:
3736d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(value == D3DFMT_ATOC)   // NVIDIA hack to enable transparency anti-aliasing
3737d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3738d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTransparencyAntialiasing(sw::TRANSPARENCY_ALPHA_TO_COVERAGE);
3739d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3740d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				else if(value == D3DFMT_UNKNOWN)   // NVIDIA hack to disable transparency anti-aliasing
3741d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3742d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTransparencyAntialiasing(sw::TRANSPARENCY_NONE);
3743d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3744d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				else
3745d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3746d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					if(!init) if((float&)value != 0.0f) UNIMPLEMENTED();
3747d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3748d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3749d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_ADAPTIVETESS_Z:
3750d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(!init) if((float&)value != 1.0f) UNIMPLEMENTED();
3751d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3752d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_ADAPTIVETESS_W:
3753d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(!init) if((float&)value != 0.0f) UNIMPLEMENTED();
3754d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3755d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_ENABLEADAPTIVETESSELLATION:
3756d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(!init) UNIMPLEMENTED();
3757d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3758d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_TWOSIDEDSTENCILMODE:
3759d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTwoSidedStencil(value != FALSE);
3760d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3761d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_CCW_STENCILFAIL:
3762d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3763d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3764d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_KEEP:
3765d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilFailOperationCCW(sw::OPERATION_KEEP);
3766d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3767d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_ZERO:
3768d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilFailOperationCCW(sw::OPERATION_ZERO);
3769d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3770d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_REPLACE:
3771d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilFailOperationCCW(sw::OPERATION_REPLACE);
3772d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3773d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_INCRSAT:
3774d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilFailOperationCCW(sw::OPERATION_INCRSAT);
3775d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3776d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_DECRSAT:
3777d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilFailOperationCCW(sw::OPERATION_DECRSAT);
3778d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3779d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_INVERT:
3780d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilFailOperationCCW(sw::OPERATION_INVERT);
3781d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3782d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_INCR:
3783d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilFailOperationCCW(sw::OPERATION_INCR);
3784d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3785d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_DECR:
3786d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilFailOperationCCW(sw::OPERATION_DECR);
3787d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3788d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3789d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3790d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3791d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3792d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_CCW_STENCILZFAIL:
3793d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3794d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3795d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_KEEP:
3796d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilZFailOperationCCW(sw::OPERATION_KEEP);
3797d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3798d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_ZERO:
3799d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilZFailOperationCCW(sw::OPERATION_ZERO);
3800d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3801d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_REPLACE:
3802d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilZFailOperationCCW(sw::OPERATION_REPLACE);
3803d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3804d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_INCRSAT:
3805d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilZFailOperationCCW(sw::OPERATION_INCRSAT);
3806d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3807d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_DECRSAT:
3808d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilZFailOperationCCW(sw::OPERATION_DECRSAT);
3809d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3810d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_INVERT:
3811d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilZFailOperationCCW(sw::OPERATION_INVERT);
3812d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3813d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_INCR:
3814d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilZFailOperationCCW(sw::OPERATION_INCR);
3815d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3816d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_DECR:
3817d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilZFailOperationCCW(sw::OPERATION_DECR);
3818d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3819d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3820d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3821d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3822d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3823d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_CCW_STENCILPASS:
3824d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3825d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3826d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_KEEP:
3827d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilPassOperationCCW(sw::OPERATION_KEEP);
3828d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3829d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_ZERO:
3830d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilPassOperationCCW(sw::OPERATION_ZERO);
3831d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3832d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_REPLACE:
3833d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilPassOperationCCW(sw::OPERATION_REPLACE);
3834d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3835d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_INCRSAT:
3836d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilPassOperationCCW(sw::OPERATION_INCRSAT);
3837d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3838d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_DECRSAT:
3839d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilPassOperationCCW(sw::OPERATION_DECRSAT);
3840d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3841d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_INVERT:
3842d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilPassOperationCCW(sw::OPERATION_INVERT);
3843d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3844d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_INCR:
3845d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilPassOperationCCW(sw::OPERATION_INCR);
3846d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3847d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DSTENCILOP_DECR:
3848d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilPassOperationCCW(sw::OPERATION_DECR);
3849d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3850d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3851d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3852d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3853d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3854d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_CCW_STENCILFUNC:
3855d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3856d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3857d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_NEVER:
3858d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilCompareCCW(sw::STENCIL_NEVER);
3859d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3860d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_LESS:
3861d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilCompareCCW(sw::STENCIL_LESS);
3862d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3863d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_EQUAL:
3864d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilCompareCCW(sw::STENCIL_EQUAL);
3865d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3866d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_LESSEQUAL:
3867d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilCompareCCW(sw::STENCIL_LESSEQUAL);
3868d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3869d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_GREATER:
3870d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilCompareCCW(sw::STENCIL_GREATER);
3871d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3872d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_NOTEQUAL:
3873d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilCompareCCW(sw::STENCIL_NOTEQUAL);
3874d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3875d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_GREATEREQUAL:
3876d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilCompareCCW(sw::STENCIL_GREATEREQUAL);
3877d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3878d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DCMP_ALWAYS:
3879d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStencilCompareCCW(sw::STENCIL_ALWAYS);
3880d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3881d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3882d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3883d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3884d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3885d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_COLORWRITEENABLE1:
3886d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setColorWriteMask(1, value);
3887d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3888d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_COLORWRITEENABLE2:
3889d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setColorWriteMask(2, value);
3890d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3891d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_COLORWRITEENABLE3:
3892d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setColorWriteMask(3, value);
3893d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3894d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_BLENDFACTOR:
3895d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setBlendConstant(sw::Color<float>(value));
3896d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3897d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_SRGBWRITEENABLE:
3898d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setWriteSRGB(value != FALSE);
3899d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3900d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_DEPTHBIAS:
3901d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setDepthBias((float&)value);
3902d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3903d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_WRAP8:
3904d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureWrap(8, value);
3905d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3906d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_WRAP9:
3907d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureWrap(9, value);
3908d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3909d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_WRAP10:
3910d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureWrap(10, value);
3911d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3912d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_WRAP11:
3913d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureWrap(11, value);
3914d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3915d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_WRAP12:
3916d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureWrap(12, value);
3917d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3918d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_WRAP13:
3919d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureWrap(13, value);
3920d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3921d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_WRAP14:
3922d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureWrap(14, value);
3923d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3924d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_WRAP15:
3925d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureWrap(15, value);
3926d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3927d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_SEPARATEALPHABLENDENABLE:
3928d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setSeparateAlphaBlendEnable(value != FALSE);
3929d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3930d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_SRCBLENDALPHA:
3931d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3932d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3933d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_ZERO:
3934d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactorAlpha(sw::BLEND_ZERO);
3935d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3936d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_ONE:
3937d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactorAlpha(sw::BLEND_ONE);
3938d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3939d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_SRCCOLOR:
3940d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactorAlpha(sw::BLEND_SOURCE);
3941d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3942d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_INVSRCCOLOR:
3943d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactorAlpha(sw::BLEND_INVSOURCE);
3944d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3945d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_SRCALPHA:
3946d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactorAlpha(sw::BLEND_SOURCEALPHA);
3947d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3948d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_INVSRCALPHA:
3949d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactorAlpha(sw::BLEND_INVSOURCEALPHA);
3950d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3951d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_DESTALPHA:
3952d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactorAlpha(sw::BLEND_DESTALPHA);
3953d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3954d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_INVDESTALPHA:
3955d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactorAlpha(sw::BLEND_INVDESTALPHA);
3956d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3957d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_DESTCOLOR:
3958d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactorAlpha(sw::BLEND_DEST);
3959d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3960d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_INVDESTCOLOR:
3961d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactorAlpha(sw::BLEND_INVDEST);
3962d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3963d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_SRCALPHASAT:
3964d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactorAlpha(sw::BLEND_SRCALPHASAT);
3965d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3966d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_BOTHSRCALPHA:
3967d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactorAlpha(sw::BLEND_SOURCEALPHA);
3968d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactorAlpha(sw::BLEND_INVSOURCEALPHA);
3969d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3970d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_BOTHINVSRCALPHA:
3971d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactorAlpha(sw::BLEND_INVSOURCEALPHA);
3972d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactorAlpha(sw::BLEND_SOURCEALPHA);
3973d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3974d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_BLENDFACTOR:
3975d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactorAlpha(sw::BLEND_CONSTANT);
3976d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3977d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_INVBLENDFACTOR:
3978d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactorAlpha(sw::BLEND_INVCONSTANT);
3979d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3980d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
3981d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
3982d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
3983d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
3984d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_DESTBLENDALPHA:
3985d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
3986d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
3987d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_ZERO:
3988d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactorAlpha(sw::BLEND_ZERO);
3989d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3990d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_ONE:
3991d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactorAlpha(sw::BLEND_ONE);
3992d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3993d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_SRCCOLOR:
3994d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactorAlpha(sw::BLEND_SOURCE);
3995d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3996d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_INVSRCCOLOR:
3997d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactorAlpha(sw::BLEND_INVSOURCE);
3998d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
3999d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_SRCALPHA:
4000d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactorAlpha(sw::BLEND_SOURCEALPHA);
4001d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4002d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_INVSRCALPHA:
4003d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactorAlpha(sw::BLEND_INVSOURCEALPHA);
4004d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4005d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_DESTALPHA:
4006d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactorAlpha(sw::BLEND_DESTALPHA);
4007d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4008d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_INVDESTALPHA:
4009d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactorAlpha(sw::BLEND_INVDESTALPHA);
4010d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4011d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_DESTCOLOR:
4012d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactorAlpha(sw::BLEND_DEST);
4013d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4014d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_INVDESTCOLOR:
4015d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactorAlpha(sw::BLEND_INVDEST);
4016d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4017d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_SRCALPHASAT:
4018d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactorAlpha(sw::BLEND_SRCALPHASAT);
4019d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4020d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_BOTHSRCALPHA:
4021d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactorAlpha(sw::BLEND_SOURCEALPHA);
4022d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactorAlpha(sw::BLEND_INVSOURCEALPHA);
4023d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4024d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_BOTHINVSRCALPHA:
4025d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSourceBlendFactorAlpha(sw::BLEND_INVSOURCEALPHA);
4026d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactorAlpha(sw::BLEND_SOURCEALPHA);
4027d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4028d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_BLENDFACTOR:
4029d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactorAlpha(sw::BLEND_CONSTANT);
4030d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4031d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLEND_INVBLENDFACTOR:
4032d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestBlendFactorAlpha(sw::BLEND_INVCONSTANT);
4033d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4034d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
4035d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
4036d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
4037d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4038d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DRS_BLENDOPALPHA:
4039d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
4040d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4041d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLENDOP_ADD:
4042d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setBlendOperationAlpha(sw::BLENDOP_ADD);
4043d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4044d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLENDOP_SUBTRACT:
4045d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setBlendOperationAlpha(sw::BLENDOP_SUB);
4046d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4047d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLENDOP_REVSUBTRACT:
4048d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setBlendOperationAlpha(sw::BLENDOP_INVSUB);
4049d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4050d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLENDOP_MIN:
4051d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setBlendOperationAlpha(sw::BLENDOP_MIN);
4052d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4053d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DBLENDOP_MAX:
4054d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setBlendOperationAlpha(sw::BLENDOP_MAX);
4055d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4056d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
4057d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
4058d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
4059d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4060d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			default:
4061d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				ASSERT(false);
4062d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
4063d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4064d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else   // stateRecorder
4065d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4066d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setRenderState(state, value);
4067d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4068d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4069d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
4070d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
4071d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4072d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetRenderTarget(unsigned long index, IDirect3DSurface9 *iRenderTarget)
4073d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
4074d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
4075d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4076d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned long index = %d, IDirect3DSurface9 *newRenderTarget = 0x%0.8p", index, iRenderTarget);
4077d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4078d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		// FIXME: Check for D3DUSAGE_RENDERTARGET
4079d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4080d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(index >= 4 || (index == 0 && !iRenderTarget))
4081d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4082d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
4083d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4084d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4085d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Direct3DSurface9 *renderTarget = static_cast<Direct3DSurface9*>(iRenderTarget);
4086d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4087d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(renderTarget)
4088d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4089d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderTarget->bind();
4090d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4091d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4092d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(this->renderTarget[index])
4093d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4094d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			this->renderTarget[index]->unbind();
4095d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4096d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4097d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		this->renderTarget[index] = renderTarget;
4098d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4099d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(renderTarget && index == 0)
4100d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4101d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			D3DSURFACE_DESC renderTargetDesc;
4102d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderTarget->GetDesc(&renderTargetDesc);
4103d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4104d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			// Reset viewport to size of current render target
4105d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			viewport.X = 0;
4106d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			viewport.Y = 0;
4107d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			viewport.Width = renderTargetDesc.Width;
4108d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			viewport.Height = renderTargetDesc.Height;
4109d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			viewport.MinZ = 0;
4110d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			viewport.MaxZ = 1;
4111d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4112d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			// Reset scissor rectangle to size of current render target
4113d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			scissorRect.left = 0;
4114d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			scissorRect.top = 0;
4115d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			scissorRect.right = renderTargetDesc.Width;
4116d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			scissorRect.bottom = renderTargetDesc.Height;
4117d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4118d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			// Set the multi-sample mask, if maskable
4119d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(renderTargetDesc.MultiSampleType != D3DMULTISAMPLE_NONE &&
4120d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			   renderTargetDesc.MultiSampleType != D3DMULTISAMPLE_NONMASKABLE)
4121d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
4122d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setMultiSampleMask(renderState[D3DRS_MULTISAMPLEMASK]);
4123d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
4124d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			else
4125d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
4126d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setMultiSampleMask(0xFFFFFFFF);
4127d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
4128d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4129d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4130d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		renderer->setRenderTarget(index, renderTarget);
4131d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4132d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
4133d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
4134d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4135d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetSamplerState(unsigned long sampler, D3DSAMPLERSTATETYPE state, unsigned long value)
4136d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
4137d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
4138d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4139d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned long sampler = %d, D3DSAMPLERSTATETYPE state = %d, unsigned long value = %d", sampler, state, value);
4140d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4141d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(state < D3DSAMP_ADDRESSU || state > D3DSAMP_DMAPOFFSET)
4142d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4143d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
4144d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4145d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4146d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if((sampler >= 16 && sampler <= D3DDMAPSAMPLER) || sampler > D3DVERTEXTEXTURESAMPLER3)
4147d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4148d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
4149d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4150d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4151d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(sampler >= D3DVERTEXTEXTURESAMPLER0)
4152d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4153d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sampler = 16 + (sampler - D3DVERTEXTEXTURESAMPLER0);
4154d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4155d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4156d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
4157d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4158d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(!init && samplerState[sampler][state] == value)
4159d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
4160d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				return D3D_OK;
4161d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
4162d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4163d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			samplerState[sampler][state] = value;
4164d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4165d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sw::SamplerType type = sampler < 16 ? sw::SAMPLER_PIXEL : sw::SAMPLER_VERTEX;
4166d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			int index = sampler < 16 ? sampler : sampler - 16;   // Sampler index within type group
4167d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4168d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			switch(state)
4169d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
4170d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DSAMP_ADDRESSU:
4171d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
4172d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4173d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTADDRESS_WRAP:
4174d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAddressingModeU(type, index, sw::ADDRESSING_WRAP);
4175d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4176d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTADDRESS_MIRROR:
4177d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAddressingModeU(type, index, sw::ADDRESSING_MIRROR);
4178d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4179d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTADDRESS_CLAMP:
4180d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAddressingModeU(type, index, sw::ADDRESSING_CLAMP);
4181d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4182d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTADDRESS_BORDER:
4183d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAddressingModeU(type, index, sw::ADDRESSING_BORDER);
4184d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4185d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTADDRESS_MIRRORONCE:
4186d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAddressingModeU(type, index, sw::ADDRESSING_MIRRORONCE);
4187d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4188d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
4189d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
4190d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
4191d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4192d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DSAMP_ADDRESSV:
4193d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
4194d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4195d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTADDRESS_WRAP:
4196d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAddressingModeV(type, index, sw::ADDRESSING_WRAP);
4197d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4198d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTADDRESS_MIRROR:
4199d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAddressingModeV(type, index, sw::ADDRESSING_MIRROR);
4200d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4201d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTADDRESS_CLAMP:
4202d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAddressingModeV(type, index, sw::ADDRESSING_CLAMP);
4203d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4204d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTADDRESS_BORDER:
4205d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAddressingModeV(type, index, sw::ADDRESSING_BORDER);
4206d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4207d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTADDRESS_MIRRORONCE:
4208d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAddressingModeV(type, index, sw::ADDRESSING_MIRRORONCE);
4209d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4210d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
4211d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
4212d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
4213d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4214d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DSAMP_ADDRESSW:
4215d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
4216d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4217d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTADDRESS_WRAP:
4218d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAddressingModeW(type, index, sw::ADDRESSING_WRAP);
4219d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4220d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTADDRESS_MIRROR:
4221d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAddressingModeW(type, index, sw::ADDRESSING_MIRROR);
4222d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4223d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTADDRESS_CLAMP:
4224d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAddressingModeW(type, index, sw::ADDRESSING_CLAMP);
4225d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4226d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTADDRESS_BORDER:
4227d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAddressingModeW(type, index, sw::ADDRESSING_BORDER);
4228d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4229d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTADDRESS_MIRRORONCE:
4230d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setAddressingModeW(type, index, sw::ADDRESSING_MIRRORONCE);
4231d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4232d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
4233d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
4234d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
4235d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4236d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DSAMP_BORDERCOLOR:
4237d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setBorderColor(type, index, value);
4238d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4239d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DSAMP_MAGFILTER:
4240d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				// NOTE: SwiftShader does not differentiate between minification and magnification filter
4241d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
4242d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4243d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTEXF_NONE:
4244d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTextureFilter(type, index, sw::FILTER_POINT);   // FIXME: Only for mipmap filter
4245d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4246d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTEXF_POINT:
4247d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTextureFilter(type, index, sw::FILTER_POINT);
4248d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4249d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTEXF_LINEAR:
4250d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTextureFilter(type, index, sw::FILTER_LINEAR);
4251d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4252d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTEXF_ANISOTROPIC:
4253d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTextureFilter(type, index, sw::FILTER_ANISOTROPIC);
4254d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4255d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTEXF_PYRAMIDALQUAD:
4256d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTextureFilter(type, index, sw::FILTER_LINEAR);   // FIXME: Unimplemented, fail silently
4257d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4258d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTEXF_GAUSSIANQUAD:
4259d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTextureFilter(type, index, sw::FILTER_LINEAR);   // FIXME: Unimplemented, fail silently
4260d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4261d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
4262d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					return INVALIDCALL();
4263d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				};
4264d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4265d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DSAMP_MINFILTER:
4266d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				// NOTE: SwiftShader does not differentiate between minification and magnification filter
4267d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
4268d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4269d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTEXF_NONE:
4270d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTextureFilter(type, index, sw::FILTER_POINT);   // FIXME: Only for mipmap filter
4271d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4272d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTEXF_POINT:
4273d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTextureFilter(type, index, sw::FILTER_POINT);
4274d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4275d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTEXF_LINEAR:
4276d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTextureFilter(type, index, sw::FILTER_LINEAR);
4277d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4278d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTEXF_ANISOTROPIC:
4279d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTextureFilter(type, index, sw::FILTER_ANISOTROPIC);
4280d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4281d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTEXF_PYRAMIDALQUAD:
4282d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTextureFilter(type, index, sw::FILTER_LINEAR);   // FIXME: Unimplemented, fail silently
4283d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4284d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTEXF_GAUSSIANQUAD:
4285d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTextureFilter(type, index, sw::FILTER_LINEAR);   // FIXME: Unimplemented, fail silently
4286d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4287d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
4288d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					return INVALIDCALL();
4289d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				};
4290d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4291d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DSAMP_MIPFILTER:
4292d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
4293d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4294d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTEXF_NONE:
4295d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setMipmapFilter(type, index, sw::MIPMAP_NONE);
4296d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4297d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTEXF_POINT:
4298d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setMipmapFilter(type, index, sw::MIPMAP_POINT);
4299d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4300d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTEXF_LINEAR:
4301d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setMipmapFilter(type, index, sw::MIPMAP_LINEAR);
4302d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4303d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTEXF_ANISOTROPIC:
4304d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setMipmapFilter(type, index, sw::MIPMAP_LINEAR);   // FIXME: Only for texture filter
4305d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4306d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTEXF_PYRAMIDALQUAD:
4307d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setMipmapFilter(type, index, sw::MIPMAP_LINEAR);   // FIXME: Only for texture filter
4308d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4309d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTEXF_GAUSSIANQUAD:
4310d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setMipmapFilter(type, index, sw::MIPMAP_LINEAR);   // FIXME: Only for texture filter
4311d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4312d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
4313d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					return INVALIDCALL();
4314d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				};
4315d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4316d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DSAMP_MIPMAPLODBIAS:
4317d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(value == D3DFMT_GET4)   // ATI hack to enable Fetch4
4318d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4319d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setGatherEnable(type, index, true);
4320d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
4321d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				else if(value == D3DFMT_GET1)   // ATI hack to disable Fetch4
4322d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4323d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setGatherEnable(type, index, false);
4324d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
4325d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				else
4326d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4327d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					float LOD = (float&)value - sw::log2((float)context->renderTarget[0]->getSuperSampleCount());   // FIXME: Update when render target changes
4328d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setMipmapLOD(type, index, LOD);
4329d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
4330d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4331d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DSAMP_MAXMIPLEVEL:
4332d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4333d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DSAMP_MAXANISOTROPY:
4334d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setMaxAnisotropy(type, index, sw::clamp((unsigned int)value, (unsigned int)1, maxAnisotropy));
4335d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4336d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DSAMP_SRGBTEXTURE:
4337d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setReadSRGB(type, index, value != FALSE);
4338d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4339d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DSAMP_ELEMENTINDEX:
4340d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(!init) UNIMPLEMENTED();   // Multi-element textures deprecated in favor of multiple render targets
4341d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4342d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DSAMP_DMAPOFFSET:
4343d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			//	if(!init) UNIMPLEMENTED();
4344d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4345d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			default:
4346d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				ASSERT(false);
4347d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
4348d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4349d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else   // stateRecorder
4350d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4351d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setSamplerState(sampler, state, value);
4352d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4353d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4354d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
4355d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
4356d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4357d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetScissorRect(const RECT *rect)
4358d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
4359d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
4360d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4361d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("const RECT *rect = 0x%0.8p", rect);
4362d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4363d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!rect)
4364d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4365d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
4366d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4367d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4368d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
4369d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4370d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			scissorRect = *rect;
4371d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4372d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
4373d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4374d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setScissorRect(rect);
4375d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4376d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4377d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
4378d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
4379d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4380d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetSoftwareVertexProcessing(int software)
4381d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
4382d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
4383d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4384d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("int software = %d", software);
4385d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4386d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(behaviourFlags & D3DCREATE_SOFTWARE_VERTEXPROCESSING && software == FALSE)
4387d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4388d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
4389d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4390d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4391d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(behaviourFlags & D3DCREATE_HARDWARE_VERTEXPROCESSING && software == TRUE)
4392d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4393d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
4394d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4395d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4396d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		softwareVertexProcessing = (software != FALSE);
4397d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4398d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
4399d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
4400d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4401d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetStreamSource(unsigned int stream, IDirect3DVertexBuffer9 *iVertexBuffer, unsigned int offset, unsigned int stride)
4402d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
4403d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
4404d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4405d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int stream = %d, IDirect3DVertexBuffer9 *data = 0x%0.8p, unsigned int offset = %d, unsigned int stride = %d", stream, iVertexBuffer, offset, stride);
4406d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4407d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Direct3DVertexBuffer9 *vertexBuffer = static_cast<Direct3DVertexBuffer9*>(iVertexBuffer);
4408d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4409d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
4410d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4411d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(dataStream[stream] == vertexBuffer && streamOffset[stream] == offset && streamStride[stream] == stride)
4412d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
4413d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				return D3D_OK;
4414d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
4415d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4416d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(vertexBuffer)
4417d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
4418d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				vertexBuffer->bind();
4419d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
4420d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4421d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(dataStream[stream])
4422d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
4423d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				dataStream[stream]->unbind();
4424d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
4425d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4426d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			dataStream[stream] = vertexBuffer;
4427d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			streamOffset[stream] = offset;
4428d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			streamStride[stream] = stride;
4429d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4430d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
4431d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4432d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setStreamSource(stream, vertexBuffer, offset, stride);
4433d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4434d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4435d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
4436d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
4437d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4438d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetStreamSourceFreq(unsigned int streamNumber, unsigned int divider)
4439d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
4440d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
4441d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4442d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int streamNumber = %d, unsigned int divider = %d", streamNumber, divider);
4443d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4444d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!instancingEnabled)
4445d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4446d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
4447d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4448d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4449d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
4450d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4451d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			streamSourceFreq[streamNumber] = divider;
4452d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4453d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
4454d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4455d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setStreamSourceFreq(streamNumber, divider);
4456d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4457d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4458d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
4459d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
4460d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4461d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetTexture(unsigned long sampler, IDirect3DBaseTexture9 *iBaseTexture)
4462d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
4463d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
4464d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4465d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned long sampler = %d, IDirect3DBaseTexture9 *texture = 0x%0.8p", sampler, iBaseTexture);
4466d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4467d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if((sampler >= 16 && sampler <= D3DDMAPSAMPLER) || sampler > D3DVERTEXTEXTURESAMPLER3)
4468d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4469d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
4470d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4471d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4472d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(sampler >= D3DVERTEXTEXTURESAMPLER0)
4473d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4474d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sampler = 16 + (sampler - D3DVERTEXTEXTURESAMPLER0);
4475d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4476d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4477d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Direct3DBaseTexture9 *baseTexture = dynamic_cast<Direct3DBaseTexture9*>(iBaseTexture);
4478d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4479d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
4480d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4481d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(texture[sampler] == baseTexture)
4482d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
4483d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				return D3D_OK;
4484d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
4485d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4486d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(baseTexture)
4487d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
4488d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				baseTexture->bind();   // FIXME: Bind individual sub-surfaces?
4489d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
4490d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4491d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(texture[sampler])
4492d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
4493d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				texture[sampler]->unbind();
4494d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
4495d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4496d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			texture[sampler] = baseTexture;
4497d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4498d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
4499d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4500d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setTexture(sampler, baseTexture);
4501d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4502d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4503d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
4504d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
4505d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4506d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetTextureStageState(unsigned long stage, D3DTEXTURESTAGESTATETYPE type, unsigned long value)
4507d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
4508d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
4509d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4510d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned long stage = %d, D3DTEXTURESTAGESTATETYPE type = %d, unsigned long value = %d", stage, type, value);
4511d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4512d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(stage < 0 || stage >= 8 || type < D3DTSS_COLOROP || type > D3DTSS_CONSTANT)
4513d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4514d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
4515d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
4516d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4517d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
4518d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
4519d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(!init && textureStageState[stage][type] == value)
4520d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
4521d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				return D3D_OK;
4522d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
4523d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4524d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			textureStageState[stage][type] = value;
4525d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4526d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			switch(type)
4527d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
4528d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTSS_COLOROP:
4529d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
4530d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4531d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_DISABLE:
4532d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_DISABLE);
4533d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4534d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_SELECTARG1:
4535d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_SELECTARG1);
4536d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4537d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_SELECTARG2:
4538d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_SELECTARG2);
4539d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4540d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_MODULATE:
4541d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_MODULATE);
4542d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4543d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_MODULATE2X:
4544d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_MODULATE2X);
4545d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4546d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_MODULATE4X:
4547d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_MODULATE4X);
4548d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4549d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_ADD:
4550d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_ADD);
4551d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4552d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_ADDSIGNED:
4553d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_ADDSIGNED);
4554d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4555d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_ADDSIGNED2X:
4556d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_ADDSIGNED2X);
4557d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4558d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_SUBTRACT:
4559d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_SUBTRACT);
4560d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4561d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_ADDSMOOTH:
4562d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_ADDSMOOTH);
4563d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4564d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_BLENDDIFFUSEALPHA:
4565d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_BLENDDIFFUSEALPHA);
4566d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4567d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_BLENDTEXTUREALPHA:
4568d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_BLENDTEXTUREALPHA);
4569d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4570d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_BLENDFACTORALPHA:
4571d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_BLENDFACTORALPHA);
4572d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4573d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_BLENDTEXTUREALPHAPM:
4574d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_BLENDTEXTUREALPHAPM);
4575d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4576d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_BLENDCURRENTALPHA:
4577d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_BLENDCURRENTALPHA);
4578d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4579d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_PREMODULATE:
4580d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_PREMODULATE);
4581d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4582d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_MODULATEALPHA_ADDCOLOR:
4583d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_MODULATEALPHA_ADDCOLOR);
4584d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4585d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_MODULATECOLOR_ADDALPHA:
4586d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_MODULATECOLOR_ADDALPHA);
4587d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4588d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_MODULATEINVALPHA_ADDCOLOR:
4589d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_MODULATEINVALPHA_ADDCOLOR);
4590d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4591d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_MODULATEINVCOLOR_ADDALPHA:
4592d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_MODULATEINVCOLOR_ADDALPHA);
4593d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4594d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_BUMPENVMAP:
4595d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_BUMPENVMAP);
4596d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4597d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_BUMPENVMAPLUMINANCE:
4598d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_BUMPENVMAPLUMINANCE);
4599d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4600d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_DOTPRODUCT3:
4601d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_DOT3);
4602d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4603d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_MULTIPLYADD:
4604d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_MULTIPLYADD);
4605d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4606d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_LERP:
4607d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperation(stage, sw::TextureStage::STAGE_LERP);
4608d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4609d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
4610d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
4611d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
4612d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4613d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTSS_COLORARG1:
4614d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value & D3DTA_SELECTMASK)
4615d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4616d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_DIFFUSE:
4617d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFirstArgument(stage, sw::TextureStage::SOURCE_DIFFUSE);
4618d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4619d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_CURRENT:
4620d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFirstArgument(stage, sw::TextureStage::SOURCE_CURRENT);
4621d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4622d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_TEXTURE:
4623d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFirstArgument(stage, sw::TextureStage::SOURCE_TEXTURE);
4624d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4625d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_TFACTOR:
4626d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFirstArgument(stage, sw::TextureStage::SOURCE_TFACTOR);
4627d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4628d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_SPECULAR:
4629d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFirstArgument(stage, sw::TextureStage::SOURCE_SPECULAR);
4630d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4631d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_TEMP:
4632d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFirstArgument(stage, sw::TextureStage::SOURCE_TEMP);
4633d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4634d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_CONSTANT:
4635d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFirstArgument(stage, sw::TextureStage::SOURCE_CONSTANT);
4636d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4637d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
4638d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
4639d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
4640d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4641d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value & ~D3DTA_SELECTMASK)
4642d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4643d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case 0:
4644d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFirstModifier(stage, sw::TextureStage::MODIFIER_COLOR);
4645d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4646d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_COMPLEMENT:
4647d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFirstModifier(stage, sw::TextureStage::MODIFIER_INVCOLOR);
4648d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4649d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_ALPHAREPLICATE:
4650d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFirstModifier(stage, sw::TextureStage::MODIFIER_ALPHA);
4651d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4652d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_COMPLEMENT | D3DTA_ALPHAREPLICATE:
4653d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFirstModifier(stage, sw::TextureStage::MODIFIER_INVALPHA);
4654d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4655d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
4656d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
4657d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
4658d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4659d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTSS_COLORARG2:
4660d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value & D3DTA_SELECTMASK)
4661d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4662d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_DIFFUSE:
4663d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSecondArgument(stage, sw::TextureStage::SOURCE_DIFFUSE);
4664d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4665d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_CURRENT:
4666d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSecondArgument(stage, sw::TextureStage::SOURCE_CURRENT);
4667d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4668d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_TEXTURE:
4669d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSecondArgument(stage, sw::TextureStage::SOURCE_TEXTURE);
4670d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4671d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_TFACTOR:
4672d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSecondArgument(stage, sw::TextureStage::SOURCE_TFACTOR);
4673d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4674d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_SPECULAR:
4675d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSecondArgument(stage, sw::TextureStage::SOURCE_SPECULAR);
4676d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4677d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_TEMP:
4678d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSecondArgument(stage, sw::TextureStage::SOURCE_TEMP);
4679d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4680d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_CONSTANT:
4681d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSecondArgument(stage, sw::TextureStage::SOURCE_CONSTANT);
4682d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4683d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
4684d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
4685d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
4686d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4687d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value & ~D3DTA_SELECTMASK)
4688d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4689d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case 0:
4690d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSecondModifier(stage, sw::TextureStage::MODIFIER_COLOR);
4691d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4692d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_COMPLEMENT:
4693d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSecondModifier(stage, sw::TextureStage::MODIFIER_INVCOLOR);
4694d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4695d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_ALPHAREPLICATE:
4696d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSecondModifier(stage, sw::TextureStage::MODIFIER_ALPHA);
4697d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4698d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_COMPLEMENT | D3DTA_ALPHAREPLICATE:
4699d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSecondModifier(stage, sw::TextureStage::MODIFIER_INVALPHA);
4700d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4701d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
4702d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
4703d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
4704d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4705d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTSS_ALPHAOP:
4706d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value)
4707d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4708d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_DISABLE:
4709d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_DISABLE);
4710d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4711d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_SELECTARG1:
4712d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_SELECTARG1);
4713d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4714d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_SELECTARG2:
4715d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_SELECTARG2);
4716d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4717d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_MODULATE:
4718d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_MODULATE);
4719d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4720d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_MODULATE2X:
4721d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_MODULATE2X);
4722d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4723d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_MODULATE4X:
4724d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_MODULATE4X);
4725d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4726d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_ADD:
4727d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_ADD);
4728d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4729d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_ADDSIGNED:
4730d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_ADDSIGNED);
4731d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4732d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_ADDSIGNED2X:
4733d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_ADDSIGNED2X);
4734d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4735d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_SUBTRACT:
4736d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_SUBTRACT);
4737d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4738d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_ADDSMOOTH:
4739d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_ADDSMOOTH);
4740d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4741d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_BLENDDIFFUSEALPHA:
4742d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_BLENDDIFFUSEALPHA);
4743d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4744d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_BLENDTEXTUREALPHA:
4745d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_BLENDTEXTUREALPHA);
4746d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4747d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_BLENDFACTORALPHA:
4748d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_BLENDFACTORALPHA);
4749d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4750d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_BLENDTEXTUREALPHAPM:
4751d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_BLENDTEXTUREALPHAPM);
4752d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4753d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_BLENDCURRENTALPHA:
4754d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_BLENDCURRENTALPHA);
4755d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4756d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_PREMODULATE:
4757d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_PREMODULATE);
4758d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4759d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_MODULATEALPHA_ADDCOLOR:
4760d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_MODULATEALPHA_ADDCOLOR);
4761d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4762d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_MODULATECOLOR_ADDALPHA:
4763d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_MODULATECOLOR_ADDALPHA);
4764d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4765d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_MODULATEINVALPHA_ADDCOLOR:
4766d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_MODULATEINVALPHA_ADDCOLOR);
4767d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4768d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_MODULATEINVCOLOR_ADDALPHA:
4769d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_MODULATEINVCOLOR_ADDALPHA);
4770d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4771d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_BUMPENVMAP:
4772d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_BUMPENVMAP);
4773d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4774d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_BUMPENVMAPLUMINANCE:
4775d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_BUMPENVMAPLUMINANCE);
4776d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4777d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_DOTPRODUCT3:
4778d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_DOT3);
4779d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4780d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_MULTIPLYADD:
4781d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_MULTIPLYADD);
4782d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4783d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTOP_LERP:
4784d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setStageOperationAlpha(stage, sw::TextureStage::STAGE_LERP);
4785d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4786d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
4787d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
4788d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
4789d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4790d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTSS_ALPHAARG1:
4791d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value & D3DTA_SELECTMASK)
4792d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4793d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_DIFFUSE:
4794d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFirstArgumentAlpha(stage, sw::TextureStage::SOURCE_DIFFUSE);
4795d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4796d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_CURRENT:
4797d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFirstArgumentAlpha(stage, sw::TextureStage::SOURCE_CURRENT);
4798d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4799d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_TEXTURE:
4800d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFirstArgumentAlpha(stage, sw::TextureStage::SOURCE_TEXTURE);
4801d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4802d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_TFACTOR:
4803d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFirstArgumentAlpha(stage, sw::TextureStage::SOURCE_TFACTOR);
4804d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4805d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_SPECULAR:
4806d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFirstArgumentAlpha(stage, sw::TextureStage::SOURCE_SPECULAR);
4807d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4808d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_TEMP:
4809d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFirstArgumentAlpha(stage, sw::TextureStage::SOURCE_TEMP);
4810d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4811d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_CONSTANT:
4812d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFirstArgumentAlpha(stage, sw::TextureStage::SOURCE_CONSTANT);
4813d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4814d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
4815d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
4816d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
4817d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4818d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value & ~D3DTA_SELECTMASK)
4819d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4820d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case 0:
4821d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFirstModifierAlpha(stage, sw::TextureStage::MODIFIER_COLOR);
4822d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4823d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_COMPLEMENT:
4824d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFirstModifierAlpha(stage, sw::TextureStage::MODIFIER_INVCOLOR);
4825d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4826d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_ALPHAREPLICATE:
4827d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setFirstModifierAlpha(stage, sw::TextureStage::MODIFIER_ALPHA);
4828d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4829d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_COMPLEMENT | D3DTA_ALPHAREPLICATE:
4830d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSecondModifier(stage, sw::TextureStage::MODIFIER_INVALPHA);
4831d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4832d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
4833d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
4834d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
4835d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4836d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTSS_ALPHAARG2:
4837d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value & D3DTA_SELECTMASK)
4838d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4839d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_DIFFUSE:
4840d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSecondArgumentAlpha(stage, sw::TextureStage::SOURCE_DIFFUSE);
4841d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4842d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_CURRENT:
4843d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSecondArgumentAlpha(stage, sw::TextureStage::SOURCE_CURRENT);
4844d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4845d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_TEXTURE:
4846d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSecondArgumentAlpha(stage, sw::TextureStage::SOURCE_TEXTURE);
4847d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4848d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_TFACTOR:
4849d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSecondArgumentAlpha(stage, sw::TextureStage::SOURCE_TFACTOR);
4850d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4851d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_SPECULAR:
4852d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSecondArgumentAlpha(stage, sw::TextureStage::SOURCE_SPECULAR);
4853d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4854d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_TEMP:
4855d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSecondArgumentAlpha(stage, sw::TextureStage::SOURCE_TEMP);
4856d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4857d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_CONSTANT:
4858d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSecondArgumentAlpha(stage, sw::TextureStage::SOURCE_CONSTANT);
4859d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4860d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
4861d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
4862d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
4863d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4864d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value & ~D3DTA_SELECTMASK)
4865d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4866d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case 0:
4867d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSecondModifierAlpha(stage, sw::TextureStage::MODIFIER_COLOR);
4868d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4869d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_COMPLEMENT:
4870d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSecondModifierAlpha(stage, sw::TextureStage::MODIFIER_INVCOLOR);
4871d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4872d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_ALPHAREPLICATE:
4873d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSecondModifierAlpha(stage, sw::TextureStage::MODIFIER_ALPHA);
4874d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4875d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_COMPLEMENT | D3DTA_ALPHAREPLICATE:
4876d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setSecondModifierAlpha(stage, sw::TextureStage::MODIFIER_INVALPHA);
4877d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4878d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
4879d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
4880d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
4881d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4882d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTSS_BUMPENVMAT00:
4883d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setBumpmapMatrix(stage, 0, (float&)value);
4884d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4885d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTSS_BUMPENVMAT01:
4886d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setBumpmapMatrix(stage, 1, (float&)value);
4887d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4888d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTSS_BUMPENVMAT10:
4889d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setBumpmapMatrix(stage, 2, (float&)value);
4890d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4891d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTSS_BUMPENVMAT11:
4892d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setBumpmapMatrix(stage, 3, (float&)value);
4893d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4894d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTSS_TEXCOORDINDEX:
4895d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTexCoordIndex(stage, value & 0x0000FFFF);
4896d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4897d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value & 0xFFFF0000)
4898d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4899d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTSS_TCI_PASSTHRU:
4900d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTexGen(stage, sw::TEXGEN_PASSTHRU);
4901d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4902d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTSS_TCI_CAMERASPACENORMAL:
4903d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTexCoordIndex(stage, stage);
4904d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTexGen(stage, sw::TEXGEN_NORMAL);
4905d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4906d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTSS_TCI_CAMERASPACEPOSITION:
4907d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTexCoordIndex(stage, stage);
4908d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTexGen(stage, sw::TEXGEN_POSITION);
4909d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4910d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR:
4911d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTexCoordIndex(stage, stage);
4912d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTexGen(stage, sw::TEXGEN_REFLECTION);
4913d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4914d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTSS_TCI_SPHEREMAP:
4915d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTexCoordIndex(stage, stage);
4916d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTexGen(stage, sw::TEXGEN_SPHEREMAP);
4917d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4918d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
4919d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
4920d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
4921d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4922d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTSS_BUMPENVLSCALE:
4923d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setLuminanceScale(stage, (float&)value);
4924d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4925d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTSS_BUMPENVLOFFSET:
4926d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setLuminanceOffset(stage, (float&)value);
4927d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4928d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTSS_TEXTURETRANSFORMFLAGS:
4929d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value & ~D3DTTFF_PROJECTED)
4930d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4931d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTTFF_DISABLE:
4932d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTextureTransform(stage, 0, (value & D3DTTFF_PROJECTED) == D3DTTFF_PROJECTED);
4933d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4934d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTTFF_COUNT1:
4935d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTextureTransform(stage, 1, (value & D3DTTFF_PROJECTED) == D3DTTFF_PROJECTED);
4936d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4937d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTTFF_COUNT2:
4938d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTextureTransform(stage, 2, (value & D3DTTFF_PROJECTED) == D3DTTFF_PROJECTED);
4939d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4940d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTTFF_COUNT3:
4941d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTextureTransform(stage, 3, (value & D3DTTFF_PROJECTED) == D3DTTFF_PROJECTED);
4942d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4943d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTTFF_COUNT4:
4944d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setTextureTransform(stage, 4, (value & D3DTTFF_PROJECTED) == D3DTTFF_PROJECTED);
4945d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4946d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
4947d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
4948d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
4949d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4950d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTSS_COLORARG0:
4951d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value & D3DTA_SELECTMASK)
4952d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4953d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_CURRENT:
4954d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setThirdArgument(stage, sw::TextureStage::SOURCE_CURRENT);
4955d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4956d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_DIFFUSE:
4957d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setThirdArgument(stage, sw::TextureStage::SOURCE_DIFFUSE);
4958d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4959d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_SPECULAR:
4960d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setThirdArgument(stage, sw::TextureStage::SOURCE_SPECULAR);
4961d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4962d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_TEMP:
4963d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setThirdArgument(stage, sw::TextureStage::SOURCE_TEMP);
4964d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4965d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_TEXTURE:
4966d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setThirdArgument(stage, sw::TextureStage::SOURCE_TEXTURE);
4967d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4968d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_TFACTOR:
4969d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setThirdArgument(stage, sw::TextureStage::SOURCE_TFACTOR);
4970d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4971d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
4972d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
4973d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
4974d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
4975d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value & ~D3DTA_SELECTMASK)
4976d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4977d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case 0:
4978d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setThirdModifier(stage, sw::TextureStage::MODIFIER_COLOR);
4979d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4980d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_COMPLEMENT:
4981d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setThirdModifier(stage, sw::TextureStage::MODIFIER_INVCOLOR);
4982d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4983d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_ALPHAREPLICATE:
4984d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setThirdModifier(stage, sw::TextureStage::MODIFIER_ALPHA);
4985d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4986d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_COMPLEMENT | D3DTA_ALPHAREPLICATE:
4987d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setThirdModifier(stage, sw::TextureStage::MODIFIER_INVALPHA);
4988d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4989d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
4990d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
4991d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
4992d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
4993d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTSS_ALPHAARG0:
4994d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value & D3DTA_SELECTMASK)
4995d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
4996d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_DIFFUSE:
4997d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setThirdArgumentAlpha(stage, sw::TextureStage::SOURCE_DIFFUSE);
4998d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
4999d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_CURRENT:
5000d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setThirdArgumentAlpha(stage, sw::TextureStage::SOURCE_CURRENT);
5001d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
5002d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_TEXTURE:
5003d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setThirdArgumentAlpha(stage, sw::TextureStage::SOURCE_TEXTURE);
5004d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
5005d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_TFACTOR:
5006d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setThirdArgumentAlpha(stage, sw::TextureStage::SOURCE_TFACTOR);
5007d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
5008d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_SPECULAR:
5009d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setThirdArgumentAlpha(stage, sw::TextureStage::SOURCE_SPECULAR);
5010d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
5011d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_TEMP:
5012d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setThirdArgumentAlpha(stage, sw::TextureStage::SOURCE_TEMP);
5013d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
5014d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_CONSTANT:
5015d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setThirdArgumentAlpha(stage, sw::TextureStage::SOURCE_CONSTANT);
5016d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
5017d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
5018d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
5019d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
5020d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5021d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value & ~D3DTA_SELECTMASK)
5022d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
5023d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case 0:
5024d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setThirdModifierAlpha(stage, sw::TextureStage::MODIFIER_COLOR);
5025d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
5026d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_COMPLEMENT:
5027d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setThirdModifierAlpha(stage, sw::TextureStage::MODIFIER_INVCOLOR);
5028d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
5029d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_ALPHAREPLICATE:
5030d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setThirdModifierAlpha(stage, sw::TextureStage::MODIFIER_ALPHA);
5031d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
5032d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_COMPLEMENT | D3DTA_ALPHAREPLICATE:
5033d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setThirdModifierAlpha(stage, sw::TextureStage::MODIFIER_INVALPHA);
5034d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
5035d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
5036d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
5037d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
5038d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
5039d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTSS_RESULTARG:
5040d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(value & D3DTA_SELECTMASK)
5041d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
5042d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_CURRENT:
5043d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestinationArgument(stage, sw::TextureStage::DESTINATION_CURRENT);
5044d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
5045d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DTA_TEMP:
5046d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setDestinationArgument(stage, sw::TextureStage::DESTINATION_TEMP);
5047d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
5048d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
5049d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
5050d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
5051d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
5052d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTSS_CONSTANT:
5053d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setConstantColor(stage, value);
5054d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
5055d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			default:
5056d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				ASSERT(false);
5057d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5058d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5059d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else   // stateRecorder
5060d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5061d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setTextureStageState(stage, type, value);
5062d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5063d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5064d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
5065d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
5066d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5067d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetTransform(D3DTRANSFORMSTATETYPE state, const D3DMATRIX *matrix)
5068d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
5069d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
5070d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5071d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("D3DTRANSFORMSTATETYPE state = %d, const D3DMATRIX *matrix = 0x%0.8p", state, matrix);
5072d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5073d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!matrix)
5074d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5075d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
5076d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5077d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5078d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
5079d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5080d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			this->matrix[state] = *matrix;
5081d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5082d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sw::Matrix M(matrix->_11, matrix->_21, matrix->_31, matrix->_41,
5083d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			             matrix->_12, matrix->_22, matrix->_32, matrix->_42,
5084d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			             matrix->_13, matrix->_23, matrix->_33, matrix->_43,
5085d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			             matrix->_14, matrix->_24, matrix->_34, matrix->_44);
5086d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5087d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			switch(state)
5088d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5089d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTS_WORLD:
5090d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setModelMatrix(M);
5091d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
5092d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTS_VIEW:
5093d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setViewMatrix(M);
5094d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
5095d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTS_PROJECTION:
5096d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setProjectionMatrix(M);
5097d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
5098d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTS_TEXTURE0:
5099d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureMatrix(0, M);
5100d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
5101d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTS_TEXTURE1:
5102d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureMatrix(1, M);
5103d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
5104d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTS_TEXTURE2:
5105d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureMatrix(2, M);
5106d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
5107d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTS_TEXTURE3:
5108d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureMatrix(3, M);
5109d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
5110d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTS_TEXTURE4:
5111d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureMatrix(4, M);
5112d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
5113d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTS_TEXTURE5:
5114d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureMatrix(5, M);
5115d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
5116d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTS_TEXTURE6:
5117d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureMatrix(6, M);
5118d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
5119d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DTS_TEXTURE7:
5120d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureMatrix(7, M);
5121d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
5122d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			default:
5123d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(state > 256 && state < 512)
5124d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
5125d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setModelMatrix(M, state - 256);
5126d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
5127d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				else ASSERT(false);
5128d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5129d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5130d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else   // stateRecorder
5131d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5132d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setTransform(state, matrix);
5133d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5134d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5135d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
5136d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
5137d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5138d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetVertexDeclaration(IDirect3DVertexDeclaration9 *iVertexDeclaration)
5139d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
5140d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
5141d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5142d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("IDirect3DVertexDeclaration9 *declaration = 0x%0.8p", iVertexDeclaration);
5143d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5144d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Direct3DVertexDeclaration9 *vertexDeclaration = static_cast<Direct3DVertexDeclaration9*>(iVertexDeclaration);
5145d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5146d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
5147d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5148d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(this->vertexDeclaration == vertexDeclaration)
5149d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5150d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				return D3D_OK;
5151d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5152d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5153d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(vertexDeclaration)
5154d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5155d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				vertexDeclaration->bind();
5156d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5157d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5158d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(this->vertexDeclaration)
5159d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5160d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				this->vertexDeclaration->unbind();
5161d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5162d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5163d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			this->vertexDeclaration = vertexDeclaration;
5164d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5165d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
5166d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5167d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setVertexDeclaration(vertexDeclaration);
5168d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5169d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5170d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
5171d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
5172d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5173d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetVertexShader(IDirect3DVertexShader9 *iVertexShader)
5174d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
5175d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
5176d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5177d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("IDirect3DVertexShader9 *shader = 0x%0.8p", iVertexShader);
5178d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5179d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Direct3DVertexShader9 *vertexShader = static_cast<Direct3DVertexShader9*>(iVertexShader);
5180d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5181d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
5182d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5183d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(this->vertexShader == vertexShader)
5184d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5185d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				return D3D_OK;
5186d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5187d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5188d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(vertexShader)
5189d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5190d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				vertexShader->bind();
5191d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5192d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5193d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(this->vertexShader)
5194d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5195d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				this->vertexShader->unbind();
5196d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5197d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5198d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			this->vertexShader = vertexShader;
5199d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			vertexShaderDirty = true;
5200d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5201d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
5202d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5203d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setVertexShader(vertexShader);
5204d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5205d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5206d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
5207d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
5208d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5209d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetVertexShaderConstantB(unsigned int startRegister, const int *constantData, unsigned int count)
5210d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
5211d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
5212d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5213d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int startRegister = %d, const int *constantData = 0x%0.8p, unsigned int count = %d", startRegister, constantData, count);
5214d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5215d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!constantData)
5216d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5217d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
5218d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5219d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5220d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
5221d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5222d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			for(unsigned int i = 0; i < count && startRegister + i < 16; i++)
5223d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5224d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				vertexShaderConstantB[startRegister + i] = constantData[i];
5225d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5226d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5227d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			vertexShaderConstantsBDirty = sw::max(startRegister + count, vertexShaderConstantsBDirty);
5228d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			vertexShaderDirty = true;   // Reload DEF constants
5229d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5230d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
5231d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5232d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setVertexShaderConstantB(startRegister, constantData, count);
5233d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5234d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5235d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
5236d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
5237d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5238d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetVertexShaderConstantF(unsigned int startRegister, const float *constantData, unsigned int count)
5239d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
5240d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
5241d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5242d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int startRegister = %d, const int *constantData = 0x%0.8p, unsigned int count = %d", startRegister, constantData, count);
5243d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5244d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!constantData)
5245d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5246d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
5247d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5248d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5249d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
5250d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5251d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			for(unsigned int i = 0; i < count && startRegister + i < MAX_VERTEX_SHADER_CONST; i++)
5252d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5253d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				vertexShaderConstantF[startRegister + i][0] = constantData[i * 4 + 0];
5254d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				vertexShaderConstantF[startRegister + i][1] = constantData[i * 4 + 1];
5255d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				vertexShaderConstantF[startRegister + i][2] = constantData[i * 4 + 2];
5256d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				vertexShaderConstantF[startRegister + i][3] = constantData[i * 4 + 3];
5257d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5258d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5259d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			vertexShaderConstantsFDirty = sw::max(startRegister + count, vertexShaderConstantsFDirty);
5260d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			vertexShaderDirty = true;   // Reload DEF constants
5261d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5262d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
5263d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5264d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setVertexShaderConstantF(startRegister, constantData, count);
5265d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5266d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5267d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
5268d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
5269d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5270d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetVertexShaderConstantI(unsigned int startRegister, const int *constantData, unsigned int count)
5271d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
5272d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
5273d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5274d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned int startRegister = %d, const int *constantData = 0x%0.8p, unsigned int count = %d", startRegister, constantData, count);
5275d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5276d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!constantData)
5277d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5278d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
5279d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5280d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5281d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
5282d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5283d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			for(unsigned int i = 0; i < count && startRegister + i < 16; i++)
5284d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5285d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				vertexShaderConstantI[startRegister + i][0] = constantData[i * 4 + 0];
5286d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				vertexShaderConstantI[startRegister + i][1] = constantData[i * 4 + 1];
5287d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				vertexShaderConstantI[startRegister + i][2] = constantData[i * 4 + 2];
5288d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				vertexShaderConstantI[startRegister + i][3] = constantData[i * 4 + 3];
5289d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5290d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5291d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			vertexShaderConstantsIDirty = sw::max(startRegister + count, vertexShaderConstantsIDirty);
5292d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			vertexShaderDirty = true;   // Reload DEF constants
5293d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5294d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
5295d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5296d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setVertexShaderConstantI(startRegister, constantData, count);
5297d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5298d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5299d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
5300d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
5301d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5302d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::SetViewport(const D3DVIEWPORT9 *viewport)
5303d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
5304d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
5305d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5306d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("const D3DVIEWPORT9 *viewport = 0x%0.8p", viewport);
5307d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5308d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!viewport)   // FIXME: Check if valid
5309d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5310d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
5311d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5312d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5313d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!stateRecorder)
5314d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5315d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			this->viewport = *viewport;
5316d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5317d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
5318d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5319d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			stateRecorder->setViewport(viewport);
5320d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5321d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5322d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
5323d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
5324d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5325d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	int Direct3DDevice9::ShowCursor(int show)
5326d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
5327d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
5328d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5329d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("int show = %d", show);
5330d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5331d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int oldValue = showCursor ? TRUE : FALSE;
5332d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		showCursor = show != FALSE;
5333d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5334d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(showCursor)
5335d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5336d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sw::FrameBuffer::setCursorImage(cursor);
5337d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5338d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
5339d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5340d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sw::FrameBuffer::setCursorImage(0);
5341d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5342d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5343d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return oldValue;
5344d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
5345d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5346d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::StretchRect(IDirect3DSurface9 *sourceSurface, const RECT *sourceRect, IDirect3DSurface9 *destSurface, const RECT *destRect, D3DTEXTUREFILTERTYPE filter)
5347d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
5348d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
5349d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5350d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("IDirect3DSurface9 *sourceSurface = 0x%0.8p, const RECT *sourceRect = 0x%0.8p, IDirect3DSurface9 *destSurface = 0x%0.8p, const RECT *destRect = 0x%0.8p, D3DTEXTUREFILTERTYPE filter = %d", sourceSurface, sourceRect, destSurface, destRect, filter);
5351d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5352d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!sourceSurface || !destSurface || !validRectangle(sourceRect, sourceSurface) || !validRectangle(destRect, destSurface))
5353d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5354d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
5355d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5356d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5357d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		D3DSURFACE_DESC sourceDescription;
5358d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		D3DSURFACE_DESC destDescription;
5359d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5360d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		sourceSurface->GetDesc(&sourceDescription);
5361d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		destSurface->GetDesc(&destDescription);
5362d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5363d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(sourceDescription.Pool != D3DPOOL_DEFAULT || destDescription.Pool != D3DPOOL_DEFAULT)
5364d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5365d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
5366d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5367d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5368d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Direct3DSurface9 *source = static_cast<Direct3DSurface9*>(sourceSurface);
5369d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Direct3DSurface9 *dest = static_cast<Direct3DSurface9*>(destSurface);
5370d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5371d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		stretchRect(source, sourceRect, dest, destRect, filter);
5372d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5373d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
5374d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
5375d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5376d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::TestCooperativeLevel()
5377d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
5378d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
5379d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5380d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("void");
5381d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5382d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
5383d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
5384d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5385d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::UpdateSurface(IDirect3DSurface9 *sourceSurface, const RECT *sourceRect, IDirect3DSurface9 *destinationSurface, const POINT *destPoint)
5386d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
5387d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
5388d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5389d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("IDirect3DSurface9 *sourceSurface = 0x%0.8p, const RECT *sourceRect = 0x%0.8p, IDirect3DSurface9 *destinationSurface = 0x%0.8p, const POINT *destPoint = 0x%0.8p", sourceSurface, sourceRect, destinationSurface, destPoint);
5390d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5391d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!sourceSurface || !destinationSurface)
5392d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5393d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
5394d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5395d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5396d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		D3DSURFACE_DESC sourceDescription;
5397d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		D3DSURFACE_DESC destinationDescription;
5398d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5399d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		sourceSurface->GetDesc(&sourceDescription);
5400d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		destinationSurface->GetDesc(&destinationDescription);
5401d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5402d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		RECT sRect;
5403d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		RECT dRect;
5404d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5405d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(sourceRect)
5406d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5407d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sRect.left = sourceRect->left;
5408d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sRect.top = sourceRect->top;
5409d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sRect.right = sourceRect->right;
5410d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sRect.bottom = sourceRect->bottom;
5411d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5412d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
5413d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5414d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sRect.left = 0;
5415d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sRect.top = 0;
5416d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sRect.right = sourceDescription.Width;
5417d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sRect.bottom = sourceDescription.Height;
5418d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5419d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5420d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(destPoint)
5421d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5422d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			dRect.left = destPoint->x;
5423d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			dRect.top = destPoint->y;
5424d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			dRect.right = destPoint->x + sRect.right - sRect.left;
5425d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			dRect.bottom = destPoint->y + sRect.bottom - sRect.top;
5426d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5427d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
5428d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5429d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			dRect.left = 0;
5430d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			dRect.top = 0;
5431d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			dRect.right = sRect.right - sRect.left;
5432d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			dRect.bottom = sRect.bottom - sRect.top;
5433d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5434d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5435d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!validRectangle(&sRect, sourceSurface) || !validRectangle(&dRect, destinationSurface))
5436d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5437d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
5438d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5439d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5440d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int sWidth = sRect.right - sRect.left;
5441d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int sHeight = sRect.bottom - sRect.top;
5442d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5443d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int dWidth = dRect.right - dRect.left;
5444d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int dHeight = dRect.bottom - dRect.top;
5445d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5446d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(sourceDescription.MultiSampleType      != D3DMULTISAMPLE_NONE ||
5447d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		   destinationDescription.MultiSampleType != D3DMULTISAMPLE_NONE ||
5448d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		// sourceDescription.Pool      != D3DPOOL_SYSTEMMEM ||   // FIXME: Check back buffer and depth buffer memory pool flags
5449d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		// destinationDescription.Pool != D3DPOOL_DEFAULT ||
5450d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		   sourceDescription.Format != destinationDescription.Format)
5451d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5452d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
5453d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5454d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5455d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		sw::Surface *source = static_cast<Direct3DSurface9*>(sourceSurface);
5456d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		sw::Surface *dest = static_cast<Direct3DSurface9*>(destinationSurface);
5457d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5458d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		unsigned char *sBuffer = (unsigned char*)source->lockExternal(sRect.left, sRect.top, 0, sw::LOCK_READONLY, sw::PUBLIC);
5459d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		unsigned char *dBuffer = (unsigned char*)dest->lockExternal(dRect.left, dRect.top, 0, sw::LOCK_WRITEONLY, sw::PUBLIC);
5460d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int sPitch = source->getExternalPitchB();
5461d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int dPitch = dest->getExternalPitchB();
5462d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5463d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		unsigned int width;
5464d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		unsigned int height;
5465d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		unsigned int bytes;
5466d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5467d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		switch(sourceDescription.Format)
5468d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5469d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DFMT_DXT1:
5470d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DFMT_ATI1:
5471d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			width = (dWidth + 3) / 4;
5472d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			height = (dHeight + 3) / 4;
5473d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			bytes = width * 8;   // 64 bit per 4x4 block
5474d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			break;
5475d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DFMT_DXT2:
5476d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DFMT_DXT3:
5477d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DFMT_DXT4:
5478d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DFMT_DXT5:
5479d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DFMT_ATI2:
5480d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			width = (dWidth + 3) / 4;
5481d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			height = (dHeight + 3) / 4;
5482d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			bytes = width * 16;   // 128 bit per 4x4 block
5483d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			break;
5484d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		default:
5485d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			width = dWidth;
5486d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			height = dHeight;
5487d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			bytes = width * Direct3DSurface9::bytes(sourceDescription.Format);
5488d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5489d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5490d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(sourceDescription.Format == D3DFMT_ATI1 || sourceDescription.Format == D3DFMT_ATI2)
5491d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5492d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			// Make the pitch correspond to 4 rows
5493d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sPitch *= 4;
5494d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			dPitch *= 4;
5495d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5496d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5497d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(unsigned int y = 0; y < height; y++)
5498d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5499d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			memcpy(dBuffer, sBuffer, bytes);
5500d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5501d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sBuffer += sPitch;
5502d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			dBuffer += dPitch;
5503d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5504d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5505d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		source->unlockExternal();
5506d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		dest->unlockExternal();
5507d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5508d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
5509d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
5510d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5511d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::UpdateTexture(IDirect3DBaseTexture9 *sourceTexture, IDirect3DBaseTexture9 *destinationTexture)
5512d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
5513d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
5514d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5515d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("IDirect3DBaseTexture9 *sourceTexture = 0x%0.8p, IDirect3DBaseTexture9 *destinationTexture = 0x%0.8p", sourceTexture, destinationTexture);
5516d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5517d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!sourceTexture || !destinationTexture)
5518d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5519d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
5520d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5521d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5522d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		// FIXME: Check memory pools
5523d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5524d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		D3DRESOURCETYPE type = sourceTexture->GetType();
5525d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5526d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(type != destinationTexture->GetType())
5527d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5528d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
5529d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5530d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5531d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		switch(type)
5532d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5533d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DRTYPE_TEXTURE:
5534d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5535d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				IDirect3DTexture9 *source;
5536d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				IDirect3DTexture9 *dest;
5537d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5538d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				sourceTexture->QueryInterface(IID_IDirect3DTexture9, (void**)&source);
5539d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				destinationTexture->QueryInterface(IID_IDirect3DTexture9, (void**)&dest);
5540d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5541d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				ASSERT(source && dest);
5542d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5543d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				for(unsigned int level = 0; level < source->GetLevelCount() && level < dest->GetLevelCount(); level++)   // FIXME: Fail when source texture has fewer levels than the destination
5544d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
5545d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					IDirect3DSurface9 *sourceSurface;
5546d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					IDirect3DSurface9 *destinationSurface;
5547d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5548d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					source->GetSurfaceLevel(level, &sourceSurface);
5549d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					dest->GetSurfaceLevel(level, &destinationSurface);
5550d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5551d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					UpdateSurface(sourceSurface, 0, destinationSurface, 0);
5552d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5553d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					sourceSurface->Release();
5554d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					destinationSurface->Release();
5555d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
5556d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5557d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				source->Release();
5558d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				dest->Release();
5559d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5560d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			break;
5561d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DRTYPE_VOLUMETEXTURE:
5562d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5563d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				IDirect3DVolumeTexture9 *source;
5564d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				IDirect3DVolumeTexture9 *dest;
5565d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5566d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				sourceTexture->QueryInterface(IID_IDirect3DVolumeTexture9, (void**)&source);
5567d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				destinationTexture->QueryInterface(IID_IDirect3DVolumeTexture9, (void**)&dest);
5568d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5569d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				ASSERT(source && dest);
5570d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5571d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				for(unsigned int level = 0; level < source->GetLevelCount() && level < dest->GetLevelCount(); level++)   // FIXME: Fail when source texture has fewer levels than the destination
5572d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
5573d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					IDirect3DVolume9 *sourceVolume;
5574d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					IDirect3DVolume9 *destinationVolume;
5575d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5576d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					source->GetVolumeLevel(level, &sourceVolume);
5577d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					dest->GetVolumeLevel(level, &destinationVolume);
5578d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5579d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					updateVolume(sourceVolume, destinationVolume);
5580d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5581d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					sourceVolume->Release();
5582d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					destinationVolume->Release();
5583d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
5584d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5585d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				source->Release();
5586d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				dest->Release();
5587d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5588d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			break;
5589d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		case D3DRTYPE_CUBETEXTURE:
5590d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5591d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				IDirect3DCubeTexture9 *source;
5592d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				IDirect3DCubeTexture9 *dest;
5593d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5594d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				sourceTexture->QueryInterface(IID_IDirect3DCubeTexture9, (void**)&source);
5595d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				destinationTexture->QueryInterface(IID_IDirect3DCubeTexture9, (void**)&dest);
5596d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5597d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				ASSERT(source && dest);
5598d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5599d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				for(int face = 0; face < 6; face++)
5600d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
5601d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					for(unsigned int level = 0; level < source->GetLevelCount() && level < dest->GetLevelCount(); level++)   // FIXME: Fail when source texture has fewer levels than the destination
5602d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					{
5603d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						IDirect3DSurface9 *sourceSurface;
5604d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						IDirect3DSurface9 *destinationSurface;
5605d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5606d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						source->GetCubeMapSurface((D3DCUBEMAP_FACES)face, level, &sourceSurface);
5607d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						dest->GetCubeMapSurface((D3DCUBEMAP_FACES)face, level, &destinationSurface);
5608d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5609d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						UpdateSurface(sourceSurface, 0, destinationSurface, 0);
5610d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5611d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						sourceSurface->Release();
5612d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						destinationSurface->Release();
5613d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					}
5614d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
5615d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5616d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				source->Release();
5617d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				dest->Release();
5618d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5619d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			break;
5620d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		default:
5621d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			UNIMPLEMENTED();
5622d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5623d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5624d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
5625d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
5626d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5627d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::ValidateDevice(unsigned long *numPasses)
5628d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
5629d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		CriticalSection cs(this);
5630d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5631d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("unsigned long *numPasses = 0x%0.8p", numPasses);
5632d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5633d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!numPasses)
5634d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5635d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
5636d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5637d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5638d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		*numPasses = 1;
5639d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5640d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
5641d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
5642d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5643d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::getAdapterDisplayMode(unsigned int adapter, D3DDISPLAYMODE *mode)
5644d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
5645d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return d3d9->GetAdapterDisplayMode(adapter, mode);
5646d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
5647d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5648d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	int Direct3DDevice9::typeStride(unsigned char streamType)
5649d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
5650d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static int LUT[] =
5651d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5652d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			4,	// D3DDECLTYPE_FLOAT1    =  0,  // 1D float expanded to (value, 0., 0., 1.)
5653d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			8,	// D3DDECLTYPE_FLOAT2    =  1,  // 2D float expanded to (value, value, 0., 1.)
5654d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			12,	// D3DDECLTYPE_FLOAT3    =  2,  // 3D float expanded to (value, value, value, 1.)
5655d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			16,	// D3DDECLTYPE_FLOAT4    =  3,  // 4D float
5656d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			4,	// D3DDECLTYPE_D3DCOLOR  =  4,  // 4D packed unsigned bytes mapped to 0. to 1. range. Input is in D3DCOLOR format (ARGB) expanded to (R, G, B, A)
5657d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			4,	// D3DDECLTYPE_UBYTE4    =  5,  // 4D unsigned byte
5658d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			4,	// D3DDECLTYPE_SHORT2    =  6,  // 2D signed short expanded to (value, value, 0., 1.)
5659d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			8,	// D3DDECLTYPE_SHORT4    =  7,  // 4D signed short
5660d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			4,	// D3DDECLTYPE_UBYTE4N   =  8,  // Each of 4 bytes is normalized by dividing to 255.0
5661d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			4,	// D3DDECLTYPE_SHORT2N   =  9,  // 2D signed short normalized (v[0]/32767.0,v[1]/32767.0,0,1)
5662d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			8,	// D3DDECLTYPE_SHORT4N   = 10,  // 4D signed short normalized (v[0]/32767.0,v[1]/32767.0,v[2]/32767.0,v[3]/32767.0)
5663d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			4,	// D3DDECLTYPE_USHORT2N  = 11,  // 2D unsigned short normalized (v[0]/65535.0,v[1]/65535.0,0,1)
5664d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			8,	// D3DDECLTYPE_USHORT4N  = 12,  // 4D unsigned short normalized (v[0]/65535.0,v[1]/65535.0,v[2]/65535.0,v[3]/65535.0)
5665d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			4,	// D3DDECLTYPE_UDEC3     = 13,  // 3D unsigned 10 10 10 format expanded to (value, value, value, 1)
5666d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			4,	// D3DDECLTYPE_DEC3N     = 14,  // 3D signed 10 10 10 format normalized and expanded to (v[0]/511.0, v[1]/511.0, v[2]/511.0, 1)
5667d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			4,	// D3DDECLTYPE_FLOAT16_2 = 15,  // Two 16-bit floating point values, expanded to (value, value, 0, 1)
5668d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			8,	// D3DDECLTYPE_FLOAT16_4 = 16,  // Four 16-bit floating point values
5669d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			0,	// D3DDECLTYPE_UNUSED    = 17,  // When the type field in a decl is unused.
5670d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		};
5671d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5672d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return LUT[streamType];
5673d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
5674d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5675d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool Direct3DDevice9::instanceData()
5676d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
5677d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		ASSERT(vertexDeclaration);
5678d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5679d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		D3DVERTEXELEMENT9 vertexElement[MAXD3DDECLLENGTH + 1];
5680d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		unsigned int numElements;
5681d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		vertexDeclaration->GetDeclaration(vertexElement, &numElements);
5682d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5683d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool instanceData = false;
5684d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5685d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(unsigned int i = 0; i < numElements - 1; i++)
5686d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5687d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			unsigned short stream = vertexElement[i].Stream;
5688d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5689d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(stream != 0)
5690d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5691d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				instanceData = instanceData || (streamSourceFreq[stream] & D3DSTREAMSOURCE_INSTANCEDATA) != 0;
5692d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5693d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5694d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5695d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return instanceData;
5696d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
5697d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5698d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool Direct3DDevice9::bindResources(Direct3DIndexBuffer9 *indexBuffer)
5699d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
5700d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!bindViewport())
5701d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5702d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return false;   // Zero-area target region
5703d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5704d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5705d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bindTextures();
5706d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bindIndexBuffer(indexBuffer);
5707d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bindShaderConstants();
5708d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bindLights();
5709d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5710d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return true;
5711d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
5712d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5713d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void Direct3DDevice9::bindVertexStreams(int base, bool instancing, int instance)
5714d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
5715d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		ASSERT(vertexDeclaration);
5716d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5717d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		renderer->resetInputStreams(vertexDeclaration->isPreTransformed());
5718d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5719d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		D3DVERTEXELEMENT9 vertexElement[MAXD3DDECLLENGTH + 1];
5720d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		unsigned int numElements;
5721d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		vertexDeclaration->GetDeclaration(vertexElement, &numElements);
5722d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5723d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		// Bind vertex data streams
5724d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(unsigned int i = 0; i < numElements - 1; i++)
5725d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5726d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			unsigned short stream = vertexElement[i].Stream;
5727d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			unsigned short offset = vertexElement[i].Offset;
5728d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			unsigned char type = vertexElement[i].Type;
5729d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			unsigned char method = vertexElement[i].Method;
5730d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			unsigned char usage = vertexElement[i].Usage;
5731d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			unsigned char index = vertexElement[i].UsageIndex;
5732d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5733d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			ASSERT(method == D3DDECLMETHOD_DEFAULT);	// FIXME: Unimplemented
5734d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5735d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(!dataStream[stream])
5736d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5737d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				continue;
5738d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5739d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5740d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			Direct3DVertexBuffer9 *streamBuffer = dataStream[stream];
5741d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sw::Resource *resource = streamBuffer->getResource();
5742d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			const void *buffer = ((char*)resource->data() + streamOffset[stream]) + offset;
5743d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5744d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			int stride = streamStride[stream];
5745d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5746d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(instancing && streamSourceFreq[stream] & D3DSTREAMSOURCE_INSTANCEDATA)
5747d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5748d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				int instanceFrequency = streamSourceFreq[stream] & ~D3DSTREAMSOURCE_INSTANCEDATA;
5749d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				buffer = (char*)buffer + stride * (instance / instanceFrequency);
5750d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5751d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				stride = 0;
5752d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5753d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			else
5754d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5755d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				buffer = (char*)buffer + stride * base;
5756d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5757d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5758d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sw::Stream attribute(resource, buffer, stride);
5759d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5760d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			switch(type)
5761d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5762d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DDECLTYPE_FLOAT1:    attribute.define(sw::STREAMTYPE_FLOAT, 1, false);  break;
5763d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DDECLTYPE_FLOAT2:    attribute.define(sw::STREAMTYPE_FLOAT, 2, false);  break;
5764d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DDECLTYPE_FLOAT3:    attribute.define(sw::STREAMTYPE_FLOAT, 3, false);  break;
5765d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DDECLTYPE_FLOAT4:    attribute.define(sw::STREAMTYPE_FLOAT, 4, false);  break;
5766d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DDECLTYPE_D3DCOLOR:  attribute.define(sw::STREAMTYPE_COLOR, 4, false);  break;
5767d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DDECLTYPE_UBYTE4:    attribute.define(sw::STREAMTYPE_BYTE, 4, false);   break;
5768d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DDECLTYPE_SHORT2:    attribute.define(sw::STREAMTYPE_SHORT, 2, false);  break;
5769d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DDECLTYPE_SHORT4:    attribute.define(sw::STREAMTYPE_SHORT, 4, false);  break;
5770d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DDECLTYPE_UBYTE4N:   attribute.define(sw::STREAMTYPE_BYTE, 4, true);    break;
5771d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DDECLTYPE_SHORT2N:   attribute.define(sw::STREAMTYPE_SHORT, 2, true);   break;
5772d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DDECLTYPE_SHORT4N:   attribute.define(sw::STREAMTYPE_SHORT, 4, true);   break;
5773d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DDECLTYPE_USHORT2N:  attribute.define(sw::STREAMTYPE_USHORT, 2, true);  break;
5774d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DDECLTYPE_USHORT4N:  attribute.define(sw::STREAMTYPE_USHORT, 4, true);  break;
5775d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DDECLTYPE_UDEC3:     attribute.define(sw::STREAMTYPE_UDEC3, 3, false);  break;
5776d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DDECLTYPE_DEC3N:     attribute.define(sw::STREAMTYPE_DEC3N, 3, true);   break;
5777d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DDECLTYPE_FLOAT16_2: attribute.define(sw::STREAMTYPE_HALF, 2, false);   break;
5778d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DDECLTYPE_FLOAT16_4: attribute.define(sw::STREAMTYPE_HALF, 4, false);   break;
5779d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			case D3DDECLTYPE_UNUSED:    attribute.defaults();                              break;
5780d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			default:
5781d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				ASSERT(false);
5782d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5783d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5784d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(vertexShader)
5785d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5786d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				const sw::VertexShader *shader = vertexShader->getVertexShader();
5787d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5788d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(!vertexDeclaration->isPreTransformed())
5789d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
5790502836a8df8985544667325ad0fb44d3ac0f40e3Nicolas Capens					for(int i = 0; i < MAX_VERTEX_INPUTS; i++)
5791d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					{
5792d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						if(usage == shader->input[i].usage &&
5793d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						   index == shader->input[i].index)
5794d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						{
5795d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							renderer->setInputStream(i, attribute);
5796d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5797d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							break;
5798d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						}
5799d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					}
5800d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
5801d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				else   // Bind directly to the output
5802d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
5803579dc4f88eb1891b1d5c19556394df34abf6ff57Nicolas Capens					for(int i = 0; i < MAX_VERTEX_OUTPUTS; i++)
5804d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					{
5805d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						if((usage == shader->output[i][0].usage || (usage == D3DDECLUSAGE_POSITIONT && shader->output[i][0].usage == D3DDECLUSAGE_POSITION)) &&
5806d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						    index == shader->output[i][0].index)
5807d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						{
5808d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							renderer->setInputStream(i, attribute);
5809d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5810d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							break;
5811d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						}
5812d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					}
5813d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
5814d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5815d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			else
5816d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5817d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(usage)
5818d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
5819d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DDECLUSAGE_POSITION:     renderer->setInputStream(sw::Position, attribute);                                       break;
5820d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DDECLUSAGE_BLENDWEIGHT:  renderer->setInputStream(sw::BlendWeight, attribute);                                    break;
5821d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DDECLUSAGE_BLENDINDICES: renderer->setInputStream(sw::BlendIndices, attribute.define(sw::STREAMTYPE_INDICES, 1)); break;
5822d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DDECLUSAGE_NORMAL:       renderer->setInputStream(sw::Normal, attribute.define(sw::STREAMTYPE_FLOAT, 3));         break;
5823d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DDECLUSAGE_PSIZE:        renderer->setInputStream(sw::PointSize, attribute.define(sw::STREAMTYPE_FLOAT, 1));      break;
5824d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DDECLUSAGE_TEXCOORD:     renderer->setInputStream(sw::TexCoord0 + index, attribute);                              break;
5825d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DDECLUSAGE_TANGENT:      /* Ignored */                                                                            break;
5826d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DDECLUSAGE_BINORMAL:     /* Ignored */                                                                            break;
5827d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DDECLUSAGE_TESSFACTOR:   UNIMPLEMENTED();                                                                         break;
5828d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DDECLUSAGE_POSITIONT:    renderer->setInputStream(sw::PositionT, attribute.define(sw::STREAMTYPE_FLOAT, 4));      break;
5829d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DDECLUSAGE_COLOR:        renderer->setInputStream(sw::Color0 + index, attribute.define(sw::STREAMTYPE_COLOR, 4)); break;
5830d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DDECLUSAGE_FOG:          /* Ignored */                                                                            break;
5831d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DDECLUSAGE_DEPTH:        /* Ignored */                                                                            break;
5832d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DDECLUSAGE_SAMPLE:       UNIMPLEMENTED();                                                                         break;
5833d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
5834d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					ASSERT(false);
5835d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
5836d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5837d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5838d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
5839d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5840d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void Direct3DDevice9::bindIndexBuffer(Direct3DIndexBuffer9 *indexBuffer)
5841d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
5842d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		sw::Resource *resource = 0;
5843d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5844d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(indexBuffer)
5845d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5846d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			resource = indexBuffer->getResource();
5847d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5848d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5849d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		renderer->setIndexBuffer(resource);
5850d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
5851d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5852d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void Direct3DDevice9::bindShaderConstants()
5853d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
5854d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(pixelShaderDirty)
5855d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5856d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(pixelShader)
5857d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5858d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(pixelShaderConstantsBDirty)
5859d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
5860d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setPixelShaderConstantB(0, pixelShaderConstantB, pixelShaderConstantsBDirty);
5861d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
5862d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5863d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(pixelShaderConstantsFDirty)
5864d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
5865d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setPixelShaderConstantF(0, pixelShaderConstantF[0], pixelShaderConstantsFDirty);
5866d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
5867d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5868d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(pixelShaderConstantsIDirty)
5869d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
5870d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setPixelShaderConstantI(0, pixelShaderConstantI[0], pixelShaderConstantsIDirty);
5871d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
5872d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5873d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setPixelShader(pixelShader->getPixelShader());   // Loads shader constants set with DEF
5874d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				pixelShaderConstantsBDirty = pixelShader->getPixelShader()->dirtyConstantsB;   // Shader DEF'ed constants are dirty
5875d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				pixelShaderConstantsFDirty = pixelShader->getPixelShader()->dirtyConstantsF;   // Shader DEF'ed constants are dirty
5876d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				pixelShaderConstantsIDirty = pixelShader->getPixelShader()->dirtyConstantsI;   // Shader DEF'ed constants are dirty
5877d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5878d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			else
5879d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5880d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setPixelShader(0);
5881d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5882d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5883d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			pixelShaderDirty = false;
5884d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5885d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5886d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(vertexShaderDirty)
5887d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5888d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(vertexShader)
5889d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5890d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(vertexShaderConstantsBDirty)
5891d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
5892d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setVertexShaderConstantB(0, vertexShaderConstantB, vertexShaderConstantsBDirty);
5893d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
5894d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5895d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(vertexShaderConstantsFDirty)
5896d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
5897d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setVertexShaderConstantF(0, vertexShaderConstantF[0], vertexShaderConstantsFDirty);
5898d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
5899d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5900d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(vertexShaderConstantsIDirty)
5901d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
5902d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					renderer->setVertexShaderConstantI(0, vertexShaderConstantI[0], vertexShaderConstantsIDirty);
5903d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
5904d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5905d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setVertexShader(vertexShader->getVertexShader());   // Loads shader constants set with DEF
5906d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				vertexShaderConstantsBDirty = vertexShader->getVertexShader()->dirtyConstantsB;   // Shader DEF'ed constants are dirty
5907d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				vertexShaderConstantsFDirty = vertexShader->getVertexShader()->dirtyConstantsF;   // Shader DEF'ed constants are dirty
5908d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				vertexShaderConstantsIDirty = vertexShader->getVertexShader()->dirtyConstantsI;   // Shader DEF'ed constants are dirty
5909d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5910d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			else
5911d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5912d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setVertexShader(0);
5913d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5914d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5915d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			vertexShaderDirty = false;
5916d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5917d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
5918d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5919d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void Direct3DDevice9::bindLights()
5920d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
5921d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!lightsDirty) return;
5922d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5923d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		Lights::iterator i = light.begin();
5924d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int active = 0;
5925d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5926d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		// Set and enable renderer lights
5927d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		while(active < 8)
5928d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5929d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			while(i != light.end() && !i->second.enable)
5930d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5931d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				i++;
5932d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5933d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5934d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(i == light.end())
5935d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5936d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				break;
5937d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5938d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5939d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			const Light &l = i->second;
5940d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5941d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sw::Point position(l.Position.x, l.Position.y, l.Position.z);
5942d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sw::Color<float> diffuse(l.Diffuse.r, l.Diffuse.g, l.Diffuse.b, l.Diffuse.a);
5943d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sw::Color<float> specular(l.Specular.r, l.Specular.g, l.Specular.b, l.Specular.a);
5944d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sw::Color<float> ambient(l.Ambient.r, l.Ambient.g, l.Ambient.b, l.Ambient.a);
5945d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sw::Vector direction(l.Direction.x, l.Direction.y, l.Direction.z);
5946d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5947d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setLightDiffuse(active, diffuse);
5948d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setLightSpecular(active, specular);
5949d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setLightAmbient(active, ambient);
5950d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5951d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(l.Type == D3DLIGHT_DIRECTIONAL)
5952d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5953d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				// FIXME: Unsupported, make it a positional light far away without falloff
5954d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setLightPosition(active, -1e10f * direction);
5955d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setLightRange(active, l.Range);
5956d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setLightAttenuation(active, 1, 0, 0);
5957d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5958d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			else if(l.Type == D3DLIGHT_SPOT)
5959d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5960d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				// FIXME: Unsupported, make it a positional light
5961d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setLightPosition(active, position);
5962d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setLightRange(active, l.Range);
5963d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setLightAttenuation(active, l.Attenuation0, l.Attenuation1, l.Attenuation2);
5964d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5965d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			else
5966d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
5967d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setLightPosition(active, position);
5968d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setLightRange(active, l.Range);
5969d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setLightAttenuation(active, l.Attenuation0, l.Attenuation1, l.Attenuation2);
5970d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
5971d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5972d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setLightEnable(active, true);
5973d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5974d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			active++;
5975d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			i++;
5976d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5977d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5978d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		// Remaining lights are disabled
5979d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		while(active < 8)
5980d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5981d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setLightEnable(active, false);
5982d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5983d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			active++;
5984d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5985d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5986d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		lightsDirty = false;
5987d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
5988d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5989d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool Direct3DDevice9::bindViewport()
5990d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
5991d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(viewport.Width <= 0 || viewport.Height <= 0)
5992d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5993d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return false;
5994d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
5995d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
5996d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(scissorEnable)
5997d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
5998d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(scissorRect.left >= scissorRect.right || scissorRect.top >= scissorRect.bottom)
5999d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
6000d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				return false;
6001d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
6002d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6003d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sw::Rect scissor;
6004d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			scissor.x0 = scissorRect.left;
6005d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			scissor.x1 = scissorRect.right;
6006d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			scissor.y0 = scissorRect.top;
6007d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			scissor.y1 = scissorRect.bottom;
6008d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6009d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setScissor(scissor);
6010d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
6011d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
6012d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
6013d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sw::Rect scissor;
6014d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			scissor.x0 = viewport.X;
6015d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			scissor.x1 = viewport.X + viewport.Width;
6016d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			scissor.y0 = viewport.Y;
6017d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			scissor.y1 = viewport.Y + viewport.Height;
6018d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6019d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setScissor(scissor);
6020d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
6021d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6022d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		sw::Viewport view;
6023d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		view.x0 = (float)viewport.X;
6024d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		view.y0 = (float)viewport.Y + viewport.Height;
6025d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		view.width = (float)viewport.Width;
6026d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		view.height = -(float)viewport.Height;
6027d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		view.minZ = viewport.MinZ;
6028d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		view.maxZ = viewport.MaxZ;
6029d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6030d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		renderer->setViewport(view);
6031d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6032d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return true;
6033d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
6034d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6035d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void Direct3DDevice9::bindTextures()
6036d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
6037d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(int sampler = 0; sampler < 16 + 4; sampler++)
6038d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
6039d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			Direct3DBaseTexture9 *baseTexture = texture[sampler];
6040d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6041d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sw::SamplerType type = sampler < 16 ? sw::SAMPLER_PIXEL : sw::SAMPLER_VERTEX;
6042d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			int index = sampler < 16 ? sampler : sampler - 16;   // Sampler index within type group
6043d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6044d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			bool textureUsed = false;
6045d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6046d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(type == sw::SAMPLER_PIXEL && pixelShader)
6047d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
6048d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				textureUsed = pixelShader->getPixelShader()->usesSampler(index);
6049d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
6050d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			else if(type == sw::SAMPLER_VERTEX && vertexShader)
6051d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
6052d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				textureUsed = vertexShader->getVertexShader()->usesSampler(index);
6053d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
6054d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			else
6055d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
6056d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				textureUsed = true;   // FIXME: Check fixed-function use?
6057d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
6058d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6059d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sw::Resource *resource = 0;
6060d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6061d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(baseTexture && textureUsed)
6062d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
6063d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				resource = baseTexture->getResource();
6064d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
6065d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6066d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->setTextureResource(sampler, resource);
6067d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6068d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(baseTexture && textureUsed)
6069d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
6070d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				baseTexture->GenerateMipSubLevels();
6071d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
6072d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6073d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(baseTexture && textureUsed)
6074d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
6075d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				int levelCount = baseTexture->getInternalLevelCount();
6076d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6077d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				int textureLOD = baseTexture->GetLOD();
6078d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				int samplerLOD = samplerState[sampler][D3DSAMP_MAXMIPLEVEL];
6079d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				int LOD = textureLOD > samplerLOD ? textureLOD : samplerLOD;
6080d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6081d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(samplerState[sampler][D3DSAMP_MIPFILTER] == D3DTEXF_NONE)
6082d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
6083d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					LOD = 0;
6084d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
6085d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6086d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				switch(baseTexture->GetType())
6087d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
6088d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DRTYPE_TEXTURE:
6089d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					{
6090d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						Direct3DTexture9 *texture = dynamic_cast<Direct3DTexture9*>(baseTexture);
6091d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						Direct3DSurface9 *surface;
6092d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6093d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						for(int mipmapLevel = 0; mipmapLevel < sw::MIPMAP_LEVELS; mipmapLevel++)
6094d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						{
6095d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							int surfaceLevel = mipmapLevel;
6096d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6097d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							if(surfaceLevel < LOD)
6098d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							{
6099d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens								surfaceLevel = LOD;
6100d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							}
6101d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6102d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							if(surfaceLevel < 0)
6103d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							{
6104d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens								surfaceLevel = 0;
6105d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							}
6106d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							else if(surfaceLevel >= levelCount)
6107d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							{
6108d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens								surfaceLevel = levelCount - 1;
6109d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							}
6110d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6111d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							surface = texture->getInternalSurfaceLevel(surfaceLevel);
6112d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							renderer->setTextureLevel(sampler, 0, mipmapLevel, surface, sw::TEXTURE_2D);
6113d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						}
6114d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					}
6115d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
6116d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DRTYPE_CUBETEXTURE:
6117d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					for(int face = 0; face < 6; face++)
6118d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					{
6119d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						Direct3DCubeTexture9 *cubeTexture = dynamic_cast<Direct3DCubeTexture9*>(baseTexture);
6120d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						Direct3DSurface9 *surface;
6121d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6122d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						for(int mipmapLevel = 0; mipmapLevel < sw::MIPMAP_LEVELS; mipmapLevel++)
6123d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						{
6124d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							int surfaceLevel = mipmapLevel;
6125d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6126d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							if(surfaceLevel < LOD)
6127d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							{
6128d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens								surfaceLevel = LOD;
6129d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							}
6130d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6131d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							if(surfaceLevel < 0)
6132d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							{
6133d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens								surfaceLevel = 0;
6134d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							}
6135d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							else if(surfaceLevel >= levelCount)
6136d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							{
6137d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens								surfaceLevel = levelCount - 1;
6138d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							}
6139d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6140d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							surface = cubeTexture->getInternalCubeMapSurface((D3DCUBEMAP_FACES)face, surfaceLevel);
6141d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							renderer->setTextureLevel(sampler, face, mipmapLevel, surface, sw::TEXTURE_CUBE);
6142d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						}
6143d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					}
6144d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
6145d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				case D3DRTYPE_VOLUMETEXTURE:
6146d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					{
6147d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						Direct3DVolumeTexture9 *volumeTexture = dynamic_cast<Direct3DVolumeTexture9*>(baseTexture);
6148d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						Direct3DVolume9 *volume;
6149d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6150d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						for(int mipmapLevel = 0; mipmapLevel < sw::MIPMAP_LEVELS; mipmapLevel++)
6151d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						{
6152d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							int surfaceLevel = mipmapLevel;
6153d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6154d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							if(surfaceLevel < LOD)
6155d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							{
6156d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens								surfaceLevel = LOD;
6157d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							}
6158d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6159d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							if(surfaceLevel < 0)
6160d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							{
6161d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens								surfaceLevel = 0;
6162d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							}
6163d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							else if(surfaceLevel >= levelCount)
6164d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							{
6165d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens								surfaceLevel = levelCount - 1;
6166d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							}
6167d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6168d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							volume = volumeTexture->getInternalVolumeLevel(surfaceLevel);
6169d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens							renderer->setTextureLevel(sampler, 0, mipmapLevel, volume, sw::TEXTURE_3D);
6170d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						}
6171d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					}
6172d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					break;
6173d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				default:
6174d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					UNIMPLEMENTED();
6175d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
6176d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
6177d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			else
6178d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
6179d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				renderer->setTextureLevel(sampler, 0, 0, 0, sw::TEXTURE_NULL);
6180d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
6181d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
6182d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
6183d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6184d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool Direct3DDevice9::isRecording() const
6185d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
6186d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return stateRecorder != 0;
6187d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
6188d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6189d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void Direct3DDevice9::setOcclusionEnabled(bool enable)
6190d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
6191d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		renderer->setOcclusionEnabled(enable);
6192d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
6193d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6194d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void Direct3DDevice9::removeQuery(sw::Query *query)
6195d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
6196d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		renderer->removeQuery(query);
6197d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
6198d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6199d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void Direct3DDevice9::addQuery(sw::Query *query)
6200d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
6201d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		renderer->addQuery(query);
6202d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
6203d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6204d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void Direct3DDevice9::stretchRect(Direct3DSurface9 *source, const RECT *sourceRect, Direct3DSurface9 *dest, const RECT *destRect, D3DTEXTUREFILTERTYPE filter)
6205d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
6206d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		D3DSURFACE_DESC sourceDescription;
6207d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		D3DSURFACE_DESC destDescription;
6208d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6209d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		source->GetDesc(&sourceDescription);
6210d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		dest->GetDesc(&destDescription);
6211d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6212d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int sWidth = source->getWidth();
6213d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int sHeight = source->getHeight();
6214d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int dWidth = dest->getWidth();
6215d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		int dHeight = dest->getHeight();
6216d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6217d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		sw::Rect sRect(0, 0, sWidth, sHeight);
6218d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		sw::Rect dRect(0, 0, dWidth, dHeight);
6219d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6220d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(sourceRect)
6221d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
6222d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sRect.x0 = sourceRect->left;
6223d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sRect.y0 = sourceRect->top;
6224d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sRect.x1 = sourceRect->right;
6225d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			sRect.y1 = sourceRect->bottom;
6226d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
6227d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6228d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(destRect)
6229d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
6230d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			dRect.x0 = destRect->left;
6231d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			dRect.y0 = destRect->top;
6232d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			dRect.x1 = destRect->right;
6233d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			dRect.y1 = destRect->bottom;
6234d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
6235d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6236d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool scaling = (sRect.x1 - sRect.x0 != dRect.x1 - dRect.x0) || (sRect.y1 - sRect.y0 != dRect.y1 - dRect.y0);
6237d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool equalFormats = source->getInternalFormat() == dest->getInternalFormat();
6238d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool depthStencil = (sourceDescription.Usage & D3DUSAGE_DEPTHSTENCIL) == D3DUSAGE_DEPTHSTENCIL;
6239d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool alpha0xFF = false;
6240d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6241d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if((sourceDescription.Format == D3DFMT_A8R8G8B8 && destDescription.Format == D3DFMT_X8R8G8B8) ||
6242d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		   (sourceDescription.Format == D3DFMT_X8R8G8B8 && destDescription.Format == D3DFMT_A8R8G8B8))
6243d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
6244d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			equalFormats = true;
6245d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			alpha0xFF = true;
6246d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
6247d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6248d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(depthStencil)   // Copy entirely, internally   // FIXME: Check
6249d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
6250d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(source->hasDepth())
6251d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
6252d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				byte *sourceBuffer = (byte*)source->lockInternal(0, 0, 0, sw::LOCK_READONLY, sw::PUBLIC);
6253d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				byte *destBuffer = (byte*)dest->lockInternal(0, 0, 0, sw::LOCK_DISCARD, sw::PUBLIC);
6254d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6255d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				unsigned int width = source->getWidth();
6256d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				unsigned int height = source->getHeight();
6257d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				unsigned int pitch = source->getInternalPitchB();
6258d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6259d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				for(unsigned int y = 0; y < height; y++)
6260d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
6261d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					memcpy(destBuffer, sourceBuffer, pitch);   // FIXME: Only copy width * bytes
6262d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6263d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					sourceBuffer += pitch;
6264d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					destBuffer += pitch;
6265d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
6266d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6267d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				source->unlockInternal();
6268d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				dest->unlockInternal();
6269d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
6270d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6271d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if(source->hasStencil())
6272d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
6273d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				byte *sourceBuffer = (byte*)source->lockStencil(0, sw::PUBLIC);
6274d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				byte *destBuffer = (byte*)dest->lockStencil(0, sw::PUBLIC);
6275d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6276d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				unsigned int width = source->getWidth();
6277d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				unsigned int height = source->getHeight();
6278d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				unsigned int pitch = source->getStencilPitchB();
6279d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6280d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				for(unsigned int y = 0; y < height; y++)
6281d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
6282d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					memcpy(destBuffer, sourceBuffer, pitch);   // FIXME: Only copy width * bytes
6283d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6284d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					sourceBuffer += pitch;
6285d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					destBuffer += pitch;
6286d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
6287d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6288d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				source->unlockStencil();
6289d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				dest->unlockStencil();
6290d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
6291d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
6292d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else if(!scaling && equalFormats)
6293d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
6294d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			unsigned char *sourceBytes = (unsigned char*)source->lockInternal(sRect.x0, sRect.y0, 0, sw::LOCK_READONLY, sw::PUBLIC);
6295d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			unsigned char *destBytes = (unsigned char*)dest->lockInternal(dRect.x0, dRect.y0, 0, sw::LOCK_READWRITE, sw::PUBLIC);
6296d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			unsigned int sourcePitch = source->getInternalPitchB();
6297d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			unsigned int destPitch = dest->getInternalPitchB();
6298d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6299d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			unsigned int width = dRect.x1 - dRect.x0;
6300d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			unsigned int height = dRect.y1 - dRect.y0;
6301d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			unsigned int bytes = width * sw::Surface::bytes(source->getInternalFormat());
6302d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6303d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			for(unsigned int y = 0; y < height; y++)
6304d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			{
6305d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				memcpy(destBytes, sourceBytes, bytes);
6306d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6307d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if(alpha0xFF)
6308d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				{
6309d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					for(unsigned int x = 0; x < width; x++)
6310d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					{
6311d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens						destBytes[4 * x + 3] = 0xFF;
6312d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					}
6313d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				}
6314d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6315d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				sourceBytes += sourcePitch;
6316d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				destBytes += destPitch;
6317d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
6318d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6319d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			source->unlockInternal();
6320d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			dest->unlockInternal();
6321d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
6322d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		else
6323d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
6324d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			renderer->blit(source, sRect, dest, dRect, filter >= D3DTEXF_LINEAR);
6325d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
6326d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
6327d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6328d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	long Direct3DDevice9::updateVolume(IDirect3DVolume9 *sourceVolume, IDirect3DVolume9 *destinationVolume)
6329d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
6330d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TRACE("IDirect3DVolume9 *sourceVolume = 0x%0.8p, IDirect3DVolume9 *destinationVolume = 0x%0.8p", sourceVolume, destinationVolume);
6331d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6332d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!sourceVolume || !destinationVolume)
6333d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
6334d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
6335d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
6336d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6337d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		D3DVOLUME_DESC sourceDescription;
6338d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		D3DVOLUME_DESC destinationDescription;
6339d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6340d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		sourceVolume->GetDesc(&sourceDescription);
6341d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		destinationVolume->GetDesc(&destinationDescription);
6342d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6343d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(sourceDescription.Pool      != D3DPOOL_SYSTEMMEM ||
6344d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		   destinationDescription.Pool != D3DPOOL_DEFAULT ||
6345d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		   sourceDescription.Format != destinationDescription.Format ||
6346d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		   sourceDescription.Width  != destinationDescription.Width ||
6347d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		   sourceDescription.Height != destinationDescription.Height ||
6348d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		   sourceDescription.Depth  != destinationDescription.Depth)
6349d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
6350d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return INVALIDCALL();
6351d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
6352d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6353d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		sw::Surface *source = static_cast<Direct3DVolume9*>(sourceVolume);
6354d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		sw::Surface *dest = static_cast<Direct3DVolume9*>(destinationVolume);
6355d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6356d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(source->getExternalPitchB() != dest->getExternalPitchB() ||
6357d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		   source->getExternalSliceB() != dest->getExternalSliceB())
6358d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
6359d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			UNIMPLEMENTED();
6360d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
6361d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6362d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void *sBuffer = source->lockExternal(0, 0, 0, sw::LOCK_READONLY, sw::PUBLIC);
6363d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void *dBuffer = dest->lockExternal(0, 0, 0, sw::LOCK_WRITEONLY, sw::PUBLIC);
6364d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6365d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		memcpy(dBuffer, sBuffer, source->getExternalSliceB() * sourceDescription.Depth);
6366d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6367d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		source->unlockExternal();
6368d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		dest->unlockExternal();
6369d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6370d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return D3D_OK;
6371d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
6372d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6373d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool Direct3DDevice9::validRectangle(const RECT *rect, IDirect3DSurface9 *surface)
6374d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
6375d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(!rect)
6376d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
6377d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return true;
6378d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
6379d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6380d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(rect->right <= rect->left || rect->bottom <= rect->top)
6381d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
6382d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return false;
6383d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
6384d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6385d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(rect->left < 0 || rect->top < 0)
6386d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
6387d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return false;
6388d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
6389d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6390d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		D3DSURFACE_DESC description;
6391d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		surface->GetDesc(&description);
6392d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6393d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if(rect->right > (int)description.Width || rect->bottom > (int)description.Height)
6394d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		{
6395d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			return false;
6396d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
6397d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6398d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return true;
6399d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
6400d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
6401d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void Direct3DDevice9::configureFPU()
6402d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
6403d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	//	_controlfp(_PC_24, _MCW_PC);     // Single-precision
6404d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		_controlfp(_MCW_EM, _MCW_EM);    // Mask all exceptions
6405d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		_controlfp(_RC_NEAR, _MCW_RC);   // Round to nearest
6406d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
6407d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens}
6408