From d4d133f032389f54a45e6c8397a932f0ac47b432 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Stefan=20D=C3=B6singer?= Date: Wed, 30 Jul 2008 10:57:32 -0500 Subject: [PATCH] wined3d: Use C bitfields to compact the ffp description. --- dlls/wined3d/ati_fragment_shader.c | 4 +- dlls/wined3d/utils.c | 117 ++++++++++++++++++++++++------------- dlls/wined3d/wined3d_private.h | 33 ++++++++--- 3 files changed, 101 insertions(+), 53 deletions(-) diff --git a/dlls/wined3d/ati_fragment_shader.c b/dlls/wined3d/ati_fragment_shader.c index eb7837f30c7..6dc01937749 100644 --- a/dlls/wined3d/ati_fragment_shader.c +++ b/dlls/wined3d/ati_fragment_shader.c @@ -226,7 +226,7 @@ static GLuint find_tmpreg(struct texture_stage_op op[MAX_TEXTURES]) { lowest_read = i; } - if(lowest_write == -1 && op[i].dst == WINED3DTA_TEMP) { + if(lowest_write == -1 && op[i].dst == tempreg) { lowest_write = i; } @@ -418,7 +418,7 @@ static GLuint gen_ati_shader(struct texture_stage_op op[MAX_TEXTURES], WineD3D_G break; } - if(op[stage].dst == WINED3DTA_TEMP) { + if(op[stage].dst == tempreg) { /* If we're writing to D3DTA_TEMP, but never reading from it we don't have to write there in the first place. * skip the entire stage, this saves some GPU time */ diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index cbcaa1784ad..43987241a0f 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -1785,16 +1785,18 @@ void gen_ffp_op(IWineD3DStateBlockImpl *stateblock, struct ffp_settings *setting }; unsigned int i; DWORD ttff; + DWORD cop, aop, carg0, carg1, carg2, aarg0, aarg1, aarg2; for(i = 0; i < GL_LIMITS(texture_stages); i++) { IWineD3DBaseTextureImpl *texture; if(stateblock->textureState[i][WINED3DTSS_COLOROP] == WINED3DTOP_DISABLE) { settings->op[i].cop = WINED3DTOP_DISABLE; settings->op[i].aop = WINED3DTOP_DISABLE; - settings->op[i].carg0 = settings->op[i].carg1 = settings->op[i].carg2 = 0xffffffff; - settings->op[i].aarg0 = settings->op[i].aarg1 = settings->op[i].aarg2 = 0xffffffff; + /* 0x3F: set all 6 bits of the args to 1 */ + settings->op[i].carg0 = settings->op[i].carg1 = settings->op[i].carg2 = 0x3F; + settings->op[i].aarg0 = settings->op[i].aarg1 = settings->op[i].aarg2 = 0x3F; settings->op[i].color_correction = WINED3DFMT_UNKNOWN; - settings->op[i].dst = 0xffffffff; + settings->op[i].dst = resultreg; i++; break; } @@ -1803,41 +1805,51 @@ void gen_ffp_op(IWineD3DStateBlockImpl *stateblock, struct ffp_settings *setting if(texture) { settings->op[i].color_correction = texture->baseTexture.shader_conversion_group; if(ignore_textype) { - settings->op[i].tex_type = 0; + settings->op[i].tex_type = tex_1d; } else { - settings->op[i].tex_type = stateblock->textureDimensions[i]; + switch(stateblock->textureDimensions[i]) { + case GL_TEXTURE_1D: + settings->op[i].tex_type = tex_1d; + break; + case GL_TEXTURE_2D: + settings->op[i].tex_type = tex_2d; + break; + case GL_TEXTURE_3D: + settings->op[i].tex_type = tex_3d; + break; + case GL_TEXTURE_CUBE_MAP_ARB: + settings->op[i].tex_type = tex_cube; + break; + case GL_TEXTURE_RECTANGLE_ARB: + settings->op[i].tex_type = tex_rect; + break; + } } } else { settings->op[i].color_correction = WINED3DFMT_UNKNOWN; - settings->op[i].tex_type = 0; + settings->op[i].tex_type = tex_1d; } - settings->op[i].cop = stateblock->textureState[i][WINED3DTSS_COLOROP]; - settings->op[i].aop = stateblock->textureState[i][WINED3DTSS_ALPHAOP]; + cop = stateblock->textureState[i][WINED3DTSS_COLOROP]; + aop = stateblock->textureState[i][WINED3DTSS_ALPHAOP]; - settings->op[i].carg1 = (args[settings->op[i].cop] & ARG1) ? stateblock->textureState[i][WINED3DTSS_COLORARG1] : 0xffffffff; - settings->op[i].carg2 = (args[settings->op[i].cop] & ARG2) ? stateblock->textureState[i][WINED3DTSS_COLORARG2] : 0xffffffff; - settings->op[i].carg0 = (args[settings->op[i].cop] & ARG0) ? stateblock->textureState[i][WINED3DTSS_COLORARG0] : 0xffffffff; + carg1 = (args[cop] & ARG1) ? stateblock->textureState[i][WINED3DTSS_COLORARG1] : 0xffffffff; + carg2 = (args[cop] & ARG2) ? stateblock->textureState[i][WINED3DTSS_COLORARG2] : 0xffffffff; + carg0 = (args[cop] & ARG0) ? stateblock->textureState[i][WINED3DTSS_COLORARG0] : 0xffffffff; - if(is_invalid_op(stateblock->wineD3DDevice, i,settings->op[i].cop, - settings->op[i].carg1, settings->op[i].carg2, settings->op[i].carg0)) { - settings->op[i].carg0 = 0xffffffff; - settings->op[i].carg2 = 0xffffffff; - settings->op[i].carg1 = WINED3DTA_CURRENT; - settings->op[i].cop = WINED3DTOP_SELECTARG1; + if(is_invalid_op(stateblock->wineD3DDevice, i, cop, + carg1, carg2, carg0)) { + carg0 = 0xffffffff; + carg2 = 0xffffffff; + carg1 = WINED3DTA_CURRENT; + cop = WINED3DTOP_SELECTARG1; } - settings->op[i].aarg1 = (args[settings->op[i].aop] & ARG1) ? stateblock->textureState[i][WINED3DTSS_ALPHAARG1] : 0xffffffff; - settings->op[i].aarg2 = (args[settings->op[i].aop] & ARG2) ? stateblock->textureState[i][WINED3DTSS_ALPHAARG2] : 0xffffffff; - settings->op[i].aarg0 = (args[settings->op[i].aop] & ARG0) ? stateblock->textureState[i][WINED3DTSS_ALPHAARG0] : 0xffffffff; - - if(is_invalid_op(stateblock->wineD3DDevice, i, settings->op[i].aop, - settings->op[i].aarg1, settings->op[i].aarg2, settings->op[i].aarg0)) { - settings->op[i].aarg0 = 0xffffffff; - settings->op[i].aarg2 = 0xffffffff; - settings->op[i].aarg1 = WINED3DTA_CURRENT; - settings->op[i].aop = WINED3DTOP_SELECTARG1; - } else if(i == 0 && stateblock->textures[0] && + aarg1 = (args[aop] & ARG1) ? stateblock->textureState[i][WINED3DTSS_ALPHAARG1] : 0xffffffff; + aarg2 = (args[aop] & ARG2) ? stateblock->textureState[i][WINED3DTSS_ALPHAARG2] : 0xffffffff; + aarg0 = (args[aop] & ARG0) ? stateblock->textureState[i][WINED3DTSS_ALPHAARG0] : 0xffffffff; + + if(i == 0 && stateblock->textures[0] && stateblock->renderState[WINED3DRS_COLORKEYENABLE] && (stateblock->textureDimensions[0] == GL_TEXTURE_2D || stateblock->textureDimensions[0] == GL_TEXTURE_RECTANGLE_ARB)) { @@ -1846,29 +1858,37 @@ void gen_ffp_op(IWineD3DStateBlockImpl *stateblock, struct ffp_settings *setting if(surf->CKeyFlags & WINEDDSD_CKSRCBLT && getFormatDescEntry(surf->resource.format, NULL, NULL)->alphaMask == 0x00000000) { - if(settings->op[0].aop == WINED3DTOP_DISABLE) { - settings->op[0].aarg1 = WINED3DTA_TEXTURE; - settings->op[0].aop = WINED3DTOP_SELECTARG1; + if(aop == WINED3DTOP_DISABLE) { + aarg1 = WINED3DTA_TEXTURE; + aop = WINED3DTOP_SELECTARG1; } - else if(settings->op[0].aop == WINED3DTOP_SELECTARG1 && settings->op[0].aarg1 != WINED3DTA_TEXTURE) { + else if(aop == WINED3DTOP_SELECTARG1 && aarg1 != WINED3DTA_TEXTURE) { if (stateblock->renderState[WINED3DRS_ALPHABLENDENABLE]) { - settings->op[0].aarg2 = WINED3DTA_TEXTURE; - settings->op[0].aop = WINED3DTOP_MODULATE; + aarg2 = WINED3DTA_TEXTURE; + aop = WINED3DTOP_MODULATE; } - else settings->op[0].aarg1 = WINED3DTA_TEXTURE; + else aarg1 = WINED3DTA_TEXTURE; } - else if(settings->op[0].aop == WINED3DTOP_SELECTARG2 && settings->op[0].aarg2 != WINED3DTA_TEXTURE) { + else if(aop == WINED3DTOP_SELECTARG2 && aarg2 != WINED3DTA_TEXTURE) { if (stateblock->renderState[WINED3DRS_ALPHABLENDENABLE]) { - settings->op[0].aarg1 = WINED3DTA_TEXTURE; - settings->op[0].aop = WINED3DTOP_MODULATE; + aarg1 = WINED3DTA_TEXTURE; + aop = WINED3DTOP_MODULATE; } - else settings->op[0].aarg2 = WINED3DTA_TEXTURE; + else aarg2 = WINED3DTA_TEXTURE; } } } - if(settings->op[i].carg1 == WINED3DTA_TEXTURE || settings->op[i].carg2 == WINED3DTA_TEXTURE || settings->op[i].carg0 == WINED3DTA_TEXTURE || - settings->op[i].aarg1 == WINED3DTA_TEXTURE || settings->op[i].aarg2 == WINED3DTA_TEXTURE || settings->op[i].aarg0 == WINED3DTA_TEXTURE) { + if(is_invalid_op(stateblock->wineD3DDevice, i, aop, + aarg1, aarg2, aarg0)) { + aarg0 = 0xffffffff; + aarg2 = 0xffffffff; + aarg1 = WINED3DTA_CURRENT; + aop = WINED3DTOP_SELECTARG1; + } + + if(carg1 == WINED3DTA_TEXTURE || carg2 == WINED3DTA_TEXTURE || carg0 == WINED3DTA_TEXTURE || + aarg1 == WINED3DTA_TEXTURE || aarg2 == WINED3DTA_TEXTURE || aarg0 == WINED3DTA_TEXTURE) { ttff = stateblock->textureState[i][WINED3DTSS_TEXTURETRANSFORMFLAGS]; if(ttff == (WINED3DTTFF_PROJECTED | WINED3DTTFF_COUNT3)) { settings->op[i].projected = proj_count3; @@ -1881,7 +1901,20 @@ void gen_ffp_op(IWineD3DStateBlockImpl *stateblock, struct ffp_settings *setting settings->op[i].projected = proj_none; } - settings->op[i].dst = stateblock->textureState[i][WINED3DTSS_RESULTARG]; + settings->op[i].cop = cop; + settings->op[i].aop = aop; + settings->op[i].carg0 = carg0; + settings->op[i].carg1 = carg1; + settings->op[i].carg2 = carg2; + settings->op[i].aarg0 = aarg0; + settings->op[i].aarg1 = aarg1; + settings->op[i].aarg2 = aarg2; + + if(stateblock->textureState[i][WINED3DTSS_RESULTARG] == WINED3DTA_TEMP) { + settings->op[i].dst = tempreg; + } else { + settings->op[i].dst = resultreg; + } } /* Clear unsupported stages */ diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index e86bb1e5fae..66e5a328cad 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -714,9 +714,24 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This, struct WineD3DRectPatch *p enum projection_types { - proj_none, - proj_count3, - proj_count4 + proj_none = 0, + proj_count3 = 1, + proj_count4 = 2 +}; + +enum tex_types +{ + tex_1d = 0, + tex_2d = 1, + tex_3d = 2, + tex_cube = 3, + tex_rect = 4 +}; + +enum dst_arg +{ + resultreg = 0, + tempreg = 1 }; /***************************************************************************** @@ -724,13 +739,13 @@ enum projection_types */ struct texture_stage_op { - WINED3DTEXTUREOP cop, aop; - DWORD carg1, carg2, carg0; - DWORD aarg1, aarg2, aarg0; + unsigned cop : 5, aop : 5; + unsigned carg1 : 6, carg2 : 6, carg0 : 6; + unsigned tex_type : 3; + unsigned dst : 1; + unsigned aarg1 : 6, aarg2 : 6, aarg0 : 6; + unsigned projected : 2; WINED3DFORMAT color_correction; - DWORD tex_type; - DWORD dst; - enum projection_types projected; }; struct ffp_settings { -- 2.11.4.GIT