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 {
17 switch (m_level)
18 {
20 m_allocateInfo.level = vk::CommandBufferLevel::ePrimary;
21 break;
23 m_allocateInfo.level = vk::CommandBufferLevel::eSecondary;
24 break;
25 }
26 m_allocateInfo.commandPool = m_pool->pool();
27 m_allocateInfo.commandBufferCount = 1;
28 m_commandBuffer = m_pool->context()->device().allocateCommandBuffers(m_allocateInfo)[0];
29
30 }
31
33 {
34 m_commandBuffer.nextSubpass(vk::SubpassContents::eInline);
35 }
36
38 {
39 vk::Rect2D scissor{};
40 scissor.offset.x = static_cast<int32_t>(lt.x);
41 scissor.offset.y = static_cast<int32_t>(lt.y);
42 scissor.extent.width = static_cast<uint32_t>(rb.x - lt.x);
43 scissor.extent.height = static_cast<uint32_t>(rb.y - lt.y);
44 m_commandBuffer.setScissor(0,1, &scissor);
45 }
46
48 {
49 switch (pipeline->getType())
50 {
52 {
53 auto vkPipeline = static_cast<VK_TraditionalPipeline*>(pipeline);
54 m_commandBuffer.bindPipeline(vk::PipelineBindPoint::eGraphics,vkPipeline->pipeline());
55 }
56 break;
57 }
58 }
59
60
62 {
63 vk::SubmitInfo submitInfo{};
64 submitInfo.setCommandBuffers(m_commandBuffer);
65 std::vector<vk::Semaphore> waitSemaphores;
66 std::vector<vk::PipelineStageFlags> waitStages;
67 for (auto& desc : m_waitSemaphores)
68 {
69 waitSemaphores.push_back(static_cast<VK_Semaphore*>(desc.semaphore)->semaphore());
70 waitStages.push_back(ToVkPipelineStageFlags(desc.stages));
71 }
72 submitInfo.setWaitSemaphores(waitSemaphores);
73 submitInfo.setWaitDstStageMask(waitStages);
74 std::vector<vk::Semaphore> signalSemaphores;
75 for (auto& signalSemaphore : m_signalSemaphores)
76 {
77 signalSemaphores.push_back(static_cast<VK_Semaphore*>(signalSemaphore)->semaphore());
78 }
79 submitInfo.setSignalSemaphores(signalSemaphores);
80
81 m_pool->context()->getGraphicsQueue().submit(submitInfo,
82 static_cast<VK_Fence*>(m_fence)->fence());
83 }
84
86 PipelineStages srcStage, PipelineStages dstStage, AccessFlags srcAccess, AccessFlags dstAccess,
87 ImageAspects aspectMask)
88 {
89 RHI::Image* fctImage = image->currentImage();
90 auto vkImage = static_cast<VK_Image*>(fctImage);
91 auto imageVk = vkImage->image();
92 auto newLayoutVk = ToVkImageLayout(newLayout);
93 auto oldLayoutVk = ToVkImageLayout(oldLayout);
94 vk::ImageMemoryBarrier barrier{};
95 barrier.srcQueueFamilyIndex = vk::QueueFamilyIgnored;
96 barrier.dstQueueFamilyIndex = vk::QueueFamilyIgnored;
97 barrier.image = imageVk;
98 barrier.oldLayout = oldLayoutVk;
99 barrier.newLayout = newLayoutVk;
100 barrier.srcAccessMask = ToVkAccessFlags(srcAccess);
101 barrier.dstAccessMask = ToVkAccessFlags(dstAccess);
102 barrier.subresourceRange.aspectMask = ToVkImageAspects(aspectMask);
103 barrier.subresourceRange.baseMipLevel = 0;
104 barrier.subresourceRange.levelCount = 1;
105 barrier.subresourceRange.baseArrayLayer = 0;
106 barrier.subresourceRange.layerCount = 1;
107 vk::PipelineStageFlags srcStageMask = ToVkPipelineStageFlags(srcStage);
108 vk::PipelineStageFlags dstStageMask = ToVkPipelineStageFlags(dstStage);
109 std::vector<vk::ImageMemoryBarrier> barriers{barrier};
110 m_commandBuffer.pipelineBarrier(srcStageMask, dstStageMask, vk::DependencyFlags(),
111 0, nullptr, 0, nullptr, 1, barriers.data());
112 }
113 }
114}
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:10
float y
定义 Vec.h:10