blob: d1c7be4718b3ed77e07aa759d83675dc0437d040 [file]
/*
* Copyright 2025 Rive
*/
#pragma once
#include <vulkan/vulkan.h>
#include "rive/renderer/gpu.hpp"
#include "rive/refcnt.hpp"
#include "render_pass_vulkan.hpp"
namespace rive::gpu
{
class PipelineManagerVulkan;
class VulkanContext;
// VkPipelineLayout wrapper for Rive flushes.
class DrawPipelineLayoutVulkan
{
public:
DrawPipelineLayoutVulkan(PipelineManagerVulkan*,
gpu::InterlockMode,
RenderPassOptionsVulkan);
~DrawPipelineLayoutVulkan();
DrawPipelineLayoutVulkan(const DrawPipelineLayoutVulkan&) = delete;
DrawPipelineLayoutVulkan& operator=(const DrawPipelineLayoutVulkan&) =
delete;
gpu::InterlockMode interlockMode() const { return m_interlockMode; }
RenderPassOptionsVulkan renderPassOptions() const
{
return m_renderPassOptions;
}
// Returns whether this layout's shaders declare the emulated
// color-write-disable push constant.
// NOTE: Even if we have VK_EXT_color_write_enable, the push constant still
// gets declared (though never used) because specialization constants can't
// remove a declaration.
bool hasColorWriteDisablePushConstant() const
{
// For now, only MSAA gets it -- specialization.glsl leaves
// @EMULATE_DYNAMIC_COLOR_WRITE_DISABLE undefined elsewhere.
return m_interlockMode == gpu::InterlockMode::msaa;
}
uint32_t colorAttachmentCount(uint32_t subpassIndex,
RenderPassOptionsVulkan) const;
VkDescriptorSetLayout plsLayout() const
{
return m_plsTextureDescriptorSetLayout;
}
VkPipelineLayout operator*() const { return m_pipelineLayout; }
VkPipelineLayout vkPipelineLayout() const { return m_pipelineLayout; }
private:
const rcp<VulkanContext> m_vk;
const gpu::InterlockMode m_interlockMode;
const RenderPassOptionsVulkan m_renderPassOptions;
VkDescriptorSetLayout m_plsTextureDescriptorSetLayout = VK_NULL_HANDLE;
VkPipelineLayout m_pipelineLayout = VK_NULL_HANDLE;
};
} // namespace rive::gpu