mirror of
https://github.com/reactos/wine.git
synced 2024-11-26 05:00:30 +00:00
wined3d: Move light state to wined3d_state.
This commit is contained in:
parent
f4df53c41a
commit
4546a13d98
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user