| 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/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
| 9 #include "gpu/command_buffer/common/gles2_cmd_format.h" | 9 #include "gpu/command_buffer/common/gles2_cmd_format.h" |
| 10 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 10 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
| (...skipping 8205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8216 // Set a mock Async delegate | 8216 // Set a mock Async delegate |
| 8217 StrictMock<gpu::MockAsyncPixelTransferManager>* manager = | 8217 StrictMock<gpu::MockAsyncPixelTransferManager>* manager = |
| 8218 new StrictMock<gpu::MockAsyncPixelTransferManager>; | 8218 new StrictMock<gpu::MockAsyncPixelTransferManager>; |
| 8219 manager->Initialize(group().texture_manager()); | 8219 manager->Initialize(group().texture_manager()); |
| 8220 decoder_->SetAsyncPixelTransferManagerForTest(manager); | 8220 decoder_->SetAsyncPixelTransferManagerForTest(manager); |
| 8221 StrictMock<gpu::MockAsyncPixelTransferDelegate>* delegate = NULL; | 8221 StrictMock<gpu::MockAsyncPixelTransferDelegate>* delegate = NULL; |
| 8222 | 8222 |
| 8223 // Tex(Sub)Image2D upload commands. | 8223 // Tex(Sub)Image2D upload commands. |
| 8224 AsyncTexImage2DCHROMIUM teximage_cmd; | 8224 AsyncTexImage2DCHROMIUM teximage_cmd; |
| 8225 teximage_cmd.Init(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, | 8225 teximage_cmd.Init(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, |
| 8226 GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset, | 8226 GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset); |
| 8227 0, 0, 0); | |
| 8228 AsyncTexSubImage2DCHROMIUM texsubimage_cmd; | 8227 AsyncTexSubImage2DCHROMIUM texsubimage_cmd; |
| 8229 texsubimage_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 8, 8, GL_RGBA, | 8228 texsubimage_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 8, 8, GL_RGBA, |
| 8230 GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset, | 8229 GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset); |
| 8231 0, 0, 0); | |
| 8232 WaitAsyncTexImage2DCHROMIUM wait_cmd; | 8230 WaitAsyncTexImage2DCHROMIUM wait_cmd; |
| 8233 wait_cmd.Init(GL_TEXTURE_2D); | 8231 wait_cmd.Init(GL_TEXTURE_2D); |
| 8234 WaitAllAsyncTexImage2DCHROMIUM wait_all_cmd; | |
| 8235 wait_all_cmd.Init(); | |
| 8236 | 8232 |
| 8237 // No transfer state exists initially. | 8233 // No transfer state exists initially. |
| 8238 EXPECT_FALSE( | 8234 EXPECT_FALSE( |
| 8239 decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( | 8235 decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( |
| 8240 texture_ref)); | 8236 texture_ref)); |
| 8241 | 8237 |
| 8242 base::Closure bind_callback; | 8238 base::Closure bind_callback; |
| 8243 | 8239 |
| 8244 // AsyncTexImage2D | 8240 // AsyncTexImage2D |
| 8245 { | 8241 { |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8357 DoDeleteTexture(client_texture_id_, kServiceTextureId); | 8353 DoDeleteTexture(client_texture_id_, kServiceTextureId); |
| 8358 EXPECT_FALSE( | 8354 EXPECT_FALSE( |
| 8359 decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( | 8355 decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( |
| 8360 texture_ref)); | 8356 texture_ref)); |
| 8361 delegate = NULL; | 8357 delegate = NULL; |
| 8362 } | 8358 } |
| 8363 | 8359 |
| 8364 // WaitAsyncTexImage2D | 8360 // WaitAsyncTexImage2D |
| 8365 { | 8361 { |
| 8366 // Get a fresh texture since the existing texture cannot be respecified | 8362 // Get a fresh texture since the existing texture cannot be respecified |
| 8367 // asynchronously and AsyncTexSubImage2D does not involve binding. | 8363 // asynchronously and AsyncTexSubImage2D does not involved binding. |
| 8368 EXPECT_CALL(*gl_, GenTextures(1, _)) | 8364 EXPECT_CALL(*gl_, GenTextures(1, _)) |
| 8369 .WillOnce(SetArgumentPointee<1>(kServiceTextureId)); | 8365 .WillOnce(SetArgumentPointee<1>(kServiceTextureId)); |
| 8370 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | 8366 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); |
| 8371 texture_ref = GetTexture(client_texture_id_); | 8367 texture_ref = GetTexture(client_texture_id_); |
| 8372 texture = texture_ref->texture(); | 8368 texture = texture_ref->texture(); |
| 8373 texture->SetImmutable(false); | 8369 texture->SetImmutable(false); |
| 8374 // Create transfer state since it doesn't exist. | 8370 // Create transfer state since it doesn't exist. |
| 8375 EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _)) | 8371 EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _)) |
| 8376 .WillOnce(Return( | 8372 .WillOnce(Return( |
| 8377 delegate = new StrictMock<gpu::MockAsyncPixelTransferDelegate>)) | 8373 delegate = new StrictMock<gpu::MockAsyncPixelTransferDelegate>)) |
| 8378 .RetiresOnSaturation(); | 8374 .RetiresOnSaturation(); |
| 8379 EXPECT_CALL(*delegate, AsyncTexImage2D(_, _, _)) | 8375 EXPECT_CALL(*delegate, AsyncTexImage2D(_, _, _)) |
| 8380 .RetiresOnSaturation(); | 8376 .RetiresOnSaturation(); |
| 8381 // Start async transfer. | 8377 // Start async transfer. |
| 8382 EXPECT_EQ(error::kNoError, ExecuteCmd(teximage_cmd)); | 8378 EXPECT_EQ(error::kNoError, ExecuteCmd(teximage_cmd)); |
| 8383 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 8379 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| 8384 EXPECT_EQ( | 8380 EXPECT_EQ( |
| 8385 delegate, | 8381 delegate, |
| 8386 decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( | 8382 decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( |
| 8387 texture_ref)); | 8383 texture_ref)); |
| 8388 | 8384 |
| 8389 EXPECT_TRUE(texture->IsImmutable()); | 8385 EXPECT_TRUE(texture->IsImmutable()); |
| 8390 // Wait for completion. | 8386 // Wait for completion. |
| 8391 EXPECT_CALL(*delegate, WaitForTransferCompletion()); | 8387 EXPECT_CALL(*delegate, WaitForTransferCompletion()); |
| 8392 EXPECT_CALL(*manager, BindCompletedAsyncTransfers()); | 8388 EXPECT_CALL(*manager, BindCompletedAsyncTransfers()); |
| 8393 EXPECT_EQ(error::kNoError, ExecuteCmd(wait_cmd)); | 8389 EXPECT_EQ(error::kNoError, ExecuteCmd(wait_cmd)); |
| 8394 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 8390 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| 8395 } | 8391 } |
| 8396 | |
| 8397 // WaitAllAsyncTexImage2D | |
| 8398 EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation(); | |
| 8399 DoDeleteTexture(client_texture_id_, kServiceTextureId); | |
| 8400 EXPECT_FALSE( | |
| 8401 decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( | |
| 8402 texture_ref)); | |
| 8403 texture->SetImmutable(false); | |
| 8404 delegate = NULL; | |
| 8405 { | |
| 8406 // Get a fresh texture since the existing texture cannot be respecified | |
| 8407 // asynchronously and AsyncTexSubImage2D does not involve binding. | |
| 8408 EXPECT_CALL(*gl_, GenTextures(1, _)) | |
| 8409 .WillOnce(SetArgumentPointee<1>(kServiceTextureId)); | |
| 8410 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
| 8411 texture_ref = GetTexture(client_texture_id_); | |
| 8412 texture = texture_ref->texture(); | |
| 8413 texture->SetImmutable(false); | |
| 8414 // Create transfer state since it doesn't exist. | |
| 8415 EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _)) | |
| 8416 .WillOnce(Return( | |
| 8417 delegate = new StrictMock<gpu::MockAsyncPixelTransferDelegate>)) | |
| 8418 .RetiresOnSaturation(); | |
| 8419 EXPECT_CALL(*delegate, AsyncTexImage2D(_, _, _)) | |
| 8420 .RetiresOnSaturation(); | |
| 8421 // Start async transfer. | |
| 8422 EXPECT_EQ(error::kNoError, ExecuteCmd(teximage_cmd)); | |
| 8423 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
| 8424 EXPECT_EQ( | |
| 8425 delegate, | |
| 8426 decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( | |
| 8427 texture_ref)); | |
| 8428 | |
| 8429 EXPECT_TRUE(texture->IsImmutable()); | |
| 8430 // Wait for completion of all uploads. | |
| 8431 EXPECT_CALL(*manager, WaitAllAsyncTexImage2D()).RetiresOnSaturation(); | |
| 8432 EXPECT_CALL(*manager, BindCompletedAsyncTransfers()); | |
| 8433 EXPECT_EQ(error::kNoError, ExecuteCmd(wait_all_cmd)); | |
| 8434 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
| 8435 } | |
| 8436 } | 8392 } |
| 8437 | 8393 |
| 8438 TEST_F(GLES2DecoderManualInitTest, AsyncPixelTransferManager) { | 8394 TEST_F(GLES2DecoderManualInitTest, AsyncPixelTransferManager) { |
| 8439 InitDecoder( | 8395 InitDecoder( |
| 8440 "GL_CHROMIUM_async_pixel_transfers", // extensions | 8396 "GL_CHROMIUM_async_pixel_transfers", // extensions |
| 8441 "3.0", // gl version | 8397 "3.0", // gl version |
| 8442 false, false, false, // has alpha/depth/stencil | 8398 false, false, false, // has alpha/depth/stencil |
| 8443 false, false, false, // request alpha/depth/stencil | 8399 false, false, false, // request alpha/depth/stencil |
| 8444 true); // bind generates resource | 8400 true); // bind generates resource |
| 8445 | 8401 |
| 8446 // Set up the texture. | 8402 // Set up the texture. |
| 8447 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | 8403 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); |
| 8448 TextureRef* texture_ref = GetTexture(client_texture_id_); | 8404 TextureRef* texture_ref = GetTexture(client_texture_id_); |
| 8449 | 8405 |
| 8450 // Set a mock Async delegate. | 8406 // Set a mock Async delegate. |
| 8451 StrictMock<gpu::MockAsyncPixelTransferManager>* manager = | 8407 StrictMock<gpu::MockAsyncPixelTransferManager>* manager = |
| 8452 new StrictMock<gpu::MockAsyncPixelTransferManager>; | 8408 new StrictMock<gpu::MockAsyncPixelTransferManager>; |
| 8453 manager->Initialize(group().texture_manager()); | 8409 manager->Initialize(group().texture_manager()); |
| 8454 decoder_->SetAsyncPixelTransferManagerForTest(manager); | 8410 decoder_->SetAsyncPixelTransferManagerForTest(manager); |
| 8455 StrictMock<gpu::MockAsyncPixelTransferDelegate>* delegate = NULL; | 8411 StrictMock<gpu::MockAsyncPixelTransferDelegate>* delegate = NULL; |
| 8456 | 8412 |
| 8457 AsyncTexImage2DCHROMIUM teximage_cmd; | 8413 AsyncTexImage2DCHROMIUM teximage_cmd; |
| 8458 teximage_cmd.Init(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, | 8414 teximage_cmd.Init(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, |
| 8459 GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset, | 8415 GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset); |
| 8460 0, 0, 0); | |
| 8461 | 8416 |
| 8462 // No transfer delegate exists initially. | 8417 // No transfer delegate exists initially. |
| 8463 EXPECT_FALSE( | 8418 EXPECT_FALSE( |
| 8464 decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( | 8419 decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( |
| 8465 texture_ref)); | 8420 texture_ref)); |
| 8466 | 8421 |
| 8467 // Create delegate on AsyncTexImage2D. | 8422 // Create delegate on AsyncTexImage2D. |
| 8468 { | 8423 { |
| 8469 EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _)) | 8424 EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _)) |
| 8470 .WillOnce(Return( | 8425 .WillOnce(Return( |
| (...skipping 938 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9409 // TODO(gman): TexImage2DImmediate | 9364 // TODO(gman): TexImage2DImmediate |
| 9410 | 9365 |
| 9411 // TODO(gman): TexSubImage2DImmediate | 9366 // TODO(gman): TexSubImage2DImmediate |
| 9412 | 9367 |
| 9413 // TODO(gman): UseProgram | 9368 // TODO(gman): UseProgram |
| 9414 | 9369 |
| 9415 // TODO(gman): SwapBuffers | 9370 // TODO(gman): SwapBuffers |
| 9416 | 9371 |
| 9417 } // namespace gles2 | 9372 } // namespace gles2 |
| 9418 } // namespace gpu | 9373 } // namespace gpu |
| OLD | NEW |