Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/HansKristian-Work/vkd3d-proton.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Kristian Arntzen <post@arntzen-software.no>2022-05-25 14:07:56 +0300
committerHans-Kristian Arntzen <post@arntzen-software.no>2022-05-31 15:12:54 +0300
commit5eeca3c69d896a3ead028236e34f865f0ee5210f (patch)
treef0f9a1f38ea6ec983df77426e1ba015e7db1f4ab
parentec4d3c5b91d9b26bef841219f0e5f8bf74688804 (diff)
vkd3d: Enable and use VK_KHR_fragment_shader_barycentric.fragment-shader-barycentric
For now, just keep the NV path as well. It's the exact same extension basically as the KHR one. Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
-rw-r--r--include/vkd3d_shader.h2
-rw-r--r--libs/vkd3d-shader/dxil.c12
-rw-r--r--libs/vkd3d/device.c20
-rw-r--r--libs/vkd3d/vkd3d_private.h5
4 files changed, 35 insertions, 4 deletions
diff --git a/include/vkd3d_shader.h b/include/vkd3d_shader.h
index ad00508f..c5e5724c 100644
--- a/include/vkd3d_shader.h
+++ b/include/vkd3d_shader.h
@@ -308,6 +308,8 @@ enum vkd3d_shader_target_extension
* all in range, or all out of range. We can implement structured buffer vectorization of vec3,
* but not byte address buffer. */
VKD3D_SHADER_TARGET_EXTENSION_ASSUME_PER_COMPONENT_SSBO_ROBUSTNESS,
+ VKD3D_SHADER_TARGET_EXTENSION_BARYCENTRIC_KHR,
+ VKD3D_SHADER_TARGET_EXTENSION_COUNT,
};
enum vkd3d_shader_quirk
diff --git a/libs/vkd3d-shader/dxil.c b/libs/vkd3d-shader/dxil.c
index 552fa3c1..d0d6cb6b 100644
--- a/libs/vkd3d-shader/dxil.c
+++ b/libs/vkd3d-shader/dxil.c
@@ -764,6 +764,18 @@ int vkd3d_shader_compile_dxil(const struct vkd3d_shader_code *dxbc,
goto end;
}
}
+ else if (compiler_args->target_extensions[i] == VKD3D_SHADER_TARGET_EXTENSION_BARYCENTRIC_KHR)
+ {
+ static const dxil_spv_option_barycentric_khr helper =
+ { { DXIL_SPV_OPTION_BARYCENTRIC_KHR }, DXIL_SPV_TRUE };
+
+ if (dxil_spv_converter_add_option(converter, &helper.base) != DXIL_SPV_SUCCESS)
+ {
+ ERR("dxil-spirv does not support BARYCENTRIC_KHR.\n");
+ ret = VKD3D_ERROR_NOT_IMPLEMENTED;
+ goto end;
+ }
+ }
}
if (compiler_args->dual_source_blending)
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index 4f64f600..c8146701 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -87,6 +87,7 @@ static const struct vkd3d_optional_extension_info optional_device_extensions[] =
VK_EXTENSION(KHR_DRIVER_PROPERTIES, KHR_driver_properties),
VK_EXTENSION(KHR_UNIFORM_BUFFER_STANDARD_LAYOUT, KHR_uniform_buffer_standard_layout),
VK_EXTENSION(KHR_MAINTENANCE_4, KHR_maintenance4),
+ VK_EXTENSION(KHR_FRAGMENT_SHADER_BARYCENTRIC, KHR_fragment_shader_barycentric),
/* EXT extensions */
VK_EXTENSION(EXT_CALIBRATED_TIMESTAMPS, EXT_calibrated_timestamps),
VK_EXTENSION(EXT_CONDITIONAL_RENDERING, EXT_conditional_rendering),
@@ -1392,13 +1393,20 @@ static void vkd3d_physical_device_info_init(struct vkd3d_physical_device_info *i
vk_prepend_struct(&info->properties2, &info->shader_integer_dot_product_properties);
}
- if (vulkan_info->NV_fragment_shader_barycentric)
+ if (vulkan_info->NV_fragment_shader_barycentric && !vulkan_info->KHR_fragment_shader_barycentric)
{
info->barycentric_features_nv.sType =
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV;
vk_prepend_struct(&info->features2, &info->barycentric_features_nv);
}
+ if (vulkan_info->KHR_fragment_shader_barycentric)
+ {
+ info->barycentric_features_khr.sType =
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR;
+ vk_prepend_struct(&info->features2, &info->barycentric_features_khr);
+ }
+
if (vulkan_info->NV_compute_shader_derivatives)
{
info->compute_shader_derivatives_features_nv.sType =
@@ -5664,7 +5672,9 @@ static void d3d12_device_caps_init_feature_options3(struct d3d12_device *device)
D3D12_COMMAND_LIST_SUPPORT_FLAG_BUNDLE;
/* Currently not supported */
options3->ViewInstancingTier = D3D12_VIEW_INSTANCING_TIER_NOT_SUPPORTED;
- options3->BarycentricsSupported = device->device_info.barycentric_features_nv.fragmentShaderBarycentric;
+ options3->BarycentricsSupported =
+ device->device_info.barycentric_features_nv.fragmentShaderBarycentric ||
+ device->device_info.barycentric_features_khr.fragmentShaderBarycentric;
}
static void d3d12_device_caps_init_feature_options4(struct d3d12_device *device)
@@ -6068,6 +6078,12 @@ static void vkd3d_init_shader_extensions(struct d3d12_device *device)
VKD3D_SHADER_TARGET_EXTENSION_ASSUME_PER_COMPONENT_SSBO_ROBUSTNESS;
}
}
+
+ if (device->device_info.barycentric_features_khr.fragmentShaderBarycentric)
+ {
+ device->vk_info.shader_extensions[device->vk_info.shader_extension_count++] =
+ VKD3D_SHADER_TARGET_EXTENSION_BARYCENTRIC_KHR;
+ }
}
static void vkd3d_compute_shader_interface_key(struct d3d12_device *device)
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index 23936620..fa61a543 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -50,7 +50,6 @@
#define MAKE_MAGIC(a,b,c,d) (((uint32_t)a) | (((uint32_t)b) << 8) | (((uint32_t)c) << 16) | (((uint32_t)d) << 24))
#define VKD3D_MAX_COMPATIBLE_FORMAT_COUNT 10u
-#define VKD3D_MAX_SHADER_EXTENSIONS 6u
#define VKD3D_MAX_SHADER_STAGES 5u
#define VKD3D_MAX_VK_SYNC_OBJECTS 4u
@@ -134,6 +133,7 @@ struct vkd3d_vulkan_info
bool KHR_uniform_buffer_standard_layout;
bool KHR_maintenance4;
bool KHR_ray_tracing_maintenance1;
+ bool KHR_fragment_shader_barycentric;
/* EXT device extensions */
bool EXT_calibrated_timestamps;
bool EXT_conditional_rendering;
@@ -187,7 +187,7 @@ struct vkd3d_vulkan_info
VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT texel_buffer_alignment_properties;
unsigned int shader_extension_count;
- enum vkd3d_shader_target_extension shader_extensions[VKD3D_MAX_SHADER_EXTENSIONS];
+ enum vkd3d_shader_target_extension shader_extensions[VKD3D_SHADER_TARGET_EXTENSION_COUNT];
};
struct vkd3d_instance
@@ -3065,6 +3065,7 @@ struct vkd3d_physical_device_info
VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR separate_depth_stencil_layout_features;
VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR shader_integer_dot_product_features;
VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV barycentric_features_nv;
+ VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR barycentric_features_khr;
VkPhysicalDeviceRayQueryFeaturesKHR ray_query_features;
VkPhysicalDeviceComputeShaderDerivativesFeaturesNV compute_shader_derivatives_features_nv;
VkPhysicalDeviceShaderAtomicInt64FeaturesKHR shader_atomic_int64_features;