blob: 599db9acbeceb626658dae010b33c66c41182240 [file] [log] [blame] [edit]
/*
* Copyright 2025 Rive
*/
// The EXT_shader_pixel_local_storage extension does not provide a mechanism to
// load, store, or clear pixel local storage contents. This shader provides
// mechanisms to clear and store when rendering the atlas via PLS (i.e., when
// floating point render targets are not supported).
// TODO: We should eventually use this shader to convert the atlas from gamma to
// linear as well, so we don't have to do that conversion for 4 different pixels
// every time we sample and bilerp the atlas.
#ifdef @VERTEX
VERTEX_MAIN(@atlasResolveVertexMain, Attrs, attrs, _vertexID, _instanceID)
{
// [-1, -1] .. [+1, +1]
float4 pos = float4(mix(float2(-1, 1),
float2(1, -1),
equal(_vertexID & int2(1, 2), int2(0))),
.0,
1.);
EMIT_VERTEX(pos);
}
#endif
#ifdef @FRAGMENT
#ifdef @CLEAR_COVERAGE
__pixel_local_outEXT PLS { layout(r32f) highp float _plsCoverage; };
#else
__pixel_local_inEXT PLS { layout(r32f) highp float _plsCoverage; };
layout(location = 0) out highp uvec4 _fragCoverage;
#endif
void main()
{
#ifdef @CLEAR_COVERAGE
_plsCoverage = .0;
#else
_fragCoverage.r = floatBitsToUint(_plsCoverage);
#endif
}
#endif // FRAGMENT