// 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 D3D9_Direct3DStateBlock9_hpp
#define D3D9_Direct3DStateBlock9_hpp

#include "Direct3DDevice9.hpp"
#include "Unknown.hpp"

#include <vector>

#include <d3d9.h>

namespace D3D9
{
	class Direct3DDevice9;
	class Direct3DVertexDeclaration9;
	class Direct3DIndexBuffer9;
	class Direct3DVertexBuffer9;
	class Direct3DBaseTexture9;
	class Direct3DPixelShader9;
	class Direct3DVertexShader9;

	class Direct3DStateBlock9 : public IDirect3DStateBlock9, public Unknown
	{
	public:
		Direct3DStateBlock9(Direct3DDevice9 *device, D3DSTATEBLOCKTYPE type);

		virtual ~Direct3DStateBlock9();

		// IUnknown methods
		long __stdcall QueryInterface(const IID &iid, void **object);
		unsigned long __stdcall AddRef();
		unsigned long __stdcall Release();

		// IDirect3DStateBlock9 methods
		long __stdcall Apply();
		long __stdcall Capture();
		long __stdcall GetDevice(IDirect3DDevice9 **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(Direct3DIndexBuffer9 *indexData);
		void setLight(unsigned long index, const D3DLIGHT9 *light);
		void setMaterial(const D3DMATERIAL9 *material);
		void setNPatchMode(float segments);
		void setPixelShader(Direct3DPixelShader9 *shader);
		void setPixelShaderConstantB(unsigned int startRegister, const int *constantData, unsigned int count);
		void setPixelShaderConstantF(unsigned int startRegister, const float *constantData, unsigned int count);
		void setPixelShaderConstantI(unsigned int startRegister, const int *constantData, unsigned int count);
		void setRenderState(D3DRENDERSTATETYPE state, unsigned long value);
		void setSamplerState(unsigned long index, D3DSAMPLERSTATETYPE state, unsigned long value);
		void setScissorRect(const RECT *rect);
		void setStreamSource(unsigned int stream, Direct3DVertexBuffer9 *data, unsigned int offset, unsigned int stride);
		void setStreamSourceFreq(unsigned int streamNumber, unsigned int divider);
		void setTexture(unsigned long index, Direct3DBaseTexture9 *texture);
		void setTextureStageState(unsigned long stage, D3DTEXTURESTAGESTATETYPE type, unsigned long value);
		void setTransform(D3DTRANSFORMSTATETYPE state, const D3DMATRIX *matrix);
		void setViewport(const D3DVIEWPORT9 *viewport);
		void setVertexDeclaration(Direct3DVertexDeclaration9 *declaration);
		void setVertexShader(Direct3DVertexShader9 *shader);
		void setVertexShaderConstantB(unsigned int startRegister, const int *constantData, unsigned int count);
		void setVertexShaderConstantF(unsigned int startRegister, const float *constantData, unsigned int count);
		void setVertexShaderConstantI(unsigned int startRegister, const int *constantData, unsigned int count);

	private:
		// Individual states
		void captureRenderState(D3DRENDERSTATETYPE state);
		void captureSamplerState(unsigned long index, D3DSAMPLERSTATETYPE state);
		void captureTextureStageState(unsigned long stage, D3DTEXTURESTAGESTATETYPE type);
		void captureTransform(D3DTRANSFORMSTATETYPE state);

		// Pixel states
		void capturePixelRenderStates();
		void capturePixelTextureStates();
		void capturePixelSamplerStates();
		void capturePixelShaderStates();

		// Vertex states
		void captureVertexRenderStates();
		void captureVertexSamplerStates();
		void captureVertexTextureStates();
		void captureNPatchMode();
		void captureLightStates();
		void captureVertexShaderStates();
		void captureStreamSourceFrequencies();
		void captureVertexDeclaration();
		void captureFVF();

		// All (remaining) states
		void captureTextures();
		void captureTexturePalette();
		void captureVertexStreams();
		void captureIndexBuffer();
		void captureViewport();
		void captureScissorRectangle();
		void captureTransforms();
		void captureTextureTransforms();
		void captureClippingPlanes();
		void captureMaterial();

		// Creation parameters
		Direct3DDevice9 *const device;
		const D3DSTATEBLOCKTYPE type;

		// State data
		bool vertexDeclarationCaptured;
		Direct3DVertexDeclaration9 *vertexDeclaration;

		bool fvfCaptured;
		unsigned long FVF;

		bool indexBufferCaptured;
		Direct3DIndexBuffer9 *indexBuffer;

		bool renderStateCaptured[D3DRS_BLENDOPALPHA + 1];
		unsigned long renderState[D3DRS_BLENDOPALPHA + 1];

		bool nPatchModeCaptured;
		float nPatchMode;

		bool textureStageStateCaptured[8][D3DTSS_CONSTANT + 1];
		unsigned long textureStageState[8][D3DTSS_CONSTANT + 1];

		bool samplerStateCaptured[16 + 4][D3DSAMP_DMAPOFFSET + 1];
		unsigned long samplerState[16 + 4][D3DSAMP_DMAPOFFSET + 1];

		bool streamSourceCaptured[MAX_VERTEX_INPUTS];
		struct StreamSource
		{
			Direct3DVertexBuffer9 *vertexBuffer;
			unsigned int offset;
			unsigned int stride;
		};
		StreamSource streamSource[MAX_VERTEX_INPUTS];

		bool streamSourceFrequencyCaptured[MAX_VERTEX_INPUTS];
		unsigned int streamSourceFrequency[MAX_VERTEX_INPUTS];

		bool textureCaptured[16 + 4];
		Direct3DBaseTexture9 *texture[16 + 4];

		bool transformCaptured[512];
		D3DMATRIX transform[512];

		bool materialCaptured;
		D3DMATERIAL9 material;

		bool lightCaptured[8];   // FIXME: Unlimited index
		D3DLIGHT9 light[8];

		bool lightEnableCaptured[8];   // FIXME: Unlimited index
		int lightEnableState[8];

		bool pixelShaderCaptured;
		Direct3DPixelShader9 *pixelShader;

		bool vertexShaderCaptured;
		Direct3DVertexShader9 *vertexShader;

		bool viewportCaptured;
		D3DVIEWPORT9 viewport;

		float pixelShaderConstantF[MAX_PIXEL_SHADER_CONST][4];
		int pixelShaderConstantI[16][4];
		int pixelShaderConstantB[16];

		float vertexShaderConstantF[MAX_VERTEX_SHADER_CONST][4];
		int vertexShaderConstantI[16][4];
		int vertexShaderConstantB[16];

		bool clipPlaneCaptured[6];
		float clipPlane[6][4];

		bool scissorRectCaptured;
		RECT scissorRect;

		bool paletteNumberCaptured;
		unsigned int paletteNumber;

		void clear();
	};
}

#endif   // D3D9_Direct3DStateBlock9_hpp
