VulkanRaytracingCycles 0.0.0
Cycles Render Engine With VulkanRaytracingShaderModules. ( Experiment , in progress)
ImagesVk Struct Reference

#include <ImagesVk.h>

Public Member Functions

 ImagesVk (VkCommandPool cmdPool)
 
 ImagesVk ()
 
 ~ImagesVk ()
 
void dealloc ()
 
template<class T >
bool getImage (T &iach, MIVSIvk &_)
 
template<class T >
MIVSIvkcreateFromRaw (ImmidiateCmd< T > &cmder, std::string Name, void *src, uint32_t w, uint32_t h, VkImageLayout dstlayout=VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL)
 
bool create2D (MIVSIvk &_, VkFormat format, VkImageUsageFlags flag=VK_IMAGE_USAGE_TRANSFER_DST_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT|VK_IMAGE_USAGE_SAMPLED_BIT, VkMemoryPropertyFlags properties=VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)
 
bool createCubeMap (MIVSIvk &_, VkFormat format)
 
bool create2DArray (MIVSIvk &_, VkFormat format)
 
template<class Mem >
bool create2DStorageArray (Mem &_, VkFormat format)
 
template<class T >
bool createCubeMapFromKtx (ImmidiateCmd< T > &cmder, Iache &iach)
 
template<class T >
bool createFromKtx (ImmidiateCmd< T > &cmder, std::string key, Iache &iach)
 
template<class T >
bool createFromFile (ImmidiateCmd< T > &cmder, std::string key, Iache &iach)
 
template<class T >
bool createFromFiles (ImmidiateCmd< T > &cmder, std::vector< std::string > keys, Iache &iach)
 
template<class T >
bool createFromFileStorage (ImmidiateCmd< T > &cmder, std::string key, Iache &iach)
 
VkPipelineShaderStageCreateInfo loadShader (std::string fileName, VkShaderStageFlagBits stage, PvSvk &p)
 
template<class T >
bool Canvas2D (MIVvk &Color, MIVvk &Depth, T *cvs)
 
template<class T >
bool $Delete (T *hach)
 
template<class T >
bool $DeleteMIVSI (T *hach)
 

Protected Attributes

VkCommandPool cmdPool
 

Detailed Description

Definition at line 652 of file ImagesVk.h.

Constructor & Destructor Documentation

◆ ImagesVk() [1/2]

ImagesVk::ImagesVk ( VkCommandPool  cmdPool)

Definition at line 54 of file ImagesVk.cpp.

55 : cmdPool(cmdPool) {};
VkCommandPool cmdPool
Definition: ImagesVk.h:656

◆ ImagesVk() [2/2]

ImagesVk::ImagesVk ( )

Definition at line 57 of file ImagesVk.cpp.

57 {
58
59};

◆ ~ImagesVk()

ImagesVk::~ImagesVk ( )

Definition at line 63 of file ImagesVk.cpp.

63{ dealloc(); }
void dealloc()
Definition: ImagesVk.cpp:65

Member Function Documentation

◆ $Delete()

template<class T >
bool ImagesVk::$Delete ( T *  hach)
inline

Definition at line 1186 of file ImagesVk.h.

1186 {
1187 MIVvk _;
1188 if (Mem(MIVvk,SIZE_MIV).$get(_, hach)) {
1189 Mem(MIVvk,SIZE_MIV).$delete$(hach);
1190 return true;
1191 }
1192 return true;
1193 };
#define SIZE_MIV
Definition: ImagesVk.h:18
#define Mem(vk, sz)
Definition: incomplete.h:329

◆ $DeleteMIVSI()

template<class T >
bool ImagesVk::$DeleteMIVSI ( T *  hach)
inline

Definition at line 1196 of file ImagesVk.h.

1196 {
1197 MIVSIvk _;
1198 if (Mem(MIVSIvk, SIZE_MIVSI).$get(_, hach)) {
1199 Mem(MIVSIvk, SIZE_MIVSI).$delete$(hach);
1200 return true;
1201 }
1202 return true;
1203 };
#define SIZE_MIVSI
Definition: ImagesVk.h:17

◆ Canvas2D()

template<class T >
bool ImagesVk::Canvas2D ( MIVvk Color,
MIVvk Depth,
T *  cvs 
)
inline

VK_IMAGE_VIEW_TYPE_2D_ARRAY;

Definition at line 1020 of file ImagesVk.h.

