• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "GrVkFramebuffer.h"
9 
10 #include "GrVkGpu.h"
11 #include "GrVkImageView.h"
12 #include "GrVkRenderPass.h"
13 
Create(GrVkGpu * gpu,int width,int height,const GrVkRenderPass * renderPass,const GrVkImageView * colorAttachment,const GrVkImageView * resolveAttachment,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* resolveAttachment,
19                                          const GrVkImageView* stencilAttachment) {
20     // At the very least we need a renderPass and a colorAttachment
21     SkASSERT(renderPass);
22     SkASSERT(colorAttachment);
23 
24     VkImageView attachments[3];
25     attachments[0] = colorAttachment->imageView();
26     int numAttachments = 1;
27     if (resolveAttachment) {
28         attachments[numAttachments++] = resolveAttachment->imageView();
29     }
30     if (stencilAttachment) {
31         attachments[numAttachments++] = stencilAttachment->imageView();
32     }
33 
34     VkFramebufferCreateInfo createInfo;
35     memset(&createInfo, 0, sizeof(VkFramebufferCreateInfo));
36     createInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
37     createInfo.pNext = nullptr;
38     createInfo.flags = 0;
39     createInfo.renderPass = renderPass->vkRenderPass();
40     createInfo.attachmentCount = numAttachments;
41     createInfo.pAttachments = attachments;
42     createInfo.width = width;
43     createInfo.height = height;
44     createInfo.layers = 1;
45 
46     VkFramebuffer framebuffer;
47     VkResult err = GR_VK_CALL(gpu->vkInterface(), CreateFramebuffer(gpu->device(),
48                                                                     &createInfo,
49                                                                     nullptr,
50                                                                     &framebuffer));
51     if (err) {
52         return nullptr;
53     }
54 
55     return new GrVkFramebuffer(framebuffer);
56 }
57 
freeGPUData(const GrVkGpu * gpu) const58 void GrVkFramebuffer::freeGPUData(const GrVkGpu* gpu) const {
59     SkASSERT(fFramebuffer);
60     GR_VK_CALL(gpu->vkInterface(), DestroyFramebuffer(gpu->device(), fFramebuffer, nullptr));
61 }
62 
63 
64