blob: 9f5977d5383caa6316a6b47933a5fd5a7c202fde [file] [log] [blame]
// 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);
~Direct3DStateBlock9() override;
// IUnknown methods
long __stdcall QueryInterface(const IID &iid, void **object) override;
unsigned long __stdcall AddRef() override;
unsigned long __stdcall Release() override;
// IDirect3DStateBlock9 methods
long __stdcall Apply() override;
long __stdcall Capture() override;
long __stdcall GetDevice(IDirect3DDevice9 **device) override;
// 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