1020 {
1021
1022 const uint32_t multiviewLayerCount = 1;
1023
1024 {
1025 bool gen = true;
1026
1027 if (Mem(MIVvk,SIZE_MIV).$get(Color, &cvs->iachCol.hach)) {
1028 if (cvs->w != Color.w || cvs->h != Color.h) {
1029 Mem(MIVvk,SIZE_MIV).$delete$(&cvs->iachCol.hach);
1030 }
1031 else gen = false;
1032 };
1033
1034 if (gen) {
1035
1036 if (cvs->w == 0 || cvs->h == 0) {
1037 log_bad("Create Canvas2D::Size InValid. %u %u \n", cvs->w, cvs->h);
1038 return false;
1039 };
1040
1041
1042 Color.w = cvs->w;
1043 Color.h = cvs->h;
1044 Color.l = 1;
1045 VkImageCreateInfo imageCI = vka::plysm::imageCreateInfo();
1046 imageCI.imageType = VK_IMAGE_TYPE_2D;
1047 imageCI.format = $format.COLORFORMAT;
1048 imageCI.extent = { Color.w,Color.h, 1 };
1049 imageCI.mipLevels = 1;
1050 imageCI.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1051 imageCI.arrayLayers = multiviewLayerCount;
1052 imageCI.samples = VK_SAMPLE_COUNT_1_BIT; // (VkSampleCountFlagBits)MSAASampleCount; ///VK_SAMPLE_COUNT_1_BIT;
1053 imageCI.tiling = VK_IMAGE_TILING_OPTIMAL;
1054 imageCI.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1055 imageCI.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; //
1056 VK_CHECK_RESULT(vkCreateImage($device, &imageCI, nullptr, &Color.image));
1057 Color.Info.imageLayout = imageCI.initialLayout;
1058
1059
1060
1061 VkMemoryRequirements memReqs;
1062
1063 vkGetImageMemoryRequirements($device, Color.image, &memReqs);
1064 Color.size = memReqs.size;
1065
1066 VkMemoryAllocateInfo memoryAllocInfo = vka::plysm::memoryAllocateInfo();
1067 memoryAllocInfo.allocationSize = memReqs.size;
1068 memoryAllocInfo.memoryTypeIndex = vka::shelve::getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
1069 VK_CHECK_RESULT(vkAllocateMemory($device, &memoryAllocInfo, nullptr, &Color.memory));
1070 VK_CHECK_RESULT(vkBindImageMemory($device, Color.image, Color.memory, 0));
1071
1072
1073
1074 VkImageViewCreateInfo imageViewCI = vka::plysm::imageViewCreateInfo();
1075 imageViewCI.viewType = VK_IMAGE_VIEW_TYPE_2D;
1076 imageViewCI.format = $format.COLORFORMAT;
1077 imageViewCI.flags = 0;
1078 imageViewCI.components.r = VK_COMPONENT_SWIZZLE_R;
1079 imageViewCI.components.g = VK_COMPONENT_SWIZZLE_G;
1080 imageViewCI.components.b = VK_COMPONENT_SWIZZLE_B;
1081 imageViewCI.components.a = VK_COMPONENT_SWIZZLE_A;
1082 imageViewCI.subresourceRange = {};
1083 imageViewCI.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1084 imageViewCI.subresourceRange.baseMipLevel = 0;
1085 imageViewCI.subresourceRange.levelCount = 1;
1086 imageViewCI.subresourceRange.baseArrayLayer = 0;
1087 imageViewCI.subresourceRange.layerCount = multiviewLayerCount;
1088 imageViewCI.image = Color.image;
1089 VK_CHECK_RESULT(vkCreateImageView($device, &imageViewCI, nullptr, &Color.view));
1090
1091
1092
1093 Mem(MIVvk,SIZE_MIV).$set$(std::move(Color), &cvs->iachCol.hach);
1094
1095 log_img("Create Canvas2D:: %u %u %x %x \n", cvs->w, cvs->h, Color.image, cvs->iachCol.hach.hash);
1096
1097 cvs->iachCol.refCnt++;
1098 cvs->iachCol.vkI = Color.view;
1099
1100 }
1101
1102
1103 log_img("get Canvas2D:: %u %u %x %x \n", cvs->w, cvs->h, Color.image, cvs->iachCol.hach.hash);
1104 }
1105
1106 {
1107 bool gen = true;
1108 if (Mem(MIVvk,SIZE_MIV).$get(Depth, &cvs->iachDep.hach)) {
1109 if (cvs->w != Depth.w || cvs->h != Depth.h) {
1110 Mem(MIVvk,SIZE_MIV).$delete$(&cvs->iachDep.hach);
1111 }
1112 else {
1113 gen = false;
1114 }
1115 }
1116
1117 if (gen) {
1118
1119 if (cvs->w == 0 || cvs->h == 0) {
1120 log_bad("Create Canvas2D::Size InValid. %u %u \n", cvs->w, cvs->h);
1121 return false;
1122 };
1123
1124
1125 Depth.w = cvs->w;
1126 Depth.h = cvs->h;
1127 Depth.l = 1;
1128 VkImageCreateInfo imageCI = vka::plysm::imageCreateInfo();
1129 imageCI.imageType = VK_IMAGE_TYPE_2D;
1130 imageCI.format = $format.DEPTHFORMAT;
1131 imageCI.extent = { Depth.w, Depth.h, 1 };
1132 imageCI.mipLevels = 1;
1133 imageCI.arrayLayers = multiviewLayerCount;
1134 imageCI.samples = VK_SAMPLE_COUNT_1_BIT;
1135 imageCI.tiling = VK_IMAGE_TILING_OPTIMAL;
1136 imageCI.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
1137 imageCI.flags = 0;
1138 VK_CHECK_RESULT(vkCreateImage($device, &imageCI, nullptr, &Depth.image));
1139
1140 VkMemoryRequirements memReqs;
1141 vkGetImageMemoryRequirements($device, Depth.image, &memReqs);
1142 Depth.size = memReqs.size;
1143
1144 VkMemoryAllocateInfo memAllocInfo{};
1145 memAllocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1146 memAllocInfo.allocationSize = 0;
1147 memAllocInfo.memoryTypeIndex = 0;
1148
1149 VkImageViewCreateInfo depthStencilView = {};
1150 depthStencilView.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
1151 depthStencilView.pNext = NULL;
1152 depthStencilView.viewType = VK_IMAGE_VIEW_TYPE_2D;
1153 depthStencilView.format = $format.DEPTHFORMAT;
1154 depthStencilView.flags = 0;
1155 depthStencilView.subresourceRange = {};
1156 depthStencilView.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
1157 depthStencilView.subresourceRange.baseMipLevel = 0;
1158 depthStencilView.subresourceRange.levelCount = 1;
1159 depthStencilView.subresourceRange.baseArrayLayer = 0;
1160 depthStencilView.subresourceRange.layerCount = multiviewLayerCount;
1161 depthStencilView.image = Depth.image;
1162
1163 memAllocInfo.allocationSize = memReqs.size;
1164 memAllocInfo.memoryTypeIndex = vka::shelve::getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
1165 VK_CHECK_RESULT(vkAllocateMemory($device, &memAllocInfo, nullptr, &Depth.memory));
1166 VK_CHECK_RESULT(vkBindImageMemory($device, Depth.image, Depth.memory, 0));
1167 VK_CHECK_RESULT(vkCreateImageView($device, &depthStencilView, nullptr, &Depth.view));
1168
1169
1170 Mem(MIVvk,SIZE_MIV).$set$(std::move(Depth), &cvs->iachDep.hach);
1171
1172 cvs->iachDep.refCnt++;
1173 cvs->iachDep.vkI = Depth.view;
1174
1175 }
1176
1177
1178 }
1179
1180 return true;
1181
1182 };
#define log_img(...)
Definition: ImagesVk.h:14
#define log_bad(...)
Definition: log.hpp:37
VkImage image
VkImageView view
uint32_t w
uint32_t l
VkDescriptorImageInfo Info
uint32_t h
VkDeviceMemory memory
size_t size

