[PATCH] WineD3D: Add fog and tex types to the ffp fragment =
Stefan Doesinger
stefan at codeweavers.com
Fri Jul 11 21:18:06 CDT 2008
description=0A=
=0A=
An ARB_fragment_program or GLSL fragment pipeline replacement=0A=
needs those=0A=
---=0A=
dlls/wined3d/ati_fragment_shader.c | 12 ++--=0A=
dlls/wined3d/utils.c | 135 =
+++++++++++++++++++++++-------------=0A=
dlls/wined3d/wined3d_private.h | 17 ++++-=0A=
3 files changed, 108 insertions(+), 56 deletions(-)=0A=
=0A=
diff --git a/dlls/wined3d/ati_fragment_shader.c =
b/dlls/wined3d/ati_fragment_shader.c=0A=
index 8989aa6..eb7837f 100644=0A=
--- a/dlls/wined3d/ati_fragment_shader.c=0A=
+++ b/dlls/wined3d/ati_fragment_shader.c=0A=
@@ -780,13 +780,13 @@ static GLuint gen_ati_shader(struct =
texture_stage_op op[MAX_TEXTURES], WineD3D_G=0A=
static void set_tex_op_atifs(DWORD state, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context) {=0A=
IWineD3DDeviceImpl *This =3D stateblock->wineD3DDevice;=0A=
struct atifs_ffp_desc *desc;=0A=
- struct texture_stage_op op[MAX_TEXTURES];=0A=
+ struct ffp_settings settings;=0A=
struct atifs_private_data *priv =3D (struct atifs_private_data *) =
This->fragment_priv;=0A=
DWORD mapped_stage;=0A=
unsigned int i;=0A=
=0A=
- gen_ffp_op(stateblock, op);=0A=
- desc =3D (struct atifs_ffp_desc *) =
find_ffp_shader(&priv->fragment_shaders, op);=0A=
+ gen_ffp_op(stateblock, &settings, TRUE);=0A=
+ desc =3D (struct atifs_ffp_desc *) =
find_ffp_shader(&priv->fragment_shaders, &settings);=0A=
if(!desc) {=0A=
desc =3D HeapAlloc(GetProcessHeap(), 0, sizeof(*desc));=0A=
if(!desc) {=0A=
@@ -795,12 +795,12 @@ static void set_tex_op_atifs(DWORD state, =
IWineD3DStateBlockImpl *stateblock, Wi=0A=
}=0A=
desc->num_textures_used =3D 0;=0A=
for(i =3D 0; i < GL_LIMITS(texture_stages); i++) {=0A=
- if(op[i].cop =3D=3D WINED3DTOP_DISABLE) break;=0A=
+ if(settings.op[i].cop =3D=3D WINED3DTOP_DISABLE) break;=0A=
desc->num_textures_used =3D i;=0A=
}=0A=
=0A=
- memcpy(desc->parent.op, op, sizeof(op));=0A=
- desc->shader =3D gen_ati_shader(op, &GLINFO_LOCATION);=0A=
+ memcpy(&desc->parent.settings, &settings, sizeof(settings));=0A=
+ desc->shader =3D gen_ati_shader(settings.op, &GLINFO_LOCATION);=0A=
add_ffp_shader(&priv->fragment_shaders, &desc->parent);=0A=
TRACE("Allocated fixed function replacement shader descriptor =
%p\n", desc);=0A=
}=0A=
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c=0A=
index da08d4f..cbcaa17 100644=0A=
--- a/dlls/wined3d/utils.c=0A=
+++ b/dlls/wined3d/utils.c=0A=
@@ -1750,7 +1750,7 @@ void *hash_table_get(hash_table_t *table, void =
*key)=0A=
}=0A=
=0A=
#define GLINFO_LOCATION stateblock->wineD3DDevice->adapter->gl_info=0A=
-void gen_ffp_op(IWineD3DStateBlockImpl *stateblock, struct =
texture_stage_op op[MAX_TEXTURES]) {=0A=
+void gen_ffp_op(IWineD3DStateBlockImpl *stateblock, struct ffp_settings =
*settings, BOOL ignore_textype) {=0A=
#define ARG1 0x01=0A=
#define ARG2 0x02=0A=
#define ARG0 0x04=0A=
@@ -1789,42 +1789,54 @@ void gen_ffp_op(IWineD3DStateBlockImpl =
*stateblock, struct texture_stage_op op[M=0A=
for(i =3D 0; i < GL_LIMITS(texture_stages); i++) {=0A=
IWineD3DBaseTextureImpl *texture;=0A=
if(stateblock->textureState[i][WINED3DTSS_COLOROP] =3D=3D =
WINED3DTOP_DISABLE) {=0A=
- op[i].cop =3D WINED3DTOP_DISABLE;=0A=
- op[i].aop =3D WINED3DTOP_DISABLE;=0A=
- op[i].carg0 =3D op[i].carg1 =3D op[i].carg2 =3D 0xffffffff;=0A=
- op[i].aarg0 =3D op[i].aarg1 =3D op[i].aarg2 =3D 0xffffffff;=0A=
- op[i].color_correction =3D WINED3DFMT_UNKNOWN;=0A=
- op[i].dst =3D 0xffffffff;=0A=
+ settings->op[i].cop =3D WINED3DTOP_DISABLE;=0A=
+ settings->op[i].aop =3D WINED3DTOP_DISABLE;=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=
i++;=0A=
break;=0A=
}=0A=
=0A=
texture =3D (IWineD3DBaseTextureImpl *) stateblock->textures[i];=0A=
- op[i].color_correction =3D texture ? =
texture->baseTexture.shader_conversion_group : WINED3DFMT_UNKNOWN;=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=
+ } else {=0A=
+ settings->op[i].tex_type =3D =
stateblock->textureDimensions[i];=0A=
+ }=0A=
+ } else {=0A=
+ settings->op[i].color_correction =3D WINED3DFMT_UNKNOWN;=0A=
+ settings->op[i].tex_type =3D 0;=0A=
+ }=0A=
=0A=
- op[i].cop =3D stateblock->textureState[i][WINED3DTSS_COLOROP];=0A=
- op[i].aop =3D stateblock->textureState[i][WINED3DTSS_ALPHAOP];=0A=
+ settings->op[i].cop =3D =
stateblock->textureState[i][WINED3DTSS_COLOROP];=0A=
+ settings->op[i].aop =3D =
stateblock->textureState[i][WINED3DTSS_ALPHAOP];=0A=
=0A=
- op[i].carg1 =3D (args[op[i].cop] & ARG1) ? =
stateblock->textureState[i][WINED3DTSS_COLORARG1] : 0xffffffff;=0A=
- op[i].carg2 =3D (args[op[i].cop] & ARG2) ? =
stateblock->textureState[i][WINED3DTSS_COLORARG2] : 0xffffffff;=0A=
- op[i].carg0 =3D (args[op[i].cop] & ARG0) ? =
stateblock->textureState[i][WINED3DTSS_COLORARG0] : 0xffffffff;=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=
=0A=
- if(is_invalid_op(stateblock->wineD3DDevice, i, op[i].cop, =
op[i].carg1, op[i].carg2, op[i].carg0)) {=0A=
- op[i].carg0 =3D 0xffffffff;=0A=
- op[i].carg2 =3D 0xffffffff;=0A=
- op[i].carg1 =3D WINED3DTA_CURRENT;=0A=
- op[i].cop =3D WINED3DTOP_SELECTARG1;=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=
}=0A=
=0A=
- op[i].aarg1 =3D (args[op[i].aop] & ARG1) ? =
stateblock->textureState[i][WINED3DTSS_ALPHAARG1] : 0xffffffff;=0A=
- op[i].aarg2 =3D (args[op[i].aop] & ARG2) ? =
stateblock->textureState[i][WINED3DTSS_ALPHAARG2] : 0xffffffff;=0A=
- op[i].aarg0 =3D (args[op[i].aop] & ARG0) ? =
stateblock->textureState[i][WINED3DTSS_ALPHAARG0] : 0xffffffff;=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, op[i].aop, =
op[i].aarg1, op[i].aarg2, op[i].aarg0)) {=0A=
- op[i].aarg0 =3D 0xffffffff;=0A=
- op[i].aarg2 =3D 0xffffffff;=0A=
- op[i].aarg1 =3D WINED3DTA_CURRENT;=0A=
- op[i].aop =3D WINED3DTOP_SELECTARG1;=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=
stateblock->renderState[WINED3DRS_COLORKEYENABLE] &&=0A=
(stateblock->textureDimensions[0] =3D=3D GL_TEXTURE_2D =
||=0A=
@@ -1834,52 +1846,81 @@ void gen_ffp_op(IWineD3DStateBlockImpl =
*stateblock, struct texture_stage_op op[M=0A=
if(surf->CKeyFlags & WINEDDSD_CKSRCBLT &&=0A=
getFormatDescEntry(surf->resource.format, NULL, =
NULL)->alphaMask =3D=3D 0x00000000) {=0A=
=0A=
- if(op[0].aop =3D=3D WINED3DTOP_DISABLE) {=0A=
- op[0].aarg1 =3D WINED3DTA_TEXTURE;=0A=
- op[0].aop =3D WINED3DTOP_SELECTARG1;=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=
}=0A=
- else if(op[0].aop =3D=3D WINED3DTOP_SELECTARG1 && =
op[0].aarg1 !=3D WINED3DTA_TEXTURE) {=0A=
+ else if(settings->op[0].aop =3D=3D =
WINED3DTOP_SELECTARG1 && settings->op[0].aarg1 !=3D WINED3DTA_TEXTURE) {=0A=
if =
(stateblock->renderState[WINED3DRS_ALPHABLENDENABLE]) {=0A=
- op[0].aarg2 =3D WINED3DTA_TEXTURE;=0A=
- op[0].aop =3D WINED3DTOP_MODULATE;=0A=
+ settings->op[0].aarg2 =3D WINED3DTA_TEXTURE;=0A=
+ settings->op[0].aop =3D WINED3DTOP_MODULATE;=0A=
}=0A=
- else op[0].aarg1 =3D WINED3DTA_TEXTURE;=0A=
+ else settings->op[0].aarg1 =3D WINED3DTA_TEXTURE;=0A=
}=0A=
- else if(op[0].aop =3D=3D WINED3DTOP_SELECTARG2 && =
op[0].aarg2 !=3D WINED3DTA_TEXTURE) {=0A=
+ else if(settings->op[0].aop =3D=3D =
WINED3DTOP_SELECTARG2 && settings->op[0].aarg2 !=3D WINED3DTA_TEXTURE) {=0A=
if =
(stateblock->renderState[WINED3DRS_ALPHABLENDENABLE]) {=0A=
- op[0].aarg1 =3D WINED3DTA_TEXTURE;=0A=
- op[0].aop =3D WINED3DTOP_MODULATE;=0A=
+ settings->op[0].aarg1 =3D WINED3DTA_TEXTURE;=0A=
+ settings->op[0].aop =3D WINED3DTOP_MODULATE;=0A=
}=0A=
- else op[0].aarg2 =3D WINED3DTA_TEXTURE;=0A=
+ else settings->op[0].aarg2 =3D WINED3DTA_TEXTURE;=0A=
}=0A=
}=0A=
}=0A=
=0A=
- if(op[i].carg1 =3D=3D WINED3DTA_TEXTURE || op[i].carg2 =3D=3D =
WINED3DTA_TEXTURE || op[i].carg0 =3D=3D WINED3DTA_TEXTURE ||=0A=
- op[i].aarg1 =3D=3D WINED3DTA_TEXTURE || op[i].aarg2 =3D=3D =
WINED3DTA_TEXTURE || op[i].aarg0 =3D=3D WINED3DTA_TEXTURE) {=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=
ttff =3D =
stateblock->textureState[i][WINED3DTSS_TEXTURETRANSFORMFLAGS];=0A=
if(ttff =3D=3D (WINED3DTTFF_PROJECTED | =
WINED3DTTFF_COUNT3)) {=0A=
- op[i].projected =3D proj_count3;=0A=
+ settings->op[i].projected =3D proj_count3;=0A=
} else if(ttff =3D=3D (WINED3DTTFF_PROJECTED | =
WINED3DTTFF_COUNT4)) {=0A=
- op[i].projected =3D proj_count4;=0A=
+ settings->op[i].projected =3D proj_count4;=0A=
} else {=0A=
- op[i].projected =3D proj_none;=0A=
+ settings->op[i].projected =3D proj_none;=0A=
}=0A=
} else {=0A=
- op[i].projected =3D proj_none;=0A=
+ settings->op[i].projected =3D proj_none;=0A=
}=0A=
=0A=
- op[i].dst =3D stateblock->textureState[i][WINED3DTSS_RESULTARG];=0A=
+ settings->op[i].dst =3D =
stateblock->textureState[i][WINED3DTSS_RESULTARG];=0A=
}=0A=
=0A=
/* Clear unsupported stages */=0A=
for(; i < MAX_TEXTURES; i++) {=0A=
- memset(&op[i], 0xff, sizeof(op[i]));=0A=
+ memset(&settings->op[i], 0xff, sizeof(settings->op[i]));=0A=
+ }=0A=
+=0A=
+ if(stateblock->renderState[WINED3DRS_FOGENABLE] =3D=3D FALSE) {=0A=
+ settings->fog =3D FOG_OFF;=0A=
+ } else if(stateblock->renderState[WINED3DRS_FOGTABLEMODE] =3D=3D =
WINED3DFOG_NONE) {=0A=
+ switch(stateblock->renderState[WINED3DRS_FOGVERTEXMODE]) {=0A=
+ case WINED3DFOG_NONE:=0A=
+ case WINED3DFOG_LINEAR:=0A=
+ settings->fog =3D FOG_LINEAR;=0A=
+ break;=0A=
+ case WINED3DFOG_EXP:=0A=
+ settings->fog =3D FOG_EXP;=0A=
+ break;=0A=
+ case WINED3DFOG_EXP2:=0A=
+ settings->fog =3D FOG_EXP2;=0A=
+ break;=0A=
+ }=0A=
+ } else {=0A=
+ switch(stateblock->renderState[WINED3DRS_FOGTABLEMODE]) {=0A=
+ case WINED3DFOG_LINEAR:=0A=
+ settings->fog =3D FOG_LINEAR;=0A=
+ break;=0A=
+ case WINED3DFOG_EXP:=0A=
+ settings->fog =3D FOG_EXP;=0A=
+ break;=0A=
+ case WINED3DFOG_EXP2:=0A=
+ settings->fog =3D FOG_EXP2;=0A=
+ break;=0A=
+ }=0A=
}=0A=
}=0A=
#undef GLINFO_LOCATION=0A=
=0A=
-struct ffp_desc *find_ffp_shader(struct list *shaders, struct =
texture_stage_op op[MAX_TEXTURES])=0A=
+struct ffp_desc *find_ffp_shader(struct list *shaders, struct =
ffp_settings *settings)=0A=
{=0A=
struct ffp_desc *entry;=0A=
=0A=
@@ -1887,7 +1928,7 @@ struct ffp_desc *find_ffp_shader(struct list =
*shaders, struct texture_stage_op o=0A=
* or maybe consider using hashtables=0A=
*/=0A=
LIST_FOR_EACH_ENTRY(entry, shaders, struct ffp_desc, entry) {=0A=
- if(memcmp(op, entry->op, sizeof(struct texture_stage_op) * =
MAX_TEXTURES) =3D=3D 0) {=0A=
+ if(memcmp(settings, &entry->settings, sizeof(*settings)) =3D=3D =
0) {=0A=
TRACE("Found shader entry %p\n", entry);=0A=
return entry;=0A=
}=0A=
diff --git a/dlls/wined3d/wined3d_private.h =
b/dlls/wined3d/wined3d_private.h=0A=
index 61b2983..e86bb1e 100644=0A=
--- a/dlls/wined3d/wined3d_private.h=0A=
+++ b/dlls/wined3d/wined3d_private.h=0A=
@@ -728,18 +728,29 @@ struct texture_stage_op=0A=
DWORD carg1, carg2, carg0;=0A=
DWORD aarg1, aarg2, aarg0;=0A=
WINED3DFORMAT color_correction;=0A=
+ DWORD tex_type;=0A=
DWORD dst;=0A=
enum projection_types projected;=0A=
};=0A=
=0A=
+struct ffp_settings {=0A=
+ struct texture_stage_op op[MAX_TEXTURES];=0A=
+ enum {=0A=
+ FOG_OFF,=0A=
+ FOG_LINEAR,=0A=
+ FOG_EXP,=0A=
+ FOG_EXP2=0A=
+ } fog;=0A=
+};=0A=
+=0A=
struct ffp_desc=0A=
{=0A=
- struct texture_stage_op op[MAX_TEXTURES];=0A=
+ struct ffp_settings settings;=0A=
struct list entry;=0A=
};=0A=
=0A=
-void gen_ffp_op(IWineD3DStateBlockImpl *stateblock,struct =
texture_stage_op op[MAX_TEXTURES]);=0A=
-struct ffp_desc *find_ffp_shader(struct list *shaders, struct =
texture_stage_op op[MAX_TEXTURES]);=0A=
+void gen_ffp_op(IWineD3DStateBlockImpl *stateblock, struct ffp_settings =
*settings, BOOL ignore_textype);=0A=
+struct ffp_desc *find_ffp_shader(struct list *shaders, struct =
ffp_settings *settings);=0A=
void add_ffp_shader(struct list *shaders, struct ffp_desc *desc);=0A=
=0A=
=
/************************************************************************=
*****=0A=
-- =0A=
1.5.4.5=0A=
=0A=
------=_NextPart_000_002C_01C8EFF4.24DB4E30--
More information about the wine-patches
mailing list