From f444009bfb699e73418007e950324df5ef177bdb Mon Sep 17 00:00:00 2001 From: Jason Green Date: Fri, 16 Jun 2006 16:08:00 -0400 Subject: [PATCH] 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 11dececcc7b..73199da59aa 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -947,7 +947,7 @@ void shader_glsl_lrp(SHADER_OPCODE_ARG* 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) { 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 4c72390876d..6d9f4b4b370 100644 --- a/dlls/wined3d/pixelshader.c +++ b/dlls/wined3d/pixelshader.c @@ -707,8 +707,8 @@ CONST SHADER_OPCODE IWineD3DPixelShaderImpl_shader_ins[] = { /* 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 8b62ff7b491..86eff1f5e23 100644 --- a/dlls/wined3d/vertexshader.c +++ b/dlls/wined3d/vertexshader.c @@ -536,8 +536,8 @@ CONST SHADER_OPCODE IWineD3DVertexShaderImpl_shader_ins[] = { /* 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 eee7fc3256c..e8322a28521 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1376,6 +1376,8 @@ extern void shader_glsl_rcp(SHADER_OPCODE_ARG* arg); 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); -- 2.11.4.GIT