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