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