[2/4] d3dx9: Complete output dcl instruction support.
Matteo Bruni
matteo.mystral at gmail.com
Thu May 13 10:24:09 CDT 2010
-------------- next part --------------
From 9a7460d1f3719a22cb6a6c01de569b8bf3733776 Mon Sep 17 00:00:00 2001
From: Matteo Bruni <matteo.mystral at gmail.com>
Date: Thu, 13 May 2010 17:21:58 +0200
Subject: d3dx9: Complete output dcl instruction support.
---
dlls/d3dx9_36/asmshader.l | 117 ++++++++++++++++++++++++++++++++++++++
dlls/d3dx9_36/asmshader.y | 91 +++++++++++++++++++++++++++++
dlls/d3dx9_36/d3dx9_36_private.h | 13 ++++
dlls/d3dx9_36/tests/asm.c | 6 +-
4 files changed, 224 insertions(+), 3 deletions(-)
diff --git a/dlls/d3dx9_36/asmshader.l b/dlls/d3dx9_36/asmshader.l
index e76da62..b7835a8 100644
--- a/dlls/d3dx9_36/asmshader.l
+++ b/dlls/d3dx9_36/asmshader.l
@@ -67,6 +67,19 @@ REG_PREDICATE p0
REG_LABEL l[0-9]+
DCL_POSITION _position[0-9]*
+DCL_BLENDWEIGHT _blendweight[0-9]*
+DCL_BLENDINDICES _blendindices[0-9]*
+DCL_NORMAL _normal[0-9]*
+DCL_PSIZE _psize[0-9]*
+DCL_TEXCOORD _texcoord[0-9]*
+DCL_TANGENT _tangent[0-9]*
+DCL_BINORMAL _binormal[0-9]*
+DCL_TESSFACTOR _tessfactor[0-9]*
+DCL_POSITIONT _positiont[0-9]*
+DCL_COLOR _color[0-9]*
+DCL_FOG _fog[0-9]*
+DCL_DEPTH _depth[0-9]*
+DCL_SAMPLE _sample[0-9]*
PREPROCESSORDIRECTIVE #[^\n]*\n
@@ -282,6 +295,110 @@ ps_3_0 {return VER_PS30; }
}
return USAGE_POSITION;
}
+{DCL_BLENDWEIGHT} {
+ if(yytext[strlen("_blendweight")] == '\0') {
+ asmshader_lval.regnum = 0;
+ } else {
+ asmshader_lval.regnum = atoi(yytext + strlen("_blendweight"));
+ }
+ return USAGE_BLENDWEIGHT;
+ }
+{DCL_BLENDINDICES} {
+ if(yytext[strlen("_blendindices")] == '\0') {
+ asmshader_lval.regnum = 0;
+ } else {
+ asmshader_lval.regnum = atoi(yytext + strlen("_blendindices"));
+ }
+ return USAGE_BLENDINDICES;
+ }
+{DCL_NORMAL} {
+ if(yytext[strlen("_normal")] == '\0') {
+ asmshader_lval.regnum = 0;
+ } else {
+ asmshader_lval.regnum = atoi(yytext + strlen("_normal"));
+ }
+ return USAGE_NORMAL;
+ }
+{DCL_PSIZE} {
+ if(yytext[strlen("_psize")] == '\0') {
+ asmshader_lval.regnum = 0;
+ } else {
+ asmshader_lval.regnum = atoi(yytext + strlen("_psize"));
+ }
+ return USAGE_PSIZE;
+ }
+{DCL_TEXCOORD} {
+ if(yytext[strlen("_texcoord")] == '\0') {
+ asmshader_lval.regnum = 0;
+ } else {
+ asmshader_lval.regnum = atoi(yytext + strlen("_texcoord"));
+ }
+ return USAGE_TEXCOORD;
+ }
+{DCL_TANGENT} {
+ if(yytext[strlen("_tangent")] == '\0') {
+ asmshader_lval.regnum = 0;
+ } else {
+ asmshader_lval.regnum = atoi(yytext + strlen("_tangent"));
+ }
+ return USAGE_TANGENT;
+ }
+{DCL_BINORMAL} {
+ if(yytext[strlen("_binormal")] == '\0') {
+ asmshader_lval.regnum = 0;
+ } else {
+ asmshader_lval.regnum = atoi(yytext + strlen("_binormal"));
+ }
+ return USAGE_BINORMAL;
+ }
+{DCL_TESSFACTOR} {
+ if(yytext[strlen("_tessfactor")] == '\0') {
+ asmshader_lval.regnum = 0;
+ } else {
+ asmshader_lval.regnum = atoi(yytext + strlen("_tessfactor"));
+ }
+ return USAGE_TESSFACTOR;
+ }
+{DCL_POSITIONT} {
+ if(yytext[strlen("_positiont")] == '\0') {
+ asmshader_lval.regnum = 0;
+ } else {
+ asmshader_lval.regnum = atoi(yytext + strlen("_positiont"));
+ }
+ return USAGE_POSITIONT;
+ }
+{DCL_COLOR} {
+ if(yytext[strlen("_color")] == '\0') {
+ asmshader_lval.regnum = 0;
+ } else {
+ asmshader_lval.regnum = atoi(yytext + strlen("_color"));
+ }
+ return USAGE_COLOR;
+ }
+{DCL_FOG} {
+ if(yytext[strlen("_fog")] == '\0') {
+ asmshader_lval.regnum = 0;
+ } else {
+ asmshader_lval.regnum = atoi(yytext + strlen("_fog"));
+ }
+ return USAGE_FOG;
+ }
+{DCL_DEPTH} {
+ if(yytext[strlen("_depth")] == '\0') {
+ asmshader_lval.regnum = 0;
+ } else {
+ asmshader_lval.regnum = atoi(yytext + strlen("_depth"));
+ }
+ return USAGE_DEPTH;
+ }
+{DCL_SAMPLE} {
+ if(yytext[strlen("_sample")] == '\0') {
+ asmshader_lval.regnum = 0;
+ } else {
+ asmshader_lval.regnum = atoi(yytext + strlen("_sample"));
+ }
+ return USAGE_SAMPLE;
+ }
{PREPROCESSORDIRECTIVE} {
/* TODO: update current line information */
diff --git a/dlls/d3dx9_36/asmshader.y b/dlls/d3dx9_36/asmshader.y
index 2a31ebe..8231c3a 100644
--- a/dlls/d3dx9_36/asmshader.y
+++ b/dlls/d3dx9_36/asmshader.y
@@ -200,6 +200,19 @@ void set_rel_reg(struct shader_reg *reg, struct rel_reg *rel) {
/* Usage declaration tokens */
%token <regnum> USAGE_POSITION
+%token <regnum> USAGE_BLENDWEIGHT
+%token <regnum> USAGE_BLENDINDICES
+%token <regnum> USAGE_NORMAL
+%token <regnum> USAGE_PSIZE
+%token <regnum> USAGE_TEXCOORD
+%token <regnum> USAGE_TANGENT
+%token <regnum> USAGE_BINORMAL
+%token <regnum> USAGE_TESSFACTOR
+%token <regnum> USAGE_POSITIONT
+%token <regnum> USAGE_COLOR
+%token <regnum> USAGE_FOG
+%token <regnum> USAGE_DEPTH
+%token <regnum> USAGE_SAMPLE
/* Misc stuff */
%token <component> COMPONENT
@@ -1080,6 +1093,84 @@ dclusage: USAGE_POSITION
$$.regnum = $1;
$$.dclusage = BWRITERDECLUSAGE_POSITION;
}
+ | USAGE_BLENDWEIGHT
+ {
+ TRACE("dcl_blendweight%u\n", $1);
+ $$.regnum = $1;
+ $$.dclusage = BWRITERDECLUSAGE_BLENDWEIGHT;
+ }
+ | USAGE_BLENDINDICES
+ {
+ TRACE("dcl_blendindices%u\n", $1);
+ $$.regnum = $1;
+ $$.dclusage = BWRITERDECLUSAGE_BLENDINDICES;
+ }
+ | USAGE_NORMAL
+ {
+ TRACE("dcl_normal%u\n", $1);
+ $$.regnum = $1;
+ $$.dclusage = BWRITERDECLUSAGE_NORMAL;
+ }
+ | USAGE_PSIZE
+ {
+ TRACE("dcl_psize%u\n", $1);
+ $$.regnum = $1;
+ $$.dclusage = BWRITERDECLUSAGE_PSIZE;
+ }
+ | USAGE_TEXCOORD
+ {
+ TRACE("dcl_texcoord%u\n", $1);
+ $$.regnum = $1;
+ $$.dclusage = BWRITERDECLUSAGE_TEXCOORD;
+ }
+ | USAGE_TANGENT
+ {
+ TRACE("dcl_tangent%u\n", $1);
+ $$.regnum = $1;
+ $$.dclusage = BWRITERDECLUSAGE_TANGENT;
+ }
+ | USAGE_BINORMAL
+ {
+ TRACE("dcl_binormal%u\n", $1);
+ $$.regnum = $1;
+ $$.dclusage = BWRITERDECLUSAGE_BINORMAL;
+ }
+ | USAGE_TESSFACTOR
+ {
+ TRACE("dcl_tessfactor%u\n", $1);
+ $$.regnum = $1;
+ $$.dclusage = BWRITERDECLUSAGE_TESSFACTOR;
+ }
+ | USAGE_POSITIONT
+ {
+ TRACE("dcl_positiont%u\n", $1);
+ $$.regnum = $1;
+ $$.dclusage = BWRITERDECLUSAGE_POSITIONT;
+ }
+ | USAGE_COLOR
+ {
+ TRACE("dcl_color%u\n", $1);
+ $$.regnum = $1;
+ $$.dclusage = BWRITERDECLUSAGE_COLOR;
+ }
+ | USAGE_FOG
+ {
+ TRACE("dcl_fog%u\n", $1);
+ $$.regnum = $1;
+ $$.dclusage = BWRITERDECLUSAGE_FOG;
+ }
+ | USAGE_DEPTH
+ {
+ TRACE("dcl_depth%u\n", $1);
+ $$.regnum = $1;
+ $$.dclusage = BWRITERDECLUSAGE_DEPTH;
+ }
+ | USAGE_SAMPLE
+ {
+ TRACE("dcl_sample%u\n", $1);
+ $$.regnum = $1;
+ $$.dclusage = BWRITERDECLUSAGE_SAMPLE;
+ }
predicate: '(' REG_PREDICATE swizzle ')'
{
diff --git a/dlls/d3dx9_36/d3dx9_36_private.h b/dlls/d3dx9_36/d3dx9_36_private.h
index 0e839dd..19b1921 100644
--- a/dlls/d3dx9_36/d3dx9_36_private.h
+++ b/dlls/d3dx9_36/d3dx9_36_private.h
@@ -520,6 +520,19 @@ typedef enum _BWRITERSHADER_PARAM_SRCMOD_TYPE {
typedef enum _BWRITERDECLUSAGE {
BWRITERDECLUSAGE_POSITION,
+ BWRITERDECLUSAGE_BLENDWEIGHT,
+ BWRITERDECLUSAGE_BLENDINDICES,
+ BWRITERDECLUSAGE_NORMAL,
+ BWRITERDECLUSAGE_PSIZE,
+ BWRITERDECLUSAGE_TEXCOORD,
+ BWRITERDECLUSAGE_TANGENT,
+ BWRITERDECLUSAGE_BINORMAL,
+ BWRITERDECLUSAGE_TESSFACTOR,
+ BWRITERDECLUSAGE_POSITIONT,
+ BWRITERDECLUSAGE_COLOR,
+ BWRITERDECLUSAGE_FOG,
+ BWRITERDECLUSAGE_DEPTH,
+ BWRITERDECLUSAGE_SAMPLE
} BWRITERDECLUSAGE;
struct bwriter_shader *SlAssembleShader(const char *text, char **messages);
diff --git a/dlls/d3dx9_36/tests/asm.c b/dlls/d3dx9_36/tests/asm.c
index 968766a..dd51a95 100644
--- a/dlls/d3dx9_36/tests/asm.c
+++ b/dlls/d3dx9_36/tests/asm.c
@@ -1028,11 +1028,11 @@ static void vs_3_0_test(void) {
"dcl_position o0\n",
{0xfffe0300, 0x0200001f, 0x80000000, 0xe00f0000, 0x0000ffff}
},
-/* {*/ /* shader 3 */
-/* "vs_3_0\n"
+ { /* shader 3 */
+ "vs_3_0\n"
"dcl_texcoord12 o11\n",
{0xfffe0300, 0x0200001f, 0x800c0005, 0xe00f000b, 0x0000ffff}
- },*/
+ },
{ /* shader 4 */
"vs_3_0\n"
"texldl r0, v0, s0\n",
--
1.6.4.4
More information about the wine-patches
mailing list