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

Side by Side Diff: gpu/command_buffer/client/gles2_implementation.cc

Issue 116863003: gpu: Reuse transfer buffers more aggresively (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: [WIP] gpu: Reuse transfer buffers more aggresively Created 6 years, 11 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
OLDNEW
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 // A class to emulate GLES2 over command buffers. 5 // A class to emulate GLES2 over command buffers.
6 6
7 #include "gpu/command_buffer/client/gles2_implementation.h" 7 #include "gpu/command_buffer/client/gles2_implementation.h"
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <map> 10 #include <map>
(...skipping 1360 matching lines...) Expand 10 before | Expand all | Expand 10 after
1371 } 1371 }
1372 1372
1373 GLuint buffer_id; 1373 GLuint buffer_id;
1374 if (GetBoundPixelTransferBuffer(target, "glBufferData", &buffer_id)) { 1374 if (GetBoundPixelTransferBuffer(target, "glBufferData", &buffer_id)) {
1375 if (!buffer_id) { 1375 if (!buffer_id) {
1376 return; 1376 return;
1377 } 1377 }
1378 1378
1379 BufferTracker::Buffer* buffer = buffer_tracker_->GetBuffer(buffer_id); 1379 BufferTracker::Buffer* buffer = buffer_tracker_->GetBuffer(buffer_id);
1380 if (buffer) { 1380 if (buffer) {
1381 // Free buffer memory, pending the passage of a token. 1381 if (buffer->used()) {
1382 buffer_tracker_->FreePendingToken(buffer, helper_->InsertToken()); 1382 buffer->set_used(false);
1383 buffer->set_last_usage_token(helper_->InsertToken());
1384 }
piman 2014/01/11 02:02:32 Where does the last_usage_token get set if it's no
jadahl 2014/01/11 11:35:29 Right, should do the same for other buffer targets
reveman 2014/01/11 23:39:04 What if we set last usage token when issuing the c
jadahl 2014/01/12 09:52:24 I think this sounds like a good idea.
jadahl 2014/01/14 14:15:47 Hmm, is what you mean to do this for the functions
reveman 2014/01/14 15:27:20 Not only transfer buffers but all buffer objects s
reveman 2014/01/14 15:54:26 Sorry, DrawArrays doesn't use a buffer object as w
jadahl 2014/01/14 16:32:09 I don't see how BufferSubData would be used servic
reveman 2014/01/14 16:55:25 Right. I guess it's really just (Compressed)(Sub)T
1383 1385
1384 // Remove old buffer. 1386 FreeTransferBuffer(buffer);
1385 buffer_tracker_->RemoveBuffer(buffer_id); 1387 buffer_tracker_->RemoveBuffer(buffer->id());
1386 } 1388 }
1387 1389
1388 // Create new buffer. 1390 // Create new buffer.
1389 buffer = buffer_tracker_->CreateBuffer(buffer_id, size); 1391 buffer = buffer_tracker_->CreateBuffer(buffer_id, size);
1390 DCHECK(buffer); 1392 DCHECK(buffer);
1393 buffer->set_used(true);
1391 if (buffer->address() && data) 1394 if (buffer->address() && data)
1392 memcpy(buffer->address(), data, size); 1395 memcpy(buffer->address(), data, size);
1393 return; 1396 return;
1394 } 1397 }
1395 1398
1396 if (size == 0) { 1399 if (size == 0) {
1397 return; 1400 return;
1398 } 1401 }
1399 1402
1400 // If there is no data just send BufferData 1403 // If there is no data just send BufferData
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
1504 GLenum target, GLintptr offset, GLsizeiptr size, const void* data) { 1507 GLenum target, GLintptr offset, GLsizeiptr size, const void* data) {
1505 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1508 GPU_CLIENT_SINGLE_THREAD_CHECK();
1506 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBufferSubData(" 1509 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBufferSubData("
1507 << GLES2Util::GetStringBufferTarget(target) << ", " 1510 << GLES2Util::GetStringBufferTarget(target) << ", "
1508 << offset << ", " << size << ", " 1511 << offset << ", " << size << ", "
1509 << static_cast<const void*>(data) << ")"); 1512 << static_cast<const void*>(data) << ")");
1510 BufferSubDataHelper(target, offset, size, data); 1513 BufferSubDataHelper(target, offset, size, data);
1511 CheckGLError(); 1514 CheckGLError();
1512 } 1515 }
1513 1516
1517 void GLES2Implementation::FreeTransferBuffer(BufferTracker::Buffer* buffer) {
1518 int32 token = buffer->last_usage_token();
1519
1520 if (buffer->async_query_id()) {
1521 QueryTracker::Query* query =
1522 query_tracker_->GetQuery(buffer->async_query_id());
1523 if (!query->CheckResultsAvailable(helper_))
1524 buffer_tracker_->FreePendingSerial(buffer, query->serial());
1525 else
1526 buffer_tracker_->Free(buffer);
1527 } else if (token) {
1528 if (helper_->HasTokenPassed(token))
1529 buffer_tracker_->Free(buffer);
1530 else
1531 buffer_tracker_->FreePendingToken(buffer, token);
1532 }
1533 // TODO(jadahl): What to do if there is both token and query
1534 }
1535
1514 bool GLES2Implementation::GetBoundPixelTransferBuffer( 1536 bool GLES2Implementation::GetBoundPixelTransferBuffer(
1515 GLenum target, 1537 GLenum target,
1516 const char* function_name, 1538 const char* function_name,
1517 GLuint* buffer_id) { 1539 GLuint* buffer_id) {
1518 *buffer_id = 0; 1540 *buffer_id = 0;
1519 1541
1520 switch (target) { 1542 switch (target) {
1521 case GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM: 1543 case GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM:
1522 *buffer_id = bound_pixel_pack_transfer_buffer_id_; 1544 *buffer_id = bound_pixel_pack_transfer_buffer_id_;
1523 break; 1545 break;
(...skipping 872 matching lines...) Expand 10 before | Expand all | Expand 10 after
2396 } 2418 }
2397 2419
2398 // NOTE #1: On old versions of OpenGL, calling glBindXXX with an unused id 2420 // NOTE #1: On old versions of OpenGL, calling glBindXXX with an unused id
2399 // generates a new resource. On newer versions of OpenGL they don't. The code 2421 // generates a new resource. On newer versions of OpenGL they don't. The code
2400 // related to binding below will need to change if we switch to the new OpenGL 2422 // related to binding below will need to change if we switch to the new OpenGL
2401 // model. Specifically it assumes a bind will succeed which is always true in 2423 // model. Specifically it assumes a bind will succeed which is always true in
2402 // the old model but possibly not true in the new model if another context has 2424 // the old model but possibly not true in the new model if another context has
2403 // deleted the resource. 2425 // deleted the resource.
2404 2426
2405 bool GLES2Implementation::BindBufferHelper( 2427 bool GLES2Implementation::BindBufferHelper(
2406 GLenum target, GLuint buffer) { 2428 GLenum target, GLuint buffer_id) {
2429 BufferTracker::Buffer* buffer;
piman 2014/01/11 02:02:32 nit: = NULL
2430
2407 // TODO(gman): See note #1 above. 2431 // TODO(gman): See note #1 above.
2408 bool changed = false; 2432 bool changed = false;
2409 switch (target) { 2433 switch (target) {
2410 case GL_ARRAY_BUFFER: 2434 case GL_ARRAY_BUFFER:
2411 if (bound_array_buffer_id_ != buffer) { 2435 if (bound_array_buffer_id_ != buffer_id) {
2412 bound_array_buffer_id_ = buffer; 2436 bound_array_buffer_id_ = buffer_id;
2413 changed = true; 2437 changed = true;
2414 } 2438 }
2415 break; 2439 break;
2416 case GL_ELEMENT_ARRAY_BUFFER: 2440 case GL_ELEMENT_ARRAY_BUFFER:
2417 changed = vertex_array_object_manager_->BindElementArray(buffer); 2441 changed = vertex_array_object_manager_->BindElementArray(buffer_id);
2418 break; 2442 break;
2419 case GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM: 2443 case GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM:
2420 bound_pixel_pack_transfer_buffer_id_ = buffer; 2444 bound_pixel_pack_transfer_buffer_id_ = buffer_id;
2421 break; 2445 break;
2422 case GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM: 2446 case GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM:
2423 bound_pixel_unpack_transfer_buffer_id_ = buffer; 2447 // Mark any previously bound buffer as unused.
2448 if (bound_pixel_unpack_transfer_buffer_id_ != buffer_id &&
2449 bound_pixel_unpack_transfer_buffer_id_ != 0) {
2450 buffer =
2451 buffer_tracker_->GetBuffer(bound_pixel_unpack_transfer_buffer_id_);
2452 if (buffer) {
2453 buffer->set_last_usage_token(helper_->InsertToken());
2454 }
2455 }
2456
2457 bound_pixel_unpack_transfer_buffer_id_ = buffer_id;
2458 buffer = buffer_tracker_->GetBuffer(buffer_id);
2459 if (buffer) {
2460 buffer->set_used(true);
2461 buffer->set_last_usage_token(0);
2462 }
2463
2424 break; 2464 break;
2425 default: 2465 default:
2426 changed = true; 2466 changed = true;
2427 break; 2467 break;
2428 } 2468 }
2429 // TODO(gman): There's a bug here. If the target is invalid the ID will not be 2469 // TODO(gman): There's a bug here. If the target is invalid the ID will not be
2430 // used even though it's marked it as used here. 2470 // used even though it's marked it as used here.
2431 GetIdHandler(id_namespaces::kBuffers)->MarkAsUsedForBind(buffer); 2471 GetIdHandler(id_namespaces::kBuffers)->MarkAsUsedForBind(buffer_id);
2432 return changed; 2472 return changed;
2433 } 2473 }
2434 2474
2435 bool GLES2Implementation::BindFramebufferHelper( 2475 bool GLES2Implementation::BindFramebufferHelper(
2436 GLenum target, GLuint framebuffer) { 2476 GLenum target, GLuint framebuffer) {
2437 // TODO(gman): See note #1 above. 2477 // TODO(gman): See note #1 above.
2438 bool changed = false; 2478 bool changed = false;
2439 switch (target) { 2479 switch (target) {
2440 case GL_FRAMEBUFFER: 2480 case GL_FRAMEBUFFER:
2441 if (bound_framebuffer_ != framebuffer || 2481 if (bound_framebuffer_ != framebuffer ||
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
2555 SetGLError( 2595 SetGLError(
2556 GL_INVALID_VALUE, 2596 GL_INVALID_VALUE,
2557 "glDeleteBuffers", "id not created by this context."); 2597 "glDeleteBuffers", "id not created by this context.");
2558 return; 2598 return;
2559 } 2599 }
2560 for (GLsizei ii = 0; ii < n; ++ii) { 2600 for (GLsizei ii = 0; ii < n; ++ii) {
2561 if (buffers[ii] == bound_array_buffer_id_) { 2601 if (buffers[ii] == bound_array_buffer_id_) {
2562 bound_array_buffer_id_ = 0; 2602 bound_array_buffer_id_ = 0;
2563 } 2603 }
2564 vertex_array_object_manager_->UnbindBuffer(buffers[ii]); 2604 vertex_array_object_manager_->UnbindBuffer(buffers[ii]);
2605
2565 BufferTracker::Buffer* buffer = buffer_tracker_->GetBuffer(buffers[ii]); 2606 BufferTracker::Buffer* buffer = buffer_tracker_->GetBuffer(buffers[ii]);
2566 if (buffer) { 2607 if (buffer) {
2567 // Free buffer memory, pending the passage of a token. 2608 buffer->set_used(false);
2568 buffer_tracker_->FreePendingToken(buffer, helper_->InsertToken()); 2609 buffer->set_last_usage_token(helper_->InsertToken());
2569 // Remove buffer. 2610
2570 buffer_tracker_->RemoveBuffer(buffers[ii]); 2611 FreeTransferBuffer(buffer);
2612 buffer_tracker_->RemoveBuffer(buffer->id());
2571 } 2613 }
2614
2572 if (buffers[ii] == bound_pixel_unpack_transfer_buffer_id_) { 2615 if (buffers[ii] == bound_pixel_unpack_transfer_buffer_id_) {
2573 bound_pixel_unpack_transfer_buffer_id_ = 0; 2616 bound_pixel_unpack_transfer_buffer_id_ = 0;
2574 } 2617 }
2575 } 2618 }
2576 } 2619 }
2577 2620
2578 void GLES2Implementation::DeleteBuffersStub( 2621 void GLES2Implementation::DeleteBuffersStub(
2579 GLsizei n, const GLuint* buffers) { 2622 GLsizei n, const GLuint* buffers) {
2580 helper_->DeleteBuffersImmediate(n, buffers); 2623 helper_->DeleteBuffersImmediate(n, buffers);
2581 } 2624 }
(...skipping 699 matching lines...) Expand 10 before | Expand all | Expand 10 after
3281 // queries across contexts? 3324 // queries across contexts?
3282 return query_tracker_->GetQuery(id) != NULL; 3325 return query_tracker_->GetQuery(id) != NULL;
3283 } 3326 }
3284 3327
3285 void GLES2Implementation::BeginQueryEXT(GLenum target, GLuint id) { 3328 void GLES2Implementation::BeginQueryEXT(GLenum target, GLuint id) {
3286 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3329 GPU_CLIENT_SINGLE_THREAD_CHECK();
3287 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] BeginQueryEXT(" 3330 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] BeginQueryEXT("
3288 << GLES2Util::GetStringQueryTarget(target) 3331 << GLES2Util::GetStringQueryTarget(target)
3289 << ", " << id << ")"); 3332 << ", " << id << ")");
3290 3333
3334 QueryKey key = std::make_pair(target, false);
3335
3291 // if any outstanding queries INV_OP 3336 // if any outstanding queries INV_OP
3292 QueryMap::iterator it = current_queries_.find(target); 3337 QueryMap::iterator it = current_queries_.find(key);
3293 if (it != current_queries_.end()) { 3338 if (it != current_queries_.end()) {
3294 SetGLError( 3339 SetGLError(
3295 GL_INVALID_OPERATION, "glBeginQueryEXT", "query already in progress"); 3340 GL_INVALID_OPERATION, "glBeginQueryEXT", "query already in progress");
3296 return; 3341 return;
3297 } 3342 }
3298 3343
3299 // id = 0 INV_OP 3344 // id = 0 INV_OP
3300 if (id == 0) { 3345 if (id == 0) {
3301 SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT", "id is 0"); 3346 SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT", "id is 0");
3302 return; 3347 return;
3303 } 3348 }
3304 3349
3305 // TODO(gman) if id not GENned INV_OPERATION 3350 // TODO(gman) if id not GENned INV_OPERATION
3306 3351
3307 // if id does not have an object 3352 // if id does not have an object
3308 QueryTracker::Query* query = query_tracker_->GetQuery(id); 3353 QueryTracker::Query* query = query_tracker_->GetQuery(id);
3309 if (!query) { 3354 if (!query) {
3310 query = query_tracker_->CreateQuery(id, target); 3355 query = query_tracker_->CreateQuery(id, target);
3311 if (!query) { 3356 if (!query) {
3312 MustBeContextLost(); 3357 MustBeContextLost();
3313 return; 3358 return;
3314 } 3359 }
3315 } else if (query->target() != target) { 3360 } else if (query->target() != target) {
3316 SetGLError( 3361 SetGLError(
3317 GL_INVALID_OPERATION, "glBeginQueryEXT", "target does not match"); 3362 GL_INVALID_OPERATION, "glBeginQueryEXT", "target does not match");
3318 return; 3363 return;
3319 } 3364 }
3320 3365
3321 current_queries_[target] = query; 3366 current_queries_[key] = query;
3322 3367
3323 query->Begin(this); 3368 query->Begin(this);
3324 CheckGLError(); 3369 CheckGLError();
3325 } 3370 }
3326 3371
3327 void GLES2Implementation::EndQueryEXT(GLenum target) { 3372 void GLES2Implementation::EndQueryEXT(GLenum target) {
3328 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3373 GPU_CLIENT_SINGLE_THREAD_CHECK();
3329 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] EndQueryEXT(" 3374 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] EndQueryEXT("
3330 << GLES2Util::GetStringQueryTarget(target) << ")"); 3375 << GLES2Util::GetStringQueryTarget(target) << ")");
3331 // Don't do anything if the context is lost. 3376 // Don't do anything if the context is lost.
3332 if (helper_->IsContextLost()) { 3377 if (helper_->IsContextLost()) {
3333 return; 3378 return;
3334 } 3379 }
3335 3380
3336 QueryMap::iterator it = current_queries_.find(target); 3381 QueryKey key = std::make_pair(target, false);
3382 QueryMap::iterator it = current_queries_.find(key);
3337 if (it == current_queries_.end()) { 3383 if (it == current_queries_.end()) {
3338 SetGLError(GL_INVALID_OPERATION, "glEndQueryEXT", "no active query"); 3384 SetGLError(GL_INVALID_OPERATION, "glEndQueryEXT", "no active query");
3339 return; 3385 return;
3340 } 3386 }
3341 3387
3342 QueryTracker::Query* query = it->second; 3388 QueryTracker::Query* query = it->second;
3343 query->End(this); 3389 query->End(this);
3344 current_queries_.erase(it); 3390 current_queries_.erase(it);
3345 CheckGLError(); 3391 CheckGLError();
3346 } 3392 }
3347 3393
3348 void GLES2Implementation::GetQueryivEXT( 3394 void GLES2Implementation::GetQueryivEXT(
3349 GLenum target, GLenum pname, GLint* params) { 3395 GLenum target, GLenum pname, GLint* params) {
3350 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3396 GPU_CLIENT_SINGLE_THREAD_CHECK();
3351 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryivEXT(" 3397 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryivEXT("
3352 << GLES2Util::GetStringQueryTarget(target) << ", " 3398 << GLES2Util::GetStringQueryTarget(target) << ", "
3353 << GLES2Util::GetStringQueryParameter(pname) << ", " 3399 << GLES2Util::GetStringQueryParameter(pname) << ", "
3354 << static_cast<const void*>(params) << ")"); 3400 << static_cast<const void*>(params) << ")");
3355 3401
3356 if (pname != GL_CURRENT_QUERY_EXT) { 3402 if (pname != GL_CURRENT_QUERY_EXT) {
3357 SetGLErrorInvalidEnum("glGetQueryivEXT", pname, "pname"); 3403 SetGLErrorInvalidEnum("glGetQueryivEXT", pname, "pname");
3358 return; 3404 return;
3359 } 3405 }
3360 QueryMap::iterator it = current_queries_.find(target); 3406 QueryKey key = std::make_pair(target, false);
3407 QueryMap::iterator it = current_queries_.find(key);
3361 if (it != current_queries_.end()) { 3408 if (it != current_queries_.end()) {
3362 QueryTracker::Query* query = it->second; 3409 QueryTracker::Query* query = it->second;
3363 *params = query->id(); 3410 *params = query->id();
3364 } else { 3411 } else {
3365 *params = 0; 3412 *params = 0;
3366 } 3413 }
3367 GPU_CLIENT_LOG(" " << *params); 3414 GPU_CLIENT_LOG(" " << *params);
3368 CheckGLError(); 3415 CheckGLError();
3369 } 3416 }
3370 3417
3371 void GLES2Implementation::GetQueryObjectuivEXT( 3418 void GLES2Implementation::GetQueryObjectuivEXT(
3372 GLuint id, GLenum pname, GLuint* params) { 3419 GLuint id, GLenum pname, GLuint* params) {
3373 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3420 GPU_CLIENT_SINGLE_THREAD_CHECK();
3374 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryivEXT(" << id << ", " 3421 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryivEXT(" << id << ", "
3375 << GLES2Util::GetStringQueryObjectParameter(pname) << ", " 3422 << GLES2Util::GetStringQueryObjectParameter(pname) << ", "
3376 << static_cast<const void*>(params) << ")"); 3423 << static_cast<const void*>(params) << ")");
3377 3424
3378 QueryTracker::Query* query = query_tracker_->GetQuery(id); 3425 QueryTracker::Query* query = query_tracker_->GetQuery(id);
3379 if (!query) { 3426 if (!query) {
3380 SetGLError(GL_INVALID_OPERATION, "glQueryObjectuivEXT", "unknown query id"); 3427 SetGLError(GL_INVALID_OPERATION, "glQueryObjectuivEXT", "unknown query id");
3381 return; 3428 return;
3382 } 3429 }
3383 3430
3384 QueryMap::iterator it = current_queries_.find(query->target()); 3431 QueryKey key = std::make_pair(query->target(), false);
3432 QueryMap::iterator it = current_queries_.find(key);
3385 if (it != current_queries_.end()) { 3433 if (it != current_queries_.end()) {
3386 SetGLError( 3434 SetGLError(
3387 GL_INVALID_OPERATION, 3435 GL_INVALID_OPERATION,
3388 "glQueryObjectuivEXT", "query active. Did you to call glEndQueryEXT?"); 3436 "glQueryObjectuivEXT", "query active. Did you to call glEndQueryEXT?");
3389 return; 3437 return;
3390 } 3438 }
3391 3439
3392 if (query->NeverUsed()) { 3440 if (query->NeverUsed()) {
3393 SetGLError( 3441 SetGLError(
3394 GL_INVALID_OPERATION, 3442 GL_INVALID_OPERATION,
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
3640 } 3688 }
3641 if (!buffer->mapped()) { 3689 if (!buffer->mapped()) {
3642 SetGLError(GL_INVALID_OPERATION, "glUnmapBufferCHROMIUM", "not mapped"); 3690 SetGLError(GL_INVALID_OPERATION, "glUnmapBufferCHROMIUM", "not mapped");
3643 return false; 3691 return false;
3644 } 3692 }
3645 buffer->set_mapped(false); 3693 buffer->set_mapped(false);
3646 CheckGLError(); 3694 CheckGLError();
3647 return true; 3695 return true;
3648 } 3696 }
3649 3697
3698 void GLES2Implementation::BeginInternalQueryAsyncPixelUnpackCompleted(
3699 BufferTracker::Buffer *buffer) {
3700 QueryKey key = std::make_pair(GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM, true);
3701
3702 DCHECK(current_queries_.find(key) == current_queries_.end());
3703
3704 GLuint id;
3705 GetIdHandler(id_namespaces::kQueries)->MakeIds(this, 0, 1, &id);
3706 QueryTracker::Query* query = query_tracker_->CreateInternalQuery(
3707 id, GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM);
3708 if (!query) {
3709 MustBeContextLost();
3710 return;
3711 }
3712
3713 buffer->set_async_query_id(id);
piman 2014/01/11 02:02:32 What if we do several AsyncTexImage2DCHROMIUM on t
jadahl 2014/01/11 11:35:29 That would not work, true. I guess it could work b
piman 2014/01/16 21:22:50 We need to fix this, or change the API to prevent
jadahl 2014/01/17 08:50:25 Then should we just introduce a new internal comma
3714 query->Begin(this);
3715 CheckGLError();
3716
3717 current_queries_[key] = query;
3718 }
3719
3720 void GLES2Implementation::EndInternalQueryAsyncPixelUnpackCompleted() {
3721 QueryKey key = std::make_pair(GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM, true);
3722
3723 DCHECK(current_queries_.find(key) != current_queries_.end());
3724
3725 QueryMap::iterator it = current_queries_.find(key);
3726 QueryTracker::Query* query = it->second;
3727 query->End(this);
3728 current_queries_.erase(it);
3729 CheckGLError();
3730 }
3731
3650 void GLES2Implementation::AsyncTexImage2DCHROMIUM( 3732 void GLES2Implementation::AsyncTexImage2DCHROMIUM(
3651 GLenum target, GLint level, GLint internalformat, GLsizei width, 3733 GLenum target, GLint level, GLint internalformat, GLsizei width,
3652 GLsizei height, GLint border, GLenum format, GLenum type, 3734 GLsizei height, GLint border, GLenum format, GLenum type,
3653 const void* pixels) { 3735 const void* pixels) {
3654 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3736 GPU_CLIENT_SINGLE_THREAD_CHECK();
3655 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexImage2D(" 3737 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexImage2D("
3656 << GLES2Util::GetStringTextureTarget(target) << ", " 3738 << GLES2Util::GetStringTextureTarget(target) << ", "
3657 << level << ", " 3739 << level << ", "
3658 << GLES2Util::GetStringTextureInternalFormat(internalformat) << ", " 3740 << GLES2Util::GetStringTextureInternalFormat(internalformat) << ", "
3659 << width << ", " << height << ", " << border << ", " 3741 << width << ", " << height << ", " << border << ", "
(...skipping 24 matching lines...) Expand all
3684 3766
3685 // Otherwise, async uploads require a transfer buffer to be bound. 3767 // Otherwise, async uploads require a transfer buffer to be bound.
3686 // TODO(hubbe): Make MapBufferCHROMIUM block if someone tries to re-use 3768 // TODO(hubbe): Make MapBufferCHROMIUM block if someone tries to re-use
3687 // the buffer before the transfer is finished. (Currently such 3769 // the buffer before the transfer is finished. (Currently such
3688 // synchronization has to be handled manually.) 3770 // synchronization has to be handled manually.)
3689 GLuint offset = ToGLuint(pixels); 3771 GLuint offset = ToGLuint(pixels);
3690 BufferTracker::Buffer* buffer = GetBoundPixelUnpackTransferBufferIfValid( 3772 BufferTracker::Buffer* buffer = GetBoundPixelUnpackTransferBufferIfValid(
3691 bound_pixel_unpack_transfer_buffer_id_, 3773 bound_pixel_unpack_transfer_buffer_id_,
3692 "glAsyncTexImage2DCHROMIUM", offset, size); 3774 "glAsyncTexImage2DCHROMIUM", offset, size);
3693 if (buffer && buffer->shm_id() != -1) { 3775 if (buffer && buffer->shm_id() != -1) {
3776 BeginInternalQueryAsyncPixelUnpackCompleted(buffer);
3694 helper_->AsyncTexImage2DCHROMIUM( 3777 helper_->AsyncTexImage2DCHROMIUM(
3695 target, level, internalformat, width, height, border, format, type, 3778 target, level, internalformat, width, height, border, format, type,
3696 buffer->shm_id(), buffer->shm_offset() + offset); 3779 buffer->shm_id(), buffer->shm_offset() + offset);
3780 EndInternalQueryAsyncPixelUnpackCompleted();
3697 } 3781 }
3698 } 3782 }
3699 3783
3700 void GLES2Implementation::AsyncTexSubImage2DCHROMIUM( 3784 void GLES2Implementation::AsyncTexSubImage2DCHROMIUM(
3701 GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, 3785 GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
3702 GLsizei height, GLenum format, GLenum type, const void* pixels) { 3786 GLsizei height, GLenum format, GLenum type, const void* pixels) {
3703 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3787 GPU_CLIENT_SINGLE_THREAD_CHECK();
3704 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glAsyncTexSubImage2DCHROMIUM(" 3788 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glAsyncTexSubImage2DCHROMIUM("
3705 << GLES2Util::GetStringTextureTarget(target) << ", " 3789 << GLES2Util::GetStringTextureTarget(target) << ", "
3706 << level << ", " 3790 << level << ", "
(...skipping 21 matching lines...) Expand all
3728 3812
3729 // Async uploads require a transfer buffer to be bound. 3813 // Async uploads require a transfer buffer to be bound.
3730 // TODO(hubbe): Make MapBufferCHROMIUM block if someone tries to re-use 3814 // TODO(hubbe): Make MapBufferCHROMIUM block if someone tries to re-use
3731 // the buffer before the transfer is finished. (Currently such 3815 // the buffer before the transfer is finished. (Currently such
3732 // synchronization has to be handled manually.) 3816 // synchronization has to be handled manually.)
3733 GLuint offset = ToGLuint(pixels); 3817 GLuint offset = ToGLuint(pixels);
3734 BufferTracker::Buffer* buffer = GetBoundPixelUnpackTransferBufferIfValid( 3818 BufferTracker::Buffer* buffer = GetBoundPixelUnpackTransferBufferIfValid(
3735 bound_pixel_unpack_transfer_buffer_id_, 3819 bound_pixel_unpack_transfer_buffer_id_,
3736 "glAsyncTexSubImage2DCHROMIUM", offset, size); 3820 "glAsyncTexSubImage2DCHROMIUM", offset, size);
3737 if (buffer && buffer->shm_id() != -1) { 3821 if (buffer && buffer->shm_id() != -1) {
3822 BeginInternalQueryAsyncPixelUnpackCompleted(buffer);
3738 helper_->AsyncTexSubImage2DCHROMIUM( 3823 helper_->AsyncTexSubImage2DCHROMIUM(
3739 target, level, xoffset, yoffset, width, height, format, type, 3824 target, level, xoffset, yoffset, width, height, format, type,
3740 buffer->shm_id(), buffer->shm_offset() + offset); 3825 buffer->shm_id(), buffer->shm_offset() + offset);
3826 EndInternalQueryAsyncPixelUnpackCompleted();
3741 } 3827 }
3742 } 3828 }
3743 3829
3744 void GLES2Implementation::WaitAsyncTexImage2DCHROMIUM(GLenum target) { 3830 void GLES2Implementation::WaitAsyncTexImage2DCHROMIUM(GLenum target) {
3745 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3831 GPU_CLIENT_SINGLE_THREAD_CHECK();
3746 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glWaitAsyncTexImage2DCHROMIUM(" 3832 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glWaitAsyncTexImage2DCHROMIUM("
3747 << GLES2Util::GetStringTextureTarget(target) << ")"); 3833 << GLES2Util::GetStringTextureTarget(target) << ")");
3748 helper_->WaitAsyncTexImage2DCHROMIUM(target); 3834 helper_->WaitAsyncTexImage2DCHROMIUM(target);
3749 CheckGLError(); 3835 CheckGLError();
3750 } 3836 }
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
3917 CheckGLError(); 4003 CheckGLError();
3918 } 4004 }
3919 4005
3920 // Include the auto-generated part of this file. We split this because it means 4006 // Include the auto-generated part of this file. We split this because it means
3921 // we can easily edit the non-auto generated parts right here in this file 4007 // we can easily edit the non-auto generated parts right here in this file
3922 // instead of having to edit some template or the code generator. 4008 // instead of having to edit some template or the code generator.
3923 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h" 4009 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h"
3924 4010
3925 } // namespace gles2 4011 } // namespace gles2
3926 } // namespace gpu 4012 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698