FCT
载入中...
搜索中...
未找到
VK_CommandBuffer.cpp
浏览该文件的文档.
1//
2// Created by Administrator on 2025/3/31.
3//
4
5#include "../FCTAPI.h"
6namespace FCT
7{
8 namespace RHI
9 {
14
16 {
18 {
19 m_pool->context()->device().freeCommandBuffers(m_pool->pool(), 1, &m_commandBuffer);
20 }
21 }
22
24 {
25 switch (m_level)
26 {
28 m_allocateInfo.level = vk::CommandBufferLevel::ePrimary;
29 break;
31 m_allocateInfo.level = vk::CommandBufferLevel::eSecondary;
32 break;
33 }
34 m_allocateInfo.commandPool = m_pool->pool();
35 m_allocateInfo.commandBufferCount = 1;
36 m_commandBuffer = m_pool->context()->device().allocateCommandBuffers(m_allocateInfo)[0];
37
38 }
39
41 {
42 m_commandBuffer.nextSubpass(vk::SubpassContents::eInline);
43 }
44
46 {
47 vk::Rect2D scissor{};
48 scissor.offset.x = static_cast<int32_t>(lt.x);
49 scissor.offset.y = static_cast<int32_t>(lt.y);
50 scissor.extent.width = static_cast<uint32_t>(rb.x - lt.x);
51 scissor.extent.height = static_cast<uint32_t>(rb.y - lt.y);
52 m_commandBuffer.setScissor(0,1, &scissor);
53 }
54
56 {
57 switch (pipeline->getType())
58 {
60 {
61 auto vkPipeline = static_cast<VK_TraditionalPipeline*>(pipeline);
62 m_commandBuffer.bindPipeline(vk::PipelineBindPoint::eGraphics,vkPipeline->pipeline());
63 }
64 break;
65 }
66 }
67
68
70 {
71 vk::SubmitInfo submitInfo{};
72 submitInfo.setCommandBuffers(m_commandBuffer);
73 std::vector<vk::Semaphore> waitSemaphores;
74 std::vector<vk::PipelineStageFlags> waitStages;
75 for (auto& desc : m_waitSemaphores)
76 {
77 waitSemaphores.push_back(static_cast<VK_Semaphore*>(desc.semaphore)->semaphore());
78 waitStages.push_back(ToVkPipelineStageFlags(desc.stages));
79 }
80 submitInfo.setWaitSemaphores(waitSemaphores);
81 submitInfo.setWaitDstStageMask(waitStages);
82 std::vector<vk::Semaphore> signalSemaphores;
83 for (auto& signalSemaphore : m_signalSemaphores)
84 {
85 signalSemaphores.push_back(static_cast<VK_Semaphore*>(signalSemaphore)->semaphore());
86 }
87 submitInfo.setSignalSemaphores(signalSemaphores);
88
89 m_pool->context()->getGraphicsQueue().submit(submitInfo,
90 static_cast<VK_Fence*>(m_fence)->fence());
91 }
92
94 PipelineStages srcStage, PipelineStages dstStage, AccessFlags srcAccess, AccessFlags dstAccess,
95 ImageAspects aspectMask)
96 {
97 RHI::Image* fctImage = image->currentImage();
98 auto vkImage = static_cast<VK_Image*>(fctImage);
99 auto imageVk = vkImage->image();
100 auto newLayoutVk = ToVkImageLayout(newLayout);
101 auto oldLayoutVk = ToVkImageLayout(oldLayout);
102 vk::ImageMemoryBarrier barrier{};
103 barrier.srcQueueFamilyIndex = vk::QueueFamilyIgnored;
104 barrier.dstQueueFamilyIndex = vk::QueueFamilyIgnored;
105 barrier.image = imageVk;
106 barrier.oldLayout = oldLayoutVk;
107 barrier.newLayout = newLayoutVk;
108 barrier.srcAccessMask = ToVkAccessFlags(srcAccess);
109 barrier.dstAccessMask = ToVkAccessFlags(dstAccess);
110 barrier.subresourceRange.aspectMask = ToVkImageAspects(aspectMask);
111 barrier.subresourceRange.baseMipLevel = 0;
112 barrier.subresourceRange.levelCount = 1;
113 barrier.subresourceRange.baseArrayLayer = 0;
114 barrier.subresourceRange.layerCount = 1;
115 vk::PipelineStageFlags srcStageMask = ToVkPipelineStageFlags(srcStage);
116 vk::PipelineStageFlags dstStageMask = ToVkPipelineStageFlags(dstStage);
117 std::vector<vk::ImageMemoryBarrier> barriers{barrier};
118 m_commandBuffer.pipelineBarrier(srcStageMask, dstStageMask, vk::DependencyFlags(),
119 0, nullptr, 0, nullptr, 1, barriers.data());
120 }
121 }
122}
virtual RHI::Image * currentImage()=0
std::vector< WaitSemaphoreDescription > & waitSemaphores()
std::vector< Semaphore * > & signalSemaphores()
std::vector< Semaphore * > m_signalSemaphores
std::vector< WaitSemaphoreDescription > m_waitSemaphores
virtual PipelineType getType() const =0
void barrier(FCT::Image *image, ImageLayout oldLayout, ImageLayout newLayout, PipelineStages srcStage, PipelineStages dstStage, AccessFlags srcAccess, AccessFlags dstAccess, ImageAspects aspectMask) override
void scissor(Vec2 lt, Vec2 rb) override
void bindPipieline(RasterizationPipeline *pipeline) override
VK_CommandBuffer(VK_CommandPool *pool)
vk::CommandBufferAllocateInfo m_allocateInfo
vk::Image image() const
@ Traditional
vk::PipelineStageFlags ToVkPipelineStageFlags(FCT::PipelineStages pipelineStages)
float x
定义 Vec.h:11
float y
定义 Vec.h:11