15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef GPU_COMMAND_BUFFER_SERVICE_PROGRAM_MANAGER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPU_COMMAND_BUFFER_SERVICE_PROGRAM_MANAGER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/common_decoder.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gl_utils.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/shader_manager.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/gpu_export.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ProgramCache; 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ProgramManager; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Shader; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ShaderManager; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ShaderTranslator; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This is used to track which attributes a particular program needs 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// so we can verify at glDrawXXX time that every attribute is either disabled 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// or if enabled that it points to a valid source. 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GPU_EXPORT Program : public base::RefCounted<Program> { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const int kMaxAttachedShaders = 2; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) enum VaryingsPackingOption { 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kCountOnlyStaticallyUsed, 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kCountAll 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) enum UniformApiType { 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kUniform1i = 1 << 0, 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kUniform2i = 1 << 1, 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kUniform3i = 1 << 2, 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kUniform4i = 1 << 3, 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kUniform1f = 1 << 4, 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kUniform2f = 1 << 5, 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kUniform3f = 1 << 6, 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kUniform4f = 1 << 7, 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kUniformMatrix2f = 1 << 8, 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kUniformMatrix3f = 1 << 9, 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kUniformMatrix4f = 1 << 10, 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }; 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct UniformInfo { 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UniformInfo(); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UniformInfo( 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLsizei _size, GLenum _type, GLint _fake_location_base, 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& _name); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~UniformInfo(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsValid() const { 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return size != 0; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsSampler() const { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return type == GL_SAMPLER_2D || type == GL_SAMPLER_2D_RECT_ARB || 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type == GL_SAMPLER_CUBE || type == GL_SAMPLER_EXTERNAL_OES; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLsizei size; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum type; 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) uint32 accepts_api_type; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint fake_location_base; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_array; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string name; 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<GLint> element_locations; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<GLuint> texture_units; 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct VertexAttrib { 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VertexAttrib(GLsizei _size, GLenum _type, const std::string& _name, 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint _location) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : size(_size), 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type(_type), 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) location(_location), 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name(_name) { 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLsizei size; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum type; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint location; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string name; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::vector<UniformInfo> UniformInfoVector; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::vector<VertexAttrib> AttribInfoVector; 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::vector<int> SamplerIndices; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::map<std::string, GLint> LocationMap; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Program(ProgramManager* manager, GLuint service_id); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint service_id() const { 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return service_id_; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SamplerIndices& sampler_indices() { 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return sampler_indices_; 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const AttribInfoVector& GetAttribInfos() const { 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return attrib_infos_; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const VertexAttrib* GetAttribInfo(GLint index) const { 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (static_cast<size_t>(index) < attrib_infos_.size()) ? 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &attrib_infos_[index] : NULL; 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint GetAttribLocation(const std::string& name) const; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const VertexAttrib* GetAttribInfoByLocation(GLuint location) const { 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (location < attrib_location_to_index_map_.size()) { 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint index = attrib_location_to_index_map_[location]; 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (index >= 0) { 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &attrib_infos_[index]; 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const UniformInfo* GetUniformInfo(GLint index) const; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the original name is not found, return NULL. 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string* GetAttribMappedName( 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& original_name) const; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the hashed name is not found, return NULL. 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string* GetOriginalNameFromHashedName( 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& hashed_name) const; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Gets the fake location of a uniform by name. 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint GetUniformFakeLocation(const std::string& name) const; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Gets the UniformInfo of a uniform by location. 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const UniformInfo* GetUniformInfoByFakeLocation( 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint fake_location, GLint* real_location, GLint* array_index) const; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Gets all the program info. 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void GetProgramInfo( 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProgramManager* manager, CommonDecoder::Bucket* bucket) const; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets the sampler values for a uniform. 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is safe to call for any location. If the location is not 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a sampler uniform nothing will happen. 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns false if fake_location is a sampler and any value 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // is >= num_texture_units. Returns true otherwise. 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool SetSamplers( 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint num_texture_units, GLint fake_location, 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLsizei count, const GLint* value); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsDeleted() const { 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return deleted_; 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void GetProgramiv(GLenum pname, GLint* params); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsValid() const { 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return valid_; 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool AttachShader(ShaderManager* manager, Shader* shader); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool DetachShader(ShaderManager* manager, Shader* shader); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool CanLink() const; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Performs glLinkProgram and related activities. 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool Link(ShaderManager* manager, 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShaderTranslator* vertex_translator, 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShaderTranslator* fragment_shader, 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VaryingsPackingOption varyings_packing_option, 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ShaderCacheCallback& shader_callback); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Performs glValidateProgram and related activities. 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Validate(); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string* log_info() const { 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return log_info_.get(); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool InUse() const { 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_GE(use_count_, 0); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return use_count_ != 0; 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets attribute-location binding from a glBindAttribLocation() call. 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetAttribLocationBinding(const std::string& attrib, GLint location) { 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bind_attrib_location_map_[attrib] = location; 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets uniform-location binding from a glBindUniformLocationCHROMIUM call. 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // returns false if error. 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool SetUniformLocationBinding(const std::string& name, GLint location); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Detects if there are attribute location conflicts from 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // glBindAttribLocation() calls. 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We only consider the declared attributes in the program. 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool DetectAttribLocationBindingConflicts() const; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Detects if there are uniforms of the same name but different type 2093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // or precision in vertex/fragment shaders. 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Return true and set the first found conflicting hashed name to 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // conflicting_name if such cases are detected. 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool DetectUniformsMismatch(std::string* conflicting_name) const; 2133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 214424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Return true if a varying is statically used in fragment shader, but it 215424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // is not declared in vertex shader. 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool DetectVaryingsMismatch(std::string* conflicting_name) const; 217424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Return true if an uniform and an attribute share the same name. 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool DetectGlobalNameConflicts(std::string* conflicting_name) const; 22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Return false if varyings can't be packed into the max available 22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // varying registers. 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool CheckVaryingsPacking(VaryingsPackingOption option) const; 22458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Visible for testing 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LocationMap& bind_attrib_location_map() const { 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return bind_attrib_location_map_; 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class base::RefCounted<Program>; 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class ProgramManager; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~Program(); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_log_info(const char* str) { 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) log_info_.reset(str ? new std::string(str) : NULL); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ClearLinkStatus() { 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) link_status_ = false; 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void IncUseCount() { 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++use_count_; 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DecUseCount() { 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --use_count_; 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_GE(use_count_, 0); 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void MarkAsDeleted() { 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!deleted_); 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) deleted_ = true; 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Resets the program. 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Reset(); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Updates the program info after a successful link. 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Update(); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Process the program log, replacing the hashed names with original names. 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string ProcessLogInfo(const std::string& log); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Updates the program log info from GL 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UpdateLogInfo(); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Clears all the uniforms. 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ClearUniforms(std::vector<uint8>* zero_buffer); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If long attribate names are mapped during shader translation, call 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // glBindAttribLocation() again with the mapped names. 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is called right before the glLink() call, but after shaders are 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // translated. 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ExecuteBindAttribLocationCalls(); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool AddUniformInfo( 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLsizei size, GLenum type, GLint location, GLint fake_base_location, 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& name, const std::string& original_name, 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t* next_available_index); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void GetCorrectedVariableInfo( 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool use_uniforms, const std::string& name, std::string* corrected_name, 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string* original_name, GLsizei* size, GLenum* type) const; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DetachShaders(ShaderManager* manager); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static inline GLint GetUniformInfoIndexFromFakeLocation( 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint fake_location) { 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fake_location & 0xFFFF; 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static inline GLint GetArrayElementIndexFromFakeLocation( 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint fake_location) { 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (fake_location >> 16) & 0xFFFF; 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProgramManager* manager_; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int use_count_; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLsizei max_attrib_name_length_; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Attrib by index. 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AttribInfoVector attrib_infos_; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Attrib by location to index. 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<GLint> attrib_location_to_index_map_; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLsizei max_uniform_name_length_; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Uniform info by index. 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UniformInfoVector uniform_infos_; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The indices of the uniforms that are samplers. 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SamplerIndices sampler_indices_; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The program this Program is tracking. 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint service_id_; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Shaders by type of shader. 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Shader> 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attached_shaders_[kMaxAttachedShaders]; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // True if this program is marked as deleted. 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool deleted_; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is true if glLinkProgram was successful at least once. 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool valid_; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is true if glLinkProgram was successful last time it was called. 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool link_status_; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // True if the uniforms have been cleared. 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool uniforms_cleared_; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is different than uniform_infos_.size() because 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // that is a sparce array. 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint num_uniforms_; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Log info 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<std::string> log_info_; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // attribute-location binding map from glBindAttribLocation() calls. 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LocationMap bind_attrib_location_map_; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // uniform-location binding map from glBindUniformLocationCHROMIUM() calls. 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LocationMap bind_uniform_location_map_; 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tracks the Programs. 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// NOTE: To support shared resources an instance of this class will 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// need to be shared by multiple GLES2Decoders. 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GPU_EXPORT ProgramManager { 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 35958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) explicit ProgramManager(ProgramCache* program_cache, 36058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) uint32 max_varying_vectors); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ProgramManager(); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must call before destruction. 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Destroy(bool have_context); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Creates a new program. 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Program* CreateProgram(GLuint client_id, GLuint service_id); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Gets a program. 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Program* GetProgram(GLuint client_id); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets a client id for a given service id. 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetClientId(GLuint service_id, GLuint* client_id) const; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the shader cache 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramCache* program_cache() const; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Marks a program as deleted. If it is not used the program will be deleted. 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void MarkAsDeleted(ShaderManager* shader_manager, Program* program); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Marks a program as used. 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UseProgram(Program* program); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Makes a program as unused. If deleted the program will be removed. 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UnuseProgram(ShaderManager* shader_manager, Program* program); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clears the uniforms for this program. 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ClearUniforms(Program* program); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if prefix is invalid for gl. 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool IsInvalidPrefix(const char* name, size_t length); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check if a Program is owned by this ProgramManager. 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsOwned(Program* program); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int32 MakeFakeLocation(int32 index, int32 element); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) uint32 max_varying_vectors() const { 39958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return max_varying_vectors_; 40058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 40158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class Program; 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void StartTracking(Program* program); 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void StopTracking(Program* program); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void RemoveProgramInfoIfUnused( 40958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ShaderManager* shader_manager, Program* program); 41058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Info for each "successfully linked" program by service side program Id. 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(gman): Choose a faster container. 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::map<GLuint, scoped_refptr<Program> > ProgramMap; 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProgramMap programs_; 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Counts the number of Program allocated with 'this' as its manager. 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Allows to check no Program will outlive this. 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned int program_count_; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool have_context_; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to clear uniforms. 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<uint8> zero_; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramCache* program_cache_; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) uint32 max_varying_vectors_; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ProgramManager); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gles2 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // GPU_COMMAND_BUFFER_SERVICE_PROGRAM_MANAGER_H_ 436