ddraw: Don't demand WINED3D_BIND_SHADER_RESOURCE for making surface in vidmem.

This commit is contained in:
Paul Gofman 2024-03-21 17:45:47 -06:00 committed by Alexandre Julliard
parent c635a25f21
commit 1194995050
6 changed files with 193 additions and 3 deletions

View file

@ -6850,11 +6850,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)

View file

@ -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

View file

@ -5012,6 +5012,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;
@ -5030,6 +5031,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
{
@ -5202,6 +5209,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);
@ -5235,6 +5249,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;
@ -5251,6 +5269,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;
}
@ -5259,6 +5292,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))
@ -5281,6 +5319,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
@ -5348,6 +5389,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);

View file

@ -6622,6 +6622,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;
@ -6639,6 +6640,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
{
@ -6826,6 +6833,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);
@ -6860,6 +6875,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;
@ -6877,9 +6896,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))
@ -6905,6 +6944,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
@ -6969,6 +7011,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);

View file

@ -6476,6 +6476,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;
@ -6493,6 +6494,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
{
@ -6680,6 +6687,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);
@ -6714,6 +6729,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;
@ -6731,9 +6750,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))
@ -6759,6 +6798,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
@ -6818,6 +6860,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);

View file

@ -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");