[v2 1/4] d3dx9/tests: Add test implementation for ID3DXEffectStateManager interface.
Paul Gofman
gofmanp at gmail.com
Mon Apr 10 04:57:38 CDT 2017
Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---
v2:
- renamed test_ID3DXEffectStateManagerImpl to test_manager;
- removed QueryInterface implementation as it is not used.
- removed check for memory allocation success in test_process_set_state().
---
dlls/d3dx9_36/tests/effect.c | 239 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 239 insertions(+)
diff --git a/dlls/d3dx9_36/tests/effect.c b/dlls/d3dx9_36/tests/effect.c
index fd94e58..1b5d439 100644
--- a/dlls/d3dx9_36/tests/effect.c
+++ b/dlls/d3dx9_36/tests/effect.c
@@ -5309,6 +5309,244 @@ static void test_effect_preshader_relative_addressing(IDirect3DDevice9 *device)
effect->lpVtbl->Release(effect);
}
+struct test_state_manager_update
+{
+ unsigned int state_op;
+ DWORD param1;
+ DWORD param2;
+};
+
+struct test_manager
+{
+ ID3DXEffectStateManager ID3DXEffectStateManager_iface;
+ LONG ref;
+
+ IDirect3DDevice9 *device;
+ struct test_state_manager_update *update_record;
+ unsigned int update_record_count;
+ unsigned int update_record_size;
+};
+
+#define INITIAL_UPDATE_RECORD_SIZE 64
+
+static struct test_manager *impl_from_ID3DXEffectStateManager(ID3DXEffectStateManager *iface)
+{
+ return CONTAINING_RECORD(iface, struct test_manager, ID3DXEffectStateManager_iface);
+}
+
+static void free_test_effect_state_manager(struct test_manager *state_manager)
+{
+ HeapFree(GetProcessHeap(), 0, state_manager->update_record);
+ state_manager->update_record = NULL;
+
+ IDirect3DDevice9_Release(state_manager->device);
+}
+
+static ULONG WINAPI test_manager_AddRef(ID3DXEffectStateManager *iface)
+{
+ struct test_manager *state_manager = impl_from_ID3DXEffectStateManager(iface);
+
+ return InterlockedIncrement(&state_manager->ref);
+}
+
+static ULONG WINAPI test_manager_Release(ID3DXEffectStateManager *iface)
+{
+ struct test_manager *state_manager = impl_from_ID3DXEffectStateManager(iface);
+ ULONG ref = InterlockedDecrement(&state_manager->ref);
+
+ if (!ref)
+ {
+ free_test_effect_state_manager(state_manager);
+ HeapFree(GetProcessHeap(), 0, state_manager);
+ }
+ return ref;
+}
+
+static HRESULT test_process_set_state(ID3DXEffectStateManager *iface,
+ unsigned int state_op, DWORD param1, DWORD param2)
+{
+ struct test_manager *state_manager = impl_from_ID3DXEffectStateManager(iface);
+
+ if (state_manager->update_record_count == state_manager->update_record_size)
+ {
+ if (!state_manager->update_record_size)
+ {
+ state_manager->update_record_size = INITIAL_UPDATE_RECORD_SIZE;
+ state_manager->update_record = HeapAlloc(GetProcessHeap(), 0,
+ sizeof(*state_manager->update_record) * state_manager->update_record_size);
+ }
+ else
+ {
+ state_manager->update_record_size *= 2;
+ state_manager->update_record = HeapReAlloc(GetProcessHeap(), 0, state_manager->update_record,
+ sizeof(*state_manager->update_record) * state_manager->update_record_size);
+ }
+ }
+ state_manager->update_record[state_manager->update_record_count].state_op = state_op;
+ state_manager->update_record[state_manager->update_record_count].param1 = param1;
+ state_manager->update_record[state_manager->update_record_count].param2 = param2;
+ ++state_manager->update_record_count;
+ return D3D_OK;
+}
+
+static HRESULT WINAPI test_manager_SetTransform(ID3DXEffectStateManager *iface,
+ D3DTRANSFORMSTATETYPE state, const D3DMATRIX *matrix)
+{
+ return test_process_set_state(iface, 0, state, 0);
+}
+
+static HRESULT WINAPI test_manager_SetMaterial(ID3DXEffectStateManager *iface,
+ const D3DMATERIAL9 *material)
+{
+ return test_process_set_state(iface, 1, 0, 0);
+}
+
+static HRESULT WINAPI test_manager_SetLight(ID3DXEffectStateManager *iface,
+ DWORD index, const D3DLIGHT9 *light)
+{
+ return test_process_set_state(iface, 2, index, 0);
+}
+
+static HRESULT WINAPI test_manager_LightEnable(ID3DXEffectStateManager *iface,
+ DWORD index, BOOL enable)
+{
+ return test_process_set_state(iface, 3, index, 0);
+}
+
+static HRESULT WINAPI test_manager_SetRenderState(ID3DXEffectStateManager *iface,
+ D3DRENDERSTATETYPE state, DWORD value)
+{
+ return test_process_set_state(iface, 4, state, 0);
+}
+
+static HRESULT WINAPI test_manager_SetTexture(ID3DXEffectStateManager *iface,
+ DWORD stage, struct IDirect3DBaseTexture9 *texture)
+{
+ return test_process_set_state(iface, 5, stage, 0);
+}
+
+static HRESULT WINAPI test_manager_SetTextureStageState(ID3DXEffectStateManager *iface,
+ DWORD stage, D3DTEXTURESTAGESTATETYPE type, DWORD value)
+{
+ return test_process_set_state(iface, 6, stage, type);
+}
+
+static HRESULT WINAPI test_manager_SetSamplerState(ID3DXEffectStateManager *iface,
+ DWORD sampler, D3DSAMPLERSTATETYPE type, DWORD value)
+{
+ return test_process_set_state(iface, 7, sampler, type);
+}
+
+static HRESULT WINAPI test_manager_SetNPatchMode(ID3DXEffectStateManager *iface,
+ FLOAT num_segments)
+{
+ return test_process_set_state(iface, 8, 0, 0);
+}
+
+static HRESULT WINAPI test_manager_SetFVF(ID3DXEffectStateManager *iface,
+ DWORD format)
+{
+ return test_process_set_state(iface, 9, 0, 0);
+}
+
+static HRESULT WINAPI test_manager_SetVertexShader(ID3DXEffectStateManager *iface,
+ struct IDirect3DVertexShader9 *shader)
+{
+ return test_process_set_state(iface, 10, 0, 0);
+}
+
+static HRESULT WINAPI test_manager_SetVertexShaderConstantF(ID3DXEffectStateManager *iface,
+ UINT register_index, const FLOAT *constant_data, UINT register_count)
+{
+ return test_process_set_state(iface, 11, register_index, register_count);
+}
+
+static HRESULT WINAPI test_manager_SetVertexShaderConstantI(ID3DXEffectStateManager *iface,
+ UINT register_index, const INT *constant_data, UINT register_count)
+{
+ return test_process_set_state(iface, 12, register_index, register_count);
+}
+
+static HRESULT WINAPI test_manager_SetVertexShaderConstantB(ID3DXEffectStateManager *iface,
+ UINT register_index, const BOOL *constant_data, UINT register_count)
+{
+ return test_process_set_state(iface, 13, register_index, register_count);
+}
+
+static HRESULT WINAPI test_manager_SetPixelShader(ID3DXEffectStateManager *iface,
+ struct IDirect3DPixelShader9 *shader)
+{
+ return test_process_set_state(iface, 14, 0, 0);
+}
+
+static HRESULT WINAPI test_manager_SetPixelShaderConstantF(ID3DXEffectStateManager *iface,
+ UINT register_index, const FLOAT *constant_data, UINT register_count)
+{
+ return test_process_set_state(iface, 15, register_index, register_count);
+}
+
+static HRESULT WINAPI test_manager_SetPixelShaderConstantI(ID3DXEffectStateManager *iface,
+ UINT register_index, const INT *constant_data, UINT register_count)
+{
+ return test_process_set_state(iface, 16, register_index, register_count);
+}
+
+static HRESULT WINAPI test_manager_SetPixelShaderConstantB(ID3DXEffectStateManager *iface,
+ UINT register_index, const BOOL *constant_data, UINT register_count)
+{
+ return test_process_set_state(iface, 17, register_index, register_count);
+}
+
+static void test_effect_state_manager_init(struct test_manager *state_manager,
+ IDirect3DDevice9 *device)
+{
+ static const struct ID3DXEffectStateManagerVtbl test_ID3DXEffectStateManager_Vtbl =
+ {
+ /*** IUnknown methods ***/
+ NULL,
+ test_manager_AddRef,
+ test_manager_Release,
+ /*** ID3DXEffectStateManager methods ***/
+ test_manager_SetTransform,
+ test_manager_SetMaterial,
+ test_manager_SetLight,
+ test_manager_LightEnable,
+ test_manager_SetRenderState,
+ test_manager_SetTexture,
+ test_manager_SetTextureStageState,
+ test_manager_SetSamplerState,
+ test_manager_SetNPatchMode,
+ test_manager_SetFVF,
+ test_manager_SetVertexShader,
+ test_manager_SetVertexShaderConstantF,
+ test_manager_SetVertexShaderConstantI,
+ test_manager_SetVertexShaderConstantB,
+ test_manager_SetPixelShader,
+ test_manager_SetPixelShaderConstantF,
+ test_manager_SetPixelShaderConstantI,
+ test_manager_SetPixelShaderConstantB,
+ };
+
+ state_manager->ID3DXEffectStateManager_iface.lpVtbl = &test_ID3DXEffectStateManager_Vtbl;
+ state_manager->ref = 1;
+
+ IDirect3DDevice9_AddRef(device);
+ state_manager->device = device;
+}
+
+static void test_effect_state_manager(IDirect3DDevice9 *device)
+{
+ struct test_manager *state_manager;
+ ULONG refcount;
+
+ state_manager = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*state_manager));
+ test_effect_state_manager_init(state_manager, device);
+
+ refcount = state_manager->ID3DXEffectStateManager_iface.lpVtbl
+ ->Release(&state_manager->ID3DXEffectStateManager_iface);
+ ok(!refcount, "State manager was not properly freed, refcount %u.\n", refcount);
+}
+
START_TEST(effect)
{
HWND wnd;
@@ -5355,6 +5593,7 @@ START_TEST(effect)
test_effect_out_of_bounds_selector(device);
test_effect_commitchanges(device);
test_effect_preshader_relative_addressing(device);
+ test_effect_state_manager(device);
count = IDirect3DDevice9_Release(device);
ok(count == 0, "The device was not properly freed: refcount %u\n", count);
--
2.9.3
More information about the wine-patches
mailing list