Jason Green : wined3d: Implement locally defined boolean and integer constants in GLSL.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jun 19 05:44:09 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: f444009bfb699e73418007e950324df5ef177bdb
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=f444009bfb699e73418007e950324df5ef177bdb

Author: Jason Green <jave27 at gmail.com>
Date:   Fri Jun 16 16:08:00 2006 -0400

wined3d: Implement locally defined boolean and integer constants in GLSL.

---

 dlls/wined3d/glsl_shader.c     |   27 ++++++++++++++++++++++++++-
 dlls/wined3d/pixelshader.c     |    4 ++--
 dlls/wined3d/vertexshader.c    |    4 ++--
 dlls/wined3d/wined3d_private.h |    2 ++
 4 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 11decec..73199da 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -947,7 +947,7 @@ void shader_glsl_lrp(SHADER_OPCODE_ARG* 
                    tmpLine, src2_str, src1_str, src0_str, src0_str, dst_mask);
 }
 
-/** Process the D3DSIO_DCL opcode into a GLSL string - creates a local vec4
+/** Process the D3DSIO_DEF opcode into a GLSL string - creates a local vec4
  * float constant, and stores it's usage on the regmaps. */
 void shader_glsl_def(SHADER_OPCODE_ARG* arg) {
 
@@ -967,6 +967,31 @@ void shader_glsl_def(SHADER_OPCODE_ARG* 
     arg->reg_maps->constantsF[reg] = 1;
 }
 
+/** Process the D3DSIO_DEFI opcode into a GLSL string - creates a local ivec4
+ * integer constant, and stores it's usage on the regmaps. */
+void shader_glsl_defi(SHADER_OPCODE_ARG* arg) {
+
+    DWORD reg = arg->dst & D3DSP_REGNUM_MASK;
+
+    shader_addline(arg->buffer, 
+                   "const ivec4 I%lu = { %ld, %ld, %ld, %ld };\n", reg,
+                   (long)arg->src[0], (long)arg->src[1],
+                   (long)arg->src[2], (long)arg->src[3]);
+
+    arg->reg_maps->constantsI[reg] = 1;
+}
+
+/** Process the D3DSIO_DEFB opcode into a GLSL string - creates a local boolean
+ * constant, and stores it's usage on the regmaps. */
+void shader_glsl_defb(SHADER_OPCODE_ARG* arg) {
+
+    DWORD reg = arg->dst & D3DSP_REGNUM_MASK;
+
+    shader_addline(arg->buffer, "const bool B%lu = %s;\n", reg, (arg->src[0]) ? "true" : "false");
+
+    arg->reg_maps->constantsB[reg] = 1;
+}
+
 /** Process the D3DSIO_LIT instruction in GLSL:
  * dst.x = dst.w = 1.0
  * dst.y = (src0.x > 0) ? src0.x
diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c
index 4c72390..6d9f4b4 100644
--- a/dlls/wined3d/pixelshader.c
+++ b/dlls/wined3d/pixelshader.c
@@ -707,8 +707,8 @@ CONST SHADER_OPCODE IWineD3DPixelShaderI
 
     /* Constant definitions */
     {D3DSIO_DEF,      "def",      "undefined",         1, 5, pshader_def,     shader_hw_def, shader_glsl_def, 0, 0},
-    {D3DSIO_DEFB,     "defb",     GLNAME_REQUIRE_GLSL, 1, 2, pshader_defb,    NULL, NULL, 0, 0},
-    {D3DSIO_DEFI,     "defi",     GLNAME_REQUIRE_GLSL, 1, 5, pshader_defi,    NULL, NULL, 0, 0},
+    {D3DSIO_DEFB,     "defb",     GLNAME_REQUIRE_GLSL, 1, 2, pshader_defb,    NULL, shader_glsl_defb, 0, 0},
+    {D3DSIO_DEFI,     "defi",     GLNAME_REQUIRE_GLSL, 1, 5, pshader_defi,    NULL, shader_glsl_defi, 0, 0},
 
     /* Texture */
     {D3DSIO_TEXCOORD, "texcoord", "undefined", 1, 1, pshader_texcoord,    pshader_hw_texcoord, pshader_glsl_texcoord, 0, D3DPS_VERSION(1,3)},
diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c
index 8b62ff7..86eff1f 100644
--- a/dlls/wined3d/vertexshader.c
+++ b/dlls/wined3d/vertexshader.c
@@ -536,8 +536,8 @@ CONST SHADER_OPCODE IWineD3DVertexShader
 
     /* Constant definitions */
     {D3DSIO_DEF,      "def",      NULL,                1, 5, vshader_def,     shader_hw_def, shader_glsl_def, 0, 0},
-    {D3DSIO_DEFB,     "defb",     GLNAME_REQUIRE_GLSL, 1, 2, vshader_defb,    NULL, NULL, 0, 0},
-    {D3DSIO_DEFI,     "defi",     GLNAME_REQUIRE_GLSL, 1, 5, vshader_defi,    NULL, NULL, 0, 0},
+    {D3DSIO_DEFB,     "defb",     GLNAME_REQUIRE_GLSL, 1, 2, vshader_defb,    NULL, shader_glsl_defb, 0, 0},
+    {D3DSIO_DEFI,     "defi",     GLNAME_REQUIRE_GLSL, 1, 5, vshader_defi,    NULL, shader_glsl_defi, 0, 0},
 
     /* Flow control - requires GLSL or software shaders */
     {D3DSIO_REP ,     "rep",      GLNAME_REQUIRE_GLSL, 0, 1, vshader_rep,     NULL, NULL, 0, 0},
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index eee7fc3..e8322a2 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1376,6 +1376,8 @@ extern void shader_glsl_rcp(SHADER_OPCOD
 extern void shader_glsl_cnd(SHADER_OPCODE_ARG* arg);
 extern void shader_glsl_compare(SHADER_OPCODE_ARG* arg);
 extern void shader_glsl_def(SHADER_OPCODE_ARG* arg);
+extern void shader_glsl_defi(SHADER_OPCODE_ARG* arg);
+extern void shader_glsl_defb(SHADER_OPCODE_ARG* arg);
 extern void shader_glsl_cmp(SHADER_OPCODE_ARG* arg);
 extern void shader_glsl_lit(SHADER_OPCODE_ARG* arg);
 extern void shader_glsl_dst(SHADER_OPCODE_ARG* arg);




More information about the wine-cvs mailing list