From c65a86828c82ce305b6891ea01688c664724df42 Mon Sep 17 00:00:00 2001 From: Ivan Gyurdiev Date: Wed, 17 May 2006 02:09:25 -0400 Subject: [PATCH] wined3d: Use COLOROUT/DEPTHOUT for pixel shaders 2.0+. As previously mentioned, RASTOUT is invalid on pixel shaders. On shaders 1.x, r0 is treated as the color output register: http://www.gamedev.net/columns/hardcore/dxshader3/page2.asp That's what we currently do in all cases, change it not to do so for shaders >= 2.0. Support COLOROUT/DEPTHOUT instead. --- dlls/wined3d/pixelshader.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c index b9e06e56d22..d391a8c2c19 100644 --- a/dlls/wined3d/pixelshader.c +++ b/dlls/wined3d/pixelshader.c @@ -745,7 +745,6 @@ CONST SHADER_OPCODE IWineD3DPixelShaderImpl_shader_ins[] = { }; inline static void get_register_name(const DWORD param, char* regstr, char constants[WINED3D_PSHADER_MAX_CONSTANTS]) { - static const char* rastout_reg_names[] = { "oC0", "oC1", "oC2", "oC3", "oDepth" }; DWORD reg = param & D3DSP_REGNUM_MASK; DWORD regtype = shader_get_regtype(param); @@ -770,8 +769,17 @@ inline static void get_register_name(const DWORD param, char* regstr, char const case D3DSPR_TEXTURE: /* case D3DSPR_ADDR: */ sprintf(regstr,"T%lu", reg); break; - case D3DSPR_RASTOUT: - sprintf(regstr, "%s", rastout_reg_names[reg]); + case D3DSPR_COLOROUT: + if (reg == 0) + sprintf(regstr, "result.color"); + else { + /* TODO: See GL_ARB_draw_buffers */ + FIXME("Unsupported write to render target %lu\n", reg); + sprintf(regstr, "unsupported_register"); + } + break; + case D3DSPR_DEPTHOUT: + sprintf(regstr, "result.depth"); break; case D3DSPR_ATTROUT: sprintf(regstr, "oD[%lu]", reg); @@ -1341,8 +1349,8 @@ inline static VOID IWineD3DPixelShaderImpl_GenerateShader( of the pixel shader string for us */ generate_base_shader( (IWineD3DBaseShader*) This, &buffer, pFunction); - /*FIXME: This next line isn't valid for certain pixel shader versions */ - shader_addline(&buffer, "MOV result.color, R0;\n"); + if (This->baseShader.hex_version < D3DPS_VERSION(2,0)) + shader_addline(&buffer, "MOV result.color, R0;\n"); shader_addline(&buffer, "END\n\0"); /* TODO: change to resource.glObjectHandle or something like that */