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 "../client/gles2_implementation.h" | 7 #include "../client/gles2_implementation.h" |
| 8 | 8 |
| 9 #include <algorithm> | |
| 9 #include <map> | 10 #include <map> |
| 11 #include <queue> | |
| 10 #include <set> | 12 #include <set> |
| 11 #include <queue> | |
| 12 #include <GLES2/gl2ext.h> | 13 #include <GLES2/gl2ext.h> |
| 13 #include "../client/mapped_memory.h" | 14 #include "../client/mapped_memory.h" |
| 14 #include "../client/program_info_manager.h" | 15 #include "../client/program_info_manager.h" |
| 15 #include "../client/query_tracker.h" | 16 #include "../client/query_tracker.h" |
| 16 #include "../client/transfer_buffer.h" | 17 #include "../client/transfer_buffer.h" |
| 17 #include "../common/gles2_cmd_utils.h" | 18 #include "../common/gles2_cmd_utils.h" |
| 18 #include "../common/trace_event.h" | 19 #include "../common/trace_event.h" |
| 19 | 20 |
| 20 #if defined(__native_client__) && !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | 21 #if defined(__native_client__) && !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) |
| 21 #define GLES2_SUPPORT_CLIENT_SIDE_ARRAYS | 22 #define GLES2_SUPPORT_CLIENT_SIDE_ARRAYS |
| (...skipping 2061 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2083 helper_->SetBucketSize(kResultBucketId, 0); | 2084 helper_->SetBucketSize(kResultBucketId, 0); |
| 2084 helper_->GetString(name, kResultBucketId); | 2085 helper_->GetString(name, kResultBucketId); |
| 2085 std::string str; | 2086 std::string str; |
| 2086 if (GetBucketAsString(kResultBucketId, &str)) { | 2087 if (GetBucketAsString(kResultBucketId, &str)) { |
| 2087 // Adds extensions implemented on client side only. | 2088 // Adds extensions implemented on client side only. |
| 2088 switch (name) { | 2089 switch (name) { |
| 2089 case GL_EXTENSIONS: | 2090 case GL_EXTENSIONS: |
| 2090 str += std::string(str.empty() ? "" : " ") + | 2091 str += std::string(str.empty() ? "" : " ") + |
| 2091 "GL_CHROMIUM_map_sub " | 2092 "GL_CHROMIUM_map_sub " |
| 2092 "GL_CHROMIUM_flipy " | 2093 "GL_CHROMIUM_flipy " |
| 2094 "GL_CHROMIUM_consistent_uniform_locations " | |
| 2093 "GL_EXT_unpack_subimage"; | 2095 "GL_EXT_unpack_subimage"; |
| 2094 break; | 2096 break; |
| 2095 default: | 2097 default: |
| 2096 break; | 2098 break; |
| 2097 } | 2099 } |
| 2098 | 2100 |
| 2099 // Because of WebGL the extensions can change. We have to cache each unique | 2101 // Because of WebGL the extensions can change. We have to cache each unique |
| 2100 // result since we don't know when the client will stop referring to a | 2102 // result since we don't know when the client will stop referring to a |
| 2101 // previous one it queries. | 2103 // previous one it queries. |
| 2102 GLStringMap::iterator it = gl_strings_.find(name); | 2104 GLStringMap::iterator it = gl_strings_.find(name); |
| (...skipping 1166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3269 TRACE_EVENT0("gpu", "GLES2::GenMailboxCHROMIUM"); | 3271 TRACE_EVENT0("gpu", "GLES2::GenMailboxCHROMIUM"); |
| 3270 | 3272 |
| 3271 helper_->GenMailboxCHROMIUM(kResultBucketId); | 3273 helper_->GenMailboxCHROMIUM(kResultBucketId); |
| 3272 | 3274 |
| 3273 std::vector<GLbyte> result; | 3275 std::vector<GLbyte> result; |
| 3274 GetBucketContents(kResultBucketId, &result); | 3276 GetBucketContents(kResultBucketId, &result); |
| 3275 | 3277 |
| 3276 std::copy(result.begin(), result.end(), mailbox); | 3278 std::copy(result.begin(), result.end(), mailbox); |
| 3277 } | 3279 } |
| 3278 | 3280 |
| 3281 namespace { | |
| 3282 | |
| 3283 class GLUniformDefinitionComparer { | |
| 3284 public: | |
| 3285 explicit GLUniformDefinitionComparer( | |
| 3286 const GLUniformDefinitionCHROMIUM* uniforms) | |
| 3287 : uniforms_(uniforms) { | |
| 3288 } | |
| 3289 | |
| 3290 bool operator()(const GLint lhs, const GLint rhs) const { | |
| 3291 return strcmp(uniforms_[lhs].name, uniforms_[rhs].name) < 0; | |
| 3292 } | |
| 3293 | |
| 3294 private: | |
| 3295 const GLUniformDefinitionCHROMIUM* uniforms_; | |
| 3296 }; | |
| 3297 | |
| 3298 } // anonymous namespace. | |
| 3299 | |
| 3300 void GLES2Implementation::GetUniformLocationsCHROMIUM( | |
| 3301 const GLUniformDefinitionCHROMIUM* uniforms, | |
| 3302 GLsizei count, | |
| 3303 GLsizei max_locations, | |
| 3304 GLint* locations) { | |
| 3305 GPU_CLIENT_SINGLE_THREAD_CHECK(); | |
| 3306 GPU_CLIENT_LOG("[" << this << "] glGenUniformLocationsCHROMIUM(" | |
| 3307 << static_cast<const void*>(uniforms) << ", " << count << ", " | |
| 3308 << max_locations << ", " << static_cast<const void*>(locations) << ")"); | |
| 3309 | |
| 3310 if (count <= 0) { | |
| 3311 SetGLError(GL_INVALID_VALUE, "glGetUniformLocationsCHROMIUM", "count <= 0"); | |
| 3312 return; | |
| 3313 } | |
| 3314 | |
| 3315 for (GLsizei ii = 0; ii < count; ++ii) { | |
| 3316 const GLUniformDefinitionCHROMIUM& def = uniforms[ii]; | |
| 3317 if (def.size <= 0) { | |
| 3318 SetGLError( | |
| 3319 GL_INVALID_VALUE, "glGetUniformLocationsCHROMIUM", "size <= 0"); | |
| 3320 return; | |
| 3321 } | |
| 3322 } | |
| 3323 | |
| 3324 scoped_array<GLint> indices(new GLint[count]); | |
| 3325 for (GLint ii = 0; ii < count; ++ii) { | |
| 3326 indices[ii] = ii; | |
| 3327 } | |
| 3328 | |
| 3329 std::sort(&indices[0], &indices[count], | |
| 3330 GLUniformDefinitionComparer(uniforms)); | |
| 3331 | |
| 3332 scoped_array<GLint> reverse_map(new int[count]); | |
|
apatrick_chromium
2012/06/18 18:58:03
nit: int->GLint
| |
| 3333 | |
| 3334 for (GLint ii = 0; ii < count; ++ii) { | |
| 3335 reverse_map[indices[ii]] = ii; | |
| 3336 } | |
| 3337 | |
| 3338 for (GLsizei ii = 0; ii < count; ++ii) { | |
| 3339 const GLUniformDefinitionCHROMIUM& def = uniforms[ii]; | |
| 3340 GLint base_location = reverse_map[ii]; | |
| 3341 for (GLsizei jj = 0; jj < def.size; ++jj) { | |
| 3342 if (max_locations <= 0) { | |
| 3343 return; | |
| 3344 } | |
| 3345 *locations++ = GLES2Util::SwizzleLocation( | |
| 3346 GLES2Util::MakeFakeLocation(base_location, jj)); | |
| 3347 --max_locations; | |
| 3348 } | |
| 3349 } | |
| 3350 } | |
| 3351 | |
| 3279 } // namespace gles2 | 3352 } // namespace gles2 |
| 3280 } // namespace gpu | 3353 } // namespace gpu |
| OLD | NEW |