◆ create2D()

bool ImagesVk::create2D ( MIVSIvk _,
VkFormat  format,
VkImageUsageFlags  flag = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_SAMPLED_BIT,
VkMemoryPropertyFlags  properties = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT 
)

VK_FORMAT_R8_UNORM;

Definition at line 74 of file ImagesVk.cpp.

75{
76
77 VkImageCreateInfo imageInfo{};
78 imageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
79 imageInfo.imageType = VK_IMAGE_TYPE_2D;
80 imageInfo.format = format;
81 imageInfo.extent.width = _.w;
82 imageInfo.extent.height = _.h;
83 imageInfo.extent.depth = 1;
84 imageInfo.mipLevels = 1;
85 imageInfo.arrayLayers = _.l;
86 imageInfo.samples = VK_SAMPLE_COUNT_1_BIT;
87
88 if (properties == 0x1) imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
89 else imageInfo.tiling = VK_IMAGE_TILING_LINEAR;
90
91 imageInfo.usage = flag;
92 imageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
93 imageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
94
95 VK_CHECK_RESULT(vkCreateImage($device, &imageInfo, nullptr, &_.image));
96
97 vkGetImageMemoryRequirements($device, _.image, &_.memReqs);
98
99 VkMemoryAllocateInfo allocInfo = vka::plysm::memoryAllocateInfo();
100 allocInfo.allocationSize = _.memReqs.size;
101 allocInfo.memoryTypeIndex = vka::shelve::getMemoryType(_.memReqs.memoryTypeBits, properties,nullptr);
102
103 VK_CHECK_RESULT(vkAllocateMemory($device, &allocInfo, nullptr, &_.memory));
104 VK_CHECK_RESULT(vkBindImageMemory($device, _.image, _.memory, 0));
105
106 log_img("create2D format %u w %u h %u size %zu \n", (UINT32)imageInfo.format, _.w, _.h, _.memReqs.size);
107
108 _.Info = {};
109 _.Info.imageLayout = VK_IMAGE_LAYOUT_UNDEFINED;
110
111 if (properties == 0x1) {
112
113
114 VkImageViewCreateInfo imageViewInfo = vka::plysm::imageViewCreateInfo();
115 imageViewInfo.image = _.image;
116 imageViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
117 imageViewInfo.format = imageInfo.format;
118 imageViewInfo.components = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A };
119 imageViewInfo.subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 };
120 VK_CHECK_RESULT(vkCreateImageView($device, &imageViewInfo, nullptr, &_.view));
121
122
123 VkSamplerCreateInfo samplerInfo = vka::plysm::samplerCreateInfo();
124 samplerInfo.magFilter = VK_FILTER_LINEAR;
125 samplerInfo.minFilter = VK_FILTER_LINEAR;
126 samplerInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
127 samplerInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;
128 samplerInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT;
129 samplerInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT;
130 samplerInfo.mipLodBias = 0.0f;
131 samplerInfo.compareOp = VK_COMPARE_OP_NEVER;
132 samplerInfo.minLod = 0.0f;
133 samplerInfo.maxLod = 1.0f;
134 samplerInfo.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
135 VK_CHECK_RESULT(vkCreateSampler($device, &samplerInfo, nullptr, &_.sampler));
136
137
138
139 _.Info.sampler = _.sampler;
140 _.Info.imageView = _.view;
141
142 }
143
144 return true;
145};
VkDescriptorImageInfo Info
VkDeviceMemory memory
uint32_t l
VkMemoryRequirements memReqs
uint32_t h
VkImageView view
VkImage image
uint32_t w
VkSampler sampler
#define properties
#define format

