60 lines
2.0 KiB
C
60 lines
2.0 KiB
C
|
#include "vk_image.h"
|
||
|
|
||
|
xvk_image_t XVK_ImageCreate(const xvk_image_create_t *create) {
|
||
|
xvk_image_t image;
|
||
|
VkMemoryRequirements memreq;
|
||
|
VkImageViewCreateInfo ivci = {.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO };
|
||
|
|
||
|
VkImageCreateInfo ici = {
|
||
|
.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
|
||
|
.imageType = VK_IMAGE_TYPE_2D,
|
||
|
.extent.width = create->width,
|
||
|
.extent.height = create->height,
|
||
|
.extent.depth = 1,
|
||
|
.mipLevels = create->mips,
|
||
|
.arrayLayers = 1,
|
||
|
.format = create->format,
|
||
|
.tiling = create->tiling,
|
||
|
.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED,
|
||
|
.usage = create->usage,
|
||
|
.samples = VK_SAMPLE_COUNT_1_BIT,
|
||
|
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
|
||
|
};
|
||
|
|
||
|
XVK_CHECK(vkCreateImage(vk_core.device, &ici, NULL, &image.image));
|
||
|
|
||
|
if (create->debug_name)
|
||
|
SET_DEBUG_NAME(image.image, VK_OBJECT_TYPE_IMAGE, create->debug_name);
|
||
|
|
||
|
vkGetImageMemoryRequirements(vk_core.device, image.image, &memreq);
|
||
|
image.devmem = allocateDeviceMemory(memreq, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, 0);
|
||
|
XVK_CHECK(vkBindImageMemory(vk_core.device, image.image, image.devmem.device_memory, 0));
|
||
|
|
||
|
ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
|
||
|
ivci.format = ici.format;
|
||
|
ivci.image = image.image;
|
||
|
ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||
|
ivci.subresourceRange.baseMipLevel = 0;
|
||
|
ivci.subresourceRange.levelCount = ici.mipLevels;
|
||
|
ivci.subresourceRange.baseArrayLayer = 0;
|
||
|
ivci.subresourceRange.layerCount = 1;
|
||
|
ivci.components = (VkComponentMapping){0, 0, 0, create->has_alpha ? 0 : VK_COMPONENT_SWIZZLE_ONE};
|
||
|
XVK_CHECK(vkCreateImageView(vk_core.device, &ivci, NULL, &image.view));
|
||
|
|
||
|
if (create->debug_name)
|
||
|
SET_DEBUG_NAME(image.view, VK_OBJECT_TYPE_IMAGE_VIEW, create->debug_name);
|
||
|
|
||
|
image.width = create->width;
|
||
|
image.height = create->height;
|
||
|
image.mips = create->mips;
|
||
|
|
||
|
return image;
|
||
|
}
|
||
|
|
||
|
void XVK_ImageDestroy(xvk_image_t *img) {
|
||
|
vkDestroyImageView(vk_core.device, img->view, NULL);
|
||
|
vkDestroyImage(vk_core.device, img->image, NULL);
|
||
|
freeDeviceMemory(&img->devmem);
|
||
|
*img = (xvk_image_t){0};
|
||
|
}
|