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;

}

}

相关推荐
知行EDI10 小时前
知行之桥 MaBang 端口使用指南——Create Order 订单创建篇
java·服务器·数据库
笑鸿的学习笔记10 小时前
C++笔记之大块顺序写
java·c++·笔记
打工仔折腾 AI10 小时前
从 Demo 到生产级 Agent:8 个关键设计机制与 Python 实现拆解
java·jvm·人工智能·后端·python·langchain·ai agent 实战
前端snow10 小时前
ai agent --- 文件存储
前端
Frag0ut10 小时前
Chrome四大版本获取及共存指南:Stable/Beta/Dev/Canary
前端·chrome·浏览器·dev·beta·canary·共存版
殷色玫瑰11 小时前
C/C++ 内存管理详解:从内存分布到 new/delete 底层原理
java·linux·c语言·c++
IT_陈寒12 小时前
SpringBoot自动配置坑了我一把,原来是这样绕过去的
前端·人工智能·后端
广州华水科技12 小时前
单北斗GNSS变形监测在大坝安全监测中的应用与优势
前端
zeng不错12 小时前
B站 173 个投稿活动看到眼瞎?我写了个扩展,主打一个精准打击
前端
Latchh12 小时前
前端导出的JPEG红字发糊,质量要拉到100才清楚
前端·图像处理·人工智能·计算机视觉