You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Code/Tools/HLSLCrossCompiler/include/hlslcc.h

581 lines
18 KiB
C

// Modifications copyright Amazon.com, Inc. or its affiliates
// Modifications copyright Crytek GmbH
#ifndef HLSLCC_H_
#define HLSLCC_H_
#if defined (_WIN32) && defined(HLSLCC_DYNLIB)
#define HLSLCC_APIENTRY __stdcall
#if defined(libHLSLcc_EXPORTS)
#define HLSLCC_API __declspec(dllexport)
#else
#define HLSLCC_API __declspec(dllimport)
#endif
#else
#define HLSLCC_APIENTRY
#define HLSLCC_API
#endif
#include <stdint.h>
#include <stddef.h>
typedef enum
{
LANG_DEFAULT,// Depends on the HLSL shader model.
LANG_ES_100,
LANG_ES_300,
LANG_ES_310,
LANG_120,
LANG_130,
LANG_140,
LANG_150,
LANG_330,
LANG_400,
LANG_410,
LANG_420,
LANG_430,
LANG_440,
} GLLang;
typedef struct {
uint32_t ARB_explicit_attrib_location : 1;
uint32_t ARB_explicit_uniform_location : 1;
uint32_t ARB_shading_language_420pack : 1;
}GlExtensions;
enum {MAX_SHADER_VEC4_OUTPUT = 512};
enum {MAX_SHADER_VEC4_INPUT = 512};
enum {MAX_TEXTURES = 128};
enum {MAX_FORK_PHASES = 2};
enum {MAX_FUNCTION_BODIES = 1024};
enum {MAX_CLASS_TYPES = 1024};
enum {MAX_FUNCTION_POINTERS = 128};
//Reflection
#define MAX_REFLECT_STRING_LENGTH 512
#define MAX_SHADER_VARS 256
#define MAX_CBUFFERS 256
#define MAX_UAV 256
#define MAX_FUNCTION_TABLES 256
#define MAX_RESOURCE_BINDINGS 256
//Operands flags
#define TO_FLAG_NONE 0x0
#define TO_FLAG_INTEGER 0x1
#define TO_FLAG_NAME_ONLY 0x2
#define TO_FLAG_DECLARATION_NAME 0x4
#define TO_FLAG_DESTINATION 0x8 //Operand is being written to by assignment.
#define TO_FLAG_UNSIGNED_INTEGER 0x10
#define TO_FLAG_DOUBLE 0x20
#define TO_FLAG_FLOAT 0x40
#define TO_FLAG_COPY 0x80
typedef enum SPECIAL_NAME
{
NAME_UNDEFINED = 0,
NAME_POSITION = 1,
NAME_CLIP_DISTANCE = 2,
NAME_CULL_DISTANCE = 3,
NAME_RENDER_TARGET_ARRAY_INDEX = 4,
NAME_VIEWPORT_ARRAY_INDEX = 5,
NAME_VERTEX_ID = 6,
NAME_PRIMITIVE_ID = 7,
NAME_INSTANCE_ID = 8,
NAME_IS_FRONT_FACE = 9,
NAME_SAMPLE_INDEX = 10,
// The following are added for D3D11
NAME_FINAL_QUAD_U_EQ_0_EDGE_TESSFACTOR = 11,
NAME_FINAL_QUAD_V_EQ_0_EDGE_TESSFACTOR = 12,
NAME_FINAL_QUAD_U_EQ_1_EDGE_TESSFACTOR = 13,
NAME_FINAL_QUAD_V_EQ_1_EDGE_TESSFACTOR = 14,
NAME_FINAL_QUAD_U_INSIDE_TESSFACTOR = 15,
NAME_FINAL_QUAD_V_INSIDE_TESSFACTOR = 16,
NAME_FINAL_TRI_U_EQ_0_EDGE_TESSFACTOR = 17,
NAME_FINAL_TRI_V_EQ_0_EDGE_TESSFACTOR = 18,
NAME_FINAL_TRI_W_EQ_0_EDGE_TESSFACTOR = 19,
NAME_FINAL_TRI_INSIDE_TESSFACTOR = 20,
NAME_FINAL_LINE_DETAIL_TESSFACTOR = 21,
NAME_FINAL_LINE_DENSITY_TESSFACTOR = 22,
} SPECIAL_NAME;
typedef enum {
INOUT_COMPONENT_UNKNOWN = 0,
INOUT_COMPONENT_UINT32 = 1,
INOUT_COMPONENT_SINT32 = 2,
INOUT_COMPONENT_FLOAT32 = 3
} INOUT_COMPONENT_TYPE;
typedef enum MIN_PRECISION {
MIN_PRECISION_DEFAULT = 0,
MIN_PRECISION_FLOAT_16 = 1,
MIN_PRECISION_FLOAT_2_8 = 2,
MIN_PRECISION_RESERVED = 3,
MIN_PRECISION_SINT_16 = 4,
MIN_PRECISION_UINT_16 = 5,
MIN_PRECISION_ANY_16 = 0xf0,
MIN_PRECISION_ANY_10 = 0xf1
} MIN_PRECISION;
typedef struct InOutSignature_TAG
{
char SemanticName[MAX_REFLECT_STRING_LENGTH];
uint32_t ui32SemanticIndex;
SPECIAL_NAME eSystemValueType;
INOUT_COMPONENT_TYPE eComponentType;
uint32_t ui32Register;
uint32_t ui32Mask;
uint32_t ui32ReadWriteMask;
uint32_t ui32Stream;
MIN_PRECISION eMinPrec;
} InOutSignature;
typedef enum ResourceType_TAG
{
RTYPE_CBUFFER,//0
RTYPE_TBUFFER,//1
RTYPE_TEXTURE,//2
RTYPE_SAMPLER,//3
RTYPE_UAV_RWTYPED,//4
RTYPE_STRUCTURED,//5
RTYPE_UAV_RWSTRUCTURED,//6
RTYPE_BYTEADDRESS,//7
RTYPE_UAV_RWBYTEADDRESS,//8
RTYPE_UAV_APPEND_STRUCTURED,//9
RTYPE_UAV_CONSUME_STRUCTURED,//10
RTYPE_UAV_RWSTRUCTURED_WITH_COUNTER,//11
RTYPE_COUNT,
} ResourceType;
typedef enum ResourceGroup_TAG {
RGROUP_CBUFFER,
RGROUP_TEXTURE,
RGROUP_SAMPLER,
RGROUP_UAV,
RGROUP_COUNT,
} ResourceGroup;
typedef enum REFLECT_RESOURCE_DIMENSION
{
REFLECT_RESOURCE_DIMENSION_UNKNOWN = 0,
REFLECT_RESOURCE_DIMENSION_BUFFER = 1,
REFLECT_RESOURCE_DIMENSION_TEXTURE1D = 2,
REFLECT_RESOURCE_DIMENSION_TEXTURE1DARRAY = 3,
REFLECT_RESOURCE_DIMENSION_TEXTURE2D = 4,
REFLECT_RESOURCE_DIMENSION_TEXTURE2DARRAY = 5,
REFLECT_RESOURCE_DIMENSION_TEXTURE2DMS = 6,
REFLECT_RESOURCE_DIMENSION_TEXTURE2DMSARRAY = 7,
REFLECT_RESOURCE_DIMENSION_TEXTURE3D = 8,
REFLECT_RESOURCE_DIMENSION_TEXTURECUBE = 9,
REFLECT_RESOURCE_DIMENSION_TEXTURECUBEARRAY = 10,
REFLECT_RESOURCE_DIMENSION_BUFFEREX = 11,
} REFLECT_RESOURCE_DIMENSION;
typedef struct ResourceBinding_TAG
{
char Name[MAX_REFLECT_STRING_LENGTH];
ResourceType eType;
uint32_t ui32BindPoint;
uint32_t ui32BindCount;
uint32_t ui32Flags;
REFLECT_RESOURCE_DIMENSION eDimension;
uint32_t ui32ReturnType;
uint32_t ui32NumSamples;
} ResourceBinding;
// Do not change the value of these enums or they will not match what we find in the DXBC file
typedef enum _SHADER_VARIABLE_TYPE {
SVT_VOID = 0,
SVT_BOOL = 1,
SVT_INT = 2,
SVT_FLOAT = 3,
SVT_STRING = 4,
SVT_TEXTURE = 5,
SVT_TEXTURE1D = 6,
SVT_TEXTURE2D = 7,
SVT_TEXTURE3D = 8,
SVT_TEXTURECUBE = 9,
SVT_SAMPLER = 10,
SVT_PIXELSHADER = 15,
SVT_VERTEXSHADER = 16,
SVT_UINT = 19,
SVT_UINT8 = 20,
SVT_GEOMETRYSHADER = 21,
SVT_RASTERIZER = 22,
SVT_DEPTHSTENCIL = 23,
SVT_BLEND = 24,
SVT_BUFFER = 25,
SVT_CBUFFER = 26,
SVT_TBUFFER = 27,
SVT_TEXTURE1DARRAY = 28,
SVT_TEXTURE2DARRAY = 29,
SVT_RENDERTARGETVIEW = 30,
SVT_DEPTHSTENCILVIEW = 31,
SVT_TEXTURE2DMS = 32,
SVT_TEXTURE2DMSARRAY = 33,
SVT_TEXTURECUBEARRAY = 34,
SVT_HULLSHADER = 35,
SVT_DOMAINSHADER = 36,
SVT_INTERFACE_POINTER = 37,
SVT_COMPUTESHADER = 38,
SVT_DOUBLE = 39,
SVT_RWTEXTURE1D = 40,
SVT_RWTEXTURE1DARRAY = 41,
SVT_RWTEXTURE2D = 42,
SVT_RWTEXTURE2DARRAY = 43,
SVT_RWTEXTURE3D = 44,
SVT_RWBUFFER = 45,
SVT_BYTEADDRESS_BUFFER = 46,
SVT_RWBYTEADDRESS_BUFFER = 47,
SVT_STRUCTURED_BUFFER = 48,
SVT_RWSTRUCTURED_BUFFER = 49,
SVT_APPEND_STRUCTURED_BUFFER = 50,
SVT_CONSUME_STRUCTURED_BUFFER = 51,
// Partial precision types
SVT_FLOAT10 = 53,
SVT_FLOAT16 = 54,
SVT_INT16 = 156,
SVT_INT12 = 157,
SVT_UINT16 = 158,
SVT_FORCE_DWORD = 0x7fffffff
} SHADER_VARIABLE_TYPE;
typedef enum _SHADER_VARIABLE_CLASS {
SVC_SCALAR = 0,
SVC_VECTOR = ( SVC_SCALAR + 1 ),
SVC_MATRIX_ROWS = ( SVC_VECTOR + 1 ),
SVC_MATRIX_COLUMNS = ( SVC_MATRIX_ROWS + 1 ),
SVC_OBJECT = ( SVC_MATRIX_COLUMNS + 1 ),
SVC_STRUCT = ( SVC_OBJECT + 1 ),
SVC_INTERFACE_CLASS = ( SVC_STRUCT + 1 ),
SVC_INTERFACE_POINTER = ( SVC_INTERFACE_CLASS + 1 ),
SVC_FORCE_DWORD = 0x7fffffff
} SHADER_VARIABLE_CLASS;
typedef struct ShaderVarType_TAG {
SHADER_VARIABLE_CLASS Class;
SHADER_VARIABLE_TYPE Type;
uint32_t Rows;
uint32_t Columns;
uint32_t Elements;
uint32_t MemberCount;
uint32_t Offset;
char Name[MAX_REFLECT_STRING_LENGTH];
uint32_t ParentCount;
struct ShaderVarType_TAG * Parent;
struct ShaderVarType_TAG * Members;
} ShaderVarType;
typedef struct ShaderVar_TAG
{
char Name[MAX_REFLECT_STRING_LENGTH];
int haveDefaultValue;
uint32_t* pui32DefaultValues;
//Offset/Size in bytes.
uint32_t ui32StartOffset;
uint32_t ui32Size;
uint32_t ui32Flags;
ShaderVarType sType;
} ShaderVar;
typedef struct ConstantBuffer_TAG
{
char Name[MAX_REFLECT_STRING_LENGTH];
uint32_t ui32NumVars;
ShaderVar asVars[MAX_SHADER_VARS];
uint32_t ui32TotalSizeInBytes;
int blob;
} ConstantBuffer;
typedef struct ClassType_TAG
{
char Name[MAX_REFLECT_STRING_LENGTH];
uint16_t ui16ID;
uint16_t ui16ConstBufStride;
uint16_t ui16Texture;
uint16_t ui16Sampler;
} ClassType;
typedef struct ClassInstance_TAG
{
char Name[MAX_REFLECT_STRING_LENGTH];
uint16_t ui16ID;
uint16_t ui16ConstBuf;
uint16_t ui16ConstBufOffset;
uint16_t ui16Texture;
uint16_t ui16Sampler;
} ClassInstance;
typedef enum TESSELLATOR_PARTITIONING
{
TESSELLATOR_PARTITIONING_UNDEFINED = 0,
TESSELLATOR_PARTITIONING_INTEGER = 1,
TESSELLATOR_PARTITIONING_POW2 = 2,
TESSELLATOR_PARTITIONING_FRACTIONAL_ODD = 3,
TESSELLATOR_PARTITIONING_FRACTIONAL_EVEN = 4
} TESSELLATOR_PARTITIONING;
typedef enum TESSELLATOR_OUTPUT_PRIMITIVE
{
TESSELLATOR_OUTPUT_UNDEFINED = 0,
TESSELLATOR_OUTPUT_POINT = 1,
TESSELLATOR_OUTPUT_LINE = 2,
TESSELLATOR_OUTPUT_TRIANGLE_CW = 3,
TESSELLATOR_OUTPUT_TRIANGLE_CCW = 4
} TESSELLATOR_OUTPUT_PRIMITIVE;
typedef enum INTERPOLATION_MODE
{
INTERPOLATION_UNDEFINED = 0,
INTERPOLATION_CONSTANT = 1,
INTERPOLATION_LINEAR = 2,
INTERPOLATION_LINEAR_CENTROID = 3,
INTERPOLATION_LINEAR_NOPERSPECTIVE = 4,
INTERPOLATION_LINEAR_NOPERSPECTIVE_CENTROID = 5,
INTERPOLATION_LINEAR_SAMPLE = 6,
INTERPOLATION_LINEAR_NOPERSPECTIVE_SAMPLE = 7,
} INTERPOLATION_MODE;
typedef enum TRACE_VARIABLE_GROUP
{
TRACE_VARIABLE_INPUT = 0,
TRACE_VARIABLE_TEMP = 1,
TRACE_VARIABLE_OUTPUT = 2
} TRACE_VARIABLE_GROUP;
typedef enum TRACE_VARIABLE_TYPE
{
TRACE_VARIABLE_FLOAT = 0,
TRACE_VARIABLE_SINT = 1,
TRACE_VARIABLE_UINT = 2,
TRACE_VARIABLE_DOUBLE = 3,
TRACE_VARIABLE_UNKNOWN = 4
} TRACE_VARIABLE_TYPE;
typedef struct VariableTraceInfo_TAG
{
TRACE_VARIABLE_GROUP eGroup;
TRACE_VARIABLE_TYPE eType;
uint8_t ui8Index;
uint8_t ui8Component;
} VariableTraceInfo;
typedef struct StepTraceInfo_TAG
{
uint32_t ui32NumVariables;
VariableTraceInfo* psVariables;
} StepTraceInfo;
typedef enum SYMBOL_TYPE
{
SYMBOL_TESSELLATOR_PARTITIONING = 0,
SYMBOL_TESSELLATOR_OUTPUT_PRIMITIVE = 1,
SYMBOL_INPUT_INTERPOLATION_MODE = 2,
SYMBOL_EMULATE_DEPTH_CLAMP = 3
} SYMBOL_TYPE;
typedef struct Symbol_TAG
{
SYMBOL_TYPE eType;
uint32_t ui32ID;
uint32_t ui32Value;
} Symbol;
typedef struct EmbeddedResourceName_TAG
{
uint32_t ui20Offset : 20;
uint32_t ui12Size : 12;
} EmbeddedResourceName;
typedef struct SamplerMask_TAG
{
uint32_t ui10TextureBindPoint : 10;
uint32_t ui10SamplerBindPoint : 10;
uint32_t ui10TextureUnit : 10;
uint32_t bNormalSample : 1;
uint32_t bCompareSample : 1;
} SamplerMask;
typedef struct Sampler_TAG
{
SamplerMask sMask;
EmbeddedResourceName sNormalName;
EmbeddedResourceName sCompareName;
} Sampler;
typedef struct Resource_TAG
{
uint32_t ui32BindPoint;
ResourceGroup eGroup;
EmbeddedResourceName sName;
} Resource;
typedef struct ShaderInfo_TAG
{
uint32_t ui32MajorVersion;
uint32_t ui32MinorVersion;
uint32_t ui32NumInputSignatures;
InOutSignature* psInputSignatures;
uint32_t ui32NumOutputSignatures;
InOutSignature* psOutputSignatures;
uint32_t ui32NumResourceBindings;
ResourceBinding* psResourceBindings;
uint32_t ui32NumConstantBuffers;
ConstantBuffer* psConstantBuffers;
ConstantBuffer* psThisPointerConstBuffer;
uint32_t ui32NumClassTypes;
ClassType* psClassTypes;
uint32_t ui32NumClassInstances;
ClassInstance* psClassInstances;
//Func table ID to class name ID.
uint32_t aui32TableIDToTypeID[MAX_FUNCTION_TABLES];
uint32_t aui32ResourceMap[RGROUP_COUNT][MAX_RESOURCE_BINDINGS];
// GLSL resources
Sampler asSamplers[MAX_RESOURCE_BINDINGS];
Resource asImages[MAX_RESOURCE_BINDINGS];
Resource asUniformBuffers[MAX_RESOURCE_BINDINGS];
Resource asStorageBuffers[MAX_RESOURCE_BINDINGS];
uint32_t ui32NumSamplers;
uint32_t ui32NumImages;
uint32_t ui32NumUniformBuffers;
uint32_t ui32NumStorageBuffers;
// Trace info if tracing is enabled
uint32_t ui32NumTraceSteps;
StepTraceInfo* psTraceSteps;
// Symbols imported
uint32_t ui32NumImports;
Symbol* psImports;
// Symbols exported
uint32_t ui32NumExports;
Symbol* psExports;
// Hash of the input shader for debugging purposes
uint32_t ui32InputHash;
// Offset in the GLSL string where symbol definitions can be inserted
uint32_t ui32SymbolsOffset;
TESSELLATOR_PARTITIONING eTessPartitioning;
TESSELLATOR_OUTPUT_PRIMITIVE eTessOutPrim;
//Required if PixelInterpDependency is true
INTERPOLATION_MODE aePixelInputInterpolation[MAX_SHADER_VEC4_INPUT];
} ShaderInfo;
typedef struct
{
int shaderType; //One of the GL enums.
char* sourceCode;
ShaderInfo reflection;
GLLang GLSLLanguage;
} GLSLShader;
typedef enum _FRAMEBUFFER_FETCH_TYPE
{
FBF_NONE = 0,
FBF_EXT_COLOR = 1 << 0,
FBF_ARM_COLOR = 1 << 1,
FBF_ARM_DEPTH = 1 << 2,
FBF_ARM_STENCIL = 1 << 3,
FBF_ANY = FBF_EXT_COLOR | FBF_ARM_COLOR | FBF_ARM_DEPTH | FBF_ARM_STENCIL
} FRAMEBUFFER_FETCH_TYPE;
// NOTE: HLSLCC flags are specified by command line when executing this cross compiler.
// If these flags change, the command line switch '-flags=XXX' must change as well.
// Open 3D Engine composes the command line in file 'dev\Code\CryEngine\RenderDll\Common\Shaders\RemoteCompiler.cpp'
/*HLSL constant buffers are treated as default-block unform arrays by default. This is done
to support versions of GLSL which lack ARB_uniform_buffer_object functionality.
Setting this flag causes each one to have its own uniform block.
Note: Currently the nth const buffer will be named UnformBufferN. This is likey to change to the original HLSL name in the future.*/
static const unsigned int HLSLCC_FLAG_UNIFORM_BUFFER_OBJECT = 0x1;
static const unsigned int HLSLCC_FLAG_ORIGIN_UPPER_LEFT = 0x2;
static const unsigned int HLSLCC_FLAG_PIXEL_CENTER_INTEGER = 0x4;
static const unsigned int HLSLCC_FLAG_GLOBAL_CONSTS_NEVER_IN_UBO = 0x8;
//GS enabled?
//Affects vertex shader (i.e. need to compile vertex shader again to use with/without GS).
//This flag is needed in order for the interfaces between stages to match when GS is in use.
//PS inputs VtxGeoOutput
//GS outputs VtxGeoOutput
//Vs outputs VtxOutput if GS enabled. VtxGeoOutput otherwise.
static const unsigned int HLSLCC_FLAG_GS_ENABLED = 0x10;
static const unsigned int HLSLCC_FLAG_TESS_ENABLED = 0x20;
//Either use this flag or glBindFragDataLocationIndexed.
//When set the first pixel shader output is the first input to blend
//equation, the others go to the second input.
static const unsigned int HLSLCC_FLAG_DUAL_SOURCE_BLENDING = 0x40;
//If set, shader inputs and outputs are declared with their semantic name.
static const unsigned int HLSLCC_FLAG_INOUT_SEMANTIC_NAMES = 0x80;
static const unsigned int HLSLCC_FLAG_INVERT_CLIP_SPACE_Y = 0x100;
static const unsigned int HLSLCC_FLAG_CONVERT_CLIP_SPACE_Z = 0x200;
static const unsigned int HLSLCC_FLAG_AVOID_RESOURCE_BINDINGS_AND_LOCATIONS = 0x400;
static const unsigned int HLSLCC_FLAG_AVOID_TEMP_REGISTER_ALIASING = 0x800;
static const unsigned int HLSLCC_FLAG_TRACING_INSTRUMENTATION = 0x1000;
static const unsigned int HLSLCC_FLAG_HASH_INPUT = 0x2000;
static const unsigned int HLSLCC_FLAG_ADD_DEBUG_HEADER = 0x4000;
static const unsigned int HLSLCC_FLAG_NO_VERSION_STRING = 0x8000;
static const unsigned int HLSLCC_FLAG_AVOID_SHADER_LOAD_STORE_EXTENSION = 0x10000;
// If set, HLSLcc will generate GLSL code which contains syntactic workarounds for
// driver bugs found in Qualcomm devices running OpenGL ES 3.0
static const unsigned int HLSLCC_FLAG_QUALCOMM_GLES30_DRIVER_WORKAROUND = 0x20000;
// If set, HLSL DX9 lower precision qualifiers (e.g half) will be transformed to DX11 style (e.g min16float)
// before compiling. Necessary to preserve precision information. If not, FXC just silently transform
// everything to full precision (e.g float32).
static const unsigned int HLSLCC_FLAG_HALF_FLOAT_TRANSFORM = 0x40000;
#ifdef __cplusplus
extern "C" {
#endif
HLSLCC_API void HLSLCC_APIENTRY HLSLcc_SetMemoryFunctions(void* (*malloc_override)(size_t),
void* (*calloc_override)(size_t,size_t),
void (*free_override)(void *),
void* (*realloc_override)(void*,size_t));
HLSLCC_API int HLSLCC_APIENTRY TranslateHLSLFromFile(const char* filename, unsigned int flags, GLLang language, const GlExtensions *extensions, GLSLShader* result);
HLSLCC_API int HLSLCC_APIENTRY TranslateHLSLFromMem(const char* shader, size_t size, unsigned int flags, GLLang language, const GlExtensions *extensions, GLSLShader* result);
HLSLCC_API const char* HLSLCC_APIENTRY GetVersionString(GLLang language);
HLSLCC_API void HLSLCC_APIENTRY FreeGLSLShader(GLSLShader*);
#ifdef __cplusplus
}
#endif
#endif