mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-01-28 13:05:02 -08:00
vkd3d-shader/spirv: Use capability ShaderViewportIndexLayerEXT for decoration Layer.
Capability Geometry allows to use the Layer builtin in geometry and pixel shaders. For vertex and domain shaders ShaderLayer should be used, but it's only available starting from SPIR-V 1.5. ShaderViewportIndexLayerEXT can be used instead with extension SPV_EXT_shader_viewport_index_layer.
This commit is contained in:
parent
dd00e209ac
commit
6ac525d6c3
Notes:
Alexandre Julliard
2024-01-22 22:53:41 +01:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Henri Verbeet (@hverbeet) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/546
@ -876,6 +876,8 @@ enum vkd3d_shader_spirv_extension
|
||||
VKD3D_SHADER_SPIRV_EXTENSION_EXT_DESCRIPTOR_INDEXING,
|
||||
/** \since 1.3 */
|
||||
VKD3D_SHADER_SPIRV_EXTENSION_EXT_STENCIL_EXPORT,
|
||||
/** \since 1.11 */
|
||||
VKD3D_SHADER_SPIRV_EXTENSION_EXT_VIEWPORT_INDEX_LAYER,
|
||||
|
||||
VKD3D_FORCE_32_BIT_ENUM(VKD3D_SHADER_SPIRV_EXTENSION),
|
||||
};
|
||||
|
@ -1933,6 +1933,8 @@ static bool vkd3d_spirv_compile_module(struct vkd3d_spirv_builder *builder,
|
||||
vkd3d_spirv_build_op_extension(&stream, "SPV_EXT_descriptor_indexing");
|
||||
if (vkd3d_spirv_capability_is_enabled(builder, SpvCapabilityStencilExportEXT))
|
||||
vkd3d_spirv_build_op_extension(&stream, "SPV_EXT_shader_stencil_export");
|
||||
if (vkd3d_spirv_capability_is_enabled(builder, SpvCapabilityShaderViewportIndexLayerEXT))
|
||||
vkd3d_spirv_build_op_extension(&stream, "SPV_EXT_shader_viewport_index_layer");
|
||||
|
||||
if (builder->ext_instr_set_glsl_450)
|
||||
vkd3d_spirv_build_op_ext_inst_import(&stream, builder->ext_instr_set_glsl_450, "GLSL.std.450");
|
||||
@ -4241,7 +4243,31 @@ static void spirv_compiler_decorate_builtin(struct spirv_compiler *compiler,
|
||||
spirv_compiler_emit_execution_mode(compiler, SpvExecutionModeDepthReplacing, NULL, 0);
|
||||
break;
|
||||
case SpvBuiltInLayer:
|
||||
vkd3d_spirv_enable_capability(builder, SpvCapabilityGeometry);
|
||||
switch (compiler->shader_type)
|
||||
{
|
||||
case VKD3D_SHADER_TYPE_PIXEL:
|
||||
case VKD3D_SHADER_TYPE_GEOMETRY:
|
||||
vkd3d_spirv_enable_capability(builder, SpvCapabilityGeometry);
|
||||
break;
|
||||
|
||||
case VKD3D_SHADER_TYPE_VERTEX:
|
||||
case VKD3D_SHADER_TYPE_DOMAIN:
|
||||
if (!spirv_compiler_is_target_extension_supported(compiler,
|
||||
VKD3D_SHADER_SPIRV_EXTENSION_EXT_VIEWPORT_INDEX_LAYER))
|
||||
{
|
||||
FIXME("The target environment does not support decoration Layer.\n");
|
||||
spirv_compiler_error(compiler, VKD3D_SHADER_ERROR_SPV_UNSUPPORTED_FEATURE,
|
||||
"Cannot use SV_RenderTargetArrayIndex. "
|
||||
"The target environment does not support decoration Layer.");
|
||||
}
|
||||
vkd3d_spirv_enable_capability(builder, SpvCapabilityShaderViewportIndexLayerEXT);
|
||||
break;
|
||||
|
||||
default:
|
||||
spirv_compiler_error(compiler, VKD3D_SHADER_ERROR_SPV_INVALID_SHADER,
|
||||
"Invalid use of SV_RenderTargetArrayIndex.");
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SpvBuiltInViewportIndex:
|
||||
vkd3d_spirv_enable_capability(builder, SpvCapabilityMultiViewport);
|
||||
|
@ -98,6 +98,7 @@ static const struct vkd3d_optional_extension_info optional_device_extensions[] =
|
||||
VK_EXTENSION(EXT_ROBUSTNESS_2, EXT_robustness2),
|
||||
VK_EXTENSION(EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION, EXT_shader_demote_to_helper_invocation),
|
||||
VK_EXTENSION(EXT_SHADER_STENCIL_EXPORT, EXT_shader_stencil_export),
|
||||
VK_EXTENSION(EXT_SHADER_VIEWPORT_INDEX_LAYER, EXT_shader_viewport_index_layer),
|
||||
VK_EXTENSION(EXT_TEXEL_BUFFER_ALIGNMENT, EXT_texel_buffer_alignment),
|
||||
VK_EXTENSION(EXT_TRANSFORM_FEEDBACK, EXT_transform_feedback),
|
||||
VK_EXTENSION(EXT_VERTEX_ATTRIBUTE_DIVISOR, EXT_vertex_attribute_divisor),
|
||||
@ -1546,8 +1547,6 @@ static HRESULT vkd3d_init_device_caps(struct d3d12_device *device,
|
||||
device->feature_options.StandardSwizzle64KBSupported = FALSE;
|
||||
device->feature_options.CrossNodeSharingTier = D3D12_CROSS_NODE_SHARING_TIER_NOT_SUPPORTED;
|
||||
device->feature_options.CrossAdapterRowMajorTextureSupported = FALSE;
|
||||
/* SPV_EXT_shader_viewport_index_layer */
|
||||
device->feature_options.VPAndRTArrayIndexFromAnyShaderFeedingRasterizerSupportedWithoutGSEmulation = FALSE;
|
||||
device->feature_options.ResourceHeapTier = D3D12_RESOURCE_HEAP_TIER_2;
|
||||
|
||||
/* Shader Model 6 support. */
|
||||
@ -1653,6 +1652,8 @@ static HRESULT vkd3d_init_device_caps(struct d3d12_device *device,
|
||||
vkd3d_free(vk_extensions);
|
||||
|
||||
device->feature_options.PSSpecifiedStencilRefSupported = vulkan_info->EXT_shader_stencil_export;
|
||||
device->feature_options.VPAndRTArrayIndexFromAnyShaderFeedingRasterizerSupportedWithoutGSEmulation =
|
||||
vulkan_info->EXT_shader_viewport_index_layer;
|
||||
|
||||
vkd3d_init_feature_level(vulkan_info, features, &device->feature_options);
|
||||
if (vulkan_info->max_feature_level < create_info->minimum_feature_level)
|
||||
@ -1678,6 +1679,10 @@ static HRESULT vkd3d_init_device_caps(struct d3d12_device *device,
|
||||
vulkan_info->shader_extensions[vulkan_info->shader_extension_count++]
|
||||
= VKD3D_SHADER_SPIRV_EXTENSION_EXT_STENCIL_EXPORT;
|
||||
|
||||
if (vulkan_info->EXT_shader_viewport_index_layer)
|
||||
vulkan_info->shader_extensions[vulkan_info->shader_extension_count++]
|
||||
= VKD3D_SHADER_SPIRV_EXTENSION_EXT_VIEWPORT_INDEX_LAYER;
|
||||
|
||||
/* Disable unused Vulkan features. */
|
||||
features->shaderTessellationAndGeometryPointSize = VK_FALSE;
|
||||
|
||||
|
@ -55,7 +55,7 @@
|
||||
|
||||
#define VKD3D_MAX_COMPATIBLE_FORMAT_COUNT 6u
|
||||
#define VKD3D_MAX_QUEUE_FAMILY_COUNT 3u
|
||||
#define VKD3D_MAX_SHADER_EXTENSIONS 3u
|
||||
#define VKD3D_MAX_SHADER_EXTENSIONS 4u
|
||||
#define VKD3D_MAX_SHADER_STAGES 5u
|
||||
#define VKD3D_MAX_VK_SYNC_OBJECTS 4u
|
||||
#define VKD3D_MAX_DEVICE_BLOCKED_QUEUES 16u
|
||||
@ -137,6 +137,7 @@ struct vkd3d_vulkan_info
|
||||
bool EXT_robustness2;
|
||||
bool EXT_shader_demote_to_helper_invocation;
|
||||
bool EXT_shader_stencil_export;
|
||||
bool EXT_shader_viewport_index_layer;
|
||||
bool EXT_texel_buffer_alignment;
|
||||
bool EXT_transform_feedback;
|
||||
bool EXT_vertex_attribute_divisor;
|
||||
|
Loading…
x
Reference in New Issue
Block a user