1164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel/* 2164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel* Copyright 2016 Google Inc. 3164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel* 4164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel* Use of this source code is governed by a BSD-style license that can be 5164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel* found in the LICENSE file. 6164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel*/ 7164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel 8164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel#include "GrVkImageView.h" 9164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel#include "GrVkGpu.h" 10164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel#include "GrVkUtil.h" 11164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel 12164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Danielconst GrVkImageView* GrVkImageView::Create(GrVkGpu* gpu, VkImage image, VkFormat format, 13164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel Type viewType) { 14164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel VkImageView imageView; 15164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel 16164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel // Create the VkImageView 17164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel VkImageViewCreateInfo viewInfo = { 18164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // sType 19164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel NULL, // pNext 20164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel 0, // flags 21164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel image, // image 22164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel VK_IMAGE_VIEW_TYPE_2D, // viewType 23164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel format, // format 24164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, 25164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A }, // components 26164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }, // subresourceRange 27164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel }; 28164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel if (kStencil_Type == viewType) { 29164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel viewInfo.components.r = VK_COMPONENT_SWIZZLE_ZERO; 30164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel viewInfo.components.g = VK_COMPONENT_SWIZZLE_ZERO; 31164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel viewInfo.components.b = VK_COMPONENT_SWIZZLE_ZERO; 32164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel viewInfo.components.a = VK_COMPONENT_SWIZZLE_ZERO; 33164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel viewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT; 34164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel } 35164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel 36164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel VkResult err = GR_VK_CALL(gpu->vkInterface(), CreateImageView(gpu->device(), &viewInfo, 37164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel nullptr, &imageView)); 38164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel if (err) { 39164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel return nullptr; 40164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel } 41164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel 42164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel return new GrVkImageView(imageView); 43164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel} 44164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel 45164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Danielvoid GrVkImageView::freeGPUData(const GrVkGpu* gpu) const { 46164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel GR_VK_CALL(gpu->vkInterface(), DestroyImageView(gpu->device(), fImageView, nullptr)); 47164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel} 48164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel 49164a9f061c5186ae931cc23a3c73f32472e80ff5Greg Daniel 50