117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// 317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// Licensed under the Apache License, Version 2.0 (the "License"); 417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// you may not use this file except in compliance with the License. 517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// You may obtain a copy of the License at 617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// 717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// http://www.apache.org/licenses/LICENSE-2.0 817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// 917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// Unless required by applicable law or agreed to in writing, software 1017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// distributed under the License is distributed on an "AS IS" BASIS, 1117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// See the License for the specific language governing permissions and 1317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens// limitations under the License. 1417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 1517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens#ifndef D3D8_Direct3DStateBlock8_hpp 1617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens#define D3D8_Direct3DStateBlock8_hpp 1717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 1817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens#include "Unknown.hpp" 1917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 2017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens#include <vector> 2117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 2217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens#include <d3d8.h> 2317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 2417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capensnamespace D3D8 2517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens{ 2617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens class Direct3DDevice8; 2717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens class Direct3DBaseTexture8; 2817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens class Direct3DVertexBuffer8; 2917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens class Direct3DIndexBuffer8; 3017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 3117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens class Direct3DStateBlock8 : public Unknown 3217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 3317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens public: 3417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens Direct3DStateBlock8(Direct3DDevice8 *device, D3DSTATEBLOCKTYPE type); 3517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 363b9e1eab3544111f3f1ff8fc652d6548acb608baNicolas Capens ~Direct3DStateBlock8() override; 3717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 3817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens // IUnknown methods 393b9e1eab3544111f3f1ff8fc652d6548acb608baNicolas Capens long __stdcall QueryInterface(const IID &iid, void **object) override; 403b9e1eab3544111f3f1ff8fc652d6548acb608baNicolas Capens unsigned long __stdcall AddRef() override; 413b9e1eab3544111f3f1ff8fc652d6548acb608baNicolas Capens unsigned long __stdcall Release() override; 4217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 4317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens long __stdcall Apply(); 4417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens long __stdcall Capture(); 4517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens long __stdcall GetDevice(IDirect3DDevice8 **device); 4617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 4717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens // Internal methods 4817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void lightEnable(unsigned long index, int enable); 4917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void setClipPlane(unsigned long index, const float *plane); 5017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void setCurrentTexturePalette(unsigned int paletteNumber); 5117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void setFVF(unsigned long FVF); 5217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void setIndices(Direct3DIndexBuffer8 *indexData, unsigned int baseVertexIndex); 5317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void setLight(unsigned long index, const D3DLIGHT8 *light); 5417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void setMaterial(const D3DMATERIAL8 *material); 5517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void setPixelShader(unsigned long shaderHandle); 5617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void setPixelShaderConstant(unsigned int startRegister, const void *constantData, unsigned int count); 5717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void setRenderState(D3DRENDERSTATETYPE state, unsigned long value); 5817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void setScissorRect(const RECT *rect); 5917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void setStreamSource(unsigned int stream, Direct3DVertexBuffer8 *data, unsigned int stride); 6017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void setTexture(unsigned long stage, Direct3DBaseTexture8 *texture); 6117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void setTextureStageState(unsigned long stage, D3DTEXTURESTAGESTATETYPE type, unsigned long value); 6217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void setTransform(D3DTRANSFORMSTATETYPE state, const D3DMATRIX *matrix); 6317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void setViewport(const D3DVIEWPORT8 *viewport); 6417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void setVertexShader(unsigned long shaderHandle); 6517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void setVertexShaderConstant(unsigned int startRegister, const void *constantData, unsigned int count); 6617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 6717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens private: 6817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens // Individual states 6917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void captureRenderState(D3DRENDERSTATETYPE state); 7017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void captureTextureStageState(unsigned long stage, D3DTEXTURESTAGESTATETYPE type); 7117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void captureTransform(D3DTRANSFORMSTATETYPE state); 7217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 7317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens // Pixel states 7417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void capturePixelRenderStates(); 7517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void capturePixelTextureStates(); 7617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void capturePixelShaderStates(); 773b9e1eab3544111f3f1ff8fc652d6548acb608baNicolas Capens 7817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens // Vertex states 7917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void captureVertexRenderStates(); 8017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void captureVertexTextureStates(); 8117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void captureLightStates(); 8217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void captureVertexShaderStates(); 833b9e1eab3544111f3f1ff8fc652d6548acb608baNicolas Capens 8417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens // All (remaining) states 8517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void captureTextures(); 8617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void captureVertexTextures(); 8717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void captureDisplacementTextures(); 8817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void captureTexturePalette(); 8917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void captureVertexStreams(); 9017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void captureIndexBuffer(); 9117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void captureViewport(); 9217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void captureTransforms(); 9317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void captureTextureTransforms(); 9417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void captureClippingPlanes(); 9517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void captureMaterial(); 9617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 9717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens // Creation parameters 9817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens Direct3DDevice8 *const device; 9917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens const D3DSTATEBLOCKTYPE type; 10017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 10117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens // State data 10217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens bool vertexShaderCaptured; 10317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens unsigned long vertexShaderHandle; 10417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 10517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens bool pixelShaderCaptured; 10617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens unsigned long pixelShaderHandle; 10717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 10817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens bool indexBufferCaptured; 10917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens Direct3DIndexBuffer8 *indexBuffer; 11017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens unsigned int baseVertexIndex; 11117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 11217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens bool renderStateCaptured[D3DRS_NORMALORDER + 1]; 11317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens unsigned long renderState[D3DRS_NORMALORDER + 1]; 11417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 11517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens bool textureStageStateCaptured[8][D3DTSS_RESULTARG + 1]; 11617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens unsigned long textureStageState[8][D3DTSS_RESULTARG + 1]; 11717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 11817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens bool streamSourceCaptured[16]; 11917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens struct StreamSource 12017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens { 12117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens Direct3DVertexBuffer8 *vertexBuffer; 12217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens unsigned int stride; 12317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens }; 12417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens StreamSource streamSource[16]; 12517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 12617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens bool textureCaptured[8]; 12717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens Direct3DBaseTexture8 *texture[8]; 12817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 12917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens bool transformCaptured[512]; 13017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens D3DMATRIX transform[512]; 13117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 13217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens bool viewportCaptured; 13317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens D3DVIEWPORT8 viewport; 13417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 13517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens bool clipPlaneCaptured[6]; 13617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens float clipPlane[6][4]; 13717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 13817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens bool materialCaptured; 13917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens D3DMATERIAL8 material; 14017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 14117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens bool lightCaptured[8]; // FIXME: Unlimited index 14217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens D3DLIGHT8 light[8]; 14317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 14417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens bool lightEnableCaptured[8]; // FIXME: Unlimited index 14517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens int lightEnableState[8]; 14617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 14717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens float pixelShaderConstant[8][4]; 14817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens float vertexShaderConstant[256][4]; 14917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 15017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens bool scissorRectCaptured; 15117b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens RECT scissorRect; 15217b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 15317b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens bool paletteNumberCaptured; 15417b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens unsigned int paletteNumber; 15517b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 15617b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens void clear(); 15717b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens }; 15817b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens} 15917b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens 16017b29fd4f21db9966607fc502b075dc6840e223bNicolas Capens#endif // D3D8_Direct3DStateBlock8_hpp