◆ create2DArray()

bool ImagesVk::create2DArray ( MIVSIvk _,
VkFormat  format 
)

Definition at line 147 of file ImagesVk.cpp.

147 {
148 // Create optimal tiled target image
149 VkImageCreateInfo imageCreateInfo = vka::plysm::imageCreateInfo();
150 imageCreateInfo.imageType = VK_IMAGE_TYPE_2D;
151 imageCreateInfo.format = format;
152 imageCreateInfo.mipLevels = 1;
153 imageCreateInfo.samples = VK_SAMPLE_COUNT_1_BIT;
154 imageCreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
155 imageCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
156 imageCreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
157 imageCreateInfo.extent = { _.w,_.h, 1 };
158 imageCreateInfo.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
159 imageCreateInfo.arrayLayers = _.l;
160
161 VK_CHECK_RESULT(vkCreateImage($device, &imageCreateInfo, nullptr, &_.image));
162
163 vkGetImageMemoryRequirements($device, _.image, &_.memReqs);
164
165 VkMemoryAllocateInfo allocInfo = vka::plysm::memoryAllocateInfo();
166 allocInfo.allocationSize = _.memReqs.size;
167 allocInfo.memoryTypeIndex = vka::shelve::getMemoryType(_.memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, nullptr);
168 log_img("Bridge Test ==>> NUMS == 0 generate memory Size %zu TypeBits %u TypeIndex %u \n", _.memReqs.size, (uint32_t)_.memReqs.memoryTypeBits, allocInfo.memoryTypeIndex);
169
170 VK_CHECK_RESULT(vkAllocateMemory($device, &allocInfo, nullptr, &_.memory));
171 VK_CHECK_RESULT(vkBindImageMemory($device, _.image, _.memory, 0));
172
173
174 VkSamplerCreateInfo sampler = vka::plysm::samplerCreateInfo();
175 sampler.magFilter = VK_FILTER_LINEAR;
176 sampler.minFilter = VK_FILTER_LINEAR;
177 sampler.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
178 sampler.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;// VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
179 sampler.addressModeV = sampler.addressModeU;
180 sampler.addressModeW = sampler.addressModeU;
181 sampler.mipLodBias = 0.0f;
182 sampler.maxAnisotropy = 8;
183 sampler.compareOp = VK_COMPARE_OP_NEVER;
184 sampler.minLod = 0.0f;
185 sampler.maxLod = 0.0f;
186 sampler.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
187 VK_CHECK_RESULT(vkCreateSampler($device, &sampler, nullptr, &_.sampler));
188
189
190 VkImageViewCreateInfo view = vka::plysm::imageViewCreateInfo();
191 view.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
192 view.format = format;
193 view.components = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A };
194 view.subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 };
195 view.subresourceRange.layerCount = _.l;
196 view.subresourceRange.levelCount = 1;
197 view.image = _.image;
198 VK_CHECK_RESULT(vkCreateImageView($device, &view, nullptr, &_.view));
199 _.Info = {};
200 _.Info.sampler = _.sampler;
201 _.Info.imageView = _.view;
202 _.Info.imageLayout = VK_IMAGE_LAYOUT_UNDEFINED;
203 return true;
204
205};

◆ create2DStorageArray()

template<class Mem >
bool ImagesVk::create2DStorageArray ( Mem _,
VkFormat  format 
)
inline

Definition at line 709 of file ImagesVk.h.

