summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/state_trackers/nine/device9.c24
-rw-r--r--src/gallium/state_trackers/nine/nine_state.c28
-rw-r--r--src/gallium/state_trackers/nine/nine_state.h3
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_ */