BsParserFX.y 36 KB

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