blob: 038926da9bce1ca0d88694169094b938495082ae [file] [log] [blame]
/*
* Copyright 2022 Rive
*/
#define TESS_TEXTURE_WIDTH float(2048)
#define TESS_TEXTURE_WIDTH_LOG2 11
#define GRAD_TEXTURE_WIDTH float(512)
#define GRAD_TEXTURE_INVERSE_WIDTH float(0.001953125)
// Width to use for a texture that emulates a storage buffer.
//
// Minimize width since the texture needs to be updated in entire rows from the resource buffer.
// Since these only serve paths and contours, both of those are limited to 16-bit indices, 2048
// is the min specified texture size in ES3, and no path buffer uses more than 4 texels, we can
// safely use a width of 128.
#define STORAGE_TEXTURE_WIDTH 128
#define STORAGE_TEXTURE_SHIFT_Y 7
#define STORAGE_TEXTURE_MASK_X 0x7fu
// Tells shaders that a cubic should actually be drawn as the single, non-AA triangle: [p0, p1, p3].
// This is used to squeeze in more rare triangles, like "grout" triangles from self intersections on
// interior triangulation, where it wouldn't be worth it to put them in their own dedicated draw
// call.
#define RETROFITTED_TRIANGLE_CONTOUR_FLAG (1u << 31u)
// Tells the tessellation shader to re-run Wang's formula on the given curve, figure out how many
// segments it actually needs, and make any excess segments degenerate by co-locating their vertices
// at T=0. (Used on the "outerCurve" patches that are drawn with interior triangulations.)
#define CULL_EXCESS_TESSELLATION_SEGMENTS_CONTOUR_FLAG (1u << 30u)
// Flags for specifying the join type.
#define JOIN_TYPE_MASK (3u << 28u)
#define MITER_CLIP_JOIN_CONTOUR_FLAG (3u << 28u)
#define MITER_REVERT_JOIN_CONTOUR_FLAG (2u << 28u)
#define BEVEL_JOIN_CONTOUR_FLAG (1u << 28u)
// When a join is being used to emulate a stroke cap, the shader emits additional vertices at T=0
// and T=1 for round joins, and changes the miter limit to 1 for miter-clip joins.
#define EMULATED_STROKE_CAP_CONTOUR_FLAG (1u << 27u)
// Internal contour flags.
#define MIRRORED_CONTOUR_CONTOUR_FLAG (1u << 26u)
#define JOIN_TANGENT_0_CONTOUR_FLAG (1u << 25u)
#define JOIN_TANGENT_INNER_CONTOUR_FLAG (1u << 24u)
#define LEFT_JOIN_CONTOUR_FLAG (1u << 23u)
#define RIGHT_JOIN_CONTOUR_FLAG (1u << 22u)
#define CONTOUR_ID_MASK 0xffffu
// Says which part of the patch a vertex belongs to.
#define STROKE_VERTEX 0
#define FAN_VERTEX 1
#define FAN_MIDPOINT_VERTEX 2
// Says which part of the patch a vertex belongs to.
#define STROKE_VERTEX 0
#define FAN_VERTEX 1
#define FAN_MIDPOINT_VERTEX 2
// Mirrors pls::PaintType.
#define SOLID_COLOR_PAINT_TYPE 0u
#define LINEAR_GRADIENT_PAINT_TYPE 1u
#define RADIAL_GRADIENT_PAINT_TYPE 2u
#define IMAGE_PAINT_TYPE 3u
#define CLIP_UPDATE_PAINT_TYPE 4u
// Paint flags, found in the x-component value of @paintBuffer.
#define PAINT_FLAG_EVEN_ODD 0x100u
#define PAINT_FLAG_HAS_CLIP_RECT 0x200u
// Index of each pixel local storage plane.
#define FRAMEBUFFER_PLANE_IDX 0
#define COVERAGE_PLANE_IDX 1
#define CLIP_PLANE_IDX 2
#define ORIGINAL_DST_COLOR_PLANE_IDX 3
// Index at which we access each resource.
#define TESS_VERTEX_TEXTURE_IDX 0
#define GRAD_TEXTURE_IDX 1
#define IMAGE_TEXTURE_IDX 2
#define PATH_BUFFER_IDX 3
#define PAINT_BUFFER_IDX 4
#define PAINT_AUX_BUFFER_IDX 5
#define CONTOUR_BUFFER_IDX 6
#define FLUSH_UNIFORM_BUFFER_IDX 7
#define PATH_BASE_INSTANCE_UNIFORM_BUFFER_IDX 8
#define IMAGE_DRAW_UNIFORM_BUFFER_IDX 9
#define DST_COLOR_TEXTURE_IDX 10
#define DEFAULT_BINDINGS_SET_SIZE 11
// Samplers are accessed at the same index as their corresponding texture, so we put them in a
// separate binding set.
#define SAMPLER_BINDINGS_SET 1
// PLS textures are accessed at the same index as their PLS planes, so we put them in a separate
// binding set.
#define PLS_TEXTURE_BINDINGS_SET 2
// acos(1/4), because the miter limit is always 4.
#define MITER_ANGLE_LIMIT float(1.318116071652817965746)
// Raw bit representation of the largest denormalized fp16 value. We offset all (1-based) path IDs
// by this value in order to avoid denorms, which have been empirically unreliable on Android as ID
// values.
#define MAX_DENORM_F16 1023u
// Blend modes. Mirrors rive::BlendMode, but 0-based and contiguous for tighter packing.
#define BLEND_SRC_OVER 0u
#define BLEND_MODE_SCREEN 1u
#define BLEND_MODE_OVERLAY 2u
#define BLEND_MODE_DARKEN 3u
#define BLEND_MODE_LIGHTEN 4u
#define BLEND_MODE_COLORDODGE 5u
#define BLEND_MODE_COLORBURN 6u
#define BLEND_MODE_HARDLIGHT 7u
#define BLEND_MODE_SOFTLIGHT 8u
#define BLEND_MODE_DIFFERENCE 9u
#define BLEND_MODE_EXCLUSION 10u
#define BLEND_MODE_MULTIPLY 11u
#define BLEND_MODE_HUE 12u
#define BLEND_MODE_SATURATION 13u
#define BLEND_MODE_COLOR 14u
#define BLEND_MODE_LUMINOSITY 15u
// Fixed-point coverage values for the experimental atomic mode.
// Atomic mode uses 7:9 fixed point, so the winding number breaks if a shape has more than 64
// levels of self overlap in either winding direction at any point.
#define FIXED_COVERAGE_FACTOR float(512)
#define FIXED_COVERAGE_INVERSE_FACTOR float(0.001953125)
#define FIXED_COVERAGE_ZERO float(1 << 15)
#define FIXED_COVERAGE_ONE (FIXED_COVERAGE_FACTOR + FIXED_COVERAGE_ZERO)
// Binding points for the experimental atomic mode storage buffers.
#define PAINT_STORAGE_BUFFER_IDX 8
#define PAINT_MATRIX_STORAGE_BUFFER_IDX 9
#define PAINT_TRANSLATE_STORAGE_BUFFER_IDX 10
#define CLIPRECT_MATRIX_STORAGE_BUFFER_IDX 11
#define CLIPRECT_TRANSLATE_STORAGE_BUFFER_IDX 12
// Flags for the experimental atomic mode.