709 {
710
711
712 VkImageCreateInfo imageCreateInfo = vka::plysm::imageCreateInfo();
713 imageCreateInfo.imageType = VK_IMAGE_TYPE_2D;
714 imageCreateInfo.format = format;
715 imageCreateInfo.mipLevels = 1;
716 imageCreateInfo.samples = VK_SAMPLE_COUNT_1_BIT;
717 imageCreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
718 imageCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
719 imageCreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
720 imageCreateInfo.extent = { _.w,_.h, 1 };
721 imageCreateInfo.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
722 imageCreateInfo.arrayLayers = _.l;
723
724 VK_CHECK_RESULT(vkCreateImage($device, &imageCreateInfo, nullptr, &_.image));
725
726 vkGetImageMemoryRequirements($device, _.image, &_.memReqs);
727
728 VkMemoryAllocateInfo allocInfo = vka::plysm::memoryAllocateInfo();
729 allocInfo.allocationSize = _.memReqs.size;
730 allocInfo.memoryTypeIndex = vka::shelve::getMemoryType(_.memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, nullptr);
731 log_img("Bridge Test ==>> NUMS == 0 generate memory Size %zu TypeBits %u TypeIndex %u \n", _.memReqs.size, (uint32_t)_.memReqs.memoryTypeBits, allocInfo.memoryTypeIndex);
732
733 VK_CHECK_RESULT(vkAllocateMemory($device, &allocInfo, nullptr, &_.memory));
734 VK_CHECK_RESULT(vkBindImageMemory($device, _.image, _.memory, 0));
735
736
737
738
739 VkSamplerCreateInfo sampler = vka::plysm::samplerCreateInfo();
740 sampler.magFilter = VK_FILTER_LINEAR;
741 sampler.minFilter = VK_FILTER_LINEAR;
742 sampler.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
743 sampler.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
744 sampler.addressModeV = sampler.addressModeU;
745 sampler.addressModeW = sampler.addressModeU;
746 sampler.mipLodBias = 0.0f;
747 sampler.maxAnisotropy = 8;
748 sampler.compareOp = VK_COMPARE_OP_NEVER;
749 sampler.minLod = 0.0f;
750 sampler.maxLod = 0.0f;
751 sampler.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
752 VK_CHECK_RESULT(vkCreateSampler($device, &sampler, nullptr, &_.sampler));
753
754
755 VkImageViewCreateInfo view = vka::plysm::imageViewCreateInfo();
756 view.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
757 view.format = format;
758 view.components = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A };
759 view.subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 };
760 view.subresourceRange.layerCount = _.l;
761 view.subresourceRange.levelCount = 1;
762 view.image = _.image;
763 VK_CHECK_RESULT(vkCreateImageView($device, &view, nullptr, &_.view));
764
765 return true;
766 };

◆ createCubeMap()

bool ImagesVk::createCubeMap ( MIVSIvk _,
VkFormat  format 
)

VK_FORMAT_R8_UNORM;

Definition at line 207 of file ImagesVk.cpp.

207 {
208
209 VkImageCreateInfo imageInfo{};
210 imageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
211 imageInfo.imageType = VK_IMAGE_TYPE_2D;
212 imageInfo.format = format;
213 imageInfo.extent.width = _.w;
214 imageInfo.extent.height = _.h;
215 imageInfo.extent.depth = 1;
216 imageInfo.mipLevels = _.mipLevel;
217 imageInfo.arrayLayers = _.l;
218 imageInfo.samples = VK_SAMPLE_COUNT_1_BIT;
219 imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
220 imageInfo.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
221 imageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
222 imageInfo.flags = VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
223
224 VK_CHECK_RESULT(vkCreateImage($device, &imageInfo, nullptr, &_.image));
225
226 vkGetImageMemoryRequirements($device, _.image, &_.memReqs);
227
228
229 VkMemoryAllocateInfo allocInfo = vka::plysm::memoryAllocateInfo();
230 allocInfo.allocationSize = _.memReqs.size;
231 allocInfo.memoryTypeIndex = vka::shelve::getMemoryType(_.memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, nullptr);
232
233 VK_CHECK_RESULT(vkAllocateMemory($device, &allocInfo, nullptr, &_.memory));
234 VK_CHECK_RESULT(vkBindImageMemory($device, _.image, _.memory, 0));
235
236 log_img("createCubemap format %u w %u h %u size %zu \n", (UINT32)imageInfo.format, _.w, _.h, _.memReqs.size);
237
238 VkSamplerCreateInfo sampler = vka::plysm::samplerCreateInfo();
239 sampler.magFilter = VK_FILTER_LINEAR;
240 sampler.minFilter = VK_FILTER_LINEAR;
241 sampler.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
242 sampler.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
243 sampler.addressModeV = sampler.addressModeU;
244 sampler.addressModeW = sampler.addressModeU;
245 sampler.mipLodBias = 0.0f;
246 sampler.compareOp = VK_COMPARE_OP_NEVER;
247 sampler.minLod = 0.0f;
248 sampler.maxLod =float( _.mipLevel);
249 sampler.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
250 sampler.maxAnisotropy = 1.0f;
251
252 if ($features.samplerAnisotropy)
253 {
254 sampler.maxAnisotropy = $properties.limits.maxSamplerAnisotropy;
255 sampler.anisotropyEnable = VK_TRUE;
256 }
257 VK_CHECK_RESULT(vkCreateSampler($device, &sampler, nullptr, &_.sampler));
258
259
260
261 VkImageViewCreateInfo imageViewInfo = vka::plysm::imageViewCreateInfo();
262 imageViewInfo.image = _.image;
263 imageViewInfo.viewType = VK_IMAGE_VIEW_TYPE_CUBE;
264 imageViewInfo.format = imageInfo.format;
265 imageViewInfo.components = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A };
266 imageViewInfo.subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 };
267 imageViewInfo.subresourceRange.layerCount = _.l;
268 // Set number of mip levels
269 imageViewInfo.subresourceRange.levelCount = _.mipLevel;
270 VK_CHECK_RESULT(vkCreateImageView($device, &imageViewInfo, nullptr, &_.view));
271
272
273 _.Info = {};
274 _.Info.sampler = _.sampler;
275 _.Info.imageView = _.view;
276 _.Info.imageLayout = VK_IMAGE_LAYOUT_UNDEFINED;
277
278 return true;
279};
uint32_t mipLevel

