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

Side by Side Diff: tools/gpu/gl/debug/DebugGLContext.cpp

Issue 1815823002: Move SkGLContext and some GrGLInterface implementations to skgputest module (Closed) Base URL: https://chromium.googlesource.com/skia.git@debugobject
Patch Set: fix windows and android? Created 4 years, 8 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 | « tools/gpu/gl/debug/DebugGLContext.h ('k') | tools/gpu/gl/debug/GrBufferObj.h » ('j') | 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 * Copyright 2012 Google Inc. 3 * Copyright 2012 Google Inc.
3 * 4 *
4 * 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
5 * found in the LICENSE file. 6 * found in the LICENSE file.
6 */ 7 */
7 8
8 9 #include "DebugGLContext.h"
9 #include "gl/GrGLInterface.h"
10 10
11 #include "GrBufferObj.h" 11 #include "GrBufferObj.h"
12 #include "GrFrameBufferObj.h" 12 #include "GrFrameBufferObj.h"
13 #include "GrProgramObj.h" 13 #include "GrProgramObj.h"
14 #include "GrRenderBufferObj.h" 14 #include "GrRenderBufferObj.h"
15 #include "GrShaderObj.h" 15 #include "GrShaderObj.h"
16 #include "GrTextureObj.h" 16 #include "GrTextureObj.h"
17 #include "GrTextureUnitObj.h" 17 #include "GrTextureUnitObj.h"
18 #include "GrVertexArrayObj.h" 18 #include "GrVertexArrayObj.h"
19 #include "gl/GrGLTestInterface.h" 19 #include "gl/GrGLTestInterface.h"
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 rowStride = static_cast<GrGLint>(alignment * fTemp / componentSize); 210 rowStride = static_cast<GrGLint>(alignment * fTemp / componentSize);
211 } 211 }
212 212
213 GrGLchar *scanline = static_cast<GrGLchar *>(pixels); 213 GrGLchar *scanline = static_cast<GrGLchar *>(pixels);
214 for (int y = 0; y < height; ++y) { 214 for (int y = 0; y < height; ++y) {
215 memset(scanline, 0, componentsPerPixel * componentSize * width); 215 memset(scanline, 0, componentsPerPixel * componentSize * width);
216 scanline += rowStride; 216 scanline += rowStride;
217 } 217 }
218 } 218 }
219 219
220 GrGLvoid useProgram(GrGLuint programID) override { 220 GrGLvoid useProgram(GrGLuint programID) override {
221 221
222 // A programID of 0 is legal 222 // A programID of 0 is legal
223 GrProgramObj *program = FIND(programID, GrProgramObj, kProgram_ObjTypes ); 223 GrProgramObj *program = FIND(programID, GrProgramObj, kProgram_ObjTypes) ;
224 224
225 this->useProgram(program); 225 this->useProgram(program);
226 } 226 }
227 227
228 GrGLvoid bindFramebuffer(GrGLenum target, GrGLuint frameBufferID) override { 228 GrGLvoid bindFramebuffer(GrGLenum target, GrGLuint frameBufferID) override {
229 229
230 GrAlwaysAssert(GR_GL_FRAMEBUFFER == target || 230 GrAlwaysAssert(GR_GL_FRAMEBUFFER == target ||
231 GR_GL_READ_FRAMEBUFFER == target || 231 GR_GL_READ_FRAMEBUFFER == target ||
232 GR_GL_DRAW_FRAMEBUFFER); 232 GR_GL_DRAW_FRAMEBUFFER);
233 233
234 // a frameBufferID of 0 is acceptable - it binds to the default 234 // a frameBufferID of 0 is acceptable - it binds to the default
235 // frame buffer 235 // frame buffer
236 GrFrameBufferObj *frameBuffer = FIND(frameBufferID, GrFrameBufferObj, 236 GrFrameBufferObj *frameBuffer = FIND(frameBufferID, GrFrameBufferObj,
237 kFrameBuffer_ObjTypes);
238
239 this->setFrameBuffer(frameBuffer);
240 }
241
242 GrGLvoid bindRenderbuffer(GrGLenum target, GrGLuint renderBufferID) overrid e {
243
244 GrAlwaysAssert(GR_GL_RENDERBUFFER == target);
245
246 // a renderBufferID of 0 is acceptable - it unbinds the bound render bu ffer
247 GrRenderBufferObj *renderBuffer = FIND(renderBufferID, GrRenderBufferOb j,
248 kRenderBuffer_ObjTypes);
249
250 this->setRenderBuffer(renderBuffer);
251 }
252
253 GrGLvoid deleteTextures(GrGLsizei n, const GrGLuint* textures) override {
254 // first potentially unbind the texture
255 for (unsigned int i = 0; i < kDefaultMaxTextureUnits; ++i) {
256 GrTextureUnitObj *pTU = this->getTextureUnit(i);
257
258 if (pTU->getTexture()) {
259 for (int j = 0; j < n; ++j) {
260
261 if (textures[j] == pTU->getTexture()->getID()) {
262 // this ID is the current texture - revert the binding to 0
263 pTU->setTexture(nullptr);
264 }
265 }
266 }
267 }
268
269 // TODO: fuse the following block with DeleteRenderBuffers?
270 // Open GL will remove a deleted render buffer from the active
271 // frame buffer but not from any other frame buffer
272 if (this->getFrameBuffer()) {
273
274 GrFrameBufferObj *frameBuffer = this->getFrameBuffer();
275
276 for (int i = 0; i < n; ++i) {
277
278 if (frameBuffer->getColor() &&
279 textures[i] == frameBuffer->getColor()->getID()) {
280 frameBuffer->setColor(nullptr);
281 }
282 if (frameBuffer->getDepth() &&
283 textures[i] == frameBuffer->getDepth()->getID()) {
284 frameBuffer->setDepth(nullptr);
285 }
286 if (frameBuffer->getStencil() &&
287 textures[i] == frameBuffer->getStencil()->getID()) {
288 frameBuffer->setStencil(nullptr);
289 }
290 }
291 }
292
293 // then actually "delete" the buffers
294 for (int i = 0; i < n; ++i) {
295 GrTextureObj *buffer = FIND(textures[i], GrTextureObj, kTexture_Obj Types);
296 GrAlwaysAssert(buffer);
297
298 // OpenGL gives no guarantees if a texture is deleted while attache d to
299 // something other than the currently bound frame buffer
300 GrAlwaysAssert(!buffer->getBound());
301
302 GrAlwaysAssert(!buffer->getDeleted());
303 buffer->deleteAction();
304 }
305
306 }
307
308 GrGLvoid deleteFramebuffers(GrGLsizei n, const GrGLuint *frameBuffers) over ride {
309
310 // first potentially unbind the buffers
311 if (this->getFrameBuffer()) {
312 for (int i = 0; i < n; ++i) {
313
314 if (frameBuffers[i] ==
315 this->getFrameBuffer()->getID()) {
316 // this ID is the current frame buffer - rebind to the defa ult
317 this->setFrameBuffer(nullptr);
318 }
319 }
320 }
321
322 // then actually "delete" the buffers
323 for (int i = 0; i < n; ++i) {
324 GrFrameBufferObj *buffer = FIND(frameBuffers[i], GrFrameBufferObj,
325 kFrameBuffer_ObjTypes); 237 kFrameBuffer_ObjTypes);
326 GrAlwaysAssert(buffer); 238
327 239 this->setFrameBuffer(frameBuffer);
328 GrAlwaysAssert(!buffer->getDeleted()); 240 }
329 buffer->deleteAction(); 241
330 } 242 GrGLvoid bindRenderbuffer(GrGLenum target, GrGLuint renderBufferID) override {
331 } 243
332 244 GrAlwaysAssert(GR_GL_RENDERBUFFER == target);
333 GrGLvoid deleteRenderbuffers(GrGLsizei n,const GrGLuint *renderBuffers) ove rride { 245
334 246 // a renderBufferID of 0 is acceptable - it unbinds the bound render buf fer
335 // first potentially unbind the buffers 247 GrRenderBufferObj *renderBuffer = FIND(renderBufferID, GrRenderBufferObj ,
336 if (this->getRenderBuffer()) { 248 kRenderBuffer_ObjTypes);
337 for (int i = 0; i < n; ++i) { 249
338 250 this->setRenderBuffer(renderBuffer);
339 if (renderBuffers[i] == 251 }
340 this->getRenderBuffer()->getID()) { 252
341 // this ID is the current render buffer - make no 253 GrGLvoid deleteTextures(GrGLsizei n, const GrGLuint* textures) override {
342 // render buffer be bound 254 // first potentially unbind the texture
343 this->setRenderBuffer(nullptr); 255 for (unsigned int i = 0; i < kDefaultMaxTextureUnits; ++i) {
344 } 256 GrTextureUnitObj *pTU = this->getTextureUnit(i);
345 } 257
346 } 258 if (pTU->getTexture()) {
347 259 for (int j = 0; j < n; ++j) {
348 // TODO: fuse the following block with DeleteTextures? 260
349 // Open GL will remove a deleted render buffer from the active frame 261 if (textures[j] == pTU->getTexture()->getID()) {
350 // buffer but not from any other frame buffer 262 // this ID is the current texture - revert the binding t o 0
351 if (this->getFrameBuffer()) { 263 pTU->setTexture(nullptr);
352 264 }
353 GrFrameBufferObj *frameBuffer = this->getFrameBuffer(); 265 }
354 266 }
355 for (int i = 0; i < n; ++i) { 267 }
356 268
357 if (frameBuffer->getColor() && 269 // TODO: fuse the following block with DeleteRenderBuffers?
358 renderBuffers[i] == frameBuffer->getColor()->getID()) { 270 // Open GL will remove a deleted render buffer from the active
359 frameBuffer->setColor(nullptr); 271 // frame buffer but not from any other frame buffer
360 } 272 if (this->getFrameBuffer()) {
361 if (frameBuffer->getDepth() && 273
362 renderBuffers[i] == frameBuffer->getDepth()->getID()) { 274 GrFrameBufferObj *frameBuffer = this->getFrameBuffer();
363 frameBuffer->setDepth(nullptr); 275
364 } 276 for (int i = 0; i < n; ++i) {
365 if (frameBuffer->getStencil() && 277
366 renderBuffers[i] == frameBuffer->getStencil()->getID()) { 278 if (frameBuffer->getColor() &&
367 frameBuffer->setStencil(nullptr); 279 textures[i] == frameBuffer->getColor()->getID()) {
368 } 280 frameBuffer->setColor(nullptr);
369 } 281 }
370 } 282 if (frameBuffer->getDepth() &&
371 283 textures[i] == frameBuffer->getDepth()->getID()) {
372 // then actually "delete" the buffers 284 frameBuffer->setDepth(nullptr);
373 for (int i = 0; i < n; ++i) { 285 }
374 GrRenderBufferObj *buffer = FIND(renderBuffers[i], GrRenderBufferOb j, 286 if (frameBuffer->getStencil() &&
375 kRenderBuffer_ObjTypes); 287 textures[i] == frameBuffer->getStencil()->getID()) {
376 GrAlwaysAssert(buffer); 288 frameBuffer->setStencil(nullptr);
377 289 }
378 // OpenGL gives no guarantees if a render buffer is deleted 290 }
379 // while attached to something other than the currently 291 }
380 // bound frame buffer 292
381 GrAlwaysAssert(!buffer->getColorBound()); 293 // then actually "delete" the buffers
382 GrAlwaysAssert(!buffer->getDepthBound()); 294 for (int i = 0; i < n; ++i) {
383 // However, at GrContext destroy time we release all GrRsources and so stencil buffers 295 GrTextureObj *buffer = FIND(textures[i], GrTextureObj, kTexture_ObjT ypes);
384 // may get deleted before FBOs that refer to them. 296 GrAlwaysAssert(buffer);
385 //GrAlwaysAssert(!buffer->getStencilBound()); 297
386 298 // OpenGL gives no guarantees if a texture is deleted while attached to
387 GrAlwaysAssert(!buffer->getDeleted()); 299 // something other than the currently bound frame buffer
388 buffer->deleteAction(); 300 GrAlwaysAssert(!buffer->getBound());
389 } 301
390 } 302 GrAlwaysAssert(!buffer->getDeleted());
391 303 buffer->deleteAction();
392 GrGLvoid framebufferRenderbuffer(GrGLenum target, 304 }
393 GrGLenum attachment, 305
394 GrGLenum renderbuffertarget, 306 }
395 GrGLuint renderBufferID) override { 307
396 308 GrGLvoid deleteFramebuffers(GrGLsizei n, const GrGLuint *frameBuffers) overr ide {
397 GrAlwaysAssert(GR_GL_FRAMEBUFFER == target); 309
398 GrAlwaysAssert(GR_GL_COLOR_ATTACHMENT0 == attachment || 310 // first potentially unbind the buffers
399 GR_GL_DEPTH_ATTACHMENT == attachment || 311 if (this->getFrameBuffer()) {
400 GR_GL_STENCIL_ATTACHMENT == attachment); 312 for (int i = 0; i < n; ++i) {
401 GrAlwaysAssert(GR_GL_RENDERBUFFER == renderbuffertarget); 313
402 314 if (frameBuffers[i] ==
403 GrFrameBufferObj *framebuffer = this->getFrameBuffer(); 315 this->getFrameBuffer()->getID()) {
404 // A render buffer cannot be attached to the default framebuffer 316 // this ID is the current frame buffer - rebind to the defau lt
405 GrAlwaysAssert(framebuffer); 317 this->setFrameBuffer(nullptr);
406 318 }
407 // a renderBufferID of 0 is acceptable - it unbinds the current 319 }
408 // render buffer 320 }
409 GrRenderBufferObj *renderbuffer = FIND(renderBufferID, GrRenderBufferOb j, 321
410 kRenderBuffer_ObjTypes); 322 // then actually "delete" the buffers
411 323 for (int i = 0; i < n; ++i) {
412 switch (attachment) { 324 GrFrameBufferObj *buffer = FIND(frameBuffers[i], GrFrameBufferObj,
413 case GR_GL_COLOR_ATTACHMENT0: 325 kFrameBuffer_ObjTypes);
414 framebuffer->setColor(renderbuffer); 326 GrAlwaysAssert(buffer);
415 break; 327
416 case GR_GL_DEPTH_ATTACHMENT: 328 GrAlwaysAssert(!buffer->getDeleted());
417 framebuffer->setDepth(renderbuffer); 329 buffer->deleteAction();
418 break; 330 }
419 case GR_GL_STENCIL_ATTACHMENT: 331 }
420 framebuffer->setStencil(renderbuffer); 332
421 break; 333 GrGLvoid deleteRenderbuffers(GrGLsizei n,const GrGLuint *renderBuffers) over ride {
422 default: 334
423 GrAlwaysAssert(false); 335 // first potentially unbind the buffers
424 break; 336 if (this->getRenderBuffer()) {
425 }; 337 for (int i = 0; i < n; ++i) {
426 338
427 } 339 if (renderBuffers[i] ==
428 340 this->getRenderBuffer()->getID()) {
429 /////////////////////////////////////////////////////////////////////////// ///// 341 // this ID is the current render buffer - make no
430 GrGLvoid framebufferTexture2D(GrGLenum target, GrGLenum attachment, GrGLenu m textarget, 342 // render buffer be bound
431 GrGLuint textureID, GrGLint level) override { 343 this->setRenderBuffer(nullptr);
432 344 }
433 GrAlwaysAssert(GR_GL_FRAMEBUFFER == target); 345 }
434 GrAlwaysAssert(GR_GL_COLOR_ATTACHMENT0 == attachment || 346 }
435 GR_GL_DEPTH_ATTACHMENT == attachment || 347
436 GR_GL_STENCIL_ATTACHMENT == attachment); 348 // TODO: fuse the following block with DeleteTextures?
437 GrAlwaysAssert(GR_GL_TEXTURE_2D == textarget); 349 // Open GL will remove a deleted render buffer from the active frame
438 350 // buffer but not from any other frame buffer
439 GrFrameBufferObj *framebuffer = this->getFrameBuffer(); 351 if (this->getFrameBuffer()) {
440 // A texture cannot be attached to the default framebuffer 352
441 GrAlwaysAssert(framebuffer); 353 GrFrameBufferObj *frameBuffer = this->getFrameBuffer();
442 354
443 // A textureID of 0 is allowed - it unbinds the currently bound texture 355 for (int i = 0; i < n; ++i) {
444 GrTextureObj *texture = FIND(textureID, GrTextureObj, kTexture_ObjTypes ); 356
445 if (texture) { 357 if (frameBuffer->getColor() &&
446 // The texture shouldn't be bound to a texture unit - this 358 renderBuffers[i] == frameBuffer->getColor()->getID()) {
447 // could lead to a feedback loop 359 frameBuffer->setColor(nullptr);
448 GrAlwaysAssert(!texture->getBound()); 360 }
449 } 361 if (frameBuffer->getDepth() &&
450 362 renderBuffers[i] == frameBuffer->getDepth()->getID()) {
451 GrAlwaysAssert(0 == level); 363 frameBuffer->setDepth(nullptr);
452 364 }
453 switch (attachment) { 365 if (frameBuffer->getStencil() &&
454 case GR_GL_COLOR_ATTACHMENT0: 366 renderBuffers[i] == frameBuffer->getStencil()->getID()) {
455 framebuffer->setColor(texture); 367 frameBuffer->setStencil(nullptr);
456 break; 368 }
457 case GR_GL_DEPTH_ATTACHMENT: 369 }
458 framebuffer->setDepth(texture); 370 }
459 break; 371
460 case GR_GL_STENCIL_ATTACHMENT: 372 // then actually "delete" the buffers
461 framebuffer->setStencil(texture); 373 for (int i = 0; i < n; ++i) {
462 break; 374 GrRenderBufferObj *buffer = FIND(renderBuffers[i], GrRenderBufferObj ,
463 default: 375 kRenderBuffer_ObjTypes);
464 GrAlwaysAssert(false); 376 GrAlwaysAssert(buffer);
465 break; 377
466 }; 378 // OpenGL gives no guarantees if a render buffer is deleted
467 } 379 // while attached to something other than the currently
380 // bound frame buffer
381 GrAlwaysAssert(!buffer->getColorBound());
382 GrAlwaysAssert(!buffer->getDepthBound());
383 // However, at GrContext destroy time we release all GrRsources and so stencil buffers
384 // may get deleted before FBOs that refer to them.
385 //GrAlwaysAssert(!buffer->getStencilBound());
386
387 GrAlwaysAssert(!buffer->getDeleted());
388 buffer->deleteAction();
389 }
390 }
391
392 GrGLvoid framebufferRenderbuffer(GrGLenum target,
393 GrGLenum attachment,
394 GrGLenum renderbuffertarget,
395 GrGLuint renderBufferID) override {
396
397 GrAlwaysAssert(GR_GL_FRAMEBUFFER == target);
398 GrAlwaysAssert(GR_GL_COLOR_ATTACHMENT0 == attachment ||
399 GR_GL_DEPTH_ATTACHMENT == attachment ||
400 GR_GL_STENCIL_ATTACHMENT == attachment);
401 GrAlwaysAssert(GR_GL_RENDERBUFFER == renderbuffertarget);
402
403 GrFrameBufferObj *framebuffer = this->getFrameBuffer();
404 // A render buffer cannot be attached to the default framebuffer
405 GrAlwaysAssert(framebuffer);
406
407 // a renderBufferID of 0 is acceptable - it unbinds the current
408 // render buffer
409 GrRenderBufferObj *renderbuffer = FIND(renderBufferID, GrRenderBufferObj ,
410 kRenderBuffer_ObjTypes);
411
412 switch (attachment) {
413 case GR_GL_COLOR_ATTACHMENT0:
414 framebuffer->setColor(renderbuffer);
415 break;
416 case GR_GL_DEPTH_ATTACHMENT:
417 framebuffer->setDepth(renderbuffer);
418 break;
419 case GR_GL_STENCIL_ATTACHMENT:
420 framebuffer->setStencil(renderbuffer);
421 break;
422 default:
423 GrAlwaysAssert(false);
424 break;
425 };
426
427 }
428
429 //////////////////////////////////////////////////////////////////////////// ////
430 GrGLvoid framebufferTexture2D(GrGLenum target, GrGLenum attachment, GrGLenum textarget,
431 GrGLuint textureID, GrGLint level) override {
432
433 GrAlwaysAssert(GR_GL_FRAMEBUFFER == target);
434 GrAlwaysAssert(GR_GL_COLOR_ATTACHMENT0 == attachment ||
435 GR_GL_DEPTH_ATTACHMENT == attachment ||
436 GR_GL_STENCIL_ATTACHMENT == attachment);
437 GrAlwaysAssert(GR_GL_TEXTURE_2D == textarget);
438
439 GrFrameBufferObj *framebuffer = this->getFrameBuffer();
440 // A texture cannot be attached to the default framebuffer
441 GrAlwaysAssert(framebuffer);
442
443 // A textureID of 0 is allowed - it unbinds the currently bound texture
444 GrTextureObj *texture = FIND(textureID, GrTextureObj, kTexture_ObjTypes) ;
445 if (texture) {
446 // The texture shouldn't be bound to a texture unit - this
447 // could lead to a feedback loop
448 GrAlwaysAssert(!texture->getBound());
449 }
450
451 GrAlwaysAssert(0 == level);
452
453 switch (attachment) {
454 case GR_GL_COLOR_ATTACHMENT0:
455 framebuffer->setColor(texture);
456 break;
457 case GR_GL_DEPTH_ATTACHMENT:
458 framebuffer->setDepth(texture);
459 break;
460 case GR_GL_STENCIL_ATTACHMENT:
461 framebuffer->setStencil(texture);
462 break;
463 default:
464 GrAlwaysAssert(false);
465 break;
466 };
467 }
468 468
469 GrGLuint createProgram() override { 469 GrGLuint createProgram() override {
470 470
471 GrProgramObj *program = CREATE(GrProgramObj, kProgram_ObjTypes); 471 GrProgramObj *program = CREATE(GrProgramObj, kProgram_ObjTypes);
472 472
473 return program->getID(); 473 return program->getID();
474 } 474 }
475 475
476 GrGLuint createShader(GrGLenum type) override { 476 GrGLuint createShader(GrGLenum type) override {
477 477
(...skipping 744 matching lines...) Expand 10 before | Expand all | Expand 10 after
1222 const char* DebugInterface::kExtensions[] = { 1222 const char* DebugInterface::kExtensions[] = {
1223 "GL_ARB_framebuffer_object", 1223 "GL_ARB_framebuffer_object",
1224 "GL_ARB_blend_func_extended", 1224 "GL_ARB_blend_func_extended",
1225 "GL_ARB_timer_query", 1225 "GL_ARB_timer_query",
1226 "GL_ARB_draw_buffers", 1226 "GL_ARB_draw_buffers",
1227 "GL_ARB_occlusion_query", 1227 "GL_ARB_occlusion_query",
1228 "GL_EXT_stencil_wrap", 1228 "GL_EXT_stencil_wrap",
1229 nullptr, // signifies the end of the array. 1229 nullptr, // signifies the end of the array.
1230 }; 1230 };
1231 1231
1232 class DebugGLContext : public sk_gpu_test::GLContext {
1233 public:
1234 DebugGLContext() {
1235 this->init(new DebugInterface());
1236 }
1237
1238 ~DebugGLContext() override { this->teardown(); }
1239
1240 private:
1241 void onPlatformMakeCurrent() const override {}
1242 void onPlatformSwapBuffers() const override {}
1243 GrGLFuncPtr onPlatformGetProcAddress(const char*) const override { return nu llptr; }
1244 };
1232 } // anonymous namespace 1245 } // anonymous namespace
1233 1246
1234 //////////////////////////////////////////////////////////////////////////////// 1247 namespace sk_gpu_test {
1235 1248 GLContext* CreateDebugGLContext() {
1236 const GrGLInterface* GrGLCreateDebugInterface() { return new DebugInterface; } 1249 GLContext* ctx = new DebugGLContext();
1250 if (ctx->isValid()) {
1251 return ctx;
1252 }
1253 delete ctx;
1254 return nullptr;
1255 }
1256 }
OLDNEW
« no previous file with comments | « tools/gpu/gl/debug/DebugGLContext.h ('k') | tools/gpu/gl/debug/GrBufferObj.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698