From 4546a13d98f03377628ad1370445e51e9e59d437 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Tue, 21 Sep 2010 21:20:54 +0200 Subject: [PATCH] wined3d: Move light state to wined3d_state. --- dlls/wined3d/device.c | 18 +++++++++--------- dlls/wined3d/state.c | 4 ++-- dlls/wined3d/stateblock.c | 24 +++++++++++++----------- dlls/wined3d/wined3d_private.h | 12 ++++++------ 4 files changed, 30 insertions(+), 28 deletions(-) diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index c7dbe04fa6..289c2a4a0f 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -2546,7 +2546,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLight(IWineD3DDevice *iface, DWORD I return WINED3DERR_INVALIDCALL; } - LIST_FOR_EACH(e, &This->updateStateBlock->lightMap[Hi]) + LIST_FOR_EACH(e, &This->updateStateBlock->state.light_map[Hi]) { object = LIST_ENTRY(e, struct wined3d_light_info, entry); if(object->OriginalIndex == Index) break; @@ -2560,7 +2560,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLight(IWineD3DDevice *iface, DWORD I ERR("Out of memory error when allocating a light\n"); return E_OUTOFMEMORY; } - list_add_head(&This->updateStateBlock->lightMap[Hi], &object->entry); + list_add_head(&This->updateStateBlock->state.light_map[Hi], &object->entry); object->glIndex = -1; object->OriginalIndex = Index; } @@ -2659,7 +2659,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetLight(IWineD3DDevice *iface, DWORD I struct list *e; TRACE("(%p) : Idx(%d), pLight(%p)\n", This, Index, pLight); - LIST_FOR_EACH(e, &This->stateBlock->lightMap[Hi]) + LIST_FOR_EACH(e, &This->stateBlock->state.light_map[Hi]) { lightInfo = LIST_ENTRY(e, struct wined3d_light_info, entry); if(lightInfo->OriginalIndex == Index) break; @@ -2688,7 +2688,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLightEnable(IWineD3DDevice *iface, D struct list *e; TRACE("(%p) : Idx(%d), enable? %d\n", This, Index, Enable); - LIST_FOR_EACH(e, &This->updateStateBlock->lightMap[Hi]) + LIST_FOR_EACH(e, &This->updateStateBlock->state.light_map[Hi]) { lightInfo = LIST_ENTRY(e, struct wined3d_light_info, entry); if(lightInfo->OriginalIndex == Index) break; @@ -2703,7 +2703,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLightEnable(IWineD3DDevice *iface, D IWineD3DDeviceImpl_SetLight(iface, Index, &WINED3D_default_light); /* Search for it again! Should be fairly quick as near head of list */ - LIST_FOR_EACH(e, &This->updateStateBlock->lightMap[Hi]) + LIST_FOR_EACH(e, &This->updateStateBlock->state.light_map[Hi]) { lightInfo = LIST_ENTRY(e, struct wined3d_light_info, entry); if(lightInfo->OriginalIndex == Index) break; @@ -2722,7 +2722,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLightEnable(IWineD3DDevice *iface, D IWineD3DDeviceImpl_MarkStateDirty(This, STATE_ACTIVELIGHT(lightInfo->glIndex)); } - This->updateStateBlock->activeLights[lightInfo->glIndex] = NULL; + This->updateStateBlock->state.lights[lightInfo->glIndex] = NULL; lightInfo->glIndex = -1; } else { TRACE("Light already disabled, nothing to do\n"); @@ -2738,9 +2738,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetLightEnable(IWineD3DDevice *iface, D /* Find a free gl light */ for (i = 0; i < This->maxConcurrentLights; ++i) { - if (!This->updateStateBlock->activeLights[i]) + if (!This->updateStateBlock->state.lights[i]) { - This->updateStateBlock->activeLights[i] = lightInfo; + This->updateStateBlock->state.lights[i] = lightInfo; lightInfo->glIndex = i; break; } @@ -2775,7 +2775,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetLightEnable(IWineD3DDevice *iface, D UINT Hi = LIGHTMAP_HASHFUNC(Index); TRACE("(%p) : for idx(%d)\n", This, Index); - LIST_FOR_EACH(e, &This->stateBlock->lightMap[Hi]) + LIST_FOR_EACH(e, &This->stateBlock->state.light_map[Hi]) { lightInfo = LIST_ENTRY(e, struct wined3d_light_info, entry); if(lightInfo->OriginalIndex == Index) break; diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index 5f732f94ea..f7072f582b 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -3938,7 +3938,7 @@ static void transform_view(DWORD state, IWineD3DStateBlockImpl *stateblock, stru /* Reset lights. TODO: Call light apply func */ for (k = 0; k < stateblock->device->maxConcurrentLights; ++k) { - light = stateblock->activeLights[k]; + light = stateblock->state.lights[k]; if(!light) continue; glLightfv(GL_LIGHT0 + light->glIndex, GL_POSITION, light->lightPosn); checkGLcall("glLightfv posn"); @@ -4812,7 +4812,7 @@ static void viewport_vertexpart(DWORD state, IWineD3DStateBlockImpl *stateblock, static void light(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { UINT Index = state - STATE_ACTIVELIGHT(0); - const struct wined3d_light_info *lightInfo = stateblock->activeLights[Index]; + const struct wined3d_light_info *lightInfo = stateblock->state.lights[Index]; if(!lightInfo) { glDisable(GL_LIGHT0 + Index); diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index 82e60819b0..c8152c838c 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -452,7 +452,7 @@ static void stateblock_init_lights(IWineD3DStateBlockImpl *stateblock, struct li struct wined3d_light_info *dst_light = HeapAlloc(GetProcessHeap(), 0, sizeof(*dst_light)); *dst_light = *src_light; - list_add_tail(&stateblock->lightMap[i], &dst_light->entry); + list_add_tail(&stateblock->state.light_map[i], &dst_light->entry); } } } @@ -518,7 +518,7 @@ static ULONG WINAPI IWineD3DStateBlockImpl_Release(IWineD3DStateBlock *iface) { for(counter = 0; counter < LIGHTMAP_SIZE; counter++) { struct list *e1, *e2; - LIST_FOR_EACH_SAFE(e1, e2, &This->lightMap[counter]) + LIST_FOR_EACH_SAFE(e1, e2, &This->state.light_map[counter]) { struct wined3d_light_info *light = LIST_ENTRY(e1, struct wined3d_light_info, entry); list_remove(&light->entry); @@ -549,12 +549,14 @@ static void record_lights(IWineD3DStateBlockImpl *This, const IWineD3DStateBlock */ for(i = 0; i < LIGHTMAP_SIZE; i++) { struct list *e, *f; - LIST_FOR_EACH(e, &This->lightMap[i]) { + LIST_FOR_EACH(e, &This->state.light_map[i]) + { BOOL updated = FALSE; struct wined3d_light_info *src = LIST_ENTRY(e, struct wined3d_light_info, entry), *realLight; /* Look up the light in the destination */ - LIST_FOR_EACH(f, &targetStateBlock->lightMap[i]) { + LIST_FOR_EACH(f, &targetStateBlock->state.light_map[i]) + { realLight = LIST_ENTRY(f, struct wined3d_light_info, entry); if (realLight->OriginalIndex == src->OriginalIndex) { @@ -563,12 +565,12 @@ static void record_lights(IWineD3DStateBlockImpl *This, const IWineD3DStateBlock if (realLight->glIndex == -1 && src->glIndex != -1) { /* Light disabled */ - This->activeLights[src->glIndex] = NULL; + This->state.lights[src->glIndex] = NULL; } else if (realLight->glIndex != -1 && src->glIndex == -1) { /* Light enabled */ - This->activeLights[realLight->glIndex] = src; + This->state.lights[realLight->glIndex] = src; } src->glIndex = realLight->glIndex; updated = TRUE; @@ -586,7 +588,7 @@ static void record_lights(IWineD3DStateBlockImpl *This, const IWineD3DStateBlock src->OriginalParms = WINED3D_default_light; if (src->glIndex != -1) { - This->activeLights[src->glIndex] = NULL; + This->state.lights[src->glIndex] = NULL; src->glIndex = -1; } } @@ -896,7 +898,7 @@ static void apply_lights(IWineD3DDevice *device, const IWineD3DStateBlockImpl *T for(i = 0; i < LIGHTMAP_SIZE; i++) { struct list *e; - LIST_FOR_EACH(e, &This->lightMap[i]) + LIST_FOR_EACH(e, &This->state.light_map[i]) { const struct wined3d_light_info *light = LIST_ENTRY(e, struct wined3d_light_info, entry); @@ -1371,7 +1373,7 @@ HRESULT stateblock_init(IWineD3DStateBlockImpl *stateblock, IWineD3DDeviceImpl * for (i = 0; i < LIGHTMAP_SIZE; i++) { - list_init(&stateblock->lightMap[i]); + list_init(&stateblock->state.light_map[i]); } hr = stateblock_allocate_shader_constants(stateblock); @@ -1387,7 +1389,7 @@ HRESULT stateblock_init(IWineD3DStateBlockImpl *stateblock, IWineD3DDeviceImpl * switch (type) { case WINED3DSBT_ALL: - stateblock_init_lights(stateblock, device->stateBlock->lightMap); + stateblock_init_lights(stateblock, device->stateBlock->state.light_map); stateblock_savedstates_set_all(&stateblock->changed, device->d3d_vshader_constantF, device->d3d_pshader_constantF); break; @@ -1397,7 +1399,7 @@ HRESULT stateblock_init(IWineD3DStateBlockImpl *stateblock, IWineD3DDeviceImpl * break; case WINED3DSBT_VERTEXSTATE: - stateblock_init_lights(stateblock, device->stateBlock->lightMap); + stateblock_init_lights(stateblock, device->stateBlock->state.light_map); stateblock_savedstates_set_vertex(&stateblock->changed, device->d3d_vshader_constantF); break; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index bc6a1a9dad..01c8469a1d 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2378,6 +2378,12 @@ struct wined3d_state WINED3DVIEWPORT viewport; RECT scissor_rect; + /* Light hashmap . Collisions are handled using standard wine double linked lists */ +#define LIGHTMAP_SIZE 43 /* Use of a prime number recommended. Set to 1 for a linked list! */ +#define LIGHTMAP_HASHFUNC(x) ((x) % LIGHTMAP_SIZE) /* Primitive and simple function */ + struct list light_map[LIGHTMAP_SIZE]; /* Hash map containing the lights */ + const struct wined3d_light_info *lights[MAX_ACTIVE_LIGHTS]; /* Map of opengl lights to d3d lights */ + DWORD render_states[WINEHIGHEST_RENDER_STATE + 1]; }; @@ -2395,12 +2401,6 @@ struct IWineD3DStateBlockImpl SAVEDSTATES changed; struct wined3d_state state; - /* Light hashmap . Collisions are handled using standard wine double linked lists */ -#define LIGHTMAP_SIZE 43 /* Use of a prime number recommended. Set to 1 for a linked list! */ -#define LIGHTMAP_HASHFUNC(x) ((x) % LIGHTMAP_SIZE) /* Primitive and simple function */ - struct list lightMap[LIGHTMAP_SIZE]; /* Hash map containing the lights */ - const struct wined3d_light_info *activeLights[MAX_ACTIVE_LIGHTS]; /* Map of opengl lights to d3d lights */ - /* Clipping */ double clipplane[MAX_CLIPPLANES][4]; WINED3DCLIPSTATUS clip_status;