◆ createCubeMapFromKtx()

template<class T >
bool ImagesVk::createCubeMapFromKtx ( ImmidiateCmd< T > &  cmder,
Iache iach 
)
inline

Definition at line 769 of file ImagesVk.h.

770 {
771 MIVSIvk miv;
772
773 if (!(Mem(MIVSIvk, SIZE_MIVSI).$get(miv, &iach.hach))) {
774 ktxResult result;
775 ktxTexture* ktxTexture;
776
777 iach.name = IMAGE_PATH + iach.name;
778 if (!vka::shelve::fileExists(iach.name)) {
779 log_bad("Could not load texture from %s \n\nThe file may be part of the additional asset pack.\n\nRun \"download_assets.py\" in the repository root to download the latest version.", iach.name.c_str());
780 }
781
782 result = ktxTexture_CreateFromNamedFile(iach.name.c_str(), KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT, &ktxTexture);
783
784 assert(result == KTX_SUCCESS);
785
786 // Get properties required for using and upload texture data from the ktx texture object
787 miv.w = ktxTexture->baseWidth;
788 miv.h = ktxTexture->baseHeight;
789 //ktxTexture->numLevels = 1;
790 miv.l = 6;
791 miv.mipLevel = ktxTexture->numLevels;
792 ktx_uint8_t* ktxTextureData = ktxTexture_GetData(ktxTexture);
793 ktx_size_t ktxTextureSize = ktxTexture_GetSize(ktxTexture);
794
795 miv.size = ktxTextureSize;
796 createCubeMap(miv, iach.format);
797
798
799 std::vector<VkBufferImageCopy> bufferCopyRegions;
800
801
802 for (uint32_t face = 0; face < 6; face++)
803 {
804 for (uint32_t level = 0; level < miv.mipLevel; level++)
805 {
806
807 ktx_size_t offset;
808 KTX_error_code ret = ktxTexture_GetImageOffset(ktxTexture, level, 0, face, &offset);
809 assert(ret == KTX_SUCCESS);
810 VkBufferImageCopy bufferCopyRegion = {};
811 bufferCopyRegion.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
812 bufferCopyRegion.imageSubresource.mipLevel = level;
813 bufferCopyRegion.imageSubresource.baseArrayLayer = face;
814 bufferCopyRegion.imageSubresource.layerCount = 1;
815 bufferCopyRegion.imageExtent.width = ktxTexture->baseWidth >> level;
816 bufferCopyRegion.imageExtent.height = ktxTexture->baseHeight >> level;
817 bufferCopyRegion.imageExtent.depth = 1;
818 bufferCopyRegion.bufferOffset = offset;
819 bufferCopyRegions.push_back(bufferCopyRegion);
820 }
821 }
822
823 miv.Info.imageLayout = VK_IMAGE_LAYOUT_UNDEFINED;
824 cmder.bridgeMap(miv, ktxTextureData, bufferCopyRegions, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
825
826 miv.Info.sampler = miv.sampler;
827 miv.Info.imageView = miv.view;
828
829 Mem(MIVSIvk, SIZE_MIVSI).$set$(std::move(miv), &iach.hach);
830 iach.refCnt++;
831
832 ktxTexture_Destroy(ktxTexture);
833 }
834 return true;
835 }
std::string name
Definition: incomplete.h:56
long refCnt
Definition: incomplete.h:52
VkFormat format
Definition: incomplete.h:48
Hache hach
Definition: incomplete.h:54
bool createCubeMap(MIVSIvk &_, VkFormat format)
Definition: ImagesVk.cpp:207
bool bridgeMap(MIVSIvk &_, void *src, VkImageLayout X)
Definition: CmdPoolVk.cpp:352
size_t size

◆ createFromFile()

template<class T >
bool ImagesVk::createFromFile ( ImmidiateCmd< T > &  cmder,
std::string  key,
Iache iach 
)
inline

create2D(_, VK_FORMAT_R32G32B32A32_SFLOAT); cmder.bridgeMap(_, (char*)loader.images->packed, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);

VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);

