[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