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 #include "gpu/command_buffer/client/vertex_array_object_manager.h" | 5 #include "gpu/command_buffer/client/vertex_array_object_manager.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "gpu/command_buffer/client/gles2_cmd_helper.h" | 8 #include "gpu/command_buffer/client/gles2_cmd_helper.h" |
9 #include "gpu/command_buffer/client/gles2_implementation.h" | 9 #include "gpu/command_buffer/client/gles2_implementation.h" |
10 | 10 |
11 #if defined(__native_client__) && !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | |
12 #define GLES2_SUPPORT_CLIENT_SIDE_ARRAYS | |
13 #endif | |
14 | |
15 namespace gpu { | 11 namespace gpu { |
16 namespace gles2 { | 12 namespace gles2 { |
17 | 13 |
18 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | |
19 | |
20 static GLsizei RoundUpToMultipleOf4(GLsizei size) { | 14 static GLsizei RoundUpToMultipleOf4(GLsizei size) { |
21 return (size + 3) & ~3; | 15 return (size + 3) & ~3; |
22 } | 16 } |
23 | 17 |
24 #endif // defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | |
25 | |
26 // A 32-bit and 64-bit compatible way of converting a pointer to a GLuint. | 18 // A 32-bit and 64-bit compatible way of converting a pointer to a GLuint. |
27 static GLuint ToGLuint(const void* ptr) { | 19 static GLuint ToGLuint(const void* ptr) { |
28 return static_cast<GLuint>(reinterpret_cast<size_t>(ptr)); | 20 return static_cast<GLuint>(reinterpret_cast<size_t>(ptr)); |
29 } | 21 } |
30 | 22 |
31 // This class tracks VertexAttribPointers and helps emulate client side buffers. | 23 // This class tracks VertexAttribPointers and helps emulate client side buffers. |
32 // | 24 // |
33 // The way client side buffers work is we shadow all the Vertex Attribs so we | 25 // The way client side buffers work is we shadow all the Vertex Attribs so we |
34 // know which ones are pointing to client side buffers. | 26 // know which ones are pointing to client side buffers. |
35 // | 27 // |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 if (index < vertex_attribs_.size()) { | 314 if (index < vertex_attribs_.size()) { |
323 const VertexAttrib* attrib = &vertex_attribs_[index]; | 315 const VertexAttrib* attrib = &vertex_attribs_[index]; |
324 return attrib; | 316 return attrib; |
325 } | 317 } |
326 return NULL; | 318 return NULL; |
327 } | 319 } |
328 | 320 |
329 VertexArrayObjectManager::VertexArrayObjectManager( | 321 VertexArrayObjectManager::VertexArrayObjectManager( |
330 GLuint max_vertex_attribs, | 322 GLuint max_vertex_attribs, |
331 GLuint array_buffer_id, | 323 GLuint array_buffer_id, |
332 GLuint element_array_buffer_id) | 324 GLuint element_array_buffer_id, |
| 325 bool support_client_side_arrays) |
333 : max_vertex_attribs_(max_vertex_attribs), | 326 : max_vertex_attribs_(max_vertex_attribs), |
334 array_buffer_id_(array_buffer_id), | 327 array_buffer_id_(array_buffer_id), |
335 array_buffer_size_(0), | 328 array_buffer_size_(0), |
336 array_buffer_offset_(0), | 329 array_buffer_offset_(0), |
337 element_array_buffer_id_(element_array_buffer_id), | 330 element_array_buffer_id_(element_array_buffer_id), |
338 element_array_buffer_size_(0), | 331 element_array_buffer_size_(0), |
339 collection_buffer_size_(0), | 332 collection_buffer_size_(0), |
340 default_vertex_array_object_(new VertexArrayObject(max_vertex_attribs)), | 333 default_vertex_array_object_(new VertexArrayObject(max_vertex_attribs)), |
341 bound_vertex_array_object_(default_vertex_array_object_) { | 334 bound_vertex_array_object_(default_vertex_array_object_), |
| 335 support_client_side_arrays_(support_client_side_arrays) { |
342 } | 336 } |
343 | 337 |
344 VertexArrayObjectManager::~VertexArrayObjectManager() { | 338 VertexArrayObjectManager::~VertexArrayObjectManager() { |
345 for (VertexArrayObjectMap::iterator it = vertex_array_objects_.begin(); | 339 for (VertexArrayObjectMap::iterator it = vertex_array_objects_.begin(); |
346 it != vertex_array_objects_.end(); ++it) { | 340 it != vertex_array_objects_.end(); ++it) { |
347 delete it->second; | 341 delete it->second; |
348 } | 342 } |
349 delete default_vertex_array_object_; | 343 delete default_vertex_array_object_; |
350 } | 344 } |
351 | 345 |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
476 | 470 |
477 // Returns true if buffers were setup. | 471 // Returns true if buffers were setup. |
478 bool VertexArrayObjectManager::SetupSimulatedClientSideBuffers( | 472 bool VertexArrayObjectManager::SetupSimulatedClientSideBuffers( |
479 const char* function_name, | 473 const char* function_name, |
480 GLES2Implementation* gl, | 474 GLES2Implementation* gl, |
481 GLES2CmdHelper* gl_helper, | 475 GLES2CmdHelper* gl_helper, |
482 GLsizei num_elements, | 476 GLsizei num_elements, |
483 GLsizei primcount, | 477 GLsizei primcount, |
484 bool* simulated) { | 478 bool* simulated) { |
485 *simulated = false; | 479 *simulated = false; |
486 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | 480 if (!support_client_side_arrays_) |
| 481 return true; |
487 if (!bound_vertex_array_object_->HaveEnabledClientSideBuffers()) { | 482 if (!bound_vertex_array_object_->HaveEnabledClientSideBuffers()) { |
488 return true; | 483 return true; |
489 } | 484 } |
490 if (!IsDefaultVAOBound()) { | 485 if (!IsDefaultVAOBound()) { |
491 gl->SetGLError( | 486 gl->SetGLError( |
492 GL_INVALID_OPERATION, function_name, | 487 GL_INVALID_OPERATION, function_name, |
493 "client side arrays not allowed with vertex array object"); | 488 "client side arrays not allowed with vertex array object"); |
494 return false; | 489 return false; |
495 } | 490 } |
496 *simulated = true; | 491 *simulated = true; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
530 gl->BufferSubDataHelper( | 525 gl->BufferSubDataHelper( |
531 GL_ARRAY_BUFFER, array_buffer_offset_, bytes_collected, | 526 GL_ARRAY_BUFFER, array_buffer_offset_, bytes_collected, |
532 collection_buffer_.get()); | 527 collection_buffer_.get()); |
533 gl_helper->VertexAttribPointer( | 528 gl_helper->VertexAttribPointer( |
534 ii, attrib.size(), attrib.type(), attrib.normalized(), 0, | 529 ii, attrib.size(), attrib.type(), attrib.normalized(), 0, |
535 array_buffer_offset_); | 530 array_buffer_offset_); |
536 array_buffer_offset_ += RoundUpToMultipleOf4(bytes_collected); | 531 array_buffer_offset_ += RoundUpToMultipleOf4(bytes_collected); |
537 DCHECK_LE(array_buffer_offset_, array_buffer_size_); | 532 DCHECK_LE(array_buffer_offset_, array_buffer_size_); |
538 } | 533 } |
539 } | 534 } |
540 #endif // defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | |
541 return true; | 535 return true; |
542 } | 536 } |
543 | 537 |
544 // Copies in indices to the service and returns the highest index accessed + 1 | 538 // Copies in indices to the service and returns the highest index accessed + 1 |
545 bool VertexArrayObjectManager::SetupSimulatedIndexAndClientSideBuffers( | 539 bool VertexArrayObjectManager::SetupSimulatedIndexAndClientSideBuffers( |
546 const char* function_name, | 540 const char* function_name, |
547 GLES2Implementation* gl, | 541 GLES2Implementation* gl, |
548 GLES2CmdHelper* gl_helper, | 542 GLES2CmdHelper* gl_helper, |
549 GLsizei count, | 543 GLsizei count, |
550 GLenum type, | 544 GLenum type, |
551 GLsizei primcount, | 545 GLsizei primcount, |
552 const void* indices, | 546 const void* indices, |
553 GLuint* offset, | 547 GLuint* offset, |
554 bool* simulated) { | 548 bool* simulated) { |
555 *simulated = false; | 549 *simulated = false; |
556 *offset = ToGLuint(indices); | 550 *offset = ToGLuint(indices); |
557 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | 551 if (!support_client_side_arrays_) |
| 552 return true; |
558 GLsizei num_elements = 0; | 553 GLsizei num_elements = 0; |
559 if (bound_vertex_array_object_->bound_element_array_buffer() == 0) { | 554 if (bound_vertex_array_object_->bound_element_array_buffer() == 0) { |
560 *simulated = true; | 555 *simulated = true; |
561 *offset = 0; | 556 *offset = 0; |
562 GLsizei max_index = -1; | 557 GLsizei max_index = -1; |
563 switch (type) { | 558 switch (type) { |
564 case GL_UNSIGNED_BYTE: { | 559 case GL_UNSIGNED_BYTE: { |
565 const uint8* src = static_cast<const uint8*>(indices); | 560 const uint8* src = static_cast<const uint8*>(indices); |
566 for (GLsizei ii = 0; ii < count; ++ii) { | 561 for (GLsizei ii = 0; ii < count; ++ii) { |
567 if (src[ii] > max_index) { | 562 if (src[ii] > max_index) { |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
623 num_elements = gl->GetMaxValueInBufferCHROMIUMHelper( | 618 num_elements = gl->GetMaxValueInBufferCHROMIUMHelper( |
624 bound_vertex_array_object_->bound_element_array_buffer(), | 619 bound_vertex_array_object_->bound_element_array_buffer(), |
625 count, type, ToGLuint(indices)) + 1; | 620 count, type, ToGLuint(indices)) + 1; |
626 } | 621 } |
627 | 622 |
628 bool simulated_client_side_buffers = false; | 623 bool simulated_client_side_buffers = false; |
629 SetupSimulatedClientSideBuffers( | 624 SetupSimulatedClientSideBuffers( |
630 function_name, gl, gl_helper, num_elements, primcount, | 625 function_name, gl, gl_helper, num_elements, primcount, |
631 &simulated_client_side_buffers); | 626 &simulated_client_side_buffers); |
632 *simulated = *simulated || simulated_client_side_buffers; | 627 *simulated = *simulated || simulated_client_side_buffers; |
633 #endif // defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | |
634 return true; | 628 return true; |
635 } | 629 } |
636 | 630 |
637 } // namespace gles2 | 631 } // namespace gles2 |
638 } // namespace gpu | 632 } // namespace gpu |
639 | 633 |
640 | 634 |
OLD | NEW |