The HLSL appendix lists the reserved keywords, preprocessor directives, and the grammar for the language.
Keywords are predefined reserved identifiers that have special meanings. They cannot be used as identifiers in your program.
asm1 | asm_fragment | bool | column_major | compile |
compile_fragment | const | discard | decl1 | do |
double | else | extern | false | float |
for | half | if | in | inline |
inout | int | matrix | out | pass1 |
pixelfragment | return | register | row_major | sampler |
sampler1D | sampler2D | sampler3D | samplerCUBE | sampler_state |
shared | stateblock | stateblock_state | static | string |
struct | technique1 | texture | texture1D | texture2D |
texture3D | textureCUBE | true | typedef | uniform |
vector | vertexfragment | void | volatile | while |
The following keywords are unused, but are reserved.
auto | break | case | catch |
char | class | const_cast | continue |
default | delete | dynamic_cast | enum |
explicit | friend | goto | long |
mutable | namespace | new | operator |
private | protected | public | reinterpret_cast |
short | signed | sizeof | static_cast |
switch | template | this | throw |
try | typename | union | unsigned |
using | virtual |
The following preprocessor operator is recognized:
defined |
Refer to the preprocessor operator reference in the C++ Preprocessor Operator documentation for a full description.
The preprocessor recognizes the following directives. These are all implemented to be compatible with the Microsoft Visual C++ preprocessor, except as noted below. Please refer to the preprocessor reference in the C++ Language Reference documentation for a full description of these directives.
#define | #elif | #else | #endif |
#error | #if | #ifdef | #ifndef |
#include | #line | #pragma | #undef |
The #include directive is valid only when compiling from a file or when the ID3DXInclude handler is used, and supports both of the following syntax alternatives:
When the include handler is not used, the local path is assumed.
Three pragma operators are supported:
pack_matrix | warning | def |
The pack_matrix pragma specifies how matrices are packed by the compiler:
#pragma pack_matrix (row_major) #pragma pack_matrix (column_major)
The #pragma warning directive allows modification of the behavior of compiler warning messages. The warning pragma supports the following specifiers:
For example:
#pragma warning( disable : 4507 34 ) // Disable warning messages // 4507 and 34. #pragma warning( once : 4385 ) // Issue warning 4385 // only once. #pragma warning( error : 164 ) // Report warning 164 // as an error.
The def pragma conveys literal hints to the compiler. For example, the following pragma indicates to the compiler that c10 contains literal values (1, 2, 3, 4) when compiling to the vs_2_0 profile. As it's an optimization hint, using it or not is up to the compiler.
#pragma def(vs_2_0, c10, 1, 2, 3, 4)
The following are the shader profiles for the def pragma:
vs | vs_1_1 | vs_2_0 | vs_2_a | |||
ps | ps_1_1 | ps_1_2 | ps_1_3 | ps_1_4 | ps_2_0 | ps_2_a |
Note that the def pragma only supports float constant register (c#).
The following tokens are automatically defined:
#define D3DX #define D3DX_VERSION 0x0901 #define DIRECT3D #define DIRECT3D_VERSION 0x0900 #define __FILE__ #define __LINE__
For more information, see C++ Language - pragma.
Lexical conventions for the language are as follows.
The following characters are recognized as white space.
SPACE |
TAB |
EOL |
C style comments (/* */) |
C++ style comments (//) |
Assembly style comments in asm blocks (;) |
Floating point numbers are represented in HLSL as follows:
digit-sequence exponent-part floating-suffix(opt)
digit-sequence(opt) . digit-sequence
digit-sequence .
e sign(opt) digit-sequence
E sign(opt) digit-sequence
+ -
digit
digit-sequence digit
h H f F
Integer numbers are represented in HLSL as follows:
# (decimal number)
0# (octal number)
0x# (hex number)
u U l L
Characters are represented in HLSL as follows:
'c' | (character) |
'\a' '\b' '\f' '\b' '\r' '\t' '\v' | (escapes) |
'\###' | (octal escape, each # is an octal digit) |
'\x#' | (hex escape, # is hex number, any number of digits) |
'\c' | (c is other character, including backslash and quotation marks) |
Escapes are not supported in preprocessor expressions.
Strings are represented in HLSL as follows:
"s" (s is any string with escapes).
Identifiers are represented in HLSL as follows:
[A-Za-z_][A-Za-z0-9_]*
##, #@, ++, --, &, &, &, ||, ==, ::, <<, <<=, >>, >>=, ..., <=, >=, !=, *=, /=, +=, -=, %=, &=, |=, ^=, ->
Also any other single character that did not match another rule.
The following is a listing of the language constructs, from which the HLSL statements are constructed.
Program : Program : Decls Decls : Decl Decls : Decls Decl Decl : ';' Decl : TypeDecl Decl : VariableDecl Decl : VarStructDecl Decl : FunctionDecl Decl : TechniqueDecl Usages : Usage Usages : Usages Usage Usage : T_KW_STATIC Usage : T_KW_UNIFORM Usage : T_KW_EXTERN Usage : T_KW_VOLATILE Usage : T_KW_INLINE Usage : T_KW_SHARED Usage : ConstUsage Usage : Target ConstUsages : ConstUsage ConstUsages : ConstUsages ConstUsage ConstUsage : T_KW_CONST ConstUsage : T_KW_ROW_MAJOR ConstUsage : T_KW_COLUMN_MAJOR UsageType : Type UsageType : Usages Type UsageStructDecl : StructDecl UsageStructDecl : Usages StructDecl TypeDecl : T_KW_TYPEDEF ConstType TypeDefs ';' TypeDecl : T_KW_TYPEDEF ConstStructDecl TypeDefs ';' TypeDecl : StructDecl ';' TypeDefs : VariableDim TypeDefs : VariableDim ',' TypeDefs Type : BaseType Type : Struct Type : TypeId Type : T_KW_STRUCT TypeId ConstType : Type ConstType : ConstUsages Type ConstTypeDim : ConstType ConstTypeDim : ConstTypeDim '[' ConstantExpr ']' BaseType : T_KW_VOID BaseType : ScalarType BaseType : VectorType BaseType : MatrixType BaseType : ObjectType ScalarType : T_KW_BOOL ScalarType : T_KW_INT ScalarType : T_KW_HALF ScalarType : T_KW_FLOAT ScalarType : T_KW_DOUBLE VectorType : T_KW_VECTOR VectorType : T_KW_VECTOR '<' ScalarType ',' AddExpr '>' MatrixType : T_KW_MATRIX MatrixType : T_KW_MATRIX '<' ScalarType ',' ConstantExpr ',' AddExpr '>' ObjectType : T_KW_STRING ObjectType : T_KW_TEXTURE ObjectType : T_KW_TEXTURE1D ObjectType : T_KW_TEXTURE2D ObjectType : T_KW_TEXTURE3D ObjectType : T_KW_TEXTURECUBE ObjectType : T_KW_SAMPLER ObjectType : T_KW_SAMPLER1D ObjectType : T_KW_SAMPLER2D ObjectType : T_KW_SAMPLER3D ObjectType : T_KW_SAMPLERCUBE ObjectType : T_KW_PIXELSHADER ObjectType : T_KW_VERTEXSHADER ObjectType : T_KW_PIXELFRAGMENT ObjectType : T_KW_VERTEXFRAGMENT ObjectType : T_KW_STATEBLOCK Struct : T_KW_STRUCT StructBegin StructEnd Struct : T_KW_STRUCT StructBegin StructDecls StructEnd StructDecl : T_KW_STRUCT Id StructBegin StructEnd StructDecl : T_KW_STRUCT Id StructBegin StructDecls StructEnd ConstStructDecl : StructDecl ConstStructDecl : ConstUsages StructDecl StructBegin : '{' StructDecls : VariableDecl StructDecls : VariableDecl StructDecls StructEnd : '}' Semantic : ':' Id Semantic : ':' T_KW_REGISTER '(' Register ')' Semantics : Semantic Semantics : Semantics Semantic SemanticsOpt : SemanticsOpt : Semantics Register : Id Register : Target ',' Id Annotation : AnnotationBegin AnnotationEnd Annotation : AnnotationBegin AnnotationDecls AnnotationEnd AnnotationOpt : AnnotationOpt : Annotation AnnotationBegin : '<' AnnotationDecls : VariableDecl AnnotationDecls : VariableDecl AnnotationDecls AnnotationEnd : '>' Initializer : '=' AssignmentExpr Initializer : '=' '{' InitExprs '}' Initializer : '=' '{' InitExprs ',' '}' InitializerOpt : InitializerOpt : Initializer VariableDecl : UsageType Variables ';' VarStructDecl : UsageStructDecl Variables ';' Variables : Variable Variables : Variables ',' Variable Variable : VariableDim SemanticsOpt AnnotationOpt InitializerOpt VariableDim : Id VariableDim : VariableDim '[' ']' VariableDim : VariableDim '[' ConstantExpr ']' FunctionDecl : FunctionDef ';' FunctionDecl : FunctionDef AnnotationOpt StmtBlock FunctionDef : UsageType Id ParamList SemanticsOpt ParamList : ParamListBegin ParamListEnd ParamList : ParamListBegin T_KW_VOID ParamListEnd ParamList : ParamListBegin ParameterDecls ParamListEnd ParamListBegin : '(' ParamListEnd : ')' ParameterDecls : ParameterDecl ParameterDecls : ParameterDecls ',' ParameterDecl ParameterDecl : ParamUsageType Variable ParamUsageType : Type ParamUsageType : ParamUsages Type ParamUsages : ParamUsage ParamUsages : ParamUsages ParamUsage ParamUsage : T_KW_IN ParamUsage : T_KW_OUT ParamUsage : T_KW_INOUT ParamUsage : T_KW_UNIFORM ParamUsage : ConstUsage TechniqueDecl : T_KW_TECHNIQUE IdOpt AnnotationOpt TechniqueBody TechniqueBody : TechniqueBegin TechniqueEnd TechniqueBody : TechniqueBegin PassDecls TechniqueEnd TechniqueBegin : '{' TechniqueEnd : '}' PassDecls : PassDecl PassDecls : PassDecls PassDecl PassDecl : T_KW_PASS IdOpt AnnotationOpt StateBlock StateBlock : StateBlockBegin StateBlockEnd StateBlock : StateBlockBegin States StateBlockEnd StateBlockBegin : '{' StateBlockEnd : '}' States : State States : States State State : Id StateIndex StateExprBegin StateExpr StateExprEnd StateIndex : StateIndex : '[' Uint ']' StateExprBegin : '=' StateExprEnd : ';' StmtBlock : StmtBlockBegin StmtBlockEnd StmtBlock : StmtBlockBegin Stmts StmtBlockEnd StmtBlockBegin : '{' StmtBlockEnd : '}' Stmts : Stmt Stmts : Stmts Stmt SimpleStmt : ';' SimpleStmt : Expr ';' SimpleStmt : T_KW_RETURN ';' SimpleStmt : T_KW_RETURN Expr ';' SimpleStmt : T_KW_DO Stmt T_KW_WHILE '(' Expr ')' ';' SimpleStmt : StmtBlock SimpleStmt : T_KW_DISCARD ';' SimpleStmt : TypeDecl SimpleStmt : VariableDecl SimpleStmt : VarStructDecl NonIfStmt : SimpleStmt NonIfStmt : T_KW_WHILE '(' Expr ')' NonIfStmt NonIfStmt : For '(' ForInit ForCond ForStep ')' NonIfStmt Stmt : SimpleStmt Stmt : T_KW_WHILE '(' Expr ')' Stmt Stmt : For '(' ForInit ForCond ForStep ')' Stmt Stmt : T_KW_IF '(' Expr ')' Stmt Stmt : T_KW_IF '(' Expr ')' NonIfStmt T_KW_ELSE Stmt For : T_KW_FOR ForInit : ';' ForInit : Expr ';' ForInit : VariableDecl ForCond : ';' ForCond : Expr ';' ForStep : ForStep : Expr DwordExpr : Dword DwordExpr : Dword '|' DwordExpr StateExpr : DwordExpr StateExpr : ComplexExpr StateExpr : '{' InitExprs '}' StateExpr : '{' InitExprs ',' '}' StateExpr : '<' RelationalExpr '>' SimpleExpr : T_KW_TRUE SimpleExpr : T_KW_FALSE SimpleExpr : Uint SimpleExpr : Float SimpleExpr : Strings SimpleExpr : NonTypeId ComplexExpr : '(' Expr ')' ComplexExpr : TypeId '(' ArgumentsOpt ')' ComplexExpr : BaseType '(' ArgumentsOpt ')' ComplexExpr : NonTypeId '(' ArgumentsOpt ')' ComplexExpr : ObjectExpr ObjectExpr : AsmDecl ObjectExpr : AsmDecl Asm ObjectExpr : Asm ObjectExpr : AsmFragment ObjectExpr : T_KW_COMPILE Target NonTypeId '(' ArgumentsOpt ')' ObjectExpr : T_KW_SAMPLER_STATE StateBlock ObjectExpr : T_KW_COMPILE_FRAGMENT Target NonTypeId '(' ArgumentsOpt ')' ObjectExpr : T_KW_STATEBLOCK_STATE StateBlock PrimaryExpr : SimpleExpr PrimaryExpr : ComplexExpr PostfixExpr : PrimaryExpr PostfixExpr : PostfixExpr '[' Expr ']' PostfixExpr : PostfixExpr '.' Id PostfixExpr : PostfixExpr T_OP_INC PostfixExpr : PostfixExpr T_OP_DEC UnaryExpr : PostfixExpr UnaryExpr : T_OP_INC UnaryExpr UnaryExpr : T_OP_DEC UnaryExpr UnaryExpr : '!' CastExpr UnaryExpr : '-' CastExpr UnaryExpr : '+' CastExpr CastExpr : UnaryExpr CastExpr : '(' ConstTypeDim ')' CastExpr MulExpr : CastExpr MulExpr : MulExpr '*' CastExpr MulExpr : MulExpr '/' CastExpr MulExpr : MulExpr '%' CastExpr AddExpr : MulExpr AddExpr : AddExpr '+' MulExpr AddExpr : AddExpr '-' MulExpr RelationalExpr : AddExpr RelationalExpr : RelationalExpr '<' AddExpr RelationalExpr : RelationalExpr '>' AddExpr RelationalExpr : RelationalExpr T_OP_LE AddExpr RelationalExpr : RelationalExpr T_OP_GE AddExpr EqualityExpr : RelationalExpr EqualityExpr : EqualityExpr T_OP_EQ RelationalExpr EqualityExpr : EqualityExpr T_OP_NE RelationalExpr AndExpr : EqualityExpr AndExpr : AndExpr T_OP_AND EqualityExpr OrExpr : AndExpr OrExpr : OrExpr T_OP_OR AndExpr ConditionalExpr : OrExpr ConditionalExpr : OrExpr '?' AssignmentExpr ':' ConditionalExpr AssignmentExpr : ConditionalExpr AssignmentExpr : CastExpr '=' AssignmentExpr AssignmentExpr : CastExpr T_OP_ME AssignmentExpr AssignmentExpr : CastExpr T_OP_DE AssignmentExpr AssignmentExpr : CastExpr T_OP_RE AssignmentExpr AssignmentExpr : CastExpr T_OP_AE AssignmentExpr AssignmentExpr : CastExpr T_OP_SE AssignmentExpr Arguments : AssignmentExpr Arguments : Arguments ',' AssignmentExpr ArgumentsOpt : ArgumentsOpt : Arguments InitExpr : AssignmentExpr InitExpr : '{' InitExprs '}' InitExpr : '{' InitExprs ',' '}' InitExprs : InitExpr InitExprs : InitExprs ',' InitExpr ConstantExpr : AssignmentExpr Expr : AssignmentExpr Expr : Expr ',' AssignmentExpr Dword : Uint Dword : '-' Uint Dword : Float Dword : '-' Float Dword : DwordId Dword : Uint DwordId DwordId : Id DwordId : T_KW_TRUE DwordId : T_KW_FALSE DwordId : T_KW_TEXTURE Id : TypeId Id : NonTypeId IdOpt : IdOpt : Id Target : NonTypeId Uint : T_UINT Uint : T_INT32 Uint : T_UINT32 Float : T_FLOAT Float : T_FLOAT16 Float : T_FLOAT32 Float : T_FLOAT64 Strings : String Strings : Strings String String : T_STRING TypeId : T_TYPE_ID NonTypeId : T_NON_TYPE_ID AsmDecl : T_KW_DECL '{' Asm : T_KW_ASM '{' AsmFragment : T_KW_ASM_FRAGMENT '{'