FCT
载入中...
搜索中...
未找到
VK_DepthStencilView.cpp
浏览该文件的文档.
1//
2// Created by Administrator on 2025/4/16.
3//
4
5#include "../FCTAPI.h"
6
7namespace FCT
8{
9 namespace RHI
10 {
15
17 {
18 if (m_view) {
19 m_ctx->getDevice().destroyImageView(m_view);
20 m_view = nullptr;
21 }
22 }
23
25 {
26 if (!m_image) {
27 ferr << "Cannot create depth stencil view: no image set" << std::endl;
28 return false;
29 }
30
31 VK_Image* vkImage = dynamic_cast<VK_Image*>(m_image);
32 if (!vkImage) {
33 ferr << "Cannot create depth stencil view: image is not a VK_Image" << std::endl;
34 return false;
35 }
36
37 vk::ImageViewType viewType = vk::ImageViewType::e2D;
38 vk::ImageAspectFlags aspectMask = vk::ImageAspectFlagBits::eDepth;
39
40 Format format = m_image->format();
41 vk::Format vkFormat = ToVkFormat(format);
42
43 if (vkFormat == vk::Format::eD24UnormS8Uint ||
44 vkFormat == vk::Format::eD32SfloatS8Uint ||
45 vkFormat == vk::Format::eD16UnormS8Uint) {
46 aspectMask |= vk::ImageAspectFlagBits::eStencil;
47 }
48
49 vk::ImageViewCreateInfo viewInfo;
50 viewInfo.setImage(vkImage->getVkImage());
51 if (viewInfo.image == nullptr)
52 {
53 m_view = nullptr;
54 return false;
55 }
56 viewInfo.setViewType(viewType);
57 viewInfo.setFormat(vkFormat);
58
59 viewInfo.components.r = vk::ComponentSwizzle::eIdentity;
60 viewInfo.components.g = vk::ComponentSwizzle::eIdentity;
61 viewInfo.components.b = vk::ComponentSwizzle::eIdentity;
62 viewInfo.components.a = vk::ComponentSwizzle::eIdentity;
63
64 viewInfo.subresourceRange.aspectMask = aspectMask;
65 viewInfo.subresourceRange.baseMipLevel = 0;
66 viewInfo.subresourceRange.levelCount = 1;
67 viewInfo.subresourceRange.baseArrayLayer = 0;
68 viewInfo.subresourceRange.layerCount = 1;
69
70 try {
71 m_view = m_ctx->getDevice().createImageView(viewInfo);
72 }
73 catch (const std::exception& e) {
74 ferr << "Failed to create depth stencil view: " << e.what() << std::endl;
75 m_view = nullptr;
76 return false;
77 }
78 return true;
79 }
80 }
81}
std::ostream & ferr
vk::Format ToVkFormat(Format format)