| 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 "../client/gles2_implementation.h" | 7 #include "../client/gles2_implementation.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <map> | 10 #include <map> |
| (...skipping 659 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 670 last_error_ = msg; | 670 last_error_ = msg; |
| 671 } | 671 } |
| 672 if (error_message_callback_) { | 672 if (error_message_callback_) { |
| 673 std::string temp(GLES2Util::GetStringError(error) + " : " + | 673 std::string temp(GLES2Util::GetStringError(error) + " : " + |
| 674 function_name + ": " + (msg ? msg : "")); | 674 function_name + ": " + (msg ? msg : "")); |
| 675 error_message_callback_->OnErrorMessage(temp.c_str(), 0); | 675 error_message_callback_->OnErrorMessage(temp.c_str(), 0); |
| 676 } | 676 } |
| 677 error_bits_ |= GLES2Util::GLErrorToErrorBit(error); | 677 error_bits_ |= GLES2Util::GLErrorToErrorBit(error); |
| 678 } | 678 } |
| 679 | 679 |
| 680 void GLES2Implementation::SetGLErrorInvalidEnum( |
| 681 const char* function_name, GLenum value, const char* label) { |
| 682 SetGLError(GL_INVALID_ENUM, function_name, |
| 683 (std::string(label) + " was " + |
| 684 GLES2Util::GetStringEnum(value)).c_str()); |
| 685 } |
| 686 |
| 680 bool GLES2Implementation::GetBucketContents(uint32 bucket_id, | 687 bool GLES2Implementation::GetBucketContents(uint32 bucket_id, |
| 681 std::vector<int8>* data) { | 688 std::vector<int8>* data) { |
| 682 TRACE_EVENT0("gpu", "GLES2::GetBucketContents"); | 689 TRACE_EVENT0("gpu", "GLES2::GetBucketContents"); |
| 683 GPU_DCHECK(data); | 690 GPU_DCHECK(data); |
| 684 const uint32 kStartSize = 32 * 1024; | 691 const uint32 kStartSize = 32 * 1024; |
| 685 ScopedTransferBufferPtr buffer(kStartSize, helper_, transfer_buffer_); | 692 ScopedTransferBufferPtr buffer(kStartSize, helper_, transfer_buffer_); |
| 686 if (!buffer.valid()) { | 693 if (!buffer.valid()) { |
| 687 return false; | 694 return false; |
| 688 } | 695 } |
| 689 typedef cmd::GetBucketStart::Result Result; | 696 typedef cmd::GetBucketStart::Result Result; |
| (...skipping 1656 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2346 } | 2353 } |
| 2347 } | 2354 } |
| 2348 | 2355 |
| 2349 void GLES2Implementation::ActiveTexture(GLenum texture) { | 2356 void GLES2Implementation::ActiveTexture(GLenum texture) { |
| 2350 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 2357 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 2351 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glActiveTexture(" | 2358 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glActiveTexture(" |
| 2352 << GLES2Util::GetStringEnum(texture) << ")"); | 2359 << GLES2Util::GetStringEnum(texture) << ")"); |
| 2353 GLuint texture_index = texture - GL_TEXTURE0; | 2360 GLuint texture_index = texture - GL_TEXTURE0; |
| 2354 if (texture_index >= static_cast<GLuint>( | 2361 if (texture_index >= static_cast<GLuint>( |
| 2355 gl_state_.int_state.max_combined_texture_image_units)) { | 2362 gl_state_.int_state.max_combined_texture_image_units)) { |
| 2356 SetGLError( | 2363 SetGLErrorInvalidEnum( |
| 2357 GL_INVALID_ENUM, "glActiveTexture", "texture_unit out of range."); | 2364 "glActiveTexture", texture, "texture"); |
| 2358 return; | 2365 return; |
| 2359 } | 2366 } |
| 2360 | 2367 |
| 2361 active_texture_unit_ = texture_index; | 2368 active_texture_unit_ = texture_index; |
| 2362 helper_->ActiveTexture(texture); | 2369 helper_->ActiveTexture(texture); |
| 2363 } | 2370 } |
| 2364 | 2371 |
| 2365 // NOTE #1: On old versions of OpenGL, calling glBindXXX with an unused id | 2372 // NOTE #1: On old versions of OpenGL, calling glBindXXX with an unused id |
| 2366 // generates a new resource. On newer versions of OpenGL they don't. The code | 2373 // generates a new resource. On newer versions of OpenGL they don't. The code |
| 2367 // related to binding below will need to change if we switch to the new OpenGL | 2374 // related to binding below will need to change if we switch to the new OpenGL |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2616 break; | 2623 break; |
| 2617 case GL_VERTEX_ATTRIB_ARRAY_TYPE: | 2624 case GL_VERTEX_ATTRIB_ARRAY_TYPE: |
| 2618 *param = info->type(); | 2625 *param = info->type(); |
| 2619 break; | 2626 break; |
| 2620 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED: | 2627 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED: |
| 2621 *param = info->normalized(); | 2628 *param = info->normalized(); |
| 2622 break; | 2629 break; |
| 2623 case GL_CURRENT_VERTEX_ATTRIB: | 2630 case GL_CURRENT_VERTEX_ATTRIB: |
| 2624 return false; // pass through to service side. | 2631 return false; // pass through to service side. |
| 2625 default: | 2632 default: |
| 2626 SetGLError(GL_INVALID_ENUM, "glGetVertexAttrib", "invalid enum"); | 2633 SetGLErrorInvalidEnum("glGetVertexAttrib", pname, "pname"); |
| 2627 break; | 2634 break; |
| 2628 } | 2635 } |
| 2629 return true; | 2636 return true; |
| 2630 } | 2637 } |
| 2631 #endif // GLES2_SUPPORT_CLIENT_SIDE_ARRAYS | 2638 #endif // GLES2_SUPPORT_CLIENT_SIDE_ARRAYS |
| 2632 | 2639 |
| 2633 void GLES2Implementation::GetVertexAttribfv( | 2640 void GLES2Implementation::GetVertexAttribfv( |
| 2634 GLuint index, GLenum pname, GLfloat* params) { | 2641 GLuint index, GLenum pname, GLfloat* params) { |
| 2635 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 2642 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 2636 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetVertexAttribfv(" | 2643 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetVertexAttribfv(" |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2717 | 2724 |
| 2718 void* GLES2Implementation::MapBufferSubDataCHROMIUM( | 2725 void* GLES2Implementation::MapBufferSubDataCHROMIUM( |
| 2719 GLuint target, GLintptr offset, GLsizeiptr size, GLenum access) { | 2726 GLuint target, GLintptr offset, GLsizeiptr size, GLenum access) { |
| 2720 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 2727 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 2721 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glMapBufferSubDataCHROMIUM(" | 2728 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glMapBufferSubDataCHROMIUM(" |
| 2722 << target << ", " << offset << ", " << size << ", " | 2729 << target << ", " << offset << ", " << size << ", " |
| 2723 << GLES2Util::GetStringEnum(access) << ")"); | 2730 << GLES2Util::GetStringEnum(access) << ")"); |
| 2724 // NOTE: target is NOT checked because the service will check it | 2731 // NOTE: target is NOT checked because the service will check it |
| 2725 // and we don't know what targets are valid. | 2732 // and we don't know what targets are valid. |
| 2726 if (access != GL_WRITE_ONLY) { | 2733 if (access != GL_WRITE_ONLY) { |
| 2727 SetGLError( | 2734 SetGLErrorInvalidEnum( |
| 2728 GL_INVALID_ENUM, "glMapBufferSubDataCHROMIUM", "bad access mode"); | 2735 "glMapBufferSubDataCHROMIUM", access, "access"); |
| 2729 return NULL; | 2736 return NULL; |
| 2730 } | 2737 } |
| 2731 if (offset < 0 || size < 0) { | 2738 if (offset < 0 || size < 0) { |
| 2732 SetGLError(GL_INVALID_VALUE, "glMapBufferSubDataCHROMIUM", "bad range"); | 2739 SetGLError(GL_INVALID_VALUE, "glMapBufferSubDataCHROMIUM", "bad range"); |
| 2733 return NULL; | 2740 return NULL; |
| 2734 } | 2741 } |
| 2735 int32 shm_id; | 2742 int32 shm_id; |
| 2736 unsigned int shm_offset; | 2743 unsigned int shm_offset; |
| 2737 void* mem = mapped_memory_->Alloc(size, &shm_id, &shm_offset); | 2744 void* mem = mapped_memory_->Alloc(size, &shm_id, &shm_offset); |
| 2738 if (!mem) { | 2745 if (!mem) { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2779 GLenum access) { | 2786 GLenum access) { |
| 2780 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 2787 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 2781 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glMapTexSubImage2DCHROMIUM(" | 2788 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glMapTexSubImage2DCHROMIUM(" |
| 2782 << target << ", " << level << ", " | 2789 << target << ", " << level << ", " |
| 2783 << xoffset << ", " << yoffset << ", " | 2790 << xoffset << ", " << yoffset << ", " |
| 2784 << width << ", " << height << ", " | 2791 << width << ", " << height << ", " |
| 2785 << GLES2Util::GetStringTextureFormat(format) << ", " | 2792 << GLES2Util::GetStringTextureFormat(format) << ", " |
| 2786 << GLES2Util::GetStringPixelType(type) << ", " | 2793 << GLES2Util::GetStringPixelType(type) << ", " |
| 2787 << GLES2Util::GetStringEnum(access) << ")"); | 2794 << GLES2Util::GetStringEnum(access) << ")"); |
| 2788 if (access != GL_WRITE_ONLY) { | 2795 if (access != GL_WRITE_ONLY) { |
| 2789 SetGLError( | 2796 SetGLErrorInvalidEnum( |
| 2790 GL_INVALID_ENUM, "glMapTexSubImage2DCHROMIUM", "bad access mode"); | 2797 "glMapTexSubImage2DCHROMIUM", access, "access"); |
| 2791 return NULL; | 2798 return NULL; |
| 2792 } | 2799 } |
| 2793 // NOTE: target is NOT checked because the service will check it | 2800 // NOTE: target is NOT checked because the service will check it |
| 2794 // and we don't know what targets are valid. | 2801 // and we don't know what targets are valid. |
| 2795 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0) { | 2802 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0) { |
| 2796 SetGLError( | 2803 SetGLError( |
| 2797 GL_INVALID_VALUE, "glMapTexSubImage2DCHROMIUM", "bad dimensions"); | 2804 GL_INVALID_VALUE, "glMapTexSubImage2DCHROMIUM", "bad dimensions"); |
| 2798 return NULL; | 2805 return NULL; |
| 2799 } | 2806 } |
| 2800 uint32 size; | 2807 uint32 size; |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2912 GPU_CLIENT_LOG_CODE_BLOCK({ | 2919 GPU_CLIENT_LOG_CODE_BLOCK({ |
| 2913 for (GLuint i = 0; i < count; ++i) { | 2920 for (GLuint i = 0; i < count; ++i) { |
| 2914 GPU_CLIENT_LOG( | 2921 GPU_CLIENT_LOG( |
| 2915 " " << i << ": " << GLES2Util::GetStringGLState(pnames[i])); | 2922 " " << i << ": " << GLES2Util::GetStringGLState(pnames[i])); |
| 2916 } | 2923 } |
| 2917 }); | 2924 }); |
| 2918 int num_results = 0; | 2925 int num_results = 0; |
| 2919 for (GLuint ii = 0; ii < count; ++ii) { | 2926 for (GLuint ii = 0; ii < count; ++ii) { |
| 2920 int num = util_.GLGetNumValuesReturned(pnames[ii]); | 2927 int num = util_.GLGetNumValuesReturned(pnames[ii]); |
| 2921 if (!num) { | 2928 if (!num) { |
| 2922 SetGLError(GL_INVALID_ENUM, "glGetMultipleIntegervCHROMIUM", "bad pname"); | 2929 SetGLErrorInvalidEnum( |
| 2930 "glGetMultipleIntegervCHROMIUM", pnames[ii], "pname"); |
| 2923 return; | 2931 return; |
| 2924 } | 2932 } |
| 2925 num_results += num; | 2933 num_results += num; |
| 2926 } | 2934 } |
| 2927 if (static_cast<size_t>(size) != num_results * sizeof(GLint)) { | 2935 if (static_cast<size_t>(size) != num_results * sizeof(GLint)) { |
| 2928 SetGLError(GL_INVALID_VALUE, "glGetMultipleIntegervCHROMIUM", "bad size"); | 2936 SetGLError(GL_INVALID_VALUE, "glGetMultipleIntegervCHROMIUM", "bad size"); |
| 2929 return; | 2937 return; |
| 2930 } | 2938 } |
| 2931 for (int ii = 0; ii < num_results; ++ii) { | 2939 for (int ii = 0; ii < num_results; ++ii) { |
| 2932 if (results[ii] != 0) { | 2940 if (results[ii] != 0) { |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3174 | 3182 |
| 3175 void GLES2Implementation::GetQueryivEXT( | 3183 void GLES2Implementation::GetQueryivEXT( |
| 3176 GLenum target, GLenum pname, GLint* params) { | 3184 GLenum target, GLenum pname, GLint* params) { |
| 3177 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 3185 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 3178 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryivEXT(" | 3186 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryivEXT(" |
| 3179 << GLES2Util::GetStringQueryTarget(target) << ", " | 3187 << GLES2Util::GetStringQueryTarget(target) << ", " |
| 3180 << GLES2Util::GetStringQueryParameter(pname) << ", " | 3188 << GLES2Util::GetStringQueryParameter(pname) << ", " |
| 3181 << static_cast<const void*>(params) << ")"); | 3189 << static_cast<const void*>(params) << ")"); |
| 3182 | 3190 |
| 3183 if (pname != GL_CURRENT_QUERY_EXT) { | 3191 if (pname != GL_CURRENT_QUERY_EXT) { |
| 3184 SetGLError(GL_INVALID_ENUM, "glGetQueryivEXT", "invalid pname"); | 3192 SetGLErrorInvalidEnum("glGetQueryivEXT", pname, "pname"); |
| 3185 return; | 3193 return; |
| 3186 } | 3194 } |
| 3187 *params = (current_query_ && current_query_->target() == target) ? | 3195 *params = (current_query_ && current_query_->target() == target) ? |
| 3188 current_query_->id() : 0; | 3196 current_query_->id() : 0; |
| 3189 GPU_CLIENT_LOG(" " << *params); | 3197 GPU_CLIENT_LOG(" " << *params); |
| 3190 } | 3198 } |
| 3191 | 3199 |
| 3192 void GLES2Implementation::GetQueryObjectuivEXT( | 3200 void GLES2Implementation::GetQueryObjectuivEXT( |
| 3193 GLuint id, GLenum pname, GLuint* params) { | 3201 GLuint id, GLenum pname, GLuint* params) { |
| 3194 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 3202 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 3225 FinishHelper(); | 3233 FinishHelper(); |
| 3226 GPU_CHECK(query->CheckResultsAvailable(helper_)); | 3234 GPU_CHECK(query->CheckResultsAvailable(helper_)); |
| 3227 } | 3235 } |
| 3228 } | 3236 } |
| 3229 *params = query->GetResult(); | 3237 *params = query->GetResult(); |
| 3230 break; | 3238 break; |
| 3231 case GL_QUERY_RESULT_AVAILABLE_EXT: | 3239 case GL_QUERY_RESULT_AVAILABLE_EXT: |
| 3232 *params = query->CheckResultsAvailable(helper_); | 3240 *params = query->CheckResultsAvailable(helper_); |
| 3233 break; | 3241 break; |
| 3234 default: | 3242 default: |
| 3235 SetGLError(GL_INVALID_ENUM, "glQueryObjectuivEXT", "unknown pname"); | 3243 SetGLErrorInvalidEnum("glQueryObjectuivEXT", pname, "pname"); |
| 3236 break; | 3244 break; |
| 3237 } | 3245 } |
| 3238 GPU_CLIENT_LOG(" " << *params); | 3246 GPU_CLIENT_LOG(" " << *params); |
| 3239 } | 3247 } |
| 3240 | 3248 |
| 3241 void GLES2Implementation::DrawArraysInstancedANGLE( | 3249 void GLES2Implementation::DrawArraysInstancedANGLE( |
| 3242 GLenum mode, GLint first, GLsizei count, GLsizei primcount) { | 3250 GLenum mode, GLint first, GLsizei count, GLsizei primcount) { |
| 3243 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 3251 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 3244 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDrawArraysInstancedANGLE(" | 3252 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDrawArraysInstancedANGLE(" |
| 3245 << GLES2Util::GetStringDrawMode(mode) << ", " | 3253 << GLES2Util::GetStringDrawMode(mode) << ", " |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3389 | 3397 |
| 3390 void GLES2Implementation::PopGroupMarkerEXT() { | 3398 void GLES2Implementation::PopGroupMarkerEXT() { |
| 3391 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 3399 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 3392 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glPopGroupMarkerEXT()"); | 3400 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glPopGroupMarkerEXT()"); |
| 3393 helper_->PopGroupMarkerEXT(); | 3401 helper_->PopGroupMarkerEXT(); |
| 3394 debug_marker_manager_.PopGroup(); | 3402 debug_marker_manager_.PopGroup(); |
| 3395 } | 3403 } |
| 3396 | 3404 |
| 3397 } // namespace gles2 | 3405 } // namespace gles2 |
| 3398 } // namespace gpu | 3406 } // namespace gpu |
| OLD | NEW |