Module: wine Branch: master Commit: b1579b37ea2d3a314dac87a98a3bc9c55fb22dbe URL: http://source.winehq.org/git/wine.git/?a=commit;h=b1579b37ea2d3a314dac87a98a...
Author: H. Verbeet hverbeet@gmail.com Date: Fri Jun 22 20:43:24 2007 +0200
wined3d: Keep track of what fixed function texture stages are in use.
---
dlls/wined3d/device.c | 13 +++++++++++-- dlls/wined3d/wined3d_private.h | 1 + 2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 0b02dd2..23beae5 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -3201,6 +3201,14 @@ static void device_map_stage(IWineD3DDeviceImpl *This, int stage, int unit) { } }
+static void device_update_fixed_function_usage_map(IWineD3DDeviceImpl *This) { + int i; + + for (i = 0; i < MAX_TEXTURES; ++i) { + This->fixed_function_usage_map[i] = This->stateBlock->textures[i] ? TRUE : FALSE; + } +} + void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This) { DWORD i, tex; /* This code can assume that GL_NV_register_combiners are supported, otherwise @@ -3233,12 +3241,13 @@ void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This) { This->oneToOneTexUnitMap = TRUE; return; } else { + device_update_fixed_function_usage_map(This); /* No pixel shader, and we do not have enough texture units available. Try to skip NULL textures * First, see if we can succeed at all */ tex = 0; for(i = 0; i < This->stateBlock->lowest_disabled_stage; i++) { - if(This->stateBlock->textures[i] == NULL) tex++; + if (!This->fixed_function_usage_map[i]) ++tex; }
if(GL_LIMITS(textures) + tex < This->stateBlock->lowest_disabled_stage) { @@ -3252,7 +3261,7 @@ void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This) { WARN("Non 1:1 mapping UNTESTED!\n"); for(i = 0; i < This->stateBlock->lowest_disabled_stage; i++) { /* Skip NULL textures */ - if (!This->stateBlock->textures[i]) { + if (!This->fixed_function_usage_map[i]) { /* Map to -1, so the check below doesn't fail if a non-NULL * texture is set on this stage */ TRACE("Mapping texture stage %d to -1\n", i); diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index efa8f7b..2710669 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -724,6 +724,7 @@ struct IWineD3DDeviceImpl /* With register combiners we can skip junk texture stages */ DWORD texUnitMap[MAX_SAMPLERS]; DWORD rev_tex_unit_map[MAX_SAMPLERS]; + BOOL fixed_function_usage_map[MAX_TEXTURES]; BOOL oneToOneTexUnitMap;
/* Stream source management */