ES31: Implement creation and attaching geometry shader on OpenGL

This patch intends to implement the creation of a geometry shader
and attaching a geometry shader to a program on OpenGL back-ends.

This patch also adds all geometry shader related dEQP-GLES31 test
failures to deqp_gles31_test_expectations.txt.

BUG=angleproject:1941
TEST=angle_end2end_tests

Change-Id: Ib0b497030255b15dacd967e48bc59eef0009af46
Reviewed-on: https://chromium-review.googlesource.com/757979
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/include/GLSLANG/ShaderLang.h b/include/GLSLANG/ShaderLang.h
index 2420426..14c50c0 100644
--- a/include/GLSLANG/ShaderLang.h
+++ b/include/GLSLANG/ShaderLang.h
@@ -598,6 +598,11 @@
 // Note that the map contains also registers of samplers that have been extracted from structs.
 const std::map<std::string, unsigned int> *GetUniformRegisterMap(const ShHandle handle);
 
+GLenum GetGeometryShaderInputPrimitiveType(const ShHandle handle);
+GLenum GetGeometryShaderOutputPrimitiveType(const ShHandle handle);
+int GetGeometryShaderInvocations(const ShHandle handle);
+int GetGeometryShaderMaxVertices(const ShHandle handle);
+
 }  // namespace sh
 
 #endif // GLSLANG_SHADERLANG_H_
diff --git a/src/compiler/translator/ShaderLang.cpp b/src/compiler/translator/ShaderLang.cpp
index 003c40f..fabce78 100644
--- a/src/compiler/translator/ShaderLang.cpp
+++ b/src/compiler/translator/ShaderLang.cpp
@@ -112,6 +112,35 @@
 }
 #endif  // ANGLE_ENABLE_HLSL
 
+GLenum GetGeometryShaderPrimitiveTypeEnum(sh::TLayoutPrimitiveType primitiveType)
+{
+    switch (primitiveType)
+    {
+        case EptPoints:
+            return GL_POINTS;
+        case EptLines:
+            return GL_LINES;
+        case EptLinesAdjacency:
+            return GL_LINES_ADJACENCY_EXT;
+        case EptTriangles:
+            return GL_TRIANGLES;
+        case EptTrianglesAdjacency:
+            return GL_TRIANGLES_ADJACENCY_EXT;
+
+        case EptLineStrip:
+            return GL_LINE_STRIP;
+        case EptTriangleStrip:
+            return GL_TRIANGLE_STRIP;
+
+        case EptUndefined:
+            return GL_INVALID_VALUE;
+
+        default:
+            UNREACHABLE();
+            return GL_INVALID_VALUE;
+    }
+}
+
 }  // anonymous namespace
 
 //
@@ -501,4 +530,48 @@
 #endif  // ANGLE_ENABLE_HLSL
 }
 
+GLenum GetGeometryShaderInputPrimitiveType(const ShHandle handle)
+{
+    ASSERT(handle);
+
+    TShHandleBase *base = static_cast<TShHandleBase *>(handle);
+    TCompiler *compiler = base->getAsCompiler();
+    ASSERT(compiler);
+
+    return GetGeometryShaderPrimitiveTypeEnum(compiler->getGeometryShaderInputPrimitiveType());
+}
+
+GLenum GetGeometryShaderOutputPrimitiveType(const ShHandle handle)
+{
+    ASSERT(handle);
+
+    TShHandleBase *base = static_cast<TShHandleBase *>(handle);
+    TCompiler *compiler = base->getAsCompiler();
+    ASSERT(compiler);
+
+    return GetGeometryShaderPrimitiveTypeEnum(compiler->getGeometryShaderOutputPrimitiveType());
+}
+
+int GetGeometryShaderInvocations(const ShHandle handle)
+{
+    ASSERT(handle);
+
+    TShHandleBase *base = static_cast<TShHandleBase *>(handle);
+    TCompiler *compiler = base->getAsCompiler();
+    ASSERT(compiler);
+
+    return compiler->getGeometryShaderInvocations();
+}
+
+int GetGeometryShaderMaxVertices(const ShHandle handle)
+{
+    ASSERT(handle);
+
+    TShHandleBase *base = static_cast<TShHandleBase *>(handle);
+    TCompiler *compiler = base->getAsCompiler();
+    ASSERT(compiler);
+
+    return compiler->getGeometryShaderMaxVertices();
+}
+
 }  // namespace sh
