diff options
Diffstat (limited to 'src/gpu/vk/GrVkFramebuffer.cpp')
-rw-r--r-- | src/gpu/vk/GrVkFramebuffer.cpp | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/gpu/vk/GrVkFramebuffer.cpp b/src/gpu/vk/GrVkFramebuffer.cpp new file mode 100644 index 0000000000..d79895ce8e --- /dev/null +++ b/src/gpu/vk/GrVkFramebuffer.cpp @@ -0,0 +1,63 @@ +/* +* Copyright 2016 Google Inc. +* +* Use of this source code is governed by a BSD-style license that can be +* found in the LICENSE file. +*/ + +#include "GrVkFramebuffer.h" + +#include "GrVkGpu.h" +#include "GrVkImageView.h" +#include "GrVkRenderPass.h" + +GrVkFramebuffer* GrVkFramebuffer::Create(GrVkGpu* gpu, + int width, int height, + const GrVkRenderPass* renderPass, + const GrVkImageView* colorAttachment, + const GrVkImageView* resolveAttachment, + const GrVkImageView* stencilAttachment) { + // At the very least we need a renderPass and a colorAttachment + SkASSERT(renderPass); + SkASSERT(colorAttachment); + + VkImageView attachments[3]; + attachments[0] = colorAttachment->imageView(); + int numAttachments = 1; + if (resolveAttachment) { + attachments[numAttachments++] = resolveAttachment->imageView(); + } + if (stencilAttachment) { + attachments[numAttachments++] = stencilAttachment->imageView(); + } + + VkFramebufferCreateInfo createInfo; + memset(&createInfo, 0, sizeof(VkFramebufferCreateInfo)); + createInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; + createInfo.pNext = nullptr; + createInfo.flags = 0; + createInfo.renderPass = renderPass->vkRenderPass(); + createInfo.attachmentCount = numAttachments; + createInfo.pAttachments = attachments; + createInfo.width = width; + createInfo.height = height; + createInfo.layers = 1; + + VkFramebuffer framebuffer; + VkResult err = GR_VK_CALL(gpu->vkInterface(), CreateFramebuffer(gpu->device(), + &createInfo, + nullptr, + &framebuffer)); + if (err) { + return nullptr; + } + + return new GrVkFramebuffer(framebuffer); +} + +void GrVkFramebuffer::freeGPUData(const GrVkGpu* gpu) const { + SkASSERT(fFramebuffer); + GR_VK_CALL(gpu->vkInterface(), DestroyFramebuffer(gpu->device(), fFramebuffer, nullptr)); +} + + |