void blending(context_t* c, pixel_t* fragment, pixel_t* fb) { rescale(fragment->c[0], fragment->s[0], fb->c[0], fb->s[0]); rescale(fragment->c[1], fragment->s[1], fb->c[1], fb->s[1]); rescale(fragment->c[2], fragment->s[2], fb->c[2], fb->s[2]); rescale(fragment->c[3], fragment->s[3], fb->c[3], fb->s[3]); pixel_t sf, df; blend_factor(c, &sf, c->state.blend.src, fragment, fb); blend_factor(c, &df, c->state.blend.dst, fragment, fb); fragment->c[1] = gglMulAddx(fragment->c[1], sf.c[1], gglMulx(fb->c[1], df.c[1])); fragment->c[2] = gglMulAddx(fragment->c[2], sf.c[2], gglMulx(fb->c[2], df.c[2])); fragment->c[3] = gglMulAddx(fragment->c[3], sf.c[3], gglMulx(fb->c[3], df.c[3])); if (c->state.blend.alpha_separate) { blend_factor(c, &sf, c->state.blend.src_alpha, fragment, fb); blend_factor(c, &df, c->state.blend.dst_alpha, fragment, fb); } fragment->c[0] = gglMulAddx(fragment->c[0], sf.c[0], gglMulx(fb->c[0], df.c[0])); // clamp to 1.0 if (fragment->c[0] >= (1LU<<fragment->s[0])) fragment->c[0] = (1<<fragment->s[0])-1; if (fragment->c[1] >= (1LU<<fragment->s[1])) fragment->c[1] = (1<<fragment->s[1])-1; if (fragment->c[2] >= (1LU<<fragment->s[2])) fragment->c[2] = (1<<fragment->s[2])-1; if (fragment->c[3] >= (1LU<<fragment->s[3])) fragment->c[3] = (1<<fragment->s[3])-1; }
static inline void vmul3(GLfixed* d, const GLfixed* m0, const GLfixed* m1) { d[0] = gglMulx(m0[0], m1[0]); d[1] = gglMulx(m0[1], m1[1]); d[2] = gglMulx(m0[2], m1[2]); }
static inline void vscale3(GLfixed* d, const GLfixed* m, GLfixed s) { d[0] = gglMulx(m[0], s); d[1] = gglMulx(m[1], s); d[2] = gglMulx(m[2], s); }
static GLfixed fog_exp2(ogles_context_t* c, GLfixed z) { const float e = fixedToFloat(gglMulx(c->fog.density, z)); return clampF(gglFloatToFixed(fastexpf(-e*e))); }
static GLfixed fog_linear(ogles_context_t* c, GLfixed z) { return clampF(gglMulx((c->fog.end - ((z<0)?-z:z)), c->fog.invEndMinusStart)); }