mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-01-28 13:05:02 -08:00
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>
This commit is contained in:
parent
21f1489b88
commit
a5a17c22f1
@ -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);
|
||||
|
@ -648,25 +648,47 @@ 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;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
static HRESULT validate_texture_desc(D3D12_RESOURCE_DESC *desc)
|
||||
{
|
||||
if (!desc->MipLevels)
|
||||
desc->MipLevels = max_miplevel_count(desc);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT d3d12_committed_resource_init(struct d3d12_resource *resource, 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,
|
||||
@ -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;
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user