vk,lvp,tu,radv,anv: Add common vk_*_pipeline_create_flags() helper

And replace the various homegrown or copy-pasted helpers in drivers.

Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25436>
This commit is contained in:
Connor Abbott
2023-09-28 12:31:18 +02:00
committed by Marge Bot
parent cac194ff38
commit e6f5d7222c
11 changed files with 81 additions and 114 deletions
+4 -2
View File
@@ -30,6 +30,8 @@
#include "ac_rgp.h"
#include "ac_sqtt.h"
#include "vk_pipeline.h"
void
radv_sqtt_emit_relocated_shaders(struct radv_cmd_buffer *cmd_buffer, struct radv_graphics_pipeline *pipeline)
{
@@ -1403,7 +1405,7 @@ sqtt_CreateGraphicsPipelines(VkDevice _device, VkPipelineCache pipelineCache, ui
if (!pipeline)
continue;
const VkPipelineCreateFlagBits2KHR create_flags = radv_get_pipeline_create_flags(&pCreateInfos[i]);
const VkPipelineCreateFlagBits2KHR create_flags = vk_graphics_pipeline_create_flags(&pCreateInfos[i]);
if (create_flags & VK_PIPELINE_CREATE_2_LIBRARY_BIT_KHR)
continue;
@@ -1480,7 +1482,7 @@ sqtt_CreateRayTracingPipelinesKHR(VkDevice _device, VkDeferredOperationKHR defer
if (!pipeline)
continue;
const VkPipelineCreateFlagBits2KHR create_flags = radv_get_pipeline_create_flags(&pCreateInfos[i]);
const VkPipelineCreateFlagBits2KHR create_flags = vk_rt_pipeline_create_flags(&pCreateInfos[i]);
if (create_flags & VK_PIPELINE_CREATE_2_LIBRARY_BIT_KHR)
continue;
+1 -1
View File
@@ -112,7 +112,7 @@ radv_hash_rt_shaders(unsigned char *hash, const VkRayTracingPipelineCreateInfoKH
}
const uint64_t pipeline_flags =
radv_get_pipeline_create_flags(pCreateInfo) &
vk_rt_pipeline_create_flags(pCreateInfo) &
(VK_PIPELINE_CREATE_2_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR | VK_PIPELINE_CREATE_2_RAY_TRACING_SKIP_AABBS_BIT_KHR |
VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR |
VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR |
+2 -2
View File
@@ -266,7 +266,7 @@ radv_compute_pipeline_create(VkDevice _device, VkPipelineCache _cache, const VkC
}
radv_pipeline_init(device, &pipeline->base, RADV_PIPELINE_COMPUTE);
pipeline->base.create_flags = radv_get_pipeline_create_flags(pCreateInfo);
pipeline->base.create_flags = vk_compute_pipeline_create_flags(pCreateInfo);
pipeline->base.is_internal = _cache == device->meta_state.cache;
const VkPipelineCreationFeedbackCreateInfo *creation_feedback =
@@ -303,7 +303,7 @@ radv_create_compute_pipelines(VkDevice _device, VkPipelineCache pipelineCache, u
result = r;
pPipelines[i] = VK_NULL_HANDLE;
VkPipelineCreateFlagBits2KHR create_flags = radv_get_pipeline_create_flags(&pCreateInfos[i]);
VkPipelineCreateFlagBits2KHR create_flags = vk_compute_pipeline_create_flags(&pCreateInfos[i]);
if (create_flags & VK_PIPELINE_CREATE_2_EARLY_RETURN_ON_FAILURE_BIT_KHR)
break;
}
+3 -3
View File
@@ -4078,7 +4078,7 @@ radv_graphics_pipeline_create(VkDevice _device, VkPipelineCache _cache, const Vk
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
radv_pipeline_init(device, &pipeline->base, RADV_PIPELINE_GRAPHICS);
pipeline->base.create_flags = radv_get_pipeline_create_flags(pCreateInfo);
pipeline->base.create_flags = vk_graphics_pipeline_create_flags(pCreateInfo);
pipeline->base.is_internal = _cache == device->meta_state.cache;
result = radv_graphics_pipeline_init(pipeline, device, cache, pCreateInfo, extra);
@@ -4179,7 +4179,7 @@ radv_graphics_lib_pipeline_create(VkDevice _device, VkPipelineCache _cache,
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
radv_pipeline_init(device, &pipeline->base.base, RADV_PIPELINE_GRAPHICS_LIB);
pipeline->base.base.create_flags = radv_get_pipeline_create_flags(pCreateInfo);
pipeline->base.base.create_flags = vk_graphics_pipeline_create_flags(pCreateInfo);
pipeline->mem_ctx = ralloc_context(NULL);
@@ -4219,7 +4219,7 @@ radv_CreateGraphicsPipelines(VkDevice _device, VkPipelineCache pipelineCache, ui
unsigned i = 0;
for (; i < count; i++) {
const VkPipelineCreateFlagBits2KHR create_flags = radv_get_pipeline_create_flags(&pCreateInfos[i]);
const VkPipelineCreateFlagBits2KHR create_flags = vk_graphics_pipeline_create_flags(&pCreateInfos[i]);
VkResult r;
if (create_flags & VK_PIPELINE_CREATE_2_LIBRARY_BIT_KHR) {
r = radv_graphics_lib_pipeline_create(_device, pipelineCache, &pCreateInfos[i], pAllocator, &pPipelines[i]);
+2 -2
View File
@@ -743,7 +743,7 @@ radv_rt_pipeline_create(VkDevice _device, VkPipelineCache _cache, const VkRayTra
return VK_ERROR_OUT_OF_HOST_MEMORY;
radv_pipeline_init(device, &pipeline->base.base, RADV_PIPELINE_RAY_TRACING);
pipeline->base.base.create_flags = radv_get_pipeline_create_flags(pCreateInfo);
pipeline->base.base.create_flags = vk_rt_pipeline_create_flags(pCreateInfo);
pipeline->stage_count = local_create_info.stageCount;
pipeline->group_count = local_create_info.groupCount;
pipeline->stages = stages;
@@ -847,7 +847,7 @@ radv_CreateRayTracingPipelinesKHR(VkDevice _device, VkDeferredOperationKHR defer
result = r;
pPipelines[i] = VK_NULL_HANDLE;
const VkPipelineCreateFlagBits2KHR create_flags = radv_get_pipeline_create_flags(&pCreateInfos[i]);
const VkPipelineCreateFlagBits2KHR create_flags = vk_rt_pipeline_create_flags(&pCreateInfos[i]);
if (create_flags & VK_PIPELINE_CREATE_2_EARLY_RETURN_ON_FAILURE_BIT_KHR)
break;
}
-30
View File
@@ -1926,36 +1926,6 @@ struct radv_dispatch_info {
void radv_compute_dispatch(struct radv_cmd_buffer *cmd_buffer, const struct radv_dispatch_info *info);
static VkPipelineCreateFlagBits2KHR
radv_get_pipeline_create_flags(const void *pCreateInfo)
{
const VkBaseInStructure *base = pCreateInfo;
const VkPipelineCreateFlags2CreateInfoKHR *flags2 =
vk_find_struct_const(base->pNext, PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR);
if (flags2)
return flags2->flags;
switch (((VkBaseInStructure *)pCreateInfo)->sType) {
case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO: {
const VkGraphicsPipelineCreateInfo *create_info = (VkGraphicsPipelineCreateInfo *)pCreateInfo;
return create_info->flags;
}
case VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO: {
const VkComputePipelineCreateInfo *create_info = (VkComputePipelineCreateInfo *)pCreateInfo;
return create_info->flags;
}
case VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR: {
const VkRayTracingPipelineCreateInfoKHR *create_info = (VkRayTracingPipelineCreateInfoKHR *)pCreateInfo;
return create_info->flags;
}
default:
unreachable("invalid pCreateInfo pipeline struct");
}
return 0;
}
struct radv_image;
struct radv_image_view;
+4 -2
View File
@@ -32,6 +32,8 @@
#include "radv_rt_common.h"
#include "radv_shader.h"
#include "vk_pipeline.h"
/* Traversal stack size. This stack is put in LDS and experimentally 16 entries results in best
* performance. */
#define MAX_STACK_ENTRY_COUNT 16
@@ -1437,7 +1439,7 @@ nir_shader *
radv_build_traversal_shader(struct radv_device *device, struct radv_ray_tracing_pipeline *pipeline,
const VkRayTracingPipelineCreateInfoKHR *pCreateInfo)
{
const VkPipelineCreateFlagBits2KHR create_flags = radv_get_pipeline_create_flags(pCreateInfo);
const VkPipelineCreateFlagBits2KHR create_flags = vk_rt_pipeline_create_flags(pCreateInfo);
/* Create the traversal shader as an intersection shader to prevent validation failures due to
* invalid variable modes.*/
@@ -1612,7 +1614,7 @@ radv_nir_lower_rt_abi(nir_shader *shader, const VkRayTracingPipelineCreateInfoKH
{
nir_function_impl *impl = nir_shader_get_entrypoint(shader);
const VkPipelineCreateFlagBits2KHR create_flags = radv_get_pipeline_create_flags(pCreateInfo);
const VkPipelineCreateFlagBits2KHR create_flags = vk_rt_pipeline_create_flags(pCreateInfo);
struct rt_variables vars = create_rt_variables(shader, create_flags);
+4 -12
View File
@@ -4221,12 +4221,8 @@ tu_CreateGraphicsPipelines(VkDevice device,
uint32_t i = 0;
for (; i < count; i++) {
VkPipelineCreateFlags2KHR flags = pCreateInfos[i].flags;
const VkPipelineCreateFlags2CreateInfoKHR *flags2 =
vk_find_struct_const(pCreateInfos[i].pNext,
PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR);
if (flags2)
flags = flags2->flags;
VkPipelineCreateFlags2KHR flags =
vk_graphics_pipeline_create_flags(&pCreateInfos[i]);
VkResult result =
tu_graphics_pipeline_create<CHIP>(device, pipelineCache,
@@ -4406,12 +4402,8 @@ tu_CreateComputePipelines(VkDevice device,
uint32_t i = 0;
for (; i < count; i++) {
VkPipelineCreateFlags2KHR flags = pCreateInfos[i].flags;
const VkPipelineCreateFlags2CreateInfoKHR *flags2 =
vk_find_struct_const(pCreateInfos[i].pNext,
PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR);
if (flags2)
flags = flags2->flags;
VkPipelineCreateFlags2KHR flags =
vk_compute_pipeline_create_flags(&pCreateInfos[i]);
VkResult result =
tu_compute_pipeline_create<CHIP>(device, pipelineCache,
+3 -39
View File
@@ -1032,42 +1032,6 @@ lvp_graphics_pipeline_create(
return VK_SUCCESS;
}
static VkPipelineCreateFlagBits2KHR
get_pipeline_create_flags(const void *pCreateInfo)
{
const VkBaseInStructure *base = pCreateInfo;
const VkPipelineCreateFlags2CreateInfoKHR *flags2 =
vk_find_struct_const(base->pNext, PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR);
if (flags2)
return flags2->flags;
switch (((VkBaseInStructure *)pCreateInfo)->sType) {
case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO: {
const VkGraphicsPipelineCreateInfo *create_info = (VkGraphicsPipelineCreateInfo *)pCreateInfo;
return create_info->flags;
}
case VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO: {
const VkComputePipelineCreateInfo *create_info = (VkComputePipelineCreateInfo *)pCreateInfo;
return create_info->flags;
}
case VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR: {
const VkRayTracingPipelineCreateInfoKHR *create_info = (VkRayTracingPipelineCreateInfoKHR *)pCreateInfo;
return create_info->flags;
}
#ifdef VK_ENABLE_BETA_EXTENSIONS
case VK_STRUCTURE_TYPE_EXECUTION_GRAPH_PIPELINE_CREATE_INFO_AMDX: {
const VkExecutionGraphPipelineCreateInfoAMDX *create_info = (VkExecutionGraphPipelineCreateInfoAMDX *)pCreateInfo;
return create_info->flags;
}
#endif
default:
unreachable("invalid pCreateInfo pipeline struct");
}
return 0;
}
VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateGraphicsPipelines(
VkDevice _device,
VkPipelineCache pipelineCache,
@@ -1081,7 +1045,7 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateGraphicsPipelines(
for (; i < count; i++) {
VkResult r = VK_PIPELINE_COMPILE_REQUIRED;
VkPipelineCreateFlagBits2KHR flags = get_pipeline_create_flags(&pCreateInfos[i]);
VkPipelineCreateFlagBits2KHR flags = vk_graphics_pipeline_create_flags(&pCreateInfos[i]);
if (!(flags & VK_PIPELINE_CREATE_2_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_KHR))
r = lvp_graphics_pipeline_create(_device,
@@ -1183,7 +1147,7 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateComputePipelines(
for (; i < count; i++) {
VkResult r = VK_PIPELINE_COMPILE_REQUIRED;
VkPipelineCreateFlagBits2KHR flags = get_pipeline_create_flags(&pCreateInfos[i]);
VkPipelineCreateFlagBits2KHR flags = vk_compute_pipeline_create_flags(&pCreateInfos[i]);
if (!(flags & VK_PIPELINE_CREATE_2_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_KHR))
r = lvp_compute_pipeline_create(_device,
@@ -1491,7 +1455,7 @@ lvp_CreateExecutionGraphPipelinesAMDX(VkDevice device, VkPipelineCache pipelineC
uint32_t i = 0;
for (; i < createInfoCount; i++) {
VkPipelineCreateFlagBits2KHR flags = get_pipeline_create_flags(&pCreateInfos[i]);
VkPipelineCreateFlagBits2KHR flags = vk_graph_pipeline_create_flags(&pCreateInfos[i]);
VkResult r = VK_PIPELINE_COMPILE_REQUIRED;
if (!(flags & VK_PIPELINE_CREATE_2_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_KHR))
+7 -21
View File
@@ -2676,18 +2676,6 @@ anv_pipeline_compile_cs(struct anv_compute_pipeline *pipeline,
return VK_SUCCESS;
}
static VkPipelineCreateFlags2KHR
get_pipeline_flags(VkPipelineCreateFlags flags, const void *pNext)
{
const VkPipelineCreateFlags2CreateInfoKHR *flags2 =
vk_find_struct_const(pNext, PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR);
if (flags2)
return flags2->flags;
return (VkPipelineCreateFlags2KHR)flags;
}
static VkResult
anv_compute_pipeline_create(struct anv_device *device,
struct vk_pipeline_cache *cache,
@@ -2707,8 +2695,7 @@ anv_compute_pipeline_create(struct anv_device *device,
result = anv_pipeline_init(&pipeline->base, device,
ANV_PIPELINE_COMPUTE,
get_pipeline_flags(pCreateInfo->flags,
pCreateInfo->pNext),
vk_compute_pipeline_create_flags(pCreateInfo),
pAllocator);
if (result != VK_SUCCESS) {
vk_free2(&device->vk.alloc, pAllocator, pipeline);
@@ -2754,7 +2741,7 @@ VkResult anv_CreateComputePipelines(
unsigned i;
for (i = 0; i < count; i++) {
const VkPipelineCreateFlags2KHR flags =
get_pipeline_flags(pCreateInfos[i].flags, pCreateInfos[i].pNext);
vk_compute_pipeline_create_flags(&pCreateInfos[i]);
VkResult res = anv_compute_pipeline_create(device, pipeline_cache,
&pCreateInfos[i],
pAllocator, &pPipelines[i]);
@@ -3020,7 +3007,7 @@ anv_graphics_lib_pipeline_create(struct anv_device *device,
VkResult result;
const VkPipelineCreateFlags2KHR flags =
get_pipeline_flags(pCreateInfo->flags, pCreateInfo->pNext);
vk_graphics_pipeline_create_flags(pCreateInfo);
assert(flags & VK_PIPELINE_CREATE_2_LIBRARY_BIT_KHR);
const VkPipelineLibraryCreateInfoKHR *libs_info =
@@ -3129,7 +3116,7 @@ anv_graphics_pipeline_create(struct anv_device *device,
VkResult result;
const VkPipelineCreateFlags2KHR flags =
get_pipeline_flags(pCreateInfo->flags, pCreateInfo->pNext);
vk_graphics_pipeline_create_flags(pCreateInfo);
assert((flags & VK_PIPELINE_CREATE_2_LIBRARY_BIT_KHR) == 0);
const VkPipelineLibraryCreateInfoKHR *libs_info =
@@ -3266,7 +3253,7 @@ VkResult anv_CreateGraphicsPipelines(
assert(pCreateInfos[i].sType == VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO);
const VkPipelineCreateFlags2KHR flags =
get_pipeline_flags(pCreateInfos[i].flags, pCreateInfos[i].pNext);
vk_graphics_pipeline_create_flags(&pCreateInfos[i]);
VkResult res;
if (flags & VK_PIPELINE_CREATE_2_LIBRARY_BIT_KHR) {
res = anv_graphics_lib_pipeline_create(device, pipeline_cache,
@@ -4018,8 +4005,7 @@ anv_ray_tracing_pipeline_create(
result = anv_pipeline_init(&pipeline->base, device,
ANV_PIPELINE_RAY_TRACING,
get_pipeline_flags(pCreateInfo->flags,
pCreateInfo->pNext),
vk_rt_pipeline_create_flags(pCreateInfo),
pAllocator);
if (result != VK_SUCCESS) {
vk_free2(&device->vk.alloc, pAllocator, pipeline);
@@ -4135,7 +4121,7 @@ anv_CreateRayTracingPipelinesKHR(
unsigned i;
for (i = 0; i < createInfoCount; i++) {
const VkPipelineCreateFlags2KHR flags =
get_pipeline_flags(pCreateInfos[i].flags, pCreateInfos[i].pNext);
vk_rt_pipeline_create_flags(&pCreateInfos[i]);
VkResult res = anv_ray_tracing_pipeline_create(_device, pipeline_cache,
&pCreateInfos[i],
pAllocator, &pPipelines[i]);
+51
View File
@@ -25,6 +25,7 @@
#define VK_PIPELINE_H
#include "vulkan/vulkan_core.h"
#include "vk_util.h"
#include <stdbool.h>
@@ -88,6 +89,56 @@ vk_pipeline_robustness_state_fill(const struct vk_device *device,
const void *pipeline_pNext,
const void *shader_stage_pNext);
static inline VkPipelineCreateFlags2KHR
vk_compute_pipeline_create_flags(const VkComputePipelineCreateInfo *info)
{
const VkPipelineCreateFlags2CreateInfoKHR *flags2 =
vk_find_struct_const(info->pNext,
PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR);
if (flags2)
return flags2->flags;
else
return info->flags;
}
static inline VkPipelineCreateFlags2KHR
vk_graphics_pipeline_create_flags(const VkGraphicsPipelineCreateInfo *info)
{
const VkPipelineCreateFlags2CreateInfoKHR *flags2 =
vk_find_struct_const(info->pNext,
PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR);
if (flags2)
return flags2->flags;
else
return info->flags;
}
static inline VkPipelineCreateFlags2KHR
vk_rt_pipeline_create_flags(const VkRayTracingPipelineCreateInfoKHR *info)
{
const VkPipelineCreateFlags2CreateInfoKHR *flags2 =
vk_find_struct_const(info->pNext,
PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR);
if (flags2)
return flags2->flags;
else
return info->flags;
}
#ifdef VK_ENABLE_BETA_EXTENSIONS
static inline VkPipelineCreateFlags2KHR
vk_graph_pipeline_create_flags(const VkExecutionGraphPipelineCreateInfoAMDX *info)
{
const VkPipelineCreateFlags2CreateInfoKHR *flags2 =
vk_find_struct_const(info->pNext,
PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR);
if (flags2)
return flags2->flags;
else
return info->flags;
}
#endif
#ifdef __cplusplus
}
#endif