BsParserFX.y 29 KB

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