diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/state_trackers/nine/device9.c | 24 | ||||
-rw-r--r-- | src/gallium/state_trackers/nine/nine_state.c | 28 | ||||
-rw-r--r-- | src/gallium/state_trackers/nine/nine_state.h | 3 |
3 files changed, 35 insertions, 20 deletions
diff --git a/src/gallium/state_trackers/nine/device9.c b/src/gallium/state_trackers/nine/device9.c index 2587ad1d7ae..74c1bea7857 100644 --- a/src/gallium/state_trackers/nine/device9.c +++ b/src/gallium/state_trackers/nine/device9.c @@ -2073,6 +2073,7 @@ NineDevice9_SetLight( struct NineDevice9 *This, const D3DLIGHT9 *pLight ) { struct nine_state *state = This->update; + HRESULT hr; DBG("This=%p Index=%u pLight=%p\n", This, Index, pLight); if (pLight) @@ -2083,27 +2084,10 @@ NineDevice9_SetLight( struct NineDevice9 *This, user_assert(Index < NINE_MAX_LIGHTS, D3DERR_INVALIDCALL); /* sanity */ - if (Index >= state->ff.num_lights) { - unsigned n = state->ff.num_lights; - unsigned N = Index + 1; - - state->ff.light = REALLOC(state->ff.light, n * sizeof(D3DLIGHT9), - N * sizeof(D3DLIGHT9)); - if (!state->ff.light) - return E_OUTOFMEMORY; - state->ff.num_lights = N; - - for (; n < Index; ++n) { - memset(&state->ff.light[n], 0, sizeof(D3DLIGHT9)); - state->ff.light[n].Type = (D3DLIGHTTYPE)NINED3DLIGHT_INVALID; - } - } - state->ff.light[Index] = *pLight; + hr = nine_state_set_light(&state->ff, Index, pLight); + if (hr != D3D_OK) + return hr; - if (pLight->Type == D3DLIGHT_SPOT && pLight->Theta >= pLight->Phi) { - DBG("Warning: clamping D3DLIGHT9.Theta\n"); - state->ff.light[Index].Theta = state->ff.light[Index].Phi; - } if (pLight->Type != D3DLIGHT_DIRECTIONAL && pLight->Attenuation0 == 0.0f && pLight->Attenuation1 == 0.0f && diff --git a/src/gallium/state_trackers/nine/nine_state.c b/src/gallium/state_trackers/nine/nine_state.c index 47fe31d391c..0767126db3c 100644 --- a/src/gallium/state_trackers/nine/nine_state.c +++ b/src/gallium/state_trackers/nine/nine_state.c @@ -2826,6 +2826,34 @@ nine_state_access_transform(struct nine_ff_state *ff_state, D3DTRANSFORMSTATETYP return &ff_state->transform[index]; } +HRESULT +nine_state_set_light(struct nine_ff_state *ff_state, DWORD Index, + const D3DLIGHT9 *pLight) +{ + if (Index >= ff_state->num_lights) { + unsigned n = ff_state->num_lights; + unsigned N = Index + 1; + + ff_state->light = REALLOC(ff_state->light, n * sizeof(D3DLIGHT9), + N * sizeof(D3DLIGHT9)); + if (!ff_state->light) + return E_OUTOFMEMORY; + ff_state->num_lights = N; + + for (; n < Index; ++n) { + memset(&ff_state->light[n], 0, sizeof(D3DLIGHT9)); + ff_state->light[n].Type = (D3DLIGHTTYPE)NINED3DLIGHT_INVALID; + } + } + ff_state->light[Index] = *pLight; + + if (pLight->Type == D3DLIGHT_SPOT && pLight->Theta >= pLight->Phi) { + DBG("Warning: clamping D3DLIGHT9.Theta\n"); + ff_state->light[Index].Theta = ff_state->light[Index].Phi; + } + return D3D_OK; +} + #define D3DRS_TO_STRING_CASE(n) case D3DRS_##n: return "D3DRS_"#n const char *nine_d3drs_to_string(DWORD State) { diff --git a/src/gallium/state_trackers/nine/nine_state.h b/src/gallium/state_trackers/nine/nine_state.h index d73c40681f8..314dd7c06e4 100644 --- a/src/gallium/state_trackers/nine/nine_state.h +++ b/src/gallium/state_trackers/nine/nine_state.h @@ -462,6 +462,9 @@ D3DMATRIX * nine_state_access_transform(struct nine_ff_state *, D3DTRANSFORMSTATETYPE, boolean alloc); +HRESULT +nine_state_set_light(struct nine_ff_state *, DWORD, const D3DLIGHT9 *); + const char *nine_d3drs_to_string(DWORD State); #endif /* _NINE_STATE_H_ */ |