• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 * Copyright 2023 Google LLC
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/graphite/vk/VulkanFramebuffer.h"
9 
10 #include "src/gpu/graphite/vk/VulkanGraphiteUtils.h"
11 #include "src/gpu/graphite/vk/VulkanSharedContext.h"
12 #include "src/gpu/graphite/vk/VulkanTexture.h"
13 
14 namespace skgpu::graphite {
15 
Make(const VulkanSharedContext * context,const VkFramebufferCreateInfo & framebufferInfo,const RenderPassDesc & renderPassDesc,sk_sp<VulkanTexture> msaaTexture,sk_sp<VulkanTexture> depthStencilTexture)16 sk_sp<VulkanFramebuffer> VulkanFramebuffer::Make(const VulkanSharedContext* context,
17                                                  const VkFramebufferCreateInfo& framebufferInfo,
18                                                  const RenderPassDesc& renderPassDesc,
19                                                  sk_sp<VulkanTexture> msaaTexture,
20                                                  sk_sp<VulkanTexture> depthStencilTexture) {
21     VkFramebuffer framebuffer;
22     VkResult result;
23     VULKAN_CALL_RESULT(
24             context,
25             result,
26             CreateFramebuffer(context->device(), &framebufferInfo, nullptr, &framebuffer));
27     if (result != VK_SUCCESS) {
28         return nullptr;
29     }
30 
31     bool loadMSAAFromResolve = RenderPassDescWillLoadMSAAFromResolve(renderPassDesc);
32 
33     return sk_sp<VulkanFramebuffer>(new VulkanFramebuffer(context,
34                                                           framebuffer,
35                                                           std::move(msaaTexture),
36                                                           std::move(depthStencilTexture),
37                                                           loadMSAAFromResolve));
38 }
39 
VulkanFramebuffer(const VulkanSharedContext * context,VkFramebuffer framebuffer,sk_sp<VulkanTexture> msaaTexture,sk_sp<VulkanTexture> depthStencilTexture,bool loadMSAAFromResolve)40 VulkanFramebuffer::VulkanFramebuffer(const VulkanSharedContext* context,
41                                      VkFramebuffer framebuffer,
42                                      sk_sp<VulkanTexture> msaaTexture,
43                                      sk_sp<VulkanTexture> depthStencilTexture,
44                                      bool loadMSAAFromResolve)
45         : Resource(context,
46                    Ownership::kOwned,
47                    /*gpuMemorySize=*/0)
48         , fSharedContext(context)
49         , fFramebuffer(framebuffer)
50         , fMsaaTexture(std::move(msaaTexture))
51         , fDepthStencilTexture(std::move(depthStencilTexture))
52         , fLoadMSAAFromResolve(loadMSAAFromResolve) {}
53 
compatible(const RenderPassDesc & renderPassDesc,const VulkanTexture * msaaTexture,const VulkanTexture * depthStencilTexture)54 bool VulkanFramebuffer::compatible(const RenderPassDesc& renderPassDesc,
55                                    const VulkanTexture* msaaTexture,
56                                    const VulkanTexture* depthStencilTexture) {
57     auto compatibleTextures = [](const VulkanTexture* tex1, const VulkanTexture* tex2) {
58         if (tex1 && tex2) {
59             return tex1->uniqueID() == tex2->uniqueID();
60         } else if (!tex1 && !tex2){
61             return true;
62         }
63         return false;
64     };
65 
66     bool loadMSAAFromResolve = RenderPassDescWillLoadMSAAFromResolve(renderPassDesc);
67 
68     return fLoadMSAAFromResolve == loadMSAAFromResolve &&
69            compatibleTextures(msaaTexture, fMsaaTexture.get()) &&
70            compatibleTextures(depthStencilTexture, fDepthStencilTexture.get());
71 }
72 
freeGpuData()73 void VulkanFramebuffer::freeGpuData() {
74     VULKAN_CALL(fSharedContext->interface(),
75                 DestroyFramebuffer(fSharedContext->device(), fFramebuffer, nullptr));
76 }
77 
78 } // namespace skgpu::graphite
79