=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: vkd3d: Implement D3D12_FEATURE_MULTISAMPLE_QUALITY_LEVELS.
Alexandre Julliard
julliard at winehq.org
Fri Jan 25 16:05:12 CST 2019
Module: vkd3d
Branch: master
Commit: 9370929ac16b4f65d35b044fae00b467ce9254c4
URL: https://source.winehq.org/git/vkd3d.git/?a=commit;h=9370929ac16b4f65d35b044fae00b467ce9254c4
Author: Józef Kucia <jkucia at codeweavers.com>
Date: Fri Jan 25 13:23:32 2019 +0100
vkd3d: Implement D3D12_FEATURE_MULTISAMPLE_QUALITY_LEVELS.
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
include/vkd3d_d3d12.idl | 14 +++++++++
libs/vkd3d/device.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++
libs/vkd3d/resource.c | 18 ++++++++---
libs/vkd3d/vkd3d_private.h | 1 +
4 files changed, 104 insertions(+), 4 deletions(-)
diff --git a/include/vkd3d_d3d12.idl b/include/vkd3d_d3d12.idl
index 754bba3..8b2e70f 100644
--- a/include/vkd3d_d3d12.idl
+++ b/include/vkd3d_d3d12.idl
@@ -269,6 +269,20 @@ typedef struct D3D12_FEATURE_DATA_FORMAT_SUPPORT
D3D12_FORMAT_SUPPORT2 Support2;
} D3D12_FEATURE_DATA_FORMAT_SUPPORT;
+typedef enum D3D12_MULTISAMPLE_QUALITY_LEVEL_FLAGS
+{
+ D3D12_MULTISAMPLE_QUALITY_LEVELS_FLAG_NONE = 0x00000000,
+ D3D12_MULTISAMPLE_QUALITY_LEVELS_FLAG_TILED_RESOURCE = 0x00000001,
+} D3D12_MULTISAMPLE_QUALITY_LEVEL_FLAGS;
+
+typedef struct D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS
+{
+ DXGI_FORMAT Format;
+ UINT SampleCount;
+ D3D12_MULTISAMPLE_QUALITY_LEVEL_FLAGS Flags;
+ UINT NumQualityLevels;
+} D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS;
+
typedef enum D3D12_HEAP_TYPE
{
D3D12_HEAP_TYPE_DEFAULT = 1,
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index 709c61f..64c8391 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -1687,6 +1687,68 @@ static void vkd3d_restrict_format_support_for_feature_level(D3D12_FEATURE_DATA_F
}
}
+static HRESULT d3d12_device_check_multisample_quality_levels(struct d3d12_device *device,
+ D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS *data)
+{
+ const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
+ VkImageFormatProperties vk_properties;
+ const struct vkd3d_format *format;
+ VkSampleCountFlagBits vk_samples;
+ VkImageUsageFlags vk_usage = 0;
+ VkResult vr;
+
+ TRACE("Format %#x, sample count %u, flags %#x.\n", data->Format, data->SampleCount, data->Flags);
+
+ data->NumQualityLevels = 0;
+
+ if (!(vk_samples = vk_samples_from_sample_count(data->SampleCount)))
+ WARN("Invalid sample count %u.\n", data->SampleCount);
+ if (!data->SampleCount)
+ return E_FAIL;
+
+ if (data->SampleCount == 1)
+ {
+ data->NumQualityLevels = 1;
+ goto done;
+ }
+
+ if (data->Format == DXGI_FORMAT_UNKNOWN)
+ goto done;
+
+ if (!(format = vkd3d_get_format(data->Format, false)))
+ {
+ FIXME("Unhandled format %#x.\n", data->Format);
+ return E_INVALIDARG;
+ }
+ if (data->Flags)
+ FIXME("Ignoring flags %#x.\n", data->Flags);
+
+ if (format->vk_aspect_mask & VK_IMAGE_ASPECT_COLOR_BIT)
+ vk_usage |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
+ else
+ vk_usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
+
+ vr = VK_CALL(vkGetPhysicalDeviceImageFormatProperties(device->vk_physical_device,
+ format->vk_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL, vk_usage, 0, &vk_properties));
+ if (vr == VK_ERROR_FORMAT_NOT_SUPPORTED)
+ {
+ WARN("Format %#x is not supported.\n", format->dxgi_format);
+ goto done;
+ }
+ if (vr < 0)
+ {
+ ERR("Failed to get image format properties, vr %d.\n", vr);
+ return hresult_from_vk_result(vr);
+ }
+
+ if (vk_properties.sampleCounts & vk_samples)
+ data->NumQualityLevels = 1;
+
+done:
+ TRACE("Returning %u quality levels.\n", data->NumQualityLevels);
+ return S_OK;
+}
+
static HRESULT STDMETHODCALLTYPE d3d12_device_CheckFeatureSupport(ID3D12Device *iface,
D3D12_FEATURE feature, void *feature_data, UINT feature_data_size)
{
@@ -1840,6 +1902,19 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CheckFeatureSupport(ID3D12Device *
return S_OK;
}
+ case D3D12_FEATURE_MULTISAMPLE_QUALITY_LEVELS:
+ {
+ D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS *data = feature_data;
+
+ if (feature_data_size != sizeof(*data))
+ {
+ WARN("Invalid size %u.\n", feature_data_size);
+ return E_INVALIDARG;
+ }
+
+ return d3d12_device_check_multisample_quality_levels(device, data);
+ }
+
case D3D12_FEATURE_GPU_VIRTUAL_ADDRESS_SUPPORT:
{
D3D12_FEATURE_DATA_GPU_VIRTUAL_ADDRESS_SUPPORT *data = feature_data;
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index 016d050..75a5201 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -437,9 +437,9 @@ static VkImageType vk_image_type_from_d3d12_resource_dimension(D3D12_RESOURCE_DI
}
}
-VkSampleCountFlagBits vk_samples_from_dxgi_sample_desc(const DXGI_SAMPLE_DESC *desc)
+VkSampleCountFlagBits vk_samples_from_sample_count(unsigned int sample_count)
{
- switch (desc->Count)
+ switch (sample_count)
{
case 1:
return VK_SAMPLE_COUNT_1_BIT;
@@ -456,11 +456,21 @@ VkSampleCountFlagBits vk_samples_from_dxgi_sample_desc(const DXGI_SAMPLE_DESC *d
case 64:
return VK_SAMPLE_COUNT_64_BIT;
default:
- FIXME("Unhandled sample count %u.\n", desc->Count);
- return VK_SAMPLE_COUNT_1_BIT;
+ return 0;
}
}
+VkSampleCountFlagBits vk_samples_from_dxgi_sample_desc(const DXGI_SAMPLE_DESC *desc)
+{
+ VkSampleCountFlagBits vk_samples;
+
+ if ((vk_samples = vk_samples_from_sample_count(desc->Count)))
+ return vk_samples;
+
+ FIXME("Unhandled sample count %u.\n", desc->Count);
+ return VK_SAMPLE_COUNT_1_BIT;
+}
+
HRESULT vkd3d_create_buffer(struct d3d12_device *device,
const D3D12_HEAP_PROPERTIES *heap_properties, D3D12_HEAP_FLAGS heap_flags,
const D3D12_RESOURCE_DESC *desc, VkBuffer *vk_buffer)
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index 6b35dc0..73825bb 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -974,6 +974,7 @@ static inline unsigned int d3d12_resource_desc_get_sub_resource_count(const D3D1
VkCompareOp vk_compare_op_from_d3d12(D3D12_COMPARISON_FUNC op) DECLSPEC_HIDDEN;
VkSampleCountFlagBits vk_samples_from_dxgi_sample_desc(const DXGI_SAMPLE_DESC *desc) DECLSPEC_HIDDEN;
+VkSampleCountFlagBits vk_samples_from_sample_count(unsigned int sample_count) DECLSPEC_HIDDEN;
bool is_valid_feature_level(D3D_FEATURE_LEVEL feature_level) DECLSPEC_HIDDEN;
bool check_feature_level_support(D3D_FEATURE_LEVEL feature_level) DECLSPEC_HIDDEN;
More information about the wine-cvs
mailing list