Beispiel #1
0
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)));
	}