| /* |
| * Copyright 2023 Rive |
| */ |
| |
| #ifdef @VERTEX |
| ATTR_BLOCK_BEGIN(PositionAttr) |
| ATTR(0, float2, @a_position); |
| ATTR_BLOCK_END |
| |
| ATTR_BLOCK_BEGIN(UVAttr) |
| ATTR(1, float2, @a_texCoord); |
| ATTR_BLOCK_END |
| #endif |
| |
| VARYING_BLOCK_BEGIN |
| NO_PERSPECTIVE VARYING(0, float2, v_texCoord); |
| #ifdef @ENABLE_CLIPPING |
| @OPTIONALLY_FLAT VARYING(1, half, v_clipID); |
| #endif |
| #ifdef @ENABLE_CLIP_RECT |
| NO_PERSPECTIVE VARYING(2, float4, v_clipRect); |
| #endif |
| VARYING_BLOCK_END |
| |
| #ifdef @VERTEX |
| VERTEX_TEXTURE_BLOCK_BEGIN |
| VERTEX_TEXTURE_BLOCK_END |
| |
| IMAGE_MESH_VERTEX_MAIN(@drawVertexMain, PositionAttr, position, UVAttr, uv, _vertexID) |
| { |
| ATTR_UNPACK(_vertexID, position, @a_position, float2); |
| ATTR_UNPACK(_vertexID, uv, @a_texCoord, float2); |
| |
| VARYING_INIT(v_texCoord, float2); |
| #ifdef @ENABLE_CLIPPING |
| VARYING_INIT(v_clipID, half); |
| #endif |
| #ifdef @ENABLE_CLIP_RECT |
| VARYING_INIT(v_clipRect, float4); |
| #endif |
| |
| float2 vertexPosition = |
| MUL(make_float2x2(imageDrawUniforms.viewMatrix), @a_position) + imageDrawUniforms.translate; |
| v_texCoord = @a_texCoord; |
| #ifdef @ENABLE_CLIPPING |
| v_clipID = id_bits_to_f16(imageDrawUniforms.clipID, uniforms.pathIDGranularity); |
| #endif |
| #ifdef @ENABLE_CLIP_RECT |
| #ifndef @USING_DEPTH_STENCIL |
| v_clipRect = |
| find_clip_rect_coverage_distances(make_float2x2(imageDrawUniforms.clipRectInverseMatrix), |
| imageDrawUniforms.clipRectInverseTranslate, |
| vertexPosition); |
| #else // USING_DEPTH_STENCIL |
| set_clip_rect_plane_distances(make_float2x2(imageDrawUniforms.clipRectInverseMatrix), |
| imageDrawUniforms.clipRectInverseTranslate, |
| vertexPosition); |
| #endif // USING_DEPTH_STENCIL |
| #endif // ENABLE_CLIP_RECT |
| float4 pos = RENDER_TARGET_COORD_TO_CLIP_COORD(vertexPosition); |
| #ifdef @USING_DEPTH_STENCIL |
| pos.z = normalize_z_index(imageDrawUniforms.zIndex); |
| #endif |
| |
| VARYING_PACK(v_texCoord); |
| #ifdef @ENABLE_CLIPPING |
| VARYING_PACK(v_clipID); |
| #endif |
| #ifdef @ENABLE_CLIP_RECT |
| VARYING_PACK(v_clipRect); |
| #endif |
| EMIT_VERTEX(pos); |
| } |
| #endif |
| |
| #ifdef @FRAGMENT |
| FRAG_TEXTURE_BLOCK_BEGIN |
| TEXTURE_RGBA8(IMAGE_TEXTURE_IDX, @imageTexture); |
| #ifdef @USING_DEPTH_STENCIL |
| #ifdef @ENABLE_ADVANCED_BLEND |
| TEXTURE_RGBA8(DST_COLOR_TEXTURE_IDX, @dstColorTexture); |
| #endif |
| #endif |
| FRAG_TEXTURE_BLOCK_END |
| |
| SAMPLER_MIPMAP(IMAGE_TEXTURE_IDX, imageSampler) |
| |
| FRAG_STORAGE_BUFFER_BLOCK_BEGIN |
| FRAG_STORAGE_BUFFER_BLOCK_END |
| |
| #ifndef @USING_DEPTH_STENCIL |
| |
| PLS_BLOCK_BEGIN |
| PLS_DECL4F(FRAMEBUFFER_PLANE_IDX, framebuffer); |
| PLS_DECLUI(COVERAGE_PLANE_IDX, coverageCountBuffer); |
| PLS_DECLUI(CLIP_PLANE_IDX, clipBuffer); |
| PLS_DECL4F(ORIGINAL_DST_COLOR_PLANE_IDX, originalDstColorBuffer); |
| PLS_BLOCK_END |
| |
| PLS_MAIN_WITH_IMAGE_UNIFORMS(@drawFragmentMain) |
| { |
| VARYING_UNPACK(v_texCoord, float2); |
| #ifdef @ENABLE_CLIPPING |
| VARYING_UNPACK(v_clipID, half); |
| #endif |
| #ifdef @ENABLE_CLIP_RECT |
| VARYING_UNPACK(v_clipRect, float4); |
| #endif |
| |
| half4 color = TEXTURE_SAMPLE(@imageTexture, imageSampler, v_texCoord); |
| half coverage = 1.; |
| |
| #ifdef @ENABLE_CLIP_RECT |
| half clipRectCoverage = min_value(make_half4(v_clipRect)); |
| coverage = clamp(clipRectCoverage, make_half(0), coverage); |
| #endif |
| |
| PLS_INTERLOCK_BEGIN; |
| |
| #ifdef @ENABLE_CLIPPING |
| if (v_clipID != .0) |
| { |
| half2 clipData = unpackHalf2x16(PLS_LOADUI(clipBuffer)); |
| half clipContentID = clipData.g; |
| half clipCoverage = clipContentID == v_clipID ? clipData.r : make_half(0); |
| coverage = min(coverage, clipCoverage); |
| } |
| #endif |
| |
| // Blend with the framebuffer color. |
| color.a *= imageDrawUniforms.opacity * coverage; |
| half4 dstColor = PLS_LOAD4F(framebuffer); |
| #ifdef @ENABLE_ADVANCED_BLEND |
| if (imageDrawUniforms.blendMode != 0u /*!srcOver*/) |
| { |
| #ifdef @ENABLE_HSL_BLEND_MODES |
| color = advanced_hsl_blend( |
| #else |
| color = advanced_blend( |
| #endif |
| color, |
| unmultiply(dstColor), |
| make_ushort(imageDrawUniforms.blendMode)); |
| } |
| else |
| #endif |
| { |
| color.rgb *= color.a; |
| color = color + dstColor * (1. - color.a); |
| } |
| |
| PLS_STORE4F(framebuffer, color); |
| PLS_PRESERVE_VALUE(coverageCountBuffer); |
| PLS_PRESERVE_VALUE(clipBuffer); |
| |
| PLS_INTERLOCK_END; |
| |
| EMIT_PLS; |
| } |
| |
| #else // USING_DEPTH_STENCIL |
| |
| FRAG_DATA_MAIN(half4, @drawFragmentMain) |
| { |
| VARYING_UNPACK(v_texCoord, float2); |
| |
| half4 color = TEXTURE_SAMPLE(@imageTexture, imageSampler, v_texCoord); |
| color.a *= imageDrawUniforms.opacity; |
| |
| #ifdef @ENABLE_ADVANCED_BLEND |
| half4 dstColor = TEXEL_FETCH(@dstColorTexture, int2(floor(_fragCoord.xy))); |
| #ifdef @ENABLE_HSL_BLEND_MODES |
| color = advanced_hsl_blend( |
| #else |
| color = advanced_blend( |
| #endif |
| color, |
| unmultiply(dstColor), |
| make_ushort(imageDrawUniforms.blendMode)); |
| #else // !ENABLE_ADVANCED_BLEND |
| color = premultiply(color); |
| #endif |
| |
| EMIT_FRAG_DATA(color); |
| } |
| |
| #endif // USING_DEPTH_STENCIL |
| #endif // FRAGMENT |