const GrVkImageView* GrVkImageView::Create(const GrVkGpu* gpu, VkImage image, VkFormat format, Type viewType, uint32_t miplevels) { VkImageView imageView; // Create the VkImageView VkImageViewCreateInfo viewInfo = { VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // sType NULL, // pNext 0, // flags image, // image VK_IMAGE_VIEW_TYPE_2D, // viewType format, // format { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A }, // components { VK_IMAGE_ASPECT_COLOR_BIT, 0, miplevels, 0, 1 }, // subresourceRange }; if (kStencil_Type == viewType) { viewInfo.components.r = VK_COMPONENT_SWIZZLE_ZERO; viewInfo.components.g = VK_COMPONENT_SWIZZLE_ZERO; viewInfo.components.b = VK_COMPONENT_SWIZZLE_ZERO; viewInfo.components.a = VK_COMPONENT_SWIZZLE_ZERO; viewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT; } VkResult err = GR_VK_CALL(gpu->vkInterface(), CreateImageView(gpu->device(), &viewInfo, nullptr, &imageView)); if (err) { return nullptr; } return new GrVkImageView(imageView); }
TEST_F(VkImageTest, CreateImageViewTest) { VkFormat fmt; VkImageView imageView; fmt = VK_FORMAT_R8G8B8A8_UINT; CreateImage(512, 256); // typedef struct VkImageViewCreateInfo_ // { // VkStructureType sType; // Must be VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO // const void* pNext; // Pointer to next structure // VkImage image; // VkImageViewType viewType; // VkFormat format; // VkComponentMapping channels; // VkImageSubresourceRange subresourceRange; // float minLod; // } VkImageViewCreateInfo; VkImageViewCreateInfo viewInfo = {}; viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D; viewInfo.format = fmt; viewInfo.components.r = VK_COMPONENT_SWIZZLE_R; viewInfo.components.g = VK_COMPONENT_SWIZZLE_G; viewInfo.components.b = VK_COMPONENT_SWIZZLE_B; viewInfo.components.a = VK_COMPONENT_SWIZZLE_A; viewInfo.subresourceRange.baseArrayLayer = 0; viewInfo.subresourceRange.layerCount = 1; viewInfo.subresourceRange.baseMipLevel = 0; viewInfo.subresourceRange.levelCount = 1; viewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; // VKAPI_ATTR VkResult VKAPI_CALL vkCreateImageView( // VkDevice device, // const VkImageViewCreateInfo* pCreateInfo, // VkImageView* pView); CreateImageView(&viewInfo, &imageView); DestroyImageView(imageView); DestroyImage(); }