| // Copyright 2016 The SwiftShader Authors. All Rights Reserved. | 
 | // | 
 | // Licensed under the Apache License, Version 2.0 (the "License"); | 
 | // you may not use this file except in compliance with the License. | 
 | // You may obtain a copy of the License at | 
 | // | 
 | //    http://www.apache.org/licenses/LICENSE-2.0 | 
 | // | 
 | // Unless required by applicable law or agreed to in writing, software | 
 | // distributed under the License is distributed on an "AS IS" BASIS, | 
 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | // See the License for the specific language governing permissions and | 
 | // limitations under the License. | 
 |  | 
 | #ifndef D3D8_Direct3DStateBlock8_hpp | 
 | #define D3D8_Direct3DStateBlock8_hpp | 
 |  | 
 | #include "Unknown.hpp" | 
 |  | 
 | #include <vector> | 
 |  | 
 | #include <d3d8.h> | 
 |  | 
 | namespace D3D8 | 
 | { | 
 | 	class Direct3DDevice8; | 
 | 	class Direct3DBaseTexture8; | 
 | 	class Direct3DVertexBuffer8; | 
 | 	class Direct3DIndexBuffer8; | 
 |  | 
 | 	class Direct3DStateBlock8 : public Unknown | 
 | 	{ | 
 | 	public: | 
 | 		Direct3DStateBlock8(Direct3DDevice8 *device, D3DSTATEBLOCKTYPE type); | 
 |  | 
 | 		~Direct3DStateBlock8() override; | 
 |  | 
 | 		// IUnknown methods | 
 | 		long __stdcall QueryInterface(const IID &iid, void **object) override; | 
 | 		unsigned long __stdcall AddRef() override; | 
 | 		unsigned long __stdcall Release() override; | 
 |  | 
 | 		long __stdcall Apply(); | 
 | 		long __stdcall Capture(); | 
 | 		long __stdcall GetDevice(IDirect3DDevice8 **device); | 
 |  | 
 | 		// Internal methods | 
 | 		void lightEnable(unsigned long index, int enable); | 
 | 		void setClipPlane(unsigned long index, const float *plane); | 
 | 		void setCurrentTexturePalette(unsigned int paletteNumber); | 
 | 		void setFVF(unsigned long FVF); | 
 | 		void setIndices(Direct3DIndexBuffer8 *indexData, unsigned int baseVertexIndex); | 
 | 		void setLight(unsigned long index, const D3DLIGHT8 *light); | 
 | 		void setMaterial(const D3DMATERIAL8 *material); | 
 | 		void setPixelShader(unsigned long shaderHandle); | 
 | 		void setPixelShaderConstant(unsigned int startRegister, const void *constantData, unsigned int count); | 
 | 		void setRenderState(D3DRENDERSTATETYPE state, unsigned long value); | 
 | 		void setScissorRect(const RECT *rect); | 
 | 		void setStreamSource(unsigned int stream, Direct3DVertexBuffer8 *data, unsigned int stride); | 
 | 		void setTexture(unsigned long stage, Direct3DBaseTexture8 *texture); | 
 | 		void setTextureStageState(unsigned long stage, D3DTEXTURESTAGESTATETYPE type, unsigned long value); | 
 | 		void setTransform(D3DTRANSFORMSTATETYPE state, const D3DMATRIX *matrix); | 
 | 		void setViewport(const D3DVIEWPORT8 *viewport); | 
 | 		void setVertexShader(unsigned long shaderHandle); | 
 | 		void setVertexShaderConstant(unsigned int startRegister, const void *constantData, unsigned int count); | 
 |  | 
 | 	private: | 
 | 		// Individual states | 
 | 		void captureRenderState(D3DRENDERSTATETYPE state); | 
 | 		void captureTextureStageState(unsigned long stage, D3DTEXTURESTAGESTATETYPE type); | 
 | 		void captureTransform(D3DTRANSFORMSTATETYPE state); | 
 |  | 
 | 		// Pixel states | 
 | 		void capturePixelRenderStates(); | 
 | 		void capturePixelTextureStates(); | 
 | 		void capturePixelShaderStates(); | 
 |  | 
 | 		// Vertex states | 
 | 		void captureVertexRenderStates(); | 
 | 		void captureVertexTextureStates(); | 
 | 		void captureLightStates(); | 
 | 		void captureVertexShaderStates(); | 
 |  | 
 | 		// All (remaining) states | 
 | 		void captureTextures(); | 
 | 		void captureVertexTextures(); | 
 | 		void captureDisplacementTextures(); | 
 | 		void captureTexturePalette(); | 
 | 		void captureVertexStreams(); | 
 | 		void captureIndexBuffer(); | 
 | 		void captureViewport(); | 
 | 		void captureTransforms(); | 
 | 		void captureTextureTransforms(); | 
 | 		void captureClippingPlanes(); | 
 | 		void captureMaterial(); | 
 |  | 
 | 		// Creation parameters | 
 | 		Direct3DDevice8 *const device; | 
 | 		const D3DSTATEBLOCKTYPE type; | 
 |  | 
 | 		// State data | 
 | 		bool vertexShaderCaptured; | 
 | 		unsigned long vertexShaderHandle; | 
 |  | 
 | 		bool pixelShaderCaptured; | 
 | 		unsigned long pixelShaderHandle; | 
 |  | 
 | 		bool indexBufferCaptured; | 
 | 		Direct3DIndexBuffer8 *indexBuffer; | 
 | 		unsigned int baseVertexIndex; | 
 |  | 
 | 		bool renderStateCaptured[D3DRS_NORMALORDER + 1]; | 
 | 		unsigned long renderState[D3DRS_NORMALORDER + 1]; | 
 |  | 
 | 		bool textureStageStateCaptured[8][D3DTSS_RESULTARG + 1]; | 
 | 		unsigned long textureStageState[8][D3DTSS_RESULTARG + 1]; | 
 |  | 
 | 		bool streamSourceCaptured[16]; | 
 | 		struct StreamSource | 
 | 		{ | 
 | 			Direct3DVertexBuffer8 *vertexBuffer; | 
 | 			unsigned int stride; | 
 | 		}; | 
 | 		StreamSource streamSource[16]; | 
 |  | 
 | 		bool textureCaptured[8]; | 
 | 		Direct3DBaseTexture8 *texture[8]; | 
 |  | 
 | 		bool transformCaptured[512]; | 
 | 		D3DMATRIX transform[512]; | 
 |  | 
 | 		bool viewportCaptured; | 
 | 		D3DVIEWPORT8 viewport; | 
 |  | 
 | 		bool clipPlaneCaptured[6]; | 
 | 		float clipPlane[6][4]; | 
 |  | 
 | 		bool materialCaptured; | 
 | 		D3DMATERIAL8 material; | 
 |  | 
 | 		bool lightCaptured[8];   // FIXME: Unlimited index | 
 | 		D3DLIGHT8 light[8]; | 
 |  | 
 | 		bool lightEnableCaptured[8];   // FIXME: Unlimited index | 
 | 		int lightEnableState[8]; | 
 |  | 
 | 		float pixelShaderConstant[8][4]; | 
 | 		float vertexShaderConstant[256][4]; | 
 |  | 
 | 		bool scissorRectCaptured; | 
 | 		RECT scissorRect; | 
 |  | 
 | 		bool paletteNumberCaptured; | 
 | 		unsigned int paletteNumber; | 
 |  | 
 | 		void clear(); | 
 | 	}; | 
 | } | 
 |  | 
 | #endif   // D3D8_Direct3DStateBlock8_hpp |