diff --git a/src/libANGLE/Caps.cpp b/src/libANGLE/Caps.cpp
index 77f4e0b..5a78d8d 100644
--- a/src/libANGLE/Caps.cpp
+++ b/src/libANGLE/Caps.cpp
@@ -223,7 +223,10 @@
       clientArrays(false),
       robustResourceInitialization(false),
       programCacheControl(false),
-      textureRectangle(false)
+      textureRectangle(false),
+      geometryShader(false),
+      maxGeometryOutputVertices(0),
+      maxGeometryShaderInvocations(0)
 {
 }
 
@@ -691,6 +694,7 @@
         map["GL_ANGLE_robust_resource_initialization"] = esOnlyExtension(&Extensions::robustResourceInitialization);
         map["GL_ANGLE_program_cache_control"] = esOnlyExtension(&Extensions::programCacheControl);
         map["GL_ANGLE_texture_rectangle"] = enableableExtension(&Extensions::textureRectangle);
+        map["GL_EXT_geometry_shader"] = enableableExtension(&Extensions::geometryShader);
         // clang-format on
 
         return map;
@@ -840,7 +844,6 @@
 
       // Table 20.49
       maxSamples(0)
-
 {
     for (size_t i = 0; i < 3; ++i)
     {
diff --git a/src/libANGLE/Caps.h b/src/libANGLE/Caps.h
index e3942b0..2569597 100644
--- a/src/libANGLE/Caps.h
+++ b/src/libANGLE/Caps.h
@@ -368,6 +368,14 @@
 
     // GL_ANGLE_texture_rectangle
     bool textureRectangle;
+
+    // GL_EXT_geometry_shader
+    bool geometryShader;
+    // GL_EXT_geometry_shader (May 31, 2016) Table 20.43gs: Implementation dependent geometry shader
+    // limits
+    // TODO(jiawei.shao@intel.com): add all implementation dependent geometry shader limits.
+    GLuint maxGeometryOutputVertices;
+    GLuint maxGeometryShaderInvocations;
 };
 
 struct ExtensionInfo
diff --git a/src/libANGLE/Compiler.cpp b/src/libANGLE/Compiler.cpp
index 3baa75c..236c7e1 100644
--- a/src/libANGLE/Compiler.cpp
+++ b/src/libANGLE/Compiler.cpp
@@ -50,7 +50,8 @@
       mResources(),
       mFragmentCompiler(nullptr),
       mVertexCompiler(nullptr),
-      mComputeCompiler(nullptr)
+      mComputeCompiler(nullptr),
+      mGeometryCompiler(nullptr)
 {
     ASSERT(state.getClientMajorVersion() == 2 || state.getClientMajorVersion() == 3);
 
@@ -129,6 +130,12 @@
     {
         mResources.MaxDrawBuffers = 1;
     }
+
+    // Geometry Shader constants
+    mResources.OES_geometry_shader = extensions.geometryShader;
+    // TODO(jiawei.shao@intel.com): initialize all implementation dependent geometry shader limits.
+    mResources.MaxGeometryOutputVertices    = extensions.maxGeometryOutputVertices;
+    mResources.MaxGeometryShaderInvocations = extensions.maxGeometryShaderInvocations;
 }
 
 Compiler::~Compiler()
@@ -183,6 +190,9 @@
         case GL_COMPUTE_SHADER:
             compiler = &mComputeCompiler;
             break;
+        case GL_GEOMETRY_SHADER_EXT:
+            compiler = &mGeometryCompiler;
+            break;
         default:
             UNREACHABLE();
             return nullptr;
diff --git a/src/libANGLE/Compiler.h b/src/libANGLE/Compiler.h
index f3582b2..b7f7e9f 100644
--- a/src/libANGLE/Compiler.h
+++ b/src/libANGLE/Compiler.h
@@ -43,6 +43,7 @@
     ShHandle mFragmentCompiler;
     ShHandle mVertexCompiler;
     ShHandle mComputeCompiler;
+    ShHandle mGeometryCompiler;
 };
 
 }  // namespace gl
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index 2300db8..930f6b6 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -2535,6 +2535,12 @@
         mExtensions.maxViews              = 1u;
     }
 
