- 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
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 25ccb04..cc4c58d 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -4601,10 +4601,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! */
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index 64ddd89..ca1e8d7 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -1416,30 +1416,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"));
diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c
index bdd8bf1..226c5bb 100644
--- a/dlls/wined3d/vertexshader.c
+++ b/dlls/wined3d/vertexshader.c
@@ -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;
}
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 65c59f5..9967e6f 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -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)