Definition at line 896 of file ImagesVk.h.

896 {
897
898 MIVSIvk _;
899
900 if (!(Mem(MIVSIvk,SIZE_MIVSI).$get(_, &iach.hach))) {
901
902 std::string name = IMAGE_PATH + key;
903 log_once("Image Loading...... %s \n", (name).c_str());
904
905 ktx::loadmap loader;
906
907 if (ktx::Flags::Error == loader.load(name.c_str())) {
908 log_bad("stb Load %s \n", (name).c_str());
909 };
910
911 _.w = loader.images->w;
912 _.h = loader.images->h;
913 _.c = 4;
914 _.l = 1;
915 _.size = _.w * _.h * _.c * _.l;
916
917 create2D(_, iach.format);
920 cmder.bridgeMap(_, (char*)loader.images->packed, iach.layout);
921
922 Mem(MIVSIvk,SIZE_MIVSI).$set$(std::move(_), &iach.hach);
923 iach.refCnt++;
924 return true;
925 }
926
927 return true;
928
929 };
#define log_once(...)
DELETE ALL ^((?!\w).)*log_once(.*; ^((?!\w).)*log_once((.* )+?.*;.
Definition: log.hpp:13
VkImageLayout layout
Definition: incomplete.h:50
bool create2D(MIVSIvk &_, VkFormat format, VkImageUsageFlags flag=VK_IMAGE_USAGE_TRANSFER_DST_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT|VK_IMAGE_USAGE_SAMPLED_BIT, VkMemoryPropertyFlags properties=VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)
Definition: ImagesVk.cpp:74
uint32_t c

◆ createFromFiles()

template<class T >
bool ImagesVk::createFromFiles ( ImmidiateCmd< T > &  cmder,
std::vector< std::string >  keys,
Iache iach 
)
inline

VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);

Definition at line 932 of file ImagesVk.h.

932 {
933
934 MIVSIvk _;
935
936 if (!(Mem(MIVSIvk, SIZE_MIVSI).$get(_, &iach.hach))) {
937
938 int l = 0;;
939
940 _.l = keys.size();
941 for (std::string key : keys) {
942
943 std::string name = IMAGE_PATH + key;
944 log_once("Image Loading...... %s \n", (name).c_str());
945
946 ktx::loadmap loader;
947
948 if (ktx::Flags::Error == loader.load(name.c_str())) {
949 log_bad("stb Load %s \n", (name).c_str());
950 };
951 if (l ==0) {
952 _.w = loader.images->w;
953 _.h = loader.images->h;
954 _.c = 4;
955 _.size = _.w * _.h * _.c;
956 create2DArray(_, iach.format);
957 }
958
959 _.Info.imageLayout = VK_IMAGE_LAYOUT_UNDEFINED;
960 cmder.bridgeMap(_, (char*)loader.images->packed,l, iach.layout);
961 l++;
962 }
963
964 _.size *= _.l ;
965 Mem(MIVSIvk, SIZE_MIVSI).$set$(std::move(_), &iach.hach);
966 iach.refCnt++;
967 return true;
968 }
969
970 return true;
971
972 };
char keys[KEYMAX]
Definition: global.cpp:28
bool create2DArray(MIVSIvk &_, VkFormat format)
Definition: ImagesVk.cpp:147

◆ createFromFileStorage()

template<class T >
bool ImagesVk::createFromFileStorage ( ImmidiateCmd< T > &  cmder,
std::string  key,
Iache iach 
)
inline

VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);

Definition at line 975 of file ImagesVk.h.

975 {
976
977 MIVSIvk _;
978
979 if (!(Mem(MIVSIvk,SIZE_MIVSI).$get(_, &iach.hach))) {
980
981 std::string name = IMAGE_PATH + key;
982 log_once("Image Loading...... %s \n", (name).c_str());
983
984 ktx::loadmap loader;
985
986 if (ktx::Flags::Error == loader.load(name.c_str())) {
987 log_bad("stb Load %s \n", (name).c_str());
988 };
989
990 _.w = loader.images->w;
991 _.h = loader.images->h;
992 _.c = 4;
993 _.l = 2;
994 _.size = _.w * _.h * _.c * _.l;
995
997
998 if (iach.format == VK_FORMAT_R32G32B32A32_SFLOAT) {
999 _.size = _.w * _.h * _.c * 4;
1000 }
1001 else {
1002 _.size = _.w * _.h * _.c;
1003 };
1004
1005
1006 cmder.bridgeMap(_, (char*)loader.images->packed, iach.layout);
1007
1008 Mem(MIVSIvk,SIZE_MIVSI).$set$(std::move(_), &iach.hach);
1009 iach.refCnt++;
1010 return true;
1011 }
1012
1013 return true;
1014
1015 };
bool create2DStorageArray(Mem &_, VkFormat format)
Definition: ImagesVk.h:709

