13 #ifndef hifi_gpu_vk_VKFramebuffer_h
14 #define hifi_gpu_vk_VKFramebuffer_h
17 #include "VKBackend.h"
19 namespace gpu {
namespace vk {
21 class VKFramebuffer :
public vk::VKObject<Framebuffer> {
23 VkRenderPass vkRenderPass {VK_NULL_HANDLE};
24 VkFramebuffer vkFramebuffer {VK_NULL_HANDLE};
26 static VKFramebuffer* sync(vk::VKBackend& backend,
const Framebuffer& framebuffer) {
27 VKFramebuffer*
object = Backend::getGPUObject<VKFramebuffer>(framebuffer);
29 bool needsUpdate{
false };
31 framebuffer.getDepthStamp() != object->_depthStamp ||
32 framebuffer.getColorStamps() != object->_colorStamps) {
39 }
else if (framebuffer.isEmpty()) {
47 object =
new VKFramebuffer(backend.shared_from_this(), framebuffer);
48 Backend::setGPUObject(framebuffer,
object);
55 Stamp _depthStamp { 0 };
56 std::vector<Stamp> _colorStamps;
59 struct FramebufferAttachment
62 VkDeviceMemory memory;
65 VkImageSubresourceRange subresourceRange;
66 VkAttachmentDescription description;
73 std::vector<VkFormat> formats =
76 VK_FORMAT_X8_D24_UNORM_PACK32,
78 VK_FORMAT_D16_UNORM_S8_UINT,
79 VK_FORMAT_D24_UNORM_S8_UINT,
80 VK_FORMAT_D32_SFLOAT_S8_UINT,
82 return std::find(formats.begin(), formats.end(), format) != std::end(formats);
90 std::vector<VkFormat> formats =
93 VK_FORMAT_D16_UNORM_S8_UINT,
94 VK_FORMAT_D24_UNORM_S8_UINT,
95 VK_FORMAT_D32_SFLOAT_S8_UINT,
97 return std::find(formats.begin(), formats.end(), format) != std::end(formats);
103 bool isDepthStencil()
105 return(hasDepth() || hasStencil());
111 std::vector<FramebufferAttachment> attachments;
115 virtual void update();
117 VkResult createFramebuffer();
118 struct VKAttachmentCreateInfo
120 uint32_t width, height;
123 VkImageUsageFlags usage;
124 VkSampleCountFlagBits imageSampleCount = VK_SAMPLE_COUNT_1_BIT;
126 uint32_t addAttachment(VKAttachmentCreateInfo createinfo, VKTexture *texture);
129 VKFramebuffer(
const std::weak_ptr<vk::VKBackend>& backend,
const Framebuffer& framebuffer) : VKObject(*backend.lock(), framebuffer) {}
131 ~VKFramebuffer()
override;