| 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 #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 <map> | 8 #include <map> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| 11 #include "base/basictypes.h" | 11 #include "base/basictypes.h" |
| 12 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "base/memory/ref_counted.h" | 13 #include "base/memory/ref_counted.h" |
| 14 #include "gpu/command_buffer/service/common_decoder.h" | 14 #include "gpu/command_buffer/service/common_decoder.h" |
| 15 #include "gpu/command_buffer/service/gl_utils.h" | 15 #include "gpu/command_buffer/service/gl_utils.h" |
| 16 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 16 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 17 #include "gpu/command_buffer/service/shader_manager.h" | 17 #include "gpu/command_buffer/service/shader_manager.h" |
| 18 #include "gpu/gpu_export.h" | 18 #include "gpu/gpu_export.h" |
| 19 | 19 |
| 20 namespace gpu { | 20 namespace gpu { |
| 21 namespace gles2 { | 21 namespace gles2 { |
| 22 | 22 |
| 23 class FeatureInfo; |
| 23 class ProgramCache; | 24 class ProgramCache; |
| 24 class ProgramManager; | 25 class ProgramManager; |
| 25 class Shader; | 26 class Shader; |
| 26 class ShaderManager; | 27 class ShaderManager; |
| 27 class FeatureInfo; | 28 class FeatureInfo; |
| 28 | 29 |
| 29 // This is used to track which attributes a particular program needs | 30 // This is used to track which attributes a particular program needs |
| 30 // so we can verify at glDrawXXX time that every attribute is either disabled | 31 // so we can verify at glDrawXXX time that every attribute is either disabled |
| 31 // or if enabled that it points to a valid source. | 32 // or if enabled that it points to a valid source. |
| 32 class GPU_EXPORT Program : public base::RefCounted<Program> { | 33 class GPU_EXPORT Program : public base::RefCounted<Program> { |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 | 177 |
| 177 // Gets all the TransformFeedbackVarying info. | 178 // Gets all the TransformFeedbackVarying info. |
| 178 // Return false on overflow. | 179 // Return false on overflow. |
| 179 bool GetTransformFeedbackVaryings(CommonDecoder::Bucket* bucket) const; | 180 bool GetTransformFeedbackVaryings(CommonDecoder::Bucket* bucket) const; |
| 180 | 181 |
| 181 // Gather all info through glGetActiveUniformsiv, except for size, type, | 182 // Gather all info through glGetActiveUniformsiv, except for size, type, |
| 182 // name_length, which we gather through glGetActiveUniform in | 183 // name_length, which we gather through glGetActiveUniform in |
| 183 // glGetProgramInfoCHROMIUM. | 184 // glGetProgramInfoCHROMIUM. |
| 184 bool GetUniformsES3(CommonDecoder::Bucket* bucket) const; | 185 bool GetUniformsES3(CommonDecoder::Bucket* bucket) const; |
| 185 | 186 |
| 187 // Returns the fragment shader output variable color name binding. |
| 188 // Returns -1 if |original_name| is not an out variable or error. |
| 189 GLint GetFragDataLocation(const std::string& original_name) const; |
| 190 |
| 191 // Returns the fragment shader output variable color index binding. |
| 192 // Returns -1 if |original_name| is not an out variable or error. |
| 193 GLint GetFragDataIndex(const std::string& original_name) const; |
| 194 |
| 186 // Sets the sampler values for a uniform. | 195 // Sets the sampler values for a uniform. |
| 187 // This is safe to call for any location. If the location is not | 196 // This is safe to call for any location. If the location is not |
| 188 // a sampler uniform nothing will happen. | 197 // a sampler uniform nothing will happen. |
| 189 // Returns false if fake_location is a sampler and any value | 198 // Returns false if fake_location is a sampler and any value |
| 190 // is >= num_texture_units. Returns true otherwise. | 199 // is >= num_texture_units. Returns true otherwise. |
| 191 bool SetSamplers( | 200 bool SetSamplers( |
| 192 GLint num_texture_units, GLint fake_location, | 201 GLint num_texture_units, GLint fake_location, |
| 193 GLsizei count, const GLint* value); | 202 GLsizei count, const GLint* value); |
| 194 | 203 |
| 195 bool IsDeleted() const { | 204 bool IsDeleted() const { |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 326 | 335 |
| 327 // Clears all the uniforms. | 336 // Clears all the uniforms. |
| 328 void ClearUniforms(std::vector<uint8>* zero_buffer); | 337 void ClearUniforms(std::vector<uint8>* zero_buffer); |
| 329 | 338 |
| 330 // If long attribate names are mapped during shader translation, call | 339 // If long attribate names are mapped during shader translation, call |
| 331 // glBindAttribLocation() again with the mapped names. | 340 // glBindAttribLocation() again with the mapped names. |
| 332 // This is called right before the glLink() call, but after shaders are | 341 // This is called right before the glLink() call, but after shaders are |
| 333 // translated. | 342 // translated. |
| 334 void ExecuteBindAttribLocationCalls(); | 343 void ExecuteBindAttribLocationCalls(); |
| 335 | 344 |
| 345 void ExecuteBindFragDataLocationIndexedCalls(); |
| 346 |
| 336 bool AddUniformInfo( | 347 bool AddUniformInfo( |
| 337 GLsizei size, GLenum type, GLint location, GLint fake_base_location, | 348 GLsizei size, GLenum type, GLint location, GLint fake_base_location, |
| 338 const std::string& name, const std::string& original_name, | 349 const std::string& name, const std::string& original_name, |
| 339 size_t* next_available_index); | 350 size_t* next_available_index); |
| 340 | 351 |
| 341 enum VariableInfoType { kUniformVariableInfo, kVaryingVariableInfo }; | 352 enum VariableInfoType { kUniformVariableInfo, kVaryingVariableInfo }; |
| 342 // Query uniform or varying data returned by ANGLE translator by the | 353 // Query uniform or varying data returned by ANGLE translator by the |
| 343 // mapped name. Some drivers incorrectly return an uniform name of | 354 // mapped name. Some drivers incorrectly return an uniform name of |
| 344 // size-1 array without "[0]". In this case, we correct the name by | 355 // size-1 array without "[0]". In this case, we correct the name by |
| 345 // appending "[0]" to it. | 356 // appending "[0]" to it. |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 439 }; | 450 }; |
| 440 | 451 |
| 441 // Tracks the Programs. | 452 // Tracks the Programs. |
| 442 // | 453 // |
| 443 // NOTE: To support shared resources an instance of this class will | 454 // NOTE: To support shared resources an instance of this class will |
| 444 // need to be shared by multiple GLES2Decoders. | 455 // need to be shared by multiple GLES2Decoders. |
| 445 class GPU_EXPORT ProgramManager { | 456 class GPU_EXPORT ProgramManager { |
| 446 public: | 457 public: |
| 447 explicit ProgramManager(ProgramCache* program_cache, | 458 explicit ProgramManager(ProgramCache* program_cache, |
| 448 uint32 max_varying_vectors, | 459 uint32 max_varying_vectors, |
| 460 uint32 max_dual_source_draw_buffers, |
| 449 FeatureInfo* feature_info); | 461 FeatureInfo* feature_info); |
| 450 ~ProgramManager(); | 462 ~ProgramManager(); |
| 451 | 463 |
| 452 // Must call before destruction. | 464 // Must call before destruction. |
| 453 void Destroy(bool have_context); | 465 void Destroy(bool have_context); |
| 454 | 466 |
| 455 // Creates a new program. | 467 // Creates a new program. |
| 456 Program* CreateProgram(GLuint client_id, GLuint service_id); | 468 Program* CreateProgram(GLuint client_id, GLuint service_id); |
| 457 | 469 |
| 458 // Gets a program. | 470 // Gets a program. |
| (...skipping 22 matching lines...) Expand all Loading... |
| 481 | 493 |
| 482 // Check if a Program is owned by this ProgramManager. | 494 // Check if a Program is owned by this ProgramManager. |
| 483 bool IsOwned(Program* program); | 495 bool IsOwned(Program* program); |
| 484 | 496 |
| 485 static int32 MakeFakeLocation(int32 index, int32 element); | 497 static int32 MakeFakeLocation(int32 index, int32 element); |
| 486 | 498 |
| 487 uint32 max_varying_vectors() const { | 499 uint32 max_varying_vectors() const { |
| 488 return max_varying_vectors_; | 500 return max_varying_vectors_; |
| 489 } | 501 } |
| 490 | 502 |
| 503 uint32 max_dual_source_draw_buffers() const { |
| 504 return max_dual_source_draw_buffers_; |
| 505 } |
| 506 |
| 491 private: | 507 private: |
| 492 friend class Program; | 508 friend class Program; |
| 493 | 509 |
| 494 void StartTracking(Program* program); | 510 void StartTracking(Program* program); |
| 495 void StopTracking(Program* program); | 511 void StopTracking(Program* program); |
| 496 | 512 |
| 497 void RemoveProgramInfoIfUnused( | 513 void RemoveProgramInfoIfUnused( |
| 498 ShaderManager* shader_manager, Program* program); | 514 ShaderManager* shader_manager, Program* program); |
| 499 | 515 |
| 500 // Info for each "successfully linked" program by service side program Id. | 516 // Info for each "successfully linked" program by service side program Id. |
| 501 // TODO(gman): Choose a faster container. | 517 // TODO(gman): Choose a faster container. |
| 502 typedef std::map<GLuint, scoped_refptr<Program> > ProgramMap; | 518 typedef std::map<GLuint, scoped_refptr<Program> > ProgramMap; |
| 503 ProgramMap programs_; | 519 ProgramMap programs_; |
| 504 | 520 |
| 505 // Counts the number of Program allocated with 'this' as its manager. | 521 // Counts the number of Program allocated with 'this' as its manager. |
| 506 // Allows to check no Program will outlive this. | 522 // Allows to check no Program will outlive this. |
| 507 unsigned int program_count_; | 523 unsigned int program_count_; |
| 508 | 524 |
| 509 bool have_context_; | 525 bool have_context_; |
| 510 | 526 |
| 511 // Used to clear uniforms. | 527 // Used to clear uniforms. |
| 512 std::vector<uint8> zero_; | 528 std::vector<uint8> zero_; |
| 513 | 529 |
| 514 ProgramCache* program_cache_; | 530 ProgramCache* program_cache_; |
| 515 | 531 |
| 516 uint32 max_varying_vectors_; | 532 uint32 max_varying_vectors_; |
| 533 uint32 max_dual_source_draw_buffers_; |
| 517 | 534 |
| 518 scoped_refptr<FeatureInfo> feature_info_; | 535 scoped_refptr<FeatureInfo> feature_info_; |
| 519 | 536 |
| 520 DISALLOW_COPY_AND_ASSIGN(ProgramManager); | 537 DISALLOW_COPY_AND_ASSIGN(ProgramManager); |
| 521 }; | 538 }; |
| 522 | 539 |
| 523 inline const FeatureInfo& Program::feature_info() const { | 540 inline const FeatureInfo& Program::feature_info() const { |
| 524 return *manager_->feature_info_.get(); | 541 return *manager_->feature_info_.get(); |
| 525 } | 542 } |
| 526 | 543 |
| 527 } // namespace gles2 | 544 } // namespace gles2 |
| 528 } // namespace gpu | 545 } // namespace gpu |
| 529 | 546 |
| 530 #endif // GPU_COMMAND_BUFFER_SERVICE_PROGRAM_MANAGER_H_ | 547 #endif // GPU_COMMAND_BUFFER_SERVICE_PROGRAM_MANAGER_H_ |
| OLD | NEW |