Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Side by Side Diff: gpu/command_buffer/client/gles2_implementation.cc

Issue 10568003: Add support for GL_CHROMIUM_consistent_uniform_locations (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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 GLint[count]);
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/client/gles2_implementation.h ('k') | gpu/command_buffer/client/gles2_implementation_autogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698