break;
}
std::string err_string;
- if (pCB->activeRenderPass->renderPass != pPipeline->graphicsPipelineCI.renderPass) {
+ if (pCB->activeRenderPass->renderPass != pPipeline->rp_state->renderPass) {
// renderPass that PSO was created with must be compatible with active renderPass that PSO is being used with
skip |= validateRenderPassCompatibility(dev_data, "active render pass", pCB->activeRenderPass, "pipeline state object",
- GetRenderPassState(dev_data, pPipeline->graphicsPipelineCI.renderPass), caller,
- rp_error);
+ pPipeline->rp_state.get(), caller, rp_error);
}
if (pPipeline->graphicsPipelineCI.subpass != pCB->activeSubpass) {
skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
HandleToUint64(pPipeline->pipeline), __LINE__, VALIDATION_ERROR_096005d4, "DS",
"vkCreateGraphicsPipelines(): Render pass (0x%" PRIxLEAST64
") subpass %u has colorAttachmentCount of %u which doesn't match the pColorBlendState->attachmentCount of %u. %s",
- HandleToUint64(pPipeline->graphicsPipelineCI.renderPass), pPipeline->graphicsPipelineCI.subpass,
+ HandleToUint64(pPipeline->rp_state->renderPass), pPipeline->graphicsPipelineCI.subpass,
subpass_desc->colorAttachmentCount, color_blend_state->attachmentCount,
validation_error_map[VALIDATION_ERROR_096005d4]);
}
for (i = 0; i < count; i++) {
pipe_state.push_back(std::unique_ptr<PIPELINE_STATE>(new PIPELINE_STATE));
- pipe_state[i]->initGraphicsPipeline(&pCreateInfos[i]);
+ pipe_state[i]->initGraphicsPipeline(&pCreateInfos[i], GetRenderPassStateSharedPtr(dev_data, pCreateInfos[i].renderPass));
pipe_state[i]->render_pass_ci.initialize(GetRenderPassState(dev_data, pCreateInfos[i].renderPass)->createInfo.ptr());
pipe_state[i]->pipeline_layout = *getPipelineLayout(dev_data, pCreateInfos[i].layout);
}
addCommandBufferBinding(&pipe_state->cb_bindings, {HandleToUint64(pipeline), kVulkanObjectTypePipeline}, cb_state);
if (VK_PIPELINE_BIND_POINT_GRAPHICS == pipelineBindPoint) {
// Add binding for child renderpass
- auto rp_state = GetRenderPassState(dev_data, pipe_state->graphicsPipelineCI.renderPass);
+ auto rp_state = GetRenderPassState(dev_data, pipe_state->rp_state->renderPass);
if (rp_state) {
addCommandBufferBinding(&rp_state->cb_bindings, {HandleToUint64(rp_state->renderPass), kVulkanObjectTypeRenderPass},
cb_state);
public:
VkPipeline pipeline;
safe_VkGraphicsPipelineCreateInfo graphicsPipelineCI;
+ // Hold shared ptr to RP in case RP itself is destroyed
+ std::shared_ptr<RENDER_PASS_STATE> rp_state;
safe_VkComputePipelineCreateInfo computePipelineCI;
// Flag of which shader stages are active for this pipeline
uint32_t active_shaders;
PIPELINE_STATE()
: pipeline{},
graphicsPipelineCI{},
+ rp_state(nullptr),
computePipelineCI{},
active_shaders(0),
duplicate_shaders(0),
render_pass_ci(),
pipeline_layout() {}
- void initGraphicsPipeline(const VkGraphicsPipelineCreateInfo *pCreateInfo) {
+ void initGraphicsPipeline(const VkGraphicsPipelineCreateInfo *pCreateInfo, std::shared_ptr<RENDER_PASS_STATE> &&rpstate) {
graphicsPipelineCI.initialize(pCreateInfo);
// Make sure compute pipeline is null
VkComputePipelineCreateInfo emptyComputeCI = {};
pCBCI->pAttachments + pCBCI->attachmentCount);
}
}
+ rp_state = rpstate;
}
void initComputePipeline(const VkComputePipelineCreateInfo *pCreateInfo) {