OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
6 | 6 |
7 #include "base/atomicops.h" | 7 #include "base/atomicops.h" |
8 #include "gpu/command_buffer/common/gles2_cmd_format.h" | 8 #include "gpu/command_buffer/common/gles2_cmd_format.h" |
9 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 9 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
10 #include "gpu/command_buffer/common/id_allocator.h" | 10 #include "gpu/command_buffer/common/id_allocator.h" |
(...skipping 8363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8374 InitDecoder( | 8374 InitDecoder( |
8375 "", // extensions | 8375 "", // extensions |
8376 false, // has alpha | 8376 false, // has alpha |
8377 false, // has depth | 8377 false, // has depth |
8378 false, // has stencil | 8378 false, // has stencil |
8379 false, // request alpha | 8379 false, // request alpha |
8380 false, // request depth | 8380 false, // request depth |
8381 false, // request stencil | 8381 false, // request stencil |
8382 true); // bind generates resource | 8382 true); // bind generates resource |
8383 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | 8383 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); |
8384 EXPECT_CALL(*memory_tracker, EnsureGPUMemoryAvailable(128)) | 8384 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) |
8385 .WillOnce(Return(true)) | 8385 .WillOnce(Return(true)).RetiresOnSaturation(); |
8386 .RetiresOnSaturation(); | |
8387 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 8, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, | 8386 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 8, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, |
8388 kSharedMemoryId, kSharedMemoryOffset); | 8387 kSharedMemoryId, kSharedMemoryOffset); |
8389 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); | 8388 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); |
8390 EXPECT_CALL(*memory_tracker, EnsureGPUMemoryAvailable(64)) | 8389 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(64)) |
8391 .WillOnce(Return(true)) | 8390 .WillOnce(Return(true)).RetiresOnSaturation(); |
8392 .RetiresOnSaturation(); | |
8393 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, | 8391 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, |
8394 kSharedMemoryId, kSharedMemoryOffset); | 8392 kSharedMemoryId, kSharedMemoryOffset); |
8395 EXPECT_EQ(64u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); | 8393 EXPECT_EQ(64u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); |
8396 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 8394 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
8397 // Check we get out of memory and no call to glTexImage2D if Ensure fails. | 8395 // Check we get out of memory and no call to glTexImage2D if Ensure fails. |
8398 EXPECT_CALL(*memory_tracker, EnsureGPUMemoryAvailable(64)) | 8396 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(64)) |
8399 .WillOnce(Return(false)) | 8397 .WillOnce(Return(false)).RetiresOnSaturation(); |
8400 .RetiresOnSaturation(); | |
8401 TexImage2D cmd; | 8398 TexImage2D cmd; |
8402 cmd.Init(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, | 8399 cmd.Init(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, |
8403 kSharedMemoryId, kSharedMemoryOffset); | 8400 kSharedMemoryId, kSharedMemoryOffset); |
8404 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 8401 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
8405 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); | 8402 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); |
8406 EXPECT_EQ(64u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); | 8403 EXPECT_EQ(64u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); |
8407 } | 8404 } |
8408 | 8405 |
8409 TEST_F(GLES2DecoderManualInitTest, MemoryTrackerTexStorage2DEXT) { | 8406 TEST_F(GLES2DecoderManualInitTest, MemoryTrackerTexStorage2DEXT) { |
8410 scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = | 8407 scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = |
8411 new SizeOnlyMemoryTracker(); | 8408 new SizeOnlyMemoryTracker(); |
8412 set_memory_tracker(memory_tracker.get()); | 8409 set_memory_tracker(memory_tracker.get()); |
8413 InitDecoder( | 8410 InitDecoder( |
8414 "", // extensions | 8411 "", // extensions |
8415 false, // has alpha | 8412 false, // has alpha |
8416 false, // has depth | 8413 false, // has depth |
8417 false, // has stencil | 8414 false, // has stencil |
8418 false, // request alpha | 8415 false, // request alpha |
8419 false, // request depth | 8416 false, // request depth |
8420 false, // request stencil | 8417 false, // request stencil |
8421 true); // bind generates resource | 8418 true); // bind generates resource |
8422 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | 8419 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); |
8423 // Check we get out of memory and no call to glTexStorage2DEXT | 8420 // Check we get out of memory and no call to glTexStorage2DEXT |
8424 // if Ensure fails. | 8421 // if Ensure fails. |
8425 EXPECT_CALL(*memory_tracker, EnsureGPUMemoryAvailable(128)) | 8422 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) |
8426 .WillOnce(Return(false)) | 8423 .WillOnce(Return(false)).RetiresOnSaturation(); |
8427 .RetiresOnSaturation(); | |
8428 TexStorage2DEXT cmd; | 8424 TexStorage2DEXT cmd; |
8429 cmd.Init(GL_TEXTURE_2D, 1, GL_RGBA8, 8, 4); | 8425 cmd.Init(GL_TEXTURE_2D, 1, GL_RGBA8, 8, 4); |
8430 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 8426 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
8431 EXPECT_EQ(0u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); | 8427 EXPECT_EQ(0u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); |
8432 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); | 8428 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); |
8433 } | 8429 } |
8434 | 8430 |
8435 TEST_F(GLES2DecoderManualInitTest, MemoryTrackerCopyTexImage2D) { | 8431 TEST_F(GLES2DecoderManualInitTest, MemoryTrackerCopyTexImage2D) { |
8436 GLenum target = GL_TEXTURE_2D; | 8432 GLenum target = GL_TEXTURE_2D; |
8437 GLint level = 0; | 8433 GLint level = 0; |
8438 GLenum internal_format = GL_RGBA; | 8434 GLenum internal_format = GL_RGBA; |
8439 GLsizei width = 4; | 8435 GLsizei width = 4; |
8440 GLsizei height = 8; | 8436 GLsizei height = 8; |
8441 GLint border = 0; | 8437 GLint border = 0; |
8442 scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = | 8438 scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = |
8443 new SizeOnlyMemoryTracker(); | 8439 new SizeOnlyMemoryTracker(); |
8444 set_memory_tracker(memory_tracker.get()); | 8440 set_memory_tracker(memory_tracker.get()); |
8445 InitDecoder( | 8441 InitDecoder( |
8446 "", // extensions | 8442 "", // extensions |
8447 true, // has alpha | 8443 true, // has alpha |
8448 false, // has depth | 8444 false, // has depth |
8449 false, // has stencil | 8445 false, // has stencil |
8450 true, // request alpha | 8446 true, // request alpha |
8451 false, // request depth | 8447 false, // request depth |
8452 false, // request stencil | 8448 false, // request stencil |
8453 true); // bind generates resource | 8449 true); // bind generates resource |
8454 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | 8450 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); |
8455 EXPECT_CALL(*memory_tracker, EnsureGPUMemoryAvailable(128)) | 8451 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) |
8456 .WillOnce(Return(true)) | 8452 .WillOnce(Return(true)).RetiresOnSaturation(); |
8457 .RetiresOnSaturation(); | |
8458 EXPECT_CALL(*gl_, GetError()) | 8453 EXPECT_CALL(*gl_, GetError()) |
8459 .WillOnce(Return(GL_NO_ERROR)) | 8454 .WillOnce(Return(GL_NO_ERROR)) |
8460 .WillOnce(Return(GL_NO_ERROR)) | 8455 .WillOnce(Return(GL_NO_ERROR)) |
8461 .RetiresOnSaturation(); | 8456 .RetiresOnSaturation(); |
8462 EXPECT_CALL(*gl_, CopyTexImage2D( | 8457 EXPECT_CALL(*gl_, CopyTexImage2D( |
8463 target, level, internal_format, 0, 0, width, height, border)) | 8458 target, level, internal_format, 0, 0, width, height, border)) |
8464 .Times(1) | 8459 .Times(1) |
8465 .RetiresOnSaturation(); | 8460 .RetiresOnSaturation(); |
8466 CopyTexImage2D cmd; | 8461 CopyTexImage2D cmd; |
8467 cmd.Init(target, level, internal_format, 0, 0, width, height, border); | 8462 cmd.Init(target, level, internal_format, 0, 0, width, height, border); |
8468 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 8463 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
8469 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); | 8464 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); |
8470 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 8465 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
8471 // Check we get out of memory and no call to glCopyTexImage2D if Ensure fails. | 8466 // Check we get out of memory and no call to glCopyTexImage2D if Ensure fails. |
8472 EXPECT_CALL(*memory_tracker, EnsureGPUMemoryAvailable(128)) | 8467 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) |
8473 .WillOnce(Return(false)) | 8468 .WillOnce(Return(false)).RetiresOnSaturation(); |
8474 .RetiresOnSaturation(); | |
8475 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 8469 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
8476 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); | 8470 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); |
8477 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); | 8471 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); |
8478 } | 8472 } |
8479 | 8473 |
8480 TEST_F(GLES2DecoderManualInitTest, MemoryTrackerRenderbufferStorage) { | 8474 TEST_F(GLES2DecoderManualInitTest, MemoryTrackerRenderbufferStorage) { |
8481 scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = | 8475 scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = |
8482 new SizeOnlyMemoryTracker(); | 8476 new SizeOnlyMemoryTracker(); |
8483 set_memory_tracker(memory_tracker.get()); | 8477 set_memory_tracker(memory_tracker.get()); |
8484 InitDecoder( | 8478 InitDecoder( |
8485 "", // extensions | 8479 "", // extensions |
8486 false, // has alpha | 8480 false, // has alpha |
8487 false, // has depth | 8481 false, // has depth |
8488 false, // has stencil | 8482 false, // has stencil |
8489 false, // request alpha | 8483 false, // request alpha |
8490 false, // request depth | 8484 false, // request depth |
8491 false, // request stencil | 8485 false, // request stencil |
8492 true); // bind generates resource | 8486 true); // bind generates resource |
8493 DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, | 8487 DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, |
8494 kServiceRenderbufferId); | 8488 kServiceRenderbufferId); |
8495 EXPECT_CALL(*gl_, GetError()) | 8489 EXPECT_CALL(*gl_, GetError()) |
8496 .WillOnce(Return(GL_NO_ERROR)) | 8490 .WillOnce(Return(GL_NO_ERROR)) |
8497 .WillOnce(Return(GL_NO_ERROR)) | 8491 .WillOnce(Return(GL_NO_ERROR)) |
8498 .RetiresOnSaturation(); | 8492 .RetiresOnSaturation(); |
8499 EXPECT_CALL(*memory_tracker, EnsureGPUMemoryAvailable(128)) | 8493 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) |
8500 .WillOnce(Return(true)) | 8494 .WillOnce(Return(true)).RetiresOnSaturation(); |
8501 .RetiresOnSaturation(); | |
8502 EXPECT_CALL(*gl_, RenderbufferStorageEXT( | 8495 EXPECT_CALL(*gl_, RenderbufferStorageEXT( |
8503 GL_RENDERBUFFER, GL_RGBA, 8, 4)) | 8496 GL_RENDERBUFFER, GL_RGBA, 8, 4)) |
8504 .Times(1) | 8497 .Times(1) |
8505 .RetiresOnSaturation(); | 8498 .RetiresOnSaturation(); |
8506 RenderbufferStorage cmd; | 8499 RenderbufferStorage cmd; |
8507 cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 8, 4); | 8500 cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 8, 4); |
8508 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 8501 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
8509 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 8502 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
8510 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); | 8503 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); |
8511 // Check we get out of memory and no call to glRenderbufferStorage if Ensure | 8504 // Check we get out of memory and no call to glRenderbufferStorage if Ensure |
8512 // fails. | 8505 // fails. |
8513 EXPECT_CALL(*memory_tracker, EnsureGPUMemoryAvailable(128)) | 8506 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) |
8514 .WillOnce(Return(false)) | 8507 .WillOnce(Return(false)).RetiresOnSaturation(); |
8515 .RetiresOnSaturation(); | |
8516 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 8508 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
8517 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); | 8509 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); |
8518 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); | 8510 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); |
8519 } | 8511 } |
8520 | 8512 |
8521 TEST_F(GLES2DecoderManualInitTest, MemoryTrackerBufferData) { | 8513 TEST_F(GLES2DecoderManualInitTest, MemoryTrackerBufferData) { |
8522 scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = | 8514 scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = |
8523 new SizeOnlyMemoryTracker(); | 8515 new SizeOnlyMemoryTracker(); |
8524 set_memory_tracker(memory_tracker.get()); | 8516 set_memory_tracker(memory_tracker.get()); |
8525 InitDecoder( | 8517 InitDecoder( |
8526 "", // extensions | 8518 "", // extensions |
8527 false, // has alpha | 8519 false, // has alpha |
8528 false, // has depth | 8520 false, // has depth |
8529 false, // has stencil | 8521 false, // has stencil |
8530 false, // request alpha | 8522 false, // request alpha |
8531 false, // request depth | 8523 false, // request depth |
8532 false, // request stencil | 8524 false, // request stencil |
8533 true); // bind generates resource | 8525 true); // bind generates resource |
8534 DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, | 8526 DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, |
8535 kServiceBufferId); | 8527 kServiceBufferId); |
8536 EXPECT_CALL(*gl_, GetError()) | 8528 EXPECT_CALL(*gl_, GetError()) |
8537 .WillOnce(Return(GL_NO_ERROR)) | 8529 .WillOnce(Return(GL_NO_ERROR)) |
8538 .WillOnce(Return(GL_NO_ERROR)) | 8530 .WillOnce(Return(GL_NO_ERROR)) |
8539 .RetiresOnSaturation(); | 8531 .RetiresOnSaturation(); |
8540 EXPECT_CALL(*memory_tracker, EnsureGPUMemoryAvailable(128)) | 8532 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) |
8541 .WillOnce(Return(true)) | 8533 .WillOnce(Return(true)).RetiresOnSaturation(); |
8542 .RetiresOnSaturation(); | |
8543 EXPECT_CALL(*gl_, BufferData(GL_ARRAY_BUFFER, 128, _, GL_STREAM_DRAW)) | 8534 EXPECT_CALL(*gl_, BufferData(GL_ARRAY_BUFFER, 128, _, GL_STREAM_DRAW)) |
8544 .Times(1) | 8535 .Times(1) |
8545 .RetiresOnSaturation(); | 8536 .RetiresOnSaturation(); |
8546 BufferData cmd; | 8537 BufferData cmd; |
8547 cmd.Init(GL_ARRAY_BUFFER, 128, 0, 0, GL_STREAM_DRAW); | 8538 cmd.Init(GL_ARRAY_BUFFER, 128, 0, 0, GL_STREAM_DRAW); |
8548 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 8539 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
8549 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 8540 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
8550 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kManaged)); | 8541 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kManaged)); |
8551 // Check we get out of memory and no call to glBufferData if Ensure | 8542 // Check we get out of memory and no call to glBufferData if Ensure |
8552 // fails. | 8543 // fails. |
8553 EXPECT_CALL(*memory_tracker, EnsureGPUMemoryAvailable(128)) | 8544 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) |
8554 .WillOnce(Return(false)) | 8545 .WillOnce(Return(false)).RetiresOnSaturation(); |
8555 .RetiresOnSaturation(); | |
8556 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 8546 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
8557 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); | 8547 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); |
8558 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kManaged)); | 8548 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kManaged)); |
8559 } | 8549 } |
8560 | 8550 |
8561 TEST_F(GLES2DecoderTest, DrawBuffersEXTImmediateSuccceeds) { | 8551 TEST_F(GLES2DecoderTest, DrawBuffersEXTImmediateSuccceeds) { |
8562 const GLsizei count = 1; | 8552 const GLsizei count = 1; |
8563 const GLenum bufs[] = { GL_COLOR_ATTACHMENT0 }; | 8553 const GLenum bufs[] = { GL_COLOR_ATTACHMENT0 }; |
8564 DrawBuffersEXTImmediate& cmd = | 8554 DrawBuffersEXTImmediate& cmd = |
8565 *GetImmediateAs<DrawBuffersEXTImmediate>(); | 8555 *GetImmediateAs<DrawBuffersEXTImmediate>(); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8642 // TODO(gman): TexImage2DImmediate | 8632 // TODO(gman): TexImage2DImmediate |
8643 | 8633 |
8644 // TODO(gman): TexSubImage2DImmediate | 8634 // TODO(gman): TexSubImage2DImmediate |
8645 | 8635 |
8646 // TODO(gman): UseProgram | 8636 // TODO(gman): UseProgram |
8647 | 8637 |
8648 // TODO(gman): SwapBuffers | 8638 // TODO(gman): SwapBuffers |
8649 | 8639 |
8650 } // namespace gles2 | 8640 } // namespace gles2 |
8651 } // namespace gpu | 8641 } // namespace gpu |
OLD | NEW |