libs/vkd3d: Avoid passing invalid miplevel count to Vulkan.

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:
Józef Kucia
2018-03-28 15:03:18 +02:00
committed by Alexandre Julliard
parent 3f235f9787
commit 4dc706733e

View File

@@ -102,6 +102,14 @@ HRESULT vkd3d_create_buffer(struct d3d12_device *device,
return S_OK; return S_OK;
} }
static unsigned int max_miplevel_count(const D3D12_RESOURCE_DESC *desc)
{
unsigned int size = max(desc->Width, desc->Height);
if (desc->Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D)
size = max(size, desc->DepthOrArraySize);
return vkd3d_log2i(size) + 1;
}
static HRESULT vkd3d_create_image(struct d3d12_resource *resource, struct d3d12_device *device, static HRESULT vkd3d_create_image(struct d3d12_resource *resource, struct d3d12_device *device,
const D3D12_HEAP_PROPERTIES *heap_properties, D3D12_HEAP_FLAGS heap_flags) const D3D12_HEAP_PROPERTIES *heap_properties, D3D12_HEAP_FLAGS heap_flags)
{ {
@@ -143,7 +151,7 @@ static HRESULT vkd3d_create_image(struct d3d12_resource *resource, struct d3d12_
image_info.arrayLayers = desc->DepthOrArraySize; image_info.arrayLayers = desc->DepthOrArraySize;
} }
image_info.mipLevels = desc->MipLevels; image_info.mipLevels = min(desc->MipLevels, max_miplevel_count(desc));
image_info.samples = vk_samples_from_dxgi_sample_desc(&desc->SampleDesc); image_info.samples = vk_samples_from_dxgi_sample_desc(&desc->SampleDesc);
if (desc->Layout == D3D12_TEXTURE_LAYOUT_UNKNOWN) if (desc->Layout == D3D12_TEXTURE_LAYOUT_UNKNOWN)
@@ -653,12 +661,7 @@ static HRESULT validate_buffer_desc(const D3D12_RESOURCE_DESC *desc)
static HRESULT validate_texture_desc(D3D12_RESOURCE_DESC *desc) static HRESULT validate_texture_desc(D3D12_RESOURCE_DESC *desc)
{ {
if (!desc->MipLevels) if (!desc->MipLevels)
{ desc->MipLevels = max_miplevel_count(desc);
unsigned int size = max(desc->Width, desc->Height);
if (desc->Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D)
size = max(size, desc->DepthOrArraySize);
desc->MipLevels = vkd3d_log2i(size) + 1;
}
return S_OK; return S_OK;
} }