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 | |
robertphillips
2016/04/13 21:24:14
static ?
bsalomon
2016/04/13 21:43:40
Done.
| |
149 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 | |
robertphillips
2016/04/13 21:24:14
static ?
bsalomon
2016/04/13 21:43:40
Done.
| |
164 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 |