+    if (getClientVersion() < ES_3_1)
+    {
+        // Disable ES3.1+ extensions
+        mExtensions.geometryShader = false;
+    }
+
     if (getClientVersion() > Version(2, 0))
     {
         // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
diff --git a/src/libANGLE/Program.cpp b/src/libANGLE/Program.cpp
index ce40175..8296d50 100644
--- a/src/libANGLE/Program.cpp
+++ b/src/libANGLE/Program.cpp
@@ -430,6 +430,7 @@
       mAttachedFragmentShader(nullptr),
       mAttachedVertexShader(nullptr),
       mAttachedComputeShader(nullptr),
+      mAttachedGeometryShader(nullptr),
       mTransformFeedbackBufferMode(GL_INTERLEAVED_ATTRIBS),
       mMaxActiveAttribLocation(0),
       mSamplerUniformRange(0, 0),
@@ -443,7 +444,8 @@
 
 ProgramState::~ProgramState()
 {
-    ASSERT(!mAttachedVertexShader && !mAttachedFragmentShader && !mAttachedComputeShader);
+    ASSERT(!mAttachedVertexShader && !mAttachedFragmentShader && !mAttachedComputeShader &&
+           !mAttachedGeometryShader);
 }
 
 const std::string &ProgramState::getLabel()
@@ -541,10 +543,16 @@
         mState.mAttachedComputeShader = nullptr;
     }
 
+    if (mState.mAttachedGeometryShader != nullptr)
+    {
+        mState.mAttachedGeometryShader->release(context);
+        mState.mAttachedGeometryShader = nullptr;
+    }
+
     mProgram->destroy(context);
 
     ASSERT(!mState.mAttachedVertexShader && !mState.mAttachedFragmentShader &&
-           !mState.mAttachedComputeShader);
+           !mState.mAttachedComputeShader && !mState.mAttachedGeometryShader);
     SafeDelete(mProgram);
 
     delete this;
@@ -585,6 +593,13 @@
             mState.mAttachedComputeShader->addRef();
             break;
         }
+        case GL_GEOMETRY_SHADER_EXT:
+        {
+            ASSERT(!mState.mAttachedGeometryShader);
+            mState.mAttachedGeometryShader = shader;
+            mState.mAttachedGeometryShader->addRef();
+            break;
+        }
         default:
             UNREACHABLE();
     }
@@ -615,6 +630,13 @@
             mState.mAttachedComputeShader = nullptr;
             break;
         }
+        case GL_GEOMETRY_SHADER_EXT:
+        {
+            ASSERT(mState.mAttachedGeometryShader == shader);
+            shader->release(context);
+            mState.mAttachedGeometryShader = nullptr;
+            break;
+        }
         default:
             UNREACHABLE();
     }
@@ -623,7 +645,7 @@
 int Program::getAttachedShadersCount() const
 {
     return (mState.mAttachedVertexShader ? 1 : 0) + (mState.mAttachedFragmentShader ? 1 : 0) +
-           (mState.mAttachedComputeShader ? 1 : 0);
+           (mState.mAttachedComputeShader ? 1 : 0) + (mState.mAttachedGeometryShader ? 1 : 0);
 }
 
 void Program::bindAttributeLocation(GLuint index, const char *name)
@@ -1119,6 +1141,15 @@
         }
     }
 
