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 1144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1155 void GLES2Implementation::BindAttribLocation( | 1155 void GLES2Implementation::BindAttribLocation( |
1156 GLuint program, GLuint index, const char* name) { | 1156 GLuint program, GLuint index, const char* name) { |
1157 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 1157 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
1158 GPU_CLIENT_LOG("[" << this << "] glBindAttribLocation(" << program << ", " | 1158 GPU_CLIENT_LOG("[" << this << "] glBindAttribLocation(" << program << ", " |
1159 << index << ", " << name << ")"); | 1159 << index << ", " << name << ")"); |
1160 SetBucketAsString(kResultBucketId, name); | 1160 SetBucketAsString(kResultBucketId, name); |
1161 helper_->BindAttribLocationBucket(program, index, kResultBucketId); | 1161 helper_->BindAttribLocationBucket(program, index, kResultBucketId); |
1162 helper_->SetBucketSize(kResultBucketId, 0); | 1162 helper_->SetBucketSize(kResultBucketId, 0); |
1163 } | 1163 } |
1164 | 1164 |
| 1165 void GLES2Implementation::BindUniformLocationCHROMIUM( |
| 1166 GLuint program, GLint location, const char* name) { |
| 1167 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 1168 GPU_CLIENT_LOG("[" << this << "] glBindUniformLocationCHROMIUM(" |
| 1169 << program << ", " << location << ", " << name << ")"); |
| 1170 SetBucketAsString(kResultBucketId, name); |
| 1171 helper_->BindUniformLocationCHROMIUMBucket( |
| 1172 program, location, kResultBucketId); |
| 1173 helper_->SetBucketSize(kResultBucketId, 0); |
| 1174 } |
| 1175 |
1165 void GLES2Implementation::GetVertexAttribPointerv( | 1176 void GLES2Implementation::GetVertexAttribPointerv( |
1166 GLuint index, GLenum pname, void** ptr) { | 1177 GLuint index, GLenum pname, void** ptr) { |
1167 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 1178 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
1168 GPU_CLIENT_LOG("[" << this << "] glGetVertexAttribPointer(" << index << ", " | 1179 GPU_CLIENT_LOG("[" << this << "] glGetVertexAttribPointer(" << index << ", " |
1169 << GLES2Util::GetStringVertexPointer(pname) << ", " | 1180 << GLES2Util::GetStringVertexPointer(pname) << ", " |
1170 << static_cast<void*>(ptr) << ")"); | 1181 << static_cast<void*>(ptr) << ")"); |
1171 | 1182 |
1172 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | 1183 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) |
1173 // If it's a client side buffer the client has the data. | 1184 // If it's a client side buffer the client has the data. |
1174 if (client_side_buffer_helper_->GetAttribPointer(index, pname, ptr)) { | 1185 if (client_side_buffer_helper_->GetAttribPointer(index, pname, ptr)) { |
(...skipping 909 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2084 helper_->SetBucketSize(kResultBucketId, 0); | 2095 helper_->SetBucketSize(kResultBucketId, 0); |
2085 helper_->GetString(name, kResultBucketId); | 2096 helper_->GetString(name, kResultBucketId); |
2086 std::string str; | 2097 std::string str; |
2087 if (GetBucketAsString(kResultBucketId, &str)) { | 2098 if (GetBucketAsString(kResultBucketId, &str)) { |
2088 // Adds extensions implemented on client side only. | 2099 // Adds extensions implemented on client side only. |
2089 switch (name) { | 2100 switch (name) { |
2090 case GL_EXTENSIONS: | 2101 case GL_EXTENSIONS: |
2091 str += std::string(str.empty() ? "" : " ") + | 2102 str += std::string(str.empty() ? "" : " ") + |
2092 "GL_CHROMIUM_map_sub " | 2103 "GL_CHROMIUM_map_sub " |
2093 "GL_CHROMIUM_flipy " | 2104 "GL_CHROMIUM_flipy " |
2094 "GL_CHROMIUM_consistent_uniform_locations " | |
2095 "GL_EXT_unpack_subimage"; | 2105 "GL_EXT_unpack_subimage"; |
2096 break; | 2106 break; |
2097 default: | 2107 default: |
2098 break; | 2108 break; |
2099 } | 2109 } |
2100 | 2110 |
2101 // Because of WebGL the extensions can change. We have to cache each unique | 2111 // Because of WebGL the extensions can change. We have to cache each unique |
2102 // result since we don't know when the client will stop referring to a | 2112 // result since we don't know when the client will stop referring to a |
2103 // previous one it queries. | 2113 // previous one it queries. |
2104 GLStringMap::iterator it = gl_strings_.find(name); | 2114 GLStringMap::iterator it = gl_strings_.find(name); |
(...skipping 1166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3271 TRACE_EVENT0("gpu", "GLES2::GenMailboxCHROMIUM"); | 3281 TRACE_EVENT0("gpu", "GLES2::GenMailboxCHROMIUM"); |
3272 | 3282 |
3273 helper_->GenMailboxCHROMIUM(kResultBucketId); | 3283 helper_->GenMailboxCHROMIUM(kResultBucketId); |
3274 | 3284 |
3275 std::vector<GLbyte> result; | 3285 std::vector<GLbyte> result; |
3276 GetBucketContents(kResultBucketId, &result); | 3286 GetBucketContents(kResultBucketId, &result); |
3277 | 3287 |
3278 std::copy(result.begin(), result.end(), mailbox); | 3288 std::copy(result.begin(), result.end(), mailbox); |
3279 } | 3289 } |
3280 | 3290 |
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 | |
3299 | |
3300 } // anonymous namespace. | |
3301 | |
3302 void GLES2Implementation::GetUniformLocationsCHROMIUM( | |
3303 GLuint program, | |
3304 const GLUniformDefinitionCHROMIUM* uniforms, | |
3305 GLsizei count, | |
3306 GLsizei max_locations, | |
3307 GLint* locations) { | |
3308 (void)program; // To keep the compiler happy as it's unused in release. | |
3309 | |
3310 GPU_CLIENT_SINGLE_THREAD_CHECK(); | |
3311 GPU_CLIENT_LOG("[" << this << "] glGenUniformLocationsCHROMIUM(" | |
3312 << static_cast<const void*>(uniforms) << ", " << count << ", " | |
3313 << max_locations << ", " << static_cast<const void*>(locations) << ")"); | |
3314 | |
3315 if (count <= 0) { | |
3316 SetGLError(GL_INVALID_VALUE, "glGetUniformLocationsCHROMIUM", "count <= 0"); | |
3317 return; | |
3318 } | |
3319 | |
3320 for (GLsizei ii = 0; ii < count; ++ii) { | |
3321 const GLUniformDefinitionCHROMIUM& def = uniforms[ii]; | |
3322 if (def.size <= 0) { | |
3323 SetGLError( | |
3324 GL_INVALID_VALUE, "glGetUniformLocationsCHROMIUM", "size <= 0"); | |
3325 return; | |
3326 } | |
3327 } | |
3328 | |
3329 scoped_array<GLint> indices(new GLint[count]); | |
3330 for (GLint ii = 0; ii < count; ++ii) { | |
3331 indices[ii] = ii; | |
3332 } | |
3333 | |
3334 std::sort(&indices[0], &indices[count], | |
3335 GLUniformDefinitionComparer(uniforms)); | |
3336 | |
3337 scoped_array<GLint> reverse_map(new GLint[count]); | |
3338 | |
3339 for (GLint ii = 0; ii < count; ++ii) { | |
3340 reverse_map[indices[ii]] = ii; | |
3341 } | |
3342 | |
3343 for (GLsizei ii = 0; ii < count; ++ii) { | |
3344 const GLUniformDefinitionCHROMIUM& def = uniforms[ii]; | |
3345 GLint base_location = reverse_map[ii]; | |
3346 for (GLsizei jj = 0; jj < def.size; ++jj) { | |
3347 if (max_locations <= 0) { | |
3348 return; | |
3349 } | |
3350 GLint location = GLES2Util::SwizzleLocation( | |
3351 GLES2Util::MakeFakeLocation(base_location, jj)); | |
3352 *locations++ = location; | |
3353 #if defined(GPU_CLIENT_DEBUG) | |
3354 std::string name(def.name); | |
3355 if (jj > 0) { | |
3356 char buf[20]; | |
3357 sprintf(buf, "%d", jj); | |
3358 name = name + "[" + buf + "]"; | |
3359 } | |
3360 GPU_DCHECK_EQ( | |
3361 location, | |
3362 share_group_->program_info_manager()->GetUniformLocation( | |
3363 this, program, name.c_str())); | |
3364 #endif | |
3365 --max_locations; | |
3366 | |
3367 } | |
3368 } | |
3369 } | |
3370 | |
3371 } // namespace gles2 | 3291 } // namespace gles2 |
3372 } // namespace gpu | 3292 } // namespace gpu |
OLD | NEW |