dxgi: Implement IDXGIResource::GetUsage().

This commit is contained in:
Zebediah Figura 2023-02-02 20:32:34 -06:00 committed by Alexandre Julliard
parent 302996efae
commit 555cee6449
3 changed files with 45 additions and 13 deletions

View file

@ -350,9 +350,35 @@ static HRESULT STDMETHODCALLTYPE dxgi_resource_GetSharedHandle(IDXGIResource *if
static HRESULT STDMETHODCALLTYPE dxgi_resource_GetUsage(IDXGIResource *iface, DXGI_USAGE *usage)
{
FIXME("iface %p, usage %p stub!\n", iface, usage);
struct dxgi_resource *resource = impl_from_IDXGIResource(iface);
struct wined3d_resource_desc resource_desc;
return E_NOTIMPL;
TRACE("iface %p, usage %p.\n", iface, usage);
wined3d_resource_get_desc(resource->wined3d_resource, &resource_desc);
*usage = dxgi_usage_from_wined3d_bind_flags(resource_desc.bind_flags);
if (resource_desc.resource_type != WINED3D_RTYPE_BUFFER)
{
struct wined3d_texture *texture = wined3d_texture_from_resource(resource->wined3d_resource);
struct wined3d_swapchain_desc swapchain_desc;
struct wined3d_swapchain *swapchain;
if ((swapchain = wined3d_texture_get_swapchain(texture)))
{
*usage |= DXGI_USAGE_BACK_BUFFER;
wined3d_swapchain_get_desc(swapchain, &swapchain_desc);
if (swapchain_desc.swap_effect == WINED3D_SWAP_EFFECT_DISCARD)
*usage |= DXGI_USAGE_DISCARD_ON_PRESENT;
if (wined3d_swapchain_get_back_buffer(swapchain, 0) != texture)
*usage |= DXGI_USAGE_READ_ONLY;
}
}
return S_OK;
}
static HRESULT STDMETHODCALLTYPE dxgi_resource_SetEvictionPriority(IDXGIResource *iface, UINT eviction_priority)

View file

@ -4016,6 +4016,7 @@ static void test_swapchain_resize(IUnknown *device, BOOL is_d3d12)
{
DXGI_SWAP_CHAIN_DESC swapchain_desc;
DXGI_SWAP_EFFECT swap_effect;
IDXGIResource *dxgi_resource;
IDXGISwapChain3 *swapchain3;
IUnknown *present_queue[2];
IDXGISwapChain *swapchain;
@ -4056,13 +4057,18 @@ static void test_swapchain_resize(IUnknown *device, BOOL is_d3d12)
hr = IDXGIFactory_CreateSwapChain(factory, device, &swapchain_desc, &swapchain);
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
hr = IDXGISwapChain_GetBuffer(swapchain, 0, &IID_IDXGISurface, (void **)&surface);
expected_hr = is_d3d12 ? E_NOINTERFACE : S_OK;
hr = IDXGISwapChain_GetBuffer(swapchain, 0, &IID_IDXGIResource, (void **)&dxgi_resource);
ok(hr == expected_hr, "Got unexpected hr %#lx, expected %#lx.\n", hr, expected_hr);
ok(!dxgi_resource || hr == S_OK, "Got unexpected pointer %p.\n", dxgi_resource);
hr = IDXGISwapChain_GetBuffer(swapchain, 0, &IID_IDXGISurface, (void **)&surface);
ok(hr == expected_hr, "Got unexpected hr %#lx, expected %#lx.\n", hr, expected_hr);
ok(!surface || hr == S_OK, "Got unexpected pointer %p.\n", surface);
hr = IDXGISwapChain_GetBuffer(swapchain, 0, &IID_ID3D10Texture2D, (void **)&texture);
ok(hr == expected_hr, "Got unexpected hr %#lx, expected %#lx.\n", hr, expected_hr);
ok(!texture || hr == S_OK, "Got unexpected pointer %p.\n", texture);
expected_hr = is_d3d12 ? S_OK : E_NOINTERFACE;
hr = IDXGISwapChain_GetBuffer(swapchain, 0, &IID_ID3D12Resource, (void **)&resource);
ok(hr == expected_hr, "Got unexpected hr %#lx, expected %#lx.\n", hr, expected_hr);
@ -4175,16 +4181,23 @@ static void test_swapchain_resize(IUnknown *device, BOOL is_d3d12)
check_resource_desc(resource, &swapchain_desc);
ID3D12Resource_Release(resource);
}
if (dxgi_resource)
IDXGIResource_Release(dxgi_resource);
hr = IDXGISwapChain_ResizeBuffers(swapchain, 2, 320, 240, DXGI_FORMAT_B8G8R8A8_UNORM, 0);
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
hr = IDXGISwapChain_GetBuffer(swapchain, 0, &IID_IDXGISurface, (void **)&surface);
expected_hr = is_d3d12 ? E_NOINTERFACE : S_OK;
hr = IDXGISwapChain_GetBuffer(swapchain, 0, &IID_IDXGIResource, (void **)&dxgi_resource);
ok(hr == expected_hr, "Got unexpected hr %#lx, expected %#lx.\n", hr, expected_hr);
ok(!surface || hr == S_OK, "Got unexpected pointer %p.\n", surface);
hr = IDXGISwapChain_GetBuffer(swapchain, 0, &IID_IDXGISurface, (void **)&surface);
ok(hr == expected_hr, "Got unexpected hr %#lx, expected %#lx.\n", hr, expected_hr);
ok(!surface || hr == S_OK, "Got unexpected pointer %p.\n", surface);
hr = IDXGISwapChain_GetBuffer(swapchain, 0, &IID_ID3D10Texture2D, (void **)&texture);
ok(hr == expected_hr, "Got unexpected hr %#lx, expected %#lx.\n", hr, expected_hr);
ok(!texture || hr == S_OK, "Got unexpected pointer %p.\n", texture);
expected_hr = is_d3d12 ? S_OK : E_NOINTERFACE;
hr = IDXGISwapChain_GetBuffer(swapchain, 0, &IID_ID3D12Resource, (void **)&resource);
ok(hr == expected_hr, "Got unexpected hr %#lx, expected %#lx.\n", hr, expected_hr);
@ -4246,6 +4259,8 @@ static void test_swapchain_resize(IUnknown *device, BOOL is_d3d12)
check_resource_desc(resource, &swapchain_desc);
ID3D12Resource_Release(resource);
}
if (dxgi_resource)
IDXGIResource_Release(dxgi_resource);
hr = IDXGISwapChain_ResizeBuffers(swapchain, 0, 0, 0, DXGI_FORMAT_UNKNOWN, 0);
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
@ -4495,9 +4510,7 @@ static void test_swapchain_parameters(void)
expected_usage = DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_BACK_BUFFER;
hr = IDXGIResource_GetUsage(resource, &usage);
todo_wine
ok(hr == S_OK, "Got unexpected hr %#lx, test %u.\n", hr, i);
todo_wine
ok((usage & expected_usage) == expected_usage, "Got usage %x, expected %x, test %u.\n",
usage, expected_usage, i);
@ -4534,9 +4547,7 @@ static void test_swapchain_parameters(void)
broken_usage |= DXGI_USAGE_READ_ONLY;
hr = IDXGIResource_GetUsage(resource, &usage);
todo_wine
ok(hr == S_OK, "Got unexpected hr %#lx, test %u, buffer %u.\n", hr, i, j);
todo_wine
ok(usage == expected_usage || broken(usage == broken_usage),
"Got usage %x, expected %x, test %u, buffer %u.\n",
usage, expected_usage, i, j);
@ -4607,9 +4618,7 @@ static void test_swapchain_parameters(void)
ok(hr == S_OK, "Got unexpected hr %#lx, test %u.\n", hr, i);
expected_usage = usage | DXGI_USAGE_BACK_BUFFER | DXGI_USAGE_DISCARD_ON_PRESENT;
hr = IDXGIResource_GetUsage(resource, &usage);
todo_wine
ok(hr == S_OK, "Got unexpected hr %#lx, test %u.\n", hr, i);
todo_wine_if(i != 7)
ok(usage == expected_usage, "Got usage %x, expected %x, test %u.\n", usage, expected_usage, i);
IDXGIResource_Release(resource);

View file

@ -494,9 +494,6 @@ DXGI_USAGE dxgi_usage_from_wined3d_bind_flags(unsigned int wined3d_bind_flags)
if (wined3d_bind_flags & WINED3D_BIND_UNORDERED_ACCESS)
dxgi_usage |= DXGI_USAGE_UNORDERED_ACCESS;
wined3d_bind_flags &= ~(WINED3D_BIND_SHADER_RESOURCE | WINED3D_BIND_RENDER_TARGET | WINED3D_BIND_UNORDERED_ACCESS);
if (wined3d_bind_flags)
FIXME("Unhandled wined3d bind flags %#x.\n", wined3d_bind_flags);
return dxgi_usage;
}