// 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
|