PATCH: dlls/d3d8 strict aliasing
Marcus Meissner
marcus at jet.franken.de
Sun Apr 25 07:40:31 CDT 2004
Hi
I know it is futile, but this fixes some strict aliasing issues in
the dlls/d3d8 subdir.
Ciao, Marcus
Changelog:
Fixed some strict aliasing issues in dlls/d3d8.
Incorporated bugfix from Christian Costa in vshader_expp.
Index: dlls/d3d8/device.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/device.c,v
retrieving revision 1.102
diff -u -r1.102 device.c
--- dlls/d3d8/device.c 19 Apr 2004 23:04:58 -0000 1.102
+++ dlls/d3d8/device.c 25 Apr 2004 12:38:37 -0000
@@ -2184,6 +2184,10 @@
return D3D_OK;
}
HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3DRENDERSTATETYPE State,DWORD Value) {
+ union {
+ DWORD d;
+ float f;
+ } tmpvalue;
ICOM_THIS(IDirect3DDevice8Impl,iface);
DWORD OldValue = This->StateBlock->renderstate[State];
@@ -2721,26 +2725,26 @@
case D3DRS_FOGSTART :
{
- float *f = (float*) &Value;
- glFogfv(GL_FOG_START, f);
+ tmpvalue.d = Value;
+ glFogfv(GL_FOG_START, &tmpvalue.f);
checkGLcall("glFogf(GL_FOG_START, (float) Value)");
- TRACE("Fog Start == %f\n", *f);
+ TRACE("Fog Start == %f\n", tmpvalue.f);
}
break;
case D3DRS_FOGEND :
{
- float *f = (float*) &Value;
- glFogfv(GL_FOG_END, f);
+ tmpvalue.d = Value;
+ glFogfv(GL_FOG_END, &tmpvalue.f);
checkGLcall("glFogf(GL_FOG_END, (float) Value)");
- TRACE("Fog End == %f\n", *f);
+ TRACE("Fog End == %f\n", tmpvalue.f);
}
break;
case D3DRS_FOGDENSITY :
{
- float *f = (float*) &Value;
- glFogfv(GL_FOG_DENSITY, f);
+ tmpvalue.d = Value;
+ glFogfv(GL_FOG_DENSITY, &tmpvalue.f);
checkGLcall("glFogf(GL_FOG_DENSITY, (float) Value)");
}
break;
@@ -2754,7 +2758,8 @@
case D3DRS_TWEENFACTOR :
{
- This->UpdateStateBlock->tween_factor = *((float*) &Value);
+ tmpvalue.d = Value;
+ This->UpdateStateBlock->tween_factor = tmpvalue.f;
TRACE("Vertex Blending Tween Factor to %f\n", This->UpdateStateBlock->tween_factor);
}
break;
@@ -2811,11 +2816,16 @@
case D3DRS_LINEPATTERN :
{
- D3DLINEPATTERN *pattern = (D3DLINEPATTERN *)&Value;
- TRACE("Line pattern: repeat %d bits %x\n", pattern->wRepeatFactor, pattern->wLinePattern);
+ union {
+ DWORD d;
+ D3DLINEPATTERN lp;
+ } tmppattern;
+ tmppattern.d = Value;
- if (pattern->wRepeatFactor) {
- glLineStipple(pattern->wRepeatFactor, pattern->wLinePattern);
+ TRACE("Line pattern: repeat %d bits %x\n", tmppattern.lp.wRepeatFactor, tmppattern.lp.wLinePattern);
+
+ if (tmppattern.lp.wRepeatFactor) {
+ glLineStipple(tmppattern.lp.wRepeatFactor, tmppattern.lp.wLinePattern);
checkGLcall("glLineStipple(repeat, linepattern)");
glEnable(GL_LINE_STIPPLE);
checkGLcall("glEnable(GL_LINE_STIPPLE);");
@@ -2829,8 +2839,9 @@
case D3DRS_ZBIAS :
{
if (Value) {
- TRACE("ZBias value %f\n", *((float*)&Value));
- glPolygonOffset(0, -*((float*)&Value));
+ tmpvalue.d = Value;
+ TRACE("ZBias value %f\n", tmpvalue.f);
+ glPolygonOffset(0, -tmpvalue.f);
checkGLcall("glPolygonOffset(0, -Value)");
glEnable(GL_POLYGON_OFFSET_FILL);
checkGLcall("glEnable(GL_POLYGON_OFFSET_FILL);");
@@ -2860,14 +2871,16 @@
break;
case D3DRS_POINTSIZE :
- TRACE("Set point size to %f\n", *((float*)&Value));
- glPointSize(*((float*)&Value));
+ tmpvalue.d = Value;
+ TRACE("Set point size to %f\n", tmpvalue.f);
+ glPointSize(tmpvalue.f);
checkGLcall("glPointSize(...);");
break;
case D3DRS_POINTSIZE_MIN :
if (GL_SUPPORT(EXT_POINT_PARAMETERS)) {
- GL_EXTCALL(glPointParameterfEXT)(GL_POINT_SIZE_MIN_EXT, *((float*)&Value));
+ tmpvalue.d = Value;
+ GL_EXTCALL(glPointParameterfEXT)(GL_POINT_SIZE_MIN_EXT, tmpvalue.f);
checkGLcall("glPointParameterfEXT(...);");
} else {
FIXME("D3DRS_POINTSIZE_MIN not supported on this opengl\n");
@@ -2876,7 +2889,8 @@
case D3DRS_POINTSIZE_MAX :
if (GL_SUPPORT(EXT_POINT_PARAMETERS)) {
- GL_EXTCALL(glPointParameterfEXT)(GL_POINT_SIZE_MAX_EXT, *((float*)&Value));
+ tmpvalue.d = Value;
+ GL_EXTCALL(glPointParameterfEXT)(GL_POINT_SIZE_MAX_EXT, tmpvalue.f);
checkGLcall("glPointParameterfEXT(...);");
} else {
FIXME("D3DRS_POINTSIZE_MAX not supported on this opengl\n");
@@ -3182,6 +3196,10 @@
HRESULT WINAPI IDirect3DDevice8Impl_SetTextureStageState(LPDIRECT3DDEVICE8 iface, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
+ union {
+ float f;
+ DWORD d;
+ } tmpvalue;
/* FIXME: Handle 3d textures? What if TSS value set before set texture? Need to reapply all values? */
@@ -3354,10 +3372,10 @@
case D3DTSS_MIPMAPLODBIAS :
{
if (GL_SUPPORT(EXT_TEXTURE_LOD_BIAS)) {
- float f = *(float*) &Value;
+ tmpvalue.d = Value;
glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT,
GL_TEXTURE_LOD_BIAS_EXT,
- f);
+ tmpvalue.f);
checkGLcall("glTexEnvi GL_TEXTURE_LOD_BIAS_EXT ...");
}
}
Index: dlls/d3d8/shader.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/shader.c,v
retrieving revision 1.23
diff -u -r1.23 shader.c
--- dlls/d3d8/shader.c 23 Apr 2004 21:28:02 -0000 1.23
+++ dlls/d3d8/shader.c 25 Apr 2004 12:38:38 -0000
@@ -125,14 +125,18 @@
}
void vshader_expp(D3DSHADERVECTOR* d, D3DSHADERVECTOR* s0) {
- float tmp_f = floorf(s0->w);
- DWORD tmp_d = 0;
- tmp_f = powf(2.0f, s0->w);
- tmp_d = *((DWORD*) &tmp_f) & 0xFFFFFF00;
+ union {
+ float f;
+ DWORD d;
+ } tmp;
- d->x = powf(2.0f, tmp_f);
- d->y = s0->w - tmp_f;
- d->z = *((float*) &tmp_d);
+ tmp.f = floorf(s0->w);
+ d->x = powf(2.0f, tmp.f);
+ d->y = s0->w - tmp.f;
+
+ tmp.f = powf(2.0f, s0->w);
+ tmp.d &= 0xFFFFFF00U;
+ d->z = tmp.f;
d->w = 1.0f;
VSTRACE(("executing exp: s0=(%f, %f, %f, %f) => d=(%f, %f, %f, %f)\n",
s0->x, s0->y, s0->z, s0->w, d->x, d->y, d->z, d->w));
Index: dlls/d3d8/stateblock.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/stateblock.c,v
retrieving revision 1.14
diff -u -r1.14 stateblock.c
--- dlls/d3d8/stateblock.c 6 Jan 2004 22:08:34 -0000 1.14
+++ dlls/d3d8/stateblock.c 25 Apr 2004 12:38:39 -0000
@@ -54,10 +54,16 @@
};
HRESULT WINAPI IDirect3DDeviceImpl_InitStartupStateBlock(IDirect3DDevice8Impl* This) {
- D3DLINEPATTERN lp;
+ union {
+ D3DLINEPATTERN lp;
+ DWORD d;
+ } lp;
+ union {
+ float f;
+ DWORD d;
+ } tmpfloat;
int i;
int j;
- float tmpfloat = 0.0f;
LPDIRECT3DDEVICE8 iface = (LPDIRECT3DDEVICE8) This;
/* Note this may have a large overhead but it should only be executed
@@ -81,7 +87,9 @@
}
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_FILLMODE, D3DFILL_SOLID);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
- lp.wRepeatFactor = 0; lp.wLinePattern = 0; IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_LINEPATTERN, *(DWORD *)&lp);
+
+ lp.lp.wRepeatFactor = 0; lp.lp.wLinePattern = 0;
+ IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_LINEPATTERN, lp.d);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_ZWRITEENABLE, TRUE);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_ALPHATESTENABLE, FALSE);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_LASTPIXEL, TRUE);
@@ -98,9 +106,12 @@
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_ZVISIBLE, 0);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_FOGCOLOR, 0);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_FOGTABLEMODE, D3DFOG_NONE);
- tmpfloat = 0.0f; IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_FOGSTART, *((DWORD *)&tmpfloat));
- tmpfloat = 1.0f; IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_FOGEND, *((DWORD *)&tmpfloat));
- tmpfloat = 1.0f; IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_FOGDENSITY, *((DWORD *)&tmpfloat));
+ tmpfloat.f = 0.0f;
+ IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_FOGSTART, tmpfloat.d);
+ tmpfloat.f = 1.0f;
+ IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_FOGEND, tmpfloat.d);
+ tmpfloat.f = 1.0f;
+ IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_FOGDENSITY, tmpfloat.d);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_EDGEANTIALIAS, FALSE);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_ZBIAS, 0);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_RANGEFOGENABLE, FALSE);
@@ -142,8 +153,10 @@
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_VERTEXBLEND, D3DVBF_DISABLE);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_CLIPPLANEENABLE, 0);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_SOFTWAREVERTEXPROCESSING, FALSE);
- tmpfloat = 1.0f; IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_POINTSIZE, *((DWORD *)&tmpfloat));
- tmpfloat = 0.0f; IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_POINTSIZE_MIN, *((DWORD *)&tmpfloat));
+ tmpfloat.f = 1.0f;
+ IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_POINTSIZE, tmpfloat.d);
+ tmpfloat.f = 0.0f;
+ IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_POINTSIZE_MIN, tmpfloat.d);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_POINTSPRITEENABLE, FALSE);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_POINTSCALEENABLE, FALSE);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_POINTSCALE_A, TRUE);
@@ -152,12 +165,15 @@
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_MULTISAMPLEANTIALIAS, TRUE);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_MULTISAMPLEMASK, 0xFFFFFFFF);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_PATCHEDGESTYLE, D3DPATCHEDGE_DISCRETE);
- tmpfloat = 1.0f; IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_PATCHSEGMENTS, *((DWORD *)&tmpfloat));
+ tmpfloat.f = 1.0f;
+ IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_PATCHSEGMENTS, tmpfloat.d);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_DEBUGMONITORTOKEN, D3DDMT_DISABLE);
- tmpfloat = 64.0f; IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_POINTSIZE_MAX, (DWORD) *((DWORD *)&tmpfloat));
+ tmpfloat.f = 64.0f;
+ IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_POINTSIZE_MAX, tmpfloat.d);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_INDEXEDVERTEXBLENDENABLE, FALSE);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_COLORWRITEENABLE, 0x0000000F);
- tmpfloat = 0.0f; IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_TWEENFACTOR, (DWORD) *((DWORD *)&tmpfloat));
+ tmpfloat.f = 0.0f;
+ IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_TWEENFACTOR, tmpfloat.d);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_BLENDOP, D3DBLENDOP_ADD);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_POSITIONORDER, D3DORDER_CUBIC);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_NORMALORDER, D3DORDER_LINEAR);
Index: dlls/d3d8/surface.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/surface.c,v
retrieving revision 1.29
diff -u -r1.29 surface.c
--- dlls/d3d8/surface.c 6 Jan 2004 22:08:34 -0000 1.29
+++ dlls/d3d8/surface.c 25 Apr 2004 12:38:39 -0000
@@ -263,7 +263,7 @@
/** Dirtify Container if needed */
if (NULL != This->Container) {
IDirect3DBaseTexture8* cont = NULL;
- hr = IUnknown_QueryInterface(This->Container, &IID_IDirect3DBaseTexture8, (void**) &cont);
+ hr = IUnknown_QueryInterface(This->Container, &IID_IDirect3DBaseTexture8, (void**)(char*) &cont);
if (SUCCEEDED(hr) && NULL != cont) {
IDirect3DBaseTexture8Impl_SetDirty(cont, TRUE);
--
More information about the wine-patches
mailing list