[PATCH] WineD3D: Separate texture_activate_dimensions=0A=
Stefan Doesinger
stefan at codeweavers.com
Fri Jul 4 17:25:23 CDT 2008
=0A=
This creates an nvts version of this function, and removes the nvts code =
from the original one. The nvts version is=0A=
used by the nvts pipeline implementation, the original one by the =
nvrc-only, atifs and ffp one.=0A=
=0A=
I plan to add some opengl extension information to the state templates =
later, this will eliminate one of the=0A=
almost-duplicated nvrc/nvts state templates.=0A=
---=0A=
dlls/wined3d/nvidia_texture_shader.c | 79 +++++++++++++++++---=0A=
dlls/wined3d/utils.c | 139 =
+++++++++++++---------------------=0A=
2 files changed, 120 insertions(+), 98 deletions(-)=0A=
=0A=
diff --git a/dlls/wined3d/nvidia_texture_shader.c =
b/dlls/wined3d/nvidia_texture_shader.c=0A=
index 0c2301c..5d7dceb 100644=0A=
--- a/dlls/wined3d/nvidia_texture_shader.c=0A=
+++ b/dlls/wined3d/nvidia_texture_shader.c=0A=
@@ -29,6 +29,42 @@=0A=
WINE_DEFAULT_DEBUG_CHANNEL(d3d);=0A=
=0A=
#define GLINFO_LOCATION stateblock->wineD3DDevice->adapter->gl_info=0A=
+void nvts_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context) {=0A=
+ BOOL bumpmap =3D FALSE;=0A=
+=0A=
+ if(stage > 0 && (stateblock->textureState[stage - =
1][WINED3DTSS_COLOROP] =3D=3D WINED3DTOP_BUMPENVMAPLUMINANCE ||=0A=
+ stateblock->textureState[stage - =
1][WINED3DTSS_COLOROP] =3D=3D WINED3DTOP_BUMPENVMAP)) {=0A=
+ bumpmap =3D TRUE;=0A=
+ context->texShaderBumpMap |=3D (1 << stage);=0A=
+ } else {=0A=
+ context->texShaderBumpMap &=3D ~(1 << stage);=0A=
+ }=0A=
+=0A=
+ if(stateblock->textures[stage]) {=0A=
+ switch(stateblock->textureDimensions[stage]) {=0A=
+ case GL_TEXTURE_2D:=0A=
+ glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, =
bumpmap ? GL_OFFSET_TEXTURE_2D_NV : GL_TEXTURE_2D);=0A=
+ checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, ...)");=0A=
+ break;=0A=
+ case GL_TEXTURE_RECTANGLE_ARB:=0A=
+ glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, =
bumpmap ? GL_OFFSET_TEXTURE_2D_NV : GL_TEXTURE_RECTANGLE_ARB);=0A=
+ checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, ...)");=0A=
+ break;=0A=
+ case GL_TEXTURE_3D:=0A=
+ glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, =
GL_TEXTURE_3D);=0A=
+ checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, GL_TEXTURE_3D)");=0A=
+ break;=0A=
+ case GL_TEXTURE_CUBE_MAP_ARB:=0A=
+ glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, =
GL_TEXTURE_CUBE_MAP_ARB);=0A=
+ checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, GL_TEXTURE_CUBE_MAP_ARB)");=0A=
+ break;=0A=
+ }=0A=
+ } else {=0A=
+ glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, =
GL_NONE);=0A=
+ checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, GL_NONE)");=0A=
+ }=0A=
+}=0A=
+=0A=
static void nvrc_colorop(DWORD state, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context) {=0A=
DWORD stage =3D (state - STATE_TEXTURESTAGE(0, 0)) / =
WINED3D_HIGHEST_TEXTURE_STATE;=0A=
DWORD mapped_stage =3D stateblock->wineD3DDevice->texUnitMap[stage];=0A=
@@ -92,7 +128,13 @@ static void nvrc_colorop(DWORD state, =
IWineD3DStateBlockImpl *stateblock, WineD3=0A=
* if the sampler for this stage is dirty=0A=
*/=0A=
if(!isStateDirty(context, STATE_SAMPLER(stage))) {=0A=
- if (tex_used) texture_activate_dimensions(stage, stateblock, =
context);=0A=
+ if (tex_used) {=0A=
+ if(GL_SUPPORT(NV_TEXTURE_SHADER2)) {=0A=
+ nvts_activate_dimensions(stage, stateblock, context);=0A=
+ } else {=0A=
+ texture_activate_dimensions(stage, stateblock, context);=0A=
+ }=0A=
+ }=0A=
}=0A=
=0A=
/* Set the texture combiners */=0A=
@@ -114,13 +156,29 @@ static void nvrc_colorop(DWORD state, =
IWineD3DStateBlockImpl *stateblock, WineD3=0A=
if(usesBump !=3D usedBump) {=0A=
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + =
mapped_stage + 1));=0A=
checkGLcall("glActiveTextureARB");=0A=
- texture_activate_dimensions(stage + 1, stateblock, context);=0A=
+ nvts_activate_dimensions(stage + 1, stateblock, context);=0A=
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + =
mapped_stage));=0A=
checkGLcall("glActiveTextureARB");=0A=
}=0A=
}=0A=
}=0A=
=0A=
+void nvts_texdim(DWORD state, IWineD3DStateBlockImpl *stateblock, =
WineD3DContext *context) {=0A=
+ DWORD sampler =3D state - STATE_SAMPLER(0);=0A=
+ DWORD mapped_stage =3D =
stateblock->wineD3DDevice->texUnitMap[sampler];=0A=
+=0A=
+ /* No need to enable / disable anything here for unused samplers. =
The tex_colorop=0A=
+ * handler takes care. Also no action is needed with pixel shaders, =
or if tex_colorop=0A=
+ * will take care of this business=0A=
+ */=0A=
+ if(mapped_stage =3D=3D -1 || mapped_stage >=3D GL_LIMITS(textures)) =
return;=0A=
+ if(sampler >=3D stateblock->lowest_disabled_stage) return;=0A=
+ if(use_ps(stateblock->wineD3DDevice)) return;=0A=
+ if(isStateDirty(context, STATE_TEXTURESTAGE(sampler, =
WINED3DTSS_COLOROP))) return;=0A=
+=0A=
+ nvts_activate_dimensions(sampler, stateblock, context);=0A=
+}=0A=
+=0A=
static void nvts_bumpenvmat(DWORD state, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context) {=0A=
DWORD stage =3D (state - STATE_TEXTURESTAGE(0, 0)) / =
WINED3D_HIGHEST_TEXTURE_STATE;=0A=
float mat[2][2];=0A=
@@ -155,7 +213,6 @@ static void nvrc_texfactor(DWORD state, =
IWineD3DStateBlockImpl *stateblock, Wine=0A=
=
D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_TEXTUREFACTOR], =
col);=0A=
GL_EXTCALL(glCombinerParameterfvNV(GL_CONSTANT_COLOR0_NV, &col[0]));=0A=
}=0A=
-=0A=
#undef GLINFO_LOCATION=0A=
=0A=
#define GLINFO_LOCATION (*gl_info)=0A=
@@ -341,14 +398,14 @@ const struct StateEntryTemplate =
nvts_fragmentstate_template[] =3D {=0A=
{ STATE_PIXELSHADER, { =
STATE_PIXELSHADER, apply_pixelshader =
}},=0A=
{ STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { =
STATE_PIXELSHADER, apply_pixelshader =
}},=0A=
{ STATE_RENDER(WINED3DRS_TEXTUREFACTOR), { =
STATE_RENDER(WINED3DRS_TEXTUREFACTOR), nvrc_texfactor =
}},=0A=
- { STATE_SAMPLER(0), { =
STATE_SAMPLER(0), sampler_texdim =
}},=0A=
- { STATE_SAMPLER(1), { =
STATE_SAMPLER(1), sampler_texdim =
}},=0A=
- { STATE_SAMPLER(2), { =
STATE_SAMPLER(2), sampler_texdim =
}},=0A=
- { STATE_SAMPLER(3), { =
STATE_SAMPLER(3), sampler_texdim =
}},=0A=
- { STATE_SAMPLER(4), { =
STATE_SAMPLER(4), sampler_texdim =
}},=0A=
- { STATE_SAMPLER(5), { =
STATE_SAMPLER(5), sampler_texdim =
}},=0A=
- { STATE_SAMPLER(6), { =
STATE_SAMPLER(6), sampler_texdim =
}},=0A=
- { STATE_SAMPLER(7), { =
STATE_SAMPLER(7), sampler_texdim =
}},=0A=
+ { STATE_SAMPLER(0), { =
STATE_SAMPLER(0), nvts_texdim =
}},=0A=
+ { STATE_SAMPLER(1), { =
STATE_SAMPLER(1), nvts_texdim =
}},=0A=
+ { STATE_SAMPLER(2), { =
STATE_SAMPLER(2), nvts_texdim =
}},=0A=
+ { STATE_SAMPLER(3), { =
STATE_SAMPLER(3), nvts_texdim =
}},=0A=
+ { STATE_SAMPLER(4), { =
STATE_SAMPLER(4), nvts_texdim =
}},=0A=
+ { STATE_SAMPLER(5), { =
STATE_SAMPLER(5), nvts_texdim =
}},=0A=
+ { STATE_SAMPLER(6), { =
STATE_SAMPLER(6), nvts_texdim =
}},=0A=
+ { STATE_SAMPLER(7), { =
STATE_SAMPLER(7), nvts_texdim =
}},=0A=
{0 /* Terminate */, { 0, =
0 }},=0A=
};=0A=
=0A=
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c=0A=
index 71833d5..6093b32 100644=0A=
--- a/dlls/wined3d/utils.c=0A=
+++ b/dlls/wined3d/utils.c=0A=
@@ -3392,110 +3392,75 @@ void add_ffp_shader(struct list *shaders, =
struct ffp_desc *desc) {=0A=
*/=0A=
#define GLINFO_LOCATION stateblock->wineD3DDevice->adapter->gl_info=0A=
void texture_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context) {=0A=
- BOOL bumpmap =3D FALSE;=0A=
-=0A=
- if(stage > 0 && (stateblock->textureState[stage - =
1][WINED3DTSS_COLOROP] =3D=3D WINED3DTOP_BUMPENVMAPLUMINANCE ||=0A=
- stateblock->textureState[stage - =
1][WINED3DTSS_COLOROP] =3D=3D WINED3DTOP_BUMPENVMAP)) {=0A=
- bumpmap =3D TRUE;=0A=
- context->texShaderBumpMap |=3D (1 << stage);=0A=
- } else {=0A=
- context->texShaderBumpMap &=3D ~(1 << stage);=0A=
- }=0A=
-=0A=
if(stateblock->textures[stage]) {=0A=
switch(stateblock->textureDimensions[stage]) {=0A=
case GL_TEXTURE_2D:=0A=
- if(GL_SUPPORT(NV_TEXTURE_SHADER2)) {=0A=
- glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, bumpmap ? GL_OFFSET_TEXTURE_2D_NV : =
GL_TEXTURE_2D);=0A=
- checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, ...)");=0A=
- } else {=0A=
- glDisable(GL_TEXTURE_3D);=0A=
- checkGLcall("glDisable(GL_TEXTURE_3D)");=0A=
- if(GL_SUPPORT(ARB_TEXTURE_CUBE_MAP)) {=0A=
- glDisable(GL_TEXTURE_CUBE_MAP_ARB);=0A=
- =
checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");=0A=
- }=0A=
- if(GL_SUPPORT(ARB_TEXTURE_RECTANGLE)) {=0A=
- glDisable(GL_TEXTURE_RECTANGLE_ARB);=0A=
- =
checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)");=0A=
- }=0A=
- glEnable(GL_TEXTURE_2D);=0A=
- checkGLcall("glEnable(GL_TEXTURE_2D)");=0A=
+ glDisable(GL_TEXTURE_3D);=0A=
+ checkGLcall("glDisable(GL_TEXTURE_3D)");=0A=
+ if(GL_SUPPORT(ARB_TEXTURE_CUBE_MAP)) {=0A=
+ glDisable(GL_TEXTURE_CUBE_MAP_ARB);=0A=
+ checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");=0A=
+ }=0A=
+ if(GL_SUPPORT(ARB_TEXTURE_RECTANGLE)) {=0A=
+ glDisable(GL_TEXTURE_RECTANGLE_ARB);=0A=
+ checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)");=0A=
}=0A=
+ glEnable(GL_TEXTURE_2D);=0A=
+ checkGLcall("glEnable(GL_TEXTURE_2D)");=0A=
break;=0A=
case GL_TEXTURE_RECTANGLE_ARB:=0A=
- if(GL_SUPPORT(NV_TEXTURE_SHADER2)) {=0A=
- glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, bumpmap ? GL_OFFSET_TEXTURE_2D_NV : =
GL_TEXTURE_RECTANGLE_ARB);=0A=
- checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, ...)");=0A=
- } else {=0A=
- glDisable(GL_TEXTURE_2D);=0A=
- checkGLcall("glDisable(GL_TEXTURE_2D)");=0A=
- glDisable(GL_TEXTURE_3D);=0A=
- checkGLcall("glDisable(GL_TEXTURE_3D)");=0A=
- if(GL_SUPPORT(ARB_TEXTURE_CUBE_MAP)) {=0A=
- glDisable(GL_TEXTURE_CUBE_MAP_ARB);=0A=
- =
checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");=0A=
- }=0A=
- glEnable(GL_TEXTURE_RECTANGLE_ARB);=0A=
- checkGLcall("glEnable(GL_TEXTURE_RECTANGLE_ARB)");=0A=
+ glDisable(GL_TEXTURE_2D);=0A=
+ checkGLcall("glDisable(GL_TEXTURE_2D)");=0A=
+ glDisable(GL_TEXTURE_3D);=0A=
+ checkGLcall("glDisable(GL_TEXTURE_3D)");=0A=
+ if(GL_SUPPORT(ARB_TEXTURE_CUBE_MAP)) {=0A=
+ glDisable(GL_TEXTURE_CUBE_MAP_ARB);=0A=
+ checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");=0A=
}=0A=
+ glEnable(GL_TEXTURE_RECTANGLE_ARB);=0A=
+ checkGLcall("glEnable(GL_TEXTURE_RECTANGLE_ARB)");=0A=
break;=0A=
case GL_TEXTURE_3D:=0A=
- if(GL_SUPPORT(NV_TEXTURE_SHADER2)) {=0A=
- glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, GL_TEXTURE_3D);=0A=
- checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, GL_TEXTURE_3D)");=0A=
- } else {=0A=
- if(GL_SUPPORT(ARB_TEXTURE_CUBE_MAP)) {=0A=
- glDisable(GL_TEXTURE_CUBE_MAP_ARB);=0A=
- =
checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");=0A=
- }=0A=
- if(GL_SUPPORT(ARB_TEXTURE_RECTANGLE)) {=0A=
- glDisable(GL_TEXTURE_RECTANGLE_ARB);=0A=
- =
checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)");=0A=
- }=0A=
- glDisable(GL_TEXTURE_2D);=0A=
- checkGLcall("glDisable(GL_TEXTURE_2D)");=0A=
- glEnable(GL_TEXTURE_3D);=0A=
- checkGLcall("glEnable(GL_TEXTURE_3D)");=0A=
+ if(GL_SUPPORT(ARB_TEXTURE_CUBE_MAP)) {=0A=
+ glDisable(GL_TEXTURE_CUBE_MAP_ARB);=0A=
+ checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");=0A=
}=0A=
+ if(GL_SUPPORT(ARB_TEXTURE_RECTANGLE)) {=0A=
+ glDisable(GL_TEXTURE_RECTANGLE_ARB);=0A=
+ checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)");=0A=
+ }=0A=
+ glDisable(GL_TEXTURE_2D);=0A=
+ checkGLcall("glDisable(GL_TEXTURE_2D)");=0A=
+ glEnable(GL_TEXTURE_3D);=0A=
+ checkGLcall("glEnable(GL_TEXTURE_3D)");=0A=
break;=0A=
case GL_TEXTURE_CUBE_MAP_ARB:=0A=
- if(GL_SUPPORT(NV_TEXTURE_SHADER2)) {=0A=
- glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, GL_TEXTURE_CUBE_MAP_ARB);=0A=
- checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, GL_TEXTURE_CUBE_MAP_ARB)");=0A=
- } else {=0A=
- glDisable(GL_TEXTURE_2D);=0A=
- checkGLcall("glDisable(GL_TEXTURE_2D)");=0A=
- glDisable(GL_TEXTURE_3D);=0A=
- checkGLcall("glDisable(GL_TEXTURE_3D)");=0A=
- if(GL_SUPPORT(ARB_TEXTURE_RECTANGLE)) {=0A=
- glDisable(GL_TEXTURE_RECTANGLE_ARB);=0A=
- =
checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)");=0A=
- }=0A=
- glEnable(GL_TEXTURE_CUBE_MAP_ARB);=0A=
- checkGLcall("glEnable(GL_TEXTURE_CUBE_MAP_ARB)");=0A=
+ glDisable(GL_TEXTURE_2D);=0A=
+ checkGLcall("glDisable(GL_TEXTURE_2D)");=0A=
+ glDisable(GL_TEXTURE_3D);=0A=
+ checkGLcall("glDisable(GL_TEXTURE_3D)");=0A=
+ if(GL_SUPPORT(ARB_TEXTURE_RECTANGLE)) {=0A=
+ glDisable(GL_TEXTURE_RECTANGLE_ARB);=0A=
+ checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)");=0A=
}=0A=
+ glEnable(GL_TEXTURE_CUBE_MAP_ARB);=0A=
+ checkGLcall("glEnable(GL_TEXTURE_CUBE_MAP_ARB)");=0A=
break;=0A=
}=0A=
} else {=0A=
- if(GL_SUPPORT(NV_TEXTURE_SHADER2)) {=0A=
- glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, =
GL_NONE);=0A=
- checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, =
GL_SHADER_OPERATION_NV, GL_NONE)");=0A=
- } else {=0A=
- glEnable(GL_TEXTURE_2D);=0A=
- checkGLcall("glEnable(GL_TEXTURE_2D)");=0A=
- glDisable(GL_TEXTURE_3D);=0A=
- checkGLcall("glDisable(GL_TEXTURE_3D)");=0A=
- if(GL_SUPPORT(ARB_TEXTURE_CUBE_MAP)) {=0A=
- glDisable(GL_TEXTURE_CUBE_MAP_ARB);=0A=
- checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");=0A=
- }=0A=
- if(GL_SUPPORT(ARB_TEXTURE_RECTANGLE)) {=0A=
- glDisable(GL_TEXTURE_RECTANGLE_ARB);=0A=
- checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)");=0A=
- }=0A=
- /* Binding textures is done by samplers. A dummy texture =
will be bound */=0A=
+ glEnable(GL_TEXTURE_2D);=0A=
+ checkGLcall("glEnable(GL_TEXTURE_2D)");=0A=
+ glDisable(GL_TEXTURE_3D);=0A=
+ checkGLcall("glDisable(GL_TEXTURE_3D)");=0A=
+ if(GL_SUPPORT(ARB_TEXTURE_CUBE_MAP)) {=0A=
+ glDisable(GL_TEXTURE_CUBE_MAP_ARB);=0A=
+ checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");=0A=
+ }=0A=
+ if(GL_SUPPORT(ARB_TEXTURE_RECTANGLE)) {=0A=
+ glDisable(GL_TEXTURE_RECTANGLE_ARB);=0A=
+ checkGLcall("glDisable(GL_TEXTURE_RECTANGLE_ARB)");=0A=
}=0A=
+ /* Binding textures is done by samplers. A dummy texture will =
be bound */=0A=
}=0A=
}=0A=
=0A=
-- =0A=
1.5.4.5=0A=
=0A=
------=_NextPart_000_0011_01C8E33C.6EEBCFF0--
More information about the wine-patches
mailing list