+    if (mState.mAttachedGeometryShader)
+    {
+        if (total < maxCount)
+        {
+            shaders[total] = mState.mAttachedGeometryShader->getHandle();
+            total++;
+        }
+    }
+
     if (count)
     {
         *count = total;
diff --git a/src/libANGLE/Program.h b/src/libANGLE/Program.h
index 1a33b3f..0b50e15 100644
--- a/src/libANGLE/Program.h
+++ b/src/libANGLE/Program.h
@@ -241,6 +241,7 @@
     Shader *getAttachedVertexShader() const { return mAttachedVertexShader; }
     Shader *getAttachedFragmentShader() const { return mAttachedFragmentShader; }
     Shader *getAttachedComputeShader() const { return mAttachedComputeShader; }
+    Shader *getAttachedGeometryShader() const { return mAttachedGeometryShader; }
     const std::vector<std::string> &getTransformFeedbackVaryingNames() const
     {
         return mTransformFeedbackVaryingNames;
@@ -316,6 +317,7 @@
     Shader *mAttachedFragmentShader;
     Shader *mAttachedVertexShader;
     Shader *mAttachedComputeShader;
+    Shader *mAttachedGeometryShader;
 
     std::vector<std::string> mTransformFeedbackVaryingNames;
     std::vector<TransformFeedbackVarying> mLinkedTransformFeedbackVaryings;
@@ -392,6 +394,7 @@
     const Shader *getAttachedVertexShader() const { return mState.mAttachedVertexShader; }
     const Shader *getAttachedFragmentShader() const { return mState.mAttachedFragmentShader; }
     const Shader *getAttachedComputeShader() const { return mState.mAttachedComputeShader; }
+    const Shader *getAttachedGeometryShader() const { return mState.mAttachedGeometryShader; }
 
     void bindAttributeLocation(GLuint index, const char *name);
     void bindUniformLocation(GLuint index, const char *name);
diff --git a/src/libANGLE/ResourceManager.cpp b/src/libANGLE/ResourceManager.cpp
index 6ac66fd..1b7e966 100644
--- a/src/libANGLE/ResourceManager.cpp
+++ b/src/libANGLE/ResourceManager.cpp
@@ -159,7 +159,8 @@
                                           const gl::Limitations &rendererLimitations,
                                           GLenum type)
 {
-    ASSERT(type == GL_VERTEX_SHADER || type == GL_FRAGMENT_SHADER || type == GL_COMPUTE_SHADER);
+    ASSERT(type == GL_VERTEX_SHADER || type == GL_FRAGMENT_SHADER || type == GL_COMPUTE_SHADER ||
+           type == GL_GEOMETRY_SHADER_EXT);
     GLuint handle    = mHandleAllocator.allocate();
     mShaders.assign(handle, new Shader(this, factory, rendererLimitations, type, handle));
     return handle;
diff --git a/src/libANGLE/Shader.cpp b/src/libANGLE/Shader.cpp
index c3232ce..c6c568b 100644
--- a/src/libANGLE/Shader.cpp
+++ b/src/libANGLE/Shader.cpp
@@ -79,6 +79,10 @@
       mShaderType(shaderType),
       mShaderVersion(100),
       mNumViews(-1),
+      mGeometryShaderInputPrimitiveType(GL_INVALID_VALUE),
+      mGeometryShaderOutputPrimitiveType(GL_INVALID_VALUE),
+      mGeometryShaderInvocations(1),
+      mGeometryShaderMaxVertices(-1),
       mCompileStatus(CompileStatus::NOT_COMPILED)
 {
     mLocalSize.fill(-1);
@@ -276,6 +280,10 @@
     mState.mActiveAttributes.clear();
     mState.mActiveOutputVariables.clear();
     mState.mNumViews = -1;
+    mState.mGeometryShaderInputPrimitiveType  = GL_INVALID_VALUE;
+    mState.mGeometryShaderOutputPrimitiveType = GL_INVALID_VALUE;
+    mState.mGeometryShaderInvocations         = 1;
+    mState.mGeometryShaderMaxVertices         = -1;
 
     mState.mCompileStatus = CompileStatus::COMPILE_REQUESTED;
     mBoundCompiler.set(context, context->getCompiler());
@@ -391,6 +399,19 @@
                 GetActiveShaderVariables(sh::GetOutputVariables(compilerHandle));
             break;
         }
+        case GL_GEOMETRY_SHADER_EXT:
+        {
+            mState.mInputVaryings  = GetShaderVariables(sh::GetInputVaryings(compilerHandle));
+            mState.mOutputVaryings = GetShaderVariables(sh::GetOutputVaryings(compilerHandle));
+
+            mState.mGeometryShaderInputPrimitiveType =
+                sh::GetGeometryShaderInputPrimitiveType(compilerHandle);
+            mState.mGeometryShaderOutputPrimitiveType =
+                sh::GetGeometryShaderOutputPrimitiveType(compilerHandle);
+            mState.mGeometryShaderInvocations = sh::GetGeometryShaderInvocations(compilerHandle);
+            mState.mGeometryShaderMaxVertices = sh::GetGeometryShaderMaxVertices(compilerHandle);
+            break;
+        }
         default:
             UNREACHABLE();
     }
diff --git a/src/libANGLE/Shader.h b/src/libANGLE/Shader.h
index 4822717..2ebafaa 100644
--- a/src/libANGLE/Shader.h
+++ b/src/libANGLE/Shader.h
@@ -101,6 +101,12 @@
     // ANGLE_multiview.
     int mNumViews;
 
+    // Geometry Shader.
+    GLenum mGeometryShaderInputPrimitiveType;
+    GLenum mGeometryShaderOutputPrimitiveType;
+    int mGeometryShaderInvocations;
+    int mGeometryShaderMaxVertices;
+
     // Indicates if this shader has been successfully compiled
     CompileStatus mCompileStatus;
 };
