| 288 | } |
| 289 | |
| 290 | ResourceHandler::CreatedT< VkImage > ResourceHandler::createImage( GraphContext & context |
| 291 | , ImageId imageId ) |
| 292 | { |
| 293 | ResourceHandler::CreatedT< VkImage > result{}; |
| 294 | |
| 295 | if ( context.vkCreateImage ) |
| 296 | { |
| 297 | lock_type lock( m_imagesMutex ); |
| 298 | auto [it, ins] = m_images.try_emplace( imageId, std::pair< VkImage, VkDeviceMemory >{} ); |
| 299 | |
| 300 | if ( ins && context.device ) |
| 301 | { |
| 302 | // Create image |
| 303 | auto createInfo = reshdl::convert( *imageId.data ); |
| 304 | auto res = context.vkCreateImage( context.device |
| 305 | , &createInfo |
| 306 | , context.allocator |
| 307 | , &it->second.first ); |
| 308 | result.resource = it->second.first; |
| 309 | checkVkResult( res, "Image creation" ); |
| 310 | crgRegisterObjectName( context, imageId.data->name, result.resource ); |
| 311 | |
| 312 | // Create Image memory |
| 313 | VkMemoryRequirements requirements{}; |
| 314 | context.vkGetImageMemoryRequirements( context.device |
| 315 | , result.resource |
| 316 | , &requirements ); |
| 317 | uint32_t deduced = context.deduceMemoryType( requirements.memoryTypeBits |
| 318 | , getMemoryPropertyFlags( imageId.data->info.memory ) ); |
| 319 | VkMemoryAllocateInfo allocateInfo{ VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO |
| 320 | , nullptr |
| 321 | , requirements.size |
| 322 | , deduced }; |
| 323 | res = context.vkAllocateMemory( context.device |
| 324 | , &allocateInfo |
| 325 | , context.allocator |
| 326 | , &it->second.second ); |
| 327 | result.memory = it->second.second; |
| 328 | checkVkResult( res, "Image memory allocation" ); |
| 329 | crgRegisterObjectName( context, imageId.data->name, result.memory ); |
| 330 | |
| 331 | // Bind image and memory |
| 332 | res = context.vkBindImageMemory( context.device |
| 333 | , result.resource |
| 334 | , result.memory |
| 335 | , 0u ); |
| 336 | checkVkResult( res, "Image memory binding" ); |
| 337 | result.created = true; |
| 338 | } |
| 339 | else |
| 340 | { |
| 341 | result.resource = it->second.first; |
| 342 | result.memory = it->second.second; |
| 343 | } |
| 344 | } |
| 345 | |
| 346 | return result; |
| 347 | } |
nothing calls this directly
no test coverage detected