[wined3d] D3DCOLOR fixup begin
Oliver Stieber
oliver_stieber at yahoo.co.uk
Thu Nov 3 11:21:46 CST 2005
--- Raphael <fenix at club-internet.fr> 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
More information about the wine-devel
mailing list