lavapipe: use ralloc for pipeline copies.

We have to store every struct that is in the pipeline for processing
later, use ralloc to make freeing this mess easier.

Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7978>
This commit is contained in:
Dave Airlie
2020-12-08 08:31:58 +10:00
parent 04c7fce799
commit a2cf059023
2 changed files with 46 additions and 64 deletions

View File

@@ -99,42 +99,14 @@ void lvp_DestroyPipeline(
if (pipeline->shader_cso[PIPE_SHADER_COMPUTE]) if (pipeline->shader_cso[PIPE_SHADER_COMPUTE])
device->queue.ctx->delete_compute_state(device->queue.ctx, pipeline->shader_cso[PIPE_SHADER_COMPUTE]); device->queue.ctx->delete_compute_state(device->queue.ctx, pipeline->shader_cso[PIPE_SHADER_COMPUTE]);
if (!pipeline->is_compute_pipeline) { ralloc_free(pipeline->mem_ctx);
for (unsigned i = 0; i < pipeline->graphics_create_info.stageCount; i++)
if (pipeline->graphics_create_info.pStages[i].pSpecializationInfo)
free((void *)pipeline->graphics_create_info.pStages[i].pSpecializationInfo);
free((void *)pipeline->graphics_create_info.pStages);
free((void *)pipeline->graphics_create_info.pVertexInputState->pVertexBindingDescriptions);
free((void *)pipeline->graphics_create_info.pVertexInputState->pVertexAttributeDescriptions);
free((void *)pipeline->graphics_create_info.pVertexInputState);
free((void *)pipeline->graphics_create_info.pInputAssemblyState);
if (pipeline->graphics_create_info.pViewportState) {
free((void *)pipeline->graphics_create_info.pViewportState->pViewports);
free((void *)pipeline->graphics_create_info.pViewportState->pScissors);
}
free((void *)pipeline->graphics_create_info.pViewportState);
if (pipeline->graphics_create_info.pTessellationState)
free((void *)pipeline->graphics_create_info.pTessellationState);
free((void *)pipeline->graphics_create_info.pRasterizationState);
free((void *)pipeline->graphics_create_info.pMultisampleState);
free((void *)pipeline->graphics_create_info.pDepthStencilState);
if (pipeline->graphics_create_info.pColorBlendState)
free((void *)pipeline->graphics_create_info.pColorBlendState->pAttachments);
free((void *)pipeline->graphics_create_info.pColorBlendState);
if (pipeline->graphics_create_info.pDynamicState)
free((void *)pipeline->graphics_create_info.pDynamicState->pDynamicStates);
free((void *)pipeline->graphics_create_info.pDynamicState);
} else
if (pipeline->compute_create_info.stage.pSpecializationInfo)
free((void *)pipeline->compute_create_info.stage.pSpecializationInfo);
vk_object_base_finish(&pipeline->base); vk_object_base_finish(&pipeline->base);
vk_free2(&device->vk.alloc, pAllocator, pipeline); vk_free2(&device->vk.alloc, pAllocator, pipeline);
} }
static VkResult static VkResult
deep_copy_shader_stage(struct VkPipelineShaderStageCreateInfo *dst, deep_copy_shader_stage(void *mem_ctx,
struct VkPipelineShaderStageCreateInfo *dst,
const struct VkPipelineShaderStageCreateInfo *src) const struct VkPipelineShaderStageCreateInfo *src)
{ {
dst->sType = src->sType; dst->sType = src->sType;
@@ -146,9 +118,9 @@ deep_copy_shader_stage(struct VkPipelineShaderStageCreateInfo *dst,
dst->pSpecializationInfo = NULL; dst->pSpecializationInfo = NULL;
if (src->pSpecializationInfo) { if (src->pSpecializationInfo) {
const VkSpecializationInfo *src_spec = src->pSpecializationInfo; const VkSpecializationInfo *src_spec = src->pSpecializationInfo;
VkSpecializationInfo *dst_spec = malloc(sizeof(VkSpecializationInfo) + VkSpecializationInfo *dst_spec = ralloc_size(mem_ctx, sizeof(VkSpecializationInfo) +
src_spec->mapEntryCount * sizeof(VkSpecializationMapEntry) + src_spec->mapEntryCount * sizeof(VkSpecializationMapEntry) +
src_spec->dataSize); src_spec->dataSize);
VkSpecializationMapEntry *maps = (VkSpecializationMapEntry *)(dst_spec + 1); VkSpecializationMapEntry *maps = (VkSpecializationMapEntry *)(dst_spec + 1);
dst_spec->pMapEntries = maps; dst_spec->pMapEntries = maps;
void *pdata = (void *)(dst_spec->pMapEntries + src_spec->mapEntryCount); void *pdata = (void *)(dst_spec->pMapEntries + src_spec->mapEntryCount);
@@ -165,7 +137,8 @@ deep_copy_shader_stage(struct VkPipelineShaderStageCreateInfo *dst,
} }
static VkResult static VkResult
deep_copy_vertex_input_state(struct VkPipelineVertexInputStateCreateInfo *dst, deep_copy_vertex_input_state(void *mem_ctx,
struct VkPipelineVertexInputStateCreateInfo *dst,
const struct VkPipelineVertexInputStateCreateInfo *src) const struct VkPipelineVertexInputStateCreateInfo *src)
{ {
int i; int i;
@@ -176,7 +149,7 @@ deep_copy_vertex_input_state(struct VkPipelineVertexInputStateCreateInfo *dst,
dst->flags = src->flags; dst->flags = src->flags;
dst->vertexBindingDescriptionCount = src->vertexBindingDescriptionCount; dst->vertexBindingDescriptionCount = src->vertexBindingDescriptionCount;
dst_binding_descriptions = malloc(src->vertexBindingDescriptionCount * sizeof(VkVertexInputBindingDescription)); dst_binding_descriptions = ralloc_array(mem_ctx, VkVertexInputBindingDescription, src->vertexBindingDescriptionCount);
if (!dst_binding_descriptions) if (!dst_binding_descriptions)
return VK_ERROR_OUT_OF_HOST_MEMORY; return VK_ERROR_OUT_OF_HOST_MEMORY;
for (i = 0; i < dst->vertexBindingDescriptionCount; i++) { for (i = 0; i < dst->vertexBindingDescriptionCount; i++) {
@@ -186,7 +159,7 @@ deep_copy_vertex_input_state(struct VkPipelineVertexInputStateCreateInfo *dst,
dst->vertexAttributeDescriptionCount = src->vertexAttributeDescriptionCount; dst->vertexAttributeDescriptionCount = src->vertexAttributeDescriptionCount;
dst_attrib_descriptions = malloc(src->vertexAttributeDescriptionCount * sizeof(VkVertexInputAttributeDescription)); dst_attrib_descriptions = ralloc_array(mem_ctx, VkVertexInputAttributeDescription, src->vertexAttributeDescriptionCount);
if (!dst_attrib_descriptions) if (!dst_attrib_descriptions)
return VK_ERROR_OUT_OF_HOST_MEMORY; return VK_ERROR_OUT_OF_HOST_MEMORY;
@@ -198,7 +171,8 @@ deep_copy_vertex_input_state(struct VkPipelineVertexInputStateCreateInfo *dst,
} }
static VkResult static VkResult
deep_copy_viewport_state(VkPipelineViewportStateCreateInfo *dst, deep_copy_viewport_state(void *mem_ctx,
VkPipelineViewportStateCreateInfo *dst,
const VkPipelineViewportStateCreateInfo *src) const VkPipelineViewportStateCreateInfo *src)
{ {
int i; int i;
@@ -210,7 +184,7 @@ deep_copy_viewport_state(VkPipelineViewportStateCreateInfo *dst,
dst->flags = src->flags; dst->flags = src->flags;
if (src->pViewports) { if (src->pViewports) {
viewports = malloc(src->viewportCount * sizeof(VkViewport)); viewports = ralloc_array(mem_ctx, VkViewport, src->viewportCount);
for (i = 0; i < src->viewportCount; i++) for (i = 0; i < src->viewportCount; i++)
memcpy(&viewports[i], &src->pViewports[i], sizeof(VkViewport)); memcpy(&viewports[i], &src->pViewports[i], sizeof(VkViewport));
dst->pViewports = viewports; dst->pViewports = viewports;
@@ -219,7 +193,7 @@ deep_copy_viewport_state(VkPipelineViewportStateCreateInfo *dst,
dst->viewportCount = src->viewportCount; dst->viewportCount = src->viewportCount;
if (src->pScissors) { if (src->pScissors) {
scissors = malloc(src->scissorCount * sizeof(VkRect2D)); scissors = ralloc_array(mem_ctx, VkRect2D, src->scissorCount);
for (i = 0; i < src->scissorCount; i++) for (i = 0; i < src->scissorCount; i++)
memcpy(&scissors[i], &src->pScissors[i], sizeof(VkRect2D)); memcpy(&scissors[i], &src->pScissors[i], sizeof(VkRect2D));
dst->pScissors = scissors; dst->pScissors = scissors;
@@ -231,7 +205,8 @@ deep_copy_viewport_state(VkPipelineViewportStateCreateInfo *dst,
} }
static VkResult static VkResult
deep_copy_color_blend_state(VkPipelineColorBlendStateCreateInfo *dst, deep_copy_color_blend_state(void *mem_ctx,
VkPipelineColorBlendStateCreateInfo *dst,
const VkPipelineColorBlendStateCreateInfo *src) const VkPipelineColorBlendStateCreateInfo *src)
{ {
VkPipelineColorBlendAttachmentState *attachments; VkPipelineColorBlendAttachmentState *attachments;
@@ -241,7 +216,7 @@ deep_copy_color_blend_state(VkPipelineColorBlendStateCreateInfo *dst,
dst->logicOpEnable = src->logicOpEnable; dst->logicOpEnable = src->logicOpEnable;
dst->logicOp = src->logicOp; dst->logicOp = src->logicOp;
attachments = malloc(src->attachmentCount * sizeof(VkPipelineColorBlendAttachmentState)); attachments = ralloc_array(mem_ctx, VkPipelineColorBlendAttachmentState, src->attachmentCount);
memcpy(attachments, src->pAttachments, src->attachmentCount * sizeof(VkPipelineColorBlendAttachmentState)); memcpy(attachments, src->pAttachments, src->attachmentCount * sizeof(VkPipelineColorBlendAttachmentState));
dst->attachmentCount = src->attachmentCount; dst->attachmentCount = src->attachmentCount;
dst->pAttachments = attachments; dst->pAttachments = attachments;
@@ -252,7 +227,8 @@ deep_copy_color_blend_state(VkPipelineColorBlendStateCreateInfo *dst,
} }
static VkResult static VkResult
deep_copy_dynamic_state(VkPipelineDynamicStateCreateInfo *dst, deep_copy_dynamic_state(void *mem_ctx,
VkPipelineDynamicStateCreateInfo *dst,
const VkPipelineDynamicStateCreateInfo *src) const VkPipelineDynamicStateCreateInfo *src)
{ {
VkDynamicState *dynamic_states; VkDynamicState *dynamic_states;
@@ -260,7 +236,7 @@ deep_copy_dynamic_state(VkPipelineDynamicStateCreateInfo *dst,
dst->pNext = src->pNext; dst->pNext = src->pNext;
dst->flags = src->flags; dst->flags = src->flags;
dynamic_states = malloc(src->dynamicStateCount * sizeof(VkDynamicState)); dynamic_states = ralloc_array(mem_ctx, VkDynamicState, src->dynamicStateCount);
if (!dynamic_states) if (!dynamic_states)
return VK_ERROR_OUT_OF_HOST_MEMORY; return VK_ERROR_OUT_OF_HOST_MEMORY;
@@ -271,7 +247,8 @@ deep_copy_dynamic_state(VkPipelineDynamicStateCreateInfo *dst,
} }
static VkResult static VkResult
deep_copy_graphics_create_info(VkGraphicsPipelineCreateInfo *dst, deep_copy_graphics_create_info(void *mem_ctx,
VkGraphicsPipelineCreateInfo *dst,
const VkGraphicsPipelineCreateInfo *src) const VkGraphicsPipelineCreateInfo *src)
{ {
int i; int i;
@@ -292,24 +269,24 @@ deep_copy_graphics_create_info(VkGraphicsPipelineCreateInfo *dst,
/* pStages */ /* pStages */
dst->stageCount = src->stageCount; dst->stageCount = src->stageCount;
stages = malloc(dst->stageCount * sizeof(VkPipelineShaderStageCreateInfo)); stages = ralloc_array(mem_ctx, VkPipelineShaderStageCreateInfo, dst->stageCount);
for (i = 0 ; i < dst->stageCount; i++) { for (i = 0 ; i < dst->stageCount; i++) {
result = deep_copy_shader_stage(&stages[i], &src->pStages[i]); result = deep_copy_shader_stage(mem_ctx, &stages[i], &src->pStages[i]);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
return result; return result;
} }
dst->pStages = stages; dst->pStages = stages;
/* pVertexInputState */ /* pVertexInputState */
vertex_input = malloc(sizeof(VkPipelineVertexInputStateCreateInfo)); vertex_input = ralloc(mem_ctx, VkPipelineVertexInputStateCreateInfo);
result = deep_copy_vertex_input_state(vertex_input, result = deep_copy_vertex_input_state(mem_ctx, vertex_input,
src->pVertexInputState); src->pVertexInputState);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
return result; return result;
dst->pVertexInputState = vertex_input; dst->pVertexInputState = vertex_input;
/* pInputAssemblyState */ /* pInputAssemblyState */
input_assembly = malloc(sizeof(VkPipelineInputAssemblyStateCreateInfo)); input_assembly = ralloc(mem_ctx, VkPipelineInputAssemblyStateCreateInfo);
if (!input_assembly) if (!input_assembly)
return VK_ERROR_OUT_OF_HOST_MEMORY; return VK_ERROR_OUT_OF_HOST_MEMORY;
memcpy(input_assembly, src->pInputAssemblyState, sizeof(VkPipelineInputAssemblyStateCreateInfo)); memcpy(input_assembly, src->pInputAssemblyState, sizeof(VkPipelineInputAssemblyStateCreateInfo));
@@ -318,7 +295,7 @@ deep_copy_graphics_create_info(VkGraphicsPipelineCreateInfo *dst,
/* pTessellationState */ /* pTessellationState */
if (src->pTessellationState) { if (src->pTessellationState) {
VkPipelineTessellationStateCreateInfo *tess_state; VkPipelineTessellationStateCreateInfo *tess_state;
tess_state = malloc(sizeof(VkPipelineTessellationStateCreateInfo)); tess_state = ralloc(mem_ctx, VkPipelineTessellationStateCreateInfo);
if (!tess_state) if (!tess_state)
return VK_ERROR_OUT_OF_HOST_MEMORY; return VK_ERROR_OUT_OF_HOST_MEMORY;
memcpy(tess_state, src->pTessellationState, sizeof(VkPipelineTessellationStateCreateInfo)); memcpy(tess_state, src->pTessellationState, sizeof(VkPipelineTessellationStateCreateInfo));
@@ -329,16 +306,16 @@ deep_copy_graphics_create_info(VkGraphicsPipelineCreateInfo *dst,
/* pViewportState */ /* pViewportState */
if (src->pViewportState) { if (src->pViewportState) {
VkPipelineViewportStateCreateInfo *viewport_state; VkPipelineViewportStateCreateInfo *viewport_state;
viewport_state = malloc(sizeof(VkPipelineViewportStateCreateInfo)); viewport_state = ralloc(mem_ctx, VkPipelineViewportStateCreateInfo);
if (!viewport_state) if (!viewport_state)
return VK_ERROR_OUT_OF_HOST_MEMORY; return VK_ERROR_OUT_OF_HOST_MEMORY;
deep_copy_viewport_state(viewport_state, src->pViewportState); deep_copy_viewport_state(mem_ctx, viewport_state, src->pViewportState);
dst->pViewportState = viewport_state; dst->pViewportState = viewport_state;
} else } else
dst->pViewportState = NULL; dst->pViewportState = NULL;
/* pRasterizationState */ /* pRasterizationState */
raster_state = malloc(sizeof(VkPipelineRasterizationStateCreateInfo)); raster_state = ralloc(mem_ctx, VkPipelineRasterizationStateCreateInfo);
if (!raster_state) if (!raster_state)
return VK_ERROR_OUT_OF_HOST_MEMORY; return VK_ERROR_OUT_OF_HOST_MEMORY;
memcpy(raster_state, src->pRasterizationState, sizeof(VkPipelineRasterizationStateCreateInfo)); memcpy(raster_state, src->pRasterizationState, sizeof(VkPipelineRasterizationStateCreateInfo));
@@ -347,7 +324,7 @@ deep_copy_graphics_create_info(VkGraphicsPipelineCreateInfo *dst,
/* pMultisampleState */ /* pMultisampleState */
if (src->pMultisampleState) { if (src->pMultisampleState) {
VkPipelineMultisampleStateCreateInfo* ms_state; VkPipelineMultisampleStateCreateInfo* ms_state;
ms_state = malloc(sizeof(VkPipelineMultisampleStateCreateInfo) + sizeof(VkSampleMask)); ms_state = ralloc_size(mem_ctx, sizeof(VkPipelineMultisampleStateCreateInfo) + sizeof(VkSampleMask));
if (!ms_state) if (!ms_state)
return VK_ERROR_OUT_OF_HOST_MEMORY; return VK_ERROR_OUT_OF_HOST_MEMORY;
/* does samplemask need deep copy? */ /* does samplemask need deep copy? */
@@ -365,7 +342,7 @@ deep_copy_graphics_create_info(VkGraphicsPipelineCreateInfo *dst,
if (src->pDepthStencilState) { if (src->pDepthStencilState) {
VkPipelineDepthStencilStateCreateInfo* ds_state; VkPipelineDepthStencilStateCreateInfo* ds_state;
ds_state = malloc(sizeof(VkPipelineDepthStencilStateCreateInfo)); ds_state = ralloc(mem_ctx, VkPipelineDepthStencilStateCreateInfo);
if (!ds_state) if (!ds_state)
return VK_ERROR_OUT_OF_HOST_MEMORY; return VK_ERROR_OUT_OF_HOST_MEMORY;
memcpy(ds_state, src->pDepthStencilState, sizeof(VkPipelineDepthStencilStateCreateInfo)); memcpy(ds_state, src->pDepthStencilState, sizeof(VkPipelineDepthStencilStateCreateInfo));
@@ -377,10 +354,10 @@ deep_copy_graphics_create_info(VkGraphicsPipelineCreateInfo *dst,
if (src->pColorBlendState) { if (src->pColorBlendState) {
VkPipelineColorBlendStateCreateInfo* cb_state; VkPipelineColorBlendStateCreateInfo* cb_state;
cb_state = malloc(sizeof(VkPipelineColorBlendStateCreateInfo)); cb_state = ralloc(mem_ctx, VkPipelineColorBlendStateCreateInfo);
if (!cb_state) if (!cb_state)
return VK_ERROR_OUT_OF_HOST_MEMORY; return VK_ERROR_OUT_OF_HOST_MEMORY;
deep_copy_color_blend_state(cb_state, src->pColorBlendState); deep_copy_color_blend_state(mem_ctx, cb_state, src->pColorBlendState);
dst->pColorBlendState = cb_state; dst->pColorBlendState = cb_state;
} else } else
dst->pColorBlendState = NULL; dst->pColorBlendState = NULL;
@@ -389,10 +366,10 @@ deep_copy_graphics_create_info(VkGraphicsPipelineCreateInfo *dst,
VkPipelineDynamicStateCreateInfo* dyn_state; VkPipelineDynamicStateCreateInfo* dyn_state;
/* pDynamicState */ /* pDynamicState */
dyn_state = malloc(sizeof(VkPipelineDynamicStateCreateInfo)); dyn_state = ralloc(mem_ctx, VkPipelineDynamicStateCreateInfo);
if (!dyn_state) if (!dyn_state)
return VK_ERROR_OUT_OF_HOST_MEMORY; return VK_ERROR_OUT_OF_HOST_MEMORY;
deep_copy_dynamic_state(dyn_state, src->pDynamicState); deep_copy_dynamic_state(mem_ctx, dyn_state, src->pDynamicState);
dst->pDynamicState = dyn_state; dst->pDynamicState = dyn_state;
} else } else
dst->pDynamicState = NULL; dst->pDynamicState = NULL;
@@ -401,7 +378,8 @@ deep_copy_graphics_create_info(VkGraphicsPipelineCreateInfo *dst,
} }
static VkResult static VkResult
deep_copy_compute_create_info(VkComputePipelineCreateInfo *dst, deep_copy_compute_create_info(void *mem_ctx,
VkComputePipelineCreateInfo *dst,
const VkComputePipelineCreateInfo *src) const VkComputePipelineCreateInfo *src)
{ {
VkResult result; VkResult result;
@@ -412,7 +390,7 @@ deep_copy_compute_create_info(VkComputePipelineCreateInfo *dst,
dst->basePipelineHandle = src->basePipelineHandle; dst->basePipelineHandle = src->basePipelineHandle;
dst->basePipelineIndex = src->basePipelineIndex; dst->basePipelineIndex = src->basePipelineIndex;
result = deep_copy_shader_stage(&dst->stage, &src->stage); result = deep_copy_shader_stage(mem_ctx, &dst->stage, &src->stage);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
return result; return result;
return VK_SUCCESS; return VK_SUCCESS;
@@ -754,8 +732,9 @@ lvp_graphics_pipeline_init(struct lvp_pipeline *pipeline,
pipeline->layout = lvp_pipeline_layout_from_handle(pCreateInfo->layout); pipeline->layout = lvp_pipeline_layout_from_handle(pCreateInfo->layout);
pipeline->force_min_sample = false; pipeline->force_min_sample = false;
pipeline->mem_ctx = ralloc_context(NULL);
/* recreate createinfo */ /* recreate createinfo */
deep_copy_graphics_create_info(&pipeline->graphics_create_info, pCreateInfo); deep_copy_graphics_create_info(pipeline->mem_ctx, &pipeline->graphics_create_info, pCreateInfo);
pipeline->is_compute_pipeline = false; pipeline->is_compute_pipeline = false;
for (uint32_t i = 0; i < pCreateInfo->stageCount; i++) { for (uint32_t i = 0; i < pCreateInfo->stageCount; i++) {
@@ -878,7 +857,9 @@ lvp_compute_pipeline_init(struct lvp_pipeline *pipeline,
pipeline->layout = lvp_pipeline_layout_from_handle(pCreateInfo->layout); pipeline->layout = lvp_pipeline_layout_from_handle(pCreateInfo->layout);
pipeline->force_min_sample = false; pipeline->force_min_sample = false;
deep_copy_compute_create_info(&pipeline->compute_create_info, pCreateInfo); pipeline->mem_ctx = ralloc_context(NULL);
deep_copy_compute_create_info(pipeline->mem_ctx,
&pipeline->compute_create_info, pCreateInfo);
pipeline->is_compute_pipeline = true; pipeline->is_compute_pipeline = true;
lvp_shader_compile_to_ir(pipeline, module, lvp_shader_compile_to_ir(pipeline, module,

View File

@@ -509,6 +509,7 @@ struct lvp_pipeline {
struct lvp_device * device; struct lvp_device * device;
struct lvp_pipeline_layout * layout; struct lvp_pipeline_layout * layout;
void *mem_ctx;
bool is_compute_pipeline; bool is_compute_pipeline;
bool force_min_sample; bool force_min_sample;
nir_shader *pipeline_nir[MESA_SHADER_STAGES]; nir_shader *pipeline_nir[MESA_SHADER_STAGES];