Skip to content
Snippets Groups Projects

vkd3d-shader/fx: Add support for parsing fx_2_0 parameters.

Merged Nikolay Sivov requested to merge nsivov/vkd3d:fx_2_text_2 into master
+ 577
71
@@ -25,6 +25,41 @@ static inline size_t put_u32_unaligned(struct vkd3d_bytecode_buffer *buffer, uin
return bytecode_put_bytes_unaligned(buffer, &value, sizeof(value));
}
enum state_property_component_type
{
FX_BOOL,
FX_FLOAT,
FX_UINT,
FX_UINT8,
FX_DEPTHSTENCIL,
FX_RASTERIZER,
FX_DOMAINSHADER,
FX_HULLSHADER,
FX_COMPUTESHADER,
FX_TEXTURE,
FX_DEPTHSTENCILVIEW,
FX_RENDERTARGETVIEW,
FX_BLEND,
FX_VERTEXSHADER,
FX_PIXELSHADER,
FX_GEOMETRYSHADER,
FX_COMPONENT_TYPE_COUNT,
};
struct rhs_named_value
{
const char *name;
unsigned int value;
};
struct fx_assignment
{
uint32_t id;
uint32_t lhs_index;
uint32_t type;
uint32_t value;
};
struct fx_4_binary_type
{
uint32_t name;
@@ -461,6 +496,407 @@ static void write_fx_2_annotations(struct hlsl_ir_var *var, uint32_t count_offse
set_u32(buffer, count_offset, count);
}
static const struct rhs_named_value fx_2_zenable_values[] =
{
{ "USEW", 2 },
{ NULL }
};
static const struct rhs_named_value fx_2_fillmode_values[] =
{
{ "POINT", 1 },
{ "WIREFRAME", 2 },
{ "SOLID", 3 },
{ NULL },
};
static const struct rhs_named_value fx_2_shademode_values[] =
{
{ "FLAT", 1 },
{ "GOURAUD", 2 },
{ "PHONG", 3 },
{ NULL }
};
static const struct rhs_named_value fx_2_blendmode_values[] =
{
{ "ZERO", 1 },
{ "ONE", 2 },
{ "SRCCOLOR", 3 },
{ "INVSRCCOLOR", 4 },
{ "SRCALPHA", 5 },
{ "INVSRCALPHA", 6 },
{ "DESTALPHA", 7 },
{ "INVDESTALPHA", 8 },
{ "DESTCOLOR", 9 },
{ "INVDESTCOLOR", 10 },
{ "SRCALPHASAT", 11 },
{ "BOTHSRCALPHA", 12 },
{ "BOTHINVSRCALPHA", 13 },
{ "BLENDFACTOR", 14 },
{ "INVBLENDFACTOR", 15 },
{ "SRCCOLOR2", 16 },
{ "INVSRCCOLOR2", 17 },
{ NULL }
};
static const struct rhs_named_value fx_2_cullmode_values[] =
{
{ "NONE", 1 },
{ "CW", 2 },
{ "CCW", 3 },
{ NULL }
};
static const struct rhs_named_value fx_2_cmpfunc_values[] =
{
{ "NEVER", 1 },
{ "LESS", 2 },
{ "EQUAL", 3 },
{ "LESSEQUAL", 4 },
{ "GREATER", 5 },
{ "NOTEQUAL", 6 },
{ "GREATEREQUAL", 7 },
{ "ALWAYS", 8 },
{ NULL }
};
static const struct rhs_named_value fx_2_fogmode_values[] =
{
{ "NONE", 0 },
{ "EXP", 1 },
{ "EXP2", 2 },
{ "LINEAR", 3 },
{ NULL }
};
static const struct rhs_named_value fx_2_stencilcaps_values[] =
{
{ "KEEP", 0x1 },
{ "ZERO", 0x2 },
{ "REPLACE", 0x4 },
{ "INCRSAT", 0x8 },
{ "DECRSAT", 0x10 },
{ "INVERT", 0x20 },
{ "INCR", 0x40 },
{ "DECR", 0x80 },
{ "TWOSIDED", 0x100 },
{ NULL }
};
static const struct rhs_named_value fx_2_wrap_values[] =
{
{ "COORD_0", 0x1 },
{ "COORD_1", 0x2 },
{ "COORD_2", 0x4 },
{ "COORD_3", 0x8 },
{ "U", 0x1 },
{ "V", 0x2 },
{ "W", 0x4 },
{ NULL }
};
static const struct rhs_named_value fx_2_materialcolorsource_values[] =
{
{ "MATERIAL", 0 },
{ "COORD1", 1 },
{ "COORD2", 2 },
{ NULL }
};
static const struct rhs_named_value fx_2_vertexblend_values[] =
{
{ "DISABLE", 0 },
{ "1WEIGHTS", 1 },
{ "2WEIGHTS", 2 },
{ "3WEIGHTS", 3 },
{ "TWEENING", 255 },
{ "0WEIGHTS", 256 },
{ NULL }
};
static const struct rhs_named_value fx_2_clipplane_values[] =
{
{ "CLIPPLANE0", 0x1 },
{ "CLIPPLANE1", 0x2 },
{ "CLIPPLANE2", 0x4 },
{ "CLIPPLANE3", 0x8 },
{ "CLIPPLANE4", 0x10 },
{ "CLIPPLANE5", 0x20 },
{ NULL }
};
static const struct rhs_named_value fx_2_patchedgestyle_values[] =
{
{ "DISCRETE", 0 },
{ "CONTINUOUS", 1 },
{ NULL }
};
static const struct rhs_named_value fx_2_colorwriteenable_values[] =
{
{ "RED", 0x1 },
{ "GREEN", 0x2 },
{ "BLUE", 0x4 },
{ "ALPHA", 0x8 },
{ NULL }
};
static const struct rhs_named_value fx_2_blendop_values[] =
{
{ "ADD", 1 },
{ "SUBTRACT", 2 },
{ "REVSUBTRACT", 3 },
{ "MIN", 4 },
{ "MAX", 5 },
{ NULL }
};
static const struct rhs_named_value fx_2_degree_values[] =
{
{ "LINEAR", 1 },
{ "QUADRATIC", 2 },
{ "CUBIC", 3 },
{ "QUINTIC", 4 },
{ NULL }
};
static const struct rhs_named_value fx_2_textureop_values[] =
{
{ "DISABLE", 1 },
{ "SELECTARG1", 2 },
{ "SELECTARG2", 3 },
{ "MODULATE", 4 },
{ "MODULATE2X", 5 },
{ "MODULATE4X", 6 },
{ "ADD", 7 },
{ "ADDSIGNED", 8 },
{ "ADDSIGNED2X", 9 },
{ "SUBTRACT", 10 },
{ "ADDSMOOTH", 11 },
{ "BLENDDIFFUSEALPHA", 12 },
{ "BLENDTEXTUREALPHA", 13 },
{ "BLENDFACTORALPHA", 14 },
{ "BLENDTEXTUREALPHAPM", 15 },
{ "BLENDCURRENTALPHA", 16 },
{ "PREMODULATE", 17 },
{ "MODULATEALPHA_ADDCOLOR", 18 },
{ "MODULATECOLOR_ADDALPHA", 19 },
{ "MODULATEINVALPHA_ADDCOLOR", 20 },
{ "MODULATEINVCOLOR_ADDALPHA", 21 },
{ "BUMPENVMAP", 22 },
{ "BUMPENVMAPLUMINANCE", 23 },
{ "DOTPRODUCT3", 24 },
{ "MULTIPLYADD", 25 },
{ "LERP", 26 },
{ NULL }
};
static const struct rhs_named_value fx_2_colorarg_values[] =
{
{ "DIFFUSE", 0x0 },
{ "CURRENT", 0x1 },
{ "TEXTURE", 0x2 },
{ "TFACTOR", 0x3 },
{ "SPECULAR", 0x4 },
{ "TEMP", 0x5 },
{ "CONSTANT", 0x6 },
{ "COMPLEMENT", 0x10 },
{ "ALPHAREPLICATE", 0x20 },
{ NULL }
};
static const struct rhs_named_value fx_2_texturetransform_values[] =
{
{ "DISABLE", 0 },
{ "COUNT1", 1 },
{ "COUNT2", 2 },
{ "COUNT3", 3 },
{ "COUNT4", 4 },
{ "PROJECTED", 256 },
{ NULL }
};
static const struct rhs_named_value fx_2_lighttype_values[] =
{
{ "POINT", 1 },
{ "SPOT", 2 },
{ "DIRECTIONAL", 3 },
{ NULL }
};
static const struct fx_2_state
{
const char *name;
enum hlsl_type_class class;
enum state_property_component_type type;
unsigned int dimx;
uint32_t array_size;
uint32_t id;
const struct rhs_named_value *values;
}
fx_2_states[] =
{
{ "ZEnable", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 0, fx_2_zenable_values },
{ "FillMode", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 1, fx_2_fillmode_values },
{ "ShadeMode", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 2, fx_2_shademode_values },
{ "ZWriteEnable", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 3 },
{ "AlphaTestEnable", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 4 },
{ "LastPixel", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 5 },
{ "SrcBlend", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 6, fx_2_blendmode_values },
{ "DestBlend", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 7, fx_2_blendmode_values },
{ "CullMode", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 8, fx_2_cullmode_values },
{ "ZFunc", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 9, fx_2_cmpfunc_values },
{ "AlphaRef", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 10 },
{ "AlphaFunc", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 11, fx_2_cmpfunc_values },
{ "DitherEnable", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 12 },
{ "AlphaBlendEnable", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 13 },
{ "FogEnable", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 14 },
{ "SpecularEnable", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 15 },
{ "FogColor", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 16 },
{ "FogTableMode", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 17, fx_2_fogmode_values },
{ "FogStart", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 18 },
{ "FogEnd", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 19 },
{ "FogDensity", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 20 },
{ "RangeFogEnable", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 21 },
{ "StencilEnable", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 22 },
{ "StencilFail", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 23, fx_2_stencilcaps_values },
{ "StencilZFail", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 24, fx_2_stencilcaps_values },
{ "StencilPass", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 25, fx_2_stencilcaps_values },
{ "StencilFunc", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 26, fx_2_cmpfunc_values },
{ "StencilRef", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 27 },
{ "StencilMask", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 28 },
{ "StencilWriteMask", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 29 },
{ "TextureFactor", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 30 },
{ "Wrap0", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 31, fx_2_wrap_values },
{ "Wrap1", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 32, fx_2_wrap_values },
{ "Wrap2", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 33, fx_2_wrap_values },
{ "Wrap3", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 34, fx_2_wrap_values },
{ "Wrap4", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 35, fx_2_wrap_values },
{ "Wrap5", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 36, fx_2_wrap_values },
{ "Wrap6", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 37, fx_2_wrap_values },
{ "Wrap7", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 38, fx_2_wrap_values },
{ "Wrap8", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 39, fx_2_wrap_values },
{ "Wrap9", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 40, fx_2_wrap_values },
{ "Wrap10", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 41, fx_2_wrap_values },
{ "Wrap11", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 42, fx_2_wrap_values },
{ "Wrap12", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 43, fx_2_wrap_values },
{ "Wrap13", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 44, fx_2_wrap_values },
{ "Wrap14", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 45, fx_2_wrap_values },
{ "Wrap15", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 46, fx_2_wrap_values },
{ "Clipping", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 47 },
{ "Lighting", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 48 },
{ "Ambient", HLSL_CLASS_VECTOR, FX_FLOAT, 4, 1, 49 },
{ "FogVertexMode", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 50, fx_2_fogmode_values },
{ "ColorVertex", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 51 },
{ "LocalViewer", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 52 },
{ "NormalizeNormals", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 53 },
{ "DiffuseMaterialSource", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 54, fx_2_materialcolorsource_values },
{ "SpecularMaterialSource", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 55, fx_2_materialcolorsource_values },
{ "AmbientMaterialSource", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 56, fx_2_materialcolorsource_values },
{ "EmissiveMaterialSource", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 57, fx_2_materialcolorsource_values },
{ "VertexBlend", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 58, fx_2_vertexblend_values },
{ "ClipPlaneEnable", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 59, fx_2_clipplane_values },
{ "PointSize", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 60 },
{ "PointSize_Min", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 61 },
{ "PointSize_Max", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 62 },
{ "PointSpriteEnable", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 63 },
{ "PointScaleEnable", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 64 },
{ "PointScale_A", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 65 },
{ "PointScale_B", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 66 },
{ "PointScale_C", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 67 },
{ "MultiSampleAntialias", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 68 },
{ "MultiSampleMask", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 69 },
{ "PatchEdgeStyle", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 70, fx_2_patchedgestyle_values },
{ "DebugMonitorToken", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 71 },
{ "IndexedVertexBlendEnable", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 72 },
{ "ColorWriteEnable", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 73, fx_2_colorwriteenable_values },
{ "TweenFactor", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 74 },
{ "BlendOp", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 75, fx_2_blendop_values },
{ "PositionDegree", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 76, fx_2_degree_values },
{ "NormalDegree", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 77, fx_2_degree_values },
{ "ScissorTestEnable", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 78 },
{ "SlopeScaleDepthBias", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 79 },
{ "AntialiasedLineEnable", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 80 },
{ "MinTessellationLevel", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 81 },
{ "MaxTessellationLevel", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 82 },
{ "AdaptiveTess_X", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 83 },
{ "AdaptiveTess_Y", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 84 },
{ "AdaptiveTess_Z", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 85 },
{ "AdaptiveTess_W", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 86 },
{ "EnableAdaptiveTesselation", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 87 },
{ "TwoSidedStencilMode", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 88 },
{ "StencilFail", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 89, fx_2_stencilcaps_values },
{ "StencilZFail", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 90, fx_2_stencilcaps_values },
{ "StencilPass", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 91, fx_2_stencilcaps_values },
{ "StencilFunc", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 92, fx_2_cmpfunc_values },
{ "ColorWriteEnable1", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 93, fx_2_colorwriteenable_values },
{ "ColorWriteEnable2", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 94, fx_2_colorwriteenable_values },
{ "ColorWriteEnable3", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 95, fx_2_colorwriteenable_values },
{ "BlendFactor", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 96 },
{ "SRGBWriteEnable", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 97 },
{ "DepthBias", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 98 },
{ "SeparateAlphaBlendEnable", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 99 },
{ "SrcBlendAlpha", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 100, fx_2_blendmode_values },
{ "DestBlendAlpha", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 101, fx_2_blendmode_values },
{ "BlendOpAlpha", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 102, fx_2_blendmode_values },
{ "ColorOp", HLSL_CLASS_SCALAR, FX_UINT, 1, 8, 103, fx_2_textureop_values },
{ "ColorArg0", HLSL_CLASS_SCALAR, FX_UINT, 1, 8, 104, fx_2_colorarg_values },
{ "ColorArg1", HLSL_CLASS_SCALAR, FX_UINT, 1, 8, 105, fx_2_colorarg_values },
{ "ColorArg2", HLSL_CLASS_SCALAR, FX_UINT, 1, 8, 106, fx_2_colorarg_values },
{ "AlphaOp", HLSL_CLASS_SCALAR, FX_UINT, 1, 8, 107, fx_2_textureop_values },
{ "AlphaArg0", HLSL_CLASS_SCALAR, FX_UINT, 1, 8, 108, fx_2_colorarg_values },
{ "AlphaArg1", HLSL_CLASS_SCALAR, FX_UINT, 1, 8, 109, fx_2_colorarg_values },
{ "AlphaArg2", HLSL_CLASS_SCALAR, FX_UINT, 1, 8, 110, fx_2_colorarg_values },
{ "ResultArg", HLSL_CLASS_SCALAR, FX_UINT, 1, 8, 111, fx_2_colorarg_values },
{ "BumpEnvMat00", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 8, 112 },
{ "BumpEnvMat01", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 8, 113 },
{ "BumpEnvMat10", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 8, 114 },
{ "BumpEnvMat11", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 8, 115 },
{ "TextCoordIndex", HLSL_CLASS_SCALAR, FX_UINT, 1, 8, 116 },
{ "BumpEnvLScale", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 8, 117 },
{ "BumpEnvLOffset", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 8, 118 },
{ "TextureTransformFlags", HLSL_CLASS_SCALAR, FX_UINT, 1, 8, 119, fx_2_texturetransform_values },
{ "Constant", HLSL_CLASS_SCALAR, FX_UINT, 1, 8, 120 },
{ "NPatchMode", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 121 },
{ "FVF", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 122 },
{ "ProjectionTransform", HLSL_CLASS_MATRIX, FX_FLOAT, 4, 1, 123 },
{ "ViewTransform", HLSL_CLASS_MATRIX, FX_FLOAT, 4, 1, 124 },
{ "WorldTransform", HLSL_CLASS_MATRIX, FX_FLOAT, 4, 1, 125 },
{ "TextureTransform", HLSL_CLASS_MATRIX, FX_FLOAT, 4, 8, 126 },
{ "MaterialAmbient", HLSL_CLASS_VECTOR, FX_FLOAT, 4, 1, 127 },
{ "MaterialDiffuse", HLSL_CLASS_VECTOR, FX_FLOAT, 4, 1, 128 },
{ "MaterialSpecular", HLSL_CLASS_VECTOR, FX_FLOAT, 4, 1, 129 },
{ "MaterialEmissive", HLSL_CLASS_VECTOR, FX_FLOAT, 4, 1, 130 },
{ "MaterialPower", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 131 },
{ "LightType", HLSL_CLASS_SCALAR, FX_UINT, 1, 1, 132, fx_2_lighttype_values },
{ "LightDiffuse", HLSL_CLASS_VECTOR, FX_FLOAT, 4, 1, 133 },
{ "LightSpecular", HLSL_CLASS_VECTOR, FX_FLOAT, 4, 1, 134 },
{ "LightAmbient", HLSL_CLASS_VECTOR, FX_FLOAT, 4, 1, 135 },
{ "LightPosition", HLSL_CLASS_VECTOR, FX_FLOAT, 3, 1, 136 },
{ "LightDirection", HLSL_CLASS_VECTOR, FX_FLOAT, 3, 1, 137 },
{ "LightRange", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 138 },
{ "LightFalloff", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 139 },
{ "LightAttenuation0", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 140 },
{ "LightAttenuation1", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 141 },
{ "LightAttenuation2", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 142 },
{ "LightTheta", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 143 },
{ "LightPhi", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 1, 144 },
{ "LightEnable", HLSL_CLASS_SCALAR, FX_FLOAT, 1, 8, 145 },
{ "VertexShader", HLSL_CLASS_SCALAR, FX_VERTEXSHADER, 1, 1, 146 },
{ "PixelShader", HLSL_CLASS_SCALAR, FX_PIXELSHADER, 1, 1, 147 },
};
static void write_fx_2_pass(struct hlsl_ir_var *var, struct fx_write_context *fx)
{
struct vkd3d_bytecode_buffer *buffer = &fx->structured;
@@ -1607,12 +2043,6 @@ static void write_fx_4_annotation(struct hlsl_ir_var *var, struct fx_write_conte
}
}
struct rhs_named_value
{
const char *name;
unsigned int value;
};
static bool get_fx_4_state_enum_value(const struct rhs_named_value *pairs,
const char *name, unsigned int *value)
{
@@ -1844,27 +2274,6 @@ static bool replace_state_block_constant(struct hlsl_ctx *ctx, struct hlsl_ir_no
return true;
}
enum state_property_component_type
{
FX_BOOL,
FX_FLOAT,
FX_UINT,
FX_UINT8,
FX_DEPTHSTENCIL,
FX_RASTERIZER,
FX_DOMAINSHADER,
FX_HULLSHADER,
FX_COMPUTESHADER,
FX_TEXTURE,
FX_DEPTHSTENCILVIEW,
FX_RENDERTARGETVIEW,
FX_BLEND,
FX_VERTEXSHADER,
FX_PIXELSHADER,
FX_GEOMETRYSHADER,
FX_COMPONENT_TYPE_COUNT,
};
static inline bool is_object_fx_type(enum state_property_component_type type)
{
switch (type)
@@ -3027,12 +3436,6 @@ static void parse_fx_print_indent(struct fx_parser *parser)
vkd3d_string_buffer_printf(&parser->buffer, "%*s", 4 * parser->indent, "");
}
static void fx_2_parse_parameters(struct fx_parser *parser, uint32_t count)
{
if (count)
fx_parser_error(parser, VKD3D_SHADER_ERROR_FX_NOT_IMPLEMENTED, "Parsing fx_2_0 parameters is not implemented.");
}
static const char *fx_2_get_string(struct fx_parser *parser, uint32_t offset)
{
const char *ptr;
@@ -3089,7 +3492,7 @@ static unsigned int fx_get_fx_2_type_size(struct fx_parser *parser, uint32_t *of
return size;
}
static unsigned int fx_parse_fx_2_type(struct fx_parser *parser, uint32_t offset)
static void fx_parse_fx_2_type(struct fx_parser *parser, uint32_t offset)
{
uint32_t type, class, rows, columns;
static const char *const types[] =
@@ -3138,8 +3541,6 @@ static unsigned int fx_parse_fx_2_type(struct fx_parser *parser, uint32_t offset
fx_parser_read_unstructured(parser, &columns, offset + 24, sizeof(columns));
vkd3d_string_buffer_printf(&parser->buffer, "%ux%u", rows, columns);
}
return fx_get_fx_2_type_size(parser, &offset);
}
static void parse_fx_2_numeric_value(struct fx_parser *parser, uint32_t offset,
@@ -3172,7 +3573,7 @@ static void parse_fx_2_numeric_value(struct fx_parser *parser, uint32_t offset,
vkd3d_string_buffer_printf(&parser->buffer, "}");
}
static void fx_parse_fx_2_annotations(struct fx_parser *parser, uint32_t count)
static void fx_parse_fx_2_parameter(struct fx_parser *parser, uint32_t offset)
{
struct fx_2_var
{
@@ -3182,10 +3583,57 @@ static void fx_parse_fx_2_annotations(struct fx_parser *parser, uint32_t count)
uint32_t semantic;
uint32_t element_count;
} var;
uint32_t param, value;
unsigned int size;
const char *name;
fx_parser_read_unstructured(parser, &var, offset, sizeof(var));
fx_parse_fx_2_type(parser, offset);
name = fx_2_get_string(parser, var.name);
vkd3d_string_buffer_printf(&parser->buffer, " %s", name);
if (var.element_count)
vkd3d_string_buffer_printf(&parser->buffer, "[%u]", var.element_count);
}
static void fx_parse_fx_2_initial_value(struct fx_parser *parser, uint32_t param, uint32_t value)
{
struct fx_2_var
{
uint32_t type;
uint32_t class;
uint32_t name;
uint32_t semantic;
uint32_t element_count;
} var;
unsigned int size;
uint32_t offset;
if (!value)
return;
fx_parser_read_unstructured(parser, &var, param, sizeof(var));
offset = param;
size = fx_get_fx_2_type_size(parser, &offset);
vkd3d_string_buffer_printf(&parser->buffer, " = ");
if (var.element_count)
vkd3d_string_buffer_printf(&parser->buffer, "{ ");
if (var.type == D3DXPT_STRING)
fx_parser_error(parser, VKD3D_SHADER_ERROR_FX_NOT_IMPLEMENTED,
"Only numeric initial values are supported.");
else
parse_fx_2_numeric_value(parser, value, size, var.type);
if (var.element_count)
vkd3d_string_buffer_printf(&parser->buffer, " }");
}
static void fx_parse_fx_2_annotations(struct fx_parser *parser, uint32_t count)
{
uint32_t param, value;
if (parser->failed || !count)
return;
@@ -3199,27 +3647,9 @@ static void fx_parse_fx_2_annotations(struct fx_parser *parser, uint32_t count)
param = fx_parser_read_u32(parser);
value = fx_parser_read_u32(parser);
fx_parser_read_unstructured(parser, &var, param, sizeof(var));
parse_fx_print_indent(parser);
size = fx_parse_fx_2_type(parser, param);
name = fx_2_get_string(parser, var.name);
vkd3d_string_buffer_printf(&parser->buffer, " %s", name);
if (var.element_count)
vkd3d_string_buffer_printf(&parser->buffer, "[%u]", var.element_count);
vkd3d_string_buffer_printf(&parser->buffer, " = ");
if (var.element_count)
vkd3d_string_buffer_printf(&parser->buffer, "{ ");
if (var.type == D3DXPT_STRING)
fx_parser_error(parser, VKD3D_SHADER_ERROR_FX_INVALID_DATA,
"Only numeric types are supported in annotations.");
else
parse_fx_2_numeric_value(parser, value, size, var.type);
if (var.element_count)
vkd3d_string_buffer_printf(&parser->buffer, " }");
fx_parse_fx_2_parameter(parser, param);
fx_parse_fx_2_initial_value(parser, param, value);
vkd3d_string_buffer_printf(&parser->buffer, ";\n");
}
@@ -3228,6 +3658,64 @@ static void fx_parse_fx_2_annotations(struct fx_parser *parser, uint32_t count)
vkd3d_string_buffer_printf(&parser->buffer, ">");
}
static void fx_parse_fx_2_assignment(struct fx_parser *parser)
{
const struct rhs_named_value *named_value = NULL;
const struct fx_2_state *state = NULL;
struct fx_assignment entry;
fx_parser_read_u32s(parser, &entry, sizeof(entry));
if (entry.id <= ARRAY_SIZE(fx_2_states))
{
state = &fx_2_states[entry.id];
vkd3d_string_buffer_printf(&parser->buffer, "%s", state->name);
if (state->array_size > 1)
vkd3d_string_buffer_printf(&parser->buffer, "[%u]", entry.lhs_index);
}
else
{
vkd3d_string_buffer_printf(&parser->buffer, "<unrecognized state %u>", entry.id);
}
vkd3d_string_buffer_printf(&parser->buffer, " = ");
if (state && state->type == FX_UINT)
{
const struct rhs_named_value *ptr = state->values;
uint32_t value;
fx_parser_read_unstructured(parser, &value, entry.value, sizeof(value));
while (ptr->name)
{
if (value == ptr->value)
{
named_value = ptr;
break;
}
++ptr;
}
}
if (named_value)
{
vkd3d_string_buffer_printf(&parser->buffer, "%s /* %u */", named_value->name, named_value->value);
}
else if (state && (state->type == FX_UINT || state->type == FX_FLOAT))
{
uint32_t offset = entry.type;
unsigned int size;
size = fx_get_fx_2_type_size(parser, &offset);
parse_fx_2_numeric_value(parser, entry.value, size, entry.type);
}
else
{
vkd3d_string_buffer_printf(&parser->buffer, "<ignored>");
}
vkd3d_string_buffer_printf(&parser->buffer, ";\n");
}
static void fx_parse_fx_2_technique(struct fx_parser *parser)
{
struct fx_technique
@@ -3243,7 +3731,6 @@ static void fx_parse_fx_2_technique(struct fx_parser *parser)
uint32_t assignment_count;
} pass;
const char *name;
uint32_t i;
if (parser->failed)
return;
@@ -3261,7 +3748,7 @@ static void fx_parse_fx_2_technique(struct fx_parser *parser)
vkd3d_string_buffer_printf(&parser->buffer, "{\n");
parse_fx_start_indent(parser);
for (i = 0; i < technique.pass_count; ++i)
for (uint32_t i = 0; i < technique.pass_count; ++i)
{
fx_parser_read_u32s(parser, &pass, sizeof(pass));
name = fx_2_get_string(parser, pass.name);
@@ -3275,9 +3762,11 @@ static void fx_parse_fx_2_technique(struct fx_parser *parser)
vkd3d_string_buffer_printf(&parser->buffer, "{\n");
parse_fx_start_indent(parser);
if (pass.assignment_count)
fx_parser_error(parser, VKD3D_SHADER_ERROR_FX_NOT_IMPLEMENTED,
"Parsing fx_2_0 pass assignments is not implemented.");
for (uint32_t j = 0; j < pass.assignment_count; ++j)
{
parse_fx_print_indent(parser);
fx_parse_fx_2_assignment(parser);
}
parse_fx_end_indent(parser);
parse_fx_print_indent(parser);
@@ -3290,6 +3779,29 @@ static void fx_parse_fx_2_technique(struct fx_parser *parser)
vkd3d_string_buffer_printf(&parser->buffer, "}\n\n");
}
static void fx_2_parse_parameters(struct fx_parser *parser, uint32_t count)
{
struct fx_2_parameter
{
uint32_t type;
uint32_t value;
uint32_t flags;
uint32_t annotation_count;
} param;
for (uint32_t i = 0; i < count; ++i)
{
fx_parser_read_u32s(parser, &param, sizeof(param));
fx_parse_fx_2_parameter(parser, param.type);
fx_parse_fx_2_annotations(parser, param.annotation_count);
fx_parse_fx_2_initial_value(parser, param.type, param.value);
vkd3d_string_buffer_printf(&parser->buffer, ";\n");
}
if (count)
vkd3d_string_buffer_printf(&parser->buffer, "\n");
}
static void fx_2_parse(struct fx_parser *parser)
{
uint32_t i, size, parameter_count, technique_count;
@@ -3964,13 +4476,7 @@ static void fx_4_parse_fxlvm_expression(struct fx_parser *parser, uint32_t offse
static void fx_4_parse_state_object_initializer(struct fx_parser *parser, uint32_t count,
enum hlsl_type_class type_class)
{
struct fx_4_assignment
{
uint32_t id;
uint32_t lhs_index;
uint32_t type;
uint32_t value;
} entry;
struct fx_assignment entry;
struct
{
uint32_t name;
Loading