From: Paul Gofman pgofman@codeweavers.com
--- dlls/ddraw/surface.c | 10 ++++++++- dlls/ddraw/tests/ddraw1.c | 40 +++++++++++++++++++++++++++++++++ dlls/ddraw/tests/ddraw2.c | 46 ++++++++++++++++++++++++++++++++++++++ dlls/ddraw/tests/ddraw4.c | 47 +++++++++++++++++++++++++++++++++++++++ dlls/ddraw/tests/ddraw7.c | 47 +++++++++++++++++++++++++++++++++++++++ dlls/quartz/tests/vmr7.c | 6 +++-- 6 files changed, 193 insertions(+), 3 deletions(-)
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index a096c5d7d8e..be15b38fe92 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -6840,11 +6840,19 @@ HRESULT ddraw_surface_create(struct ddraw *ddraw, const DDSURFACEDESC2 *surface_ { if (!(desc->ddsCaps.dwCaps2 & (DDSCAPS2_TEXTUREMANAGE | DDSCAPS2_D3DTEXTUREMANAGE))) { - unsigned int bind_flags = WINED3D_BIND_SHADER_RESOURCE; + unsigned int bind_flags = 0; DWORD usage = 0;
if (desc->ddsCaps.dwCaps2 & DDSCAPS2_CUBEMAP) + { usage |= WINED3DUSAGE_LEGACY_CUBEMAP; + bind_flags |= WINED3D_BIND_SHADER_RESOURCE; + } + else if (desc->ddsCaps.dwCaps & DDSCAPS_TEXTURE) + { + bind_flags |= WINED3D_BIND_SHADER_RESOURCE; + } + if (desc->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) bind_flags |= WINED3D_BIND_DEPTH_STENCIL; else if (desc->ddsCaps.dwCaps & DDSCAPS_3DDEVICE) diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c index d8fcb188c40..bad439ec9d1 100644 --- a/dlls/ddraw/tests/ddraw1.c +++ b/dlls/ddraw/tests/ddraw1.c @@ -4563,6 +4563,7 @@ static void test_unsupported_formats(void)
static void test_rt_caps(const GUID *device_guid) { + DWORD fourcc_codes[64], fourcc_code_count; PALETTEENTRY palette_entries[256]; IDirectDrawPalette *palette; IDirect3DDevice *device; @@ -4580,6 +4581,12 @@ static void test_rt_caps(const GUID *device_guid) sizeof(DDPIXELFORMAT), DDPF_PALETTEINDEXED8 | DDPF_RGB, 0, {8}, {0x00000000}, {0x00000000}, {0x00000000}, {0x00000000}, }; + static const DDPIXELFORMAT fourcc_fmt = + { + .dwSize = sizeof(DDPIXELFORMAT), + .dwFlags = DDPF_FOURCC, + .dwFourCC = MAKEFOURCC('Y','U','Y','2'), + };
static const struct { @@ -4710,6 +4717,12 @@ static void test_rt_caps(const GUID *device_guid) DDERR_INVALIDCAPS, TRUE /* Nvidia Kepler */, }, + { + &fourcc_fmt, + DDSCAPS_FLIP | DDSCAPS_COMPLEX | DDSCAPS_OFFSCREENPLAIN, + DDERR_INVALIDCAPS, + FALSE, + }, };
software_device = is_software_device_type(device_guid); @@ -4737,6 +4750,10 @@ static void test_rt_caps(const GUID *device_guid) hr = IDirectDraw_GetCaps(ddraw, &hal_caps, NULL); ok(hr == DD_OK, "Got unexpected hr %#lx.\n", hr);
+ fourcc_code_count = ARRAY_SIZE(fourcc_codes); + hr = IDirectDraw4_GetFourCCCodes(ddraw, &fourcc_code_count, fourcc_codes); + ok(hr == DD_OK, "Got unexpected hr %#lx.\n", hr); + for (i = 0; i < ARRAY_SIZE(test_data); ++i) { DWORD caps_in, expected_caps; @@ -4753,6 +4770,21 @@ static void test_rt_caps(const GUID *device_guid) surface_desc.ddsCaps.dwCaps = caps_in; if (test_data[i].pf) { + if (test_data[i].pf->dwFlags & DDPF_FOURCC) + { + unsigned int j; + + for (j = 0; j < fourcc_code_count; ++j) + { + if (test_data[i].pf->dwFourCC == fourcc_codes[j]) + break; + } + if (j == fourcc_code_count) + { + skip("Fourcc format %#lx is not supported, skipping test.\n", test_data[i].pf->dwFourCC); + continue; + } + } surface_desc.dwFlags |= DDSD_PIXELFORMAT; surface_desc.ddpfPixelFormat = *test_data[i].pf; } @@ -4761,6 +4793,11 @@ static void test_rt_caps(const GUID *device_guid) surface_desc.dwFlags |= DDSD_ZBUFFERBITDEPTH; surface_desc.dwZBufferBitDepth = z_depth; } + if (caps_in & DDSCAPS_FLIP) + { + surface_desc.dwFlags |= DDSD_BACKBUFFERCOUNT; + surface_desc.dwBackBufferCount = 1; + } surface_desc.dwWidth = 640; surface_desc.dwHeight = 480; if ((caps_in & DDSCAPS_VIDEOMEMORY) && !(hal_caps.ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY)) @@ -4784,6 +4821,9 @@ static void test_rt_caps(const GUID *device_guid) else expected_caps = caps_in | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM;
+ if (caps_in & DDSCAPS_FLIP) + expected_caps |= DDSCAPS_FRONTBUFFER; + ok(surface_desc.ddsCaps.dwCaps == expected_caps || (test_data[i].pf == &p8_fmt && surface_desc.ddsCaps.dwCaps == (caps_in | DDSCAPS_SYSTEMMEMORY)) || (software_device && caps_in & DDSCAPS_ZBUFFER diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c index f4cc5df0558..c15938c303b 100644 --- a/dlls/ddraw/tests/ddraw2.c +++ b/dlls/ddraw/tests/ddraw2.c @@ -5007,6 +5007,7 @@ static void test_unsupported_formats(void)
static void test_rt_caps(const GUID *device_guid) { + DWORD fourcc_codes[64], fourcc_code_count; PALETTEENTRY palette_entries[256]; IDirectDrawPalette *palette; IDirect3DDevice2 *device; @@ -5025,6 +5026,12 @@ static void test_rt_caps(const GUID *device_guid) sizeof(DDPIXELFORMAT), DDPF_PALETTEINDEXED8 | DDPF_RGB, 0, {8}, {0x00000000}, {0x00000000}, {0x00000000}, {0x00000000}, }; + static const DDPIXELFORMAT fourcc_fmt = + { + .dwSize = sizeof(DDPIXELFORMAT), + .dwFlags = DDPF_FOURCC, + .dwFourCC = MAKEFOURCC('Y','U','Y','2'), + };
static const struct { @@ -5197,6 +5204,13 @@ static void test_rt_caps(const GUID *device_guid) DDERR_INVALIDCAPS, TRUE /* Nvidia Kepler */, }, + { + &fourcc_fmt, + DDSCAPS_FLIP | DDSCAPS_COMPLEX | DDSCAPS_OFFSCREENPLAIN, + DDERR_INVALIDCAPS, + DDERR_INVALIDCAPS, + DDERR_INVALIDCAPS, + }, };
software_device = is_software_device_type(device_guid); @@ -5230,6 +5244,10 @@ static void test_rt_caps(const GUID *device_guid) hr = IDirectDraw2_GetCaps(ddraw, &hal_caps, NULL); ok(hr == DD_OK, "Got unexpected hr %#lx.\n", hr);
+ fourcc_code_count = ARRAY_SIZE(fourcc_codes); + hr = IDirectDraw4_GetFourCCCodes(ddraw, &fourcc_code_count, fourcc_codes); + ok(hr == DD_OK, "Got unexpected hr %#lx.\n", hr); + for (i = 0; i < ARRAY_SIZE(test_data); ++i) { IDirectDrawSurface *surface, *rt, *expected_rt, *tmp; @@ -5246,6 +5264,21 @@ static void test_rt_caps(const GUID *device_guid) surface_desc.ddsCaps.dwCaps = caps_in; if (test_data[i].pf) { + if (test_data[i].pf->dwFlags & DDPF_FOURCC) + { + unsigned int j; + + for (j = 0; j < fourcc_code_count; ++j) + { + if (test_data[i].pf->dwFourCC == fourcc_codes[j]) + break; + } + if (j == fourcc_code_count) + { + skip("Fourcc format %#lx is not supported, skipping test.\n", test_data[i].pf->dwFourCC); + continue; + } + } surface_desc.dwFlags |= DDSD_PIXELFORMAT; surface_desc.ddpfPixelFormat = *test_data[i].pf; } @@ -5254,6 +5287,11 @@ static void test_rt_caps(const GUID *device_guid) surface_desc.dwFlags |= DDSD_ZBUFFERBITDEPTH; surface_desc.dwZBufferBitDepth = z_depth; } + if (caps_in & DDSCAPS_FLIP) + { + surface_desc.dwFlags |= DDSD_BACKBUFFERCOUNT; + surface_desc.dwBackBufferCount = 1; + } surface_desc.dwWidth = 640; surface_desc.dwHeight = 480; if ((caps_in & DDSCAPS_VIDEOMEMORY) && !(hal_caps.ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY)) @@ -5276,6 +5314,9 @@ static void test_rt_caps(const GUID *device_guid) else expected_caps = caps_in | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM;
+ if (caps_in & DDSCAPS_FLIP) + expected_caps |= DDSCAPS_FRONTBUFFER; + ok(surface_desc.ddsCaps.dwCaps == expected_caps || (test_data[i].pf == &p8_fmt && surface_desc.ddsCaps.dwCaps == (caps_in | DDSCAPS_SYSTEMMEMORY)) || (software_device && caps_in & DDSCAPS_ZBUFFER @@ -5343,6 +5384,11 @@ static void test_rt_caps(const GUID *device_guid) surface_desc.dwFlags |= DDSD_ZBUFFERBITDEPTH; surface_desc.dwZBufferBitDepth = z_depth; } + if (caps_in & DDSCAPS_FLIP) + { + surface_desc.dwFlags |= DDSD_BACKBUFFERCOUNT; + surface_desc.dwBackBufferCount = 1; + } surface_desc.dwWidth = 640; surface_desc.dwHeight = 480; hr = IDirectDraw2_CreateSurface(ddraw, &surface_desc, &rt, NULL); diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c index 4811053a231..6db90a9c08c 100644 --- a/dlls/ddraw/tests/ddraw4.c +++ b/dlls/ddraw/tests/ddraw4.c @@ -6615,6 +6615,7 @@ static void test_unsupported_formats(void)
static void test_rt_caps(const GUID *device_guid) { + DWORD fourcc_codes[64], fourcc_code_count; PALETTEENTRY palette_entries[256]; IDirectDrawPalette *palette; BOOL software_device; @@ -6632,6 +6633,12 @@ static void test_rt_caps(const GUID *device_guid) sizeof(DDPIXELFORMAT), DDPF_PALETTEINDEXED8 | DDPF_RGB, 0, {8}, {0x00000000}, {0x00000000}, {0x00000000}, {0x00000000}, }; + static const DDPIXELFORMAT fourcc_fmt = + { + .dwSize = sizeof(DDPIXELFORMAT), + .dwFlags = DDPF_FOURCC, + .dwFourCC = MAKEFOURCC('Y','U','Y','2'), + };
const struct { @@ -6819,6 +6826,14 @@ static void test_rt_caps(const GUID *device_guid) DDERR_INVALIDCAPS, DDERR_INVALIDCAPS, }, + { + &fourcc_fmt, + DDSCAPS_FLIP | DDSCAPS_COMPLEX | DDSCAPS_OFFSCREENPLAIN, + 0, + DDERR_INVALIDCAPS, + DDERR_INVALIDCAPS, + DDERR_INVALIDCAPS, + }, };
software_device = is_software_device_type(device_guid); @@ -6853,6 +6868,10 @@ static void test_rt_caps(const GUID *device_guid) hr = IDirectDraw4_GetCaps(ddraw, &hal_caps, NULL); ok(hr == DD_OK, "Got unexpected hr %#lx.\n", hr);
+ fourcc_code_count = ARRAY_SIZE(fourcc_codes); + hr = IDirectDraw4_GetFourCCCodes(ddraw, &fourcc_code_count, fourcc_codes); + ok(hr == DD_OK, "Got unexpected hr %#lx.\n", hr); + for (i = 0; i < ARRAY_SIZE(test_data); ++i) { IDirectDrawSurface4 *surface, *rt, *expected_rt, *tmp; @@ -6870,9 +6889,29 @@ static void test_rt_caps(const GUID *device_guid) surface_desc.ddsCaps.dwCaps2 = test_data[i].caps2_in; if (test_data[i].pf) { + if (test_data[i].pf->dwFlags & DDPF_FOURCC) + { + unsigned int j; + + for (j = 0; j < fourcc_code_count; ++j) + { + if (test_data[i].pf->dwFourCC == fourcc_codes[j]) + break; + } + if (j == fourcc_code_count) + { + skip("Fourcc format %#lx is not supported, skipping test.\n", test_data[i].pf->dwFourCC); + continue; + } + } surface_desc.dwFlags |= DDSD_PIXELFORMAT; surface_desc.ddpfPixelFormat = *test_data[i].pf; } + if (caps_in & DDSCAPS_FLIP) + { + surface_desc.dwFlags |= DDSD_BACKBUFFERCOUNT; + surface_desc.dwBackBufferCount = 1; + } surface_desc.dwWidth = 640; surface_desc.dwHeight = 480; if ((caps_in & DDSCAPS_VIDEOMEMORY) && !(hal_caps.ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY)) @@ -6898,6 +6937,9 @@ static void test_rt_caps(const GUID *device_guid) else expected_caps = caps_in | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM;
+ if (caps_in & DDSCAPS_FLIP) + expected_caps |= DDSCAPS_FRONTBUFFER; + ok(surface_desc.ddsCaps.dwCaps == expected_caps || (test_data[i].pf == &p8_fmt && surface_desc.ddsCaps.dwCaps == (caps_in | DDSCAPS_SYSTEMMEMORY)) || (software_device && test_data[i].pf == &z_fmt @@ -6962,6 +7004,11 @@ static void test_rt_caps(const GUID *device_guid) surface_desc.dwFlags |= DDSD_PIXELFORMAT; surface_desc.ddpfPixelFormat = *test_data[i].pf; } + if (caps_in & DDSCAPS_FLIP) + { + surface_desc.dwFlags |= DDSD_BACKBUFFERCOUNT; + surface_desc.dwBackBufferCount = 1; + } surface_desc.dwWidth = 640; surface_desc.dwHeight = 480; hr = IDirectDraw4_CreateSurface(ddraw, &surface_desc, &rt, NULL); diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c index 2771a4ed368..508b2a5e225 100644 --- a/dlls/ddraw/tests/ddraw7.c +++ b/dlls/ddraw/tests/ddraw7.c @@ -6468,6 +6468,7 @@ static void test_unsupported_formats(void)
static void test_rt_caps(const GUID *device_guid) { + DWORD fourcc_codes[64], fourcc_code_count; PALETTEENTRY palette_entries[256]; IDirectDrawPalette *palette; BOOL software_device; @@ -6485,6 +6486,12 @@ static void test_rt_caps(const GUID *device_guid) sizeof(DDPIXELFORMAT), DDPF_PALETTEINDEXED8 | DDPF_RGB, 0, {8}, {0x00000000}, {0x00000000}, {0x00000000}, {0x00000000}, }; + static const DDPIXELFORMAT fourcc_fmt = + { + .dwSize = sizeof(DDPIXELFORMAT), + .dwFlags = DDPF_FOURCC, + .dwFourCC = MAKEFOURCC('Y','U','Y','2'), + };
const struct { @@ -6672,6 +6679,14 @@ static void test_rt_caps(const GUID *device_guid) DDERR_INVALIDCAPS, DDERR_INVALIDCAPS, }, + { + &fourcc_fmt, + DDSCAPS_FLIP | DDSCAPS_COMPLEX | DDSCAPS_OFFSCREENPLAIN, + 0, + DDERR_INVALIDCAPS, + DDERR_INVALIDCAPS, + DDERR_INVALIDCAPS, + }, };
software_device = is_software_device_type(device_guid); @@ -6706,6 +6721,10 @@ static void test_rt_caps(const GUID *device_guid) hr = IDirectDraw7_GetCaps(ddraw, &hal_caps, NULL); ok(hr == DD_OK, "Got unexpected hr %#lx.\n", hr);
+ fourcc_code_count = ARRAY_SIZE(fourcc_codes); + hr = IDirectDraw4_GetFourCCCodes(ddraw, &fourcc_code_count, fourcc_codes); + ok(hr == DD_OK, "Got unexpected hr %#lx.\n", hr); + for (i = 0; i < ARRAY_SIZE(test_data); ++i) { IDirectDrawSurface7 *surface, *rt, *expected_rt, *tmp; @@ -6723,9 +6742,29 @@ static void test_rt_caps(const GUID *device_guid) surface_desc.ddsCaps.dwCaps2 = test_data[i].caps2_in; if (test_data[i].pf) { + if (test_data[i].pf->dwFlags & DDPF_FOURCC) + { + unsigned int j; + + for (j = 0; j < fourcc_code_count; ++j) + { + if (test_data[i].pf->dwFourCC == fourcc_codes[j]) + break; + } + if (j == fourcc_code_count) + { + skip("Fourcc format %#lx is not supported, skipping test.\n", test_data[i].pf->dwFourCC); + continue; + } + } surface_desc.dwFlags |= DDSD_PIXELFORMAT; surface_desc.ddpfPixelFormat = *test_data[i].pf; } + if (caps_in & DDSCAPS_FLIP) + { + surface_desc.dwFlags |= DDSD_BACKBUFFERCOUNT; + surface_desc.dwBackBufferCount = 1; + } surface_desc.dwWidth = 640; surface_desc.dwHeight = 480; if ((caps_in & DDSCAPS_VIDEOMEMORY) && !(hal_caps.ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY)) @@ -6751,6 +6790,9 @@ static void test_rt_caps(const GUID *device_guid) else expected_caps = caps_in | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM;
+ if (caps_in & DDSCAPS_FLIP) + expected_caps |= DDSCAPS_FRONTBUFFER; + ok(surface_desc.ddsCaps.dwCaps == expected_caps || (test_data[i].pf == &p8_fmt && surface_desc.ddsCaps.dwCaps == (caps_in | DDSCAPS_SYSTEMMEMORY)) || (software_device && test_data[i].pf == &z_fmt @@ -6810,6 +6852,11 @@ static void test_rt_caps(const GUID *device_guid) surface_desc.dwFlags |= DDSD_PIXELFORMAT; surface_desc.ddpfPixelFormat = *test_data[i].pf; } + if (caps_in & DDSCAPS_FLIP) + { + surface_desc.dwFlags |= DDSD_BACKBUFFERCOUNT; + surface_desc.dwBackBufferCount = 1; + } surface_desc.dwWidth = 640; surface_desc.dwHeight = 480; hr = IDirectDraw7_CreateSurface(ddraw, &surface_desc, &rt, NULL); diff --git a/dlls/quartz/tests/vmr7.c b/dlls/quartz/tests/vmr7.c index 37834517425..028f14838c3 100644 --- a/dlls/quartz/tests/vmr7.c +++ b/dlls/quartz/tests/vmr7.c @@ -3745,12 +3745,14 @@ static void test_default_presenter_allocate(void) ok(hr == S_OK, "Got hr %#lx.\n", hr); todo_wine ok(desc.dwFlags == (DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PITCH | DDSD_PIXELFORMAT), "Got flags %#lx.\n", desc.dwFlags); - todo_wine ok(desc.ddsCaps.dwCaps == (DDSCAPS_LOCALVIDMEM | DDSCAPS_VIDEOMEMORY | DDSCAPS_OFFSCREENPLAIN + todo_wine_if(desc.ddsCaps.dwCaps == (DDSCAPS_LOCALVIDMEM | DDSCAPS_VIDEOMEMORY | DDSCAPS_OFFSCREENPLAIN + | DDSCAPS_FLIP | DDSCAPS_COMPLEX)) + ok(desc.ddsCaps.dwCaps == (DDSCAPS_LOCALVIDMEM | DDSCAPS_VIDEOMEMORY | DDSCAPS_OFFSCREENPLAIN | DDSCAPS_FLIP), "Got caps %#lx.\n", desc.ddsCaps.dwCaps);
desc.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY; hr = IDirectDrawSurface7_GetAttachedSurface(backbuffer2, &desc.ddsCaps, &backbuffer3); - todo_wine_if (tests[i].compression) ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#lx.\n", hr); if (hr == S_OK) { ok(backbuffer3 == frontbuffer, "Expected only 2 backbuffers.\n");