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;

}

}

相关推荐
Dcs6 分钟前
IDEA 2025.2又整大活!AI 助手脱胎换骨,Spring 调试一秒看透,连 Java 25 和虚拟线程都安排上了!
java
jingling5559 分钟前
Git 常用命令指南:从入门到高效开发
前端·javascript·git·前端框架
索西引擎11 分钟前
【前端】网站favicon图标制作
前端
程序员海军17 分钟前
告别低质量Prompt!:字节跳动PromptPilot深度测评
前端·后端·aigc
华洛19 分钟前
关于可以控制大模型提升任意产品的排名这件事📈
前端·github·产品经理
Yanc20 分钟前
翻了vue源码 终于解决了这个在SFC中使用tsx的bug
前端·vue.js
nujnewnehc24 分钟前
失业落伍前端, 尝试了一个月 ai 协助编程的真实感受
前端·ai编程·github copilot
大熊学员26 分钟前
HTML 媒体元素概述
前端·html·媒体
好好好明天会更好29 分钟前
那些关于$event在vue中不得不说的事
前端·vue.js
Boilermaker199236 分钟前
【Java EE】Spring AOP
java·java-ee