--- Raphael <[EMAIL PROTECTED]> wrote: > Hi, > > Changelog: > - defined D3DCOLOR_B macros to access byte values of D3DCOLOR > - use D3DCOLOR macros instead of using shift + masks > - fix a bug where diffuse.lpData checked instead of specular.lpData > - implement color fixup on ARB VShader compilation code: > -> on input parameters using swizzle > -> add is_color parameter on vshader_program_add_param > The input swizzel needs to be an output swizzel because it should be possible to use anything to generate a colour for output and not just the input colours, that should also get around the is_colour problem.
> Todo: > - check shader declaration while compiling VShader to value is_color > parameter (Oliver have you an idea how to do that ?) > - implement a fixup code for drawPrimitiveSlow and VBO unlock I've got some fixup code to go in so that drawStridedSlow doesn't have to be used. Oliver. > > Regards, > Raphael > > ? wined3d.dll.dbg.c > ? wined3d.spec.def > Index: device.c > =================================================================== > RCS file: /home/wine/wine/dlls/wined3d/device.c,v > retrieving revision 1.91 > diff -u -r1.91 device.c > --- device.c 2 Nov 2005 20:01:54 -0000 1.91 > +++ device.c 2 Nov 2005 23:11:55 -0000 > @@ -4598,10 +4598,10 @@ > if (Flags & D3DCLEAR_TARGET) { > TRACE("Clearing screen with glClear to color %lx\n", Color); > glGetFloatv(GL_COLOR_CLEAR_VALUE, old_color_clear_value); > - glClearColor(((Color >> 16) & 0xFF) / 255.0f, > - ((Color >> 8) & 0xFF) / 255.0f, > - ((Color >> 0) & 0xFF) / 255.0f, > - ((Color >> 24) & 0xFF) / 255.0f); > + glClearColor(D3DCOLOR_R(Color), > + D3DCOLOR_G(Color), > + D3DCOLOR_B(Color), > + D3DCOLOR_A(Color)); > checkGLcall("glClearColor"); > > /* Clear ALL colors! */ > Index: drawprim.c > =================================================================== > RCS file: /home/wine/wine/dlls/wined3d/drawprim.c,v > retrieving revision 1.31 > diff -u -r1.31 drawprim.c > --- drawprim.c 11 Oct 2005 20:27:54 -0000 1.31 > +++ drawprim.c 2 Nov 2005 23:11:56 -0000 > @@ -1410,30 +1410,30 @@ > > /* Diffuse -------------------------------- */ > if (sd->u.s.diffuse.lpData != NULL) { > - glColor4ub((diffuseColor >> 16) & 0xFF, > - (diffuseColor >> 8) & 0xFF, > - (diffuseColor >> 0) & 0xFF, > - (diffuseColor >> 24) & 0xFF); > - VTRACE(("glColor4f: r,g,b,a=%f,%f,%f,%f\n", > - ((diffuseColor >> 16) & 0xFF) / 255.0f, > - ((diffuseColor >> 8) & 0xFF) / 255.0f, > - ((diffuseColor >> 0) & 0xFF) / 255.0f, > - ((diffuseColor >> 24) & 0xFF) / 255.0f)); > + glColor4ub(D3DCOLOR_B_R(diffuseColor), > + D3DCOLOR_B_G(diffuseColor), > + D3DCOLOR_B_B(diffuseColor), > + D3DCOLOR_B_A(diffuseColor)); > + VTRACE(("glColor4ub: r,g,b,a=%u,%u,%u,%u\n", > + D3DCOLOR_B_R(diffuseColor), > + D3DCOLOR_B_G(diffuseColor), > + D3DCOLOR_B_B(diffuseColor), > + D3DCOLOR_B_A(diffuseColor))); > } else { > if (vx_index == 0) glColor4f(1.0f, 1.0f, 1.0f, 1.0f); > } > > /* Specular ------------------------------- */ > - if (sd->u.s.diffuse.lpData != NULL) { > - VTRACE(("glSecondaryColor4ub: r,g,b=%f,%f,%f\n", > - ((specularColor >> 16) & 0xFF) / 255.0f, > - ((specularColor >> 8) & 0xFF) / 255.0f, > - ((specularColor >> 0) & 0xFF) / 255.0f)); > + if (sd->u.s.specular.lpData != NULL) { > + VTRACE(("glSecondaryColor4ub: r,g,b=%u,%u,%u\n", > + D3DCOLOR_B_R(specularColor), > + D3DCOLOR_B_G(specularColor), > + D3DCOLOR_B_B(specularColor))); > if (GL_SUPPORT(EXT_SECONDARY_COLOR)) { > GL_EXTCALL(glSecondaryColor3ubEXT)( > - (specularColor >> 16) & 0xFF, > - (specularColor >> 8) & 0xFF, > - (specularColor >> 0) & 0xFF); > + D3DCOLOR_B_R(specularColor), > + D3DCOLOR_B_G(specularColor), > + D3DCOLOR_B_B(specularColor)); > } else { > /* Do not worry if specular colour missing and disable > request */ > VTRACE(("Specular color extensions not supplied\n")); > Index: vertexshader.c > =================================================================== > RCS file: /home/wine/wine/dlls/wined3d/vertexshader.c,v > retrieving revision 1.14 > diff -u -r1.14 vertexshader.c > --- vertexshader.c 27 Oct 2005 10:23:53 -0000 1.14 > +++ vertexshader.c 2 Nov 2005 23:11:57 -0000 > @@ -887,10 +887,70 @@ > return D3DSIO_COMMENT == (token & D3DSI_OPCODE_MASK); > } > > -inline static void vshader_program_add_param(const DWORD param, int input, > char *hwLine, BOOL > namedArrays, CHAR constantsUsedBitmap[]) { > +inline static void vshader_program_add_output_param_swizzle(const DWORD > param, int is_color, > char *hwLine) { > + /** operand output */ > + if ((param & D3DSP_WRITEMASK_ALL) != D3DSP_WRITEMASK_ALL) { > + strcat(hwLine, "."); > + if (param & D3DSP_WRITEMASK_0) { strcat(hwLine, "x"); } > + if (param & D3DSP_WRITEMASK_1) { strcat(hwLine, "y"); } > + if (param & D3DSP_WRITEMASK_2) { strcat(hwLine, "z"); } > + if (param & D3DSP_WRITEMASK_3) { strcat(hwLine, "w"); } > + } > +} > + > +inline static void vshader_program_add_input_param_swizzle(const DWORD > param, int is_color, > char *hwLine) { > + static const char swizzle_reg_chars_color_fix[] = "zyxw"; > + static const char swizzle_reg_chars[] = "xyzw"; > + const char* swizzle_regs = NULL; > + char tmpReg[255]; > + > + /** operand input */ > + DWORD swizzle = (param & D3DVS_SWIZZLE_MASK) >> D3DVS_SWIZZLE_SHIFT; > + DWORD swizzle_x = swizzle & 0x03; > + DWORD swizzle_y = (swizzle >> 2) & 0x03; > + DWORD swizzle_z = (swizzle >> 4) & 0x03; > + DWORD swizzle_w = (swizzle >> 6) & 0x03; > + > + if (is_color) { > + swizzle_regs = swizzle_reg_chars_color_fix; > + } else { > + swizzle_regs = swizzle_reg_chars; > + } > + > + /** > + * swizzle bits fields: > + * WWZZYYXX > + */ > + if ((D3DVS_NOSWIZZLE >> D3DVS_SWIZZLE_SHIFT) == swizzle) { /* > D3DVS_NOSWIZZLE == 0xE4 << > D3DVS_SWIZZLE_SHIFT */ > + if (is_color) { > + sprintf(tmpReg, ".%c%c%c%c", > + swizzle_regs[swizzle_x], > + swizzle_regs[swizzle_y], > + swizzle_regs[swizzle_z], > + swizzle_regs[swizzle_w]); > + strcat(hwLine, tmpReg); > + } > + return ; > + } > + if (swizzle_x == swizzle_y && > + swizzle_x == swizzle_z && > + swizzle_x == swizzle_w) > + { > + sprintf(tmpReg, ".%c", swizzle_regs[swizzle_x]); > + strcat(hwLine, tmpReg); > + } else { > + sprintf(tmpReg, ".%c%c%c%c", > + swizzle_regs[swizzle_x], > + swizzle_regs[swizzle_y], > + swizzle_regs[swizzle_z], > + swizzle_regs[swizzle_w]); > + strcat(hwLine, tmpReg); > + } > +} > + > +inline static void vshader_program_add_param(const DWORD param, int input, > int is_color, char > *hwLine, BOOL namedArrays, CHAR constantsUsedBitmap[]) { > /*static const char* rastout_reg_names[] = { "oPos", "oFog", "oPts" }; */ > static const char* hwrastout_reg_names[] = { "result.position", > "result.fogcoord", > "result.pointsize" }; > - static const char swizzle_reg_chars[] = "xyzw"; > > DWORD reg = param & 0x00001FFF; > DWORD regtype = ((param & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT); > @@ -954,49 +1014,9 @@ > } > > if (!input) { > - /** operand output */ > - if ((param & D3DSP_WRITEMASK_ALL) != D3DSP_WRITEMASK_ALL) { > - strcat(hwLine, "."); > - if (param & D3DSP_WRITEMASK_0) { > - strcat(hwLine, "x"); > - } > - if (param & D3DSP_WRITEMASK_1) { > - strcat(hwLine, "y"); > - } > - if (param & D3DSP_WRITEMASK_2) { > - strcat(hwLine, "z"); > - } > - if (param & D3DSP_WRITEMASK_3) { > - strcat(hwLine, "w"); > - } > - } > + vshader_program_add_output_param_swizzle(param, is_color, hwLine); > } else { > - /** operand input */ > - DWORD swizzle = (param & D3DVS_SWIZZLE_MASK) >> D3DVS_SWIZZLE_SHIFT; > - DWORD swizzle_x = swizzle & 0x03; > - DWORD swizzle_y = (swizzle >> 2) & 0x03; > - DWORD swizzle_z = (swizzle >> 4) & 0x03; > - DWORD swizzle_w = (swizzle >> 6) & 0x03; > - /** > - * swizzle bits fields: > - * WWZZYYXX > - */ > - if ((D3DVS_NOSWIZZLE >> D3DVS_SWIZZLE_SHIFT) != swizzle) { /* ! > D3DVS_NOSWIZZLE == 0xE4 << > D3DVS_SWIZZLE_SHIFT */ > - if (swizzle_x == swizzle_y && > - swizzle_x == swizzle_z && > - swizzle_x == swizzle_w) > - { > - sprintf(tmpReg, ".%c", swizzle_reg_chars[swizzle_x]); > - strcat(hwLine, tmpReg); > - } else { > - sprintf(tmpReg, ".%c%c%c%c", > - swizzle_reg_chars[swizzle_x], > - swizzle_reg_chars[swizzle_y], > - swizzle_reg_chars[swizzle_z], > - swizzle_reg_chars[swizzle_w]); > - strcat(hwLine, tmpReg); > - } > - } > + vshader_program_add_input_param_swizzle(param, is_color, hwLine); > } > } > > @@ -1540,7 +1560,7 @@ > char tmpChar[80]; > ++pToken; > sprintf(tmpLine, "ATTRIB "); > - vshader_program_add_param(*pToken, 0, tmpLine, > This->namedArrays, > This->constantsUsedBitmap); > + vshader_program_add_param(*pToken, 0, 0, tmpLine, > This->namedArrays, > This->constantsUsedBitmap); > sprintf(tmpChar," = %s", attribName); > strcat(tmpLine, tmpChar); > strcat(tmpLine,";\n"); > @@ -1592,12 +1612,12 @@ > } > } > if (curOpcode->num_params > 0) { > - vshader_program_add_param(*pToken, 0, tmpLine, This->namedArrays, > This->constantsUsedBitmap); > + vshader_program_add_param(*pToken, 0, 0, tmpLine, > This->namedArrays, > This->constantsUsedBitmap); > > ++pToken; > for (i = 1; i < curOpcode->num_params; ++i) { > strcat(tmpLine, ","); > - vshader_program_add_param(*pToken, 1, tmpLine, > This->namedArrays, > This->constantsUsedBitmap); > + vshader_program_add_param(*pToken, 1, 0, tmpLine, > This->namedArrays, > This->constantsUsedBitmap); > ++pToken; > } > } > Index: wined3d_private.h > =================================================================== > RCS file: /home/wine/wine/dlls/wined3d/wined3d_private.h,v > retrieving revision 1.67 > diff -u -r1.67 wined3d_private.h > --- wined3d_private.h 29 Oct 2005 10:30:36 -0000 1.67 > +++ wined3d_private.h 2 Nov 2005 23:11:57 -0000 > @@ -161,6 +161,11 @@ > #define GL_EXTCALL(FuncName) (GLINFO_LOCATION.FuncName) > #define GL_VEND(_VendName) (GLINFO_LOCATION.gl_vendor == > VENDOR_##_VendName ? TRUE : > FALSE) > > +#define D3DCOLOR_B_R(dw) (((dw) >> 16) & 0xFF) > +#define D3DCOLOR_B_G(dw) (((dw) >> 8) & 0xFF) > +#define D3DCOLOR_B_B(dw) (((dw) >> 0) & 0xFF) > +#define D3DCOLOR_B_A(dw) (((dw) >> 24) & 0xFF) > + > #define D3DCOLOR_R(dw) (((float) (((dw) >> 16) & 0xFF)) / 255.0f) > #define D3DCOLOR_G(dw) (((float) (((dw) >> 8) & 0xFF)) / 255.0f) > #define D3DCOLOR_B(dw) (((float) (((dw) >> 0) & 0xFF)) / 255.0f) > > > ___________________________________________________________ To help you stay safe and secure online, we've developed the all new Yahoo! Security Centre. http://uk.security.yahoo.com