// static branches, good for ATI, indifferently for NVidia
vec4 Blend(in vec4 src, in vec4 dst, in vec2 blend)
{
	vec4 s, d;

	// source factor
//if (blend.x == 2.0)						// GLS_SRCBLEND_ONE (default)
	s = src;		// shut up compiler :(
	if (blend.x == 1.0)	s = vec4(0.0);			// GLS_SRCBLEND_ZERO
	if (blend.x == 3.0)	s = src * dst;			// GLS_SRCBLEND_DST_COLOR
	if (blend.x == 4.0)	s = src * (1.0 - dst);		// GLS_SRCBLEND_ONE_MINUS_DST_COLOR
	if (blend.x == 5.0)	s = src * src.a;		// GLS_SRCBLEND_SRC_ALPHA
	if (blend.x == 6.0)	s = src * (1.0 - src.a);	// GLS_SRCBLEND_ONE_MINUS_SRC_ALPHA
	if (blend.x == 7.0)	s = src * dst.a;		// GLS_SRCBLEND_DST_ALPHA
	if (blend.x == 8.0)	s = src * (1.0 - dst.a);	// GLS_SRCBLEND_ONE_MINUS_DST_ALPHA
	if (blend.x == 9.0)	s = vec4(src.rgb * min(src.a, 1.0 - dst.a), 1.0);	// GLS_SRCBLEND_ALPHA_SATURATE

	// destination factor
//if (blend.y == 1.0)						// GLS_DSTBLEND_ZERO (default)
	d = vec4(0.0);	// shut up compiler :(
	if (blend.y == 2.0)	d = dst;			// GLS_DSTBLEND_ONE
	if (blend.y == 3.0)	d = dst * src;			// GLS_DSTBLEND_SRC_COLOR
	if (blend.y == 4.0)	d = dst * (1.0 - src);		// GLS_DSTBLEND_ONE_MINUS_SRC_COLOR
	if (blend.y == 5.0)	d = dst * src.a;		// GLS_DSTBLEND_SRC_ALPHA
	if (blend.y == 6.0)	d = dst * (1.0 - src.a);	// GLS_DSTBLEND_ONE_MINUS_SRC_ALPHA
	if (blend.y == 7.0)	d = dst * dst.a;		// GLS_DSTBLEND_DST_ALPHA
	if (blend.y == 8.0)	d = dst * (1.0 - dst.a);	// GLS_DSTBLEND_ONE_MINUS_DST_ALPHA

	// blend
	return clamp(s + d, 0.0, 1.0);
}
