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