68 lines
2.1 KiB
GLSL
68 lines
2.1 KiB
GLSL
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
// This shader must remain compatible with ESSL 1, at least for the
|
|
// WR_FEATURE_TEXTURE_EXTERNAL_ESSL1 feature, so that it can be used to render
|
|
// video on GLES devices without GL_OES_EGL_image_external_essl3 support.
|
|
// This means we cannot use textureSize(), int inputs/outputs, etc.
|
|
|
|
#include shared
|
|
|
|
varying highp vec2 vUv;
|
|
flat varying highp vec4 vUvRect;
|
|
#ifdef WR_FEATURE_TEXTURE_EXTERNAL_ESSL1
|
|
uniform vec2 uTextureSize;
|
|
#endif
|
|
|
|
#ifdef WR_VERTEX_SHADER
|
|
|
|
PER_INSTANCE attribute vec4 aScaleTargetRect;
|
|
PER_INSTANCE attribute vec4 aScaleSourceRect;
|
|
PER_INSTANCE attribute float aSourceRectType;
|
|
|
|
void main(void) {
|
|
vec2 src_offset = aScaleSourceRect.xy;
|
|
vec2 src_size = aScaleSourceRect.zw - aScaleSourceRect.xy;
|
|
|
|
// The uvs may be inverted, so use the min and max for the bounds
|
|
vUvRect = vec4(min(aScaleSourceRect.xy, aScaleSourceRect.zw),
|
|
max(aScaleSourceRect.xy, aScaleSourceRect.zw));
|
|
vUv = (src_offset + src_size * aPosition.xy);
|
|
|
|
if (int(aSourceRectType) == UV_TYPE_UNNORMALIZED) {
|
|
vUvRect = vec4(vUvRect.xy + vec2(0.5), vUvRect.zw - vec2(0.5));
|
|
|
|
#ifdef WR_FEATURE_TEXTURE_RECT
|
|
// In WR_FEATURE_TEXTURE_RECT mode the UV coordinates used to sample
|
|
// from the texture should be unnormalized, so we leave them as is.
|
|
vec2 texture_size = vec2(1, 1);
|
|
#elif defined(WR_FEATURE_TEXTURE_EXTERNAL_ESSL1)
|
|
vec2 texture_size = uTextureSize;
|
|
#else
|
|
vec2 texture_size = vec2(TEX_SIZE(sColor0));
|
|
#endif
|
|
vUvRect /= texture_size.xyxy;
|
|
vUv /= texture_size;
|
|
}
|
|
|
|
vec2 pos = mix(aScaleTargetRect.xy, aScaleTargetRect.zw, aPosition.xy);
|
|
gl_Position = uTransform * vec4(pos, 0.0, 1.0);
|
|
}
|
|
|
|
#endif
|
|
|
|
#ifdef WR_FRAGMENT_SHADER
|
|
|
|
void main(void) {
|
|
vec2 st = clamp(vUv, vUvRect.xy, vUvRect.zw);
|
|
oFragColor = TEX_SAMPLE(sColor0, st);
|
|
}
|
|
|
|
#ifdef SWGL_DRAW_SPAN
|
|
void swgl_drawSpanRGBA8() {
|
|
swgl_commitTextureLinearRGBA8(sColor0, vUv, vUvRect);
|
|
}
|
|
#endif
|
|
|
|
#endif
|