1 /*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7 
8 #include "src/gpu/vk/GrVkFramebuffer.h"
9 
10 #include "src/gpu/vk/GrVkGpu.h"
11 #include "src/gpu/vk/GrVkImageView.h"
12 #include "src/gpu/vk/GrVkRenderPass.h"
13 
Create(GrVkGpu * gpu,int width,int height,const GrVkRenderPass * renderPass,const GrVkImageView * colorAttachment,const GrVkImageView * stencilAttachment)14 GrVkFramebuffer* GrVkFramebuffer::Create(GrVkGpu* gpu,
15                                          int width, int height,
16                                          const GrVkRenderPass* renderPass,
17                                          const GrVkImageView* colorAttachment,
18                                          const GrVkImageView* stencilAttachment) {
19     // At the very least we need a renderPass and a colorAttachment
20     SkASSERT(renderPass);
21     SkASSERT(colorAttachment);
22 
23     VkImageView attachments[3];
24     attachments[0] = colorAttachment->imageView();
25     int numAttachments = 1;
26     if (stencilAttachment) {
27         attachments[numAttachments++] = stencilAttachment->imageView();
28     }
29 
30     VkFramebufferCreateInfo createInfo;
31     memset(&createInfo, 0, sizeof(VkFramebufferCreateInfo));
32     createInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
33     createInfo.pNext = nullptr;
34     createInfo.flags = 0;
35     createInfo.renderPass = renderPass->vkRenderPass();
36     createInfo.attachmentCount = numAttachments;
37     createInfo.pAttachments = attachments;
38     createInfo.width = width;
39     createInfo.height = height;
40     createInfo.layers = 1;
41 
42     VkFramebuffer framebuffer;
43     VkResult err;
44     GR_VK_CALL_RESULT(gpu, err, CreateFramebuffer(gpu->device(), &createInfo, nullptr,
45                                                   &framebuffer));
46     if (err) {
47         return nullptr;
48     }
49 
50     return new GrVkFramebuffer(gpu, framebuffer);
51 }
52 
freeGPUData() const53 void GrVkFramebuffer::freeGPUData() const {
54     SkASSERT(fFramebuffer);
55     GR_VK_CALL(fGpu->vkInterface(), DestroyFramebuffer(fGpu->device(), fFramebuffer, nullptr));
56 }
57