Home | History | Annotate | Download | only in vk
      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 
     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 
     58 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