Module: wine Branch: master Commit: de11f800fd9fc7e320ebeb75278e9b61174728fd URL: http://source.winehq.org/git/wine.git/?a=commit;h=de11f800fd9fc7e320ebeb7527...
Author: Matteo Bruni mbruni@codeweavers.com Date: Mon Jun 11 19:18:31 2012 +0200
d3dcompiler: Parse vector and matrix declarations.
---
dlls/d3dcompiler_43/hlsl.l | 2 -- dlls/d3dcompiler_43/hlsl.y | 40 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 4 deletions(-)
diff --git a/dlls/d3dcompiler_43/hlsl.l b/dlls/d3dcompiler_43/hlsl.l index ef12ab9..84cf573 100644 --- a/dlls/d3dcompiler_43/hlsl.l +++ b/dlls/d3dcompiler_43/hlsl.l @@ -148,8 +148,6 @@ while {return KW_WHILE; } ... {return OP_ELLIPSIS; } <= {return OP_LE; } >= {return OP_GE; } -< {return OP_LT; } -> {return OP_GT; } != {return OP_NE; } += {return OP_ADDASSIGN; } -= {return OP_SUBASSIGN; } diff --git a/dlls/d3dcompiler_43/hlsl.y b/dlls/d3dcompiler_43/hlsl.y index ae1599f..cc13e25 100644 --- a/dlls/d3dcompiler_43/hlsl.y +++ b/dlls/d3dcompiler_43/hlsl.y @@ -213,8 +213,6 @@ static DWORD add_modifier(DWORD modifiers, DWORD mod) %token OP_ELLIPSIS %token OP_LE %token OP_GE -%token OP_LT -%token OP_GT %token OP_NE %token OP_ADDASSIGN %token OP_SUBASSIGN @@ -302,6 +300,44 @@ type: base_type { $$ = $1; } + | KW_VECTOR '<' base_type ',' C_INTEGER '>' + { + if ($3->type != HLSL_CLASS_SCALAR) + { + hlsl_message("Line %u: vectors of non-scalar types are not allowed.\n", + hlsl_ctx.line_no); + set_parse_status(&hlsl_ctx.status, PARSE_ERR); + return 1; + } + if ($5 < 1 || $5 > 4) + { + hlsl_message("Line %u: vector size must be between 1 and 4.\n", + hlsl_ctx.line_no); + set_parse_status(&hlsl_ctx.status, PARSE_ERR); + return 1; + } + + $$ = new_hlsl_type(NULL, HLSL_CLASS_VECTOR, $3->base_type, $5, 1); + } + | KW_MATRIX '<' base_type ',' C_INTEGER ',' C_INTEGER '>' + { + if ($3->type != HLSL_CLASS_SCALAR) + { + hlsl_message("Line %u: matrices of non-scalar types are not allowed.\n", + hlsl_ctx.line_no); + set_parse_status(&hlsl_ctx.status, PARSE_ERR); + return 1; + } + if ($5 < 1 || $5 > 4 || $7 < 1 || $7 > 4) + { + hlsl_message("Line %u: matrix dimensions must be between 1 and 4.\n", + hlsl_ctx.line_no); + set_parse_status(&hlsl_ctx.status, PARSE_ERR); + return 1; + } + + $$ = new_hlsl_type(NULL, HLSL_CLASS_MATRIX, $3->base_type, $5, $7); + }
base_type: KW_VOID {