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 分钟前
Spring Cloud Stream EnableBinding注解详解:定义、应用场景与示例代码
java·spring boot·后端·spring
像素之间12 分钟前
为什么运行时要加set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve
前端·javascript·vue.js
无限进步_14 分钟前
【C++】验证回文字符串:高效算法详解与优化
java·开发语言·c++·git·算法·github·visual studio
M ? A15 分钟前
Vue转React实战:defineProps精准迁移实战
前端·javascript·vue.js·经验分享·react.js·开源·vureact
亚历克斯神15 分钟前
Spring Cloud 2026 架构演进
java·spring·微服务
七夜zippoe18 分钟前
Spring Cloud与Dubbo架构哲学对决
java·spring cloud·架构·dubbo·配置中心
海派程序猿19 分钟前
Spring Cloud Config拉取配置过慢导致服务启动延迟的优化技巧
java
西陵27 分钟前
别再写 Prompt 了Spec Mode 才是下一代 AI 编程范式
前端·人工智能·ai编程
如意猴29 分钟前
【前端】002--怎样制作一个简历界面?
开发语言·前端·javascript
阿维的博客日记29 分钟前
为什么不逃逸代表不需要锁,JIT会直接删掉锁
java