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

Side by Side Diff: gpu/command_buffer/service/program_manager.h

Issue 2148723004: WebGL 2: make sure VertexAttrib type match the corresponding attrib type in shader (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: code clean Created 4 years, 5 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
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 #ifndef GPU_COMMAND_BUFFER_SERVICE_PROGRAM_MANAGER_H_ 5 #ifndef GPU_COMMAND_BUFFER_SERVICE_PROGRAM_MANAGER_H_
6 #define GPU_COMMAND_BUFFER_SERVICE_PROGRAM_MANAGER_H_ 6 #define GPU_COMMAND_BUFFER_SERVICE_PROGRAM_MANAGER_H_
7 7
8 #include <stddef.h> 8 #include <stddef.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 10
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after
396 396
397 // See member declaration for details. 397 // See member declaration for details.
398 // The data are only valid after a successful link. 398 // The data are only valid after a successful link.
399 uint32_t fragment_output_type_mask() const { 399 uint32_t fragment_output_type_mask() const {
400 return fragment_output_type_mask_; 400 return fragment_output_type_mask_;
401 } 401 }
402 uint32_t fragment_output_written_mask() const { 402 uint32_t fragment_output_written_mask() const {
403 return fragment_output_written_mask_; 403 return fragment_output_written_mask_;
404 } 404 }
405 405
406 // The data are only valid after a successful link.
407 // Return 16 attributes' base types, in which the attribute
408 // specified by argument 'loc' located.
409 uint32_t vertex_input_base_type_mask(GLuint loc) const {
410 DCHECK(loc < max_vertex_attribs_);
411 return vertex_input_base_type_mask_[loc / 16];
412 }
413 // Return 16 attributes' type written masks, in which the
414 // attribute specified by argument 'loc' located.
415 uint32_t vertex_input_type_written_mask(GLuint loc) const {
416 DCHECK(loc < max_vertex_attribs_);
417 return vertex_input_type_written_mask_[loc / 16];
418 }
419
406 // Update uniform block binding after a successful glUniformBlockBinding(). 420 // Update uniform block binding after a successful glUniformBlockBinding().
407 void SetUniformBlockBinding(GLuint index, GLuint binding); 421 void SetUniformBlockBinding(GLuint index, GLuint binding);
408 422
409 const std::vector<UniformBlockSizeInfo>& uniform_block_size_info() const { 423 const std::vector<UniformBlockSizeInfo>& uniform_block_size_info() const {
410 return uniform_block_size_info_; 424 return uniform_block_size_info_;
411 } 425 }
412 426
413 private: 427 private:
414 friend class base::RefCounted<Program>; 428 friend class base::RefCounted<Program>;
415 friend class ProgramManager; 429 friend class ProgramManager;
(...skipping 24 matching lines...) Expand all
440 454
441 // Resets the program. 455 // Resets the program.
442 void Reset(); 456 void Reset();
443 457
444 // Updates the program info after a successful link. 458 // Updates the program info after a successful link.
445 void Update(); 459 void Update();
446 void UpdateUniforms(); 460 void UpdateUniforms();
447 void UpdateFragmentInputs(); 461 void UpdateFragmentInputs();
448 void UpdateProgramOutputs(); 462 void UpdateProgramOutputs();
449 void UpdateFragmentOutputBaseTypes(); 463 void UpdateFragmentOutputBaseTypes();
464 void UpdateVertexInputBaseTypes();
450 void UpdateUniformBlockSizeInfo(); 465 void UpdateUniformBlockSizeInfo();
451 466
452 // Process the program log, replacing the hashed names with original names. 467 // Process the program log, replacing the hashed names with original names.
453 std::string ProcessLogInfo(const std::string& log); 468 std::string ProcessLogInfo(const std::string& log);
454 469
455 // Updates the program log info from GL 470 // Updates the program log info from GL
456 void UpdateLogInfo(); 471 void UpdateLogInfo();
457 472
458 // Clears all the uniforms. 473 // Clears all the uniforms.
459 void ClearUniforms(std::vector<uint8_t>* zero_buffer); 474 void ClearUniforms(std::vector<uint8_t>* zero_buffer);
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 // entry is the info about UniformBlock with index 0, etc. 573 // entry is the info about UniformBlock with index 0, etc.
559 std::vector<UniformBlockSizeInfo> uniform_block_size_info_; 574 std::vector<UniformBlockSizeInfo> uniform_block_size_info_;
560 575
561 // Fragment output variable base types: FLOAT, INT, or UINT. 576 // Fragment output variable base types: FLOAT, INT, or UINT.
562 // We have up to 16 outputs, each is encoded into 2 bits, total 32 bits: 577 // We have up to 16 outputs, each is encoded into 2 bits, total 32 bits:
563 // the lowest 2 bits for location 0, the highest 2 bits for location 15. 578 // the lowest 2 bits for location 0, the highest 2 bits for location 15.
564 uint32_t fragment_output_type_mask_; 579 uint32_t fragment_output_type_mask_;
565 // Same layout as above, 2 bits per location, 0x03 if a location is occupied 580 // Same layout as above, 2 bits per location, 0x03 if a location is occupied
566 // by an output variable, 0x00 if not. 581 // by an output variable, 0x00 if not.
567 uint32_t fragment_output_written_mask_; 582 uint32_t fragment_output_written_mask_;
583
584 uint32_t max_vertex_attribs_;
585 // Vertex input attrib base types: FLOAT, INT, or UINT.
586 // Each base type is encoded into 2 bits, the lowest 2 bits for location 0,
587 // the highest 2 bits for location (max_vertex_attribs_ - 1).
588 std::vector<uint32_t> vertex_input_base_type_mask_;
589 // Same layout as above, 2 bits per location, 0x03 if a location is set
590 // by vertexAttrib API, 0x00 if not.
591 std::vector<uint32_t> vertex_input_type_written_mask_;
568 }; 592 };
569 593
570 // Tracks the Programs. 594 // Tracks the Programs.
571 // 595 //
572 // NOTE: To support shared resources an instance of this class will 596 // NOTE: To support shared resources an instance of this class will
573 // need to be shared by multiple GLES2Decoders. 597 // need to be shared by multiple GLES2Decoders.
574 class GPU_EXPORT ProgramManager { 598 class GPU_EXPORT ProgramManager {
575 public: 599 public:
576 ProgramManager(ProgramCache* program_cache, 600 ProgramManager(ProgramCache* program_cache,
577 uint32_t max_varying_vectors, 601 uint32_t max_varying_vectors,
578 uint32_t max_draw_buffers, 602 uint32_t max_draw_buffers,
579 uint32_t max_dual_source_draw_buffers, 603 uint32_t max_dual_source_draw_buffers,
604 uint32_t max_vertex_attribs,
580 const GpuPreferences& gpu_preferences, 605 const GpuPreferences& gpu_preferences,
581 FeatureInfo* feature_info); 606 FeatureInfo* feature_info);
582 ~ProgramManager(); 607 ~ProgramManager();
583 608
584 // Must call before destruction. 609 // Must call before destruction.
585 void Destroy(bool have_context); 610 void Destroy(bool have_context);
586 611
587 // Creates a new program. 612 // Creates a new program.
588 Program* CreateProgram(GLuint client_id, GLuint service_id); 613 Program* CreateProgram(GLuint client_id, GLuint service_id);
589 614
(...skipping 28 matching lines...) Expand all
618 static int32_t MakeFakeLocation(int32_t index, int32_t element); 643 static int32_t MakeFakeLocation(int32_t index, int32_t element);
619 644
620 uint32_t max_varying_vectors() const { return max_varying_vectors_; } 645 uint32_t max_varying_vectors() const { return max_varying_vectors_; }
621 646
622 uint32_t max_draw_buffers() const { return max_draw_buffers_; } 647 uint32_t max_draw_buffers() const { return max_draw_buffers_; }
623 648
624 uint32_t max_dual_source_draw_buffers() const { 649 uint32_t max_dual_source_draw_buffers() const {
625 return max_dual_source_draw_buffers_; 650 return max_dual_source_draw_buffers_;
626 } 651 }
627 652
653 uint32_t max_vertex_attribs() const { return max_vertex_attribs_; }
654
628 private: 655 private:
629 friend class Program; 656 friend class Program;
630 657
631 void StartTracking(Program* program); 658 void StartTracking(Program* program);
632 void StopTracking(Program* program); 659 void StopTracking(Program* program);
633 660
634 void RemoveProgramInfoIfUnused( 661 void RemoveProgramInfoIfUnused(
635 ShaderManager* shader_manager, Program* program); 662 ShaderManager* shader_manager, Program* program);
636 663
637 // Info for each "successfully linked" program by service side program Id. 664 // Info for each "successfully linked" program by service side program Id.
638 // TODO(gman): Choose a faster container. 665 // TODO(gman): Choose a faster container.
639 typedef std::map<GLuint, scoped_refptr<Program> > ProgramMap; 666 typedef std::map<GLuint, scoped_refptr<Program> > ProgramMap;
640 ProgramMap programs_; 667 ProgramMap programs_;
641 668
642 // Counts the number of Program allocated with 'this' as its manager. 669 // Counts the number of Program allocated with 'this' as its manager.
643 // Allows to check no Program will outlive this. 670 // Allows to check no Program will outlive this.
644 unsigned int program_count_; 671 unsigned int program_count_;
645 672
646 bool have_context_; 673 bool have_context_;
647 674
648 // Used to clear uniforms. 675 // Used to clear uniforms.
649 std::vector<uint8_t> zero_; 676 std::vector<uint8_t> zero_;
650 677
651 ProgramCache* program_cache_; 678 ProgramCache* program_cache_;
652 679
653 uint32_t max_varying_vectors_; 680 uint32_t max_varying_vectors_;
654 uint32_t max_draw_buffers_; 681 uint32_t max_draw_buffers_;
655 uint32_t max_dual_source_draw_buffers_; 682 uint32_t max_dual_source_draw_buffers_;
683 uint32_t max_vertex_attribs_;
656 684
657 const GpuPreferences& gpu_preferences_; 685 const GpuPreferences& gpu_preferences_;
658 scoped_refptr<FeatureInfo> feature_info_; 686 scoped_refptr<FeatureInfo> feature_info_;
659 687
660 DISALLOW_COPY_AND_ASSIGN(ProgramManager); 688 DISALLOW_COPY_AND_ASSIGN(ProgramManager);
661 }; 689 };
662 690
663 inline const FeatureInfo& Program::feature_info() const { 691 inline const FeatureInfo& Program::feature_info() const {
664 return *manager_->feature_info_.get(); 692 return *manager_->feature_info_.get();
665 } 693 }
666 694
667 } // namespace gles2 695 } // namespace gles2
668 } // namespace gpu 696 } // namespace gpu
669 697
670 #endif // GPU_COMMAND_BUFFER_SERVICE_PROGRAM_MANAGER_H_ 698 #endif // GPU_COMMAND_BUFFER_SERVICE_PROGRAM_MANAGER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698