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 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 bound_framebuffer_(0), | 103 bound_framebuffer_(0), |
104 bound_read_framebuffer_(0), | 104 bound_read_framebuffer_(0), |
105 bound_renderbuffer_(0), | 105 bound_renderbuffer_(0), |
106 current_program_(0), | 106 current_program_(0), |
107 bound_array_buffer_id_(0), | 107 bound_array_buffer_id_(0), |
108 bound_pixel_pack_transfer_buffer_id_(0), | 108 bound_pixel_pack_transfer_buffer_id_(0), |
109 bound_pixel_unpack_transfer_buffer_id_(0), | 109 bound_pixel_unpack_transfer_buffer_id_(0), |
110 error_bits_(0), | 110 error_bits_(0), |
111 debug_(false), | 111 debug_(false), |
112 use_count_(0), | 112 use_count_(0), |
113 current_query_(NULL), | |
114 error_message_callback_(NULL), | 113 error_message_callback_(NULL), |
115 gpu_control_(gpu_control), | 114 gpu_control_(gpu_control), |
116 surface_visible_(true), | 115 surface_visible_(true), |
117 free_everything_when_invisible_(free_everything_when_invisible), | 116 free_everything_when_invisible_(free_everything_when_invisible), |
118 capabilities_(gpu_control->GetCapabilities()), | 117 capabilities_(gpu_control->GetCapabilities()), |
119 weak_ptr_factory_(this) { | 118 weak_ptr_factory_(this) { |
120 DCHECK(helper); | 119 DCHECK(helper); |
121 DCHECK(transfer_buffer); | 120 DCHECK(transfer_buffer); |
122 DCHECK(gpu_control); | 121 DCHECK(gpu_control); |
123 | 122 |
(...skipping 3159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3283 return query_tracker_->GetQuery(id) != NULL; | 3282 return query_tracker_->GetQuery(id) != NULL; |
3284 } | 3283 } |
3285 | 3284 |
3286 void GLES2Implementation::BeginQueryEXT(GLenum target, GLuint id) { | 3285 void GLES2Implementation::BeginQueryEXT(GLenum target, GLuint id) { |
3287 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 3286 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
3288 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] BeginQueryEXT(" | 3287 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] BeginQueryEXT(" |
3289 << GLES2Util::GetStringQueryTarget(target) | 3288 << GLES2Util::GetStringQueryTarget(target) |
3290 << ", " << id << ")"); | 3289 << ", " << id << ")"); |
3291 | 3290 |
3292 // if any outstanding queries INV_OP | 3291 // if any outstanding queries INV_OP |
3293 if (current_query_) { | 3292 QueryMap::iterator it = current_queries_.find(target); |
| 3293 if (it != current_queries_.end()) { |
3294 SetGLError( | 3294 SetGLError( |
3295 GL_INVALID_OPERATION, "glBeginQueryEXT", "query already in progress"); | 3295 GL_INVALID_OPERATION, "glBeginQueryEXT", "query already in progress"); |
3296 return; | 3296 return; |
3297 } | 3297 } |
3298 | 3298 |
3299 // id = 0 INV_OP | 3299 // id = 0 INV_OP |
3300 if (id == 0) { | 3300 if (id == 0) { |
3301 SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT", "id is 0"); | 3301 SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT", "id is 0"); |
3302 return; | 3302 return; |
3303 } | 3303 } |
3304 | 3304 |
3305 // TODO(gman) if id not GENned INV_OPERATION | 3305 // TODO(gman) if id not GENned INV_OPERATION |
3306 | 3306 |
3307 // if id does not have an object | 3307 // if id does not have an object |
3308 QueryTracker::Query* query = query_tracker_->GetQuery(id); | 3308 QueryTracker::Query* query = query_tracker_->GetQuery(id); |
3309 if (!query) { | 3309 if (!query) { |
3310 query = query_tracker_->CreateQuery(id, target); | 3310 query = query_tracker_->CreateQuery(id, target); |
3311 if (!query) { | 3311 if (!query) { |
3312 MustBeContextLost(); | 3312 MustBeContextLost(); |
3313 return; | 3313 return; |
3314 } | 3314 } |
3315 } else if (query->target() != target) { | 3315 } else if (query->target() != target) { |
3316 SetGLError( | 3316 SetGLError( |
3317 GL_INVALID_OPERATION, "glBeginQueryEXT", "target does not match"); | 3317 GL_INVALID_OPERATION, "glBeginQueryEXT", "target does not match"); |
3318 return; | 3318 return; |
3319 } | 3319 } |
3320 | 3320 |
3321 current_query_ = query; | 3321 current_queries_[target] = query; |
3322 | 3322 |
3323 query->Begin(this); | 3323 query->Begin(this); |
3324 CheckGLError(); | 3324 CheckGLError(); |
3325 } | 3325 } |
3326 | 3326 |
3327 void GLES2Implementation::EndQueryEXT(GLenum target) { | 3327 void GLES2Implementation::EndQueryEXT(GLenum target) { |
3328 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 3328 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
3329 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] EndQueryEXT(" | 3329 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] EndQueryEXT(" |
3330 << GLES2Util::GetStringQueryTarget(target) << ")"); | 3330 << GLES2Util::GetStringQueryTarget(target) << ")"); |
3331 // Don't do anything if the context is lost. | 3331 // Don't do anything if the context is lost. |
3332 if (helper_->IsContextLost()) { | 3332 if (helper_->IsContextLost()) { |
3333 return; | 3333 return; |
3334 } | 3334 } |
3335 | 3335 |
3336 if (!current_query_) { | 3336 QueryMap::iterator it = current_queries_.find(target); |
| 3337 if (it == current_queries_.end()) { |
3337 SetGLError(GL_INVALID_OPERATION, "glEndQueryEXT", "no active query"); | 3338 SetGLError(GL_INVALID_OPERATION, "glEndQueryEXT", "no active query"); |
3338 return; | 3339 return; |
3339 } | 3340 } |
3340 | 3341 |
3341 if (current_query_->target() != target) { | 3342 QueryTracker::Query* query = it->second; |
3342 SetGLError(GL_INVALID_OPERATION, | 3343 query->End(this); |
3343 "glEndQueryEXT", "target does not match active query"); | 3344 current_queries_.erase(it); |
3344 return; | |
3345 } | |
3346 | |
3347 current_query_->End(this); | |
3348 current_query_ = NULL; | |
3349 CheckGLError(); | 3345 CheckGLError(); |
3350 } | 3346 } |
3351 | 3347 |
3352 void GLES2Implementation::GetQueryivEXT( | 3348 void GLES2Implementation::GetQueryivEXT( |
3353 GLenum target, GLenum pname, GLint* params) { | 3349 GLenum target, GLenum pname, GLint* params) { |
3354 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 3350 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
3355 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryivEXT(" | 3351 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryivEXT(" |
3356 << GLES2Util::GetStringQueryTarget(target) << ", " | 3352 << GLES2Util::GetStringQueryTarget(target) << ", " |
3357 << GLES2Util::GetStringQueryParameter(pname) << ", " | 3353 << GLES2Util::GetStringQueryParameter(pname) << ", " |
3358 << static_cast<const void*>(params) << ")"); | 3354 << static_cast<const void*>(params) << ")"); |
3359 | 3355 |
3360 if (pname != GL_CURRENT_QUERY_EXT) { | 3356 if (pname != GL_CURRENT_QUERY_EXT) { |
3361 SetGLErrorInvalidEnum("glGetQueryivEXT", pname, "pname"); | 3357 SetGLErrorInvalidEnum("glGetQueryivEXT", pname, "pname"); |
3362 return; | 3358 return; |
3363 } | 3359 } |
3364 *params = (current_query_ && current_query_->target() == target) ? | 3360 QueryMap::iterator it = current_queries_.find(target); |
3365 current_query_->id() : 0; | 3361 if (it != current_queries_.end()) { |
| 3362 QueryTracker::Query* query = it->second; |
| 3363 *params = query->id(); |
| 3364 } else { |
| 3365 *params = 0; |
| 3366 } |
3366 GPU_CLIENT_LOG(" " << *params); | 3367 GPU_CLIENT_LOG(" " << *params); |
3367 CheckGLError(); | 3368 CheckGLError(); |
3368 } | 3369 } |
3369 | 3370 |
3370 void GLES2Implementation::GetQueryObjectuivEXT( | 3371 void GLES2Implementation::GetQueryObjectuivEXT( |
3371 GLuint id, GLenum pname, GLuint* params) { | 3372 GLuint id, GLenum pname, GLuint* params) { |
3372 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 3373 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
3373 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryivEXT(" << id << ", " | 3374 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryivEXT(" << id << ", " |
3374 << GLES2Util::GetStringQueryObjectParameter(pname) << ", " | 3375 << GLES2Util::GetStringQueryObjectParameter(pname) << ", " |
3375 << static_cast<const void*>(params) << ")"); | 3376 << static_cast<const void*>(params) << ")"); |
3376 | 3377 |
3377 QueryTracker::Query* query = query_tracker_->GetQuery(id); | 3378 QueryTracker::Query* query = query_tracker_->GetQuery(id); |
3378 if (!query) { | 3379 if (!query) { |
3379 SetGLError(GL_INVALID_OPERATION, "glQueryObjectuivEXT", "unknown query id"); | 3380 SetGLError(GL_INVALID_OPERATION, "glQueryObjectuivEXT", "unknown query id"); |
3380 return; | 3381 return; |
3381 } | 3382 } |
3382 | 3383 |
3383 if (query == current_query_) { | 3384 QueryMap::iterator it = current_queries_.find(query->target()); |
| 3385 if (it != current_queries_.end()) { |
3384 SetGLError( | 3386 SetGLError( |
3385 GL_INVALID_OPERATION, | 3387 GL_INVALID_OPERATION, |
3386 "glQueryObjectuivEXT", "query active. Did you to call glEndQueryEXT?"); | 3388 "glQueryObjectuivEXT", "query active. Did you to call glEndQueryEXT?"); |
3387 return; | 3389 return; |
3388 } | 3390 } |
3389 | 3391 |
3390 if (query->NeverUsed()) { | 3392 if (query->NeverUsed()) { |
3391 SetGLError( | 3393 SetGLError( |
3392 GL_INVALID_OPERATION, | 3394 GL_INVALID_OPERATION, |
3393 "glQueryObjectuivEXT", "Never used. Did you call glBeginQueryEXT?"); | 3395 "glQueryObjectuivEXT", "Never used. Did you call glBeginQueryEXT?"); |
(...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3915 CheckGLError(); | 3917 CheckGLError(); |
3916 } | 3918 } |
3917 | 3919 |
3918 // Include the auto-generated part of this file. We split this because it means | 3920 // Include the auto-generated part of this file. We split this because it means |
3919 // we can easily edit the non-auto generated parts right here in this file | 3921 // we can easily edit the non-auto generated parts right here in this file |
3920 // instead of having to edit some template or the code generator. | 3922 // instead of having to edit some template or the code generator. |
3921 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h" | 3923 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h" |
3922 | 3924 |
3923 } // namespace gles2 | 3925 } // namespace gles2 |
3924 } // namespace gpu | 3926 } // namespace gpu |
OLD | NEW |