Chromium Code Reviews| 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 |