diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c index 4bb1ee70165..a4301ea5885 100644 --- a/dlls/wined3d/baseshader.c +++ b/dlls/wined3d/baseshader.c @@ -1170,10 +1170,12 @@ static void shader_none_get_caps(WINED3DDEVTYPE devtype, WineD3D_GL_Info *gl_inf pCaps->PixelShaderVersion = 0; pCaps->PixelShader1xMaxValue = 0.0; + if (GL_SUPPORT(NV_REGISTER_COMBINERS)) { + pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_TSSARGTEMP; + } + /* The caps below can be supported but aren't handled yet in utils.c 'd3dta_to_combiner_input', disable them until support is fixed */ #if 0 - if (GL_SUPPORT(NV_REGISTER_COMBINERS)) - pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_TSSARGTEMP; if (GL_SUPPORT(NV_REGISTER_COMBINERS2)) pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_PERSTAGECONSTANT; #endif diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index 8a8a634b15b..4ac182a352c 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -1997,7 +1997,8 @@ static void tex_colorop(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D stateblock->textureState[stage][WINED3DTSS_COLORARG1], stateblock->textureState[stage][WINED3DTSS_COLORARG2], stateblock->textureState[stage][WINED3DTSS_COLORARG0], - mapped_stage); + mapped_stage, + stateblock->textureState[stage][WINED3DTSS_RESULTARG]); /* In register combiners bump mapping is done in the stage AFTER the one that has the bump map operation set, * thus the texture shader may have to be updated @@ -2103,7 +2104,8 @@ static void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D if (GL_SUPPORT(NV_REGISTER_COMBINERS)) { set_tex_op_nvrc((IWineD3DDevice *)stateblock->wineD3DDevice, TRUE, stage, op, arg1, arg2, arg0, - mapped_stage); + mapped_stage, + stateblock->textureState[stage][WINED3DTSS_RESULTARG]); } else { set_tex_op((IWineD3DDevice *)stateblock->wineD3DDevice, TRUE, stage, op, arg1, arg2, arg0); @@ -2457,18 +2459,6 @@ static void tex_bumpenvloffset(DWORD state, IWineD3DStateBlockImpl *stateblock, } } -static void tex_resultarg(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) { - DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / WINED3D_HIGHEST_TEXTURE_STATE; - - if(stage >= GL_LIMITS(texture_stages)) { - return; - } - - if(stateblock->textureState[stage][WINED3DTSS_RESULTARG] != WINED3DTA_CURRENT) { - FIXME("WINED3DTSS_RESULTARG not supported yet\n"); - } -} - static void sampler(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) { DWORD sampler = state - STATE_SAMPLER(0); DWORD mapped_stage = stateblock->wineD3DDevice->texUnitMap[sampler]; @@ -4172,7 +4162,7 @@ const struct StateEntry FFPStateTable[] = { /*0, 25, WINED3DTSS_ADDRESSW */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*0, 26, WINED3DTSS_COLORARG0 */ STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop }, { /*0, 27, WINED3DTSS_ALPHAARG0 */ STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, - { /*0, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), tex_resultarg }, + { /*0, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop }, { /*0, 29, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*0, 30, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*0, 31, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, @@ -4205,7 +4195,7 @@ const struct StateEntry FFPStateTable[] = { /*1, 25, WINED3DTSS_ADDRESSW */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*1, 26, WINED3DTSS_COLORARG0 */ STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop }, { /*1, 27, WINED3DTSS_ALPHAARG0 */ STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, - { /*1, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), tex_resultarg }, + { /*0, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop }, { /*1, 29, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*1, 30, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*1, 31, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, @@ -4238,7 +4228,7 @@ const struct StateEntry FFPStateTable[] = { /*2, 25, WINED3DTSS_ADDRESSW */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*2, 26, WINED3DTSS_COLORARG0 */ STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop }, { /*2, 27, WINED3DTSS_ALPHAARG0 */ STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, - { /*2, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), tex_resultarg }, + { /*0, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop }, { /*2, 29, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*2, 30, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*2, 31, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, @@ -4271,7 +4261,7 @@ const struct StateEntry FFPStateTable[] = { /*3, 25, WINED3DTSS_ADDRESSW */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*3, 26, WINED3DTSS_COLORARG0 */ STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop }, { /*3, 27, WINED3DTSS_ALPHAARG0 */ STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, - { /*3, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), tex_resultarg }, + { /*0, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop }, { /*3, 29, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*3, 30, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*3, 31, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, @@ -4304,7 +4294,7 @@ const struct StateEntry FFPStateTable[] = { /*4, 25, WINED3DTSS_ADDRESSW */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*4, 26, WINED3DTSS_COLORARG0 */ STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop }, { /*4, 27, WINED3DTSS_ALPHAARG0 */ STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, - { /*4, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), tex_resultarg }, + { /*0, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop }, { /*4, 29, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*4, 30, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*4, 31, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, @@ -4337,7 +4327,7 @@ const struct StateEntry FFPStateTable[] = { /*5, 25, WINED3DTSS_ADDRESSW */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*5, 26, WINED3DTSS_COLORARG0 */ STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop }, { /*5, 27, WINED3DTSS_ALPHAARG0 */ STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, - { /*5, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), tex_resultarg }, + { /*0, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop }, { /*5, 29, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*5, 30, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*5, 31, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, @@ -4370,7 +4360,7 @@ const struct StateEntry FFPStateTable[] = { /*6, 25, WINED3DTSS_ADDRESSW */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*6, 26, WINED3DTSS_COLORARG0 */ STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop }, { /*6, 27, WINED3DTSS_ALPHAARG0 */ STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, - { /*6, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), tex_resultarg }, + { /*0, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop }, { /*6, 29, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*6, 30, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*6, 31, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, @@ -4403,7 +4393,7 @@ const struct StateEntry FFPStateTable[] = { /*7, 25, WINED3DTSS_ADDRESSW */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*7, 26, WINED3DTSS_COLORARG0 */ STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop }, { /*7, 27, WINED3DTSS_ALPHAARG0 */ STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, - { /*7, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), tex_resultarg }, + { /*0, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop }, { /*7, 29, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*7, 30, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, { /*7, 31, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined }, diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index f55ca14ed28..c3eab6f2819 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -1125,8 +1125,6 @@ static GLenum d3dta_to_combiner_input(DWORD d3dta, DWORD stage, INT texture_idx) return GL_SECONDARY_COLOR_NV; case WINED3DTA_TEMP: - /* TODO: Support WINED3DTSS_RESULTARG */ - FIXME("WINED3DTA_TEMP, not properly supported.\n"); return GL_SPARE1_NV; case WINED3DTA_CONSTANT: @@ -1182,11 +1180,12 @@ static BOOL is_invalid_op(IWineD3DDeviceImpl *This, int stage, WINED3DTEXTUREOP return FALSE; } -void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3, INT texture_idx) { +void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3, INT texture_idx, DWORD dst) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl*)iface; tex_op_args tex_op_args = {{0}, {0}, {0}}; GLenum portion = is_alpha ? GL_ALPHA : GL_RGB; GLenum target = GL_COMBINER0_NV + stage; + GLenum output; TRACE("stage %d, is_alpha %d, op %s, arg1 %#x, arg2 %#x, arg3 %#x, texture_idx %d\n", stage, is_alpha, debug_d3dtop(op), arg1, arg2, arg3, texture_idx); @@ -1206,6 +1205,12 @@ void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEX &tex_op_args.mapping[2], &tex_op_args.component_usage[2], texture_idx); + if(dst == WINED3DTA_TEMP) { + output = GL_SPARE1_NV; + } else { + output = GL_SPARE0_NV; + } + /* This is called by a state handler which has the gl lock held and a context for the thread */ switch(op) { @@ -1237,7 +1242,7 @@ void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEX GL_ZERO, GL_UNSIGNED_INVERT_NV, portion)); /* Output */ - GL_EXTCALL(glCombinerOutputNV(target, portion, GL_SPARE0_NV, GL_DISCARD_NV, + GL_EXTCALL(glCombinerOutputNV(target, portion, output, GL_DISCARD_NV, GL_DISCARD_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); break; @@ -1252,13 +1257,13 @@ void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEX /* Output */ if (op == WINED3DTOP_MODULATE) { - GL_EXTCALL(glCombinerOutputNV(target, portion, GL_SPARE0_NV, GL_DISCARD_NV, + GL_EXTCALL(glCombinerOutputNV(target, portion, output, GL_DISCARD_NV, GL_DISCARD_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); } else if (op == WINED3DTOP_MODULATE2X) { - GL_EXTCALL(glCombinerOutputNV(target, portion, GL_SPARE0_NV, GL_DISCARD_NV, + GL_EXTCALL(glCombinerOutputNV(target, portion, output, GL_DISCARD_NV, GL_DISCARD_NV, GL_SCALE_BY_TWO_NV, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); } else if (op == WINED3DTOP_MODULATE4X) { - GL_EXTCALL(glCombinerOutputNV(target, portion, GL_SPARE0_NV, GL_DISCARD_NV, + GL_EXTCALL(glCombinerOutputNV(target, portion, output, GL_DISCARD_NV, GL_DISCARD_NV, GL_SCALE_BY_FOUR_NV, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); } break; @@ -1279,13 +1284,13 @@ void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEX /* Output */ if (op == WINED3DTOP_ADD) { GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV, - GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); + output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); } else if (op == WINED3DTOP_ADDSIGNED) { GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV, - GL_SPARE0_NV, GL_NONE, GL_BIAS_BY_NEGATIVE_ONE_HALF_NV, GL_FALSE, GL_FALSE, GL_FALSE)); + output, GL_NONE, GL_BIAS_BY_NEGATIVE_ONE_HALF_NV, GL_FALSE, GL_FALSE, GL_FALSE)); } else if (op == WINED3DTOP_ADDSIGNED2X) { GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV, - GL_SPARE0_NV, GL_SCALE_BY_TWO_NV, GL_BIAS_BY_NEGATIVE_ONE_HALF_NV, GL_FALSE, GL_FALSE, GL_FALSE)); + output, GL_SCALE_BY_TWO_NV, GL_BIAS_BY_NEGATIVE_ONE_HALF_NV, GL_FALSE, GL_FALSE, GL_FALSE)); } break; @@ -1302,7 +1307,7 @@ void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEX /* Output */ GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV, - GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); + output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); break; case WINED3DTOP_ADDSMOOTH: @@ -1318,7 +1323,7 @@ void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEX /* Output */ GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV, - GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); + output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); break; case WINED3DTOP_BLENDDIFFUSEALPHA: @@ -1353,7 +1358,7 @@ void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEX /* Output */ GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV, - GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); + output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); break; } @@ -1371,7 +1376,7 @@ void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEX /* Output */ GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV, - GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); + output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); break; case WINED3DTOP_MODULATECOLOR_ADDALPHA: @@ -1388,7 +1393,7 @@ void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEX /* Output */ GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV, - GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); + output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); break; case WINED3DTOP_MODULATEINVALPHA_ADDCOLOR: @@ -1405,7 +1410,7 @@ void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEX /* Output */ GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV, - GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); + output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); break; case WINED3DTOP_MODULATEINVCOLOR_ADDALPHA: @@ -1422,7 +1427,7 @@ void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEX /* Output */ GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV, - GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); + output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); break; case WINED3DTOP_DOTPRODUCT3: @@ -1434,7 +1439,7 @@ void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEX tex_op_args.input[1], GL_EXPAND_NORMAL_NV, tex_op_args.component_usage[1])); /* Output */ - GL_EXTCALL(glCombinerOutputNV(target, portion, GL_SPARE0_NV, GL_DISCARD_NV, + GL_EXTCALL(glCombinerOutputNV(target, portion, output, GL_DISCARD_NV, GL_DISCARD_NV, GL_NONE, GL_NONE, GL_TRUE, GL_FALSE, GL_FALSE)); break; @@ -1451,7 +1456,7 @@ void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEX /* Output */ GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV, - GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); + output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); break; case WINED3DTOP_LERP: @@ -1467,7 +1472,7 @@ void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEX /* Output */ GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV, - GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); + output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); break; case WINED3DTOP_BUMPENVMAPLUMINANCE: @@ -1482,6 +1487,7 @@ void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEX tex_op_args.input[1], tex_op_args.mapping[1], tex_op_args.component_usage[1])); GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_B_NV, GL_ZERO, GL_UNSIGNED_INVERT_NV, portion)); + /* Always pass through to CURRENT, ignore temp arg */ GL_EXTCALL(glCombinerOutputNV(target, portion, GL_SPARE0_NV, GL_DISCARD_NV, GL_DISCARD_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE)); break; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 0044bab57f6..fac54331fb8 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1723,7 +1723,7 @@ const char *debug_d3ddegree(WINED3DDEGREETYPE order); GLenum StencilOp(DWORD op); GLenum CompareFunc(DWORD func); void set_tex_op(IWineD3DDevice *iface, BOOL isAlpha, int Stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3); -void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3, INT texture_idx); +void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3, INT texture_idx, DWORD dst); void set_texture_matrix(const float *smat, DWORD flags, BOOL calculatedCoords, BOOL transformed, DWORD coordtype); void surface_set_compatible_renderbuffer(IWineD3DSurface *iface, unsigned int width, unsigned int height);