diff --git a/src/libANGLE/renderer/gl/renderergl_utils.cpp b/src/libANGLE/renderer/gl/renderergl_utils.cpp
index c8541d9..4cf9a3d 100644
--- a/src/libANGLE/renderer/gl/renderergl_utils.cpp
+++ b/src/libANGLE/renderer/gl/renderergl_utils.cpp
@@ -1034,6 +1034,22 @@
         caps->maxRectangleTextureSize =
             QuerySingleGLInt(functions, GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE);
     }
+
+    // We need at least OpenGL 4.3 to support all features and constants defined in
+    // GL_EXT_geometry_shader.
+    if (functions->isAtLeastGL(gl::Version(4, 3)) || functions->isAtLeastGLES(gl::Version(3, 2)) ||
+        functions->hasGLESExtension("GL_OES_geometry_shader") ||
+        functions->hasGLESExtension("GL_EXT_geometry_shader"))
+    {
+        extensions->geometryShader = true;
+
+        // TODO(jiawei.shao@intel.com): initialize all implementation dependent geometry shader
+        // limits.
+        extensions->maxGeometryOutputVertices =
+            QuerySingleGLInt(functions, GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT);
+        extensions->maxGeometryShaderInvocations =
+            QuerySingleGLInt(functions, GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT);
+    }
 }
 
 void GenerateWorkarounds(const FunctionsGL *functions, WorkaroundsGL *workarounds)
diff --git a/src/libANGLE/validationES2.cpp b/src/libANGLE/validationES2.cpp
index 7737131..cd835b3 100644
--- a/src/libANGLE/validationES2.cpp
+++ b/src/libANGLE/validationES2.cpp
@@ -4154,6 +4154,13 @@
             }
             break;
 
+        case GL_GEOMETRY_SHADER_EXT:
+            if (!context->getExtensions().geometryShader)
+            {
+                ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidShaderType);
+                return false;
+            }
+            break;
         default:
             ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidShaderType);
             return false;
@@ -4344,6 +4351,15 @@
             }
             break;
         }
+        case GL_GEOMETRY_SHADER_EXT:
+        {
+            if (programObject->getAttachedGeometryShader())
+            {
+                ANGLE_VALIDATION_ERR(context, InvalidOperation(), ShaderAttachmentHasShader);
+                return false;
+            }
+            break;
+        }
         default:
             UNREACHABLE();
             break;
@@ -4967,6 +4983,11 @@
             attachedShader = programObject->getAttachedComputeShader();
             break;
         }
+        case GL_GEOMETRY_SHADER_EXT:
+        {
+            attachedShader = programObject->getAttachedGeometryShader();
+            break;
+        }
         default:
             UNREACHABLE();
             return false;
diff --git a/src/tests/angle_end2end_tests.gypi b/src/tests/angle_end2end_tests.gypi
index 4bed633..9dc9a94 100644
--- a/src/tests/angle_end2end_tests.gypi
+++ b/src/tests/angle_end2end_tests.gypi
@@ -45,6 +45,7 @@
             '<(angle_path)/src/tests/gl_tests/FramebufferMultiviewTest.cpp',
             '<(angle_path)/src/tests/gl_tests/FramebufferRenderMipmapTest.cpp',
             '<(angle_path)/src/tests/gl_tests/FramebufferTest.cpp',