◆ createFromKtx()

template<class T >
bool ImagesVk::createFromKtx ( ImmidiateCmd< T > &  cmder,
std::string  key,
Iache iach 
)
inline

ktx_size_t ktxTextureSize = ktxTexture_GetSize(ktxTexture);

cache[filename] = _;

Definition at line 838 of file ImagesVk.h.

839 {
840
841
842 MIVSIvk miv;
843
844 if (!(Mem(MIVSIvk,SIZE_MIVSI).$get(miv, &iach.hach))) {
845
846 std::string filename = IMAGE_PATH + key;
847
848 ktxResult result;
849 ktxTexture* ktxTexture;
850
851 if (!vka::shelve::fileExists(filename)) {
852 log_bad("Could not load texture from %s \n\nThe file may be part of the additional asset pack.\n\nRun \"download_assets.py\" in the repository root to download the latest version.", filename.c_str());
853 }
854 result = ktxTexture_CreateFromNamedFile(filename.c_str(), KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT, &ktxTexture);
855
856 assert(result == KTX_SUCCESS);
857
858 // Get properties required for using and upload texture data from the ktx texture object
859 miv.w = ktxTexture->baseWidth;
860 miv.h = ktxTexture->baseHeight;
861 miv.l = ktxTexture->numLayers;
862 miv.size = ktxTexture_GetSize(ktxTexture);
863 // ktx_uint8_t* ktxTextureData = ktxTexture_GetData(ktxTexture);
865 if (miv.l == 1) {
866 create2D(miv, iach.format);
867 }
868 else {
869 create2DArray(miv, iach.format);
870 }
871
872 cmder.bridgeMapArray(miv, ktxTexture, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
873
874 ktxTexture_Destroy(ktxTexture);
875
876
877
878 miv.Info = {};
879 miv.Info.sampler = miv.sampler;
880 miv.Info.imageView = miv.view;
881 miv.Info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
882
884 Mem(MIVSIvk,SIZE_MIVSI).$set$(std::move(miv), &iach.hach);
885 iach.refCnt++;
886
887 log_img("ImagesVk Create KTX TexArray %x %s \n",miv.view,filename.c_str());
888
889 return true;
890 };
891
892 return true;
893 };
bool bridgeMapArray(MIVSIvk &_, ktxTexture *ktxTexture, VkImageLayout X)
Definition: CmdPoolVk.cpp:410

◆ createFromRaw()

template<class T >
MIVSIvk & ImagesVk::createFromRaw ( ImmidiateCmd< T > &  cmder,
std::string  Name,
void *  src,
uint32_t  w,
uint32_t  h,
VkImageLayout  dstlayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL 
)
inline

Definition at line 676 of file ImagesVk.h.

677 {
678 MIVSIvk _;
679 /*
680 if (cache.count(Name) > 0)return cache[Name];
681
682 MIVSIvk& _ = cache[Name];
683
684 _.w = w;
685 _.h = h;
686 _.c = 4;
687 _.l = 1;
688 _.size = _.w * _.h * _.c * _.l;
689
690 create2D(_, VK_FORMAT_R8G8B8A8_UNORM);
691 //reate2D(_, VK_FORMAT_R8G8B8_SNORM);
692 //create2D(_, VK_FORMAT_R8G8B8_UNORM);
693 cmder.bridgeMap(_, src, dstlayout);
694 */
695
696 return _;
697
698 };

◆ dealloc()

void ImagesVk::dealloc ( )

Definition at line 65 of file ImagesVk.cpp.

65 {
66
67
68};

◆ getImage()

template<class T >
bool ImagesVk::getImage ( T &  iach,
MIVSIvk _ 
)
inline

Definition at line 667 of file ImagesVk.h.

667 {
668 if (Mem(MIVSIvk,SIZE_MIVSI).$get(_, &iach.hach)) {
669 return true;
670 };
671 return false;
672 };

◆ loadShader()

VkPipelineShaderStageCreateInfo ImagesVk::loadShader ( std::string  fileName,
VkShaderStageFlagBits  stage,
PvSvk p 
)

Definition at line 282 of file ImagesVk.cpp.

283{
284 VkPipelineShaderStageCreateInfo shaderStage = {};
285 shaderStage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
286 shaderStage.stage = stage;
287
288 shaderStage.module = vka::shelve::loadShader(fileName.c_str(), $device);
289 shaderStage.pName = "main"; // todo : make param
290 p.shaderModules.push_back(shaderStage.module);
291 assert(shaderStage.module != VK_NULL_HANDLE);
292 return shaderStage;
293};
std::vector< VkShaderModule > shaderModules

Member Data Documentation

◆ cmdPool

VkCommandPool ImagesVk::cmdPool
protected

Definition at line 656 of file ImagesVk.h.


The documentation for this struct was generated from the following files: