| 25 | namespace core |
| 26 | { |
| 27 | ImageView::ImageView(Image &img, VkImageViewType view_type, VkFormat format, |
| 28 | uint32_t mip_level, uint32_t array_layer, |
| 29 | uint32_t n_mip_levels, uint32_t n_array_layers) : |
| 30 | VulkanResource{VK_NULL_HANDLE, &img.get_device()}, |
| 31 | image{&img}, |
| 32 | format{format} |
| 33 | { |
| 34 | if (format == VK_FORMAT_UNDEFINED) |
| 35 | { |
| 36 | this->format = format = image->get_format(); |
| 37 | } |
| 38 | |
| 39 | subresource_range.baseMipLevel = mip_level; |
| 40 | subresource_range.baseArrayLayer = array_layer; |
| 41 | subresource_range.levelCount = n_mip_levels == 0 ? image->get_subresource().mipLevel : n_mip_levels; |
| 42 | subresource_range.layerCount = n_array_layers == 0 ? image->get_subresource().arrayLayer : n_array_layers; |
| 43 | |
| 44 | if (is_depth_format(format)) |
| 45 | { |
| 46 | subresource_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; |
| 47 | } |
| 48 | else |
| 49 | { |
| 50 | subresource_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; |
| 51 | } |
| 52 | |
| 53 | VkImageViewCreateInfo view_info{VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO}; |
| 54 | view_info.image = image->get_handle(); |
| 55 | view_info.viewType = view_type; |
| 56 | view_info.format = format; |
| 57 | view_info.subresourceRange = subresource_range; |
| 58 | |
| 59 | auto result = vkCreateImageView(get_device().get_handle(), &view_info, nullptr, &get_handle()); |
| 60 | |
| 61 | if (result != VK_SUCCESS) |
| 62 | { |
| 63 | throw VulkanException{result, "Cannot create ImageView"}; |
| 64 | } |
| 65 | |
| 66 | // Register this image view to its image |
| 67 | // in order to be notified when it gets moved |
| 68 | image->get_views().emplace(this); |
| 69 | } |
| 70 | |
| 71 | ImageView::ImageView(ImageView &&other) : |
| 72 | VulkanResource{std::move(other)}, |
nothing calls this directly
no test coverage detected