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 <GLES2/gl2ext.h> | 9 #include <GLES2/gl2ext.h> |
10 #include <GLES2/gl2extchromium.h> | 10 #include <GLES2/gl2extchromium.h> |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 const size_t GLES2Implementation::kMaxSizeOfSimpleResult; | 42 const size_t GLES2Implementation::kMaxSizeOfSimpleResult; |
43 const unsigned int GLES2Implementation::kStartingOffset; | 43 const unsigned int GLES2Implementation::kStartingOffset; |
44 #endif | 44 #endif |
45 | 45 |
46 GLES2Implementation::GLStaticState::GLStaticState() { | 46 GLES2Implementation::GLStaticState::GLStaticState() { |
47 } | 47 } |
48 | 48 |
49 GLES2Implementation::GLStaticState::~GLStaticState() { | 49 GLES2Implementation::GLStaticState::~GLStaticState() { |
50 } | 50 } |
51 | 51 |
52 GLES2Implementation::GLStaticState::IntState::IntState() | |
53 : max_combined_texture_image_units(0), | |
54 max_cube_map_texture_size(0), | |
55 max_fragment_uniform_vectors(0), | |
56 max_renderbuffer_size(0), | |
57 max_texture_image_units(0), | |
58 max_texture_size(0), | |
59 max_varying_vectors(0), | |
60 max_vertex_attribs(0), | |
61 max_vertex_texture_image_units(0), | |
62 max_vertex_uniform_vectors(0), | |
63 num_compressed_texture_formats(0), | |
64 num_shader_binary_formats(0), | |
65 bind_generates_resource_chromium(0) {} | |
66 | |
67 GLES2Implementation::SingleThreadChecker::SingleThreadChecker( | 52 GLES2Implementation::SingleThreadChecker::SingleThreadChecker( |
68 GLES2Implementation* gles2_implementation) | 53 GLES2Implementation* gles2_implementation) |
69 : gles2_implementation_(gles2_implementation) { | 54 : gles2_implementation_(gles2_implementation) { |
70 CHECK_EQ(0, gles2_implementation_->use_count_); | 55 CHECK_EQ(0, gles2_implementation_->use_count_); |
71 ++gles2_implementation_->use_count_; | 56 ++gles2_implementation_->use_count_; |
72 } | 57 } |
73 | 58 |
74 GLES2Implementation::SingleThreadChecker::~SingleThreadChecker() { | 59 GLES2Implementation::SingleThreadChecker::~SingleThreadChecker() { |
75 --gles2_implementation_->use_count_; | 60 --gles2_implementation_->use_count_; |
76 CHECK_EQ(0, gles2_implementation_->use_count_); | 61 CHECK_EQ(0, gles2_implementation_->use_count_); |
(...skipping 15 matching lines...) Expand all Loading... |
92 unpack_alignment_(4), | 77 unpack_alignment_(4), |
93 unpack_flip_y_(false), | 78 unpack_flip_y_(false), |
94 unpack_row_length_(0), | 79 unpack_row_length_(0), |
95 unpack_skip_rows_(0), | 80 unpack_skip_rows_(0), |
96 unpack_skip_pixels_(0), | 81 unpack_skip_pixels_(0), |
97 pack_reverse_row_order_(false), | 82 pack_reverse_row_order_(false), |
98 active_texture_unit_(0), | 83 active_texture_unit_(0), |
99 bound_framebuffer_(0), | 84 bound_framebuffer_(0), |
100 bound_read_framebuffer_(0), | 85 bound_read_framebuffer_(0), |
101 bound_renderbuffer_(0), | 86 bound_renderbuffer_(0), |
| 87 bound_valuebuffer_(0), |
102 current_program_(0), | 88 current_program_(0), |
103 bound_array_buffer_id_(0), | 89 bound_array_buffer_id_(0), |
104 bound_pixel_pack_transfer_buffer_id_(0), | 90 bound_pixel_pack_transfer_buffer_id_(0), |
105 bound_pixel_unpack_transfer_buffer_id_(0), | 91 bound_pixel_unpack_transfer_buffer_id_(0), |
106 async_upload_token_(0), | 92 async_upload_token_(0), |
107 async_upload_sync_(NULL), | 93 async_upload_sync_(NULL), |
108 async_upload_sync_shm_id_(0), | 94 async_upload_sync_shm_id_(0), |
109 async_upload_sync_shm_offset_(0), | 95 async_upload_sync_shm_offset_(0), |
110 error_bits_(0), | 96 error_bits_(0), |
111 debug_(false), | 97 debug_(false), |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
166 base::Unretained(this)), | 152 base::Unretained(this)), |
167 mapped_memory_limit)); | 153 mapped_memory_limit)); |
168 | 154 |
169 unsigned chunk_size = 2 * 1024 * 1024; | 155 unsigned chunk_size = 2 * 1024 * 1024; |
170 if (mapped_memory_limit != kNoLimit) { | 156 if (mapped_memory_limit != kNoLimit) { |
171 // Use smaller chunks if the client is very memory conscientious. | 157 // Use smaller chunks if the client is very memory conscientious. |
172 chunk_size = std::min(mapped_memory_limit / 4, chunk_size); | 158 chunk_size = std::min(mapped_memory_limit / 4, chunk_size); |
173 } | 159 } |
174 mapped_memory_->set_chunk_size_multiple(chunk_size); | 160 mapped_memory_->set_chunk_size_multiple(chunk_size); |
175 | 161 |
176 if (!QueryAndCacheStaticState()) | 162 GLStaticState::ShaderPrecisionMap* shader_precisions = |
177 return false; | 163 &static_state_.shader_precisions; |
| 164 capabilities_.VisitPrecisions([shader_precisions]( |
| 165 GLenum shader, GLenum type, Capabilities::ShaderPrecision* result) { |
| 166 const GLStaticState::ShaderPrecisionKey key(shader, type); |
| 167 cmds::GetShaderPrecisionFormat::Result cached_result = { |
| 168 true, result->min_range, result->max_range, result->precision}; |
| 169 shader_precisions->insert(std::make_pair(key, cached_result)); |
| 170 }); |
178 | 171 |
179 util_.set_num_compressed_texture_formats( | 172 util_.set_num_compressed_texture_formats( |
180 static_state_.int_state.num_compressed_texture_formats); | 173 capabilities_.num_compressed_texture_formats); |
181 util_.set_num_shader_binary_formats( | 174 util_.set_num_shader_binary_formats(capabilities_.num_shader_binary_formats); |
182 static_state_.int_state.num_shader_binary_formats); | |
183 | 175 |
184 texture_units_.reset( | 176 texture_units_.reset( |
185 new TextureUnit[ | 177 new TextureUnit[capabilities_.max_combined_texture_image_units]); |
186 static_state_.int_state.max_combined_texture_image_units]); | |
187 | 178 |
188 query_tracker_.reset(new QueryTracker(mapped_memory_.get())); | 179 query_tracker_.reset(new QueryTracker(mapped_memory_.get())); |
189 buffer_tracker_.reset(new BufferTracker(mapped_memory_.get())); | 180 buffer_tracker_.reset(new BufferTracker(mapped_memory_.get())); |
190 | 181 |
191 query_id_allocator_.reset(new IdAllocator()); | 182 query_id_allocator_.reset(new IdAllocator()); |
192 if (support_client_side_arrays_) { | 183 if (support_client_side_arrays_) { |
193 GetIdHandler(id_namespaces::kBuffers)->MakeIds( | 184 GetIdHandler(id_namespaces::kBuffers)->MakeIds( |
194 this, kClientSideArrayId, arraysize(reserved_ids_), &reserved_ids_[0]); | 185 this, kClientSideArrayId, arraysize(reserved_ids_), &reserved_ids_[0]); |
195 } | 186 } |
196 | 187 |
197 vertex_array_object_manager_.reset(new VertexArrayObjectManager( | 188 vertex_array_object_manager_.reset(new VertexArrayObjectManager( |
198 static_state_.int_state.max_vertex_attribs, | 189 capabilities_.max_vertex_attribs, reserved_ids_[0], reserved_ids_[1], |
199 reserved_ids_[0], | |
200 reserved_ids_[1], | |
201 support_client_side_arrays_)); | 190 support_client_side_arrays_)); |
202 | 191 |
203 // GL_BIND_GENERATES_RESOURCE_CHROMIUM state must be the same | 192 // GL_BIND_GENERATES_RESOURCE_CHROMIUM state must be the same |
204 // on Client & Service. | 193 // on Client & Service. |
205 if (static_state_.int_state.bind_generates_resource_chromium != | 194 if (capabilities_.bind_generates_resource_chromium != |
206 (share_group_->bind_generates_resource() ? 1 : 0)) { | 195 (share_group_->bind_generates_resource() ? 1 : 0)) { |
207 SetGLError(GL_INVALID_OPERATION, | 196 SetGLError(GL_INVALID_OPERATION, |
208 "Initialize", | 197 "Initialize", |
209 "Service bind_generates_resource mismatch."); | 198 "Service bind_generates_resource mismatch."); |
210 return false; | 199 return false; |
211 } | 200 } |
212 | 201 |
213 return true; | 202 return true; |
214 } | 203 } |
215 | 204 |
216 bool GLES2Implementation::QueryAndCacheStaticState() { | |
217 TRACE_EVENT0("gpu", "GLES2Implementation::QueryAndCacheStaticState"); | |
218 // Setup query for multiple GetIntegerv's | |
219 static const GLenum pnames[] = { | |
220 GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, | |
221 GL_MAX_CUBE_MAP_TEXTURE_SIZE, | |
222 GL_MAX_FRAGMENT_UNIFORM_VECTORS, | |
223 GL_MAX_RENDERBUFFER_SIZE, | |
224 GL_MAX_TEXTURE_IMAGE_UNITS, | |
225 GL_MAX_TEXTURE_SIZE, | |
226 GL_MAX_VARYING_VECTORS, | |
227 GL_MAX_VERTEX_ATTRIBS, | |
228 GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, | |
229 GL_MAX_VERTEX_UNIFORM_VECTORS, | |
230 GL_NUM_COMPRESSED_TEXTURE_FORMATS, | |
231 GL_NUM_SHADER_BINARY_FORMATS, | |
232 GL_BIND_GENERATES_RESOURCE_CHROMIUM, | |
233 }; | |
234 | |
235 GetMultipleIntegervState integerv_state( | |
236 pnames, arraysize(pnames), | |
237 &static_state_.int_state.max_combined_texture_image_units, | |
238 sizeof(static_state_.int_state)); | |
239 if (!GetMultipleIntegervSetup(&integerv_state)) { | |
240 return false; | |
241 } | |
242 | |
243 // Setup query for multiple GetShaderPrecisionFormat's | |
244 static const GLenum precision_params[][2] = { | |
245 { GL_VERTEX_SHADER, GL_LOW_INT }, | |
246 { GL_VERTEX_SHADER, GL_MEDIUM_INT }, | |
247 { GL_VERTEX_SHADER, GL_HIGH_INT }, | |
248 { GL_VERTEX_SHADER, GL_LOW_FLOAT }, | |
249 { GL_VERTEX_SHADER, GL_MEDIUM_FLOAT }, | |
250 { GL_VERTEX_SHADER, GL_HIGH_FLOAT }, | |
251 { GL_FRAGMENT_SHADER, GL_LOW_INT }, | |
252 { GL_FRAGMENT_SHADER, GL_MEDIUM_INT }, | |
253 { GL_FRAGMENT_SHADER, GL_HIGH_INT }, | |
254 { GL_FRAGMENT_SHADER, GL_LOW_FLOAT }, | |
255 { GL_FRAGMENT_SHADER, GL_MEDIUM_FLOAT }, | |
256 { GL_FRAGMENT_SHADER, GL_HIGH_FLOAT }, | |
257 }; | |
258 | |
259 GetAllShaderPrecisionFormatsState precision_state( | |
260 precision_params, arraysize(precision_params)); | |
261 GetAllShaderPrecisionFormatsSetup(&precision_state); | |
262 | |
263 // Allocate and partition transfer buffer for all requests | |
264 void* buffer = transfer_buffer_->Alloc( | |
265 integerv_state.transfer_buffer_size_needed + | |
266 precision_state.transfer_buffer_size_needed); | |
267 if (!buffer) { | |
268 SetGLError(GL_OUT_OF_MEMORY, "QueryAndCacheStaticState", | |
269 "Transfer buffer allocation failed."); | |
270 return false; | |
271 } | |
272 integerv_state.buffer = buffer; | |
273 precision_state.results_buffer = | |
274 static_cast<char*>(buffer) + integerv_state.transfer_buffer_size_needed; | |
275 | |
276 // Make all the requests and wait once for all the results. | |
277 GetMultipleIntegervRequest(&integerv_state); | |
278 GetAllShaderPrecisionFormatsRequest(&precision_state); | |
279 WaitForCmd(); | |
280 GetMultipleIntegervOnCompleted(&integerv_state); | |
281 GetAllShaderPrecisionFormatsOnCompleted(&precision_state); | |
282 | |
283 // TODO(gman): We should be able to free without a token. | |
284 transfer_buffer_->FreePendingToken(buffer, helper_->InsertToken()); | |
285 CheckGLError(); | |
286 | |
287 return true; | |
288 } | |
289 | |
290 GLES2Implementation::~GLES2Implementation() { | 205 GLES2Implementation::~GLES2Implementation() { |
291 // Make sure the queries are finished otherwise we'll delete the | 206 // Make sure the queries are finished otherwise we'll delete the |
292 // shared memory (mapped_memory_) which will free the memory used | 207 // shared memory (mapped_memory_) which will free the memory used |
293 // by the queries. The GPU process when validating that memory is still | 208 // by the queries. The GPU process when validating that memory is still |
294 // shared will fail and abort (ie, it will stop running). | 209 // shared will fail and abort (ie, it will stop running). |
295 WaitForCmd(); | 210 WaitForCmd(); |
296 query_tracker_.reset(); | 211 query_tracker_.reset(); |
297 | 212 |
298 if (support_client_side_arrays_) | 213 if (support_client_side_arrays_) |
299 DeleteBuffers(arraysize(reserved_ids_), &reserved_ids_[0]); | 214 DeleteBuffers(arraysize(reserved_ids_), &reserved_ids_[0]); |
(...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
676 } | 591 } |
677 | 592 |
678 GPU_CLIENT_LOG("returned " << state); | 593 GPU_CLIENT_LOG("returned " << state); |
679 CheckGLError(); | 594 CheckGLError(); |
680 return state; | 595 return state; |
681 } | 596 } |
682 | 597 |
683 bool GLES2Implementation::GetHelper(GLenum pname, GLint* params) { | 598 bool GLES2Implementation::GetHelper(GLenum pname, GLint* params) { |
684 switch (pname) { | 599 switch (pname) { |
685 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: | 600 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: |
686 *params = static_state_.int_state.max_combined_texture_image_units; | 601 *params = capabilities_.max_combined_texture_image_units; |
687 return true; | 602 return true; |
688 case GL_MAX_CUBE_MAP_TEXTURE_SIZE: | 603 case GL_MAX_CUBE_MAP_TEXTURE_SIZE: |
689 *params = static_state_.int_state.max_cube_map_texture_size; | 604 *params = capabilities_.max_cube_map_texture_size; |
690 return true; | 605 return true; |
691 case GL_MAX_FRAGMENT_UNIFORM_VECTORS: | 606 case GL_MAX_FRAGMENT_UNIFORM_VECTORS: |
692 *params = static_state_.int_state.max_fragment_uniform_vectors; | 607 *params = capabilities_.max_fragment_uniform_vectors; |
693 return true; | 608 return true; |
694 case GL_MAX_RENDERBUFFER_SIZE: | 609 case GL_MAX_RENDERBUFFER_SIZE: |
695 *params = static_state_.int_state.max_renderbuffer_size; | 610 *params = capabilities_.max_renderbuffer_size; |
696 return true; | 611 return true; |
697 case GL_MAX_TEXTURE_IMAGE_UNITS: | 612 case GL_MAX_TEXTURE_IMAGE_UNITS: |
698 *params = static_state_.int_state.max_texture_image_units; | 613 *params = capabilities_.max_texture_image_units; |
699 return true; | 614 return true; |
700 case GL_MAX_TEXTURE_SIZE: | 615 case GL_MAX_TEXTURE_SIZE: |
701 *params = static_state_.int_state.max_texture_size; | 616 *params = capabilities_.max_texture_size; |
702 return true; | 617 return true; |
703 case GL_MAX_VARYING_VECTORS: | 618 case GL_MAX_VARYING_VECTORS: |
704 *params = static_state_.int_state.max_varying_vectors; | 619 *params = capabilities_.max_varying_vectors; |
705 return true; | 620 return true; |
706 case GL_MAX_VERTEX_ATTRIBS: | 621 case GL_MAX_VERTEX_ATTRIBS: |
707 *params = static_state_.int_state.max_vertex_attribs; | 622 *params = capabilities_.max_vertex_attribs; |
708 return true; | 623 return true; |
709 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: | 624 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: |
710 *params = static_state_.int_state.max_vertex_texture_image_units; | 625 *params = capabilities_.max_vertex_texture_image_units; |
711 return true; | 626 return true; |
712 case GL_MAX_VERTEX_UNIFORM_VECTORS: | 627 case GL_MAX_VERTEX_UNIFORM_VECTORS: |
713 *params = static_state_.int_state.max_vertex_uniform_vectors; | 628 *params = capabilities_.max_vertex_uniform_vectors; |
714 return true; | 629 return true; |
715 case GL_NUM_COMPRESSED_TEXTURE_FORMATS: | 630 case GL_NUM_COMPRESSED_TEXTURE_FORMATS: |
716 *params = static_state_.int_state.num_compressed_texture_formats; | 631 *params = capabilities_.num_compressed_texture_formats; |
717 return true; | 632 return true; |
718 case GL_NUM_SHADER_BINARY_FORMATS: | 633 case GL_NUM_SHADER_BINARY_FORMATS: |
719 *params = static_state_.int_state.num_shader_binary_formats; | 634 *params = capabilities_.num_shader_binary_formats; |
720 return true; | 635 return true; |
721 case GL_ARRAY_BUFFER_BINDING: | 636 case GL_ARRAY_BUFFER_BINDING: |
722 if (share_group_->bind_generates_resource()) { | 637 if (share_group_->bind_generates_resource()) { |
723 *params = bound_array_buffer_id_; | 638 *params = bound_array_buffer_id_; |
724 return true; | 639 return true; |
725 } | 640 } |
726 return false; | 641 return false; |
727 case GL_ELEMENT_ARRAY_BUFFER_BINDING: | 642 case GL_ELEMENT_ARRAY_BUFFER_BINDING: |
728 if (share_group_->bind_generates_resource()) { | 643 if (share_group_->bind_generates_resource()) { |
729 *params = | 644 *params = |
(...skipping 1590 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2320 height -= num_rows; | 2235 height -= num_rows; |
2321 } | 2236 } |
2322 CheckGLError(); | 2237 CheckGLError(); |
2323 } | 2238 } |
2324 | 2239 |
2325 void GLES2Implementation::ActiveTexture(GLenum texture) { | 2240 void GLES2Implementation::ActiveTexture(GLenum texture) { |
2326 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 2241 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
2327 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glActiveTexture(" | 2242 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glActiveTexture(" |
2328 << GLES2Util::GetStringEnum(texture) << ")"); | 2243 << GLES2Util::GetStringEnum(texture) << ")"); |
2329 GLuint texture_index = texture - GL_TEXTURE0; | 2244 GLuint texture_index = texture - GL_TEXTURE0; |
2330 if (texture_index >= static_cast<GLuint>( | 2245 if (texture_index >= |
2331 static_state_.int_state.max_combined_texture_image_units)) { | 2246 static_cast<GLuint>(capabilities_.max_combined_texture_image_units)) { |
2332 SetGLErrorInvalidEnum( | 2247 SetGLErrorInvalidEnum( |
2333 "glActiveTexture", texture, "texture"); | 2248 "glActiveTexture", texture, "texture"); |
2334 return; | 2249 return; |
2335 } | 2250 } |
2336 | 2251 |
2337 active_texture_unit_ = texture_index; | 2252 active_texture_unit_ = texture_index; |
2338 helper_->ActiveTexture(texture); | 2253 helper_->ActiveTexture(texture); |
2339 CheckGLError(); | 2254 CheckGLError(); |
2340 } | 2255 } |
2341 | 2256 |
(...skipping 15 matching lines...) Expand all Loading... |
2357 | 2272 |
2358 void GLES2Implementation::GenVertexArraysOESHelper( | 2273 void GLES2Implementation::GenVertexArraysOESHelper( |
2359 GLsizei n, const GLuint* arrays) { | 2274 GLsizei n, const GLuint* arrays) { |
2360 vertex_array_object_manager_->GenVertexArrays(n, arrays); | 2275 vertex_array_object_manager_->GenVertexArrays(n, arrays); |
2361 } | 2276 } |
2362 | 2277 |
2363 void GLES2Implementation::GenQueriesEXTHelper( | 2278 void GLES2Implementation::GenQueriesEXTHelper( |
2364 GLsizei /* n */, const GLuint* /* queries */) { | 2279 GLsizei /* n */, const GLuint* /* queries */) { |
2365 } | 2280 } |
2366 | 2281 |
| 2282 void GLES2Implementation::GenValuebuffersCHROMIUMHelper( |
| 2283 GLsizei /* n */, |
| 2284 const GLuint* /* valuebuffers */) { |
| 2285 } |
| 2286 |
2367 // NOTE #1: On old versions of OpenGL, calling glBindXXX with an unused id | 2287 // NOTE #1: On old versions of OpenGL, calling glBindXXX with an unused id |
2368 // generates a new resource. On newer versions of OpenGL they don't. The code | 2288 // generates a new resource. On newer versions of OpenGL they don't. The code |
2369 // related to binding below will need to change if we switch to the new OpenGL | 2289 // related to binding below will need to change if we switch to the new OpenGL |
2370 // model. Specifically it assumes a bind will succeed which is always true in | 2290 // model. Specifically it assumes a bind will succeed which is always true in |
2371 // the old model but possibly not true in the new model if another context has | 2291 // the old model but possibly not true in the new model if another context has |
2372 // deleted the resource. | 2292 // deleted the resource. |
2373 | 2293 |
2374 bool GLES2Implementation::BindBufferHelper( | 2294 bool GLES2Implementation::BindBufferHelper( |
2375 GLenum target, GLuint buffer_id) { | 2295 GLenum target, GLuint buffer_id) { |
2376 // TODO(gman): See note #1 above. | 2296 // TODO(gman): See note #1 above. |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2506 GL_INVALID_OPERATION, "glBindVertexArrayOES", | 2426 GL_INVALID_OPERATION, "glBindVertexArrayOES", |
2507 "id was not generated with glGenVertexArrayOES"); | 2427 "id was not generated with glGenVertexArrayOES"); |
2508 } | 2428 } |
2509 // Unlike other BindXXXHelpers we don't call MarkAsUsedForBind | 2429 // Unlike other BindXXXHelpers we don't call MarkAsUsedForBind |
2510 // because unlike other resources VertexArrayObject ids must | 2430 // because unlike other resources VertexArrayObject ids must |
2511 // be generated by GenVertexArrays. A random id to Bind will not | 2431 // be generated by GenVertexArrays. A random id to Bind will not |
2512 // generate a new object. | 2432 // generate a new object. |
2513 return changed; | 2433 return changed; |
2514 } | 2434 } |
2515 | 2435 |
| 2436 bool GLES2Implementation::BindValuebufferCHROMIUMHelper(GLenum target, |
| 2437 GLuint valuebuffer) { |
| 2438 bool changed = false; |
| 2439 switch (target) { |
| 2440 case GL_SUBSCRIBED_VALUES_BUFFER_CHROMIUM: |
| 2441 if (bound_valuebuffer_ != valuebuffer) { |
| 2442 bound_valuebuffer_ = valuebuffer; |
| 2443 changed = true; |
| 2444 } |
| 2445 break; |
| 2446 default: |
| 2447 changed = true; |
| 2448 break; |
| 2449 } |
| 2450 // TODO(gman): There's a bug here. If the target is invalid the ID will not be |
| 2451 // used even though it's marked it as used here. |
| 2452 GetIdHandler(id_namespaces::kValuebuffers)->MarkAsUsedForBind(valuebuffer); |
| 2453 return changed; |
| 2454 } |
| 2455 |
2516 bool GLES2Implementation::UseProgramHelper(GLuint program) { | 2456 bool GLES2Implementation::UseProgramHelper(GLuint program) { |
2517 bool changed = false; | 2457 bool changed = false; |
2518 if (current_program_ != program) { | 2458 if (current_program_ != program) { |
2519 current_program_ = program; | 2459 current_program_ = program; |
2520 changed = true; | 2460 changed = true; |
2521 } | 2461 } |
2522 return changed; | 2462 return changed; |
2523 } | 2463 } |
2524 | 2464 |
2525 bool GLES2Implementation::IsBufferReservedId(GLuint id) { | 2465 bool GLES2Implementation::IsBufferReservedId(GLuint id) { |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2605 void GLES2Implementation::DeleteTexturesHelper( | 2545 void GLES2Implementation::DeleteTexturesHelper( |
2606 GLsizei n, const GLuint* textures) { | 2546 GLsizei n, const GLuint* textures) { |
2607 if (!GetIdHandler(id_namespaces::kTextures)->FreeIds( | 2547 if (!GetIdHandler(id_namespaces::kTextures)->FreeIds( |
2608 this, n, textures, &GLES2Implementation::DeleteTexturesStub)) { | 2548 this, n, textures, &GLES2Implementation::DeleteTexturesStub)) { |
2609 SetGLError( | 2549 SetGLError( |
2610 GL_INVALID_VALUE, | 2550 GL_INVALID_VALUE, |
2611 "glDeleteTextures", "id not created by this context."); | 2551 "glDeleteTextures", "id not created by this context."); |
2612 return; | 2552 return; |
2613 } | 2553 } |
2614 for (GLsizei ii = 0; ii < n; ++ii) { | 2554 for (GLsizei ii = 0; ii < n; ++ii) { |
2615 for (GLint tt = 0; | 2555 for (GLint tt = 0; tt < capabilities_.max_combined_texture_image_units; |
2616 tt < static_state_.int_state.max_combined_texture_image_units; | |
2617 ++tt) { | 2556 ++tt) { |
2618 TextureUnit& unit = texture_units_[tt]; | 2557 TextureUnit& unit = texture_units_[tt]; |
2619 if (textures[ii] == unit.bound_texture_2d) { | 2558 if (textures[ii] == unit.bound_texture_2d) { |
2620 unit.bound_texture_2d = 0; | 2559 unit.bound_texture_2d = 0; |
2621 } | 2560 } |
2622 if (textures[ii] == unit.bound_texture_cube_map) { | 2561 if (textures[ii] == unit.bound_texture_cube_map) { |
2623 unit.bound_texture_cube_map = 0; | 2562 unit.bound_texture_cube_map = 0; |
2624 } | 2563 } |
2625 if (textures[ii] == unit.bound_texture_external_oes) { | 2564 if (textures[ii] == unit.bound_texture_external_oes) { |
2626 unit.bound_texture_external_oes = 0; | 2565 unit.bound_texture_external_oes = 0; |
2627 } | 2566 } |
2628 } | 2567 } |
2629 } | 2568 } |
2630 } | 2569 } |
2631 | 2570 |
| 2571 void GLES2Implementation::DeleteTexturesStub(GLsizei n, |
| 2572 const GLuint* textures) { |
| 2573 helper_->DeleteTexturesImmediate(n, textures); |
| 2574 } |
| 2575 |
2632 void GLES2Implementation::DeleteVertexArraysOESHelper( | 2576 void GLES2Implementation::DeleteVertexArraysOESHelper( |
2633 GLsizei n, const GLuint* arrays) { | 2577 GLsizei n, const GLuint* arrays) { |
2634 vertex_array_object_manager_->DeleteVertexArrays(n, arrays); | 2578 vertex_array_object_manager_->DeleteVertexArrays(n, arrays); |
2635 if (!GetIdHandler(id_namespaces::kVertexArrays)->FreeIds( | 2579 if (!GetIdHandler(id_namespaces::kVertexArrays)->FreeIds( |
2636 this, n, arrays, &GLES2Implementation::DeleteVertexArraysOESStub)) { | 2580 this, n, arrays, &GLES2Implementation::DeleteVertexArraysOESStub)) { |
2637 SetGLError( | 2581 SetGLError( |
2638 GL_INVALID_VALUE, | 2582 GL_INVALID_VALUE, |
2639 "glDeleteVertexArraysOES", "id not created by this context."); | 2583 "glDeleteVertexArraysOES", "id not created by this context."); |
2640 return; | 2584 return; |
2641 } | 2585 } |
2642 } | 2586 } |
2643 | 2587 |
2644 void GLES2Implementation::DeleteVertexArraysOESStub( | 2588 void GLES2Implementation::DeleteVertexArraysOESStub( |
2645 GLsizei n, const GLuint* arrays) { | 2589 GLsizei n, const GLuint* arrays) { |
2646 helper_->DeleteVertexArraysOESImmediate(n, arrays); | 2590 helper_->DeleteVertexArraysOESImmediate(n, arrays); |
2647 } | 2591 } |
2648 | 2592 |
2649 void GLES2Implementation::DeleteTexturesStub( | 2593 void GLES2Implementation::DeleteValuebuffersCHROMIUMHelper( |
2650 GLsizei n, const GLuint* textures) { | 2594 GLsizei n, |
2651 helper_->DeleteTexturesImmediate(n, textures); | 2595 const GLuint* valuebuffers) { |
| 2596 if (!GetIdHandler(id_namespaces::kValuebuffers) |
| 2597 ->FreeIds(this, n, valuebuffers, |
| 2598 &GLES2Implementation::DeleteValuebuffersCHROMIUMStub)) { |
| 2599 SetGLError(GL_INVALID_VALUE, "glDeleteValuebuffersCHROMIUM", |
| 2600 "id not created by this context."); |
| 2601 return; |
| 2602 } |
| 2603 for (GLsizei ii = 0; ii < n; ++ii) { |
| 2604 if (valuebuffers[ii] == bound_valuebuffer_) { |
| 2605 bound_valuebuffer_ = 0; |
| 2606 } |
| 2607 } |
| 2608 } |
| 2609 |
| 2610 void GLES2Implementation::DeleteValuebuffersCHROMIUMStub( |
| 2611 GLsizei n, |
| 2612 const GLuint* valuebuffers) { |
| 2613 helper_->DeleteValuebuffersCHROMIUMImmediate(n, valuebuffers); |
2652 } | 2614 } |
2653 | 2615 |
2654 void GLES2Implementation::DisableVertexAttribArray(GLuint index) { | 2616 void GLES2Implementation::DisableVertexAttribArray(GLuint index) { |
2655 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 2617 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
2656 GPU_CLIENT_LOG( | 2618 GPU_CLIENT_LOG( |
2657 "[" << GetLogPrefix() << "] glDisableVertexAttribArray(" << index << ")"); | 2619 "[" << GetLogPrefix() << "] glDisableVertexAttribArray(" << index << ")"); |
2658 vertex_array_object_manager_->SetAttribEnable(index, false); | 2620 vertex_array_object_manager_->SetAttribEnable(index, false); |
2659 helper_->DisableVertexAttribArray(index); | 2621 helper_->DisableVertexAttribArray(index); |
2660 CheckGLError(); | 2622 CheckGLError(); |
2661 } | 2623 } |
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3027 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 2989 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
3028 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glRateLimitOffscreenCHROMIUM()"); | 2990 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glRateLimitOffscreenCHROMIUM()"); |
3029 // Wait if this would add too many rate limit tokens. | 2991 // Wait if this would add too many rate limit tokens. |
3030 if (rate_limit_tokens_.size() == kMaxSwapBuffers) { | 2992 if (rate_limit_tokens_.size() == kMaxSwapBuffers) { |
3031 helper_->WaitForToken(rate_limit_tokens_.front()); | 2993 helper_->WaitForToken(rate_limit_tokens_.front()); |
3032 rate_limit_tokens_.pop(); | 2994 rate_limit_tokens_.pop(); |
3033 } | 2995 } |
3034 rate_limit_tokens_.push(helper_->InsertToken()); | 2996 rate_limit_tokens_.push(helper_->InsertToken()); |
3035 } | 2997 } |
3036 | 2998 |
3037 void GLES2Implementation::GetMultipleIntegervCHROMIUM( | |
3038 const GLenum* pnames, GLuint count, GLint* results, GLsizeiptr size) { | |
3039 GPU_CLIENT_SINGLE_THREAD_CHECK(); | |
3040 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetMultipleIntegervCHROMIUM(" | |
3041 << static_cast<const void*>(pnames) << ", " | |
3042 << count << ", " << results << ", " | |
3043 << size << ")"); | |
3044 GPU_CLIENT_LOG_CODE_BLOCK({ | |
3045 for (GLuint i = 0; i < count; ++i) { | |
3046 GPU_CLIENT_LOG( | |
3047 " " << i << ": " << GLES2Util::GetStringGLState(pnames[i])); | |
3048 } | |
3049 }); | |
3050 DCHECK(size >= 0 && FitInt32NonNegative<GLsizeiptr>(size)); | |
3051 | |
3052 GetMultipleIntegervState state(pnames, count, results, size); | |
3053 if (!GetMultipleIntegervSetup(&state)) { | |
3054 return; | |
3055 } | |
3056 state.buffer = transfer_buffer_->Alloc(state.transfer_buffer_size_needed); | |
3057 if (!state.buffer) { | |
3058 SetGLError(GL_OUT_OF_MEMORY, "glGetMultipleIntegervCHROMIUM", | |
3059 "Transfer buffer allocation failed."); | |
3060 return; | |
3061 } | |
3062 GetMultipleIntegervRequest(&state); | |
3063 WaitForCmd(); | |
3064 GetMultipleIntegervOnCompleted(&state); | |
3065 | |
3066 GPU_CLIENT_LOG(" returned"); | |
3067 GPU_CLIENT_LOG_CODE_BLOCK({ | |
3068 for (int i = 0; i < state.num_results; ++i) { | |
3069 GPU_CLIENT_LOG(" " << i << ": " << (results[i])); | |
3070 } | |
3071 }); | |
3072 | |
3073 // TODO(gman): We should be able to free without a token. | |
3074 transfer_buffer_->FreePendingToken(state.buffer, helper_->InsertToken()); | |
3075 CheckGLError(); | |
3076 } | |
3077 | |
3078 bool GLES2Implementation::GetMultipleIntegervSetup( | |
3079 GetMultipleIntegervState* state) { | |
3080 state->num_results = 0; | |
3081 for (GLuint ii = 0; ii < state->pnames_count; ++ii) { | |
3082 int num = util_.GLGetNumValuesReturned(state->pnames[ii]); | |
3083 if (!num) { | |
3084 SetGLErrorInvalidEnum( | |
3085 "glGetMultipleIntegervCHROMIUM", state->pnames[ii], "pname"); | |
3086 return false; | |
3087 } | |
3088 state->num_results += num; | |
3089 } | |
3090 if (static_cast<size_t>(state->results_size) != | |
3091 state->num_results * sizeof(GLint)) { | |
3092 SetGLError(GL_INVALID_VALUE, "glGetMultipleIntegervCHROMIUM", "bad size"); | |
3093 return false; | |
3094 } | |
3095 for (int ii = 0; ii < state->num_results; ++ii) { | |
3096 if (state->results[ii] != 0) { | |
3097 SetGLError(GL_INVALID_VALUE, | |
3098 "glGetMultipleIntegervCHROMIUM", "results not set to zero."); | |
3099 return false; | |
3100 } | |
3101 } | |
3102 state->transfer_buffer_size_needed = | |
3103 state->pnames_count * sizeof(state->pnames[0]) + | |
3104 state->num_results * sizeof(state->results[0]); | |
3105 return true; | |
3106 } | |
3107 | |
3108 void GLES2Implementation::GetMultipleIntegervRequest( | |
3109 GetMultipleIntegervState* state) { | |
3110 GLenum* pnames_buffer = static_cast<GLenum*>(state->buffer); | |
3111 state->results_buffer = pnames_buffer + state->pnames_count; | |
3112 memcpy(pnames_buffer, state->pnames, state->pnames_count * sizeof(GLenum)); | |
3113 memset(state->results_buffer, 0, state->num_results * sizeof(GLint)); | |
3114 helper_->GetMultipleIntegervCHROMIUM( | |
3115 transfer_buffer_->GetShmId(), | |
3116 transfer_buffer_->GetOffset(pnames_buffer), | |
3117 state->pnames_count, | |
3118 transfer_buffer_->GetShmId(), | |
3119 transfer_buffer_->GetOffset(state->results_buffer), | |
3120 state->results_size); | |
3121 } | |
3122 | |
3123 void GLES2Implementation::GetMultipleIntegervOnCompleted( | |
3124 GetMultipleIntegervState* state) { | |
3125 memcpy(state->results, state->results_buffer, state->results_size);; | |
3126 } | |
3127 | |
3128 void GLES2Implementation::GetAllShaderPrecisionFormatsSetup( | |
3129 GetAllShaderPrecisionFormatsState* state) { | |
3130 state->transfer_buffer_size_needed = | |
3131 state->precision_params_count * | |
3132 sizeof(cmds::GetShaderPrecisionFormat::Result); | |
3133 } | |
3134 | |
3135 void GLES2Implementation::GetAllShaderPrecisionFormatsRequest( | |
3136 GetAllShaderPrecisionFormatsState* state) { | |
3137 typedef cmds::GetShaderPrecisionFormat::Result Result; | |
3138 Result* result = static_cast<Result*>(state->results_buffer); | |
3139 | |
3140 for (int i = 0; i < state->precision_params_count; i++) { | |
3141 result->success = false; | |
3142 helper_->GetShaderPrecisionFormat(state->precision_params[i][0], | |
3143 state->precision_params[i][1], | |
3144 transfer_buffer_->GetShmId(), | |
3145 transfer_buffer_->GetOffset(result)); | |
3146 result++; | |
3147 } | |
3148 } | |
3149 | |
3150 void GLES2Implementation::GetAllShaderPrecisionFormatsOnCompleted( | |
3151 GetAllShaderPrecisionFormatsState* state) { | |
3152 typedef cmds::GetShaderPrecisionFormat::Result Result; | |
3153 Result* result = static_cast<Result*>(state->results_buffer); | |
3154 | |
3155 for (int i = 0; i < state->precision_params_count; i++) { | |
3156 if (result->success) { | |
3157 const GLStaticState::ShaderPrecisionKey key( | |
3158 state->precision_params[i][0], state->precision_params[i][1]); | |
3159 static_state_.shader_precisions[key] = *result; | |
3160 } | |
3161 result++; | |
3162 } | |
3163 } | |
3164 | |
3165 void GLES2Implementation::GetProgramInfoCHROMIUMHelper( | 2999 void GLES2Implementation::GetProgramInfoCHROMIUMHelper( |
3166 GLuint program, std::vector<int8>* result) { | 3000 GLuint program, std::vector<int8>* result) { |
3167 DCHECK(result); | 3001 DCHECK(result); |
3168 // Clear the bucket so if the command fails nothing will be in it. | 3002 // Clear the bucket so if the command fails nothing will be in it. |
3169 helper_->SetBucketSize(kResultBucketId, 0); | 3003 helper_->SetBucketSize(kResultBucketId, 0); |
3170 helper_->GetProgramInfoCHROMIUM(program, kResultBucketId); | 3004 helper_->GetProgramInfoCHROMIUM(program, kResultBucketId); |
3171 GetBucketContents(kResultBucketId, result); | 3005 GetBucketContents(kResultBucketId, result); |
3172 } | 3006 } |
3173 | 3007 |
3174 void GLES2Implementation::GetProgramInfoCHROMIUM( | 3008 void GLES2Implementation::GetProgramInfoCHROMIUM( |
(...skipping 893 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4068 return true; | 3902 return true; |
4069 } | 3903 } |
4070 | 3904 |
4071 // Include the auto-generated part of this file. We split this because it means | 3905 // Include the auto-generated part of this file. We split this because it means |
4072 // we can easily edit the non-auto generated parts right here in this file | 3906 // we can easily edit the non-auto generated parts right here in this file |
4073 // instead of having to edit some template or the code generator. | 3907 // instead of having to edit some template or the code generator. |
4074 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h" | 3908 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h" |
4075 | 3909 |
4076 } // namespace gles2 | 3910 } // namespace gles2 |
4077 } // namespace gpu | 3911 } // namespace gpu |
OLD | NEW |