+            '<(angle_path)/src/tests/gl_tests/GeometryShaderTest.cpp',
             '<(angle_path)/src/tests/gl_tests/GLSLTest.cpp',
             '<(angle_path)/src/tests/gl_tests/ImageTest.cpp',
             '<(angle_path)/src/tests/gl_tests/IncompleteTextureTest.cpp',
diff --git a/src/tests/deqp_support/deqp_gles31_test_expectations.txt b/src/tests/deqp_support/deqp_gles31_test_expectations.txt
index 1c50f3b..92e7261 100644
--- a/src/tests/deqp_support/deqp_gles31_test_expectations.txt
+++ b/src/tests/deqp_support/deqp_gles31_test_expectations.txt
@@ -37,6 +37,12 @@
 // test expectations parser doesn't support having FAIL for GL and SKIP for D3D with the same test filter.
 1442 OPENGL D3D11 : dEQP-GLES31.functional.image_load_store.* = SKIP
 
+// TODO(jiawei.shao@intel.com): Implement FramebufferTextureEXT entry point defined in OpenGL ES 3.1 extension GL_EXT_geometry_shader
+1941 OPENGL D3D11 : dEQP-GLES31.functional.geometry_shading.query.framebuffer_* = SKIP
+1941 OPENGL D3D11 : dEQP-GLES31.functional.geometry_shading.layered.* = SKIP
+1941 OPENGL D3D11 : dEQP-GLES31.functional.geometry_shading.instanced.invocation_per_layer_* = SKIP
+1941 OPENGL D3D11 : dEQP-GLES31.functional.geometry_shading.instanced.multiple_layers_per_invocation_* = SKIP
+
 // D3D11 Failing Tests
 1442 D3D11 : dEQP-GLES31.functional.state_query.integer.max_compute_shared_memory_size_* = FAIL
 1442 D3D11 : dEQP-GLES31.functional.state_query.integer.max_compute_atomic_counter_buffers_* = FAIL
@@ -1253,10 +1259,6 @@
 1442 OPENGL D3D11 : dEQP-GLES31.functional.state_query.program.program_separable_get_programiv = FAIL
 1442 OPENGL D3D11 : dEQP-GLES31.functional.state_query.program_pipeline.* = FAIL
 1442 OPENGL D3D11 : dEQP-GLES31.functional.synchronization.* = FAIL
-1442 OPENGL D3D11 : dEQP-GLES31.functional.geometry_shading.query.geometry_linked_vertices_out = FAIL
-1442 OPENGL D3D11 : dEQP-GLES31.functional.geometry_shading.query.geometry_linked_input_type = FAIL
-1442 OPENGL D3D11 : dEQP-GLES31.functional.geometry_shading.query.geometry_linked_output_type = FAIL
-1442 OPENGL D3D11 : dEQP-GLES31.functional.geometry_shading.query.geometry_shader_invocations = FAIL
 1442 OPENGL D3D11 : dEQP-GLES31.functional.separate_shader.* = FAIL
 1442 OPENGL D3D11 : dEQP-GLES31.functional.uniform_location.nested_array.* = FAIL
 1442 OPENGL D3D11 : dEQP-GLES31.functional.debug.error_filters.case_11 = FAIL
@@ -1264,12 +1266,10 @@
 1442 OPENGL D3D11 : dEQP-GLES31.functional.debug.negative_coverage.callbacks.buffer.bind_buffer_range = FAIL
 1442 OPENGL D3D11 : dEQP-GLES31.functional.debug.negative_coverage.callbacks.shader.compile_compute_shader = SKIP
 1442 OPENGL D3D11 : dEQP-GLES31.functional.debug.negative_coverage.callbacks.shader_directive.primitive_bounding_box = FAIL
-1442 OPENGL D3D11 : dEQP-GLES31.functional.debug.negative_coverage.callbacks.shader_directive.geometry_shader = FAIL
 1442 OPENGL D3D11 : dEQP-GLES31.functional.debug.negative_coverage.callbacks.shader_directive.tessellation_shader = FAIL
 1442 OPENGL D3D11 : dEQP-GLES31.functional.debug.negative_coverage.log.buffer.bind_buffer_range = FAIL
 1442 OPENGL D3D11 : dEQP-GLES31.functional.debug.negative_coverage.log.shader.compile_compute_shader = SKIP
 1442 OPENGL D3D11 : dEQP-GLES31.functional.debug.negative_coverage.log.shader_directive.primitive_bounding_box = FAIL
