FCT
载入中...
搜索中...
未找到
VK_Image.cpp
浏览该文件的文档.
1//
2// Created by Administrator on 2025/3/27.
3//
4
5#include "VK_Image.h"
6#include "VK_Fence.h"
7#include "../ThirdParty.h"
9
10namespace FCT {
11 namespace RHI {
13 {
14 m_ctx = ctx;
15 m_owns = false;
16 }
17
19 {
20 if (m_owns) {
21 m_ctx->getDevice().destroyImage(m_image);
22 m_ctx->device().freeMemory(m_memory);
23 }
24 }
25
27 {
28 vk::ImageCreateInfo imageInfo;
29 imageInfo.setImageType(vk::ImageType::e2D);
30 imageInfo.setFormat(ToVkFormat(m_format));
31 imageInfo.setExtent(vk::Extent3D(m_width, m_height, 1));
32 imageInfo.setMipLevels(1);
33 imageInfo.setArrayLayers(1);
34 imageInfo.setSamples(ToVkSampleCount(m_samples));
35 imageInfo.setTiling(vk::ImageTiling::eOptimal);
36 vk::ImageUsageFlags usageFlags;
38 {
39 usageFlags |= vk::ImageUsageFlagBits::eSampled | vk::ImageUsageFlagBits::eTransferDst;
40 }
42 {
43 usageFlags |= vk::ImageUsageFlagBits::eColorAttachment |
44 vk::ImageUsageFlagBits::eTransferSrc |
45 vk::ImageUsageFlagBits::eSampled;
46 }
48 {
49 usageFlags |= vk::ImageUsageFlagBits::eDepthStencilAttachment;
50 }
51 if (!(usageFlags & vk::ImageUsageFlagBits::eTransferDst)) {
52 usageFlags |= vk::ImageUsageFlagBits::eTransferDst;
53 }
54 imageInfo.setUsage(usageFlags);
55 imageInfo.setSharingMode(vk::SharingMode::eExclusive);
56 imageInfo.setInitialLayout(vk::ImageLayout::eUndefined);
57
58 try {
59 m_image = m_ctx->getDevice().createImage(imageInfo);
60
61 vk::MemoryRequirements memRequirements = m_ctx->getDevice().getImageMemoryRequirements(m_image);
62
63 vk::MemoryAllocateInfo allocInfo;
64 allocInfo.setAllocationSize(memRequirements.size);
65 allocInfo.setMemoryTypeIndex(m_ctx->findMemoryType(
66 memRequirements.memoryTypeBits,
67 vk::MemoryPropertyFlagBits::eDeviceLocal));
68
69 m_memory = m_ctx->getDevice().allocateMemory(allocInfo);
70
71 m_ctx->getDevice().bindImageMemory(m_image, m_memory, 0);
72
73 if (m_initData.data && m_initData.size > 0) {
75 }
76
77 m_owns = true;
78 }
79 catch (const std::exception& e) {
80 ferr << "Failed to create Vulkan image: " << e.what() << std::endl;
81 if (m_image) {
82 m_ctx->getDevice().destroyImage(m_image);
83 m_image = nullptr;
84 }
85
86 if (m_memory) {
87 m_ctx->getDevice().freeMemory(m_memory);
88 m_memory = nullptr;
89 }
90
91 m_owns = false;
92 }
93 }
94
96 {
97 if (m_initData.data && m_initData.size > 0) {
99 }
100 }
101
102
103 void VK_Image::updateData(const void* data, size_t dataSize)
104 {
105 if (!data || dataSize == 0) {
106 ferr << "Invalid data for image update" << std::endl;
107 return;
108 }
109
110 try {
111 vk::ImageAspectFlags aspectMask = vk::ImageAspectFlagBits::eColor;
112
114 aspectMask = vk::ImageAspectFlagBits::eDepth | vk::ImageAspectFlagBits::eStencil;
115 } else {
116 aspectMask = vk::ImageAspectFlagBits::eColor;
117 }
118
119 m_ctx->transferDataToImage(
120 m_image,
121 m_width,
122 m_height,
123 1,
125 1,
126 1,
127 aspectMask,
128 data,
129 dataSize
130 );
131 }
132 catch (const std::exception& e) {
133 ferr << "Failed to update image data: " << e.what() << std::endl;
134 }
135 }
136 void VK_Image::updateData(const void* data, size_t dataSize,Fence* fence,std::function<void()>* onCompletion)
137 {
138 if (!data || dataSize == 0) {
139 ferr << "Invalid data for image update" << std::endl;
140 return;
141 }
142
143 try {
144 vk::ImageAspectFlags aspectMask = vk::ImageAspectFlagBits::eColor;
145
147 aspectMask = vk::ImageAspectFlagBits::eDepth | vk::ImageAspectFlagBits::eStencil;
148 } else {
149 aspectMask = vk::ImageAspectFlagBits::eColor;
150 }
151
152 m_ctx->transferDataToImage(
153 m_image,
154 m_width,
155 m_height,
156 1,
158 1,
159 1,
160 aspectMask,
161 data,
162 dataSize,
163 static_cast<VK_Fence*>(fence)->fencePtr(),
164 onCompletion
165 );
166 }
167 catch (const std::exception& e) {
168 ferr << "Failed to update image data: " << e.what() << std::endl;
169 }
170 }
171 void VK_Image::create(vk::Image image)
172 {
173 m_image = image;
174 m_owns = false;
175 }
176
178 {
179 return m_image;
180 }
181 }
182}
ImageInitData m_initData
定义 Image.h:79
uint32_t m_height
定义 Image.h:77
ImageUsages m_usage
定义 Image.h:78
uint32_t m_width
定义 Image.h:76
Samples m_samples
定义 Image.h:75
vk::DeviceMemory m_memory
VK_Image(VK_Context *ctx)
vk::Image image() const
void create() override
void updateData(const void *data, size_t dataSize)
std::ostream & ferr
vk::SampleCountFlagBits ToVkSampleCount(Samples samples)
vk::Format ToVkFormat(Format format)