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 = ▭ 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