BsParserFX.y 34 KB

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