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

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

1.vulkan_fence.h

#pragma once

#include "vulkan_types.inl"

void vulkan_fence_create(

    vulkan_context* context,

    b8 create_signaled,

    vulkan_fence* out_fence

);


 

void vulkan_fence_destroy(vulkan_context* context,vulkan_fence* fence);


 

b8 vulkan_fence_wait(vulkan_context* context,vulkan_fence* fence,u64 timeout_ns);

void vulkan_fence_reset(vulkan_context* context, vulkan_fence* fence);

2.vulkan_fence.c

#include "vulkan_fence.h"


 

#include "core/logger.h"


 

void vulkan_fence_create(

    vulkan_context* context,

    b8 create_signaled,

    vulkan_fence* out_fence

){


 

    //Make sure to signal the fence if required

    out_fence->is_signaled = create_signaled;

    VkFenceCreateInfo fence_create_info = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO};

    if(out_fence->is_signaled)

    {

        fence_create_info.flags = VK_FENCE_CREATE_SIGNALED_BIT;

    }

    VK_CHECK(vkCreateFence(

        context->device.logical_device,

        &fence_create_info,

        context->allocator,

        &out_fence->handle

    ));

}


 

void vulkan_fence_destroy(vulkan_context* context,vulkan_fence* fence)

{

    if(fence->handle)

    {

        vkDestroyFence(

            context->device.logical_device,

            fence->handle,

            context->allocator

        );

        fence->handle = 0;



 

    }

    fence->is_signaled = false;

}


 

b8 vulkan_fence_wait(vulkan_context* context,vulkan_fence* fence,u64 timeout_ns)

{

    if(!fence->is_signaled)

    {

        VkResult result = vkWaitForFences(

            context->device.logical_device,

            1,

            &fence->handle,

            true,

            timeout_ns

        );

        switch(result)

        {

        case VK_SUCCESS:

            /* code */

            fence->is_signaled = true;

            return true;

            break;

        case VK_TIMEOUT:

            KWARN("vk_fence_wait - Timed out");

            break;

        case VK_ERROR_DEVICE_LOST:

            KERROR("vk_fence_wait - VK_ERROR_DEVICE_LOST.");

            break;

        case VK_ERROR_OUT_OF_HOST_MEMORY:

            KERROR("vk_fence_wait - VK_ERROR_OUT_OF_HOST_MEMORY");

            break;

        case VK_ERROR_OUT_OF_DEVICE_MEMORY:

            KERROR("vk_fence_wait - An unKnown error has occurred.");

            break;

   

       

        default:

            KERROR("vk_fence_wait - An unknown error has occurred.");

            break;

        }









 

    }else{

        return true;


 

    }


 

    return false;

}

void vulkan_fence_reset(vulkan_context* context, vulkan_fence* fence)

{

    if(fence->is_signaled)

    {

        VK_CHECK(vkResetFences(context->device.logical_device,1,&fence->handle));

        fence->is_signaled = false;



 

    }




 

}


网站公告

今日签到

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