-1442 OPENGL D3D11 : dEQP-GLES31.functional.debug.negative_coverage.log.shader_directive.geometry_shader = FAIL
 1442 OPENGL D3D11 : dEQP-GLES31.functional.debug.negative_coverage.log.shader_directive.tessellation_shader = FAIL
 1442 OPENGL D3D11 : dEQP-GLES31.functional.debug.negative_coverage.get_error.buffer.bind_buffer_range = FAIL
 1442 OPENGL D3D11 : dEQP-GLES31.functional.debug.negative_coverage.get_error.buffer.read_pixels_format_mismatch = FAIL
@@ -1296,9 +1296,442 @@
 1442 OPENGL D3D11 : dEQP-GLES31.functional.debug.negative_coverage.get_error.vertex_array.draw_range_elements = FAIL
 1442 OPENGL D3D11 : dEQP-GLES31.functional.debug.negative_coverage.get_error.vertex_array.draw_range_elements_incomplete_primitive = FAIL
 1442 OPENGL D3D11 : dEQP-GLES31.functional.debug.negative_coverage.get_error.shader_directive.primitive_bounding_box = FAIL
-1442 OPENGL D3D11 : dEQP-GLES31.functional.debug.negative_coverage.get_error.shader_directive.geometry_shader = FAIL
 1442 OPENGL D3D11 : dEQP-GLES31.functional.debug.negative_coverage.get_error.shader_directive.tessellation_shader = FAIL
 1442 OPENGL D3D11 : dEQP-GLES31.functional.debug.object_labels.program_pipeline = FAIL
 1442 OPENGL D3D11 : dEQP-GLES31.functional.program_interface_query.* = FAIL
 1442 OPENGL D3D11 : dEQP-GLES31.functional.layout_binding.image.image2d.* = FAIL
 1442 OPENGL D3D11 : dEQP-GLES31.functional.layout_binding.image.image3d.* = FAIL
