Re: [v2 5/6] d3dx9: implement sampler and texture effect states application.
2016-03-01 18:10 GMT+01:00 Paul Gofman <gofmanp(a)gmail.com>:
Signed-off-by: Paul Gofman <gofmanp(a)gmail.com> --- dlls/d3dx9_36/effect.c | 37 +++++++++++++++++++++++++++++++++++-- dlls/d3dx9_36/tests/effect.c | 2 +- 2 files changed, 36 insertions(+), 3 deletions(-)
diff --git a/dlls/d3dx9_36/effect.c b/dlls/d3dx9_36/effect.c index decc048..8a359d0 100644 --- a/dlls/d3dx9_36/effect.c +++ b/dlls/d3dx9_36/effect.c @@ -2676,7 +2676,7 @@ HRESULT d3dx_set_shader_const_state(IDirect3DDevice9 *device, enum SHADER_CONSTA return D3D_OK; }
-static HRESULT d3dx9_apply_state(struct ID3DXEffectImpl *effect, struct d3dx_pass *pass, struct d3dx_state *state) +static HRESULT d3dx9_apply_state(struct ID3DXEffectImpl *effect, struct d3dx_pass *pass, struct d3dx_state *state, int parent_index) { IDirect3DDevice9 *device = effect->device; struct d3dx_parameter *param; @@ -2696,9 +2696,42 @@ static HRESULT d3dx9_apply_state(struct ID3DXEffectImpl *effect, struct d3dx_pas case SC_FVF: TRACE("%s: value %#x.\n", state_table[state->operation].name, *(DWORD *)param_value); return IDirect3DDevice9_SetFVF(device, *(DWORD *)param_value); + case SC_TEXTURE: + { + UINT sampler;
Technically this would be a texture unit (or texture stage) more than a sampler index.
+ + sampler = parent_index == -1 ? state->index : parent_index; + TRACE("%s: sampler %u value %p.\n", state_table[state->operation].name, sampler, *(IDirect3DBaseTexture9 **)param_value); + return IDirect3DDevice9_SetTexture(device, sampler, *(IDirect3DBaseTexture9 **)param_value); + } case SC_TEXTURESTAGE: TRACE("%s: stage %u value %u.\n", state_table[state->operation].name, state->index, *(DWORD *)param_value); return IDirect3DDevice9_SetTextureStageState(device, state->index, state_table[state->operation].op, *(DWORD *)param_value); + case SC_SETSAMPLER: + { + struct d3dx_sampler *sampler; + HRESULT ret, hr; + int i; + + sampler = (struct d3dx_sampler *)param_value; + TRACE("%s: sampler %u applying %u states.\n", state_table[state->operation].name, state->index, sampler->state_count); + ret = D3D_OK; + for (i = 0; i < sampler->state_count; i++) + { + hr = d3dx9_apply_state(effect, pass, &sampler->states[i], state->index); + if (FAILED(hr)) + ret = hr; + } + return ret; + } + case SC_SAMPLERSTATE: + { + UINT sampler; + + sampler = parent_index == -1 ? state->index : parent_index; + TRACE("%s sampler %u:%u.\n", state_table[state->operation].name, sampler, *(DWORD *)param_value);
Please use the same trace style you're using for the other states.
+ return IDirect3DDevice9_SetSamplerState(device, sampler, state_table[state->operation].op, *(DWORD *)param_value); + } case SC_VERTEXSHADER: TRACE("%s vertex shader %p.\n", state_table[state->operation].name, *(IDirect3DVertexShader9 **)param_value); hr = IDirect3DDevice9_SetVertexShader(device, *(IDirect3DVertexShader9 **)param_value); @@ -2772,7 +2805,7 @@ static HRESULT d3dx9_apply_pass_states(struct ID3DXEffectImpl *effect, struct d3 { HRESULT hr;
- hr = d3dx9_apply_state(effect, pass, &pass->states[i]); + hr = d3dx9_apply_state(effect, pass, &pass->states[i], -1); if (FAILED(hr)) { WARN("Error applying state: %#x.\n", hr); diff --git a/dlls/d3dx9_36/tests/effect.c b/dlls/d3dx9_36/tests/effect.c index 3184f26..a052bce 100644 --- a/dlls/d3dx9_36/tests/effect.c +++ b/dlls/d3dx9_36/tests/effect.c @@ -2929,7 +2929,7 @@ static void test_effect_states(IDirect3DDevice9 *device)
hr = IDirect3DDevice9_GetSamplerState(device, 1, D3DSAMP_MIPFILTER, &value); ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); - todo_wine ok(value == D3DTEXF_LINEAR, "Unexpected sampler 1 mipfilter %u.\n", value); + ok(value == D3DTEXF_LINEAR, "Unexpected sampler 1 mipfilter %u.\n", value);
hr = IDirect3DDevice9_GetTextureStageState(device, 3, D3DTSS_ALPHAOP, &value); ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK).\n", hr); -- 2.5.0
participants (1)
-
Matteo Bruni