| /* |
| * 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. |