summaryrefslogtreecommitdiffstats
path: root/gfx/angle/src/tests/gl_tests/WebGLCompatibilityTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/angle/src/tests/gl_tests/WebGLCompatibilityTest.cpp')
-rw-r--r--gfx/angle/src/tests/gl_tests/WebGLCompatibilityTest.cpp154
1 files changed, 154 insertions, 0 deletions
diff --git a/gfx/angle/src/tests/gl_tests/WebGLCompatibilityTest.cpp b/gfx/angle/src/tests/gl_tests/WebGLCompatibilityTest.cpp
new file mode 100644
index 000000000..48a9d2bae
--- /dev/null
+++ b/gfx/angle/src/tests/gl_tests/WebGLCompatibilityTest.cpp
@@ -0,0 +1,154 @@
+//
+// Copyright 2015 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.
+//
+
+// WebGLCompatibilityTest.cpp : Tests of the GL_ANGLE_webgl_compatibility extension.
+
+#include "test_utils/ANGLETest.h"
+
+#include "test_utils/gl_raii.h"
+
+namespace angle
+{
+
+class WebGLCompatibilityTest : public ANGLETest
+{
+ protected:
+ WebGLCompatibilityTest()
+ {
+ setWindowWidth(128);
+ setWindowHeight(128);
+ setConfigRedBits(8);
+ setConfigGreenBits(8);
+ setConfigBlueBits(8);
+ setConfigAlphaBits(8);
+ setWebGLCompatibilityEnabled(true);
+ }
+
+ void SetUp() override
+ {
+ ANGLETest::SetUp();
+ glEnableExtensionANGLE = reinterpret_cast<PFNGLENABLEEXTENSIONANGLEPROC>(
+ eglGetProcAddress("glEnableExtensionANGLE"));
+ }
+
+ void TearDown() override { ANGLETest::TearDown(); }
+
+ PFNGLENABLEEXTENSIONANGLEPROC glEnableExtensionANGLE = nullptr;
+};
+
+// Context creation would fail if EGL_ANGLE_create_context_webgl_compatibility was not available so
+// the GL extension should always be present
+TEST_P(WebGLCompatibilityTest, ExtensionStringExposed)
+{
+ EXPECT_TRUE(extensionEnabled("GL_ANGLE_webgl_compatibility"));
+}
+
+// Verify that all extension entry points are available
+TEST_P(WebGLCompatibilityTest, EntryPoints)
+{
+ if (extensionEnabled("GL_ANGLE_webgl_compatibility"))
+ {
+ EXPECT_NE(nullptr, eglGetProcAddress("glEnableExtensionANGLE"));
+ }
+}
+
+// WebGL 1 allows GL_DEPTH_STENCIL_ATTACHMENT as a valid binding point. Make sure it is usable,
+// even in ES2 contexts.
+TEST_P(WebGLCompatibilityTest, DepthStencilBindingPoint)
+{
+ GLRenderbuffer renderbuffer;
+ glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer.get());
+ glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 32, 32);
+
+ GLFramebuffer framebuffer;
+ glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get());
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
+ renderbuffer.get());
+
+ EXPECT_GL_NO_ERROR();
+}
+
+// Test that attempting to enable an extension that doesn't exist generates GL_INVALID_OPERATION
+TEST_P(WebGLCompatibilityTest, EnableExtensionValidation)
+{
+ EXPECT_EQ(GL_FALSE, glEnableExtensionANGLE("invalid_extension_string"));
+ EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+}
+
+// Test enabling the GL_OES_element_index_uint extension
+TEST_P(WebGLCompatibilityTest, EnableExtensionUintIndices)
+{
+ if (getClientMajorVersion() != 2)
+ {
+ // This test only works on ES2 where uint indices are not available by default
+ return;
+ }
+
+ EXPECT_FALSE(extensionEnabled("GL_OES_element_index_uint"));
+
+ GLBuffer indexBuffer;
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer.get());
+
+ GLuint data[] = {0, 1, 2, 1, 3, 2};
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
+
+ ANGLE_GL_PROGRAM(program, "void main() { gl_Position = vec4(0, 0, 0, 1); }",
+ "void main() { gl_FragColor = vec4(0, 1, 0, 1); }")
+ glUseProgram(program.get());
+
+ glDrawElements(GL_TRIANGLES, 2, GL_UNSIGNED_INT, nullptr);
+ EXPECT_GL_ERROR(GL_INVALID_ENUM);
+
+ if (glEnableExtensionANGLE("GL_OES_element_index_uint"))
+ {
+ EXPECT_GL_NO_ERROR();
+ EXPECT_TRUE(extensionEnabled("GL_OES_element_index_uint"));
+
+ glDrawElements(GL_TRIANGLES, 2, GL_UNSIGNED_INT, nullptr);
+ EXPECT_GL_NO_ERROR();
+ }
+}
+
+// Verify that shaders are of a compatible spec when the extension is enabled.
+TEST_P(WebGLCompatibilityTest, ExtensionCompilerSpec)
+{
+ EXPECT_TRUE(extensionEnabled("GL_ANGLE_webgl_compatibility"));
+
+ // Use of reserved _webgl prefix should fail when the shader specification is for WebGL.
+ const std::string &vert =
+ "struct Foo {\n"
+ " int _webgl_bar;\n"
+ "};\n"
+ "void main()\n"
+ "{\n"
+ " Foo foo = Foo(1);\n"
+ "}";
+
+ // Default fragement shader.
+ const std::string &frag =
+ "void main()\n"
+ "{\n"
+ " gl_FragColor = vec4(1.0,0.0,0.0,1.0);\n"
+ "}";
+
+ GLuint program = CompileProgram(vert, frag);
+ EXPECT_EQ(0u, program);
+ glDeleteProgram(program);
+}
+
+// Use this to select which configurations (e.g. which renderer, which GLES major version) these
+// tests should be run against.
+ANGLE_INSTANTIATE_TEST(WebGLCompatibilityTest,
+ ES2_D3D9(),
+ ES2_D3D11(),
+ ES3_D3D11(),
+ ES2_D3D11_FL9_3(),
+ ES2_OPENGL(),
+ ES3_OPENGL(),
+ ES2_OPENGLES(),
+ ES3_OPENGLES());
+
+} // namespace