From 5b013d0b02056a393ac7731a39b4c2554e808832 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Thu, 22 Jul 2021 16:56:01 +0200 Subject: [PATCH] vkd3d: Validate shader meta against features. We're supposed to validate and fail compilation if certain features are not supported. Signed-off-by: Hans-Kristian Arntzen --- libs/vkd3d/device.c | 12 ++++++++++++ libs/vkd3d/raytracing_pipeline.c | 3 +++ libs/vkd3d/state.c | 3 +++ libs/vkd3d/vkd3d_private.h | 1 + 4 files changed, 19 insertions(+) diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index 2f38f516..f83fb435 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -5161,6 +5161,18 @@ out_free_mutex: return hr; } +bool d3d12_device_validate_shader_meta(struct d3d12_device *device, const struct vkd3d_shader_meta *meta) +{ + /* TODO: Add more as required. */ + if (meta->uses_native_16bit_operations && !device->d3d12_caps.options4.Native16BitShaderOpsSupported) + { + WARN("Attempting to use 16-bit operations in shader %016"PRIx64", but this is not supported.", meta->hash); + return false; + } + + return true; +} + HRESULT d3d12_device_create(struct vkd3d_instance *instance, const struct vkd3d_device_create_info *create_info, struct d3d12_device **device) { diff --git a/libs/vkd3d/raytracing_pipeline.c b/libs/vkd3d/raytracing_pipeline.c index 313b0d6e..dd36bab8 100644 --- a/libs/vkd3d/raytracing_pipeline.c +++ b/libs/vkd3d/raytracing_pipeline.c @@ -975,6 +975,9 @@ static HRESULT d3d12_state_object_compile_pipeline(struct d3d12_state_object *ob return E_OUTOFMEMORY; } + if (!d3d12_device_validate_shader_meta(object->device, &spirv.meta)) + return E_INVALIDARG; + stage->module = create_shader_module(object->device, spirv.code, spirv.size); if (spirv.meta.uses_subgroup_size && diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c index cd7661a1..56daffb5 100644 --- a/libs/vkd3d/state.c +++ b/libs/vkd3d/state.c @@ -2095,6 +2095,9 @@ static HRESULT create_shader_stage(struct d3d12_device *device, shader_desc.pCode = spirv.code; *meta = spirv.meta; + if (!d3d12_device_validate_shader_meta(device, &spirv.meta)) + return E_INVALIDARG; + if (spirv.meta.uses_subgroup_size && device->device_info.subgroup_size_control_features.subgroupSizeControl) { /* GravityMark checks minSubgroupSize and based on that uses a shader variant. diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 14a58336..b202d32f 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -2670,6 +2670,7 @@ bool d3d12_device_is_uma(struct d3d12_device *device, bool *coherent); void d3d12_device_mark_as_removed(struct d3d12_device *device, HRESULT reason, const char *message, ...) VKD3D_PRINTF_FUNC(3, 4); struct d3d12_device *unsafe_impl_from_ID3D12Device(d3d12_device_iface *iface); +bool d3d12_device_validate_shader_meta(struct d3d12_device *device, const struct vkd3d_shader_meta *meta); HRESULT d3d12_device_get_scratch_buffer(struct d3d12_device *device, VkDeviceSize min_size, struct vkd3d_scratch_buffer *scratch); void d3d12_device_return_scratch_buffer(struct d3d12_device *device, const struct vkd3d_scratch_buffer *scratch);