vulkan游戏引擎vulkan部分的frame_buffer实现

发布于:2025-05-27 ⋅ 阅读:(17) ⋅ 点赞:(0)

1.vulkan_framebuffer.h

#pragma once

#include "vulkan_types.inl"


 

void vulkan_framebuffer_create(

    vulkan_context* context,

    vulkan_renderpass* renderpass,

    u32 width,

    u32 height,

    u32 attachment_count,

    VkImageView* attachments,

    vulkan_framebuffer* out_framebuffer

);

void vulkan_framebuffer_destroy(vulkan_context* context,vulkan_framebuffer* framebuffer);

2.vulkan_framebuffer.c

#include "vulkan_framebuffer.h"

#include "core/kmemory.h"


 

void vulkan_framebuffer_create(

    vulkan_context* context,

    vulkan_renderpass* renderpass,

    u32 width,

    u32 height,

    u32 attachment_count,

    VkImageView* attachments,

    vulkan_framebuffer* out_framebuffer

)

{

    //Take a copy of the attachments,renderpass and attachment count

    out_framebuffer->attachments = kallocate(sizeof(VkImageView)* attachment_count,MEMORY_TAG_RENDERER);

    for(u32 i = 0;i<attachment_count;++i)

    {

        out_framebuffer->attachments[i] = attachments[i];


 

    }

    out_framebuffer->renderpass = renderpass;

    out_framebuffer->attachment_count = attachment_count;


 

    //Creation info

    VkFramebufferCreateInfo framebuffer_create_info = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO};

    framebuffer_create_info.renderPass = renderpass->handle;

    framebuffer_create_info.attachmentCount = attachment_count;

    framebuffer_create_info.pAttachments  = out_framebuffer->attachments;

    framebuffer_create_info.width = width;

    framebuffer_create_info.height = height;

    framebuffer_create_info.layers = 1;


 

    VK_CHECK(vkCreateFramebuffer(

        context->device.logical_device,

        &framebuffer_create_info,

        context->allocator,

        &out_framebuffer->handle));

}

void vulkan_framebuffer_destroy(vulkan_context* context,vulkan_framebuffer* framebuffer)

{

    vkDestroyFramebuffer(context->device.logical_device,framebuffer->handle,context->allocator);

    if(framebuffer->attachments)

    {

        kfree(framebuffer->attachments,sizeof(VkImageView) * framebuffer->attachment_count,MEMORY_TAG_RENDERER);

        framebuffer->attachments = 0;



 

    }

    framebuffer->handle = 0;

    framebuffer->attachment_count = 0;

    framebuffer->renderpass= 0;





 

}



 


网站公告

今日签到

点亮在社区的每一天
去签到