Home | History | Annotate | Download | only in service
      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
      3 // found in the LICENSE file.
      4 
      5 #ifndef GPU_COMMAND_BUFFER_SERVICE_TEXTURE_MANAGER_H_
      6 #define GPU_COMMAND_BUFFER_SERVICE_TEXTURE_MANAGER_H_
      7 
      8 #include <list>
      9 #include <set>
     10 #include <string>
     11 #include <vector>
     12 #include "base/basictypes.h"
     13 #include "base/containers/hash_tables.h"
     14 #include "base/logging.h"
     15 #include "base/memory/ref_counted.h"
     16 #include "base/observer_list.h"
     17 #include "gpu/command_buffer/service/async_pixel_transfer_delegate.h"
     18 #include "gpu/command_buffer/service/gl_utils.h"
     19 #include "gpu/command_buffer/service/memory_tracking.h"
     20 #include "gpu/gpu_export.h"
     21 #include "ui/gl/gl_image.h"
     22 
     23 namespace gpu {
     24 
     25 class StreamTextureManager;
     26 
     27 namespace gles2 {
     28 
     29 class GLES2Decoder;
     30 struct ContextState;
     31 struct DecoderFramebufferState;
     32 class Display;
     33 class ErrorState;
     34 class FeatureInfo;
     35 class FramebufferManager;
     36 class MailboxManager;
     37 class TextureManager;
     38 class TextureRef;
     39 
     40 // Info about Textures currently in the system.
     41 // This class wraps a real GL texture, keeping track of its meta-data. It is
     42 // jointly owned by possibly multiple TextureRef.
     43 class GPU_EXPORT Texture {
     44  public:
     45   explicit Texture(GLuint service_id);
     46 
     47   GLenum min_filter() const {
     48     return min_filter_;
     49   }
     50 
     51   GLenum mag_filter() const {
     52     return mag_filter_;
     53   }
     54 
     55   GLenum wrap_s() const {
     56     return wrap_s_;
     57   }
     58 
     59   GLenum wrap_t() const {
     60     return wrap_t_;
     61   }
     62 
     63   GLenum usage() const {
     64     return usage_;
     65   }
     66 
     67   GLenum pool() const {
     68     return pool_;
     69   }
     70 
     71   int num_uncleared_mips() const {
     72     return num_uncleared_mips_;
     73   }
     74 
     75   uint32 estimated_size() const {
     76     return estimated_size_;
     77   }
     78 
     79   bool CanRenderTo() const {
     80     return !stream_texture_ && target_ != GL_TEXTURE_EXTERNAL_OES;
     81   }
     82 
     83   // The service side OpenGL id of the texture.
     84   GLuint service_id() const {
     85     return service_id_;
     86   }
     87 
     88   void SetServiceId(GLuint service_id) {
     89     DCHECK(service_id);
     90     service_id_ = service_id;
     91   }
     92 
     93   // Returns the target this texure was first bound to or 0 if it has not
     94   // been bound. Once a texture is bound to a specific target it can never be
     95   // bound to a different target.
     96   GLenum target() const {
     97     return target_;
     98   }
     99 
    100   bool SafeToRenderFrom() const {
    101     return cleared_;
    102   }
    103 
    104   // Get the width and height for a particular level. Returns false if level
    105   // does not exist.
    106   bool GetLevelSize(
    107       GLint target, GLint level, GLsizei* width, GLsizei* height) const;
    108 
    109   // Get the type of a level. Returns false if level does not exist.
    110   bool GetLevelType(
    111       GLint target, GLint level, GLenum* type, GLenum* internal_format) const;
    112 
    113   // Get the image bound to a particular level. Returns NULL if level
    114   // does not exist.
    115   gfx::GLImage* GetLevelImage(GLint target, GLint level) const;
    116 
    117   bool HasImages() const {
    118     return has_images_;
    119   }
    120 
    121   // Returns true of the given dimensions are inside the dimensions of the
    122   // level and if the format and type match the level.
    123   bool ValidForTexture(
    124       GLint target,
    125       GLint level,
    126       GLint xoffset,
    127       GLint yoffset,
    128       GLsizei width,
    129       GLsizei height,
    130       GLenum format,
    131       GLenum type) const;
    132 
    133   bool IsValid() const {
    134     return !!target();
    135   }
    136 
    137   bool IsAttachedToFramebuffer() const {
    138     return framebuffer_attachment_count_ != 0;
    139   }
    140 
    141   void AttachToFramebuffer() {
    142     ++framebuffer_attachment_count_;
    143   }
    144 
    145   void DetachFromFramebuffer() {
    146     DCHECK_GT(framebuffer_attachment_count_, 0);
    147     --framebuffer_attachment_count_;
    148   }
    149 
    150   bool IsStreamTexture() const {
    151     return stream_texture_;
    152   }
    153 
    154   void SetImmutable(bool immutable) {
    155     immutable_ = immutable;
    156   }
    157 
    158   bool IsImmutable() const {
    159     return immutable_;
    160   }
    161 
    162   // Whether a particular level/face is cleared.
    163   bool IsLevelCleared(GLenum target, GLint level) const;
    164 
    165   // Whether the texture has been defined
    166   bool IsDefined() const {
    167     return estimated_size() > 0;
    168   }
    169 
    170   void OnWillModifyPixels();
    171   void OnDidModifyPixels();
    172 
    173  private:
    174   friend class MailboxManager;
    175   friend class MailboxManagerTest;
    176   friend class TextureDefinition;
    177   friend class TextureManager;
    178   friend class TextureRef;
    179   friend class TextureTestHelper;
    180 
    181   ~Texture();
    182   void AddTextureRef(TextureRef* ref);
    183   void RemoveTextureRef(TextureRef* ref, bool have_context);
    184   MemoryTypeTracker* GetMemTracker();
    185 
    186   // Condition on which this texture is renderable. Can be ONLY_IF_NPOT if it
    187   // depends on context support for non-power-of-two textures (i.e. will be
    188   // renderable if NPOT support is in the context, otherwise not, e.g. texture
    189   // with a NPOT level). ALWAYS means it doesn't depend on context features
    190   // (e.g. complete POT), NEVER means it's not renderable regardless (e.g.
    191   // incomplete).
    192   enum CanRenderCondition {
    193     CAN_RENDER_ALWAYS,
    194     CAN_RENDER_NEVER,
    195     CAN_RENDER_ONLY_IF_NPOT
    196   };
    197 
    198   struct LevelInfo {
    199     LevelInfo();
    200     LevelInfo(const LevelInfo& rhs);
    201     ~LevelInfo();
    202 
    203     bool cleared;
    204     GLenum target;
    205     GLint level;
    206     GLenum internal_format;
    207     GLsizei width;
    208     GLsizei height;
    209     GLsizei depth;
    210     GLint border;
    211     GLenum format;
    212     GLenum type;
    213     scoped_refptr<gfx::GLImage> image;
    214     uint32 estimated_size;
    215   };
    216 
    217   // Set the info for a particular level.
    218   void SetLevelInfo(
    219       const FeatureInfo* feature_info,
    220       GLenum target,
    221       GLint level,
    222       GLenum internal_format,
    223       GLsizei width,
    224       GLsizei height,
    225       GLsizei depth,
    226       GLint border,
    227       GLenum format,
    228       GLenum type,
    229       bool cleared);
    230 
    231   // In GLES2 "texture complete" means it has all required mips for filtering
    232   // down to a 1x1 pixel texture, they are in the correct order, they are all
    233   // the same format.
    234   bool texture_complete() const {
    235     return texture_complete_;
    236   }
    237 
    238   // In GLES2 "cube complete" means all 6 faces level 0 are defined, all the
    239   // same format, all the same dimensions and all width = height.
    240   bool cube_complete() const {
    241     return cube_complete_;
    242   }
    243 
    244   // Whether or not this texture is a non-power-of-two texture.
    245   bool npot() const {
    246     return npot_;
    247   }
    248 
    249   void SetStreamTexture(bool stream_texture) {
    250     stream_texture_ = stream_texture;
    251     UpdateCanRenderCondition();
    252   }
    253 
    254   // Marks a particular level as cleared or uncleared.
    255   void SetLevelCleared(GLenum target, GLint level, bool cleared);
    256 
    257   // Updates the cleared flag for this texture by inspecting all the mips.
    258   void UpdateCleared();
    259 
    260   // Clears any renderable uncleared levels.
    261   // Returns false if a GL error was generated.
    262   bool ClearRenderableLevels(GLES2Decoder* decoder);
    263 
    264   // Clears the level.
    265   // Returns false if a GL error was generated.
    266   bool ClearLevel(GLES2Decoder* decoder, GLenum target, GLint level);
    267 
    268   // Sets a texture parameter.
    269   // TODO(gman): Expand to SetParameteri,f,iv,fv
    270   // Returns GL_NO_ERROR on success. Otherwise the error to generate.
    271   GLenum SetParameter(
    272       const FeatureInfo* feature_info, GLenum pname, GLint param);
    273 
    274   // Makes each of the mip levels as though they were generated.
    275   bool MarkMipmapsGenerated(const FeatureInfo* feature_info);
    276 
    277   bool NeedsMips() const {
    278     return min_filter_ != GL_NEAREST && min_filter_ != GL_LINEAR;
    279   }
    280 
    281   // True if this texture meets all the GLES2 criteria for rendering.
    282   // See section 3.8.2 of the GLES2 spec.
    283   bool CanRender(const FeatureInfo* feature_info) const;
    284 
    285   // Returns true if mipmaps can be generated by GL.
    286   bool CanGenerateMipmaps(const FeatureInfo* feature_info) const;
    287 
    288   // Sets the Texture's target
    289   // Parameters:
    290   //   target: GL_TEXTURE_2D or GL_TEXTURE_CUBE_MAP or
    291   //           GL_TEXTURE_EXTERNAL_OES or GL_TEXTURE_RECTANGLE_ARB
    292   //   max_levels: The maximum levels this type of target can have.
    293   void SetTarget(
    294       const FeatureInfo* feature_info, GLenum target, GLint max_levels);
    295 
    296   // Update info about this texture.
    297   void Update(const FeatureInfo* feature_info);
    298 
    299   // Set the image for a particular level.
    300   void SetLevelImage(
    301       const FeatureInfo* feature_info,
    302       GLenum target,
    303       GLint level,
    304       gfx::GLImage* image);
    305 
    306   // Appends a signature for the given level.
    307   void AddToSignature(
    308       const FeatureInfo* feature_info,
    309       GLenum target, GLint level, std::string* signature) const;
    310 
    311   void SetMailboxManager(MailboxManager* mailbox_manager);
    312 
    313   // Updates the unsafe textures count in all the managers referencing this
    314   // texture.
    315   void UpdateSafeToRenderFrom(bool cleared);
    316 
    317   // Updates the uncleared mip count in all the managers referencing this
    318   // texture.
    319   void UpdateMipCleared(LevelInfo* info, bool cleared);
    320 
    321   // Computes the CanRenderCondition flag.
    322   CanRenderCondition GetCanRenderCondition() const;
    323 
    324   // Updates the unrenderable texture count in all the managers referencing this
    325   // texture.
    326   void UpdateCanRenderCondition();
    327 
    328   // Updates the images count in all the managers referencing this
    329   // texture.
    330   void UpdateHasImages();
    331 
    332   // Increment the framebuffer state change count in all the managers
    333   // referencing this texture.
    334   void IncAllFramebufferStateChangeCount();
    335 
    336   MailboxManager* mailbox_manager_;
    337 
    338   // Info about each face and level of texture.
    339   std::vector<std::vector<LevelInfo> > level_infos_;
    340 
    341   // The texture refs that point to this Texture.
    342   typedef std::set<TextureRef*> RefSet;
    343   RefSet refs_;
    344 
    345   // The single TextureRef that accounts for memory for this texture. Must be
    346   // one of refs_.
    347   TextureRef* memory_tracking_ref_;
    348 
    349   // The id of the texure
    350   GLuint service_id_;
    351 
    352   // Whether all renderable mips of this texture have been cleared.
    353   bool cleared_;
    354 
    355   int num_uncleared_mips_;
    356 
    357   // The target. 0 if unset, otherwise GL_TEXTURE_2D or GL_TEXTURE_CUBE_MAP.
    358   GLenum target_;
    359 
    360   // Texture parameters.
    361   GLenum min_filter_;
    362   GLenum mag_filter_;
    363   GLenum wrap_s_;
    364   GLenum wrap_t_;
    365   GLenum usage_;
    366   GLenum pool_;
    367 
    368   // The maximum level that has been set.
    369   GLint max_level_set_;
    370 
    371   // Whether or not this texture is "texture complete"
    372   bool texture_complete_;
    373 
    374   // Whether or not this texture is "cube complete"
    375   bool cube_complete_;
    376 
    377   // Whether or not this texture is non-power-of-two
    378   bool npot_;
    379 
    380   // Whether this texture has ever been bound.
    381   bool has_been_bound_;
    382 
    383   // The number of framebuffers this texture is attached to.
    384   int framebuffer_attachment_count_;
    385 
    386   // Whether this is a special streaming texture.
    387   bool stream_texture_;
    388 
    389   // Whether the texture is immutable and no further changes to the format
    390   // or dimensions of the texture object can be made.
    391   bool immutable_;
    392 
    393   // Whether or not this texture has images.
    394   bool has_images_;
    395 
    396   // Size in bytes this texture is assumed to take in memory.
    397   uint32 estimated_size_;
    398 
    399   // Cache of the computed CanRenderCondition flag.
    400   CanRenderCondition can_render_condition_;
    401 
    402   DISALLOW_COPY_AND_ASSIGN(Texture);
    403 };
    404 
    405 // This class represents a texture in a client context group. It's mostly 1:1
    406 // with a client id, though it can outlive the client id if it's still bound to
    407 // a FBO or another context when destroyed.
    408 // Multiple TextureRef can point to the same texture with cross-context sharing.
    409 //
    410 // Note: for stream textures, the TextureRef that created the stream texture is
    411 // set as the "owner" of the stream texture, i.e. it will call
    412 // DestroyStreamTexture on destruction. This is because the StreamTextureManager
    413 // isn't generally shared between ContextGroups, so ownership can't be at the
    414 // Texture level. We also can't have multiple StreamTexture on the same service
    415 // id, so there can be only one owner.
    416 class GPU_EXPORT TextureRef : public base::RefCounted<TextureRef> {
    417  public:
    418   TextureRef(TextureManager* manager, GLuint client_id, Texture* texture);
    419   static scoped_refptr<TextureRef> Create(TextureManager* manager,
    420                                           GLuint client_id,
    421                                           GLuint service_id);
    422   const Texture* texture() const { return texture_; }
    423   Texture* texture() { return texture_; }
    424   GLuint client_id() const { return client_id_; }
    425   GLuint service_id() const { return texture_->service_id(); }
    426 
    427  private:
    428   friend class base::RefCounted<TextureRef>;
    429   friend class Texture;
    430   friend class TextureManager;
    431 
    432   ~TextureRef();
    433   const TextureManager* manager() const { return manager_; }
    434   TextureManager* manager() { return manager_; }
    435   void reset_client_id() { client_id_ = 0; }
    436   void set_is_stream_texture_owner(bool owner) {
    437     is_stream_texture_owner_ = owner;
    438   }
    439   bool is_stream_texture_owner() const { return is_stream_texture_owner_; }
    440 
    441   TextureManager* manager_;
    442   Texture* texture_;
    443   GLuint client_id_;
    444   bool is_stream_texture_owner_;
    445 
    446   DISALLOW_COPY_AND_ASSIGN(TextureRef);
    447 };
    448 
    449 // Holds data that is per gles2_cmd_decoder, but is related to to the
    450 // TextureManager.
    451 struct DecoderTextureState {
    452   // total_texture_upload_time automatically initialized to 0 in default
    453   // constructor.
    454   DecoderTextureState(bool texsubimage2d_faster_than_teximage2d)
    455       : tex_image_2d_failed(false),
    456         texture_upload_count(0),
    457         texsubimage2d_faster_than_teximage2d(
    458             texsubimage2d_faster_than_teximage2d) {}
    459 
    460   // This indicates all the following texSubImage2D calls that are part of the
    461   // failed texImage2D call should be ignored.
    462   bool tex_image_2d_failed;
    463 
    464   // Command buffer stats.
    465   int texture_upload_count;
    466   base::TimeDelta total_texture_upload_time;
    467 
    468   bool texsubimage2d_faster_than_teximage2d;
    469 };
    470 
    471 // This class keeps track of the textures and their sizes so we can do NPOT and
    472 // texture complete checking.
    473 //
    474 // NOTE: To support shared resources an instance of this class will need to be
    475 // shared by multiple GLES2Decoders.
    476 class GPU_EXPORT TextureManager {
    477  public:
    478   class GPU_EXPORT DestructionObserver {
    479    public:
    480     DestructionObserver();
    481     virtual ~DestructionObserver();
    482 
    483     // Called in ~TextureManager.
    484     virtual void OnTextureManagerDestroying(TextureManager* manager) = 0;
    485 
    486     // Called via ~TextureRef.
    487     virtual void OnTextureRefDestroying(TextureRef* texture) = 0;
    488 
    489    private:
    490     DISALLOW_COPY_AND_ASSIGN(DestructionObserver);
    491   };
    492 
    493   enum DefaultAndBlackTextures {
    494     kTexture2D,
    495     kCubeMap,
    496     kExternalOES,
    497     kRectangleARB,
    498     kNumDefaultTextures
    499   };
    500 
    501   TextureManager(MemoryTracker* memory_tracker,
    502                  FeatureInfo* feature_info,
    503                  GLsizei max_texture_size,
    504                  GLsizei max_cube_map_texture_size);
    505   ~TextureManager();
    506 
    507   void set_framebuffer_manager(FramebufferManager* manager) {
    508     framebuffer_manager_ = manager;
    509   }
    510 
    511   void set_stream_texture_manager(StreamTextureManager* manager) {
    512     stream_texture_manager_ = manager;
    513   }
    514 
    515   // Init the texture manager.
    516   bool Initialize();
    517 
    518   // Must call before destruction.
    519   void Destroy(bool have_context);
    520 
    521   // Returns the maximum number of levels.
    522   GLint MaxLevelsForTarget(GLenum target) const {
    523     switch (target) {
    524       case GL_TEXTURE_2D:
    525         return  max_levels_;
    526       case GL_TEXTURE_EXTERNAL_OES:
    527         return 1;
    528       default:
    529         return max_cube_map_levels_;
    530     }
    531   }
    532 
    533   // Returns the maximum size.
    534   GLsizei MaxSizeForTarget(GLenum target) const {
    535     switch (target) {
    536       case GL_TEXTURE_2D:
    537       case GL_TEXTURE_EXTERNAL_OES:
    538         return max_texture_size_;
    539       default:
    540         return max_cube_map_texture_size_;
    541     }
    542   }
    543 
    544   // Returns the maxium number of levels a texture of the given size can have.
    545   static GLsizei ComputeMipMapCount(GLenum target,
    546                                     GLsizei width,
    547                                     GLsizei height,
    548                                     GLsizei depth);
    549 
    550   // Checks if a dimensions are valid for a given target.
    551   bool ValidForTarget(
    552       GLenum target, GLint level,
    553       GLsizei width, GLsizei height, GLsizei depth);
    554 
    555   // True if this texture meets all the GLES2 criteria for rendering.
    556   // See section 3.8.2 of the GLES2 spec.
    557   bool CanRender(const TextureRef* ref) const {
    558     return ref->texture()->CanRender(feature_info_.get());
    559   }
    560 
    561   // Returns true if mipmaps can be generated by GL.
    562   bool CanGenerateMipmaps(const TextureRef* ref) const {
    563     return ref->texture()->CanGenerateMipmaps(feature_info_.get());
    564   }
    565 
    566   // Sets the Texture's target
    567   // Parameters:
    568   //   target: GL_TEXTURE_2D or GL_TEXTURE_CUBE_MAP
    569   //   max_levels: The maximum levels this type of target can have.
    570   void SetTarget(
    571       TextureRef* ref,
    572       GLenum target);
    573 
    574   // Marks a texture as a stream texture, and the ref as the stream texture
    575   // owner.
    576   void SetStreamTexture(TextureRef* ref, bool stream_texture);
    577 
    578   // Whether the TextureRef is the stream texture owner.
    579   bool IsStreamTextureOwner(TextureRef* ref);
    580 
    581   // Set the info for a particular level in a TexureInfo.
    582   void SetLevelInfo(
    583       TextureRef* ref,
    584       GLenum target,
    585       GLint level,
    586       GLenum internal_format,
    587       GLsizei width,
    588       GLsizei height,
    589       GLsizei depth,
    590       GLint border,
    591       GLenum format,
    592       GLenum type,
    593       bool cleared);
    594 
    595   // Adapter to call above function.
    596   void SetLevelInfoFromParams(TextureRef* ref,
    597                               const gpu::AsyncTexImage2DParams& params) {
    598     SetLevelInfo(
    599         ref, params.target, params.level, params.internal_format,
    600         params.width, params.height, 1 /* depth */,
    601         params.border, params.format,
    602         params.type, true /* cleared */ );
    603   }
    604 
    605   Texture* Produce(TextureRef* ref);
    606 
    607   // Maps an existing texture into the texture manager, at a given client ID.
    608   TextureRef* Consume(GLuint client_id, Texture* texture);
    609 
    610   // Sets a mip as cleared.
    611   void SetLevelCleared(TextureRef* ref, GLenum target,
    612                        GLint level, bool cleared);
    613 
    614   // Sets a texture parameter of a Texture
    615   // Returns GL_NO_ERROR on success. Otherwise the error to generate.
    616   // TODO(gman): Expand to SetParameteri,f,iv,fv
    617   void SetParameter(
    618       const char* function_name, ErrorState* error_state,
    619       TextureRef* ref, GLenum pname, GLint param);
    620 
    621   // Makes each of the mip levels as though they were generated.
    622   // Returns false if that's not allowed for the given texture.
    623   bool MarkMipmapsGenerated(TextureRef* ref);
    624 
    625   // Clears any uncleared renderable levels.
    626   bool ClearRenderableLevels(GLES2Decoder* decoder, TextureRef* ref);
    627 
    628   // Clear a specific level.
    629   bool ClearTextureLevel(
    630       GLES2Decoder* decoder, TextureRef* ref, GLenum target, GLint level);
    631 
    632   // Creates a new texture info.
    633   TextureRef* CreateTexture(GLuint client_id, GLuint service_id);
    634 
    635   // Gets the texture info for the given texture.
    636   TextureRef* GetTexture(GLuint client_id) const;
    637 
    638   // Removes a texture info.
    639   void RemoveTexture(GLuint client_id);
    640 
    641   // Gets a Texture for a given service id (note: it assumes the texture object
    642   // is still mapped in this TextureManager).
    643   Texture* GetTextureForServiceId(GLuint service_id) const;
    644 
    645   TextureRef* GetDefaultTextureInfo(GLenum target) {
    646     switch (target) {
    647       case GL_TEXTURE_2D:
    648         return default_textures_[kTexture2D].get();
    649       case GL_TEXTURE_CUBE_MAP:
    650         return default_textures_[kCubeMap].get();
    651       case GL_TEXTURE_EXTERNAL_OES:
    652         return default_textures_[kExternalOES].get();
    653       case GL_TEXTURE_RECTANGLE_ARB:
    654         return default_textures_[kRectangleARB].get();
    655       default:
    656         NOTREACHED();
    657         return NULL;
    658     }
    659   }
    660 
    661   bool HaveUnrenderableTextures() const {
    662     return num_unrenderable_textures_ > 0;
    663   }
    664 
    665   bool HaveUnsafeTextures() const {
    666     return num_unsafe_textures_ > 0;
    667   }
    668 
    669   bool HaveUnclearedMips() const {
    670     return num_uncleared_mips_ > 0;
    671   }
    672 
    673   bool HaveImages() const {
    674     return num_images_ > 0;
    675   }
    676 
    677   GLuint black_texture_id(GLenum target) const {
    678     switch (target) {
    679       case GL_SAMPLER_2D:
    680         return black_texture_ids_[kTexture2D];
    681       case GL_SAMPLER_CUBE:
    682         return black_texture_ids_[kCubeMap];
    683       case GL_SAMPLER_EXTERNAL_OES:
    684         return black_texture_ids_[kExternalOES];
    685       case GL_SAMPLER_2D_RECT_ARB:
    686         return black_texture_ids_[kRectangleARB];
    687       default:
    688         NOTREACHED();
    689         return 0;
    690     }
    691   }
    692 
    693   size_t mem_represented() const {
    694     return
    695         memory_tracker_managed_->GetMemRepresented() +
    696         memory_tracker_unmanaged_->GetMemRepresented();
    697   }
    698 
    699   void SetLevelImage(
    700       TextureRef* ref,
    701       GLenum target,
    702       GLint level,
    703       gfx::GLImage* image);
    704 
    705   void AddToSignature(
    706       TextureRef* ref,
    707       GLenum target,
    708       GLint level,
    709       std::string* signature) const;
    710 
    711   void AddObserver(DestructionObserver* observer) {
    712     destruction_observers_.AddObserver(observer);
    713   }
    714 
    715   void RemoveObserver(DestructionObserver* observer) {
    716     destruction_observers_.RemoveObserver(observer);
    717   }
    718 
    719   struct DoTextImage2DArguments {
    720     GLenum target;
    721     GLint level;
    722     GLenum internal_format;
    723     GLsizei width;
    724     GLsizei height;
    725     GLint border;
    726     GLenum format;
    727     GLenum type;
    728     const void* pixels;
    729     uint32 pixels_size;
    730   };
    731 
    732   bool ValidateTexImage2D(
    733     ContextState* state,
    734     const char* function_name,
    735     const DoTextImage2DArguments& args,
    736     // Pointer to TextureRef filled in if validation successful.
    737     // Presumes the pointer is valid.
    738     TextureRef** texture_ref);
    739 
    740   void ValidateAndDoTexImage2D(
    741     DecoderTextureState* texture_state,
    742     ContextState* state,
    743     DecoderFramebufferState* framebuffer_state,
    744     const DoTextImage2DArguments& args);
    745 
    746   // TODO(kloveless): Make GetTexture* private once this is no longer called
    747   // from gles2_cmd_decoder.
    748   TextureRef* GetTextureInfoForTarget(ContextState* state, GLenum target);
    749   TextureRef* GetTextureInfoForTargetUnlessDefault(
    750       ContextState* state, GLenum target);
    751 
    752   bool ValidateTextureParameters(
    753     ErrorState* error_state, const char* function_name,
    754     GLenum target, GLenum format, GLenum type, GLint level);
    755 
    756  private:
    757   friend class Texture;
    758   friend class TextureRef;
    759 
    760   // Helper for Initialize().
    761   scoped_refptr<TextureRef> CreateDefaultAndBlackTextures(
    762       GLenum target,
    763       GLuint* black_texture);
    764 
    765   void DoTexImage2D(
    766     DecoderTextureState* texture_state,
    767     ErrorState* error_state,
    768     DecoderFramebufferState* framebuffer_state,
    769     TextureRef* texture_ref,
    770     const DoTextImage2DArguments& args);
    771 
    772   void StartTracking(TextureRef* texture);
    773   void StopTracking(TextureRef* texture);
    774 
    775   void UpdateSafeToRenderFrom(int delta);
    776   void UpdateUnclearedMips(int delta);
    777   void UpdateCanRenderCondition(Texture::CanRenderCondition old_condition,
    778                                 Texture::CanRenderCondition new_condition);
    779   void UpdateNumImages(int delta);
    780   void IncFramebufferStateChangeCount();
    781 
    782   MemoryTypeTracker* GetMemTracker(GLenum texture_pool);
    783   scoped_ptr<MemoryTypeTracker> memory_tracker_managed_;
    784   scoped_ptr<MemoryTypeTracker> memory_tracker_unmanaged_;
    785 
    786   scoped_refptr<FeatureInfo> feature_info_;
    787 
    788   FramebufferManager* framebuffer_manager_;
    789   StreamTextureManager* stream_texture_manager_;
    790 
    791   // Info for each texture in the system.
    792   typedef base::hash_map<GLuint, scoped_refptr<TextureRef> > TextureMap;
    793   TextureMap textures_;
    794 
    795   GLsizei max_texture_size_;
    796   GLsizei max_cube_map_texture_size_;
    797   GLint max_levels_;
    798   GLint max_cube_map_levels_;
    799 
    800   int num_unrenderable_textures_;
    801   int num_unsafe_textures_;
    802   int num_uncleared_mips_;
    803   int num_images_;
    804 
    805   // Counts the number of Textures allocated with 'this' as its manager.
    806   // Allows to check no Texture will outlive this.
    807   unsigned int texture_count_;
    808 
    809   bool have_context_;
    810 
    811   // Black (0,0,0,1) textures for when non-renderable textures are used.
    812   // NOTE: There is no corresponding Texture for these textures.
    813   // TextureInfos are only for textures the client side can access.
    814   GLuint black_texture_ids_[kNumDefaultTextures];
    815 
    816   // The default textures for each target (texture name = 0)
    817   scoped_refptr<TextureRef> default_textures_[kNumDefaultTextures];
    818 
    819   ObserverList<DestructionObserver> destruction_observers_;
    820 
    821   DISALLOW_COPY_AND_ASSIGN(TextureManager);
    822 };
    823 
    824 // This class records texture upload time when in scope.
    825 class ScopedTextureUploadTimer {
    826  public:
    827   explicit ScopedTextureUploadTimer(DecoderTextureState* texture_state);
    828   ~ScopedTextureUploadTimer();
    829 
    830  private:
    831   DecoderTextureState* texture_state_;
    832   base::TimeTicks begin_time_;
    833   DISALLOW_COPY_AND_ASSIGN(ScopedTextureUploadTimer);
    834 };
    835 
    836 }  // namespace gles2
    837 }  // namespace gpu
    838 
    839 #endif  // GPU_COMMAND_BUFFER_SERVICE_TEXTURE_MANAGER_H_
    840