BsParserFX.y 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017
  1. %{
  2. #include "BsParserFX.h"
  3. #include "BsLexerFX.h"
  4. #define inline
  5. void yyerror(YYLTYPE *locp, ParseState* parse_state, yyscan_t scanner, const char *msg);
  6. %}
  7. %code requires{
  8. #include "BsMMAlloc.h"
  9. #include "BsASTFX.h"
  10. #include "BsIncludeHandler.h"
  11. #ifndef YY_TYPEDEF_YY_SCANNER_T
  12. #define YY_TYPEDEF_YY_SCANNER_T
  13. typedef void* yyscan_t;
  14. #endif
  15. typedef struct YYLTYPE {
  16. int first_line;
  17. int first_column;
  18. int last_line;
  19. int last_column;
  20. char *filename;
  21. } YYLTYPE;
  22. #define YYLTYPE_IS_DECLARED 1
  23. #define YYLLOC_DEFAULT(Current, Rhs, N) \
  24. do \
  25. if (N) \
  26. { \
  27. (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
  28. (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
  29. (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
  30. (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
  31. (Current).filename = YYRHSLOC (Rhs, 1).filename; \
  32. } \
  33. else \
  34. { \
  35. (Current).first_line = (Current).last_line = YYRHSLOC (Rhs, 0).last_line; \
  36. (Current).first_column = (Current).last_column = YYRHSLOC (Rhs, 0).last_column; \
  37. (Current).filename = NULL; \
  38. } \
  39. while (0)
  40. #define ADD_PARAMETER(OUTPUT, TYPE, NAME) \
  41. OUTPUT = nodeCreate(parse_state->memContext, NT_Parameter); \
  42. nodePush(parse_state, OUTPUT); \
  43. \
  44. NodeOption paramType; \
  45. paramType.type = OT_ParamType; \
  46. paramType.value.intValue = TYPE; \
  47. \
  48. NodeOption paramName; \
  49. paramName.type = OT_Identifier; \
  50. paramName.value.strValue = NAME; \
  51. \
  52. nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &paramType); \
  53. nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &paramName); \
  54. }
  55. %output "BsParserFX.c"
  56. %defines "BsParserFX.h"
  57. %define api.pure
  58. %locations
  59. %lex-param { yyscan_t scanner }
  60. %parse-param { ParseState* parse_state }
  61. %parse-param { yyscan_t scanner }
  62. %glr-parser
  63. %union {
  64. int intValue;
  65. float floatValue;
  66. float matrixValue[16];
  67. int intVectorValue[4];
  68. const char* strValue;
  69. ASTFXNode* nodePtr;
  70. NodeOption nodeOption;
  71. }
  72. /* Value types */
  73. %token <intValue> TOKEN_INTEGER
  74. %token <floatValue> TOKEN_FLOAT
  75. %token <intValue> TOKEN_BOOLEAN
  76. %token <strValue> TOKEN_STRING
  77. %token <strValue> TOKEN_IDENTIFIER
  78. %token <intValue> TOKEN_FILLMODEVALUE
  79. %token <intValue> TOKEN_CULLMODEVALUE
  80. %token <intValue> TOKEN_COMPFUNCVALUE
  81. %token <intValue> TOKEN_OPVALUE
  82. %token <intValue> TOKEN_COLORMASK
  83. %token <intValue> TOKEN_ADDRMODEVALUE
  84. %token <intValue> TOKEN_FILTERVALUE
  85. %token <intValue> TOKEN_BLENDOPVALUE
  86. %token <intValue> TOKEN_BUFFERUSAGE
  87. %token <intValue> TOKEN_QUEUETYPE
  88. %token <intValue> TOKEN_FLOATTYPE
  89. %token <intValue> TOKEN_FLOAT2TYPE
  90. %token <intValue> TOKEN_FLOAT3TYPE
  91. %token <intValue> TOKEN_FLOAT4TYPE
  92. %token <intValue> TOKEN_INTTYPE
  93. %token <intValue> TOKEN_INT2TYPE
  94. %token <intValue> TOKEN_INT3TYPE
  95. %token <intValue> TOKEN_INT4TYPE
  96. %token <intValue> TOKEN_COLORTYPE
  97. %token <intValue> TOKEN_MAT2x2TYPE
  98. %token <intValue> TOKEN_MAT2x3TYPE
  99. %token <intValue> TOKEN_MAT2x4TYPE
  100. %token <intValue> TOKEN_MAT3x2TYPE
  101. %token <intValue> TOKEN_MAT3x3TYPE
  102. %token <intValue> TOKEN_MAT3x4TYPE
  103. %token <intValue> TOKEN_MAT4x2TYPE
  104. %token <intValue> TOKEN_MAT4x3TYPE
  105. %token <intValue> TOKEN_MAT4x4TYPE
  106. %token <intValue> TOKEN_SAMPLER1D
  107. %token <intValue> TOKEN_SAMPLER2D
  108. %token <intValue> TOKEN_SAMPLER3D
  109. %token <intValue> TOKEN_SAMPLERCUBE
  110. %token <intValue> TOKEN_SAMPLER2DMS
  111. %token <intValue> TOKEN_TEXTURE1D
  112. %token <intValue> TOKEN_TEXTURE2D
  113. %token <intValue> TOKEN_TEXTURE3D
  114. %token <intValue> TOKEN_TEXTURECUBE
  115. %token <intValue> TOKEN_TEXTURE2DMS
  116. %token <intValue> TOKEN_RWTEXTURE1D
  117. %token <intValue> TOKEN_RWTEXTURE2D
  118. %token <intValue> TOKEN_RWTEXTURE3D
  119. %token <intValue> TOKEN_RWTEXTURE2DMS
  120. %token <intValue> TOKEN_BYTEBUFFER
  121. %token <intValue> TOKEN_STRUCTBUFFER
  122. %token <intValue> TOKEN_RWTYPEDBUFFER
  123. %token <intValue> TOKEN_RWBYTEBUFFER
  124. %token <intValue> TOKEN_RWSTRUCTBUFFER
  125. %token <intValue> TOKEN_RWAPPENDBUFFER
  126. %token <intValue> TOKEN_RWCONSUMEBUFFER
  127. %token TOKEN_PARAMSBLOCK
  128. /* Qualifiers */
  129. %token TOKEN_AUTO TOKEN_ALIAS TOKEN_SHARED TOKEN_USAGE
  130. /* Shader keywords */
  131. %token TOKEN_SEPARABLE TOKEN_SORT TOKEN_PRIORITY TOKEN_TRANSPARENT
  132. %token TOKEN_PARAMETERS TOKEN_BLOCKS TOKEN_TECHNIQUE
  133. /* Technique keywords */
  134. %token TOKEN_RENDERER TOKEN_LANGUAGE TOKEN_PASS TOKEN_TAGS
  135. /* Pass keywords */
  136. %token TOKEN_VERTEX TOKEN_FRAGMENT TOKEN_GEOMETRY TOKEN_HULL TOKEN_DOMAIN TOKEN_COMPUTE TOKEN_COMMON
  137. %token TOKEN_STENCILREF
  138. %token TOKEN_FILLMODE TOKEN_CULLMODE TOKEN_DEPTHBIAS TOKEN_SDEPTHBIAS
  139. %token TOKEN_DEPTHCLIP TOKEN_SCISSOR TOKEN_MULTISAMPLE TOKEN_AALINE
  140. %token TOKEN_DEPTHREAD TOKEN_DEPTHWRITE TOKEN_COMPAREFUNC TOKEN_STENCIL
  141. %token TOKEN_STENCILREADMASK TOKEN_STENCILWRITEMASK TOKEN_STENCILOPFRONT TOKEN_STENCILOPBACK
  142. %token TOKEN_FAIL TOKEN_ZFAIL
  143. %token TOKEN_ALPHATOCOVERAGE TOKEN_INDEPENDANTBLEND TOKEN_TARGET TOKEN_INDEX
  144. %token TOKEN_BLEND TOKEN_COLOR TOKEN_ALPHA TOKEN_WRITEMASK
  145. %token TOKEN_SOURCE TOKEN_DEST TOKEN_OP
  146. /* Sampler state keywords */
  147. %token TOKEN_ADDRMODE TOKEN_MINFILTER TOKEN_MAGFILTER TOKEN_MIPFILTER
  148. %token TOKEN_MAXANISO TOKEN_MIPBIAS TOKEN_MIPMIN TOKEN_MIPMAX
  149. %token TOKEN_BORDERCOLOR TOKEN_U TOKEN_V TOKEN_W
  150. %type <nodePtr> shader;
  151. %type <nodeOption> shader_statement;
  152. %type <nodeOption> shader_option;
  153. %type <nodePtr> technique;
  154. %type <nodePtr> technique_header;
  155. %type <nodeOption> technique_statement;
  156. %type <nodeOption> technique_option;
  157. %type <nodePtr> tags;
  158. %type <nodePtr> tags_header;
  159. %type <nodePtr> pass;
  160. %type <nodePtr> pass_header;
  161. %type <nodeOption> pass_statement;
  162. %type <nodeOption> pass_option;
  163. %type <nodePtr> code;
  164. %type <nodePtr> code_header;
  165. %type <nodePtr> stencil_op_front_header;
  166. %type <nodePtr> stencil_op_back_header;
  167. %type <nodeOption> stencil_op_option;
  168. %type <nodePtr> target;
  169. %type <nodePtr> target_header;
  170. %type <nodeOption> target_statement;
  171. %type <nodeOption> target_option;
  172. %type <nodePtr> blend_color_header;
  173. %type <nodePtr> blend_alpha_header;
  174. %type <nodeOption> blenddef_option;
  175. %type <nodeOption> sampler_state_option;
  176. %type <nodePtr> addr_mode;
  177. %type <nodePtr> addr_mode_header;
  178. %type <nodeOption> addr_mode_option;
  179. %type <nodePtr> parameters
  180. %type <nodePtr> parameters_header
  181. %type <nodeOption> parameter
  182. %type <nodePtr> block_header
  183. %type <nodeOption> block
  184. %type <nodePtr> blocks_header
  185. %type <nodePtr> blocks
  186. %type <nodeOption> qualifier
  187. %type <matrixValue> float2;
  188. %type <matrixValue> float3;
  189. %type <matrixValue> float4;
  190. %type <intVectorValue> int2;
  191. %type <intVectorValue> int3;
  192. %type <intVectorValue> int4;
  193. %type <matrixValue> mat6;
  194. %type <matrixValue> mat8;
  195. %type <matrixValue> mat9;
  196. %type <matrixValue> mat12;
  197. %type <matrixValue> mat16;
  198. %type <nodePtr> param_header_float
  199. %type <nodePtr> param_header_float2
  200. %type <nodePtr> param_header_float3
  201. %type <nodePtr> param_header_float4
  202. %type <nodePtr> param_header_int
  203. %type <nodePtr> param_header_int2
  204. %type <nodePtr> param_header_int3
  205. %type <nodePtr> param_header_int4
  206. %type <nodePtr> param_header_color
  207. %type <nodePtr> param_header_mat2x2
  208. %type <nodePtr> param_header_mat2x3
  209. %type <nodePtr> param_header_mat2x4
  210. %type <nodePtr> param_header_mat3x2
  211. %type <nodePtr> param_header_mat3x3
  212. %type <nodePtr> param_header_mat3x4
  213. %type <nodePtr> param_header_mat4x2
  214. %type <nodePtr> param_header_mat4x3
  215. %type <nodePtr> param_header_mat4x4
  216. %type <nodePtr> param_header_sampler
  217. %type <nodePtr> param_header_texture
  218. %type <nodePtr> param_header_buffer
  219. %type <nodePtr> param_header_qualified_sampler
  220. %type <nodeOption> param_body_float
  221. %type <nodeOption> param_body_float2
  222. %type <nodeOption> param_body_float3
  223. %type <nodeOption> param_body_float4
  224. %type <nodeOption> param_body_int
  225. %type <nodeOption> param_body_int2
  226. %type <nodeOption> param_body_int3
  227. %type <nodeOption> param_body_int4
  228. %type <nodeOption> param_body_mat6
  229. %type <nodeOption> param_body_mat8
  230. %type <nodeOption> param_body_mat9
  231. %type <nodeOption> param_body_mat12
  232. %type <nodeOption> param_body_mat16
  233. %type <nodeOption> param_body_sampler
  234. %type <nodeOption> param_body_tex
  235. %%
  236. /* Shader */
  237. shader
  238. : /* empty */ { }
  239. | shader_statement shader { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$1); }
  240. ;
  241. shader_statement
  242. : shader_option
  243. | technique { $$.type = OT_Technique; $$.value.nodePtr = $1; }
  244. | parameters { $$.type = OT_Parameters; $$.value.nodePtr = $1; }
  245. | blocks { $$.type = OT_Blocks; $$.value.nodePtr = $1; }
  246. ;
  247. shader_option
  248. : TOKEN_SEPARABLE '=' TOKEN_BOOLEAN ';' { $$.type = OT_Separable; $$.value.intValue = $3; }
  249. | TOKEN_SORT '=' TOKEN_QUEUETYPE ';' { $$.type = OT_Sort; $$.value.intValue = $3; }
  250. | TOKEN_PRIORITY '=' TOKEN_INTEGER ';' { $$.type = OT_Priority; $$.value.intValue = $3; }
  251. | TOKEN_TRANSPARENT '=' TOKEN_BOOLEAN ';' { $$.type = OT_Transparent; $$.value.intValue = $3; }
  252. ;
  253. /* Technique */
  254. technique
  255. : technique_header '{' technique_body '}' ';' { nodePop(parse_state); $$ = $1; }
  256. ;
  257. technique_header
  258. : TOKEN_TECHNIQUE '='
  259. {
  260. $$ = nodeCreate(parse_state->memContext, NT_Technique);
  261. nodePush(parse_state, $$);
  262. }
  263. ;
  264. technique_body
  265. : /* empty */
  266. | technique_statement technique_body { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$1); }
  267. ;
  268. technique_statement
  269. : technique_option
  270. | pass { $$.type = OT_Pass; $$.value.nodePtr = $1; }
  271. | pass_option
  272. | code { $$.type = OT_Code; $$.value.nodePtr = $1; }
  273. ;
  274. technique_option
  275. : TOKEN_RENDERER '=' TOKEN_STRING ';' { $$.type = OT_Renderer; $$.value.strValue = $3; }
  276. | TOKEN_LANGUAGE '=' TOKEN_STRING ';' { $$.type = OT_Language; $$.value.strValue = $3; }
  277. | tags { $$.type = OT_Tags; $$.value.nodePtr = $1; }
  278. ;
  279. tags
  280. : tags_header '{' tags_body '}' ';' { nodePop(parse_state); $$ = $1; }
  281. ;
  282. tags_header
  283. : TOKEN_TAGS '='
  284. {
  285. $$ = nodeCreate(parse_state->memContext, NT_Tags);
  286. nodePush(parse_state, $$);
  287. }
  288. ;
  289. tags_body
  290. : /* empty */
  291. | TOKEN_STRING
  292. {
  293. NodeOption entry; entry.type = OT_TagValue; entry.value.strValue = $1;
  294. nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &entry);
  295. }
  296. | TOKEN_STRING ',' tags_body
  297. {
  298. NodeOption entry; entry.type = OT_TagValue; entry.value.strValue = $1;
  299. nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &entry);
  300. }
  301. ;
  302. /* Pass */
  303. pass
  304. : pass_header '{' pass_body '}' ';' { nodePop(parse_state); $$ = $1; }
  305. ;
  306. pass_header
  307. : TOKEN_PASS '='
  308. {
  309. $$ = nodeCreate(parse_state->memContext, NT_Pass);
  310. nodePush(parse_state, $$);
  311. }
  312. ;
  313. pass_body
  314. : /* empty */
  315. | pass_statement pass_body { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$1); }
  316. ;
  317. pass_statement
  318. : pass_option
  319. | code { $$.type = OT_Code; $$.value.nodePtr = $1; }
  320. ;
  321. pass_option
  322. : TOKEN_INDEX '=' TOKEN_INTEGER ';' { $$.type = OT_Index; $$.value.intValue = $3; }
  323. | TOKEN_FILLMODE '=' TOKEN_FILLMODEVALUE ';' { $$.type = OT_FillMode; $$.value.intValue = $3; }
  324. | TOKEN_CULLMODE '=' TOKEN_CULLMODEVALUE ';' { $$.type = OT_CullMode; $$.value.intValue = $3; }
  325. | TOKEN_DEPTHBIAS '=' TOKEN_FLOAT ';' { $$.type = OT_DepthBias; $$.value.floatValue = $3; }
  326. | TOKEN_SDEPTHBIAS '=' TOKEN_FLOAT ';' { $$.type = OT_SDepthBias; $$.value.floatValue = $3; }
  327. | TOKEN_DEPTHCLIP '=' TOKEN_BOOLEAN ';' { $$.type = OT_DepthClip; $$.value.intValue = $3; }
  328. | TOKEN_SCISSOR '=' TOKEN_BOOLEAN ';' { $$.type = OT_Scissor; $$.value.intValue = $3; }
  329. | TOKEN_MULTISAMPLE '=' TOKEN_BOOLEAN ';' { $$.type = OT_Multisample; $$.value.intValue = $3; }
  330. | TOKEN_AALINE '=' TOKEN_BOOLEAN ';' { $$.type = OT_AALine; $$.value.intValue = $3; }
  331. | TOKEN_DEPTHREAD '=' TOKEN_BOOLEAN ';' { $$.type = OT_DepthRead; $$.value.intValue = $3; }
  332. | TOKEN_DEPTHWRITE '=' TOKEN_BOOLEAN ';' { $$.type = OT_DepthWrite; $$.value.intValue = $3; }
  333. | TOKEN_COMPAREFUNC '=' TOKEN_COMPFUNCVALUE ';' { $$.type = OT_CompareFunc; $$.value.intValue = $3; }
  334. | TOKEN_STENCIL '=' TOKEN_BOOLEAN ';' { $$.type = OT_Stencil; $$.value.intValue = $3; }
  335. | TOKEN_STENCILREADMASK '=' TOKEN_INTEGER ';' { $$.type = OT_StencilReadMask; $$.value.intValue = $3; }
  336. | TOKEN_STENCILWRITEMASK '=' TOKEN_INTEGER ';' { $$.type = OT_StencilWriteMask; $$.value.intValue = $3; }
  337. | stencil_op_front_header '{' stencil_op_body '}' ';' { nodePop(parse_state); $$.type = OT_StencilOpFront; $$.value.nodePtr = $1; }
  338. | stencil_op_back_header '{' stencil_op_body '}' ';' { nodePop(parse_state); $$.type = OT_StencilOpBack; $$.value.nodePtr = $1; }
  339. | stencil_op_front_header '{' stencil_op_body_init '}' ';' { nodePop(parse_state); $$.type = OT_StencilOpFront; $$.value.nodePtr = $1; }
  340. | stencil_op_back_header '{' stencil_op_body_init '}' ';' { nodePop(parse_state); $$.type = OT_StencilOpBack; $$.value.nodePtr = $1; }
  341. | TOKEN_ALPHATOCOVERAGE '=' TOKEN_BOOLEAN ';' { $$.type = OT_AlphaToCoverage; $$.value.intValue = $3; }
  342. | TOKEN_INDEPENDANTBLEND '=' TOKEN_BOOLEAN ';' { $$.type = OT_IndependantBlend; $$.value.intValue = $3; }
  343. | target { $$.type = OT_Target; $$.value.nodePtr = $1; }
  344. | TOKEN_STENCILREF '=' TOKEN_INTEGER ';' { $$.type = OT_StencilRef; $$.value.intValue = $3; }
  345. ;
  346. /* Code blocks */
  347. code
  348. : code_header '{' TOKEN_INDEX '=' TOKEN_INTEGER ';' '}' ';'
  349. {
  350. NodeOption index;
  351. index.type = OT_Index;
  352. index.value.intValue = $5;
  353. nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &index);
  354. nodePop(parse_state);
  355. $$ = $1;
  356. }
  357. ;
  358. code_header
  359. : TOKEN_VERTEX '='
  360. {
  361. $$ = nodeCreate(parse_state->memContext, NT_CodeVertex);
  362. nodePush(parse_state, $$);
  363. }
  364. | TOKEN_FRAGMENT '='
  365. {
  366. $$ = nodeCreate(parse_state->memContext, NT_CodeFragment);
  367. nodePush(parse_state, $$);
  368. }
  369. | TOKEN_GEOMETRY '='
  370. {
  371. $$ = nodeCreate(parse_state->memContext, NT_CodeGeometry);
  372. nodePush(parse_state, $$);
  373. }
  374. | TOKEN_HULL '='
  375. {
  376. $$ = nodeCreate(parse_state->memContext, NT_CodeHull);
  377. nodePush(parse_state, $$);
  378. }
  379. | TOKEN_DOMAIN '='
  380. {
  381. $$ = nodeCreate(parse_state->memContext, NT_CodeDomain);
  382. nodePush(parse_state, $$);
  383. }
  384. | TOKEN_COMPUTE '='
  385. {
  386. $$ = nodeCreate(parse_state->memContext, NT_CodeCompute);
  387. nodePush(parse_state, $$);
  388. }
  389. | TOKEN_COMMON '='
  390. {
  391. $$ = nodeCreate(parse_state->memContext, NT_CodeCommon);
  392. nodePush(parse_state, $$);
  393. }
  394. ;
  395. /* Stencil op */
  396. stencil_op_front_header
  397. : TOKEN_STENCILOPFRONT '='
  398. {
  399. $$ = nodeCreate(parse_state->memContext, NT_StencilOp);
  400. nodePush(parse_state, $$);
  401. }
  402. ;
  403. stencil_op_back_header
  404. : TOKEN_STENCILOPBACK '='
  405. {
  406. $$ = nodeCreate(parse_state->memContext, NT_StencilOp);
  407. nodePush(parse_state, $$);
  408. }
  409. ;
  410. stencil_op_body_init
  411. : TOKEN_OPVALUE ',' TOKEN_OPVALUE ',' TOKEN_OPVALUE ',' TOKEN_COMPFUNCVALUE
  412. {
  413. NodeOption fail; fail.type = OT_Fail; fail.value.intValue = $1;
  414. NodeOption zfail; zfail.type = OT_ZFail; zfail.value.intValue = $3;
  415. NodeOption pass; pass.type = OT_PassOp; pass.value.intValue = $5;
  416. NodeOption cmp; cmp.type = OT_CompareFunc; cmp.value.intValue = $7;
  417. nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &fail);
  418. nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &zfail);
  419. nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &pass);
  420. nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &cmp);
  421. }
  422. ;
  423. stencil_op_body
  424. : /* empty */
  425. | stencil_op_option stencil_op_body { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$1); }
  426. ;
  427. stencil_op_option
  428. : TOKEN_FAIL '=' TOKEN_OPVALUE ';' { $$.type = OT_Fail; $$.value.intValue = $3; }
  429. | TOKEN_ZFAIL '=' TOKEN_OPVALUE ';' { $$.type = OT_ZFail; $$.value.intValue = $3; }
  430. | TOKEN_PASS '=' TOKEN_OPVALUE ';' { $$.type = OT_PassOp; $$.value.intValue = $3; }
  431. | TOKEN_COMPAREFUNC '=' TOKEN_COMPFUNCVALUE ';' { $$.type = OT_CompareFunc; $$.value.intValue = $3; }
  432. ;
  433. /* Target */
  434. target
  435. : target_header '{' target_body '}' ';' { nodePop(parse_state); $$ = $1; }
  436. ;
  437. target_header
  438. : TOKEN_TARGET '='
  439. {
  440. $$ = nodeCreate(parse_state->memContext, NT_Target);
  441. nodePush(parse_state, $$);
  442. }
  443. ;
  444. target_body
  445. : /* empty */
  446. | target_statement target_body { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$1); }
  447. ;
  448. target_statement
  449. : target_option
  450. ;
  451. target_option
  452. : TOKEN_INDEX '=' TOKEN_INTEGER ';' { $$.type = OT_Index; $$.value.intValue = $3; }
  453. | TOKEN_BLEND '=' TOKEN_BOOLEAN ';' { $$.type = OT_Blend; $$.value.intValue = $3; }
  454. | blend_color_header '{' blenddef_body '}' ';' { nodePop(parse_state); $$.type = OT_Color; $$.value.nodePtr = $1; }
  455. | blend_alpha_header '{' blenddef_body '}' ';' { nodePop(parse_state); $$.type = OT_Alpha; $$.value.nodePtr = $1; }
  456. | blend_color_header '{' blenddef_body_init '}' ';' { nodePop(parse_state); $$.type = OT_Color; $$.value.nodePtr = $1; }
  457. | blend_alpha_header '{' blenddef_body_init '}' ';' { nodePop(parse_state); $$.type = OT_Alpha; $$.value.nodePtr = $1; }
  458. | TOKEN_WRITEMASK '=' TOKEN_COLORMASK ';' { $$.type = OT_WriteMask; $$.value.intValue = $3; }
  459. ;
  460. /* Blend definition */
  461. blend_color_header
  462. : TOKEN_COLOR '='
  463. {
  464. $$ = nodeCreate(parse_state->memContext, NT_BlendDef);
  465. nodePush(parse_state, $$);
  466. }
  467. ;
  468. blend_alpha_header
  469. : TOKEN_ALPHA '='
  470. {
  471. $$ = nodeCreate(parse_state->memContext, NT_BlendDef);
  472. nodePush(parse_state, $$);
  473. }
  474. ;
  475. blenddef_body
  476. : /* empty */
  477. | blenddef_option blenddef_body { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$1); }
  478. ;
  479. blenddef_body_init
  480. : TOKEN_OPVALUE ',' TOKEN_OPVALUE ',' TOKEN_BLENDOPVALUE
  481. {
  482. NodeOption src; src.type = OT_Source; src.value.intValue = $1;
  483. NodeOption dst; dst.type = OT_Dest; dst.value.intValue = $3;
  484. NodeOption op; op.type = OT_Op; op.value.intValue = $5;
  485. nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &src);
  486. nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &dst);
  487. nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &op);
  488. }
  489. ;
  490. blenddef_option
  491. : TOKEN_SOURCE '=' TOKEN_OPVALUE ';' { $$.type = OT_Source; $$.value.intValue = $3; }
  492. | TOKEN_DEST '=' TOKEN_OPVALUE ';' { $$.type = OT_Dest; $$.value.intValue = $3; }
  493. | TOKEN_OP '=' TOKEN_BLENDOPVALUE ';' { $$.type = OT_Op; $$.value.intValue = $3; }
  494. ;
  495. /* Sampler state */
  496. sampler_state_body
  497. : /* empty */
  498. | sampler_state_option sampler_state_body { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$1); }
  499. ;
  500. sampler_state_option
  501. : addr_mode { $$.type = OT_AddrMode; $$.value.nodePtr = $1; }
  502. | TOKEN_MINFILTER '=' TOKEN_FILTERVALUE ';' { $$.type = OT_MinFilter; $$.value.intValue = $3; }
  503. | TOKEN_MAGFILTER '=' TOKEN_FILTERVALUE ';' { $$.type = OT_MagFilter; $$.value.intValue = $3; }
  504. | TOKEN_MIPFILTER '=' TOKEN_FILTERVALUE ';' { $$.type = OT_MipFilter; $$.value.intValue = $3; }
  505. | TOKEN_MAXANISO '=' TOKEN_INTEGER ';' { $$.type = OT_MaxAniso; $$.value.intValue = $3; }
  506. | TOKEN_MIPBIAS '=' TOKEN_FLOAT ';' { $$.type = OT_MipBias; $$.value.floatValue = $3; }
  507. | TOKEN_MIPMIN '=' TOKEN_FLOAT ';' { $$.type = OT_MipMin; $$.value.floatValue = $3; }
  508. | TOKEN_MIPMAX '=' TOKEN_FLOAT ';' { $$.type = OT_MipMax; $$.value.floatValue = $3; }
  509. | TOKEN_BORDERCOLOR '=' float4 ';' { $$.type = OT_BorderColor; memcpy($$.value.matrixValue, $3, sizeof($3)); }
  510. | TOKEN_COMPAREFUNC '=' TOKEN_COMPFUNCVALUE ';' { $$.type = OT_CompareFunc; $$.value.intValue = $3; }
  511. ;
  512. /* Addresing mode */
  513. addr_mode
  514. : addr_mode_header '{' addr_mode_body '}' ';' { nodePop(parse_state); $$ = $1; }
  515. | addr_mode_header '{' addr_mode_body_init '}' ';' { nodePop(parse_state); $$ = $1; }
  516. ;
  517. addr_mode_header
  518. : TOKEN_ADDRMODE '='
  519. {
  520. $$ = nodeCreate(parse_state->memContext, NT_AddrMode);
  521. nodePush(parse_state, $$);
  522. }
  523. ;
  524. addr_mode_body_init
  525. : TOKEN_ADDRMODEVALUE ',' TOKEN_ADDRMODEVALUE ',' TOKEN_ADDRMODEVALUE
  526. {
  527. NodeOption u; u.type = OT_U; u.value.intValue = $1;
  528. NodeOption v; v.type = OT_V; v.value.intValue = $3;
  529. NodeOption w; w.type = OT_W; w.value.intValue = $5;
  530. nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &u);
  531. nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &v);
  532. nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &w);
  533. }
  534. ;
  535. addr_mode_body
  536. : /* empty */
  537. | addr_mode_option addr_mode_body { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$1); }
  538. ;
  539. addr_mode_option
  540. : TOKEN_U '=' TOKEN_ADDRMODEVALUE ';' { $$.type = OT_U; $$.value.intValue = $3; }
  541. | TOKEN_V '=' TOKEN_ADDRMODEVALUE ';' { $$.type = OT_V; $$.value.intValue = $3; }
  542. | TOKEN_W '=' TOKEN_ADDRMODEVALUE ';' { $$.type = OT_W; $$.value.intValue = $3; }
  543. ;
  544. /* Value types */
  545. float2
  546. : '{' TOKEN_FLOAT ',' TOKEN_FLOAT '}' { $$[0] = $2; $$[1] = $4; }
  547. ;
  548. float3
  549. : '{' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT '}' { $$[0] = $2; $$[1] = $4; $$[2] = $6; }
  550. ;
  551. float4
  552. : '{' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT '}' { $$[0] = $2; $$[1] = $4; $$[2] = $6; $$[3] = $8;}
  553. ;
  554. int2
  555. : '{' TOKEN_INTEGER ',' TOKEN_INTEGER '}' { $$[0] = $2; $$[1] = $4; }
  556. ;
  557. int3
  558. : '{' TOKEN_INTEGER ',' TOKEN_INTEGER ',' TOKEN_INTEGER '}' { $$[0] = $2; $$[1] = $4; $$[2] = $6; }
  559. ;
  560. int4
  561. : '{' TOKEN_INTEGER ',' TOKEN_INTEGER ',' TOKEN_INTEGER ',' TOKEN_INTEGER '}' { $$[0] = $2; $$[1] = $4; $$[2] = $6; $$[3] = $8;}
  562. ;
  563. mat6
  564. : '{' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ','
  565. TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT '}'
  566. {
  567. $$[0] = $2; $$[1] = $4; $$[2] = $6;
  568. $$[3] = $8; $$[4] = $10; $$[5] = $12;
  569. }
  570. ;
  571. mat8
  572. : '{' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ','
  573. TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ','
  574. TOKEN_FLOAT ',' TOKEN_FLOAT '}'
  575. {
  576. $$[0] = $2; $$[1] = $4; $$[2] = $6;
  577. $$[3] = $8; $$[4] = $10; $$[5] = $12;
  578. $$[6] = $14; $$[7] = $16;
  579. }
  580. ;
  581. mat9
  582. : '{' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ','
  583. TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ','
  584. TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT '}'
  585. {
  586. $$[0] = $2; $$[1] = $4; $$[2] = $6;
  587. $$[3] = $8; $$[4] = $10; $$[5] = $12;
  588. $$[6] = $14; $$[7] = $16; $$[8] = $18;
  589. }
  590. ;
  591. mat12
  592. : '{' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ','
  593. TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ','
  594. TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT '}'
  595. {
  596. $$[0] = $2; $$[1] = $4; $$[2] = $6; $$[3] = $8;
  597. $$[4] = $10; $$[5] = $12; $$[6] = $14; $$[7] = $16;
  598. $$[8] = $18; $$[9] = $20; $$[10] = $22; $$[11] = $24;
  599. }
  600. ;
  601. mat16
  602. : '{' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ','
  603. TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ','
  604. TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ','
  605. TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT '}'
  606. {
  607. $$[0] = $2; $$[1] = $4; $$[2] = $6; $$[3] = $8;
  608. $$[4] = $10; $$[5] = $12; $$[6] = $14; $$[7] = $16;
  609. $$[8] = $18; $$[9] = $20; $$[10] = $22; $$[11] = $24;
  610. $$[12] = $26; $$[13] = $28; $$[14] = $30; $$[15] = $32;
  611. }
  612. ;
  613. /* Parameters */
  614. parameters
  615. : parameters_header '{' parameters_body '}' ';' { nodePop(parse_state); $$ = $1; }
  616. ;
  617. parameters_header
  618. : TOKEN_PARAMETERS '='
  619. {
  620. $$ = nodeCreate(parse_state->memContext, NT_Parameters);
  621. nodePush(parse_state, $$);
  622. }
  623. ;
  624. parameters_body
  625. : /* empty */
  626. | parameter parameters_body { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$1); }
  627. ;
  628. parameter
  629. : param_header_float qualifier_list param_body_float ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; }
  630. | param_header_float2 qualifier_list param_body_float2 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; }
  631. | param_header_float3 qualifier_list param_body_float3 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; }
  632. | param_header_float4 qualifier_list param_body_float4 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; }
  633. | param_header_int qualifier_list param_body_int ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; }
  634. | param_header_int2 qualifier_list param_body_int2 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; }
  635. | param_header_int3 qualifier_list param_body_int3 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; }
  636. | param_header_int4 qualifier_list param_body_int4 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; }
  637. | param_header_color qualifier_list param_body_float4 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; }
  638. | param_header_mat2x2 qualifier_list param_body_float4 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; }
  639. | param_header_mat2x3 qualifier_list param_body_mat6 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; }
  640. | param_header_mat2x4 qualifier_list param_body_mat8 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; }
  641. | param_header_mat3x2 qualifier_list param_body_mat6 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; }
  642. | param_header_mat3x3 qualifier_list param_body_mat9 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; }
  643. | param_header_mat3x4 qualifier_list param_body_mat12 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; }
  644. | param_header_mat4x2 qualifier_list param_body_mat8 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; }
  645. | param_header_mat4x3 qualifier_list param_body_mat12 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; }
  646. | param_header_mat4x4 qualifier_list param_body_mat16 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; }
  647. | param_header_texture qualifier_list param_body_tex ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; }
  648. | param_header_buffer qualifier_list ';' { nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; }
  649. | param_header_qualified_sampler param_body_sampler ';'
  650. {
  651. nodePop(parse_state);
  652. NodeOption samplerState;
  653. samplerState.type = OT_SamplerState;
  654. samplerState.value.nodePtr = $1;
  655. nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &samplerState);
  656. $$.type = OT_Parameter; $$.value.nodePtr = parse_state->topNode;
  657. nodePop(parse_state);
  658. }
  659. ;
  660. param_header_float
  661. : TOKEN_FLOATTYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  662. ;
  663. param_header_float2
  664. : TOKEN_FLOAT2TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  665. ;
  666. param_header_float3
  667. : TOKEN_FLOAT3TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  668. ;
  669. param_header_float4
  670. : TOKEN_FLOAT4TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  671. ;
  672. param_header_int
  673. : TOKEN_INTTYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  674. ;
  675. param_header_int2
  676. : TOKEN_INT2TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  677. ;
  678. param_header_int3
  679. : TOKEN_INT3TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  680. ;
  681. param_header_int4
  682. : TOKEN_INT4TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  683. ;
  684. param_header_color
  685. : TOKEN_COLORTYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  686. ;
  687. param_header_mat2x2
  688. : TOKEN_MAT2x2TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  689. ;
  690. param_header_mat2x3
  691. : TOKEN_MAT2x3TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  692. ;
  693. param_header_mat2x4
  694. : TOKEN_MAT2x4TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  695. ;
  696. param_header_mat3x2
  697. : TOKEN_MAT3x2TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  698. ;
  699. param_header_mat3x3
  700. : TOKEN_MAT3x3TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  701. ;
  702. param_header_mat3x4
  703. : TOKEN_MAT3x4TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  704. ;
  705. param_header_mat4x2
  706. : TOKEN_MAT4x2TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  707. ;
  708. param_header_mat4x3
  709. : TOKEN_MAT4x3TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  710. ;
  711. param_header_mat4x4
  712. : TOKEN_MAT4x4TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  713. ;
  714. param_header_sampler
  715. : TOKEN_SAMPLER1D TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  716. | TOKEN_SAMPLER2D TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  717. | TOKEN_SAMPLER3D TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  718. | TOKEN_SAMPLERCUBE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  719. | TOKEN_SAMPLER2DMS TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  720. ;
  721. param_header_texture
  722. : TOKEN_TEXTURE1D TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  723. | TOKEN_TEXTURE2D TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  724. | TOKEN_TEXTURE3D TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  725. | TOKEN_TEXTURECUBE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  726. | TOKEN_TEXTURE2DMS TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  727. | TOKEN_RWTEXTURE1D TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  728. | TOKEN_RWTEXTURE2D TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  729. | TOKEN_RWTEXTURE3D TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  730. | TOKEN_RWTEXTURE2DMS TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  731. ;
  732. param_header_buffer
  733. : TOKEN_BYTEBUFFER TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  734. | TOKEN_STRUCTBUFFER TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  735. | TOKEN_RWTYPEDBUFFER TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  736. | TOKEN_RWBYTEBUFFER TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  737. | TOKEN_RWSTRUCTBUFFER TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  738. | TOKEN_RWAPPENDBUFFER TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  739. | TOKEN_RWCONSUMEBUFFER TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); }
  740. ;
  741. param_header_qualified_sampler
  742. : param_header_sampler qualifier_list
  743. {
  744. $$ = nodeCreate(parse_state->memContext, NT_SamplerState);
  745. nodePush(parse_state, $$);
  746. }
  747. ;
  748. param_body_float
  749. : /* empty */ { $$.type = OT_None; }
  750. | '=' TOKEN_FLOAT { $$.type = OT_ParamValue; $$.value.floatValue = $2; }
  751. ;
  752. param_body_float2
  753. : /* empty */ { $$.type = OT_None; }
  754. | '=' float2 { $$.type = OT_ParamValue; memcpy($$.value.matrixValue, $2, sizeof($2)); }
  755. ;
  756. param_body_float3
  757. : /* empty */ { $$.type = OT_None; }
  758. | '=' float3 { $$.type = OT_ParamValue; memcpy($$.value.matrixValue, $2, sizeof($2)); }
  759. ;
  760. param_body_float4
  761. : /* empty */ { $$.type = OT_None; }
  762. | '=' float4 { $$.type = OT_ParamValue; memcpy($$.value.matrixValue, $2, sizeof($2)); }
  763. ;
  764. param_body_int
  765. : /* empty */ { $$.type = OT_None; }
  766. | '=' TOKEN_INTEGER { $$.type = OT_ParamValue; $$.value.intValue = $2; }
  767. ;
  768. param_body_int2
  769. : /* empty */ { $$.type = OT_None; }
  770. | '=' int2 { $$.type = OT_ParamValue; memcpy($$.value.intVectorValue, $2, sizeof($2)); }
  771. ;
  772. param_body_int3
  773. : /* empty */ { $$.type = OT_None; }
  774. | '=' int3 { $$.type = OT_ParamValue; memcpy($$.value.intVectorValue, $2, sizeof($2)); }
  775. ;
  776. param_body_int4
  777. : /* empty */ { $$.type = OT_None; }
  778. | '=' int4 { $$.type = OT_ParamValue; memcpy($$.value.intVectorValue, $2, sizeof($2)); }
  779. ;
  780. param_body_mat6
  781. : /* empty */ { $$.type = OT_None; }
  782. | '=' mat6 { $$.type = OT_ParamValue; memcpy($$.value.matrixValue, $2, sizeof($2)); }
  783. ;
  784. param_body_mat8
  785. : /* empty */ { $$.type = OT_None; }
  786. | '=' mat8 { $$.type = OT_ParamValue; memcpy($$.value.matrixValue, $2, sizeof($2)); }
  787. ;
  788. param_body_mat9
  789. : /* empty */ { $$.type = OT_None; }
  790. | '=' mat9 { $$.type = OT_ParamValue; memcpy($$.value.matrixValue, $2, sizeof($2)); }
  791. ;
  792. param_body_mat12
  793. : /* empty */ { $$.type = OT_None; }
  794. | '=' mat12 { $$.type = OT_ParamValue; memcpy($$.value.matrixValue, $2, sizeof($2)); }
  795. ;
  796. param_body_mat16
  797. : /* empty */ { $$.type = OT_None; }
  798. | '=' mat16 { $$.type = OT_ParamValue; memcpy($$.value.matrixValue, $2, sizeof($2)); }
  799. ;
  800. param_body_sampler
  801. : /* empty */ { $$.type = OT_None; }
  802. | '=' '{' sampler_state_body '}' { }
  803. ;
  804. param_body_tex
  805. : /* empty */ { $$.type = OT_None; }
  806. | '=' TOKEN_STRING { $$.type = OT_ParamStrValue; $$.value.strValue = $2; }
  807. ;
  808. /* Blocks */
  809. blocks
  810. : blocks_header '{' blocks_body '}' ';' { nodePop(parse_state); $$ = $1; }
  811. ;
  812. blocks_header
  813. : TOKEN_BLOCKS '='
  814. {
  815. $$ = nodeCreate(parse_state->memContext, NT_Blocks);
  816. nodePush(parse_state, $$);
  817. }
  818. ;
  819. blocks_body
  820. : /* empty */
  821. | block blocks_body { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$1); }
  822. ;
  823. block
  824. : block_header qualifier_list ';' { nodePop(parse_state); $$.type = OT_Block; $$.value.nodePtr = $1; }
  825. ;
  826. block_header
  827. : TOKEN_PARAMSBLOCK TOKEN_IDENTIFIER
  828. {
  829. $$ = nodeCreate(parse_state->memContext, NT_Block);
  830. nodePush(parse_state, $$);
  831. NodeOption blockName;
  832. blockName.type = OT_Identifier;
  833. blockName.value.strValue = $2;
  834. nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &blockName);
  835. }
  836. ;
  837. /* Qualifiers */
  838. qualifier_list
  839. : /* empty */
  840. | qualifier qualifier_list { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$1); }
  841. ;
  842. qualifier
  843. : ':' TOKEN_ALIAS '(' TOKEN_STRING ')' { $$.type = OT_Alias; $$.value.strValue = $4; }
  844. | ':' TOKEN_AUTO '(' TOKEN_STRING ')' { $$.type = OT_Auto; $$.value.strValue = $4; }
  845. | ':' TOKEN_SHARED '(' TOKEN_BOOLEAN ')' { $$.type = OT_Shared; $$.value.intValue = $4; }
  846. | ':' TOKEN_USAGE '(' TOKEN_BUFFERUSAGE ')' { $$.type = OT_Usage; $$.value.intValue = $4; }
  847. ;
  848. %%
  849. void yyerror(YYLTYPE *locp, ParseState* parse_state, yyscan_t scanner, const char *msg)
  850. {
  851. parse_state->hasError = 1;
  852. parse_state->errorLine = locp->first_line;
  853. parse_state->errorColumn = locp->first_column;
  854. parse_state->errorMessage = mmalloc_strdup(parse_state->memContext, msg);
  855. parse_state->errorFile = locp->filename;
  856. }