+
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.float_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.float_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.float_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.vec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.int_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.int_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.int_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.abs.ivec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.float_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.float_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.float_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.vec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.int_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.int_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.int_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.sign.ivec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.float_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.float_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.float_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floor.vec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.float_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.float_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.float_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.trunc.vec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.float_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.float_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.float_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.round.vec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.float_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.float_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.float_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.roundeven.vec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.float_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.float_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.float_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ceil.vec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.float_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.float_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.float_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fract.vec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.float_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.float_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.float_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.modf.vec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.float_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.float_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.float_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isnan.vec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.float_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.float_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.float_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.isinf.vec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.float_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.float_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.float_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstoint.vec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.float_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.float_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.float_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.floatbitstouint.vec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.float_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.frexp.vec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.float_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.float_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.float_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.ldexp.vec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.float_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.float_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.float_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.vec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.vec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.vec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.vec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.vec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.vec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.vec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.vec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.fma.vec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.intbitstofloat.int_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.intbitstofloat.ivec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.intbitstofloat.ivec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.uintbitstofloat.uint_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.uintbitstofloat.uvec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.common.uintbitstofloat.uvec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm4x8_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm4x8_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm4x8_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.unpacksnorm4x8_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm4x8_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm4x8_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm4x8_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.unpackunorm4x8_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm2x16_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm2x16_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packsnorm2x16_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.unpacksnorm2x16_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm2x16_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm2x16_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packunorm2x16_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.unpackunorm2x16_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.packhalf2x16_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.pack_unpack.unpackhalf2x16_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uint_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uint_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uint_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.uaddcarry.uvec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uint_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uint_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uint_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.usubborrow.uvec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.umulextended.uint_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.umulextended.uvec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.umulextended.uvec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.umulextended.uvec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.imulextended.int_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.imulextended.ivec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.imulextended.ivec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.imulextended.ivec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.int_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.int_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.int_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.ivec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uint_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uint_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uint_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldextract.uvec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.int_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.int_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.int_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.ivec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uint_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uint_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uint_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldinsert.uvec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.int_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.int_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.int_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.ivec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uint_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uint_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uint_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitfieldreverse.uvec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.int_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.int_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.int_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.ivec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uint_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uint_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uint_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.bitcount.uvec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.int_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.int_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.int_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.ivec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uint_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uint_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uint_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findlsb.uvec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.int_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.int_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.int_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.ivec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uint_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uint_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uint_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec2_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec2_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec2_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec3_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec3_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec3_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec4_lowp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec4_mediump_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_functions.integer.findmsb.uvec4_highp_geometry = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.builtin_constants.geometry_shader.* = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.shaders.linkage.geometry.* = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.state_query.program.geometry_shader_state_get_programiv = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.debug.negative_coverage.callbacks.shader_directive.geometry_shader = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.debug.negative_coverage.log.shader_directive.geometry_shader = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.debug.negative_coverage.get_error.shader_directive.geometry_shader = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.geometry_shading.query.* = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.geometry_shading.basic.* = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.geometry_shading.input.* = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.geometry_shading.conversion.* = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.geometry_shading.emit.* = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.geometry_shading.varying.* = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.geometry_shading.instanced.geometry_* = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.geometry_shading.instanced.invocation_output_* = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.geometry_shading.instanced.draw_* = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.geometry_shading.vertex_transform_feedback.* = FAIL
+1941 OPENGL D3D11 : dEQP-GLES31.functional.geometry_shading.negative.* = FAIL
diff --git a/src/tests/gl_tests/GeometryShaderTest.cpp b/src/tests/gl_tests/GeometryShaderTest.cpp
new file mode 100644
index 0000000..62bf205
--- /dev/null
+++ b/src/tests/gl_tests/GeometryShaderTest.cpp
@@ -0,0 +1,74 @@
+//
+// Copyright 2017 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// GeometryShaderTest.cpp : Tests of the implementation of geometry shader
+
+#include "test_utils/ANGLETest.h"
+
+using namespace angle;
+
+namespace
+{
+
+class GeometryShaderTest : public ANGLETest
+{
+};
+
+class GeometryShaderTestES3 : public ANGLETest
+{
+};
+
+// Verify that Geometry Shader cannot be created in an OpenGL ES 3.0 context.
+TEST_P(GeometryShaderTestES3, CreateGeometryShaderInES3)
+{
+    EXPECT_TRUE(!extensionEnabled("GL_EXT_geometry_shader"));
+    GLuint geometryShader = glCreateShader(GL_GEOMETRY_SHADER_EXT);
+    EXPECT_EQ(0u, geometryShader);
+    EXPECT_GL_ERROR(GL_INVALID_ENUM);
+}
+
+// Verify that Geometry Shader can be created and attached to a program.
+TEST_P(GeometryShaderTest, CreateAndAttachGeometryShader)
+{
+    ANGLE_SKIP_TEST_IF(!extensionEnabled("GL_EXT_geometry_shader"));
+
+    const std::string &geometryShaderSource =
+        R"(#version 310 es
+        #extension GL_EXT_geometry_shader : require
+        layout (invocations = 3, triangles) in;
+        layout (triangle_strip, max_vertices = 3) out;
+        in vec4 texcoord[];
+        out vec4 o_texcoord;
+        void main()
+        {
+            int n;
+            for (n = 0; n < gl_in.length(); n++)
+            {
+                gl_Position = gl_in[n].gl_Position;
+                gl_Layer   = gl_InvocationID;
+                o_texcoord = texcoord[n];
+                EmitVertex();
+            }
+            EndPrimitive();
+        })";
+
+    GLuint geometryShader = CompileShader(GL_GEOMETRY_SHADER_EXT, geometryShaderSource);
+
+    EXPECT_NE(0u, geometryShader);
+
+    GLuint programID = glCreateProgram();
+    glAttachShader(programID, geometryShader);
+
+    glDetachShader(programID, geometryShader);
+    glDeleteShader(geometryShader);
+    glDeleteProgram(programID);
+
+    EXPECT_GL_NO_ERROR();
+}
+
+ANGLE_INSTANTIATE_TEST(GeometryShaderTestES3, ES3_OPENGL(), ES3_OPENGLES(), ES3_D3D11());
+ANGLE_INSTANTIATE_TEST(GeometryShaderTest, ES31_OPENGL(), ES31_OPENGLES(), ES31_D3D11());
+}