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_TEXTURE_MANAGER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPU_COMMAND_BUFFER_SERVICE_TEXTURE_MANAGER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <algorithm>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <list>
1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <set>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
16b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "gpu/command_buffer/service/async_pixel_transfer_delegate.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gl_utils.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/memory_tracking.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/gpu_export.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_image.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLES2Decoder;
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)struct ContextState;
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)struct DecoderFramebufferState;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Display;
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ErrorState;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FeatureInfo;
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class FramebufferManager;
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class MailboxManager;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TextureManager;
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class TextureRef;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Info about Textures currently in the system.
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This class wraps a real GL texture, keeping track of its meta-data. It is
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// jointly owned by possibly multiple TextureRef.
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class GPU_EXPORT Texture {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  explicit Texture(GLuint service_id);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum min_filter() const {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return min_filter_;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum mag_filter() const {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return mag_filter_;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum wrap_s() const {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return wrap_s_;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum wrap_t() const {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return wrap_t_;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum usage() const {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return usage_;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum pool() const {
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return pool_;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_uncleared_mips() const {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return num_uncleared_mips_;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32 estimated_size() const {
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return estimated_size_;
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool CanRenderTo() const {
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return target_ != GL_TEXTURE_EXTERNAL_OES;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The service side OpenGL id of the texture.
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLuint service_id() const {
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return service_id_;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetServiceId(GLuint service_id) {
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DCHECK(service_id);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    service_id_ = service_id;
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the target this texure was first bound to or 0 if it has not
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // been bound. Once a texture is bound to a specific target it can never be
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // bound to a different target.
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum target() const {
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return target_;
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool SafeToRenderFrom() const {
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return cleared_;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Get the width and height for a particular level. Returns false if level
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // does not exist.
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool GetLevelSize(
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLint target, GLint level, GLsizei* width, GLsizei* height) const;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Get the type of a level. Returns false if level does not exist.
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool GetLevelType(
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLint target, GLint level, GLenum* type, GLenum* internal_format) const;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Get the image bound to a particular level. Returns NULL if level
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // does not exist.
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::GLImage* GetLevelImage(GLint target, GLint level) const;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool HasImages() const {
1148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return has_images_;
1158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
1168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true of the given dimensions are inside the dimensions of the
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // level and if the type matches the level.
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool ValidForTexture(
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLint target,
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLint level,
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLint xoffset,
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLint yoffset,
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLsizei width,
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLsizei height,
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLenum type) const;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsValid() const {
12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return !!target();
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsAttachedToFramebuffer() const {
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return framebuffer_attachment_count_ != 0;
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AttachToFramebuffer() {
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++framebuffer_attachment_count_;
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DetachFromFramebuffer() {
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_GT(framebuffer_attachment_count_, 0);
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    --framebuffer_attachment_count_;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetImmutable(bool immutable) {
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    immutable_ = immutable;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool IsImmutable() const {
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return immutable_;
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether a particular level/face is cleared.
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsLevelCleared(GLenum target, GLint level) const;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether the texture has been defined
15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool IsDefined() const {
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return estimated_size() > 0;
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Initialize TEXTURE_MAX_ANISOTROPY to 1 if we haven't done so yet.
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void InitTextureMaxAnisotropyIfNeeded(GLenum target);
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OnWillModifyPixels();
165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OnDidModifyPixels();
166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  friend class MailboxManager;
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  friend class MailboxManagerTest;
170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  friend class TextureDefinition;
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class TextureManager;
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  friend class TextureRef;
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  friend class TextureTestHelper;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~Texture();
17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void AddTextureRef(TextureRef* ref);
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void RemoveTextureRef(TextureRef* ref, bool have_context);
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MemoryTypeTracker* GetMemTracker();
17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Condition on which this texture is renderable. Can be ONLY_IF_NPOT if it
18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // depends on context support for non-power-of-two textures (i.e. will be
18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // renderable if NPOT support is in the context, otherwise not, e.g. texture
18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // with a NPOT level). ALWAYS means it doesn't depend on context features
18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // (e.g. complete POT), NEVER means it's not renderable regardless (e.g.
18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // incomplete).
18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  enum CanRenderCondition {
18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    CAN_RENDER_ALWAYS,
18890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    CAN_RENDER_NEVER,
18990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    CAN_RENDER_ONLY_IF_NPOT
19090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  };
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct LevelInfo {
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LevelInfo();
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LevelInfo(const LevelInfo& rhs);
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~LevelInfo();
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool cleared;
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLenum target;
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLint level;
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLenum internal_format;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLsizei width;
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLsizei height;
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLsizei depth;
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLint border;
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLenum format;
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLenum type;
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<gfx::GLImage> image;
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    uint32 estimated_size;
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the info for a particular level.
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetLevelInfo(
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FeatureInfo* feature_info,
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLenum target,
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLint level,
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLenum internal_format,
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLsizei width,
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLsizei height,
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLsizei depth,
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLint border,
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLenum format,
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLenum type,
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool cleared);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // In GLES2 "texture complete" means it has all required mips for filtering
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // down to a 1x1 pixel texture, they are in the correct order, they are all
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the same format.
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool texture_complete() const {
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return texture_complete_;
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // In GLES2 "cube complete" means all 6 faces level 0 are defined, all the
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // same format, all the same dimensions and all width = height.
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool cube_complete() const {
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return cube_complete_;
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Whether or not this texture is a non-power-of-two texture.
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool npot() const {
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return npot_;
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Marks a particular level as cleared or uncleared.
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetLevelCleared(GLenum target, GLint level, bool cleared);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Updates the cleared flag for this texture by inspecting all the mips.
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateCleared();
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Clears any renderable uncleared levels.
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns false if a GL error was generated.
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool ClearRenderableLevels(GLES2Decoder* decoder);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Clears the level.
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns false if a GL error was generated.
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool ClearLevel(GLES2Decoder* decoder, GLenum target, GLint level);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets a texture parameter.
258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // TODO(gman): Expand to SetParameteriv,fv
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns GL_NO_ERROR on success. Otherwise the error to generate.
260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GLenum SetParameteri(
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FeatureInfo* feature_info, GLenum pname, GLint param);
262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GLenum SetParameterf(
263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const FeatureInfo* feature_info, GLenum pname, GLfloat param);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Makes each of the mip levels as though they were generated.
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool MarkMipmapsGenerated(const FeatureInfo* feature_info);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool NeedsMips() const {
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return min_filter_ != GL_NEAREST && min_filter_ != GL_LINEAR;
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // True if this texture meets all the GLES2 criteria for rendering.
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // See section 3.8.2 of the GLES2 spec.
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool CanRender(const FeatureInfo* feature_info) const;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if mipmaps can be generated by GL.
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool CanGenerateMipmaps(const FeatureInfo* feature_info) const;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets the Texture's target
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Parameters:
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //   target: GL_TEXTURE_2D or GL_TEXTURE_CUBE_MAP or
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //           GL_TEXTURE_EXTERNAL_OES or GL_TEXTURE_RECTANGLE_ARB
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //   max_levels: The maximum levels this type of target can have.
28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void SetTarget(
28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      const FeatureInfo* feature_info, GLenum target, GLint max_levels);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Update info about this texture.
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Update(const FeatureInfo* feature_info);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the image for a particular level.
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetLevelImage(
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FeatureInfo* feature_info,
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLenum target,
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLint level,
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::GLImage* image);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Appends a signature for the given level.
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddToSignature(
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FeatureInfo* feature_info,
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLenum target, GLint level, std::string* signature) const;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void SetMailboxManager(MailboxManager* mailbox_manager);
303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Updates the unsafe textures count in all the managers referencing this
30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // texture.
30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void UpdateSafeToRenderFrom(bool cleared);
30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Updates the uncleared mip count in all the managers referencing this
30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // texture.
31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void UpdateMipCleared(LevelInfo* info, bool cleared);
31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
31290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Computes the CanRenderCondition flag.
31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CanRenderCondition GetCanRenderCondition() const;
31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Updates the unrenderable texture count in all the managers referencing this
31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // texture.
31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void UpdateCanRenderCondition();
31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Updates the images count in all the managers referencing this
3208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // texture.
3218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  void UpdateHasImages();
3228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Increment the framebuffer state change count in all the managers
32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // referencing this texture.
32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void IncAllFramebufferStateChangeCount();
32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MailboxManager* mailbox_manager_;
328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Info about each face and level of texture.
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::vector<LevelInfo> > level_infos_;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The texture refs that point to this Texture.
33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  typedef std::set<TextureRef*> RefSet;
33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  RefSet refs_;
33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
33690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The single TextureRef that accounts for memory for this texture. Must be
33790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // one of refs_.
33890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TextureRef* memory_tracking_ref_;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The id of the texure
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLuint service_id_;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether all renderable mips of this texture have been cleared.
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool cleared_;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_uncleared_mips_;
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The target. 0 if unset, otherwise GL_TEXTURE_2D or GL_TEXTURE_CUBE_MAP.
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum target_;
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Texture parameters.
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum min_filter_;
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum mag_filter_;
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum wrap_s_;
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum wrap_t_;
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum usage_;
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum pool_;
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The maximum level that has been set.
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLint max_level_set_;
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether or not this texture is "texture complete"
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool texture_complete_;
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether or not this texture is "cube complete"
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool cube_complete_;
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether or not this texture is non-power-of-two
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool npot_;
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether this texture has ever been bound.
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool has_been_bound_;
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The number of framebuffers this texture is attached to.
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int framebuffer_attachment_count_;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether the texture is immutable and no further changes to the format
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // or dimensions of the texture object can be made.
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool immutable_;
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Whether or not this texture has images.
3828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool has_images_;
3838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Size in bytes this texture is assumed to take in memory.
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32 estimated_size_;
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
38790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Cache of the computed CanRenderCondition flag.
38890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CanRenderCondition can_render_condition_;
38990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Whether we have initialized TEXTURE_MAX_ANISOTROPY to 1.
391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool texture_max_anisotropy_initialized_;
392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Texture);
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
39690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This class represents a texture in a client context group. It's mostly 1:1
39790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// with a client id, though it can outlive the client id if it's still bound to
39890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// a FBO or another context when destroyed.
39990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Multiple TextureRef can point to the same texture with cross-context sharing.
40090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class GPU_EXPORT TextureRef : public base::RefCounted<TextureRef> {
40190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TextureRef(TextureManager* manager, GLuint client_id, Texture* texture);
40390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static scoped_refptr<TextureRef> Create(TextureManager* manager,
404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                          GLuint client_id,
40590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                          GLuint service_id);
4060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void AddObserver() { num_observers_++; }
4080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void RemoveObserver() { num_observers_--; }
4090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
41090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const Texture* texture() const { return texture_; }
41190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture() { return texture_; }
412868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GLuint client_id() const { return client_id_; }
41390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GLuint service_id() const { return texture_->service_id(); }
4140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  GLint num_observers() const { return num_observers_; }
41590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
41690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
41790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  friend class base::RefCounted<TextureRef>;
41890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  friend class Texture;
41990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  friend class TextureManager;
42090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
42190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ~TextureRef();
42290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const TextureManager* manager() const { return manager_; }
42390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TextureManager* manager() { return manager_; }
424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void reset_client_id() { client_id_ = 0; }
42590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
42690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TextureManager* manager_;
42790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture_;
428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GLuint client_id_;
4290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  GLint num_observers_;
43090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
43190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TextureRef);
43290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
43390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Holds data that is per gles2_cmd_decoder, but is related to to the
4353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// TextureManager.
4363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)struct DecoderTextureState {
4373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // total_texture_upload_time automatically initialized to 0 in default
4383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // constructor.
439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  explicit DecoderTextureState(bool texsubimage2d_faster_than_teximage2d)
440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      : tex_image_2d_failed(false),
441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        texture_upload_count(0),
442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        texsubimage2d_faster_than_teximage2d(
443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            texsubimage2d_faster_than_teximage2d) {}
4443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // This indicates all the following texSubImage2D calls that are part of the
4463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // failed texImage2D call should be ignored.
4473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool tex_image_2d_failed;
4483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Command buffer stats.
4503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  int texture_upload_count;
4513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::TimeDelta total_texture_upload_time;
4523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool texsubimage2d_faster_than_teximage2d;
4543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
4553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class keeps track of the textures and their sizes so we can do NPOT and
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// texture complete checking.
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// NOTE: To support shared resources an instance of this class will need to be
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// shared by multiple GLES2Decoders.
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GPU_EXPORT TextureManager {
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
463868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  class GPU_EXPORT DestructionObserver {
464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   public:
465868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DestructionObserver();
466868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    virtual ~DestructionObserver();
467868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
468868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Called in ~TextureManager.
469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    virtual void OnTextureManagerDestroying(TextureManager* manager) = 0;
470868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Called via ~TextureRef.
472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    virtual void OnTextureRefDestroying(TextureRef* texture) = 0;
473868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   private:
475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(DestructionObserver);
476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum DefaultAndBlackTextures {
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kTexture2D,
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kCubeMap,
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kExternalOES,
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kRectangleARB,
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kNumDefaultTextures
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TextureManager(MemoryTracker* memory_tracker,
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 FeatureInfo* feature_info,
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 GLsizei max_texture_size,
489c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                 GLsizei max_cube_map_texture_size,
490c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                 bool use_default_textures);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~TextureManager();
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void set_framebuffer_manager(FramebufferManager* manager) {
49490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    framebuffer_manager_ = manager;
49590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
49690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Init the texture manager.
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Initialize();
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Must call before destruction.
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Destroy(bool have_context);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the maximum number of levels.
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint MaxLevelsForTarget(GLenum target) const {
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (target) {
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_TEXTURE_2D:
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return  max_levels_;
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_TEXTURE_EXTERNAL_OES:
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 1;
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return max_cube_map_levels_;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the maximum size.
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei MaxSizeForTarget(GLenum target) const {
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (target) {
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_TEXTURE_2D:
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_TEXTURE_EXTERNAL_OES:
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return max_texture_size_;
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return max_cube_map_texture_size_;
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the maxium number of levels a texture of the given size can have.
52768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  static GLsizei ComputeMipMapCount(GLenum target,
52868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                    GLsizei width,
52968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                    GLsizei height,
53068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                    GLsizei depth);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks if a dimensions are valid for a given target.
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ValidForTarget(
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target, GLint level,
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei width, GLsizei height, GLsizei depth);
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if this texture meets all the GLES2 criteria for rendering.
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See section 3.8.2 of the GLES2 spec.
53990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool CanRender(const TextureRef* ref) const {
540868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return ref->texture()->CanRender(feature_info_.get());
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if mipmaps can be generated by GL.
54490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool CanGenerateMipmaps(const TextureRef* ref) const {
545868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return ref->texture()->CanGenerateMipmaps(feature_info_.get());
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets the Texture's target
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parameters:
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   target: GL_TEXTURE_2D or GL_TEXTURE_CUBE_MAP
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   max_levels: The maximum levels this type of target can have.
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetTarget(
55390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      TextureRef* ref,
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the info for a particular level in a TexureInfo.
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetLevelInfo(
55890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      TextureRef* ref,
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target,
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint level,
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum internal_format,
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei width,
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei height,
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei depth,
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint border,
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum format,
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum type,
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool cleared);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Adapter to call above function.
57190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void SetLevelInfoFromParams(TextureRef* ref,
572b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                              const gpu::AsyncTexImage2DParams& params) {
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetLevelInfo(
57490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        ref, params.target, params.level, params.internal_format,
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        params.width, params.height, 1 /* depth */,
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        params.border, params.format,
577116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        params.type, true /* cleared */);
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
580868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Texture* Produce(TextureRef* ref);
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
582868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Maps an existing texture into the texture manager, at a given client ID.
583868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TextureRef* Consume(GLuint client_id, Texture* texture);
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets a mip as cleared.
58690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void SetLevelCleared(TextureRef* ref, GLenum target,
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       GLint level, bool cleared);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets a texture parameter of a Texture
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns GL_NO_ERROR on success. Otherwise the error to generate.
591a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // TODO(gman): Expand to SetParameteriv,fv
592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void SetParameteri(
593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const char* function_name, ErrorState* error_state,
59490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      TextureRef* ref, GLenum pname, GLint param);
595a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void SetParameterf(
596a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const char* function_name, ErrorState* error_state,
597a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      TextureRef* ref, GLenum pname, GLfloat param);
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Makes each of the mip levels as though they were generated.
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if that's not allowed for the given texture.
60190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool MarkMipmapsGenerated(TextureRef* ref);
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clears any uncleared renderable levels.
60490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool ClearRenderableLevels(GLES2Decoder* decoder, TextureRef* ref);
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear a specific level.
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ClearTextureLevel(
60890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GLES2Decoder* decoder, TextureRef* ref, GLenum target, GLint level);
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a new texture info.
61190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TextureRef* CreateTexture(GLuint client_id, GLuint service_id);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the texture info for the given texture.
61490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TextureRef* GetTexture(GLuint client_id) const;
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes a texture info.
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RemoveTexture(GLuint client_id);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Gets a Texture for a given service id (note: it assumes the texture object
620868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // is still mapped in this TextureManager).
621868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Texture* GetTextureForServiceId(GLuint service_id) const;
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TextureRef* GetDefaultTextureInfo(GLenum target) {
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (target) {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_TEXTURE_2D:
626868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        return default_textures_[kTexture2D].get();
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_TEXTURE_CUBE_MAP:
628868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        return default_textures_[kCubeMap].get();
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_TEXTURE_EXTERNAL_OES:
630868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        return default_textures_[kExternalOES].get();
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_TEXTURE_RECTANGLE_ARB:
632868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        return default_textures_[kRectangleARB].get();
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return NULL;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HaveUnrenderableTextures() const {
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return num_unrenderable_textures_ > 0;
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HaveUnsafeTextures() const {
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return num_unsafe_textures_ > 0;
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HaveUnclearedMips() const {
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return num_uncleared_mips_ > 0;
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool HaveImages() const {
6528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return num_images_ > 0;
6538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
6548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint black_texture_id(GLenum target) const {
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (target) {
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_SAMPLER_2D:
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return black_texture_ids_[kTexture2D];
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_SAMPLER_CUBE:
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return black_texture_ids_[kCubeMap];
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_SAMPLER_EXTERNAL_OES:
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return black_texture_ids_[kExternalOES];
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_SAMPLER_2D_RECT_ARB:
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return black_texture_ids_[kRectangleARB];
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t mem_represented() const {
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        memory_tracker_managed_->GetMemRepresented() +
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        memory_tracker_unmanaged_->GetMemRepresented();
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetLevelImage(
67890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      TextureRef* ref,
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target,
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint level,
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::GLImage* image);
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddToSignature(
68490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      TextureRef* ref,
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target,
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint level,
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string* signature) const;
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
689868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void AddObserver(DestructionObserver* observer) {
6900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    destruction_observers_.push_back(observer);
691868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
692868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
693868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void RemoveObserver(DestructionObserver* observer) {
6940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    for (unsigned int i = 0; i < destruction_observers_.size(); i++) {
6950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      if (destruction_observers_[i] == observer) {
6960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        std::swap(destruction_observers_[i], destruction_observers_.back());
6970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        destruction_observers_.pop_back();
6980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        return;
6990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      }
7000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
7010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    NOTREACHED();
702868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
703868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
7043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  struct DoTextImage2DArguments {
7053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    GLenum target;
7063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    GLint level;
7073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    GLenum internal_format;
7083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    GLsizei width;
7093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    GLsizei height;
7103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    GLint border;
7113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    GLenum format;
7123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    GLenum type;
7133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const void* pixels;
7143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    uint32 pixels_size;
7153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  };
7163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool ValidateTexImage2D(
7183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ContextState* state,
7193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const char* function_name,
7203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const DoTextImage2DArguments& args,
7213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Pointer to TextureRef filled in if validation successful.
7223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Presumes the pointer is valid.
7233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    TextureRef** texture_ref);
7243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void ValidateAndDoTexImage2D(
7263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DecoderTextureState* texture_state,
7273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ContextState* state,
7283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DecoderFramebufferState* framebuffer_state,
7293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const DoTextImage2DArguments& args);
7303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // TODO(kloveless): Make GetTexture* private once this is no longer called
7323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // from gles2_cmd_decoder.
7333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  TextureRef* GetTextureInfoForTarget(ContextState* state, GLenum target);
7343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  TextureRef* GetTextureInfoForTargetUnlessDefault(
7353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      ContextState* state, GLenum target);
7363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool ValidateFormatAndTypeCombination(
7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ErrorState* error_state, const char* function_name,
7395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLenum format, GLenum type);
7405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Note that internal_format is only checked in relation to the format
7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // parameter, so that this function may be used to validate texSubImage2D.
7433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool ValidateTextureParameters(
7443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ErrorState* error_state, const char* function_name,
7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GLenum format, GLenum type, GLenum internal_format, GLint level);
7463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class Texture;
74990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  friend class TextureRef;
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper for Initialize().
75290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<TextureRef> CreateDefaultAndBlackTextures(
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target,
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint* black_texture);
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void DoTexImage2D(
7573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DecoderTextureState* texture_state,
7583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ErrorState* error_state,
7593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DecoderFramebufferState* framebuffer_state,
7603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    TextureRef* texture_ref,
7613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const DoTextImage2DArguments& args);
7623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
76390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void StartTracking(TextureRef* texture);
76490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void StopTracking(TextureRef* texture);
76590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
76690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void UpdateSafeToRenderFrom(int delta);
76790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void UpdateUnclearedMips(int delta);
76890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void UpdateCanRenderCondition(Texture::CanRenderCondition old_condition,
76990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                Texture::CanRenderCondition new_condition);
7708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  void UpdateNumImages(int delta);
77190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void IncFramebufferStateChangeCount();
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MemoryTypeTracker* GetMemTracker(GLenum texture_pool);
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<MemoryTypeTracker> memory_tracker_managed_;
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<MemoryTypeTracker> memory_tracker_unmanaged_;
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FeatureInfo> feature_info_;
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  FramebufferManager* framebuffer_manager_;
78090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Info for each texture in the system.
78290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  typedef base::hash_map<GLuint, scoped_refptr<TextureRef> > TextureMap;
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TextureMap textures_;
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei max_texture_size_;
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei max_cube_map_texture_size_;
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint max_levels_;
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint max_cube_map_levels_;
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
790c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const bool use_default_textures_;
791c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_unrenderable_textures_;
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_unsafe_textures_;
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_uncleared_mips_;
7958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  int num_images_;
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Counts the number of Textures allocated with 'this' as its manager.
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Allows to check no Texture will outlive this.
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  unsigned int texture_count_;
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool have_context_;
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Black (0,0,0,1) textures for when non-renderable textures are used.
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // NOTE: There is no corresponding Texture for these textures.
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TextureInfos are only for textures the client side can access.
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint black_texture_ids_[kNumDefaultTextures];
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The default textures for each target (texture name = 0)
80990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<TextureRef> default_textures_[kNumDefaultTextures];
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::vector<DestructionObserver*> destruction_observers_;
812868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TextureManager);
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// This class records texture upload time when in scope.
8173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class ScopedTextureUploadTimer {
8183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
8193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  explicit ScopedTextureUploadTimer(DecoderTextureState* texture_state);
8203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ~ScopedTextureUploadTimer();
8213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
8223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
8233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DecoderTextureState* texture_state_;
8243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::TimeTicks begin_time_;
8253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScopedTextureUploadTimer);
8263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
8273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // GPU_COMMAND_BUFFER_SERVICE_TEXTURE_MANAGER_H_
832