[PATCH] WineD3D: Use C bitfields to compact the ffp description=0A=
Stefan Doesinger
stefan at codeweavers.com
Wed Jul 30 09:47:29 CDT 2008
=0A=
---=0A=
dlls/wined3d/ati_fragment_shader.c | 4 +-=0A=
dlls/wined3d/utils.c | 112 =
+++++++++++++++++++++++-------------=0A=
dlls/wined3d/wined3d_private.h | 33 ++++++++---=0A=
3 files changed, 98 insertions(+), 51 deletions(-)=0A=
=0A=
diff --git a/dlls/wined3d/ati_fragment_shader.c =
b/dlls/wined3d/ati_fragment_shader.c=0A=
index eb7837f..6dc0193 100644=0A=
--- a/dlls/wined3d/ati_fragment_shader.c=0A=
+++ b/dlls/wined3d/ati_fragment_shader.c=0A=
@@ -226,7 +226,7 @@ static GLuint find_tmpreg(struct texture_stage_op =
op[MAX_TEXTURES]) {=0A=
lowest_read =3D i;=0A=
}=0A=
=0A=
- if(lowest_write =3D=3D -1 && op[i].dst =3D=3D WINED3DTA_TEMP) {=0A=
+ if(lowest_write =3D=3D -1 && op[i].dst =3D=3D tempreg) {=0A=
lowest_write =3D i;=0A=
}=0A=
=0A=
@@ -418,7 +418,7 @@ static GLuint gen_ati_shader(struct texture_stage_op =
op[MAX_TEXTURES], WineD3D_G=0A=
break;=0A=
}=0A=
=0A=
- if(op[stage].dst =3D=3D WINED3DTA_TEMP) {=0A=
+ if(op[stage].dst =3D=3D tempreg) {=0A=
/* If we're writing to D3DTA_TEMP, but never reading from =
it we don't have to write there in the first place.=0A=
* skip the entire stage, this saves some GPU time=0A=
*/=0A=
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c=0A=
index cbcaa17..e8a854d 100644=0A=
--- a/dlls/wined3d/utils.c=0A=
+++ b/dlls/wined3d/utils.c=0A=
@@ -1785,6 +1785,7 @@ void gen_ffp_op(IWineD3DStateBlockImpl =
*stateblock, struct ffp_settings *setting=0A=
};=0A=
unsigned int i;=0A=
DWORD ttff;=0A=
+ DWORD cop, aop, carg0, carg1, carg2, aarg0, aarg1, aarg2;=0A=
=0A=
for(i =3D 0; i < GL_LIMITS(texture_stages); i++) {=0A=
IWineD3DBaseTextureImpl *texture;=0A=
@@ -1794,7 +1795,7 @@ void gen_ffp_op(IWineD3DStateBlockImpl =
*stateblock, struct ffp_settings *setting=0A=
settings->op[i].carg0 =3D settings->op[i].carg1 =3D =
settings->op[i].carg2 =3D 0xffffffff;=0A=
settings->op[i].aarg0 =3D settings->op[i].aarg1 =3D =
settings->op[i].aarg2 =3D 0xffffffff;=0A=
settings->op[i].color_correction =3D WINED3DFMT_UNKNOWN;=0A=
- settings->op[i].dst =3D 0xffffffff;=0A=
+ settings->op[i].dst =3D resultreg;=0A=
i++;=0A=
break;=0A=
}=0A=
@@ -1803,41 +1804,51 @@ void gen_ffp_op(IWineD3DStateBlockImpl =
*stateblock, struct ffp_settings *setting=0A=
if(texture) {=0A=
settings->op[i].color_correction =3D =
texture->baseTexture.shader_conversion_group;=0A=
if(ignore_textype) {=0A=
- settings->op[i].tex_type =3D 0;=0A=
+ settings->op[i].tex_type =3D tex_1d;=0A=
} else {=0A=
- settings->op[i].tex_type =3D =
stateblock->textureDimensions[i];=0A=
+ switch(stateblock->textureDimensions[i]) {=0A=
+ case GL_TEXTURE_1D:=0A=
+ settings->op[i].tex_type =3D tex_1d;=0A=
+ break;=0A=
+ case GL_TEXTURE_2D:=0A=
+ settings->op[i].tex_type =3D tex_2d;=0A=
+ break;=0A=
+ case GL_TEXTURE_3D:=0A=
+ settings->op[i].tex_type =3D tex_3d;=0A=
+ break;=0A=
+ case GL_TEXTURE_CUBE_MAP_ARB:=0A=
+ settings->op[i].tex_type =3D tex_cube;=0A=
+ break;=0A=
+ case GL_TEXTURE_RECTANGLE_ARB:=0A=
+ settings->op[i].tex_type =3D tex_rect;=0A=
+ break;=0A=
+ }=0A=
}=0A=
} else {=0A=
settings->op[i].color_correction =3D WINED3DFMT_UNKNOWN;=0A=
- settings->op[i].tex_type =3D 0;=0A=
+ settings->op[i].tex_type =3D tex_1d;=0A=
}=0A=
=0A=
- settings->op[i].cop =3D =
stateblock->textureState[i][WINED3DTSS_COLOROP];=0A=
- settings->op[i].aop =3D =
stateblock->textureState[i][WINED3DTSS_ALPHAOP];=0A=
+ cop =3D stateblock->textureState[i][WINED3DTSS_COLOROP];=0A=
+ aop =3D stateblock->textureState[i][WINED3DTSS_ALPHAOP];=0A=
=0A=
- settings->op[i].carg1 =3D (args[settings->op[i].cop] & ARG1) ? =
stateblock->textureState[i][WINED3DTSS_COLORARG1] : 0xffffffff;=0A=
- settings->op[i].carg2 =3D (args[settings->op[i].cop] & ARG2) ? =
stateblock->textureState[i][WINED3DTSS_COLORARG2] : 0xffffffff;=0A=
- settings->op[i].carg0 =3D (args[settings->op[i].cop] & ARG0) ? =
stateblock->textureState[i][WINED3DTSS_COLORARG0] : 0xffffffff;=0A=
+ carg1 =3D (args[cop] & ARG1) ? =
stateblock->textureState[i][WINED3DTSS_COLORARG1] : 0xffffffff;=0A=
+ carg2 =3D (args[cop] & ARG2) ? =
stateblock->textureState[i][WINED3DTSS_COLORARG2] : 0xffffffff;=0A=
+ carg0 =3D (args[cop] & ARG0) ? =
stateblock->textureState[i][WINED3DTSS_COLORARG0] : 0xffffffff;=0A=
=0A=
- if(is_invalid_op(stateblock->wineD3DDevice, =
i,settings->op[i].cop,=0A=
- settings->op[i].carg1, settings->op[i].carg2, =
settings->op[i].carg0)) {=0A=
- settings->op[i].carg0 =3D 0xffffffff;=0A=
- settings->op[i].carg2 =3D 0xffffffff;=0A=
- settings->op[i].carg1 =3D WINED3DTA_CURRENT;=0A=
- settings->op[i].cop =3D WINED3DTOP_SELECTARG1;=0A=
+ if(is_invalid_op(stateblock->wineD3DDevice, i, cop,=0A=
+ carg1, carg2, carg0)) {=0A=
+ carg0 =3D 0xffffffff;=0A=
+ carg2 =3D 0xffffffff;=0A=
+ carg1 =3D WINED3DTA_CURRENT;=0A=
+ cop =3D WINED3DTOP_SELECTARG1;=0A=
}=0A=
=0A=
- settings->op[i].aarg1 =3D (args[settings->op[i].aop] & ARG1) ? =
stateblock->textureState[i][WINED3DTSS_ALPHAARG1] : 0xffffffff;=0A=
- settings->op[i].aarg2 =3D (args[settings->op[i].aop] & ARG2) ? =
stateblock->textureState[i][WINED3DTSS_ALPHAARG2] : 0xffffffff;=0A=
- settings->op[i].aarg0 =3D (args[settings->op[i].aop] & ARG0) ? =
stateblock->textureState[i][WINED3DTSS_ALPHAARG0] : 0xffffffff;=0A=
-=0A=
- if(is_invalid_op(stateblock->wineD3DDevice, i, =
settings->op[i].aop,=0A=
- settings->op[i].aarg1, settings->op[i].aarg2, =
settings->op[i].aarg0)) {=0A=
- settings->op[i].aarg0 =3D 0xffffffff;=0A=
- settings->op[i].aarg2 =3D 0xffffffff;=0A=
- settings->op[i].aarg1 =3D WINED3DTA_CURRENT;=0A=
- settings->op[i].aop =3D WINED3DTOP_SELECTARG1;=0A=
- } else if(i =3D=3D 0 && stateblock->textures[0] &&=0A=
+ aarg1 =3D (args[aop] & ARG1) ? =
stateblock->textureState[i][WINED3DTSS_ALPHAARG1] : 0xffffffff;=0A=
+ aarg2 =3D (args[aop] & ARG2) ? =
stateblock->textureState[i][WINED3DTSS_ALPHAARG2] : 0xffffffff;=0A=
+ aarg0 =3D (args[aop] & ARG0) ? =
stateblock->textureState[i][WINED3DTSS_ALPHAARG0] : 0xffffffff;=0A=
+=0A=
+ if(i =3D=3D 0 && stateblock->textures[0] &&=0A=
stateblock->renderState[WINED3DRS_COLORKEYENABLE] &&=0A=
(stateblock->textureDimensions[0] =3D=3D GL_TEXTURE_2D =
||=0A=
stateblock->textureDimensions[0] =3D=3D =
GL_TEXTURE_RECTANGLE_ARB)) {=0A=
@@ -1846,29 +1857,37 @@ void gen_ffp_op(IWineD3DStateBlockImpl =
*stateblock, struct ffp_settings *setting=0A=
if(surf->CKeyFlags & WINEDDSD_CKSRCBLT &&=0A=
getFormatDescEntry(surf->resource.format, NULL, =
NULL)->alphaMask =3D=3D 0x00000000) {=0A=
=0A=
- if(settings->op[0].aop =3D=3D WINED3DTOP_DISABLE) {=0A=
- settings->op[0].aarg1 =3D WINED3DTA_TEXTURE;=0A=
- settings->op[0].aop =3D WINED3DTOP_SELECTARG1;=0A=
+ if(aop =3D=3D WINED3DTOP_DISABLE) {=0A=
+ aarg1 =3D WINED3DTA_TEXTURE;=0A=
+ aop =3D WINED3DTOP_SELECTARG1;=0A=
}=0A=
- else if(settings->op[0].aop =3D=3D =
WINED3DTOP_SELECTARG1 && settings->op[0].aarg1 !=3D WINED3DTA_TEXTURE) {=0A=
+ else if(aop =3D=3D WINED3DTOP_SELECTARG1 && aarg1 !=3D =
WINED3DTA_TEXTURE) {=0A=
if =
(stateblock->renderState[WINED3DRS_ALPHABLENDENABLE]) {=0A=
- settings->op[0].aarg2 =3D WINED3DTA_TEXTURE;=0A=
- settings->op[0].aop =3D WINED3DTOP_MODULATE;=0A=
+ aarg2 =3D WINED3DTA_TEXTURE;=0A=
+ aop =3D WINED3DTOP_MODULATE;=0A=
}=0A=
- else settings->op[0].aarg1 =3D WINED3DTA_TEXTURE;=0A=
+ else aarg1 =3D WINED3DTA_TEXTURE;=0A=
}=0A=
- else if(settings->op[0].aop =3D=3D =
WINED3DTOP_SELECTARG2 && settings->op[0].aarg2 !=3D WINED3DTA_TEXTURE) {=0A=
+ else if(aop =3D=3D WINED3DTOP_SELECTARG2 && aarg2 !=3D =
WINED3DTA_TEXTURE) {=0A=
if =
(stateblock->renderState[WINED3DRS_ALPHABLENDENABLE]) {=0A=
- settings->op[0].aarg1 =3D WINED3DTA_TEXTURE;=0A=
- settings->op[0].aop =3D WINED3DTOP_MODULATE;=0A=
+ aarg1 =3D WINED3DTA_TEXTURE;=0A=
+ aop =3D WINED3DTOP_MODULATE;=0A=
}=0A=
- else settings->op[0].aarg2 =3D WINED3DTA_TEXTURE;=0A=
+ else aarg2 =3D WINED3DTA_TEXTURE;=0A=
}=0A=
}=0A=
}=0A=
=0A=
- if(settings->op[i].carg1 =3D=3D WINED3DTA_TEXTURE || =
settings->op[i].carg2 =3D=3D WINED3DTA_TEXTURE || settings->op[i].carg0 =
=3D=3D WINED3DTA_TEXTURE ||=0A=
- settings->op[i].aarg1 =3D=3D WINED3DTA_TEXTURE || =
settings->op[i].aarg2 =3D=3D WINED3DTA_TEXTURE || settings->op[i].aarg0 =
=3D=3D WINED3DTA_TEXTURE) {=0A=
+ if(is_invalid_op(stateblock->wineD3DDevice, i, aop,=0A=
+ aarg1, aarg2, aarg0)) {=0A=
+ aarg0 =3D 0xffffffff;=0A=
+ aarg2 =3D 0xffffffff;=0A=
+ aarg1 =3D WINED3DTA_CURRENT;=0A=
+ aop =3D WINED3DTOP_SELECTARG1;=0A=
+ }=0A=
+=0A=
+ if(carg1 =3D=3D WINED3DTA_TEXTURE || carg2 =3D=3D =
WINED3DTA_TEXTURE || carg0 =3D=3D WINED3DTA_TEXTURE ||=0A=
+ aarg1 =3D=3D WINED3DTA_TEXTURE || aarg2 =3D=3D =
WINED3DTA_TEXTURE || aarg0 =3D=3D WINED3DTA_TEXTURE) {=0A=
ttff =3D =
stateblock->textureState[i][WINED3DTSS_TEXTURETRANSFORMFLAGS];=0A=
if(ttff =3D=3D (WINED3DTTFF_PROJECTED | =
WINED3DTTFF_COUNT3)) {=0A=
settings->op[i].projected =3D proj_count3;=0A=
@@ -1881,7 +1900,20 @@ void gen_ffp_op(IWineD3DStateBlockImpl =
*stateblock, struct ffp_settings *setting=0A=
settings->op[i].projected =3D proj_none;=0A=
}=0A=
=0A=
- settings->op[i].dst =3D =
stateblock->textureState[i][WINED3DTSS_RESULTARG];=0A=
+ settings->op[i].cop =3D cop;=0A=
+ settings->op[i].aop =3D aop;=0A=
+ settings->op[i].carg0 =3D carg0;=0A=
+ settings->op[i].carg1 =3D carg1;=0A=
+ settings->op[i].carg2 =3D carg2;=0A=
+ settings->op[i].aarg0 =3D aarg0;=0A=
+ settings->op[i].aarg1 =3D aarg1;=0A=
+ settings->op[i].aarg2 =3D aarg2;=0A=
+=0A=
+ if(stateblock->textureState[i][WINED3DTSS_RESULTARG] =3D=3D =
WINED3DTA_TEMP) {=0A=
+ settings->op[i].dst =3D tempreg;=0A=
+ } else {=0A=
+ settings->op[i].dst =3D resultreg;=0A=
+ }=0A=
}=0A=
=0A=
/* Clear unsupported stages */=0A=
diff --git a/dlls/wined3d/wined3d_private.h =
b/dlls/wined3d/wined3d_private.h=0A=
index e86bb1e..66e5a32 100644=0A=
--- a/dlls/wined3d/wined3d_private.h=0A=
+++ b/dlls/wined3d/wined3d_private.h=0A=
@@ -714,9 +714,24 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl =
*This, struct WineD3DRectPatch *p=0A=
=0A=
enum projection_types=0A=
{=0A=
- proj_none,=0A=
- proj_count3,=0A=
- proj_count4=0A=
+ proj_none =3D 0,=0A=
+ proj_count3 =3D 1,=0A=
+ proj_count4 =3D 2=0A=
+};=0A=
+=0A=
+enum tex_types=0A=
+{=0A=
+ tex_1d =3D 0,=0A=
+ tex_2d =3D 1,=0A=
+ tex_3d =3D 2,=0A=
+ tex_cube =3D 3,=0A=
+ tex_rect =3D 4=0A=
+};=0A=
+=0A=
+enum dst_arg=0A=
+{=0A=
+ resultreg =3D 0,=0A=
+ tempreg =3D 1=0A=
};=0A=
=0A=
=
/************************************************************************=
*****=0A=
@@ -724,13 +739,13 @@ enum projection_types=0A=
*/=0A=
struct texture_stage_op=0A=
{=0A=
- WINED3DTEXTUREOP cop, aop;=0A=
- DWORD carg1, carg2, carg0;=0A=
- DWORD aarg1, aarg2, aarg0;=0A=
+ unsigned cop : 5, aop : 5;=0A=
+ unsigned carg1 : 6, carg2 : 6, carg0 : 6;=0A=
+ unsigned tex_type : 3;=0A=
+ unsigned dst : 1;=0A=
+ unsigned aarg1 : 6, aarg2 : 6, aarg0 : 6;=0A=
+ unsigned projected : 2;=0A=
WINED3DFORMAT color_correction;=0A=
- DWORD tex_type;=0A=
- DWORD dst;=0A=
- enum projection_types projected;=0A=
};=0A=
=0A=
struct ffp_settings {=0A=
-- =0A=
1.5.4.5=0A=
=0A=
------=_NextPart_000_0018_01C8F22B.ECA43880--
More information about the wine-patches
mailing list