anv: move CreateGraphicsPipelines to common code
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Jason Ekstrand <jason.ekstrand@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17601>
This commit is contained in:
parent
1ba89d35ab
commit
2c816b4f2e
|
@ -38,6 +38,8 @@
|
||||||
|
|
||||||
struct intel_sample_positions;
|
struct intel_sample_positions;
|
||||||
|
|
||||||
|
typedef struct VkRenderingSelfDependencyInfoMESA VkRenderingSelfDependencyInfoMESA;
|
||||||
|
|
||||||
extern const uint32_t genX(vk_to_intel_cullmode)[];
|
extern const uint32_t genX(vk_to_intel_cullmode)[];
|
||||||
|
|
||||||
extern const uint32_t genX(vk_to_intel_front_face)[];
|
extern const uint32_t genX(vk_to_intel_front_face)[];
|
||||||
|
@ -166,3 +168,9 @@ genX(ms_rasterization_mode)(struct anv_graphics_pipeline *pipeline,
|
||||||
VkPolygonMode
|
VkPolygonMode
|
||||||
genX(raster_polygon_mode)(struct anv_graphics_pipeline *pipeline,
|
genX(raster_polygon_mode)(struct anv_graphics_pipeline *pipeline,
|
||||||
VkPrimitiveTopology primitive_topology);
|
VkPrimitiveTopology primitive_topology);
|
||||||
|
|
||||||
|
void
|
||||||
|
genX(graphics_pipeline_emit)(struct anv_graphics_pipeline *pipeline,
|
||||||
|
const VkGraphicsPipelineCreateInfo *pCreateInfo,
|
||||||
|
const VkPipelineRenderingCreateInfo *rendering_info,
|
||||||
|
const VkRenderingSelfDependencyInfoMESA *rsd_info);
|
||||||
|
|
|
@ -2320,7 +2320,7 @@ vk_line_rasterization_mode(const VkPipelineRasterizationLineStateCreateInfoEXT *
|
||||||
return line_mode;
|
return line_mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
VkResult
|
static VkResult
|
||||||
anv_graphics_pipeline_init(struct anv_graphics_pipeline *pipeline,
|
anv_graphics_pipeline_init(struct anv_graphics_pipeline *pipeline,
|
||||||
struct anv_device *device,
|
struct anv_device *device,
|
||||||
struct vk_pipeline_cache *cache,
|
struct vk_pipeline_cache *cache,
|
||||||
|
@ -2493,6 +2493,105 @@ anv_graphics_pipeline_init(struct anv_graphics_pipeline *pipeline,
|
||||||
return VK_SUCCESS;
|
return VK_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VkResult
|
||||||
|
anv_graphics_pipeline_create(struct anv_device *device,
|
||||||
|
struct vk_pipeline_cache *cache,
|
||||||
|
const VkGraphicsPipelineCreateInfo *pCreateInfo,
|
||||||
|
const VkAllocationCallbacks *pAllocator,
|
||||||
|
VkPipeline *pPipeline)
|
||||||
|
{
|
||||||
|
struct anv_graphics_pipeline *pipeline;
|
||||||
|
VkResult result;
|
||||||
|
|
||||||
|
assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO);
|
||||||
|
|
||||||
|
pipeline = vk_zalloc2(&device->vk.alloc, pAllocator, sizeof(*pipeline), 8,
|
||||||
|
VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
|
||||||
|
if (pipeline == NULL)
|
||||||
|
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
|
||||||
|
|
||||||
|
/* We'll use these as defaults if we don't have pipeline rendering or
|
||||||
|
* self-dependency structs. Saves us some NULL checks.
|
||||||
|
*/
|
||||||
|
VkRenderingSelfDependencyInfoMESA rsd_info_tmp = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_RENDERING_SELF_DEPENDENCY_INFO_MESA,
|
||||||
|
};
|
||||||
|
VkPipelineRenderingCreateInfo rendering_info_tmp = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO,
|
||||||
|
.pNext = &rsd_info_tmp,
|
||||||
|
};
|
||||||
|
|
||||||
|
const VkPipelineRenderingCreateInfo *rendering_info =
|
||||||
|
vk_get_pipeline_rendering_create_info(pCreateInfo);
|
||||||
|
if (rendering_info == NULL)
|
||||||
|
rendering_info = &rendering_info_tmp;
|
||||||
|
|
||||||
|
const VkRenderingSelfDependencyInfoMESA *rsd_info =
|
||||||
|
vk_find_struct_const(rendering_info->pNext,
|
||||||
|
RENDERING_SELF_DEPENDENCY_INFO_MESA);
|
||||||
|
if (rsd_info == NULL)
|
||||||
|
rsd_info = &rsd_info_tmp;
|
||||||
|
|
||||||
|
result = anv_graphics_pipeline_init(pipeline, device, cache,
|
||||||
|
pCreateInfo, rendering_info,
|
||||||
|
pAllocator);
|
||||||
|
if (result != VK_SUCCESS) {
|
||||||
|
vk_free2(&device->vk.alloc, pAllocator, pipeline);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
anv_genX(&device->info, graphics_pipeline_emit)(pipeline,
|
||||||
|
pCreateInfo,
|
||||||
|
rendering_info,
|
||||||
|
rsd_info);
|
||||||
|
|
||||||
|
*pPipeline = anv_pipeline_to_handle(&pipeline->base);
|
||||||
|
|
||||||
|
return pipeline->base.batch.status;
|
||||||
|
}
|
||||||
|
|
||||||
|
VkResult anv_CreateGraphicsPipelines(
|
||||||
|
VkDevice _device,
|
||||||
|
VkPipelineCache pipelineCache,
|
||||||
|
uint32_t count,
|
||||||
|
const VkGraphicsPipelineCreateInfo* pCreateInfos,
|
||||||
|
const VkAllocationCallbacks* pAllocator,
|
||||||
|
VkPipeline* pPipelines)
|
||||||
|
{
|
||||||
|
ANV_FROM_HANDLE(anv_device, device, _device);
|
||||||
|
ANV_FROM_HANDLE(vk_pipeline_cache, pipeline_cache, pipelineCache);
|
||||||
|
|
||||||
|
VkResult result = VK_SUCCESS;
|
||||||
|
|
||||||
|
unsigned i;
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
VkResult res = anv_graphics_pipeline_create(device,
|
||||||
|
pipeline_cache,
|
||||||
|
&pCreateInfos[i],
|
||||||
|
pAllocator, &pPipelines[i]);
|
||||||
|
|
||||||
|
if (res == VK_SUCCESS)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Bail out on the first error != VK_PIPELINE_COMPILE_REQUIRED as it
|
||||||
|
* is not obvious what error should be report upon 2 different failures.
|
||||||
|
* */
|
||||||
|
result = res;
|
||||||
|
if (res != VK_PIPELINE_COMPILE_REQUIRED)
|
||||||
|
break;
|
||||||
|
|
||||||
|
pPipelines[i] = VK_NULL_HANDLE;
|
||||||
|
|
||||||
|
if (pCreateInfos[i].flags & VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; i < count; i++)
|
||||||
|
pPipelines[i] = VK_NULL_HANDLE;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
static VkResult
|
static VkResult
|
||||||
compile_upload_rt_shader(struct anv_ray_tracing_pipeline *pipeline,
|
compile_upload_rt_shader(struct anv_ray_tracing_pipeline *pipeline,
|
||||||
struct vk_pipeline_cache *cache,
|
struct vk_pipeline_cache *cache,
|
||||||
|
|
|
@ -3542,13 +3542,6 @@ anv_pipeline_finish(struct anv_pipeline *pipeline,
|
||||||
struct anv_device *device,
|
struct anv_device *device,
|
||||||
const VkAllocationCallbacks *pAllocator);
|
const VkAllocationCallbacks *pAllocator);
|
||||||
|
|
||||||
VkResult
|
|
||||||
anv_graphics_pipeline_init(struct anv_graphics_pipeline *pipeline, struct anv_device *device,
|
|
||||||
struct vk_pipeline_cache *cache,
|
|
||||||
const VkGraphicsPipelineCreateInfo *pCreateInfo,
|
|
||||||
const VkPipelineRenderingCreateInfo *rendering_info,
|
|
||||||
const VkAllocationCallbacks *alloc);
|
|
||||||
|
|
||||||
VkResult
|
VkResult
|
||||||
anv_pipeline_compile_cs(struct anv_compute_pipeline *pipeline,
|
anv_pipeline_compile_cs(struct anv_compute_pipeline *pipeline,
|
||||||
struct vk_pipeline_cache *cache,
|
struct vk_pipeline_cache *cache,
|
||||||
|
|
|
@ -2654,57 +2654,12 @@ emit_mesh_state(struct anv_graphics_pipeline *pipeline)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static VkResult
|
void
|
||||||
genX(graphics_pipeline_create)(
|
genX(graphics_pipeline_emit)(struct anv_graphics_pipeline *pipeline,
|
||||||
VkDevice _device,
|
|
||||||
struct vk_pipeline_cache * cache,
|
|
||||||
const VkGraphicsPipelineCreateInfo *pCreateInfo,
|
const VkGraphicsPipelineCreateInfo *pCreateInfo,
|
||||||
const VkAllocationCallbacks* pAllocator,
|
const VkPipelineRenderingCreateInfo *rendering_info,
|
||||||
VkPipeline* pPipeline)
|
const VkRenderingSelfDependencyInfoMESA *rsd_info)
|
||||||
{
|
{
|
||||||
ANV_FROM_HANDLE(anv_device, device, _device);
|
|
||||||
struct anv_graphics_pipeline *pipeline;
|
|
||||||
VkResult result;
|
|
||||||
|
|
||||||
assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO);
|
|
||||||
|
|
||||||
pipeline = vk_zalloc2(&device->vk.alloc, pAllocator, sizeof(*pipeline), 8,
|
|
||||||
VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
|
|
||||||
if (pipeline == NULL)
|
|
||||||
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
|
|
||||||
|
|
||||||
/* We'll use these as defaults if we don't have pipeline rendering or
|
|
||||||
* self-dependency structs. Saves us some NULL checks.
|
|
||||||
*/
|
|
||||||
VkRenderingSelfDependencyInfoMESA rsd_info_tmp = {
|
|
||||||
.sType = VK_STRUCTURE_TYPE_RENDERING_SELF_DEPENDENCY_INFO_MESA,
|
|
||||||
};
|
|
||||||
VkPipelineRenderingCreateInfo rendering_info_tmp = {
|
|
||||||
.sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO,
|
|
||||||
.pNext = &rsd_info_tmp,
|
|
||||||
};
|
|
||||||
|
|
||||||
const VkPipelineRenderingCreateInfo *rendering_info =
|
|
||||||
vk_get_pipeline_rendering_create_info(pCreateInfo);
|
|
||||||
if (rendering_info == NULL)
|
|
||||||
rendering_info = &rendering_info_tmp;
|
|
||||||
|
|
||||||
const VkRenderingSelfDependencyInfoMESA *rsd_info =
|
|
||||||
vk_find_struct_const(rendering_info->pNext,
|
|
||||||
RENDERING_SELF_DEPENDENCY_INFO_MESA);
|
|
||||||
if (rsd_info == NULL)
|
|
||||||
rsd_info = &rsd_info_tmp;
|
|
||||||
|
|
||||||
result = anv_graphics_pipeline_init(pipeline, device, cache,
|
|
||||||
pCreateInfo, rendering_info,
|
|
||||||
pAllocator);
|
|
||||||
if (result != VK_SUCCESS) {
|
|
||||||
vk_free2(&device->vk.alloc, pAllocator, pipeline);
|
|
||||||
if (result == VK_PIPELINE_COMPILE_REQUIRED)
|
|
||||||
*pPipeline = VK_NULL_HANDLE;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If rasterization is not enabled, various CreateInfo structs must be
|
/* If rasterization is not enabled, various CreateInfo structs must be
|
||||||
* ignored.
|
* ignored.
|
||||||
*/
|
*/
|
||||||
|
@ -2780,7 +2735,9 @@ genX(graphics_pipeline_create)(
|
||||||
emit_3dstate_vf_statistics(pipeline);
|
emit_3dstate_vf_statistics(pipeline);
|
||||||
|
|
||||||
emit_3dstate_streamout(pipeline, pCreateInfo->pRasterizationState);
|
emit_3dstate_streamout(pipeline, pCreateInfo->pRasterizationState);
|
||||||
|
|
||||||
#if GFX_VERx10 >= 125
|
#if GFX_VERx10 >= 125
|
||||||
|
const struct anv_device *device = pipeline->base.device;
|
||||||
/* Disable Mesh. */
|
/* Disable Mesh. */
|
||||||
if (device->physical->vk.supported_extensions.NV_mesh_shader) {
|
if (device->physical->vk.supported_extensions.NV_mesh_shader) {
|
||||||
anv_batch_emit(&pipeline->base.batch, GENX(3DSTATE_MESH_CONTROL), zero);
|
anv_batch_emit(&pipeline->base.batch, GENX(3DSTATE_MESH_CONTROL), zero);
|
||||||
|
@ -2810,10 +2767,6 @@ genX(graphics_pipeline_create)(
|
||||||
#if GFX_VER >= 8
|
#if GFX_VER >= 8
|
||||||
emit_3dstate_ps_extra(pipeline, pCreateInfo->pRasterizationState, rsd_info);
|
emit_3dstate_ps_extra(pipeline, pCreateInfo->pRasterizationState, rsd_info);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
*pPipeline = anv_pipeline_to_handle(&pipeline->base);
|
|
||||||
|
|
||||||
return pipeline->base.batch.status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if GFX_VERx10 >= 125
|
#if GFX_VERx10 >= 125
|
||||||
|
@ -2989,45 +2942,6 @@ compute_pipeline_create(
|
||||||
return pipeline->base.batch.status;
|
return pipeline->base.batch.status;
|
||||||
}
|
}
|
||||||
|
|
||||||
VkResult genX(CreateGraphicsPipelines)(
|
|
||||||
VkDevice _device,
|
|
||||||
VkPipelineCache pipelineCache,
|
|
||||||
uint32_t count,
|
|
||||||
const VkGraphicsPipelineCreateInfo* pCreateInfos,
|
|
||||||
const VkAllocationCallbacks* pAllocator,
|
|
||||||
VkPipeline* pPipelines)
|
|
||||||
{
|
|
||||||
VK_FROM_HANDLE(vk_pipeline_cache, pipeline_cache, pipelineCache);
|
|
||||||
|
|
||||||
VkResult result = VK_SUCCESS;
|
|
||||||
|
|
||||||
unsigned i;
|
|
||||||
for (i = 0; i < count; i++) {
|
|
||||||
VkResult res = genX(graphics_pipeline_create)(_device,
|
|
||||||
pipeline_cache,
|
|
||||||
&pCreateInfos[i],
|
|
||||||
pAllocator, &pPipelines[i]);
|
|
||||||
|
|
||||||
if (res == VK_SUCCESS)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* Bail out on the first error != VK_PIPELINE_COMPILE_REQUIRED_EX as it
|
|
||||||
* is not obvious what error should be report upon 2 different failures.
|
|
||||||
* */
|
|
||||||
result = res;
|
|
||||||
if (res != VK_PIPELINE_COMPILE_REQUIRED)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (pCreateInfos[i].flags & VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (; i < count; i++)
|
|
||||||
pPipelines[i] = VK_NULL_HANDLE;
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
VkResult genX(CreateComputePipelines)(
|
VkResult genX(CreateComputePipelines)(
|
||||||
VkDevice _device,
|
VkDevice _device,
|
||||||
VkPipelineCache pipelineCache,
|
VkPipelineCache pipelineCache,
|
||||||
|
|
Loading…
Reference in New Issue