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