blob: e8240c5a73f481c44b6cc7b5630214ecb5dc6775 [file] [log] [blame]
/*
* Copyright 2023 Rive
*/
#pragma once
#include "rive/refcnt.hpp"
#include "rive/renderer/gpu.hpp"
#include <vulkan/vulkan.h>
namespace rive::gpu
{
namespace spirv
{
// Draw setup shaders.
extern rive::Span<const uint32_t> color_ramp_vert;
extern rive::Span<const uint32_t> color_ramp_frag;
extern rive::Span<const uint32_t> tessellate_vert;
extern rive::Span<const uint32_t> tessellate_frag;
extern rive::Span<const uint32_t> render_atlas_vert;
extern rive::Span<const uint32_t> render_atlas_fill_frag;
extern rive::Span<const uint32_t> render_atlas_stroke_frag;
// InterlockMode::rasterOrdering shaders.
extern rive::Span<const uint32_t> draw_path_vert;
extern rive::Span<const uint32_t> draw_path_frag;
extern rive::Span<const uint32_t> draw_interior_triangles_vert;
extern rive::Span<const uint32_t> draw_interior_triangles_frag;
extern rive::Span<const uint32_t> draw_atlas_blit_vert;
extern rive::Span<const uint32_t> draw_atlas_blit_frag;
extern rive::Span<const uint32_t> draw_image_mesh_vert;
extern rive::Span<const uint32_t> draw_image_mesh_frag;
// InterlockMode::atomics shaders.
extern rive::Span<const uint32_t> atomic_draw_path_vert;
extern rive::Span<const uint32_t> atomic_draw_path_frag;
extern rive::Span<const uint32_t> atomic_draw_path_fixedcolor_frag;
extern rive::Span<const uint32_t> atomic_draw_interior_triangles_vert;
extern rive::Span<const uint32_t> atomic_draw_interior_triangles_frag;
extern rive::Span<const uint32_t>
atomic_draw_interior_triangles_fixedcolor_frag;
extern rive::Span<const uint32_t> atomic_draw_atlas_blit_vert;
extern rive::Span<const uint32_t> atomic_draw_atlas_blit_frag;
extern rive::Span<const uint32_t> atomic_draw_atlas_blit_fixedcolor_frag;
extern rive::Span<const uint32_t> atomic_draw_image_rect_vert;
extern rive::Span<const uint32_t> atomic_draw_image_rect_frag;
extern rive::Span<const uint32_t> atomic_draw_image_rect_fixedcolor_frag;
extern rive::Span<const uint32_t> atomic_draw_image_mesh_vert;
extern rive::Span<const uint32_t> atomic_draw_image_mesh_frag;
extern rive::Span<const uint32_t> atomic_draw_image_mesh_fixedcolor_frag;
extern rive::Span<const uint32_t> atomic_resolve_vert;
extern rive::Span<const uint32_t> atomic_resolve_frag;
extern rive::Span<const uint32_t> atomic_resolve_fixedcolor_frag;
extern rive::Span<const uint32_t> atomic_resolve_coalesced_vert;
extern rive::Span<const uint32_t> atomic_resolve_coalesced_frag;
// InterlockMode::clockwiseAtomic shaders.
extern rive::Span<const uint32_t> draw_clockwise_path_vert;
extern rive::Span<const uint32_t> draw_clockwise_path_frag;
extern rive::Span<const uint32_t> draw_clockwise_interior_triangles_vert;
extern rive::Span<const uint32_t> draw_clockwise_interior_triangles_frag;
extern rive::Span<const uint32_t> draw_clockwise_atlas_blit_vert;
extern rive::Span<const uint32_t> draw_clockwise_atlas_blit_frag;
extern rive::Span<const uint32_t> draw_clockwise_image_mesh_vert;
extern rive::Span<const uint32_t> draw_clockwise_image_mesh_frag;
// InterlockMode::msaa shaders.
extern rive::Span<const uint32_t> draw_msaa_path_vert;
extern rive::Span<const uint32_t> draw_msaa_path_frag;
extern rive::Span<const uint32_t> draw_msaa_path_fixedcolor_frag;
extern rive::Span<const uint32_t> draw_msaa_stencil_vert;
extern rive::Span<const uint32_t> draw_msaa_stencil_frag;
extern rive::Span<const uint32_t> draw_msaa_stencil_fixedcolor_frag;
extern rive::Span<const uint32_t> draw_msaa_atlas_blit_vert;
extern rive::Span<const uint32_t> draw_msaa_atlas_blit_frag;
extern rive::Span<const uint32_t> draw_msaa_atlas_blit_fixedcolor_frag;
extern rive::Span<const uint32_t> draw_msaa_image_mesh_vert;
extern rive::Span<const uint32_t> draw_msaa_image_mesh_frag;
extern rive::Span<const uint32_t> draw_msaa_image_mesh_fixedcolor_frag;
// Reload global SPIRV buffers from runtime data.
void hotload_shaders(rive::Span<const uint32_t> spirvData);
}; // namespace spirv
class VulkanContext;
// Wraps vertex and fragment shader modules for a specific combination of
// DrawType, InterlockMode, and ShaderFeatures.
class DrawShaderVulkan
{
public:
DrawShaderVulkan(VulkanContext*,
gpu::DrawType,
gpu::InterlockMode,
gpu::ShaderFeatures,
gpu::ShaderMiscFlags);
~DrawShaderVulkan();
VkShaderModule vertexModule() const { return m_vertexModule; }
VkShaderModule fragmentModule() const { return m_fragmentModule; }
private:
const rcp<VulkanContext> m_vk;
VkShaderModule m_vertexModule = VK_NULL_HANDLE;
VkShaderModule m_fragmentModule = VK_NULL_HANDLE;
};
} // namespace rive::gpu