|
@@ -1,5 +1,12 @@
|
|
|
|
|
|
-#ifdef USE_GLES_OVER_GL
|
|
|
|
|
|
+// Compatibility renames. These are exposed with the "godot_" prefix
|
|
|
|
+// to work around two distinct Adreno bugs:
|
|
|
|
+// 1. Some Adreno devices expose ES310 functions in ES300 shaders.
|
|
|
|
+// Internally, we must use the "godot_" prefix, but user shaders
|
|
|
|
+// will be mapped automatically.
|
|
|
|
+// 2. Adreno 3XX devices have poor implementations of the other packing
|
|
|
|
+// functions, so we just use our own everywhere to keep it simple.
|
|
|
|
+
|
|
// Floating point pack/unpack functions are part of the GLSL ES 300 specification used by web and mobile.
|
|
// Floating point pack/unpack functions are part of the GLSL ES 300 specification used by web and mobile.
|
|
uint float2half(uint f) {
|
|
uint float2half(uint f) {
|
|
uint e = f & uint(0x7f800000);
|
|
uint e = f & uint(0x7f800000);
|
|
@@ -17,40 +24,34 @@ uint half2float(uint h) {
|
|
return ((h & uint(0x8000)) << uint(16)) | uint((h_e >> uint(10)) != uint(0)) * (((h_e + uint(0x1c000)) << uint(13)) | ((h & uint(0x03ff)) << uint(13)));
|
|
return ((h & uint(0x8000)) << uint(16)) | uint((h_e >> uint(10)) != uint(0)) * (((h_e + uint(0x1c000)) << uint(13)) | ((h & uint(0x03ff)) << uint(13)));
|
|
}
|
|
}
|
|
|
|
|
|
-uint packHalf2x16(vec2 v) {
|
|
|
|
|
|
+uint godot_packHalf2x16(vec2 v) {
|
|
return float2half(floatBitsToUint(v.x)) | float2half(floatBitsToUint(v.y)) << uint(16);
|
|
return float2half(floatBitsToUint(v.x)) | float2half(floatBitsToUint(v.y)) << uint(16);
|
|
}
|
|
}
|
|
|
|
|
|
-vec2 unpackHalf2x16(uint v) {
|
|
|
|
|
|
+vec2 godot_unpackHalf2x16(uint v) {
|
|
return vec2(uintBitsToFloat(half2float(v & uint(0xffff))),
|
|
return vec2(uintBitsToFloat(half2float(v & uint(0xffff))),
|
|
uintBitsToFloat(half2float(v >> uint(16))));
|
|
uintBitsToFloat(half2float(v >> uint(16))));
|
|
}
|
|
}
|
|
|
|
|
|
-uint packUnorm2x16(vec2 v) {
|
|
|
|
|
|
+uint godot_packUnorm2x16(vec2 v) {
|
|
uvec2 uv = uvec2(round(clamp(v, vec2(0.0), vec2(1.0)) * 65535.0));
|
|
uvec2 uv = uvec2(round(clamp(v, vec2(0.0), vec2(1.0)) * 65535.0));
|
|
return uv.x | uv.y << uint(16);
|
|
return uv.x | uv.y << uint(16);
|
|
}
|
|
}
|
|
|
|
|
|
-vec2 unpackUnorm2x16(uint p) {
|
|
|
|
|
|
+vec2 godot_unpackUnorm2x16(uint p) {
|
|
return vec2(float(p & uint(0xffff)), float(p >> uint(16))) * 0.000015259021; // 1.0 / 65535.0 optimization
|
|
return vec2(float(p & uint(0xffff)), float(p >> uint(16))) * 0.000015259021; // 1.0 / 65535.0 optimization
|
|
}
|
|
}
|
|
|
|
|
|
-uint packSnorm2x16(vec2 v) {
|
|
|
|
|
|
+uint godot_packSnorm2x16(vec2 v) {
|
|
uvec2 uv = uvec2(round(clamp(v, vec2(-1.0), vec2(1.0)) * 32767.0) + 32767.0);
|
|
uvec2 uv = uvec2(round(clamp(v, vec2(-1.0), vec2(1.0)) * 32767.0) + 32767.0);
|
|
return uv.x | uv.y << uint(16);
|
|
return uv.x | uv.y << uint(16);
|
|
}
|
|
}
|
|
|
|
|
|
-vec2 unpackSnorm2x16(uint p) {
|
|
|
|
|
|
+vec2 godot_unpackSnorm2x16(uint p) {
|
|
vec2 v = vec2(float(p & uint(0xffff)), float(p >> uint(16)));
|
|
vec2 v = vec2(float(p & uint(0xffff)), float(p >> uint(16)));
|
|
return clamp((v - 32767.0) * vec2(0.00003051851), vec2(-1.0), vec2(1.0));
|
|
return clamp((v - 32767.0) * vec2(0.00003051851), vec2(-1.0), vec2(1.0));
|
|
}
|
|
}
|
|
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-// Compatibility renames. These are exposed with the "godot_" prefix
|
|
|
|
-// to work around an Adreno bug which was exposing these ES310 functions
|
|
|
|
-// in ES300 shaders. Internally, we must use the "godot_" prefix, but user shaders
|
|
|
|
-// will be mapped automatically.
|
|
|
|
uint godot_packUnorm4x8(vec4 v) {
|
|
uint godot_packUnorm4x8(vec4 v) {
|
|
uvec4 uv = uvec4(round(clamp(v, vec4(0.0), vec4(1.0)) * 255.0));
|
|
uvec4 uv = uvec4(round(clamp(v, vec4(0.0), vec4(1.0)) * 255.0));
|
|
return uv.x | (uv.y << uint(8)) | (uv.z << uint(16)) | (uv.w << uint(24));
|
|
return uv.x | (uv.y << uint(8)) | (uv.z << uint(16)) | (uv.w << uint(24));
|
|
@@ -74,3 +75,9 @@ vec4 godot_unpackSnorm4x8(uint p) {
|
|
#define unpackUnorm4x8 godot_unpackUnorm4x8
|
|
#define unpackUnorm4x8 godot_unpackUnorm4x8
|
|
#define packSnorm4x8 godot_packSnorm4x8
|
|
#define packSnorm4x8 godot_packSnorm4x8
|
|
#define unpackSnorm4x8 godot_unpackSnorm4x8
|
|
#define unpackSnorm4x8 godot_unpackSnorm4x8
|
|
|
|
+#define packHalf2x16 godot_packHalf2x16
|
|
|
|
+#define unpackHalf2x16 godot_unpackHalf2x16
|
|
|
|
+#define packUnorm2x16 godot_packUnorm2x16
|
|
|
|
+#define unpackUnorm2x16 godot_unpackUnorm2x16
|
|
|
|
+#define packSnorm2x16 godot_packSnorm2x16
|
|
|
|
+#define unpackSnorm2x16 godot_unpackSnorm2x16
|