[PATCH vkd3d 3/8] libs/vkd3d: Introduce d3d12_resource_validate_desc().
Józef Kucia
joseph.kucia at gmail.com
Fri Jul 20 07:30:14 CDT 2018
From: Józef Kucia <jkucia at codeweavers.com>
Share D3D12_RESOURCE_DESC validation code between
CreateCommittedResource() and GetCopyableFootprints().
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
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 aaa47465b07e..5d2c91f4de34 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 fb84e4b13a08..9fa98b085271 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 2c224675cab4..e9ee06a223cc 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,
--
2.16.4
More information about the wine-devel
mailing list