VkResult intel_cmd_begin(struct intel_cmd *cmd, const VkCommandBufferBeginInfo *info) { VkResult ret; uint32_t i; cmd_reset(cmd); /* TODOVV: Check that render pass is defined */ const VkCommandBufferInheritanceInfo *hinfo = info->pInheritanceInfo; if (!cmd->primary) { cmd_begin_render_pass(cmd, intel_render_pass(hinfo->renderPass), intel_fb(hinfo->framebuffer), hinfo->subpass, VK_SUBPASS_CONTENTS_INLINE); } if (cmd->flags != info->flags) { cmd->flags = info->flags; cmd->writers[INTEL_CMD_WRITER_BATCH].size = 0; } if (!cmd->writers[INTEL_CMD_WRITER_BATCH].size) { const uint32_t size = cmd->dev->gpu->max_batch_buffer_size / 2; cmd->writers[INTEL_CMD_WRITER_BATCH].size = size; cmd->writers[INTEL_CMD_WRITER_SURFACE].size = size / 2; cmd->writers[INTEL_CMD_WRITER_STATE].size = size / 2; cmd->writers[INTEL_CMD_WRITER_INSTRUCTION].size = 16384; } for (i = 0; i < INTEL_CMD_WRITER_COUNT; i++) { ret = cmd_writer_alloc_and_map(cmd, i); if (ret != VK_SUCCESS) { cmd_reset(cmd); return ret; } } cmd_batch_begin(cmd); return VK_SUCCESS; }
void bind_pipeline(const command_buffer &, command_recorder &recorder) const override final { const auto &fb_clearvalues = attached_framebuffer->get_fb_clearvalues(); assert(fb_layout.get_highest_index_of_attachment_with_load_op() <= fb_clearvalues.size()); const lib::vector<VkClearValue> clear_values(fb_clearvalues.begin(), fb_clearvalues.begin() + fb_layout.get_highest_index_of_attachment_with_load_op()); auto fb_extent = attached_framebuffer->extent(); recorder << cmd_begin_render_pass(*attached_framebuffer, device_renderpass.get(), { 0,0 }, fb_extent, clear_values); recorder << cmd_bind_pipeline(graphics_pipeline.get()); // Set dynamic viewport and scissor states recorder << cmd_set_viewport(rect(glm::vec2(fb_extent)), attached_framebuffer->get_depth_range()) << cmd_set_scissor(i32rect(glm::i32vec2(fb_extent))); }