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;

}

}

相关推荐
Lisonseekpan1 分钟前
为什么要避免使用 `SELECT *`?
java·数据库·后端·sql·mysql·oracle
一只小透明啊啊啊啊5 分钟前
Java的中间件
java·开发语言·中间件
Wilson Chen7 分钟前
深入理解 MySQL 事务与锁机制:从 ACID 到 Next-Key Lock 的实证之旅
java·数据库·mysql
好玩的Matlab(NCEPU)12 分钟前
如何编写 Chrome 插件(Chrome Extension)
前端·chrome
Yan-英杰17 分钟前
Deepseek大模型结合Chrome搜索爬取2025AI投资趋势数据
前端·chrome
学编程就要猛20 分钟前
数据结构初阶:Java中的ArrayList
java·开发语言·数据结构
JH307322 分钟前
10分钟理解泛型的通配符(extends, super, ?)
java·开发语言·windows
Crystal32828 分钟前
app里video层级最高导致全屏视频上的操作的东西显示不出来的问题
前端·vue.js
weixin_4454766830 分钟前
Vue+redis全局添加水印解决方案
前端·vue.js·redis
lecepin31 分钟前
AI Coding 资讯 2025-10-29
前端·后端·面试