Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1029)

Side by Side Diff: tools/gpu/gl/command_buffer/GLTestContext_command_buffer.cpp

Issue 1978733003: Remove workarounds initializing command buffer EGL (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: rebase Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "SkMutex.h"
10 #include "SkOnce.h" 10 #include "SkOnce.h"
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 } 133 }
134 134
135 static const GrGLInterface* create_command_buffer_interface() { 135 static const GrGLInterface* create_command_buffer_interface() {
136 load_command_buffer_once(); 136 load_command_buffer_once();
137 if (!gfFunctionsLoadedSuccessfully) { 137 if (!gfFunctionsLoadedSuccessfully) {
138 return nullptr; 138 return nullptr;
139 } 139 }
140 return GrGLAssembleGLESInterface(gLibrary, command_buffer_get_gl_proc); 140 return GrGLAssembleGLESInterface(gLibrary, command_buffer_get_gl_proc);
141 } 141 }
142 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 }
178 } // anonymous namespace 143 } // anonymous namespace
179 144
180 namespace sk_gpu_test { 145 namespace sk_gpu_test {
181 146
182 CommandBufferGLTestContext::CommandBufferGLTestContext() 147 CommandBufferGLTestContext::CommandBufferGLTestContext()
183 : fContext(EGL_NO_CONTEXT), fDisplay(EGL_NO_DISPLAY), fSurface(EGL_NO_SURFAC E) { 148 : fContext(EGL_NO_CONTEXT), fDisplay(EGL_NO_DISPLAY), fSurface(EGL_NO_SURFAC E) {
184 149
185 static const EGLint configAttribs[] = { 150 static const EGLint configAttribs[] = {
186 EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, 151 EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
187 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 152 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 void CommandBufferGLTestContext::initializeGLContext(void *nativeWindow, const i nt *configAttribs, 190 void CommandBufferGLTestContext::initializeGLContext(void *nativeWindow, const i nt *configAttribs,
226 const int *surfaceAttribs) { 191 const int *surfaceAttribs) {
227 load_command_buffer_once(); 192 load_command_buffer_once();
228 if (!gfFunctionsLoadedSuccessfully) { 193 if (!gfFunctionsLoadedSuccessfully) {
229 SkDebugf("Command Buffer: Could not load EGL functions.\n"); 194 SkDebugf("Command Buffer: Could not load EGL functions.\n");
230 return; 195 return;
231 } 196 }
232 197
233 // Make sure CHROMIUM_path_rendering is enabled for NVPR support. 198 // Make sure CHROMIUM_path_rendering is enabled for NVPR support.
234 sk_setenv("CHROME_COMMAND_BUFFER_GLES2_ARGS", "--enable-gl-path-rendering"); 199 sk_setenv("CHROME_COMMAND_BUFFER_GLES2_ARGS", "--enable-gl-path-rendering");
235 fDisplay = get_and_init_display(); 200 fDisplay = gfGetDisplay(EGL_DEFAULT_DISPLAY);
236 if (EGL_NO_DISPLAY == fDisplay) { 201 if (EGL_NO_DISPLAY == fDisplay) {
237 SkDebugf("Command Buffer: Could not create EGL display.\n"); 202 SkDebugf("Command Buffer: Could not create EGL display.\n");
238 return; 203 return;
239 } 204 }
240 205 if (!gfInitialize(fDisplay, nullptr, nullptr)) {
206 SkDebugf("Command Buffer: Could not initialize EGL display.\n");
207 this->destroyGLContext();
208 return;
209 }
241 EGLint numConfigs; 210 EGLint numConfigs;
242 if (!gfChooseConfig(fDisplay, configAttribs, static_cast<EGLConfig *>(&fConf ig), 1, 211 if (!gfChooseConfig(fDisplay, configAttribs, static_cast<EGLConfig *>(&fConf ig), 1,
243 &numConfigs) || numConfigs != 1) { 212 &numConfigs) || numConfigs != 1) {
244 SkDebugf("Command Buffer: Could not choose EGL config.\n"); 213 SkDebugf("Command Buffer: Could not choose EGL config.\n");
245 this->destroyGLContext(); 214 this->destroyGLContext();
246 return; 215 return;
247 } 216 }
248 217
249 if (nativeWindow) { 218 if (nativeWindow) {
250 fSurface = gfCreateWindowSurface(fDisplay, 219 fSurface = gfCreateWindowSurface(fDisplay,
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 265
297 CommandBufferGLTestContext::~CommandBufferGLTestContext() { 266 CommandBufferGLTestContext::~CommandBufferGLTestContext() {
298 this->teardown(); 267 this->teardown();
299 this->destroyGLContext(); 268 this->destroyGLContext();
300 } 269 }
301 270
302 void CommandBufferGLTestContext::destroyGLContext() { 271 void CommandBufferGLTestContext::destroyGLContext() {
303 if (!gfFunctionsLoadedSuccessfully) { 272 if (!gfFunctionsLoadedSuccessfully) {
304 return; 273 return;
305 } 274 }
306 if (fDisplay) { 275 if (EGL_NO_DISPLAY == fDisplay) {
307 gfMakeCurrent(fDisplay, 0, 0, 0); 276 return;
277 }
278 if (EGL_NO_CONTEXT != fContext) {
279 gfDestroyContext(fDisplay, fContext);
280 fContext = EGL_NO_CONTEXT;
281 }
282 // Call MakeCurrent after destroying the context, so that the EGL implementa tion knows that
283 // the context is not used anymore after it is released from being current. This way
284 // command buffer does not need to abandon the context before destruction, a nd no
285 // client-side errors are printed.
286 gfMakeCurrent(fDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
308 287
309 if (fContext) { 288 if (EGL_NO_SURFACE != fSurface) {
310 gfDestroyContext(fDisplay, fContext); 289 gfDestroySurface(fDisplay, fSurface);
311 fContext = EGL_NO_CONTEXT; 290 fSurface = EGL_NO_SURFACE;
312 }
313
314 if (fSurface) {
315 gfDestroySurface(fDisplay, fSurface);
316 fSurface = EGL_NO_SURFACE;
317 }
318
319 retire_display(fDisplay);
320 fDisplay = EGL_NO_DISPLAY;
321 } 291 }
292 fDisplay = EGL_NO_DISPLAY;
322 } 293 }
323 294
324 void CommandBufferGLTestContext::onPlatformMakeCurrent() const { 295 void CommandBufferGLTestContext::onPlatformMakeCurrent() const {
325 if (!gfFunctionsLoadedSuccessfully) { 296 if (!gfFunctionsLoadedSuccessfully) {
326 return; 297 return;
327 } 298 }
328 if (!gfMakeCurrent(fDisplay, fSurface, fSurface, fContext)) { 299 if (!gfMakeCurrent(fDisplay, fSurface, fSurface, fContext)) {
329 SkDebugf("Command Buffer: Could not make EGL context current.\n"); 300 SkDebugf("Command Buffer: Could not make EGL context current.\n");
330 } 301 }
331 } 302 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 return result; 335 return result;
365 } 336 }
366 337
367 int CommandBufferGLTestContext::getSampleCount() { 338 int CommandBufferGLTestContext::getSampleCount() {
368 EGLint result = 0; 339 EGLint result = 0;
369 gfGetConfigAttrib(fDisplay, static_cast<EGLConfig>(fConfig), EGL_SAMPLES, &r esult); 340 gfGetConfigAttrib(fDisplay, static_cast<EGLConfig>(fConfig), EGL_SAMPLES, &r esult);
370 return result; 341 return result;
371 } 342 }
372 343
373 } // namespace sk_gpu_test 344 } // namespace sk_gpu_test
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698