Module: vkd3d Branch: master Commit: a5a17c22f1bbc56074e5adc3e5272d6f33640a1d URL: https://source.winehq.org/git/vkd3d.git/?a=commit;h=a5a17c22f1bbc56074e5adc3...
Author: Józef Kucia jkucia@codeweavers.com Date: Fri Jul 20 14:30:14 2018 +0200
libs/vkd3d: Introduce d3d12_resource_validate_desc().
Share D3D12_RESOURCE_DESC validation code between CreateCommittedResource() and GetCopyableFootprints().
Signed-off-by: Józef Kucia jkucia@codeweavers.com Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
libs/vkd3d/device.c | 34 +++++------------------------ libs/vkd3d/resource.c | 53 +++++++++++++++++++++++++++++++++------------- libs/vkd3d/vkd3d_private.h | 2 ++ 3 files changed, 45 insertions(+), 44 deletions(-)
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index aaa4746..5d2c91f 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -1964,7 +1964,8 @@ static void STDMETHODCALLTYPE d3d12_device_GetCopyableFootprints(ID3D12Device *i UINT64 base_offset, D3D12_PLACED_SUBRESOURCE_FOOTPRINT *layouts, UINT *row_counts, UINT64 *row_sizes, UINT64 *total_bytes) { - static const struct vkd3d_format vkd3d_format_unknown = {DXGI_FORMAT_UNKNOWN, VK_FORMAT_UNDEFINED, 1, 1, 1, 1, 0}; + static const struct vkd3d_format vkd3d_format_unknown + = {DXGI_FORMAT_UNKNOWN, VK_FORMAT_UNDEFINED, 1, 1, 1, 1, 0};
unsigned int i, sub_resource_idx, miplevel_idx, row_count, row_size, row_pitch; unsigned int width, height, depth, array_size; @@ -1995,35 +1996,10 @@ static void STDMETHODCALLTYPE d3d12_device_GetCopyableFootprints(ID3D12Device *i return; }
- /* FIXME: We should probably share D3D12_RESOURCE_DESC validation with CreateCommittedResource(). */ - switch (desc->Dimension) + if (FAILED(d3d12_resource_validate_desc(desc))) { - case D3D12_RESOURCE_DIMENSION_BUFFER: - if (desc->Format != DXGI_FORMAT_UNKNOWN || desc->Layout != D3D12_TEXTURE_LAYOUT_ROW_MAJOR - || desc->Height != 1 || desc->DepthOrArraySize != 1 || desc->MipLevels != 1 - || desc->SampleDesc.Count != 1 || desc->SampleDesc.Quality != 0 - || (desc->Alignment != 0 && desc->Alignment != D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT)) - { - WARN("Invalid parameters for a buffer resource.\n"); - return; - } - break; - - case D3D12_RESOURCE_DIMENSION_TEXTURE1D: - if (desc->Height != 1) - { - WARN("1D texture with a height of %u.\n", desc->Height); - return; - } - break; - - case D3D12_RESOURCE_DIMENSION_TEXTURE2D: - case D3D12_RESOURCE_DIMENSION_TEXTURE3D: - break; - - default: - WARN("Invalid resource dimension %#x.\n", desc->Dimension); - return; + WARN("Invalid resource desc.\n"); + return; }
array_size = d3d12_resource_desc_get_layer_count(desc); diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c index fb84e4b..9fa98b0 100644 --- a/libs/vkd3d/resource.c +++ b/libs/vkd3d/resource.c @@ -648,21 +648,43 @@ struct d3d12_resource *unsafe_impl_from_ID3D12Resource(ID3D12Resource *iface) return impl_from_ID3D12Resource(iface); }
-static HRESULT validate_buffer_desc(const D3D12_RESOURCE_DESC *desc) +HRESULT d3d12_resource_validate_desc(const D3D12_RESOURCE_DESC *desc) { - if (desc->MipLevels != 1) + switch (desc->Dimension) { - WARN("Invalid miplevel count %u for buffer.\n", desc->MipLevels); - return E_INVALIDARG; - } + case D3D12_RESOURCE_DIMENSION_BUFFER: + if (desc->MipLevels != 1) + { + WARN("Invalid miplevel count %u for buffer.\n", desc->MipLevels); + return E_INVALIDARG; + }
- return S_OK; -} + if (desc->Format != DXGI_FORMAT_UNKNOWN || desc->Layout != D3D12_TEXTURE_LAYOUT_ROW_MAJOR + || desc->Height != 1 || desc->DepthOrArraySize != 1 + || desc->SampleDesc.Count != 1 || desc->SampleDesc.Quality != 0 + || (desc->Alignment != 0 && desc->Alignment != D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT)) + { + WARN("Invalid parameters for a buffer resource.\n"); + return E_INVALIDARG; + } + break;
-static HRESULT validate_texture_desc(D3D12_RESOURCE_DESC *desc) -{ - if (!desc->MipLevels) - desc->MipLevels = max_miplevel_count(desc); + case D3D12_RESOURCE_DIMENSION_TEXTURE1D: + if (desc->Height != 1) + { + WARN("1D texture with a height of %u.\n", desc->Height); + return E_INVALIDARG; + } + break; + + case D3D12_RESOURCE_DIMENSION_TEXTURE2D: + case D3D12_RESOURCE_DIMENSION_TEXTURE3D: + break; + + default: + WARN("Invalid resource dimension %#x.\n", desc->Dimension); + return E_INVALIDARG; + }
return S_OK; } @@ -717,11 +739,12 @@ static HRESULT d3d12_committed_resource_init(struct d3d12_resource *resource, st resource->gpu_address = 0; resource->flags = 0;
+ if (FAILED(hr = d3d12_resource_validate_desc(&resource->desc))) + return hr; + switch (desc->Dimension) { case D3D12_RESOURCE_DIMENSION_BUFFER: - if (FAILED(hr = validate_buffer_desc(&resource->desc))) - return hr; if (FAILED(hr = vkd3d_create_buffer(device, heap_properties, heap_flags, &resource->desc, &resource->u.vk_buffer))) return hr; @@ -743,8 +766,8 @@ static HRESULT d3d12_committed_resource_init(struct d3d12_resource *resource, st case D3D12_RESOURCE_DIMENSION_TEXTURE1D: case D3D12_RESOURCE_DIMENSION_TEXTURE2D: case D3D12_RESOURCE_DIMENSION_TEXTURE3D: - if (FAILED(hr = validate_texture_desc(&resource->desc))) - return hr; + if (!resource->desc.MipLevels) + resource->desc.MipLevels = max_miplevel_count(desc); resource->flags |= VKD3D_RESOURCE_INITIAL_STATE_TRANSITION; if (FAILED(hr = vkd3d_create_image(resource, device, heap_properties, heap_flags))) return hr; diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 2c22467..e9ee06a 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -223,6 +223,8 @@ static inline bool d3d12_resource_is_texture(const struct d3d12_resource *resour return resource->desc.Dimension != D3D12_RESOURCE_DIMENSION_BUFFER; }
+HRESULT d3d12_resource_validate_desc(const D3D12_RESOURCE_DESC *desc) DECLSPEC_HIDDEN; + HRESULT d3d12_committed_resource_create(struct d3d12_device *device, const D3D12_HEAP_PROPERTIES *heap_properties, D3D12_HEAP_FLAGS heap_flags, const D3D12_RESOURCE_DESC *desc, D3D12_RESOURCE_STATES initial_state,