blob: 1d8babc927b69dad023306d22cb1e9855744656e [file] [log] [blame]
dyen9deab29a2015-06-09 23:11:281// Copyright 2015 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
danakj25c52c32016-04-12 21:51:085#include <memory>
6
dyen9deab29a2015-06-09 23:11:287#include "testing/gtest/include/gtest/gtest.h"
8#include "ui/gl/gl_egl_api_implementation.h"
kylechar7dd36fe2016-07-20 19:44:069#include "ui/gl/gl_surface_egl.h"
dyen9deab29a2015-06-09 23:11:2810#include "ui/gl/gl_switches.h"
11
kylechar7a463842016-05-26 14:46:1212namespace gl {
dyen9deab29a2015-06-09 23:11:2813
14class EGLApiTest : public testing::Test {
15 public:
16 void SetUp() override {
tobiasjs03962f92015-06-30 09:50:0717 fake_client_extension_string_ = "";
dyen9deab29a2015-06-09 23:11:2818 fake_extension_string_ = "";
19
20 // TODO(dyen): Add a way to bind mock drivers for testing.
21 g_driver_egl.ClearBindings();
22 g_driver_egl.fn.eglInitializeFn = &FakeInitialize;
23 g_driver_egl.fn.eglQueryStringFn = &FakeQueryString;
24 g_driver_egl.fn.eglGetCurrentDisplayFn = &FakeGetCurrentDisplay;
25 g_driver_egl.fn.eglGetDisplayFn = &FakeGetDisplay;
26 g_driver_egl.fn.eglGetErrorFn = &FakeGetError;
cwallezfaad02c32016-12-06 16:53:2227 g_driver_egl.fn.eglGetProcAddressFn = &FakeGetProcAddress;
Zhenyao Mo9fc174c2017-08-24 01:06:4228
29 SetGLImplementation(kGLImplementationEGLGLES2);
dyen9deab29a2015-06-09 23:11:2830 }
31
32 void TearDown() override {
33 g_current_egl_context = nullptr;
34 api_.reset(nullptr);
35 g_driver_egl.ClearBindings();
36
tobiasjs03962f92015-06-30 09:50:0737 fake_client_extension_string_ = "";
dyen9deab29a2015-06-09 23:11:2838 fake_extension_string_ = "";
39 }
40
Zhenyao Mo8f2b7882017-08-18 23:36:2741 void InitializeAPI(const char* disabled_extensions) {
dyen9deab29a2015-06-09 23:11:2842 api_.reset(new RealEGLApi());
43 g_current_egl_context = api_.get();
Zhenyao Mo8f2b7882017-08-18 23:36:2744 api_->Initialize(&g_driver_egl);
45 if (disabled_extensions) {
46 SetDisabledExtensionsEGL(disabled_extensions);
47 }
kylechar7dd36fe2016-07-20 19:44:0648 g_driver_egl.InitializeClientExtensionBindings();
49 GLSurfaceEGL::InitializeDisplay(EGL_DEFAULT_DISPLAY);
tobiasjs03962f92015-06-30 09:50:0750 g_driver_egl.InitializeExtensionBindings();
dyen9deab29a2015-06-09 23:11:2851 }
52
tobiasjs03962f92015-06-30 09:50:0753 void SetFakeExtensionString(const char* fake_string,
54 const char* fake_client_string) {
dyen9deab29a2015-06-09 23:11:2855 fake_extension_string_ = fake_string;
tobiasjs03962f92015-06-30 09:50:0756 fake_client_extension_string_ = fake_client_string;
dyen9deab29a2015-06-09 23:11:2857 }
58
59 static EGLBoolean GL_BINDING_CALL FakeInitialize(EGLDisplay display,
60 EGLint * major,
61 EGLint * minor) {
62 return EGL_TRUE;
63 }
64
65 static const char* GL_BINDING_CALL FakeQueryString(EGLDisplay dpy,
66 EGLint name) {
tobiasjs03962f92015-06-30 09:50:0767 if (dpy == EGL_NO_DISPLAY) {
68 return fake_client_extension_string_;
69 } else {
70 return fake_extension_string_;
71 }
dyen9deab29a2015-06-09 23:11:2872 }
73
74 static EGLDisplay GL_BINDING_CALL FakeGetCurrentDisplay() {
tobiasjs03962f92015-06-30 09:50:0775 return reinterpret_cast<EGLDisplay>(0x1);
dyen9deab29a2015-06-09 23:11:2876 }
77
78 static EGLDisplay GL_BINDING_CALL FakeGetDisplay(
79 EGLNativeDisplayType native_display) {
tobiasjs03962f92015-06-30 09:50:0780 return reinterpret_cast<EGLDisplay>(0x1);
dyen9deab29a2015-06-09 23:11:2881 }
82
83 static EGLint GL_BINDING_CALL FakeGetError() {
84 return EGL_SUCCESS;
85 }
86
cwallezfaad02c32016-12-06 16:53:2287 static __eglMustCastToProperFunctionPointerType GL_BINDING_CALL
88 FakeGetProcAddress(const char* procname) {
89 return nullptr;
90 }
91
tobiasjs03962f92015-06-30 09:50:0792 std::pair<const char*, const char*> GetExtensions() {
93 return std::make_pair(
94 api_->eglQueryStringFn(EGL_NO_DISPLAY, EGL_EXTENSIONS),
95 api_->eglQueryStringFn(api_->eglGetCurrentDisplayFn(), EGL_EXTENSIONS));
dyen9deab29a2015-06-09 23:11:2896 }
97
98 protected:
99 static const char* fake_extension_string_;
tobiasjs03962f92015-06-30 09:50:07100 static const char* fake_client_extension_string_;
dyen9deab29a2015-06-09 23:11:28101
danakj25c52c32016-04-12 21:51:08102 std::unique_ptr<RealEGLApi> api_;
dyen9deab29a2015-06-09 23:11:28103};
104
105const char* EGLApiTest::fake_extension_string_ = "";
tobiasjs03962f92015-06-30 09:50:07106const char* EGLApiTest::fake_client_extension_string_ = "";
dyen9deab29a2015-06-09 23:11:28107
tobiasjs03962f92015-06-30 09:50:07108TEST_F(EGLApiTest, DisabledExtensionBitTest) {
109 static const char* kFakeExtensions = "EGL_KHR_fence_sync";
110 static const char* kFakeClientExtensions = "";
111 static const char* kFakeDisabledExtensions = "EGL_KHR_fence_sync";
dyen9deab29a2015-06-09 23:11:28112
tobiasjs03962f92015-06-30 09:50:07113 SetFakeExtensionString(kFakeExtensions, kFakeClientExtensions);
dyen9deab29a2015-06-09 23:11:28114 InitializeAPI(nullptr);
115
tobiasjs03962f92015-06-30 09:50:07116 EXPECT_TRUE(g_driver_egl.ext.b_EGL_KHR_fence_sync);
dyen9deab29a2015-06-09 23:11:28117
Zhenyao Mo8f2b7882017-08-18 23:36:27118 InitializeAPI(kFakeDisabledExtensions);
dyen9deab29a2015-06-09 23:11:28119
tobiasjs03962f92015-06-30 09:50:07120 EXPECT_FALSE(g_driver_egl.ext.b_EGL_KHR_fence_sync);
121}
122
123TEST_F(EGLApiTest, DisabledExtensionStringTest) {
Zhenyao Mo9fc174c2017-08-24 01:06:42124 static const char* kFakeExtensions =
125 "EGL_EXT_1 EGL_KHR_fence_sync EGL_EXT_3 EGL_KHR_wait_sync";
tobiasjs03962f92015-06-30 09:50:07126 static const char* kFakeClientExtensions =
127 "EGL_CLIENT_EXT_1 EGL_CLIENT_EXT_2";
128 static const char* kFakeDisabledExtensions =
Zhenyao Mo9fc174c2017-08-24 01:06:42129 "EGL_KHR_fence_sync,EGL_KHR_wait_sync";
130 static const char* kFilteredExtensions = "EGL_EXT_1 EGL_EXT_3";
131 static const char* kFilteredClientExtensions =
132 "EGL_CLIENT_EXT_1 EGL_CLIENT_EXT_2";
tobiasjs03962f92015-06-30 09:50:07133
134 SetFakeExtensionString(kFakeExtensions, kFakeClientExtensions);
135 InitializeAPI(nullptr);
136
137 EXPECT_STREQ(kFakeClientExtensions, GetExtensions().first);
138 EXPECT_STREQ(kFakeExtensions, GetExtensions().second);
139
Zhenyao Mo8f2b7882017-08-18 23:36:27140 InitializeAPI(kFakeDisabledExtensions);
tobiasjs03962f92015-06-30 09:50:07141
142 EXPECT_STREQ(kFilteredClientExtensions, GetExtensions().first);
143 EXPECT_STREQ(kFilteredExtensions, GetExtensions().second);
dyen9deab29a2015-06-09 23:11:28144}
145
kylechar7a463842016-05-26 14:46:12146} // namespace gl