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 // 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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |