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

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;



 

    }




 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Magnum Lehar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值