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