/* * Copyright 2023 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "src/gpu/graphite/vk/VulkanFramebuffer.h" #include "src/gpu/graphite/vk/VulkanGraphiteUtils.h" #include "src/gpu/graphite/vk/VulkanSharedContext.h" #include "src/gpu/graphite/vk/VulkanTexture.h" namespace skgpu::graphite { sk_sp VulkanFramebuffer::Make(const VulkanSharedContext* context, const VkFramebufferCreateInfo& framebufferInfo, const RenderPassDesc& renderPassDesc, sk_sp msaaTexture, sk_sp depthStencilTexture) { VkFramebuffer framebuffer; VkResult result; VULKAN_CALL_RESULT( context, result, CreateFramebuffer(context->device(), &framebufferInfo, nullptr, &framebuffer)); if (result != VK_SUCCESS) { return nullptr; } bool loadMSAAFromResolve = RenderPassDescWillLoadMSAAFromResolve(renderPassDesc); return sk_sp(new VulkanFramebuffer(context, framebuffer, std::move(msaaTexture), std::move(depthStencilTexture), loadMSAAFromResolve)); } VulkanFramebuffer::VulkanFramebuffer(const VulkanSharedContext* context, VkFramebuffer framebuffer, sk_sp msaaTexture, sk_sp depthStencilTexture, bool loadMSAAFromResolve) : Resource(context, Ownership::kOwned, /*gpuMemorySize=*/0) , fSharedContext(context) , fFramebuffer(framebuffer) , fMsaaTexture(std::move(msaaTexture)) , fDepthStencilTexture(std::move(depthStencilTexture)) , fLoadMSAAFromResolve(loadMSAAFromResolve) {} bool VulkanFramebuffer::compatible(const RenderPassDesc& renderPassDesc, const VulkanTexture* msaaTexture, const VulkanTexture* depthStencilTexture) { auto compatibleTextures = [](const VulkanTexture* tex1, const VulkanTexture* tex2) { if (tex1 && tex2) { return tex1->uniqueID() == tex2->uniqueID(); } else if (!tex1 && !tex2){ return true; } return false; }; bool loadMSAAFromResolve = RenderPassDescWillLoadMSAAFromResolve(renderPassDesc); return fLoadMSAAFromResolve == loadMSAAFromResolve && compatibleTextures(msaaTexture, fMsaaTexture.get()) && compatibleTextures(depthStencilTexture, fDepthStencilTexture.get()); } void VulkanFramebuffer::freeGpuData() { VULKAN_CALL(fSharedContext->interface(), DestroyFramebuffer(fSharedContext->device(), fFramebuffer, nullptr)); } } // namespace skgpu::graphite