Add GL_OES_EGL_image_external_essl3

Bug b/120382288

Change-Id: I506920a1ff5f68c2ece7c3e8327525c0bd5609ce
Reviewed-on: https://swiftshader-review.googlesource.com/c/23889
Tested-by: Lingfeng Yang <lfy@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/OpenGL/compiler/Compiler.cpp b/src/OpenGL/compiler/Compiler.cpp
index ae93385..38446dc 100644
--- a/src/OpenGL/compiler/Compiler.cpp
+++ b/src/OpenGL/compiler/Compiler.cpp
@@ -66,6 +66,7 @@
 	OES_standard_derivatives = 0;
 	OES_fragment_precision_high = 0;
 	OES_EGL_image_external = 0;
+	OES_EGL_image_external_essl3 = 0;
 
 	MaxCallStackDepth = UINT_MAX;
 }
diff --git a/src/OpenGL/compiler/Compiler.h b/src/OpenGL/compiler/Compiler.h
index c778626..dbb3e5e 100644
--- a/src/OpenGL/compiler/Compiler.h
+++ b/src/OpenGL/compiler/Compiler.h
@@ -57,6 +57,7 @@
 	int OES_standard_derivatives;
 	int OES_fragment_precision_high;
 	int OES_EGL_image_external;
+	int OES_EGL_image_external_essl3;
 	int EXT_draw_buffers;
 	int ARB_texture_rectangle;
 
diff --git a/src/OpenGL/compiler/Initialize.cpp b/src/OpenGL/compiler/Initialize.cpp
index 23bc792..49fb335 100644
--- a/src/OpenGL/compiler/Initialize.cpp
+++ b/src/OpenGL/compiler/Initialize.cpp
@@ -265,6 +265,18 @@
 		symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture3D", samplerExternalOES, float3);
 	}
 
+	if(resources.OES_EGL_image_external_essl3)
+    {
+        TType *samplerExternalOES = new TType(EbtSamplerExternalOES);
+
+        symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "texture", samplerExternalOES, float2);
+        symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "textureProj", samplerExternalOES, float3);
+        symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "textureProj", samplerExternalOES, float4);
+
+        symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize", samplerExternalOES, int1);
+        symbolTable.insertBuiltIn(ESSL3_BUILTINS, float4, "texelFetch", samplerExternalOES, int2, int1);
+    }
+
 	if(type == GL_FRAGMENT_SHADER)
 	{
 		symbolTable.insertBuiltIn(ESSL1_BUILTINS, float4, "texture2D", sampler2D, float2, float1);
@@ -513,6 +525,8 @@
 		extBehavior["GL_FRAGMENT_PRECISION_HIGH"] = EBhUndefined;
 	if(resources.OES_EGL_image_external)
 		extBehavior["GL_OES_EGL_image_external"] = EBhUndefined;
+	if(resources.OES_EGL_image_external_essl3)
+		extBehavior["GL_OES_EGL_image_external_essl3"] = EBhUndefined;
 	if(resources.EXT_draw_buffers)
 		extBehavior["GL_EXT_draw_buffers"] = EBhUndefined;
 	if(resources.ARB_texture_rectangle)
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index a62f82a..2cee54e 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -4464,6 +4464,7 @@
 		"GL_OES_depth_texture_cube_map",
 		"GL_OES_EGL_image",
 		"GL_OES_EGL_image_external",
+		"GL_OES_EGL_image_external_essl3", // client version is always 3, so this is fine
 		"GL_OES_EGL_sync",
 		"GL_OES_element_index_uint",
 		"GL_OES_fbo_render_mipmap",
diff --git a/src/OpenGL/libGLESv2/Shader.cpp b/src/OpenGL/libGLESv2/Shader.cpp
index 355e6cc..1b77941 100644
--- a/src/OpenGL/libGLESv2/Shader.cpp
+++ b/src/OpenGL/libGLESv2/Shader.cpp
@@ -180,6 +180,7 @@
 	resources.OES_standard_derivatives = 1;
 	resources.OES_fragment_precision_high = 1;
 	resources.OES_EGL_image_external = 1;
+	resources.OES_EGL_image_external_essl3 = 1;
 	resources.EXT_draw_buffers = 1;
 	resources.ARB_texture_rectangle = 1;
 	resources.MaxCallStackDepth = 64;
diff --git a/tests/fuzzers/VertexRoutineFuzzer.cpp b/tests/fuzzers/VertexRoutineFuzzer.cpp
index dd82b65..43423fc 100644
--- a/tests/fuzzers/VertexRoutineFuzzer.cpp
+++ b/tests/fuzzers/VertexRoutineFuzzer.cpp
@@ -118,6 +118,7 @@
 	resources.OES_standard_derivatives = 1;
 	resources.OES_fragment_precision_high = 1;
 	resources.OES_EGL_image_external = 1;
+	resources.OES_EGL_image_external_essl3 = 1;
 	resources.EXT_draw_buffers = 1;
 	resources.ARB_texture_rectangle = 1;
 	resources.MaxCallStackDepth = 16;
@@ -233,4 +234,4 @@
 
 	return 0;
 }
-#endif
\ No newline at end of file
+#endif