Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/ddraw/tests/ddraw7.c | 182 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 182 insertions(+)
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c index eccaf86190..3dca4dc2da 100644 --- a/dlls/ddraw/tests/ddraw7.c +++ b/dlls/ddraw/tests/ddraw7.c @@ -16374,6 +16374,187 @@ static void test_viewport_state(void) DestroyWindow(window); }
+static void test_material_state(void) +{ + D3DMATERIAL7 material1, material2, material; + static const D3DCOLORVALUE null_color; + IDirect3DDevice7 *device; + DWORD stateblock; + ULONG refcount; + HWND window; + HRESULT hr; + + window = create_window(); + if (!(device = create_device(window, DDSCL_NORMAL))) + { + skip("Failed to create 3D device.\n"); + DestroyWindow(window); + return; + } + + hr = IDirect3DDevice7_GetMaterial(device, &material); + ok(SUCCEEDED(hr), "Failed to get material, hr %#x.\n", hr); + ok(!memcmp(&U(material).diffuse, &null_color, sizeof(null_color)), + "Got unexpected diffuse color {%.8e, %.8e, %.8e, %.8e}.\n", + U1(U(material).diffuse).r, U2(U(material).diffuse).g, + U3(U(material).diffuse).b, U4(U(material).diffuse).a); + ok(!memcmp(&U1(material).ambient, &null_color, sizeof(null_color)), + "Got unexpected ambient color {%.8e, %.8e, %.8e, %.8e}.\n", + U1(U1(material).ambient).r, U2(U1(material).ambient).g, + U3(U1(material).ambient).b, U4(U1(material).ambient).a); + ok(!memcmp(&U2(material).specular, &null_color, sizeof(null_color)), + "Got unexpected specular color {%.8e, %.8e, %.8e, %.8e}.\n", + U1(U2(material).specular).r, U2(U2(material).specular).g, + U3(U2(material).specular).b, U4(U2(material).specular).a); + ok(!memcmp(&U3(material).emissive, &null_color, sizeof(null_color)), + "Got unexpected emissive color {%.8e, %.8e, %.8e, %.8e}.\n", + U1(U3(material).emissive).r, U2(U3(material).emissive).g, + U3(U3(material).emissive).b, U4(U3(material).emissive).a); + ok(U4(material).power == 0.0f, "Got unexpected power %.8e.\n", U4(material).power); + + memset(&material1, 0x11, sizeof(material1)); + memset(&material2, 0x22, sizeof(material2)); + + hr = IDirect3DDevice7_SetMaterial(device, &material1); + ok(hr == S_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_GetMaterial(device, &material); + ok(hr == S_OK, "Got unexpected hr %#x.\n", hr); + ok(!memcmp(&material, &material1, sizeof(material1)), "Got unexpected material.\n"); + + /* Recorded stateblock. */ + + hr = IDirect3DDevice7_BeginStateBlock(device); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_SetMaterial(device, &material2); + ok(hr == S_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_EndStateBlock(device, &stateblock); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_GetMaterial(device, &material); + ok(hr == S_OK, "Got unexpected hr %#x.\n", hr); + ok(!memcmp(&material, &material1, sizeof(material1)), "Got unexpected material.\n"); + + hr = IDirect3DDevice7_ApplyStateBlock(device, stateblock); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_GetMaterial(device, &material); + ok(hr == S_OK, "Got unexpected hr %#x.\n", hr); + ok(!memcmp(&material, &material2, sizeof(material2)), "Got unexpected material.\n"); + + hr = IDirect3DDevice7_SetMaterial(device, &material1); + ok(hr == S_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_CaptureStateBlock(device, stateblock); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_SetMaterial(device, &material2); + ok(hr == S_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_ApplyStateBlock(device, stateblock); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_GetMaterial(device, &material); + ok(hr == S_OK, "Got unexpected hr %#x.\n", hr); + ok(!memcmp(&material, &material1, sizeof(material1)), "Got unexpected material.\n"); + + /* Predefined stateblock, D3DSBT_ALL. */ + + hr = IDirect3DDevice7_CreateStateBlock(device, D3DSBT_ALL, &stateblock); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_SetMaterial(device, &material2); + ok(hr == S_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_ApplyStateBlock(device, stateblock); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_GetMaterial(device, &material); + ok(hr == S_OK, "Got unexpected hr %#x.\n", hr); + ok(!memcmp(&material, &material1, sizeof(material1)), "Got unexpected material.\n"); + + hr = IDirect3DDevice7_SetMaterial(device, &material2); + ok(hr == S_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_CaptureStateBlock(device, stateblock); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_SetMaterial(device, &material1); + ok(hr == S_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_ApplyStateBlock(device, stateblock); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_GetMaterial(device, &material); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + ok(!memcmp(&material, &material2, sizeof(material2)), "Got unexpected material.\n"); + + hr = IDirect3DDevice7_SetMaterial(device, &material1); + ok(hr == S_OK, "Got unexpected hr %#x.\n", hr); + + /* Predefined stateblock, D3DSBT_VERTEXSTATE. */ + + hr = IDirect3DDevice7_CreateStateBlock(device, D3DSBT_VERTEXSTATE, &stateblock); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_SetMaterial(device, &material2); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_ApplyStateBlock(device, stateblock); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_GetMaterial(device, &material); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + ok(!memcmp(&material, &material2, sizeof(material2)), "Got unexpected material.\n"); + + hr = IDirect3DDevice7_CaptureStateBlock(device, stateblock); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_SetMaterial(device, &material1); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_ApplyStateBlock(device, stateblock); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_GetMaterial(device, &material); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + ok(!memcmp(&material, &material1, sizeof(material1)), "Got unexpected material.\n"); + + /* Predefined stateblock, D3DSBT_VERTEXSTATE. */ + + hr = IDirect3DDevice7_CreateStateBlock(device, D3DSBT_VERTEXSTATE, &stateblock); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_SetMaterial(device, &material2); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_ApplyStateBlock(device, stateblock); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_GetMaterial(device, &material); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + ok(!memcmp(&material, &material2, sizeof(material2)), "Got unexpected material.\n"); + + hr = IDirect3DDevice7_CaptureStateBlock(device, stateblock); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_SetMaterial(device, &material1); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_ApplyStateBlock(device, stateblock); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice7_GetMaterial(device, &material); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + ok(!memcmp(&material, &material1, sizeof(material1)), "Got unexpected material.\n"); + + refcount = IDirect3DDevice7_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); + DestroyWindow(window); +} + START_TEST(ddraw7) { DDDEVICEIDENTIFIER2 identifier; @@ -16521,4 +16702,5 @@ START_TEST(ddraw7) test_begin_end_state_block(); test_transform_state(); test_viewport_state(); + test_material_state(); }