[PATCH vkd3d 08/11] vkd3d: Implement support for D3D12_FEATURE_D3D12_OPTIONS4.
Conor McCarthy
conor.mccarthy.444 at gmail.com
Tue May 19 08:46:56 CDT 2020
Signed-off-by: Conor McCarthy <conor.mccarthy.444 at gmail.com>
---
include/vkd3d_d3d12.idl | 14 +++++++++++
libs/vkd3d/device.c | 48 ++++++++++++++++++++++++++++++++++++++
libs/vkd3d/vkd3d_private.h | 1 +
3 files changed, 63 insertions(+)
diff --git a/include/vkd3d_d3d12.idl b/include/vkd3d_d3d12.idl
index 950b1fe..2f35402 100644
--- a/include/vkd3d_d3d12.idl
+++ b/include/vkd3d_d3d12.idl
@@ -210,6 +210,12 @@ typedef enum D3D12_VIEW_INSTANCING_TIER
D3D12_VIEW_INSTANCING_TIER_3 = 0x3,
} D3D12_VIEW_INSTANCING_TIER;
+typedef enum D3D12_SHARED_RESOURCE_COMPATIBILITY_TIER
+{
+ D3D12_SHARED_RESOURCE_COMPATIBILITY_TIER_0 = 0x0,
+ D3D12_SHARED_RESOURCE_COMPATIBILITY_TIER_1 = 0x1,
+} D3D12_SHARED_RESOURCE_COMPATIBILITY_TIER;
+
interface ID3D12Fence;
interface ID3D12RootSignature;
interface ID3D12Heap;
@@ -1692,6 +1698,13 @@ typedef struct D3D12_FEATURE_DATA_EXISTING_HEAPS
BOOL Supported;
} D3D12_FEATURE_DATA_EXISTING_HEAPS;
+typedef struct D3D12_FEATURE_DATA_D3D12_OPTIONS4
+{
+ BOOL MSAA64KBAlignedTextureSupported;
+ D3D12_SHARED_RESOURCE_COMPATIBILITY_TIER SharedResourceCompatibilityTier;
+ BOOL Native16BitShaderOpsSupported;
+} D3D12_FEATURE_DATA_D3D12_OPTIONS4;
+
typedef enum D3D12_FEATURE
{
D3D12_FEATURE_D3D12_OPTIONS = 0,
@@ -1710,6 +1723,7 @@ typedef enum D3D12_FEATURE
D3D12_FEATURE_COMMAND_QUEUE_PRIORITY = 20,
D3D12_FEATURE_D3D12_OPTIONS3 = 21,
D3D12_FEATURE_EXISTING_HEAPS = 22,
+ D3D12_FEATURE_D3D12_OPTIONS4 = 23,
} D3D12_FEATURE;
typedef struct D3D12_MEMCPY_DEST
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index 5f1c696..9403505 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -1354,6 +1354,12 @@ static HRESULT vkd3d_init_device_caps(struct d3d12_device *device,
device->feature_options3.ViewInstancingTier = D3D12_VIEW_INSTANCING_TIER_NOT_SUPPORTED;
device->feature_options3.BarycentricsSupported = FALSE;
+ /* Alignment support can be tested later. */
+ device->feature_options4.MSAA64KBAlignedTextureSupported = FALSE;
+ device->feature_options4.SharedResourceCompatibilityTier = D3D12_SHARED_RESOURCE_COMPATIBILITY_TIER_0;
+ /* An SM 6.2 feature. This would require features->shaderInt16 and VK_KHR_shader_float16_int8. */
+ device->feature_options4.Native16BitShaderOpsSupported = FALSE;
+
if ((vr = VK_CALL(vkEnumerateDeviceExtensionProperties(physical_device, NULL, &count, NULL))) < 0)
{
ERR("Failed to enumerate device extensions, vr %d.\n", vr);
@@ -2438,6 +2444,29 @@ bool d3d12_device_is_uma(struct d3d12_device *device, bool *coherent)
return true;
}
+/* The 4MB alignment requirement for MSAA was lowered to 64KB on hardware that supports it.
+ * This is distinct from the small MSAA requirement which applies to a total size of 4MB or less. */
+static bool d3d12_is_64k_msaa_supported(struct d3d12_device *device)
+{
+ D3D12_RESOURCE_ALLOCATION_INFO info;
+ D3D12_RESOURCE_DESC resource_desc;
+
+ memset(&resource_desc, 0, sizeof(resource_desc));
+ resource_desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
+ resource_desc.Width = 1024;
+ resource_desc.Height = 1025;
+ resource_desc.DepthOrArraySize = 1;
+ resource_desc.MipLevels = 1;
+ resource_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+ resource_desc.SampleDesc.Count = 4;
+ resource_desc.Flags = D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
+
+ /* FIXME: in some cases Vulkan requires 0x20000 or more for non-MSAA resources, which must have
+ * 0x10000 in their description, so we might resonably return true here for 0x20000 or 0x40000. */
+ return SUCCEEDED(vkd3d_get_image_allocation_info(device, &resource_desc, &info))
+ && info.Alignment <= 0x10000;
+}
+
static HRESULT STDMETHODCALLTYPE d3d12_device_CheckFeatureSupport(ID3D12Device *iface,
D3D12_FEATURE feature, void *feature_data, UINT feature_data_size)
{
@@ -2855,6 +2884,25 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CheckFeatureSupport(ID3D12Device *
return S_OK;
}
+ case D3D12_FEATURE_D3D12_OPTIONS4:
+ {
+ D3D12_FEATURE_DATA_D3D12_OPTIONS4 *data = feature_data;
+
+ if (feature_data_size != sizeof(*data))
+ {
+ WARN("Invalid size %u.\n", feature_data_size);
+ return E_INVALIDARG;
+ }
+
+ *data = device->feature_options4;
+ data->MSAA64KBAlignedTextureSupported = d3d12_is_64k_msaa_supported(device);
+
+ TRACE("64KB aligned MSAA textures %#x.\n", data->MSAA64KBAlignedTextureSupported);
+ TRACE("Shared resource compatibility tier %#x.\n", data->SharedResourceCompatibilityTier);
+ TRACE("Native 16-bit shader ops %#x.\n", data->Native16BitShaderOpsSupported);
+ return S_OK;
+ }
+
default:
FIXME("Unhandled feature %#x.\n", feature);
return E_NOTIMPL;
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index ef9a4f9..02644f9 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -1137,6 +1137,7 @@ struct d3d12_device
D3D12_FEATURE_DATA_D3D12_OPTIONS1 feature_options1;
D3D12_FEATURE_DATA_D3D12_OPTIONS2 feature_options2;
D3D12_FEATURE_DATA_D3D12_OPTIONS3 feature_options3;
+ D3D12_FEATURE_DATA_D3D12_OPTIONS4 feature_options4;
struct vkd3d_vulkan_info vk_info;
--
2.24.0
More information about the wine-devel
mailing list