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;

}

}

相关推荐
毕设源码-朱学姐14 小时前
【开题答辩全过程】以 工厂能耗分析平台的设计与实现为例,包含答辩的问题和答案
java·vue.js
Spring AI学习15 小时前
Spring AI深度解析(9/50):可观测性与监控体系实战
java·人工智能·spring
天天扭码16 小时前
如何实现流式输出?一篇文章手把手教你!
前端·aigc·ai编程
前端 贾公子16 小时前
vue移动端适配方案 === postcss-px-to-viewport
前端·javascript·html
java1234_小锋16 小时前
Spring IoC的实现机制是什么?
java·后端·spring
xqqxqxxq17 小时前
背单词软件技术笔记(V2.0扩展版)
java·笔记·python
GISer_Jing17 小时前
AI营销增长:4大核心能力+前端落地指南
前端·javascript·人工智能
消失的旧时光-194317 小时前
深入理解 Java 线程池(二):ThreadPoolExecutor 执行流程 + 运行状态 + ctl 原理全解析
java·开发语言
哈哈老师啊17 小时前
Springboot学生综合测评系统hxtne(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·数据库·spring boot