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