From: Józef Kucia Subject: [PATCH 6/7] d3d11: Allow creating UAVs for structured buffers with NULL description. Message-Id: <1469022584-26889-6-git-send-email-jkucia@codeweavers.com> Date: Wed, 20 Jul 2016 15:49:43 +0200 In-Reply-To: <1469022584-26889-1-git-send-email-jkucia@codeweavers.com> References: <1469022584-26889-1-git-send-email-jkucia@codeweavers.com> Signed-off-by: Józef Kucia --- dlls/d3d11/tests/d3d11.c | 25 +++++++++++++++++++++++++ dlls/d3d11/view.c | 27 +++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c index 9a20b8b..2ffad87 100644 --- a/dlls/d3d11/tests/d3d11.c +++ b/dlls/d3d11/tests/d3d11.c @@ -9245,6 +9245,9 @@ static void test_create_unordered_access_view(void) U(uav_desc).Buffer.NumElements = 64; U(uav_desc).Buffer.Flags = 0; + hr = ID3D11Device_CreateUnorderedAccessView(device, (ID3D11Resource *)buffer, NULL, &uav); + ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr); + expected_refcount = get_refcount((IUnknown *)device) + 1; hr = ID3D11Device_CreateUnorderedAccessView(device, (ID3D11Resource *)buffer, &uav_desc, &uav); ok(SUCCEEDED(hr), "Failed to create unordered access view, hr %#x.\n", hr); @@ -9261,6 +9264,28 @@ static void test_create_unordered_access_view(void) ID3D11UnorderedAccessView_Release(uav); ID3D11Buffer_Release(buffer); + buffer_desc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED; + buffer_desc.StructureByteStride = 4; + + hr = ID3D11Device_CreateBuffer(device, &buffer_desc, NULL, &buffer); + ok(SUCCEEDED(hr), "Failed to create a buffer, hr %#x.\n", hr); + + hr = ID3D11Device_CreateUnorderedAccessView(device, (ID3D11Resource *)buffer, NULL, &uav); + ok(SUCCEEDED(hr), "Got unexpected hr %#x.\n", hr); + + memset(&uav_desc, 0, sizeof(uav_desc)); + ID3D11UnorderedAccessView_GetDesc(uav, &uav_desc); + + ok(uav_desc.Format == DXGI_FORMAT_UNKNOWN, "Got unexpected format %#x.\n", uav_desc.Format); + ok(uav_desc.ViewDimension == D3D11_UAV_DIMENSION_BUFFER, "Got unexpected view dimension %#x.\n", + uav_desc.ViewDimension); + ok(!U(uav_desc).Buffer.FirstElement, "Got unexpected first element %u.\n", U(uav_desc).Buffer.FirstElement); + ok(U(uav_desc).Buffer.NumElements == 256, "Got unexpected num elements %u.\n", U(uav_desc).Buffer.NumElements); + ok(!U(uav_desc).Buffer.Flags, "Got unexpected flags %u.\n", U(uav_desc).Buffer.Flags); + + ID3D11UnorderedAccessView_Release(uav); + ID3D11Buffer_Release(buffer); + texture2d_desc.Width = 512; texture2d_desc.Height = 512; texture2d_desc.SampleDesc.Count = 1; diff --git a/dlls/d3d11/view.c b/dlls/d3d11/view.c index 5e48965..18ec0a2 100644 --- a/dlls/d3d11/view.c +++ b/dlls/d3d11/view.c @@ -710,6 +710,33 @@ static HRESULT set_uav_desc_from_resource(D3D11_UNORDERED_ACCESS_VIEW_DESC *desc switch (dimension) { + case D3D11_RESOURCE_DIMENSION_BUFFER: + { + D3D11_BUFFER_DESC buffer_desc; + ID3D11Buffer *buffer; + + if (FAILED(ID3D11Resource_QueryInterface(resource, &IID_ID3D11Buffer, (void **)&buffer))) + { + ERR("Resource of type BUFFER doesn't implement ID3D11Buffer.\n"); + return E_INVALIDARG; + } + + ID3D11Buffer_GetDesc(buffer, &buffer_desc); + ID3D11Buffer_Release(buffer); + + if (buffer_desc.MiscFlags & D3D11_RESOURCE_MISC_BUFFER_STRUCTURED) + { + desc->Format = DXGI_FORMAT_UNKNOWN; + desc->ViewDimension = D3D11_UAV_DIMENSION_BUFFER; + desc->u.Buffer.FirstElement = 0; + desc->u.Buffer.NumElements = buffer_desc.ByteWidth / buffer_desc.StructureByteStride; + desc->u.Buffer.Flags = 0; + return S_OK; + } + + return E_INVALIDARG; + } + case D3D11_RESOURCE_DIMENSION_TEXTURE2D: { D3D11_TEXTURE2D_DESC texture_desc; -- 2.7.3