[PATCH] WineD3D: Implement secondary color in the arbfp ffp =
Stefan Doesinger
stefan at codeweavers.com
Tue Aug 26 15:17:09 CDT 2008
pipeline=0A=
=0A=
---=0A=
dlls/wined3d/arb_program_shader.c | 68 =
++++++++++++++++++++++++-------------=0A=
1 files changed, 44 insertions(+), 24 deletions(-)=0A=
=0A=
diff --git a/dlls/wined3d/arb_program_shader.c =
b/dlls/wined3d/arb_program_shader.c=0A=
index c96feec..335e54b 100644=0A=
--- a/dlls/wined3d/arb_program_shader.c=0A=
+++ b/dlls/wined3d/arb_program_shader.c=0A=
@@ -2221,10 +2221,11 @@ const shader_backend_t =
arb_program_shader_backend =3D {=0A=
};=0A=
=0A=
/* ARB_fragment_program fixed function pipeline replacement definitions =
*/=0A=
-#define ARB_FFP_CONST_TFACTOR 0=0A=
-#define ARB_FFP_CONST_CONSTANT(i) ((ARB_FFP_CONST_TFACTOR) + 1 + i)=0A=
-#define ARB_FFP_CONST_BUMPMAT(i) ((ARB_FFP_CONST_CONSTANT(7)) + 1 + =
i)=0A=
-#define ARB_FFP_CONST_LUMINANCE(i) ((ARB_FFP_CONST_BUMPMAT(7)) + 1 + i)=0A=
+#define ARB_FFP_CONST_TFACTOR 0=0A=
+#define ARB_FFP_CONST_SPECULAR_ENABLE ((ARB_FFP_CONST_TFACTOR) + 1)=0A=
+#define ARB_FFP_CONST_CONSTANT(i) =
((ARB_FFP_CONST_SPECULAR_ENABLE) + 1 + i)=0A=
+#define ARB_FFP_CONST_BUMPMAT(i) ((ARB_FFP_CONST_CONSTANT(7)) + =
1 + i)=0A=
+#define ARB_FFP_CONST_LUMINANCE(i) ((ARB_FFP_CONST_BUMPMAT(7)) + 1 =
+ i)=0A=
=0A=
struct arbfp_ffp_desc=0A=
{=0A=
@@ -2340,6 +2341,31 @@ static void state_texfactor_arbfp(DWORD state, =
IWineD3DStateBlockImpl *statebloc=0A=
}=0A=
}=0A=
=0A=
+static void state_arb_specularenable(DWORD state, =
IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {=0A=
+ float col[4];=0A=
+ IWineD3DDeviceImpl *device =3D stateblock->wineD3DDevice;=0A=
+=0A=
+ /* Do not overwrite pixel shader constants if a pshader is in use */=0A=
+ if(use_ps(device)) return;=0A=
+=0A=
+ if(stateblock->renderState[WINED3DRS_SPECULARENABLE]) {=0A=
+ /* The specular color has no alpha */=0A=
+ col[0] =3D 1.0; col[1] =3D 1.0;=0A=
+ col[2] =3D 1.0; col[3] =3D 0.0;=0A=
+ } else {=0A=
+ col[0] =3D 0.0; col[1] =3D 0.0;=0A=
+ col[2] =3D 0.0; col[3] =3D 0.0;=0A=
+ }=0A=
+ GL_EXTCALL(glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, =
ARB_FFP_CONST_SPECULAR_ENABLE, col));=0A=
+ checkGLcall("glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, =
ARB_FFP_CONST_SPECULAR_ENABLE, col)");=0A=
+=0A=
+ if(device->shader_backend =3D=3D &arb_program_shader_backend) {=0A=
+ device =3D stateblock->wineD3DDevice;=0A=
+ =
device->activeContext->pshader_const_dirty[ARB_FFP_CONST_SPECULAR_ENABLE]=
=3D 1;=0A=
+ device->highest_dirty_ps_const =3D =
max(device->highest_dirty_ps_const, ARB_FFP_CONST_SPECULAR_ENABLE + 1);=0A=
+ }=0A=
+}=0A=
+=0A=
static void set_bumpmat_arbfp(DWORD state, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context) {=0A=
DWORD stage =3D (state - STATE_TEXTURESTAGE(0, 0)) / =
WINED3D_HIGHEST_TEXTURE_STATE;=0A=
IWineD3DDeviceImpl *device =3D stateblock->wineD3DDevice;=0A=
@@ -2474,7 +2500,7 @@ static const char *get_argreg(SHADER_BUFFER =
*buffer, DWORD argnum, unsigned int=0A=
return ret;=0A=
}=0A=
=0A=
-static void gen_ffp_instr(SHADER_BUFFER *buffer, unsigned int stage, =
BOOL color, BOOL alpha, BOOL last,=0A=
+static void gen_ffp_instr(SHADER_BUFFER *buffer, unsigned int stage, =
BOOL color, BOOL alpha,=0A=
DWORD dst, DWORD op, DWORD dw_arg0, DWORD =
dw_arg1, DWORD dw_arg2) {=0A=
const char *dstmask, *dstreg, *arg0, *arg1, *arg2;=0A=
unsigned int mul =3D 1;=0A=
@@ -2484,9 +2510,7 @@ static void gen_ffp_instr(SHADER_BUFFER *buffer, =
unsigned int stage, BOOL color,=0A=
else if(color) dstmask =3D ".rgb";=0A=
else dstmask =3D ".a";=0A=
=0A=
- if(dst =3D=3D tempreg && last) FIXME("Last texture stage writes to =
D3DTA_TEMP\n");=0A=
if(dst =3D=3D tempreg) dstreg =3D "tempreg";=0A=
- else if(last) dstreg =3D "result.color";=0A=
else dstreg =3D "ret";=0A=
=0A=
arg0 =3D get_argreg(buffer, 0, stage, dw_arg0);=0A=
@@ -2627,8 +2651,8 @@ static GLuint gen_arbfp_ffp_shader(struct =
ffp_settings *settings, IWineD3DStateB=0A=
GLuint ret;=0A=
DWORD arg0, arg1, arg2;=0A=
BOOL tempreg_used =3D FALSE, tfactor_used =3D FALSE;=0A=
- BOOL last =3D FALSE;=0A=
BOOL op_equal;=0A=
+ const char *final_combiner_src =3D "ret";=0A=
=0A=
/* Find out which textures are read */=0A=
for(stage =3D 0; stage < MAX_TEXTURES; stage++) {=0A=
@@ -2712,6 +2736,7 @@ static GLuint gen_arbfp_ffp_shader(struct =
ffp_settings *settings, IWineD3DStateB=0A=
if(tfactor_used) {=0A=
shader_addline(&buffer, "PARAM tfactor =3D program.env[%u];\n", =
ARB_FFP_CONST_TFACTOR);=0A=
}=0A=
+ shader_addline(&buffer, "PARAM specular_enable =3D =
program.env[%u];\n", ARB_FFP_CONST_SPECULAR_ENABLE);=0A=
=0A=
if(settings->sRGB_write) {=0A=
shader_addline(&buffer, "PARAM srgb_mul_low =3D {%f, %f, %f, =
1.0};\n",=0A=
@@ -2808,15 +2833,9 @@ static GLuint gen_arbfp_ffp_shader(struct =
ffp_settings *settings, IWineD3DStateB=0A=
for(stage =3D 0; stage < MAX_TEXTURES; stage++) {=0A=
if(settings->op[stage].cop =3D=3D WINED3DTOP_DISABLE) {=0A=
if(stage =3D=3D 0) {=0A=
- shader_addline(&buffer, "MOV result.color, =
fragment.color.primary;\n");=0A=
+ final_combiner_src =3D "fragment.color.primary";=0A=
}=0A=
break;=0A=
- } else if(settings->sRGB_write) {=0A=
- last =3D FALSE;=0A=
- } else if(stage =3D=3D (MAX_TEXTURES - 1)) {=0A=
- last =3D TRUE;=0A=
- } else if(settings->op[stage + 1].cop =3D=3D =
WINED3DTOP_DISABLE) {=0A=
- last =3D TRUE;=0A=
}=0A=
=0A=
if(settings->op[stage].cop =3D=3D WINED3DTOP_SELECTARG1 &&=0A=
@@ -2839,33 +2858,32 @@ static GLuint gen_arbfp_ffp_shader(struct =
ffp_settings *settings, IWineD3DStateB=0A=
}=0A=
=0A=
if(settings->op[stage].aop =3D=3D WINED3DTOP_DISABLE) {=0A=
- gen_ffp_instr(&buffer, stage, TRUE, FALSE, last, =
settings->op[stage].dst,=0A=
+ gen_ffp_instr(&buffer, stage, TRUE, FALSE, =
settings->op[stage].dst,=0A=
settings->op[stage].cop, =
settings->op[stage].carg0,=0A=
settings->op[stage].carg1, =
settings->op[stage].carg2);=0A=
- if(last && stage =3D=3D 0) {=0A=
- shader_addline(&buffer, "MOV result.color.a, =
fragment.color.primary.a;\n");=0A=
- } else if(last) {=0A=
- shader_addline(&buffer, "MOV result.color.a, ret.a;\n");=0A=
- } else if(stage =3D=3D 0) {=0A=
+ if(stage =3D=3D 0) {=0A=
shader_addline(&buffer, "MOV ret.a, =
fragment.color.primary.a;\n");=0A=
}=0A=
} else if(op_equal) {=0A=
- gen_ffp_instr(&buffer, stage, TRUE, TRUE, last, =
settings->op[stage].dst,=0A=
+ gen_ffp_instr(&buffer, stage, TRUE, TRUE, =
settings->op[stage].dst,=0A=
settings->op[stage].cop, =
settings->op[stage].carg0,=0A=
settings->op[stage].carg1, =
settings->op[stage].carg2);=0A=
} else {=0A=
- gen_ffp_instr(&buffer, stage, TRUE, FALSE, last, =
settings->op[stage].dst,=0A=
+ gen_ffp_instr(&buffer, stage, TRUE, FALSE, =
settings->op[stage].dst,=0A=
settings->op[stage].cop, =
settings->op[stage].carg0,=0A=
settings->op[stage].carg1, =
settings->op[stage].carg2);=0A=
- gen_ffp_instr(&buffer, stage, FALSE, TRUE, last, =
settings->op[stage].dst,=0A=
+ gen_ffp_instr(&buffer, stage, FALSE, TRUE, =
settings->op[stage].dst,=0A=
settings->op[stage].aop, =
settings->op[stage].aarg0,=0A=
settings->op[stage].aarg1, =
settings->op[stage].aarg2);=0A=
}=0A=
}=0A=
=0A=
if(settings->sRGB_write) {=0A=
+ shader_addline(&buffer, "MAD ret, fragment.color.secondary, =
specular_enable, %s;\n", final_combiner_src);=0A=
arbfp_add_sRGB_correction(&buffer, "ret", "arg0", "arg1", =
"arg2", "tempreg");=0A=
shader_addline(&buffer, "MOV result.color.a, ret.a;\n");=0A=
+ } else {=0A=
+ shader_addline(&buffer, "MAD result.color, =
fragment.color.secondary, specular_enable, %s;\n", final_combiner_src);=0A=
}=0A=
=0A=
/* Footer */=0A=
@@ -2938,6 +2956,7 @@ static void fragment_prog_arbfp(DWORD state, =
IWineD3DStateBlockImpl *stateblock,=0A=
set_bumpmat_arbfp(STATE_TEXTURESTAGE(i, =
WINED3DTSS_BUMPENVMAT00), stateblock, context);=0A=
}=0A=
=
state_texfactor_arbfp(STATE_RENDER(WINED3DRS_TEXTUREFACTOR), stateblock, =
context);=0A=
+ =
state_arb_specularenable(STATE_RENDER(WINED3DRS_SPECULARENABLE), =
stateblock, context);=0A=
}=0A=
}=0A=
=0A=
@@ -3125,6 +3144,7 @@ static const struct StateEntryTemplate =
arbfp_fragmentstate_template[] =3D {=0A=
=
{STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTA=
GE(5, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 =
},=0A=
=
{STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTA=
GE(6, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 =
},=0A=
=
{STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTA=
GE(7, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 =
},=0A=
+ { STATE_RENDER(WINED3DRS_SPECULARENABLE), { =
STATE_RENDER(WINED3DRS_SPECULARENABLE), =
state_arb_specularenable}, 0 },=0A=
{0 /* Terminate */, { 0, =
0 }, 0 =
},=0A=
};=0A=
=0A=
-- =0A=
1.5.6.4=0A=
=0A=
------=_NextPart_000_0005_01C909E0.DBE17540--
More information about the wine-patches
mailing list