|
|
/**
|
|
|
* MojoShader; generate shader programs from bytecode of compiled
|
|
|
* Direct3D shaders.
|
|
|
*
|
|
|
* Please see the file LICENSE.txt in the source's root directory.
|
|
|
*
|
|
|
* This file written by Ryan C. Gordon.
|
|
|
*/
|
|
|
|
|
|
#ifndef MOJOSHADER_EFFECTS_H
|
|
|
#define MOJOSHADER_EFFECTS_H
|
|
|
|
|
|
#ifdef MOJOSHADER_EFFECT_SUPPORT
|
|
|
|
|
|
/* MOJOSHADER_effectState types... */
|
|
|
|
|
|
typedef enum MOJOSHADER_renderStateType
|
|
|
{
|
|
|
/* Note that we are NOT using the actual RS values from D3D here.
|
|
|
* For some reason, in the binary data, it's 0-based.
|
|
|
* Even worse, it doesn't even seem to be in order.
|
|
|
* Here is the list of changes compared to the real D3DRS enum:
|
|
|
* - All of the RS_WRAP values are in a row, not separate!
|
|
|
*
|
|
|
* -flibit
|
|
|
*/
|
|
|
MOJOSHADER_RS_ZENABLE,
|
|
|
MOJOSHADER_RS_FILLMODE,
|
|
|
MOJOSHADER_RS_SHADEMODE,
|
|
|
MOJOSHADER_RS_ZWRITEENABLE,
|
|
|
MOJOSHADER_RS_ALPHATESTENABLE,
|
|
|
MOJOSHADER_RS_LASTPIXEL,
|
|
|
MOJOSHADER_RS_SRCBLEND,
|
|
|
MOJOSHADER_RS_DESTBLEND,
|
|
|
MOJOSHADER_RS_CULLMODE,
|
|
|
MOJOSHADER_RS_ZFUNC,
|
|
|
MOJOSHADER_RS_ALPHAREF,
|
|
|
MOJOSHADER_RS_ALPHAFUNC,
|
|
|
MOJOSHADER_RS_DITHERENABLE,
|
|
|
MOJOSHADER_RS_ALPHABLENDENABLE,
|
|
|
MOJOSHADER_RS_FOGENABLE,
|
|
|
MOJOSHADER_RS_SPECULARENABLE,
|
|
|
MOJOSHADER_RS_FOGCOLOR,
|
|
|
MOJOSHADER_RS_FOGTABLEMODE,
|
|
|
MOJOSHADER_RS_FOGSTART,
|
|
|
MOJOSHADER_RS_FOGEND,
|
|
|
MOJOSHADER_RS_FOGDENSITY,
|
|
|
MOJOSHADER_RS_RANGEFOGENABLE,
|
|
|
MOJOSHADER_RS_STENCILENABLE,
|
|
|
MOJOSHADER_RS_STENCILFAIL,
|
|
|
MOJOSHADER_RS_STENCILZFAIL,
|
|
|
MOJOSHADER_RS_STENCILPASS,
|
|
|
MOJOSHADER_RS_STENCILFUNC,
|
|
|
MOJOSHADER_RS_STENCILREF,
|
|
|
MOJOSHADER_RS_STENCILMASK,
|
|
|
MOJOSHADER_RS_STENCILWRITEMASK,
|
|
|
MOJOSHADER_RS_TEXTUREFACTOR,
|
|
|
MOJOSHADER_RS_WRAP0,
|
|
|
MOJOSHADER_RS_WRAP1,
|
|
|
MOJOSHADER_RS_WRAP2,
|
|
|
MOJOSHADER_RS_WRAP3,
|
|
|
MOJOSHADER_RS_WRAP4,
|
|
|
MOJOSHADER_RS_WRAP5,
|
|
|
MOJOSHADER_RS_WRAP6,
|
|
|
MOJOSHADER_RS_WRAP7,
|
|
|
MOJOSHADER_RS_WRAP8,
|
|
|
MOJOSHADER_RS_WRAP9,
|
|
|
MOJOSHADER_RS_WRAP10,
|
|
|
MOJOSHADER_RS_WRAP11,
|
|
|
MOJOSHADER_RS_WRAP12,
|
|
|
MOJOSHADER_RS_WRAP13,
|
|
|
MOJOSHADER_RS_WRAP14,
|
|
|
MOJOSHADER_RS_WRAP15,
|
|
|
MOJOSHADER_RS_CLIPPING,
|
|
|
MOJOSHADER_RS_LIGHTING,
|
|
|
MOJOSHADER_RS_AMBIENT,
|
|
|
MOJOSHADER_RS_FOGVERTEXMODE,
|
|
|
MOJOSHADER_RS_COLORVERTEX,
|
|
|
MOJOSHADER_RS_LOCALVIEWER,
|
|
|
MOJOSHADER_RS_NORMALIZENORMALS,
|
|
|
MOJOSHADER_RS_DIFFUSEMATERIALSOURCE,
|
|
|
MOJOSHADER_RS_SPECULARMATERIALSOURCE,
|
|
|
MOJOSHADER_RS_AMBIENTMATERIALSOURCE,
|
|
|
MOJOSHADER_RS_EMISSIVEMATERIALSOURCE,
|
|
|
MOJOSHADER_RS_VERTEXBLEND,
|
|
|
MOJOSHADER_RS_CLIPPLANEENABLE,
|
|
|
MOJOSHADER_RS_POINTSIZE,
|
|
|
MOJOSHADER_RS_POINTSIZE_MIN,
|
|
|
MOJOSHADER_RS_POINTSPRITEENABLE,
|
|
|
MOJOSHADER_RS_POINTSCALEENABLE,
|
|
|
MOJOSHADER_RS_POINTSCALE_A,
|
|
|
MOJOSHADER_RS_POINTSCALE_B,
|
|
|
MOJOSHADER_RS_POINTSCALE_C,
|
|
|
MOJOSHADER_RS_MULTISAMPLEANTIALIAS,
|
|
|
MOJOSHADER_RS_MULTISAMPLEMASK,
|
|
|
MOJOSHADER_RS_PATCHEDGESTYLE,
|
|
|
MOJOSHADER_RS_DEBUGMONITORTOKEN,
|
|
|
MOJOSHADER_RS_POINTSIZE_MAX,
|
|
|
MOJOSHADER_RS_INDEXEDVERTEXBLENDENABLE,
|
|
|
MOJOSHADER_RS_COLORWRITEENABLE,
|
|
|
MOJOSHADER_RS_TWEENFACTOR,
|
|
|
MOJOSHADER_RS_BLENDOP,
|
|
|
MOJOSHADER_RS_POSITIONDEGREE,
|
|
|
MOJOSHADER_RS_NORMALDEGREE,
|
|
|
MOJOSHADER_RS_SCISSORTESTENABLE,
|
|
|
MOJOSHADER_RS_SLOPESCALEDEPTHBIAS,
|
|
|
MOJOSHADER_RS_ANTIALIASEDLINEENABLE,
|
|
|
MOJOSHADER_RS_MINTESSELLATIONLEVEL,
|
|
|
MOJOSHADER_RS_MAXTESSELLATIONLEVEL,
|
|
|
MOJOSHADER_RS_ADAPTIVETESS_X,
|
|
|
MOJOSHADER_RS_ADAPTIVETESS_Y,
|
|
|
MOJOSHADER_RS_ADAPTIVETESS_Z,
|
|
|
MOJOSHADER_RS_ADAPTIVETESS_W,
|
|
|
MOJOSHADER_RS_ENABLEADAPTIVETESSELLATION,
|
|
|
MOJOSHADER_RS_TWOSIDEDSTENCILMODE,
|
|
|
MOJOSHADER_RS_CCW_STENCILFAIL,
|
|
|
MOJOSHADER_RS_CCW_STENCILZFAIL,
|
|
|
MOJOSHADER_RS_CCW_STENCILPASS,
|
|
|
MOJOSHADER_RS_CCW_STENCILFUNC,
|
|
|
MOJOSHADER_RS_COLORWRITEENABLE1,
|
|
|
MOJOSHADER_RS_COLORWRITEENABLE2,
|
|
|
MOJOSHADER_RS_COLORWRITEENABLE3,
|
|
|
MOJOSHADER_RS_BLENDFACTOR,
|
|
|
MOJOSHADER_RS_SRGBWRITEENABLE,
|
|
|
MOJOSHADER_RS_DEPTHBIAS,
|
|
|
MOJOSHADER_RS_SEPARATEALPHABLENDENABLE,
|
|
|
MOJOSHADER_RS_SRCBLENDALPHA,
|
|
|
MOJOSHADER_RS_DESTBLENDALPHA,
|
|
|
MOJOSHADER_RS_BLENDOPALPHA,
|
|
|
|
|
|
/* These aren't really "states", but these numbers are
|
|
|
* referred to by MOJOSHADER_effectStateType as such.
|
|
|
*/
|
|
|
MOJOSHADER_RS_VERTEXSHADER = 146,
|
|
|
MOJOSHADER_RS_PIXELSHADER = 147
|
|
|
} MOJOSHADER_renderStateType;
|
|
|
|
|
|
typedef enum MOJOSHADER_zBufferType
|
|
|
{
|
|
|
MOJOSHADER_ZB_FALSE,
|
|
|
MOJOSHADER_ZB_TRUE,
|
|
|
MOJOSHADER_ZB_USEW
|
|
|
} MOJOSHADER_zBufferType;
|
|
|
|
|
|
typedef enum MOJOSHADER_fillMode
|
|
|
{
|
|
|
MOJOSHADER_FILL_POINT = 1,
|
|
|
MOJOSHADER_FILL_WIREFRAME = 2,
|
|
|
MOJOSHADER_FILL_SOLID = 3
|
|
|
} MOJOSHADER_fillMode;
|
|
|
|
|
|
typedef enum MOJOSHADER_shadeMode
|
|
|
{
|
|
|
MOJOSHADER_SHADE_FLAT = 1,
|
|
|
MOJOSHADER_SHADE_GOURAUD = 2,
|
|
|
MOJOSHADER_SHADE_PHONG = 3,
|
|
|
} MOJOSHADER_shadeMode;
|
|
|
|
|
|
typedef enum MOJOSHADER_blendMode
|
|
|
{
|
|
|
MOJOSHADER_BLEND_ZERO = 1,
|
|
|
MOJOSHADER_BLEND_ONE = 2,
|
|
|
MOJOSHADER_BLEND_SRCCOLOR = 3,
|
|
|
MOJOSHADER_BLEND_INVSRCCOLOR = 4,
|
|
|
MOJOSHADER_BLEND_SRCALPHA = 5,
|
|
|
MOJOSHADER_BLEND_INVSRCALPHA = 6,
|
|
|
MOJOSHADER_BLEND_DESTALPHA = 7,
|
|
|
MOJOSHADER_BLEND_INVDESTALPHA = 8,
|
|
|
MOJOSHADER_BLEND_DESTCOLOR = 9,
|
|
|
MOJOSHADER_BLEND_INVDESTCOLOR = 10,
|
|
|
MOJOSHADER_BLEND_SRCALPHASAT = 11,
|
|
|
MOJOSHADER_BLEND_BOTHSRCALPHA = 12,
|
|
|
MOJOSHADER_BLEND_BOTHINVSRCALPHA = 13,
|
|
|
MOJOSHADER_BLEND_BLENDFACTOR = 14,
|
|
|
MOJOSHADER_BLEND_INVBLENDFACTOR = 15,
|
|
|
MOJOSHADER_BLEND_SRCCOLOR2 = 16,
|
|
|
MOJOSHADER_BLEND_INVSRCCOLOR2 = 17
|
|
|
} MOJOSHADER_blendMode;
|
|
|
|
|
|
typedef enum MOJOSHADER_cullMode
|
|
|
{
|
|
|
MOJOSHADER_CULL_NONE = 1,
|
|
|
MOJOSHADER_CULL_CW = 2,
|
|
|
MOJOSHADER_CULL_CCW = 3
|
|
|
} MOJOSHADER_cullMode;
|
|
|
|
|
|
typedef enum MOJOSHADER_compareFunc
|
|
|
{
|
|
|
MOJOSHADER_CMP_NEVER = 1,
|
|
|
MOJOSHADER_CMP_LESS = 2,
|
|
|
MOJOSHADER_CMP_EQUAL = 3,
|
|
|
MOJOSHADER_CMP_LESSEQUAL = 4,
|
|
|
MOJOSHADER_CMP_GREATER = 5,
|
|
|
MOJOSHADER_CMP_NOTEQUAL = 6,
|
|
|
MOJOSHADER_CMP_GREATEREQUAL = 7,
|
|
|
MOJOSHADER_CMP_ALWAYS = 8
|
|
|
} MOJOSHADER_compareFunc;
|
|
|
|
|
|
typedef enum MOJOSHADER_fogMode
|
|
|
{
|
|
|
MOJOSHADER_FOG_NONE,
|
|
|
MOJOSHADER_FOG_EXP,
|
|
|
MOJOSHADER_FOG_EXP2,
|
|
|
MOJOSHADER_FOG_LINEAR
|
|
|
} MOJOSHADER_fogMode;
|
|
|
|
|
|
typedef enum MOJOSHADER_stencilOp
|
|
|
{
|
|
|
MOJOSHADER_STENCILOP_KEEP = 1,
|
|
|
MOJOSHADER_STENCILOP_ZERO = 2,
|
|
|
MOJOSHADER_STENCILOP_REPLACE = 3,
|
|
|
MOJOSHADER_STENCILOP_INCRSAT = 4,
|
|
|
MOJOSHADER_STENCILOP_DECRSAT = 5,
|
|
|
MOJOSHADER_STENCILOP_INVERT = 6,
|
|
|
MOJOSHADER_STENCILOP_INCR = 7,
|
|
|
MOJOSHADER_STENCILOP_DECR = 8
|
|
|
} MOJOSHADER_stencilOp;
|
|
|
|
|
|
typedef enum MOJOSHADER_materialColorSource
|
|
|
{
|
|
|
MOJOSHADER_MCS_MATERIAL,
|
|
|
MOJOSHADER_MCS_COLOR1,
|
|
|
MOJOSHADER_MCS_COLOR2
|
|
|
} MOJOSHADER_materialColorSource;
|
|
|
|
|
|
typedef enum MOJOSHADER_vertexBlendFlags
|
|
|
{
|
|
|
MOJOSHADER_VBF_DISABLE = 0,
|
|
|
MOJOSHADER_VBF_1WEIGHTS = 1,
|
|
|
MOJOSHADER_VBF_2WEIGHTS = 2,
|
|
|
MOJOSHADER_VBF_3WEIGHTS = 3,
|
|
|
MOJOSHADER_VBF_TWEENING = 255,
|
|
|
MOJOSHADER_VBF_0WEIGHTS = 256,
|
|
|
} MOJOSHADER_vertexBlendFlags;
|
|
|
|
|
|
typedef enum MOJOSHADER_patchedEdgeStyle
|
|
|
{
|
|
|
MOJOSHADER_PATCHEDGE_DISCRETE,
|
|
|
MOJOSHADER_PATCHEDGE_CONTINUOUS
|
|
|
} MOJOSHADER_patchedEdgeStyle;
|
|
|
|
|
|
typedef enum MOJOSHADER_debugMonitorTokens
|
|
|
{
|
|
|
MOJOSHADER_DMT_ENABLE,
|
|
|
MOJOSHADER_DMT_DISABLE
|
|
|
} MOJOSHADER_debugMonitorTokens;
|
|
|
|
|
|
typedef enum MOJOSHADER_blendOp
|
|
|
{
|
|
|
MOJOSHADER_BLENDOP_ADD = 1,
|
|
|
MOJOSHADER_BLENDOP_SUBTRACT = 2,
|
|
|
MOJOSHADER_BLENDOP_REVSUBTRACT = 3,
|
|
|
MOJOSHADER_BLENDOP_MIN = 4,
|
|
|
MOJOSHADER_BLENDOP_MAX = 5
|
|
|
} MOJOSHADER_blendOp;
|
|
|
|
|
|
typedef enum MOJOSHADER_degreeType
|
|
|
{
|
|
|
MOJOSHADER_DEGREE_LINEAR = 1,
|
|
|
MOJOSHADER_DEGREE_QUADRATIC = 2,
|
|
|
MOJOSHADER_DEGREE_CUBIC = 3,
|
|
|
MOJOSHADER_DEGREE_QUINTIC = 5
|
|
|
} MOJOSHADER_degreeType;
|
|
|
|
|
|
|
|
|
/* MOJOSHADER_effectSamplerState types... */
|
|
|
|
|
|
typedef enum MOJOSHADER_samplerStateType
|
|
|
{
|
|
|
MOJOSHADER_SAMP_UNKNOWN0 = 0,
|
|
|
MOJOSHADER_SAMP_UNKNOWN1 = 1,
|
|
|
MOJOSHADER_SAMP_UNKNOWN2 = 2,
|
|
|
MOJOSHADER_SAMP_UNKNOWN3 = 3,
|
|
|
MOJOSHADER_SAMP_TEXTURE = 4,
|
|
|
MOJOSHADER_SAMP_ADDRESSU = 5,
|
|
|
MOJOSHADER_SAMP_ADDRESSV = 6,
|
|
|
MOJOSHADER_SAMP_ADDRESSW = 7,
|
|
|
MOJOSHADER_SAMP_BORDERCOLOR = 8,
|
|
|
MOJOSHADER_SAMP_MAGFILTER = 9,
|
|
|
MOJOSHADER_SAMP_MINFILTER = 10,
|
|
|
MOJOSHADER_SAMP_MIPFILTER = 11,
|
|
|
MOJOSHADER_SAMP_MIPMAPLODBIAS = 12,
|
|
|
MOJOSHADER_SAMP_MAXMIPLEVEL = 13,
|
|
|
MOJOSHADER_SAMP_MAXANISOTROPY = 14,
|
|
|
MOJOSHADER_SAMP_SRGBTEXTURE = 15,
|
|
|
MOJOSHADER_SAMP_ELEMENTINDEX = 16,
|
|
|
MOJOSHADER_SAMP_DMAPOFFSET = 17
|
|
|
} MOJOSHADER_samplerStateType;
|
|
|
|
|
|
typedef enum MOJOSHADER_textureAddress
|
|
|
{
|
|
|
MOJOSHADER_TADDRESS_WRAP = 1,
|
|
|
MOJOSHADER_TADDRESS_MIRROR = 2,
|
|
|
MOJOSHADER_TADDRESS_CLAMP = 3,
|
|
|
MOJOSHADER_TADDRESS_BORDER = 4,
|
|
|
MOJOSHADER_TADDRESS_MIRRORONCE = 5
|
|
|
} MOJOSHADER_textureAddress;
|
|
|
|
|
|
typedef enum MOJOSHADER_textureFilterType
|
|
|
{
|
|
|
MOJOSHADER_TEXTUREFILTER_NONE,
|
|
|
MOJOSHADER_TEXTUREFILTER_POINT,
|
|
|
MOJOSHADER_TEXTUREFILTER_LINEAR,
|
|
|
MOJOSHADER_TEXTUREFILTER_ANISOTROPIC,
|
|
|
MOJOSHADER_TEXTUREFILTER_PYRAMIDALQUAD,
|
|
|
MOJOSHADER_TEXTUREFILTER_GAUSSIANQUAD,
|
|
|
MOJOSHADER_TEXTUREFILTER_CONVOLUTIONMONO
|
|
|
} MOJOSHADER_textureFilterType;
|
|
|
|
|
|
|
|
|
/* Effect value types... */
|
|
|
|
|
|
typedef struct MOJOSHADER_effectSamplerState MOJOSHADER_effectSamplerState;
|
|
|
|
|
|
typedef struct MOJOSHADER_effectValue
|
|
|
{
|
|
|
const char *name;
|
|
|
const char *semantic;
|
|
|
MOJOSHADER_symbolTypeInfo type;
|
|
|
unsigned int value_count;
|
|
|
union
|
|
|
{
|
|
|
/* Raw value types */
|
|
|
void *values;
|
|
|
int *valuesI;
|
|
|
float *valuesF;
|
|
|
/* As used by MOJOSHADER_effectState */
|
|
|
MOJOSHADER_zBufferType *valuesZBT;
|
|
|
MOJOSHADER_fillMode *valuesFiM;
|
|
|
MOJOSHADER_shadeMode *valuesSM;
|
|
|
MOJOSHADER_blendMode *valuesBM;
|
|
|
MOJOSHADER_cullMode *valuesCM;
|
|
|
MOJOSHADER_compareFunc *valuesCF;
|
|
|
MOJOSHADER_fogMode *valuesFoM;
|
|
|
MOJOSHADER_stencilOp *valuesSO;
|
|
|
MOJOSHADER_materialColorSource *valuesMCS;
|
|
|
MOJOSHADER_vertexBlendFlags *valuesVBF;
|
|
|
MOJOSHADER_patchedEdgeStyle *valuesPES;
|
|
|
MOJOSHADER_debugMonitorTokens *valuesDMT;
|
|
|
MOJOSHADER_blendOp *valuesBO;
|
|
|
MOJOSHADER_degreeType *valuesDT;
|
|
|
/* As used by MOJOSHADER_effectSamplerState */
|
|
|
MOJOSHADER_textureAddress *valuesTA;
|
|
|
MOJOSHADER_textureFilterType *valuesTFT;
|
|
|
/* As used by MOJOSHADER_effectParameter */
|
|
|
MOJOSHADER_effectSamplerState *valuesSS;
|
|
|
};
|
|
|
} MOJOSHADER_effectValue;
|
|
|
|
|
|
typedef struct MOJOSHADER_effectState
|
|
|
{
|
|
|
MOJOSHADER_renderStateType type;
|
|
|
MOJOSHADER_effectValue value;
|
|
|
} MOJOSHADER_effectState;
|
|
|
|
|
|
struct MOJOSHADER_effectSamplerState
|
|
|
{
|
|
|
MOJOSHADER_samplerStateType type;
|
|
|
MOJOSHADER_effectValue value;
|
|
|
};
|
|
|
|
|
|
typedef MOJOSHADER_effectValue MOJOSHADER_effectAnnotation;
|
|
|
|
|
|
|
|
|
/* Effect interface structures... */
|
|
|
|
|
|
typedef struct MOJOSHADER_effectParam
|
|
|
{
|
|
|
MOJOSHADER_effectValue value;
|
|
|
unsigned int annotation_count;
|
|
|
MOJOSHADER_effectAnnotation *annotations;
|
|
|
} MOJOSHADER_effectParam;
|
|
|
|
|
|
typedef struct MOJOSHADER_effectPass
|
|
|
{
|
|
|
const char *name;
|
|
|
unsigned int state_count;
|
|
|
MOJOSHADER_effectState *states;
|
|
|
unsigned int annotation_count;
|
|
|
MOJOSHADER_effectAnnotation* annotations;
|
|
|
} MOJOSHADER_effectPass;
|
|
|
|
|
|
typedef struct MOJOSHADER_effectTechnique
|
|
|
{
|
|
|
const char *name;
|
|
|
unsigned int pass_count;
|
|
|
MOJOSHADER_effectPass *passes;
|
|
|
unsigned int annotation_count;
|
|
|
MOJOSHADER_effectAnnotation* annotations;
|
|
|
} MOJOSHADER_effectTechnique;
|
|
|
|
|
|
|
|
|
/* Effect "objects"... */
|
|
|
|
|
|
/* Defined later in the state change types... */
|
|
|
typedef struct MOJOSHADER_samplerStateRegister MOJOSHADER_samplerStateRegister;
|
|
|
|
|
|
typedef struct MOJOSHADER_effectShader
|
|
|
{
|
|
|
MOJOSHADER_symbolType type;
|
|
|
unsigned int technique;
|
|
|
unsigned int pass;
|
|
|
unsigned int is_preshader;
|
|
|
unsigned int preshader_param_count;
|
|
|
unsigned int *preshader_params;
|
|
|
unsigned int param_count;
|
|
|
unsigned int *params;
|
|
|
unsigned int sampler_count;
|
|
|
MOJOSHADER_samplerStateRegister *samplers;
|
|
|
union
|
|
|
{
|
|
|
const MOJOSHADER_parseData *shader;
|
|
|
const MOJOSHADER_preshader *preshader;
|
|
|
};
|
|
|
} MOJOSHADER_effectShader;
|
|
|
|
|
|
typedef struct MOJOSHADER_effectSamplerMap
|
|
|
{
|
|
|
MOJOSHADER_symbolType type;
|
|
|
const char *name;
|
|
|
} MOJOSHADER_effectSamplerMap;
|
|
|
|
|
|
typedef struct MOJOSHADER_effectString
|
|
|
{
|
|
|
MOJOSHADER_symbolType type;
|
|
|
const char *string;
|
|
|
} MOJOSHADER_effectString;
|
|
|
|
|
|
typedef struct MOJOSHADER_effectTexture
|
|
|
{
|
|
|
MOJOSHADER_symbolType type;
|
|
|
/* FIXME: Does this even do anything? */
|
|
|
} MOJOSHADER_effectTexture;
|
|
|
|
|
|
typedef union MOJOSHADER_effectObject
|
|
|
{
|
|
|
MOJOSHADER_symbolType type;
|
|
|
union
|
|
|
{
|
|
|
MOJOSHADER_effectShader shader;
|
|
|
MOJOSHADER_effectSamplerMap mapping;
|
|
|
MOJOSHADER_effectString string;
|
|
|
MOJOSHADER_effectTexture texture;
|
|
|
};
|
|
|
} MOJOSHADER_effectObject;
|
|
|
|
|
|
|
|
|
/* Effect state change types... */
|
|
|
|
|
|
/* Used to store sampler states with accompanying sampler registers */
|
|
|
struct MOJOSHADER_samplerStateRegister
|
|
|
{
|
|
|
const char *sampler_name;
|
|
|
unsigned int sampler_register;
|
|
|
unsigned int sampler_state_count;
|
|
|
const MOJOSHADER_effectSamplerState *sampler_states;
|
|
|
};
|
|
|
|
|
|
/*
|
|
|
* Used to acquire the desired render state by the effect pass.
|
|
|
*/
|
|
|
typedef struct MOJOSHADER_effectStateChanges
|
|
|
{
|
|
|
/* Render state changes caused by effect technique */
|
|
|
unsigned int render_state_change_count;
|
|
|
const MOJOSHADER_effectState *render_state_changes;
|
|
|
|
|
|
/* Sampler state changes caused by effect technique */
|
|
|
unsigned int sampler_state_change_count;
|
|
|
const MOJOSHADER_samplerStateRegister *sampler_state_changes;
|
|
|
|
|
|
/* Vertex sampler state changes caused by effect technique */
|
|
|
unsigned int vertex_sampler_state_change_count;
|
|
|
const MOJOSHADER_samplerStateRegister *vertex_sampler_state_changes;
|
|
|
} MOJOSHADER_effectStateChanges;
|
|
|
|
|
|
|
|
|
/*
|
|
|
* Structure used to return data from parsing of an effect file...
|
|
|
*/
|
|
|
/* !!! FIXME: most of these ints should be unsigned. */
|
|
|
typedef struct MOJOSHADER_effect
|
|
|
{
|
|
|
/*
|
|
|
* The number of elements pointed to by (errors).
|
|
|
*/
|
|
|
int error_count;
|
|
|
|
|
|
/*
|
|
|
* (error_count) elements of data that specify errors that were generated
|
|
|
* by parsing this shader.
|
|
|
* This can be NULL if there were no errors or if (error_count) is zero.
|
|
|
*/
|
|
|
MOJOSHADER_error *errors;
|
|
|
|
|
|
/*
|
|
|
* The name of the profile used to parse the shader. Will be NULL on error.
|
|
|
*/
|
|
|
const char *profile;
|
|
|
|
|
|
/*
|
|
|
* The number of params pointed to by (params).
|
|
|
*/
|
|
|
int param_count;
|
|
|
|
|
|
/*
|
|
|
* (param_count) elements of data that specify parameter bind points for
|
|
|
* this effect.
|
|
|
* This can be NULL on error or if (param_count) is zero.
|
|
|
*/
|
|
|
MOJOSHADER_effectParam *params;
|
|
|
|
|
|
/*
|
|
|
* The number of elements pointed to by (techniques).
|
|
|
*/
|
|
|
int technique_count;
|
|
|
|
|
|
/*
|
|
|
* (technique_count) elements of data that specify techniques used in
|
|
|
* this effect. Each technique contains a series of passes, and each pass
|
|
|
* specifies state and shaders that affect rendering.
|
|
|
* This can be NULL on error or if (technique_count) is zero.
|
|
|
*/
|
|
|
MOJOSHADER_effectTechnique *techniques;
|
|
|
|
|
|
/*
|
|
|
* The technique currently being rendered by this effect.
|
|
|
*/
|
|
|
const MOJOSHADER_effectTechnique *current_technique;
|
|
|
|
|
|
/*
|
|
|
* The index of the current pass being rendered by this effect.
|
|
|
*/
|
|
|
int current_pass;
|
|
|
|
|
|
/*
|
|
|
* The number of elements pointed to by (objects).
|
|
|
*/
|
|
|
int object_count;
|
|
|
|
|
|
/*
|
|
|
* (object_count) elements of data that specify objects used in
|
|
|
* this effect.
|
|
|
* This can be NULL on error or if (object_count) is zero.
|
|
|
*/
|
|
|
MOJOSHADER_effectObject *objects;
|
|
|
|
|
|
/*
|
|
|
* Value used to determine whether or not to restore the previous shader
|
|
|
* state after rendering an effect, as requested by application.
|
|
|
*/
|
|
|
int restore_shader_state;
|
|
|
|
|
|
/*
|
|
|
* The structure provided by the appliation to store the state changes.
|
|
|
*/
|
|
|
MOJOSHADER_effectStateChanges *state_changes;
|
|
|
|
|
|
/*
|
|
|
* This is the malloc implementation you passed to MOJOSHADER_parseEffect().
|
|
|
*/
|
|
|
MOJOSHADER_malloc malloc;
|
|
|
|
|
|
/*
|
|
|
* This is the free implementation you passed to MOJOSHADER_parseEffect().
|
|
|
*/
|
|
|
MOJOSHADER_free free;
|
|
|
|
|
|
/*
|
|
|
* This is the pointer you passed as opaque data for your allocator.
|
|
|
*/
|
|
|
void *malloc_data;
|
|
|
} MOJOSHADER_effect;
|
|
|
|
|
|
|
|
|
/* Effect parsing interface... */
|
|
|
|
|
|
/* !!! FIXME: document me. */
|
|
|
DECLSPEC MOJOSHADER_effect *MOJOSHADER_parseEffect(const char *profile,
|
|
|
const unsigned char *buf,
|
|
|
const unsigned int _len,
|
|
|
const MOJOSHADER_swizzle *swiz,
|
|
|
const unsigned int swizcount,
|
|
|
const MOJOSHADER_samplerMap *smap,
|
|
|
const unsigned int smapcount,
|
|
|
MOJOSHADER_malloc m,
|
|
|
MOJOSHADER_free f,
|
|
|
void *d);
|
|
|
|
|
|
|
|
|
/* !!! FIXME: document me. */
|
|
|
DECLSPEC void MOJOSHADER_freeEffect(const MOJOSHADER_effect *effect);
|
|
|
|
|
|
|
|
|
/* !!! FIXME: document me. */
|
|
|
DECLSPEC MOJOSHADER_effect *MOJOSHADER_cloneEffect(const MOJOSHADER_effect *effect);
|
|
|
|
|
|
|
|
|
/* Effect parameter interface... */
|
|
|
|
|
|
/* Set the constant value for the specified effect parameter.
|
|
|
*
|
|
|
* This function maps to ID3DXEffect::SetRawValue.
|
|
|
*
|
|
|
* (parameter) is a parameter obtained from a MOJOSHADER_effect*.
|
|
|
* (data) is the constant values to be applied to the parameter.
|
|
|
* (offset) is the offset, in bytes, of the parameter data being modified.
|
|
|
* (len) is the size, in bytes, of the data buffer being applied.
|
|
|
*
|
|
|
* This function is thread safe.
|
|
|
*/
|
|
|
DECLSPEC void MOJOSHADER_effectSetRawValueHandle(const MOJOSHADER_effectParam *parameter,
|
|
|
const void *data,
|
|
|
const unsigned int offset,
|
|
|
const unsigned int len);
|
|
|
|
|
|
/* Set the constant value for the effect parameter, specified by name.
|
|
|
* Note: this function is slower than MOJOSHADER_effectSetRawValueHandle(),
|
|
|
* but we still provide it to fully map to ID3DXEffect.
|
|
|
*
|
|
|
* This function maps to ID3DXEffect::SetRawValue.
|
|
|
*
|
|
|
* (effect) is a MOJOSHADER_effect* obtained from MOJOSHADER_parseEffect().
|
|
|
* (name) is the human-readable name of the parameter being modified.
|
|
|
* (data) is the constant values to be applied to the parameter.
|
|
|
* (offset) is the offset, in bytes, of the parameter data being modified.
|
|
|
* (len) is the size, in bytes, of the data buffer being applied.
|
|
|
*
|
|
|
* This function is thread safe.
|
|
|
*/
|
|
|
DECLSPEC void MOJOSHADER_effectSetRawValueName(const MOJOSHADER_effect *effect,
|
|
|
const char *name,
|
|
|
const void *data,
|
|
|
const unsigned int offset,
|
|
|
const unsigned int len);
|
|
|
|
|
|
|
|
|
/* Effect technique interface... */
|
|
|
|
|
|
/* Get the current technique in use by an effect.
|
|
|
*
|
|
|
* This function maps to ID3DXEffect::GetCurrentTechnique.
|
|
|
*
|
|
|
* (effect) is a MOJOSHADER_effect* obtained from MOJOSHADER_parseEffect().
|
|
|
*
|
|
|
* This function returns the technique currently used by the given effect.
|
|
|
*
|
|
|
* This function is thread safe.
|
|
|
*/
|
|
|
DECLSPEC const MOJOSHADER_effectTechnique *MOJOSHADER_effectGetCurrentTechnique(const MOJOSHADER_effect *effect);
|
|
|
|
|
|
/* Set the current technique to be used an effect.
|
|
|
*
|
|
|
* This function maps to ID3DXEffect::SetTechnique.
|
|
|
*
|
|
|
* (effect) is a MOJOSHADER_effect* obtained from MOJOSHADER_parseEffect().
|
|
|
* (technique) is the technique to be used by the effect when rendered.
|
|
|
*
|
|
|
* This function is thread safe.
|
|
|
*/
|
|
|
DECLSPEC void MOJOSHADER_effectSetTechnique(MOJOSHADER_effect *effect,
|
|
|
const MOJOSHADER_effectTechnique *technique);
|
|
|
|
|
|
/* Get the next technique in an effect's list.
|
|
|
*
|
|
|
* This function maps to ID3DXEffect::FindNextValidTechnique.
|
|
|
*
|
|
|
* (effect) is a MOJOSHADER_effect* obtained from MOJOSHADER_parseEffect().
|
|
|
* (technique) can either be a technique found in the given effect, or NULL to
|
|
|
* find the first technique in the given effect.
|
|
|
*
|
|
|
* This function returns either the next technique after the passed technique,
|
|
|
* or the first technique if the passed technique is NULL.
|
|
|
*
|
|
|
* This function is thread safe.
|
|
|
*/
|
|
|
DECLSPEC const MOJOSHADER_effectTechnique *MOJOSHADER_effectFindNextValidTechnique(const MOJOSHADER_effect *effect,
|
|
|
const MOJOSHADER_effectTechnique *technique);
|
|
|
|
|
|
|
|
|
/* OpenGL effect interface... */
|
|
|
|
|
|
typedef struct MOJOSHADER_glEffect MOJOSHADER_glEffect;
|
|
|
|
|
|
/* Fully compile/link the shaders found within the effect.
|
|
|
*
|
|
|
* The MOJOSHADER_glEffect* is solely for use within the OpenGL-specific calls.
|
|
|
* In all other cases you will be using the MOJOSHADER_effect* instead.
|
|
|
*
|
|
|
* In a typical use case, you will be calling this immediately after obtaining
|
|
|
* the MOJOSHADER_effect*.
|
|
|
*
|
|
|
* (effect) is a MOJOSHADER_effect* obtained from MOJOSHADER_parseEffect().
|
|
|
*
|
|
|
* This function returns a MOJOSHADER_glEffect*, containing OpenGL-specific
|
|
|
* data for an accompanying MOJOSHADER_effect*.
|
|
|
*
|
|
|
* This call is NOT thread safe! As most OpenGL implementations are not thread
|
|
|
* safe, you should probably only call this from the same thread that created
|
|
|
* the GL context.
|
|
|
*/
|
|
|
DECLSPEC MOJOSHADER_glEffect *MOJOSHADER_glCompileEffect(MOJOSHADER_effect *effect);
|
|
|
|
|
|
/* Delete the shaders that were allocated for an effect.
|
|
|
*
|
|
|
* (glEffect) is a MOJOSHADER_glEffect* obtained from
|
|
|
* MOJOSHADER_glCompileEffect().
|
|
|
*
|
|
|
* This call is NOT thread safe! As most OpenGL implementations are not thread
|
|
|
* safe, you should probably only call this from the same thread that created
|
|
|
* the GL context.
|
|
|
*/
|
|
|
DECLSPEC void MOJOSHADER_glDeleteEffect(MOJOSHADER_glEffect *glEffect);
|
|
|
|
|
|
/* Prepare the effect for rendering with the currently applied technique.
|
|
|
*
|
|
|
* This function maps to ID3DXEffect::Begin.
|
|
|
*
|
|
|
* In addition to the expected Begin parameters, we also include a parameter
|
|
|
* to pass in a MOJOSHADER_effectRenderState. Rather than change the render
|
|
|
* state within MojoShader itself we will simply provide what the effect wants
|
|
|
* and allow you to use this information with your own renderer.
|
|
|
* MOJOSHADER_glEffectBeginPass will update with the render state desired by
|
|
|
* the current effect pass.
|
|
|
*
|
|
|
* Note that we only provide the ability to preserve the shader state, but NOT
|
|
|
* the ability to preserve the render/sampler states. You are expected to
|
|
|
* track your own GL state and restore these states as needed for your
|
|
|
* application.
|
|
|
*
|
|
|
* (glEffect) is a MOJOSHADER_glEffect* obtained from
|
|
|
* MOJOSHADER_glCompileEffect().
|
|
|
* (numPasses) will be filled with the number of passes that this technique
|
|
|
* will need to fully render.
|
|
|
* (saveShaderState) is a boolean value informing the effect whether or not to
|
|
|
* restore the shader bindings after calling MOJOSHADER_glEffectEnd.
|
|
|
* (renderState) will be filled by the effect to inform you of the render state
|
|
|
* changes introduced by the technique and its passes.
|
|
|
*
|
|
|
* This call is NOT thread safe! As most OpenGL implementations are not thread
|
|
|
* safe, you should probably only call this from the same thread that created
|
|
|
* the GL context.
|
|
|
*/
|
|
|
DECLSPEC void MOJOSHADER_glEffectBegin(MOJOSHADER_glEffect *glEffect,
|
|
|
unsigned int *numPasses,
|
|
|
int saveShaderState,
|
|
|
MOJOSHADER_effectStateChanges *stateChanges);
|
|
|
|
|
|
/* Begin an effect pass from the currently applied technique.
|
|
|
*
|
|
|
* This function maps to ID3DXEffect::BeginPass.
|
|
|
*
|
|
|
* (glEffect) is a MOJOSHADER_glEffect* obtained from
|
|
|
* MOJOSHADER_glCompileEffect().
|
|
|
* (pass) is the index of the effect pass as found in the current technique.
|
|
|
*
|
|
|
* This call is NOT thread safe! As most OpenGL implementations are not thread
|
|
|
* safe, you should probably only call this from the same thread that created
|
|
|
* the GL context.
|
|
|
*/
|
|
|
DECLSPEC void MOJOSHADER_glEffectBeginPass(MOJOSHADER_glEffect *glEffect,
|
|
|
unsigned int pass);
|
|
|
|
|
|
/* Push render state changes that occurred within an actively rendering pass.
|
|
|
*
|
|
|
* This function maps to ID3DXEffect::CommitChanges.
|
|
|
*
|
|
|
* (glEffect) is a MOJOSHADER_glEffect* obtained from
|
|
|
* MOJOSHADER_glCompileEffect().
|
|
|
*
|
|
|
* This call is NOT thread safe! As most OpenGL implementations are not thread
|
|
|
* safe, you should probably only call this from the same thread that created
|
|
|
* the GL context.
|
|
|
*/
|
|
|
DECLSPEC void MOJOSHADER_glEffectCommitChanges(MOJOSHADER_glEffect *glEffect);
|
|
|
|
|
|
/* End an effect pass from the currently applied technique.
|
|
|
*
|
|
|
* This function maps to ID3DXEffect::EndPass.
|
|
|
*
|
|
|
* (glEffect) is a MOJOSHADER_glEffect* obtained from
|
|
|
* MOJOSHADER_glCompileEffect().
|
|
|
*
|
|
|
* This call is NOT thread safe! As most OpenGL implementations are not thread
|
|
|
* safe, you should probably only call this from the same thread that created
|
|
|
* the GL context.
|
|
|
*/
|
|
|
DECLSPEC void MOJOSHADER_glEffectEndPass(MOJOSHADER_glEffect *glEffect);
|
|
|
|
|
|
/* Complete rendering the effect technique, and restore the render state.
|
|
|
*
|
|
|
* This function maps to ID3DXEffect::End.
|
|
|
*
|
|
|
* (glEffect) is a MOJOSHADER_glEffect* obtained from
|
|
|
* MOJOSHADER_glCompileEffect().
|
|
|
*
|
|
|
* This call is NOT thread safe! As most OpenGL implementations are not thread
|
|
|
* safe, you should probably only call this from the same thread that created
|
|
|
* the GL context.
|
|
|
*/
|
|
|
DECLSPEC void MOJOSHADER_glEffectEnd(MOJOSHADER_glEffect *glEffect);
|
|
|
|
|
|
|
|
|
/* Metal effect interface... */
|
|
|
|
|
|
typedef struct MOJOSHADER_mtlEffect MOJOSHADER_mtlEffect;
|
|
|
typedef struct MOJOSHADER_mtlShader MOJOSHADER_mtlShader;
|
|
|
typedef struct MOJOSHADER_mtlShaderState MOJOSHADER_mtlShaderState;
|
|
|
|
|
|
/* Fully compile/link the shaders found within the effect.
|
|
|
*
|
|
|
* The MOJOSHADER_mtlEffect* is solely for use within the Metal-specific calls.
|
|
|
* In all other cases you will be using the MOJOSHADER_effect* instead.
|
|
|
*
|
|
|
* In a typical use case, you will be calling this immediately after obtaining
|
|
|
* the MOJOSHADER_effect*.
|
|
|
*
|
|
|
* (effect) is a MOJOSHADER_effect* obtained from MOJOSHADER_parseEffect().
|
|
|
* (mtlDevice) is a MTLDevice* obtained from a Metal device creation call,
|
|
|
* such as MTLCreateSystemDefaultDevice().
|
|
|
* (numBackingBuffers) is the number of backing uniform buffers that you
|
|
|
* want to create for each shader. If you are using double-buffering,
|
|
|
* this should be 2; for triple buffering, this should be 3, etc.
|
|
|
*
|
|
|
* This function returns a MOJOSHADER_mtlEffect*, containing Metal-specific
|
|
|
* data for an accompanying MOJOSHADER_effect*.
|
|
|
*/
|
|
|
DECLSPEC MOJOSHADER_mtlEffect *MOJOSHADER_mtlCompileEffect(MOJOSHADER_effect *effect,
|
|
|
void *mtlDevice,
|
|
|
int numBackingBuffers);
|
|
|
|
|
|
/* Delete the shaders that were allocated for an effect.
|
|
|
*
|
|
|
* (mtlEffect) is a MOJOSHADER_mtlEffect* obtained from
|
|
|
* MOJOSHADER_mtlCompileEffect().
|
|
|
*/
|
|
|
DECLSPEC void MOJOSHADER_mtlDeleteEffect(MOJOSHADER_mtlEffect *mtlEffect);
|
|
|
|
|
|
/* Prepare the effect for rendering with the currently applied technique.
|
|
|
*
|
|
|
* This function maps to ID3DXEffect::Begin.
|
|
|
*
|
|
|
* In addition to the expected Begin parameters, we also include a parameter
|
|
|
* to pass in a MOJOSHADER_effectRenderState. Rather than change the render
|
|
|
* state within MojoShader itself we will simply provide what the effect wants
|
|
|
* and allow you to use this information with your own renderer.
|
|
|
* MOJOSHADER_glEffectBeginPass will update with the render state desired by
|
|
|
* the current effect pass.
|
|
|
*
|
|
|
* Note that we only provide the ability to preserve the shader state, but NOT
|
|
|
* the ability to preserve the render/sampler states. You are expected to
|
|
|
* track your own Metal state and restore these states as needed for your
|
|
|
* application.
|
|
|
*
|
|
|
* (mtlEffect) is a MOJOSHADER_mtlEffect* obtained from
|
|
|
* MOJOSHADER_mtlCompileEffect().
|
|
|
* (numPasses) will be filled with the number of passes that this technique
|
|
|
* will need to fully render.
|
|
|
* (saveShaderState) is a boolean value informing the effect whether or not to
|
|
|
* restore the shader bindings after calling MOJOSHADER_mtlEffectEnd.
|
|
|
* (renderState) will be filled by the effect to inform you of the render state
|
|
|
* changes introduced by the technique and its passes.
|
|
|
*/
|
|
|
DECLSPEC void MOJOSHADER_mtlEffectBegin(MOJOSHADER_mtlEffect *mtlEffect,
|
|
|
unsigned int *numPasses,
|
|
|
int saveShaderState,
|
|
|
MOJOSHADER_effectStateChanges *stateChanges);
|
|
|
|
|
|
/* Begin an effect pass from the currently applied technique.
|
|
|
*
|
|
|
* This function maps to ID3DXEffect::BeginPass.
|
|
|
*
|
|
|
* (mtlEffect) is a MOJOSHADER_mtlEffect* obtained from
|
|
|
* MOJOSHADER_mtlCompileEffect().
|
|
|
* (pass) is the index of the effect pass as found in the current technique.
|
|
|
* (state) is a pointer to the current shader state object.
|
|
|
*
|
|
|
* The MOJOSHADER_mtlShaderState pointed to by (shState) must be created
|
|
|
* before calling this function!
|
|
|
*/
|
|
|
DECLSPEC void MOJOSHADER_mtlEffectBeginPass(MOJOSHADER_mtlEffect *mtlEffect,
|
|
|
unsigned int pass,
|
|
|
MOJOSHADER_mtlShaderState *shState);
|
|
|
|
|
|
/* Push render state changes that occurred within an actively rendering pass.
|
|
|
*
|
|
|
* This function maps to ID3DXEffect::CommitChanges.
|
|
|
*
|
|
|
* (mtlEffect) is a MOJOSHADER_mtlEffect* obtained from
|
|
|
* MOJOSHADER_mtlCompileEffect().
|
|
|
* (state) is a pointer to the current shader state object.
|
|
|
*/
|
|
|
DECLSPEC void MOJOSHADER_mtlEffectCommitChanges(MOJOSHADER_mtlEffect *mtlEffect,
|
|
|
MOJOSHADER_mtlShaderState *shState);
|
|
|
|
|
|
/* End an effect pass from the currently applied technique.
|
|
|
*
|
|
|
* This function maps to ID3DXEffect::EndPass.
|
|
|
*
|
|
|
* (mtlEffect) is a MOJOSHADER_mtlEffect* obtained from
|
|
|
* MOJOSHADER_mtlCompileEffect().
|
|
|
*/
|
|
|
DECLSPEC void MOJOSHADER_mtlEffectEndPass(MOJOSHADER_mtlEffect *mtlEffect);
|
|
|
|
|
|
/* Complete rendering the effect technique, and restore the render state.
|
|
|
*
|
|
|
* This function maps to ID3DXEffect::End.
|
|
|
*
|
|
|
* (mtlEffect) is a MOJOSHADER_mtlEffect* obtained from
|
|
|
* MOJOSHADER_glCompileEffect().
|
|
|
* (state) is a pointer to the current shader state object.
|
|
|
*/
|
|
|
DECLSPEC void MOJOSHADER_mtlEffectEnd(MOJOSHADER_mtlEffect *mtlEffect,
|
|
|
MOJOSHADER_mtlShaderState *shState);
|
|
|
|
|
|
#endif /* MOJOSHADER_EFFECT_SUPPORT */
|
|
|
|
|
|
#endif /* MOJOSHADER_EFFECTS_H */
|
|
|
|