venus: Enable VK_EXT_pipeline_creation_cache_control
The extension disrupts assumptions in venus. It gives vkCreateFooPipelines an additional success code, VK_PIPELINE_COMPILE_REQUIRED, which allows some pipelines to succeed creation and others fail. Tested with 'dEQP-VK.*cache_control*' at vulkan-cts-1.3.3.1. pass/fail/skip/warn = 15/0/0/3 Warnings were from long pipeline compiles on a full debug build in host and guest. See: https://gitlab.freedesktop.org/virgl/virglrenderer/-/merge_requests/890 Signed-off-by: Chad Versace <chadversary@chromium.org> Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org> Reviewed-by: Ryan Neph <ryanneph@google.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17847>
This commit is contained in:
@@ -485,7 +485,7 @@ Vulkan 1.3 -- all DONE: anv, radv, lvp
|
|||||||
VK_EXT_extended_dynamic_state DONE (anv, lvp, radv, tu, vn)
|
VK_EXT_extended_dynamic_state DONE (anv, lvp, radv, tu, vn)
|
||||||
VK_EXT_extended_dynamic_state2 DONE (anv, lvp, radv, tu, vn)
|
VK_EXT_extended_dynamic_state2 DONE (anv, lvp, radv, tu, vn)
|
||||||
VK_EXT_inline_uniform_block DONE (anv, lvp, radv, v3dv, vn)
|
VK_EXT_inline_uniform_block DONE (anv, lvp, radv, v3dv, vn)
|
||||||
VK_EXT_pipeline_creation_cache_control DONE (anv, lvp, radv, tu, v3dv)
|
VK_EXT_pipeline_creation_cache_control DONE (anv, lvp, radv, tu, v3dv, vn)
|
||||||
VK_EXT_pipeline_creation_feedback DONE (anv, lvp, radv, tu, v3dv)
|
VK_EXT_pipeline_creation_feedback DONE (anv, lvp, radv, tu, v3dv)
|
||||||
VK_EXT_private_data DONE (anv, lvp, pvr, radv, tu, v3dv)
|
VK_EXT_private_data DONE (anv, lvp, pvr, radv, tu, v3dv)
|
||||||
VK_EXT_image_robustness DONE (anv, lvp, radv, tu, vn)
|
VK_EXT_image_robustness DONE (anv, lvp, radv, tu, vn)
|
||||||
|
@@ -132,6 +132,9 @@ vn_physical_device_init_features(struct vn_physical_device *physical_dev)
|
|||||||
VN_ADD_EXT_TO_PNEXT(exts->EXT_inline_uniform_block,
|
VN_ADD_EXT_TO_PNEXT(exts->EXT_inline_uniform_block,
|
||||||
feats->inline_uniform_block,
|
feats->inline_uniform_block,
|
||||||
INLINE_UNIFORM_BLOCK_FEATURES, features2);
|
INLINE_UNIFORM_BLOCK_FEATURES, features2);
|
||||||
|
VN_ADD_EXT_TO_PNEXT(exts->EXT_pipeline_creation_cache_control,
|
||||||
|
feats->pipeline_creation_cache_control,
|
||||||
|
PIPELINE_CREATION_CACHE_CONTROL_FEATURES, features2);
|
||||||
VN_ADD_EXT_TO_PNEXT(exts->KHR_dynamic_rendering, feats->dynamic_rendering,
|
VN_ADD_EXT_TO_PNEXT(exts->KHR_dynamic_rendering, feats->dynamic_rendering,
|
||||||
DYNAMIC_RENDERING_FEATURES, features2);
|
DYNAMIC_RENDERING_FEATURES, features2);
|
||||||
VN_ADD_EXT_TO_PNEXT(exts->KHR_maintenance4, feats->maintenance4,
|
VN_ADD_EXT_TO_PNEXT(exts->KHR_maintenance4, feats->maintenance4,
|
||||||
@@ -1002,6 +1005,7 @@ vn_physical_device_get_passthrough_extensions(
|
|||||||
.EXT_extended_dynamic_state2 = true,
|
.EXT_extended_dynamic_state2 = true,
|
||||||
.EXT_image_robustness = true,
|
.EXT_image_robustness = true,
|
||||||
.EXT_inline_uniform_block = true,
|
.EXT_inline_uniform_block = true,
|
||||||
|
.EXT_pipeline_creation_cache_control = true,
|
||||||
.EXT_shader_demote_to_helper_invocation = true,
|
.EXT_shader_demote_to_helper_invocation = true,
|
||||||
.EXT_texture_compression_astc_hdr = true,
|
.EXT_texture_compression_astc_hdr = true,
|
||||||
.KHR_copy_commands2 = true,
|
.KHR_copy_commands2 = true,
|
||||||
@@ -1634,6 +1638,8 @@ vn_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
|
|||||||
VkPhysicalDeviceImageRobustnessFeatures *image_robustness;
|
VkPhysicalDeviceImageRobustnessFeatures *image_robustness;
|
||||||
VkPhysicalDeviceInlineUniformBlockFeatures *inline_uniform_block;
|
VkPhysicalDeviceInlineUniformBlockFeatures *inline_uniform_block;
|
||||||
VkPhysicalDeviceMaintenance4Features *maintenance4;
|
VkPhysicalDeviceMaintenance4Features *maintenance4;
|
||||||
|
VkPhysicalDevicePipelineCreationCacheControlFeatures
|
||||||
|
*pipeline_creation_cache_control;
|
||||||
VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures
|
VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures
|
||||||
*shader_demote_to_helper_invocation;
|
*shader_demote_to_helper_invocation;
|
||||||
VkPhysicalDeviceTextureCompressionASTCHDRFeatures
|
VkPhysicalDeviceTextureCompressionASTCHDRFeatures
|
||||||
@@ -1829,6 +1835,9 @@ vn_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
|
|||||||
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES:
|
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES:
|
||||||
*u.inline_uniform_block = feats->inline_uniform_block;
|
*u.inline_uniform_block = feats->inline_uniform_block;
|
||||||
break;
|
break;
|
||||||
|
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES:
|
||||||
|
*u.pipeline_creation_cache_control = feats->pipeline_creation_cache_control;
|
||||||
|
break;
|
||||||
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES:
|
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES:
|
||||||
*u.shader_demote_to_helper_invocation =
|
*u.shader_demote_to_helper_invocation =
|
||||||
feats->shader_demote_to_helper_invocation;
|
feats->shader_demote_to_helper_invocation;
|
||||||
|
@@ -30,6 +30,8 @@ struct vn_physical_device_features {
|
|||||||
VkPhysicalDeviceImageRobustnessFeatures image_robustness;
|
VkPhysicalDeviceImageRobustnessFeatures image_robustness;
|
||||||
VkPhysicalDeviceInlineUniformBlockFeatures inline_uniform_block;
|
VkPhysicalDeviceInlineUniformBlockFeatures inline_uniform_block;
|
||||||
VkPhysicalDeviceMaintenance4Features maintenance4;
|
VkPhysicalDeviceMaintenance4Features maintenance4;
|
||||||
|
VkPhysicalDevicePipelineCreationCacheControlFeatures
|
||||||
|
pipeline_creation_cache_control;
|
||||||
VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures
|
VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures
|
||||||
shader_demote_to_helper_invocation;
|
shader_demote_to_helper_invocation;
|
||||||
VkPhysicalDeviceTextureCompressionASTCHDRFeatures
|
VkPhysicalDeviceTextureCompressionASTCHDRFeatures
|
||||||
|
@@ -277,6 +277,28 @@ vn_create_pipeline_handles(struct vn_device *dev,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** For vkCreate*Pipelines. */
|
||||||
|
static void
|
||||||
|
vn_destroy_failed_pipelines(struct vn_device *dev,
|
||||||
|
uint32_t create_info_count,
|
||||||
|
VkPipeline *pipelines,
|
||||||
|
const VkAllocationCallbacks *alloc)
|
||||||
|
{
|
||||||
|
for (uint32_t i = 0; i < create_info_count; i++) {
|
||||||
|
struct vn_pipeline *pipeline = vn_pipeline_from_handle(pipelines[i]);
|
||||||
|
|
||||||
|
if (pipeline->base.id == 0) {
|
||||||
|
vn_object_base_fini(&pipeline->base);
|
||||||
|
vk_free(alloc, pipeline);
|
||||||
|
pipelines[i] = VK_NULL_HANDLE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define VN_PIPELINE_CREATE_SYNC_MASK \
|
||||||
|
(VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT | \
|
||||||
|
VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT)
|
||||||
|
|
||||||
/** Fixes for a single VkGraphicsPipelineCreateInfo. */
|
/** Fixes for a single VkGraphicsPipelineCreateInfo. */
|
||||||
struct vn_graphics_pipeline_create_info_fix {
|
struct vn_graphics_pipeline_create_info_fix {
|
||||||
bool ignore_tessellation_state;
|
bool ignore_tessellation_state;
|
||||||
@@ -636,6 +658,8 @@ vn_CreateGraphicsPipelines(VkDevice device,
|
|||||||
const VkAllocationCallbacks *alloc =
|
const VkAllocationCallbacks *alloc =
|
||||||
pAllocator ? pAllocator : &dev->base.base.alloc;
|
pAllocator ? pAllocator : &dev->base.base.alloc;
|
||||||
struct vn_create_graphics_pipelines_fixes *fixes = NULL;
|
struct vn_create_graphics_pipelines_fixes *fixes = NULL;
|
||||||
|
bool want_sync = false;
|
||||||
|
VkResult result;
|
||||||
|
|
||||||
pCreateInfos = vn_fix_graphics_pipeline_create_info(
|
pCreateInfos = vn_fix_graphics_pipeline_create_info(
|
||||||
dev, createInfoCount, pCreateInfos, alloc, &fixes);
|
dev, createInfoCount, pCreateInfos, alloc, &fixes);
|
||||||
@@ -647,13 +671,29 @@ vn_CreateGraphicsPipelines(VkDevice device,
|
|||||||
return vn_error(dev->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
|
return vn_error(dev->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
vn_async_vkCreateGraphicsPipelines(dev->instance, device, pipelineCache,
|
for (uint32_t i = 0; i < createInfoCount; i++) {
|
||||||
createInfoCount, pCreateInfos, NULL,
|
if ((pCreateInfos[i].flags & VN_PIPELINE_CREATE_SYNC_MASK)) {
|
||||||
pPipelines);
|
want_sync = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (want_sync) {
|
||||||
|
result = vn_call_vkCreateGraphicsPipelines(
|
||||||
|
dev->instance, device, pipelineCache, createInfoCount, pCreateInfos,
|
||||||
|
NULL, pPipelines);
|
||||||
|
if (result != VK_SUCCESS)
|
||||||
|
vn_destroy_failed_pipelines(dev, createInfoCount, pPipelines, alloc);
|
||||||
|
} else {
|
||||||
|
vn_async_vkCreateGraphicsPipelines(dev->instance, device, pipelineCache,
|
||||||
|
createInfoCount, pCreateInfos, NULL,
|
||||||
|
pPipelines);
|
||||||
|
result = VK_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
vk_free(alloc, fixes);
|
vk_free(alloc, fixes);
|
||||||
|
|
||||||
return VK_SUCCESS;
|
return vn_result(dev->instance, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
VkResult
|
VkResult
|
||||||
@@ -668,15 +708,33 @@ vn_CreateComputePipelines(VkDevice device,
|
|||||||
struct vn_device *dev = vn_device_from_handle(device);
|
struct vn_device *dev = vn_device_from_handle(device);
|
||||||
const VkAllocationCallbacks *alloc =
|
const VkAllocationCallbacks *alloc =
|
||||||
pAllocator ? pAllocator : &dev->base.base.alloc;
|
pAllocator ? pAllocator : &dev->base.base.alloc;
|
||||||
|
bool want_sync = false;
|
||||||
|
VkResult result;
|
||||||
|
|
||||||
if (!vn_create_pipeline_handles(dev, createInfoCount, pPipelines, alloc))
|
if (!vn_create_pipeline_handles(dev, createInfoCount, pPipelines, alloc))
|
||||||
return vn_error(dev->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
|
return vn_error(dev->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
|
||||||
|
|
||||||
vn_async_vkCreateComputePipelines(dev->instance, device, pipelineCache,
|
for (uint32_t i = 0; i < createInfoCount; i++) {
|
||||||
createInfoCount, pCreateInfos, NULL,
|
if ((pCreateInfos[i].flags & VN_PIPELINE_CREATE_SYNC_MASK)) {
|
||||||
pPipelines);
|
want_sync = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return VK_SUCCESS;
|
if (want_sync) {
|
||||||
|
result = vn_call_vkCreateComputePipelines(
|
||||||
|
dev->instance, device, pipelineCache, createInfoCount, pCreateInfos,
|
||||||
|
NULL, pPipelines);
|
||||||
|
if (result != VK_SUCCESS)
|
||||||
|
vn_destroy_failed_pipelines(dev, createInfoCount, pPipelines, alloc);
|
||||||
|
} else {
|
||||||
|
vn_call_vkCreateComputePipelines(dev->instance, device, pipelineCache,
|
||||||
|
createInfoCount, pCreateInfos, NULL,
|
||||||
|
pPipelines);
|
||||||
|
result = VK_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
return vn_result(dev->instance, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Reference in New Issue
Block a user