Flutter Engine
 
Loading...
Searching...
No Matches
test_gl_context.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter 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
6
7#include <EGL/egl.h>
8#include <EGL/eglext.h>
9#include <EGL/eglplatform.h>
10
11#include <cstring>
12
13#include "flutter/fml/logging.h"
15
16namespace flutter::testing {
17
18namespace {
19bool HasExtension(const char* extensions, const char* name) {
20 const char* r = strstr(extensions, name);
21 auto len = strlen(name);
22 // check that the extension name is terminated by space or null terminator
23 return r != nullptr && (r[len] == ' ' || r[len] == 0);
24}
25
26void CheckSwanglekExtensions() {
27 const char* extensions = ::eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
28 FML_CHECK(HasExtension(extensions, "EGL_EXT_platform_base")) << extensions;
29 FML_CHECK(HasExtension(extensions, "EGL_ANGLE_platform_angle_vulkan"))
30 << extensions;
31 FML_CHECK(HasExtension(extensions,
32 "EGL_ANGLE_platform_angle_device_type_swiftshader"))
33 << extensions;
34}
35
36EGLDisplay CreateSwangleDisplay() {
37 CheckSwanglekExtensions();
38
39 PFNEGLGETPLATFORMDISPLAYEXTPROC egl_get_platform_display_EXT =
40 reinterpret_cast<PFNEGLGETPLATFORMDISPLAYEXTPROC>(
41 eglGetProcAddress("eglGetPlatformDisplayEXT"));
42 FML_CHECK(egl_get_platform_display_EXT)
43 << "eglGetPlatformDisplayEXT not available.";
44
45 const EGLint display_config[] = {
46 EGL_PLATFORM_ANGLE_TYPE_ANGLE,
47 EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE,
48 EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE,
49 EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE,
50 EGL_PLATFORM_ANGLE_NATIVE_PLATFORM_TYPE_ANGLE,
51 EGL_PLATFORM_VULKAN_DISPLAY_MODE_HEADLESS_ANGLE,
52 EGL_NONE,
53 };
54
55 return egl_get_platform_display_EXT(
56 EGL_PLATFORM_ANGLE_ANGLE,
57 reinterpret_cast<EGLNativeDisplayType*>(EGL_DEFAULT_DISPLAY),
58 display_config);
59}
60} // namespace
61
63 display = CreateSwangleDisplay();
64 FML_CHECK(display != EGL_NO_DISPLAY);
65
66 auto result = ::eglInitialize(display, nullptr, nullptr);
67 FML_CHECK(result == EGL_TRUE) << GetEGLError();
68
69 config = {0};
70
71 EGLint num_config = 0;
72 const EGLint attribute_list[] = {EGL_RED_SIZE,
73 8,
74 EGL_GREEN_SIZE,
75 8,
76 EGL_BLUE_SIZE,
77 8,
78 EGL_ALPHA_SIZE,
79 8,
80 EGL_SURFACE_TYPE,
81 EGL_PBUFFER_BIT,
82 EGL_CONFORMANT,
83 EGL_OPENGL_ES2_BIT,
84 EGL_RENDERABLE_TYPE,
85 EGL_OPENGL_ES2_BIT,
86 EGL_NONE};
87
88 result = ::eglChooseConfig(display, attribute_list, &config, 1, &num_config);
89 FML_CHECK(result == EGL_TRUE) << GetEGLError();
90 FML_CHECK(num_config == 1) << GetEGLError();
91
92 {
93 const EGLint context_attributes[] = {
94 EGL_CONTEXT_CLIENT_VERSION, //
95 2, //
96 EGL_NONE //
97 };
98
100 ::eglCreateContext(display, // display connection
101 config, // config
102 EGL_NO_CONTEXT, // sharegroup
103 context_attributes // context attributes
104 );
105 FML_CHECK(onscreen_context != EGL_NO_CONTEXT) << GetEGLError();
106
108 ::eglCreateContext(display, // display connection
109 config, // config
110 onscreen_context, // sharegroup
111 context_attributes // context attributes
112 );
113 FML_CHECK(offscreen_context != EGL_NO_CONTEXT) << GetEGLError();
114 }
115}
116
118 auto result = ::eglDestroyContext(display, onscreen_context);
119 FML_CHECK(result == EGL_TRUE) << GetEGLError();
120
121 result = ::eglDestroyContext(display, offscreen_context);
122 FML_CHECK(result == EGL_TRUE) << GetEGLError();
123
124 result = ::eglTerminate(display);
125 FML_CHECK(result == EGL_TRUE);
126}
127
128} // namespace flutter::testing
#define FML_CHECK(condition)
Definition logging.h:104
static bool HasExtension(const char *extensions, const char *name)
std::string GetEGLError()
DEF_SWITCHES_START aot vmservice shared library name
Definition switch_defs.h:27