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 }
23 }
24
26 {
27 vk::ImageCreateInfo imageInfo;
28 imageInfo.setImageType(vk::ImageType::e2D);
29 imageInfo.setFormat(ToVkFormat(m_format));
30 imageInfo.setExtent(vk::Extent3D(m_width, m_height, 1));
31 imageInfo.setMipLevels(1);
32 imageInfo.setArrayLayers(1);
33 imageInfo.setSamples(ToVkSampleCount(m_samples));
34 imageInfo.setTiling(vk::ImageTiling::eOptimal);
35 vk::ImageUsageFlags usageFlags;
37 {
38 usageFlags |= vk::ImageUsageFlagBits::eSampled | vk::ImageUsageFlagBits::eTransferDst;
39 }
41 {
42 usageFlags |= vk::ImageUsageFlagBits::eColorAttachment |
43 vk::ImageUsageFlagBits::eTransferSrc |
44 vk::ImageUsageFlagBits::eSampled;
45 }
47 {
48 usageFlags |= vk::ImageUsageFlagBits::eDepthStencilAttachment;
49 }
50 if (!(usageFlags & vk::ImageUsageFlagBits::eTransferDst)) {
51 usageFlags |= vk::ImageUsageFlagBits::eTransferDst;
52 }
53 imageInfo.setUsage(usageFlags);
54 imageInfo.setSharingMode(vk::SharingMode::eExclusive);
55 imageInfo.setInitialLayout(vk::ImageLayout::eUndefined);
56
57 try {
58 m_image = m_ctx->getDevice().createImage(imageInfo);
59
60 vk::MemoryRequirements memRequirements = m_ctx->getDevice().getImageMemoryRequirements(m_image);
61
62 vk::MemoryAllocateInfo allocInfo;
63 allocInfo.setAllocationSize(memRequirements.size);
64 allocInfo.setMemoryTypeIndex(m_ctx->findMemoryType(
65 memRequirements.memoryTypeBits,
66 vk::MemoryPropertyFlagBits::eDeviceLocal));
67
68 m_memory = m_ctx->getDevice().allocateMemory(allocInfo);
69
70 m_ctx->getDevice().bindImageMemory(m_image, m_memory, 0);
71
72 if (m_initData.data && m_initData.size > 0) {
74 }
75
76 m_owns = true;
77 }
78 catch (const std::exception& e) {
79 ferr << "Failed to create Vulkan image: " << e.what() << std::endl;
80 if (m_image) {
81 m_ctx->getDevice().destroyImage(m_image);
82 m_image = nullptr;
83 }
84
85 if (m_memory) {
86 m_ctx->getDevice().freeMemory(m_memory);
87 m_memory = nullptr;
88 }
89
90 m_owns = false;
91 }
92 }
93
95 {
96 if (m_initData.data && m_initData.size > 0) {
98 }
99 }
100
101
102 void VK_Image::updateData(const void* data, size_t dataSize)
103 {
104 if (!data || dataSize == 0) {
105 ferr << "Invalid data for image update" << std::endl;
106 return;
107 }
108
109 try {
110 vk::ImageAspectFlags aspectMask = vk::ImageAspectFlagBits::eColor;
111
113 aspectMask = vk::ImageAspectFlagBits::eDepth | vk::ImageAspectFlagBits::eStencil;
114 } else {
115 aspectMask = vk::ImageAspectFlagBits::eColor;
116 }
117
118 m_ctx->transferDataToImage(
119 m_image,
120 m_width,
121 m_height,
122 1,
124 1,
125 1,
126 aspectMask,
127 data,
128 dataSize
129 );
130 }
131 catch (const std::exception& e) {
132 ferr << "Failed to update image data: " << e.what() << std::endl;
133 }
134 }
135 void VK_Image::updateData(const void* data, size_t dataSize,Fence* fence,std::function<void()>* onCompletion)
136 {
137 if (!data || dataSize == 0) {
138 ferr << "Invalid data for image update" << std::endl;
139 return;
140 }
141
142 try {
143 vk::ImageAspectFlags aspectMask = vk::ImageAspectFlagBits::eColor;
144
146 aspectMask = vk::ImageAspectFlagBits::eDepth | vk::ImageAspectFlagBits::eStencil;
147 } else {
148 aspectMask = vk::ImageAspectFlagBits::eColor;
149 }
150
151 m_ctx->transferDataToImage(
152 m_image,
153 m_width,
154 m_height,
155 1,
157 1,
158 1,
159 aspectMask,
160 data,
161 dataSize,
162 static_cast<VK_Fence*>(fence)->fencePtr(),
163 onCompletion
164 );
165 }
166 catch (const std::exception& e) {
167 ferr << "Failed to update image data: " << e.what() << std::endl;
168 }
169 }
170 void VK_Image::create(vk::Image image)
171 {
172 m_image = image;
173 m_owns = false;
174 }
175
177 {
178 return m_image;
179 }
180 }
181}
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)