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 <stdio.h> | 7 #include <stdio.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <list> | 10 #include <list> |
(...skipping 9331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9342 } | 9342 } |
9343 // NOTE: We don't generate Query objects here. Only in BeginQueryEXT | 9343 // NOTE: We don't generate Query objects here. Only in BeginQueryEXT |
9344 return true; | 9344 return true; |
9345 } | 9345 } |
9346 | 9346 |
9347 void GLES2DecoderImpl::DeleteQueriesEXTHelper( | 9347 void GLES2DecoderImpl::DeleteQueriesEXTHelper( |
9348 GLsizei n, const GLuint* client_ids) { | 9348 GLsizei n, const GLuint* client_ids) { |
9349 for (GLsizei ii = 0; ii < n; ++ii) { | 9349 for (GLsizei ii = 0; ii < n; ++ii) { |
9350 QueryManager::Query* query = query_manager_->GetQuery(client_ids[ii]); | 9350 QueryManager::Query* query = query_manager_->GetQuery(client_ids[ii]); |
9351 if (query && !query->IsDeleted()) { | 9351 if (query && !query->IsDeleted()) { |
9352 ContextState::QueryMap::iterator it = | 9352 bool internal = query->serial() != 0; |
9353 state_.current_queries.find(query->target()); | 9353 ContextState::QueryMap::iterator it = state_.current_queries.find( |
| 9354 std::make_pair(query->target(), internal)); |
9354 if (it != state_.current_queries.end()) | 9355 if (it != state_.current_queries.end()) |
9355 state_.current_queries.erase(it); | 9356 state_.current_queries.erase(it); |
9356 | 9357 |
9357 query->Destroy(true); | 9358 query->Destroy(true); |
9358 query_manager_->RemoveQuery(client_ids[ii]); | 9359 query_manager_->RemoveQuery(client_ids[ii]); |
9359 } | 9360 } |
9360 } | 9361 } |
9361 } | 9362 } |
9362 | 9363 |
9363 bool GLES2DecoderImpl::ProcessPendingQueries() { | 9364 bool GLES2DecoderImpl::ProcessPendingQueries() { |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9404 async_pixel_transfer_manager_->ProcessMorePendingTransfers(); | 9405 async_pixel_transfer_manager_->ProcessMorePendingTransfers(); |
9405 ProcessFinishedAsyncTransfers(); | 9406 ProcessFinishedAsyncTransfers(); |
9406 } | 9407 } |
9407 | 9408 |
9408 error::Error GLES2DecoderImpl::HandleBeginQueryEXT( | 9409 error::Error GLES2DecoderImpl::HandleBeginQueryEXT( |
9409 uint32 immediate_data_size, const cmds::BeginQueryEXT& c) { | 9410 uint32 immediate_data_size, const cmds::BeginQueryEXT& c) { |
9410 GLenum target = static_cast<GLenum>(c.target); | 9411 GLenum target = static_cast<GLenum>(c.target); |
9411 GLuint client_id = static_cast<GLuint>(c.id); | 9412 GLuint client_id = static_cast<GLuint>(c.id); |
9412 int32 sync_shm_id = static_cast<int32>(c.sync_data_shm_id); | 9413 int32 sync_shm_id = static_cast<int32>(c.sync_data_shm_id); |
9413 uint32 sync_shm_offset = static_cast<uint32>(c.sync_data_shm_offset); | 9414 uint32 sync_shm_offset = static_cast<uint32>(c.sync_data_shm_offset); |
| 9415 uint32 serial = static_cast<uint32>(c.serial); |
| 9416 bool internal = serial != 0; |
| 9417 ContextState::QueryKey key = std::make_pair(target, internal); |
9414 | 9418 |
9415 switch (target) { | 9419 switch (target) { |
9416 case GL_COMMANDS_ISSUED_CHROMIUM: | 9420 case GL_COMMANDS_ISSUED_CHROMIUM: |
9417 case GL_LATENCY_QUERY_CHROMIUM: | 9421 case GL_LATENCY_QUERY_CHROMIUM: |
9418 case GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM: | 9422 case GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM: |
9419 case GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM: | 9423 case GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM: |
9420 case GL_GET_ERROR_QUERY_CHROMIUM: | 9424 case GL_GET_ERROR_QUERY_CHROMIUM: |
9421 break; | 9425 break; |
9422 default: | 9426 default: |
9423 if (!features().occlusion_query_boolean) { | 9427 if (!features().occlusion_query_boolean) { |
9424 LOCAL_SET_GL_ERROR( | 9428 LOCAL_SET_GL_ERROR( |
9425 GL_INVALID_OPERATION, "glBeginQueryEXT", | 9429 GL_INVALID_OPERATION, "glBeginQueryEXT", |
9426 "not enabled for occlusion queries"); | 9430 "not enabled for occlusion queries"); |
9427 return error::kNoError; | 9431 return error::kNoError; |
9428 } | 9432 } |
9429 break; | 9433 break; |
9430 } | 9434 } |
9431 | 9435 |
9432 if (state_.current_queries.find(target) != state_.current_queries.end()) { | 9436 if (state_.current_queries.find(key) != state_.current_queries.end()) { |
9433 LOCAL_SET_GL_ERROR( | 9437 LOCAL_SET_GL_ERROR( |
9434 GL_INVALID_OPERATION, "glBeginQueryEXT", "query already in progress"); | 9438 GL_INVALID_OPERATION, "glBeginQueryEXT", "query already in progress"); |
9435 return error::kNoError; | 9439 return error::kNoError; |
9436 } | 9440 } |
9437 | 9441 |
9438 if (client_id == 0) { | 9442 if (client_id == 0) { |
9439 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glBeginQueryEXT", "id is 0"); | 9443 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glBeginQueryEXT", "id is 0"); |
9440 return error::kNoError; | 9444 return error::kNoError; |
9441 } | 9445 } |
9442 | 9446 |
(...skipping 12 matching lines...) Expand all Loading... |
9455 // IdAllocatorInterface* id_allocator = | 9459 // IdAllocatorInterface* id_allocator = |
9456 // group_->GetIdAllocator(id_namespaces::kQueries); | 9460 // group_->GetIdAllocator(id_namespaces::kQueries); |
9457 // if (!id_allocator->InUse(client_id)) { | 9461 // if (!id_allocator->InUse(client_id)) { |
9458 // LOCAL_SET_GL_ERROR( | 9462 // LOCAL_SET_GL_ERROR( |
9459 // GL_INVALID_OPERATION, | 9463 // GL_INVALID_OPERATION, |
9460 // "glBeginQueryEXT", "id not made by glGenQueriesEXT"); | 9464 // "glBeginQueryEXT", "id not made by glGenQueriesEXT"); |
9461 // return error::kNoError; | 9465 // return error::kNoError; |
9462 // } | 9466 // } |
9463 query = query_manager_->CreateQuery( | 9467 query = query_manager_->CreateQuery( |
9464 target, client_id, sync_shm_id, sync_shm_offset); | 9468 target, client_id, sync_shm_id, sync_shm_offset); |
| 9469 query->set_serial(serial); |
9465 } | 9470 } |
9466 | 9471 |
9467 if (query->target() != target) { | 9472 if (query->target() != target) { |
9468 LOCAL_SET_GL_ERROR( | 9473 LOCAL_SET_GL_ERROR( |
9469 GL_INVALID_OPERATION, "glBeginQueryEXT", "target does not match"); | 9474 GL_INVALID_OPERATION, "glBeginQueryEXT", "target does not match"); |
9470 return error::kNoError; | 9475 return error::kNoError; |
9471 } else if (query->shm_id() != sync_shm_id || | 9476 } else if (query->shm_id() != sync_shm_id || |
9472 query->shm_offset() != sync_shm_offset) { | 9477 query->shm_offset() != sync_shm_offset) { |
9473 DLOG(ERROR) << "Shared memory used by query not the same as before"; | 9478 DLOG(ERROR) << "Shared memory used by query not the same as before"; |
9474 return error::kInvalidArguments; | 9479 return error::kInvalidArguments; |
9475 } | 9480 } |
9476 | 9481 |
9477 if (!query_manager_->BeginQuery(query)) { | 9482 if (!query_manager_->BeginQuery(query)) { |
9478 return error::kOutOfBounds; | 9483 return error::kOutOfBounds; |
9479 } | 9484 } |
9480 | 9485 |
9481 state_.current_queries[target] = query; | 9486 state_.current_queries[key] = query; |
9482 return error::kNoError; | 9487 return error::kNoError; |
9483 } | 9488 } |
9484 | 9489 |
9485 error::Error GLES2DecoderImpl::HandleEndQueryEXT( | 9490 error::Error GLES2DecoderImpl::HandleEndQueryEXT( |
9486 uint32 immediate_data_size, const cmds::EndQueryEXT& c) { | 9491 uint32 immediate_data_size, const cmds::EndQueryEXT& c) { |
9487 GLenum target = static_cast<GLenum>(c.target); | 9492 GLenum target = static_cast<GLenum>(c.target); |
9488 uint32 submit_count = static_cast<GLuint>(c.submit_count); | 9493 uint32 submit_count = static_cast<GLuint>(c.submit_count); |
9489 ContextState::QueryMap::iterator it = state_.current_queries.find(target); | 9494 uint32 serial = static_cast<uint32>(c.serial); |
| 9495 bool internal = serial != 0; |
| 9496 ContextState::QueryKey key = std::make_pair(target, internal); |
| 9497 ContextState::QueryMap::iterator it = state_.current_queries.find(key); |
9490 | 9498 |
9491 if (it == state_.current_queries.end()) { | 9499 if (it == state_.current_queries.end()) { |
9492 LOCAL_SET_GL_ERROR( | 9500 LOCAL_SET_GL_ERROR( |
9493 GL_INVALID_OPERATION, "glEndQueryEXT", "No active query"); | 9501 GL_INVALID_OPERATION, "glEndQueryEXT", "No active query"); |
9494 return error::kNoError; | 9502 return error::kNoError; |
9495 } | 9503 } |
9496 | 9504 |
9497 QueryManager::Query* query = it->second.get(); | 9505 QueryManager::Query* query = it->second.get(); |
9498 if (!query_manager_->EndQuery(query, submit_count)) { | 9506 if (!query_manager_->EndQuery(query, submit_count)) { |
9499 return error::kOutOfBounds; | 9507 return error::kOutOfBounds; |
(...skipping 1137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10637 DoDidUseTexImageIfNeeded(texture, texture->target()); | 10645 DoDidUseTexImageIfNeeded(texture, texture->target()); |
10638 } | 10646 } |
10639 | 10647 |
10640 // Include the auto-generated part of this file. We split this because it means | 10648 // Include the auto-generated part of this file. We split this because it means |
10641 // we can easily edit the non-auto generated parts right here in this file | 10649 // we can easily edit the non-auto generated parts right here in this file |
10642 // instead of having to edit some template or the code generator. | 10650 // instead of having to edit some template or the code generator. |
10643 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 10651 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
10644 | 10652 |
10645 } // namespace gles2 | 10653 } // namespace gles2 |
10646 } // namespace gpu | 10654 } // namespace gpu |
OLD | NEW |