OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2015 Google Inc. | 3 * Copyright 2015 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
| 9 #include "SkMutex.h" |
9 #include "SkOnce.h" | 10 #include "SkOnce.h" |
10 #include "gl/GrGLInterface.h" | 11 #include "gl/GrGLInterface.h" |
11 #include "gl/GrGLAssembleInterface.h" | 12 #include "gl/GrGLAssembleInterface.h" |
12 #include "gl/command_buffer/GLTestContext_command_buffer.h" | 13 #include "gl/command_buffer/GLTestContext_command_buffer.h" |
13 #include "../ports/SkOSEnvironment.h" | 14 #include "../ports/SkOSEnvironment.h" |
14 #include "../ports/SkOSLibrary.h" | 15 #include "../ports/SkOSLibrary.h" |
15 | 16 |
16 #if defined SK_BUILD_FOR_MAC | 17 #if defined SK_BUILD_FOR_MAC |
17 | 18 |
18 // EGL doesn't exist on the mac, so expose what we need to get the command buffe
r's EGL running. | 19 // EGL doesn't exist on the mac, so expose what we need to get the command buffe
r's EGL running. |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 } | 133 } |
133 | 134 |
134 static const GrGLInterface* create_command_buffer_interface() { | 135 static const GrGLInterface* create_command_buffer_interface() { |
135 load_command_buffer_once(); | 136 load_command_buffer_once(); |
136 if (!gfFunctionsLoadedSuccessfully) { | 137 if (!gfFunctionsLoadedSuccessfully) { |
137 return nullptr; | 138 return nullptr; |
138 } | 139 } |
139 return GrGLAssembleGLESInterface(gLibrary, command_buffer_get_gl_proc); | 140 return GrGLAssembleGLESInterface(gLibrary, command_buffer_get_gl_proc); |
140 } | 141 } |
141 | 142 |
| 143 // We use a poor man's garbage collector of EGLDisplays. They are only |
| 144 // terminated when there are no more EGLDisplays in use. See crbug.com/603223 |
| 145 SK_DECLARE_STATIC_MUTEX(gDisplayMutex); |
| 146 static int gActiveDisplayCnt; |
| 147 SkTArray<EGLDisplay> gRetiredDisplays; |
| 148 |
| 149 static EGLDisplay get_and_init_display() { |
| 150 SkAutoMutexAcquire am(gDisplayMutex); |
| 151 EGLDisplay dsp = gfGetDisplay(EGL_DEFAULT_DISPLAY); |
| 152 if (dsp == EGL_NO_DISPLAY) { |
| 153 return EGL_NO_DISPLAY; |
| 154 } |
| 155 EGLint major, minor; |
| 156 if (!gfInitialize(dsp, &major, &minor)) { |
| 157 gRetiredDisplays.push_back(dsp); |
| 158 return EGL_NO_DISPLAY; |
| 159 } |
| 160 ++gActiveDisplayCnt; |
| 161 return dsp; |
| 162 } |
| 163 |
| 164 static void retire_display(EGLDisplay dsp) { |
| 165 if (dsp == EGL_NO_DISPLAY) { |
| 166 return; |
| 167 } |
| 168 SkAutoMutexAcquire am(gDisplayMutex); |
| 169 gRetiredDisplays.push_back(dsp); |
| 170 --gActiveDisplayCnt; |
| 171 if (!gActiveDisplayCnt) { |
| 172 for (EGLDisplay d : gRetiredDisplays) { |
| 173 gfTerminate(d); |
| 174 } |
| 175 gRetiredDisplays.reset(); |
| 176 } |
| 177 } |
142 } // anonymous namespace | 178 } // anonymous namespace |
143 | 179 |
144 namespace sk_gpu_test { | 180 namespace sk_gpu_test { |
145 | 181 |
146 CommandBufferGLTestContext::CommandBufferGLTestContext() | 182 CommandBufferGLTestContext::CommandBufferGLTestContext() |
147 : fContext(EGL_NO_CONTEXT), fDisplay(EGL_NO_DISPLAY), fSurface(EGL_NO_SURFAC
E) { | 183 : fContext(EGL_NO_CONTEXT), fDisplay(EGL_NO_DISPLAY), fSurface(EGL_NO_SURFAC
E) { |
148 | 184 |
149 static const EGLint configAttribs[] = { | 185 static const EGLint configAttribs[] = { |
150 EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, | 186 EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, |
151 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, | 187 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 void CommandBufferGLTestContext::initializeGLContext(void *nativeWindow, const i
nt *configAttribs, | 225 void CommandBufferGLTestContext::initializeGLContext(void *nativeWindow, const i
nt *configAttribs, |
190 const int *surfaceAttribs) { | 226 const int *surfaceAttribs) { |
191 load_command_buffer_once(); | 227 load_command_buffer_once(); |
192 if (!gfFunctionsLoadedSuccessfully) { | 228 if (!gfFunctionsLoadedSuccessfully) { |
193 SkDebugf("Command Buffer: Could not load EGL functions.\n"); | 229 SkDebugf("Command Buffer: Could not load EGL functions.\n"); |
194 return; | 230 return; |
195 } | 231 } |
196 | 232 |
197 // Make sure CHROMIUM_path_rendering is enabled for NVPR support. | 233 // Make sure CHROMIUM_path_rendering is enabled for NVPR support. |
198 sk_setenv("CHROME_COMMAND_BUFFER_GLES2_ARGS", "--enable-gl-path-rendering"); | 234 sk_setenv("CHROME_COMMAND_BUFFER_GLES2_ARGS", "--enable-gl-path-rendering"); |
199 fDisplay = gfGetDisplay(EGL_DEFAULT_DISPLAY); | 235 fDisplay = get_and_init_display(); |
200 if (EGL_NO_DISPLAY == fDisplay) { | 236 if (EGL_NO_DISPLAY == fDisplay) { |
201 SkDebugf("Command Buffer: Could not create EGL display.\n"); | 237 SkDebugf("Command Buffer: Could not create EGL display.\n"); |
202 return; | 238 return; |
203 } | 239 } |
204 | 240 |
205 EGLint majorVersion; | |
206 EGLint minorVersion; | |
207 if (!gfInitialize(fDisplay, &majorVersion, &minorVersion)) { | |
208 SkDebugf("Command Buffer: Could not initialize EGL display.\n"); | |
209 this->destroyGLContext(); | |
210 return; | |
211 } | |
212 | |
213 EGLint numConfigs; | 241 EGLint numConfigs; |
214 if (!gfChooseConfig(fDisplay, configAttribs, static_cast<EGLConfig *>(&fConf
ig), 1, | 242 if (!gfChooseConfig(fDisplay, configAttribs, static_cast<EGLConfig *>(&fConf
ig), 1, |
215 &numConfigs) || numConfigs != 1) { | 243 &numConfigs) || numConfigs != 1) { |
216 SkDebugf("Command Buffer: Could not choose EGL config.\n"); | 244 SkDebugf("Command Buffer: Could not choose EGL config.\n"); |
217 this->destroyGLContext(); | 245 this->destroyGLContext(); |
218 return; | 246 return; |
219 } | 247 } |
220 | 248 |
221 if (nativeWindow) { | 249 if (nativeWindow) { |
222 fSurface = gfCreateWindowSurface(fDisplay, | 250 fSurface = gfCreateWindowSurface(fDisplay, |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 if (fContext) { | 309 if (fContext) { |
282 gfDestroyContext(fDisplay, fContext); | 310 gfDestroyContext(fDisplay, fContext); |
283 fContext = EGL_NO_CONTEXT; | 311 fContext = EGL_NO_CONTEXT; |
284 } | 312 } |
285 | 313 |
286 if (fSurface) { | 314 if (fSurface) { |
287 gfDestroySurface(fDisplay, fSurface); | 315 gfDestroySurface(fDisplay, fSurface); |
288 fSurface = EGL_NO_SURFACE; | 316 fSurface = EGL_NO_SURFACE; |
289 } | 317 } |
290 | 318 |
291 gfTerminate(fDisplay); | 319 retire_display(fDisplay); |
292 fDisplay = EGL_NO_DISPLAY; | 320 fDisplay = EGL_NO_DISPLAY; |
293 } | 321 } |
294 } | 322 } |
295 | 323 |
296 void CommandBufferGLTestContext::onPlatformMakeCurrent() const { | 324 void CommandBufferGLTestContext::onPlatformMakeCurrent() const { |
297 if (!gfFunctionsLoadedSuccessfully) { | 325 if (!gfFunctionsLoadedSuccessfully) { |
298 return; | 326 return; |
299 } | 327 } |
300 if (!gfMakeCurrent(fDisplay, fSurface, fSurface, fContext)) { | 328 if (!gfMakeCurrent(fDisplay, fSurface, fSurface, fContext)) { |
301 SkDebugf("Command Buffer: Could not make EGL context current.\n"); | 329 SkDebugf("Command Buffer: Could not make EGL context current.\n"); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 return result; | 364 return result; |
337 } | 365 } |
338 | 366 |
339 int CommandBufferGLTestContext::getSampleCount() { | 367 int CommandBufferGLTestContext::getSampleCount() { |
340 EGLint result = 0; | 368 EGLint result = 0; |
341 gfGetConfigAttrib(fDisplay, static_cast<EGLConfig>(fConfig), EGL_SAMPLES, &r
esult); | 369 gfGetConfigAttrib(fDisplay, static_cast<EGLConfig>(fConfig), EGL_SAMPLES, &r
esult); |
342 return result; | 370 return result; |
343 } | 371 } |
344 | 372 |
345 } // namespace sk_gpu_test | 373 } // namespace sk_gpu_test |
OLD | NEW |