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)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <list>
990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <set>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/observer_list.h"
17b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "gpu/command_buffer/service/async_pixel_transfer_delegate.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gl_utils.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/memory_tracking.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/gpu_export.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_image.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass StreamTextureManager;
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLES2Decoder;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Display;
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ErrorState;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FeatureInfo;
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class FramebufferManager;
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class MailboxManager;
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TextureManager;
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class TextureRef;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Info about Textures currently in the system.
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This class wraps a real GL texture, keeping track of its meta-data. It is
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// jointly owned by possibly multiple TextureRef.
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class GPU_EXPORT Texture {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  explicit Texture(GLuint service_id);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum min_filter() const {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return min_filter_;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum mag_filter() const {
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return mag_filter_;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum wrap_s() const {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return wrap_s_;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum wrap_t() const {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return wrap_t_;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum usage() const {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return usage_;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum pool() const {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return pool_;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_uncleared_mips() const {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return num_uncleared_mips_;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32 estimated_size() const {
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return estimated_size_;
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool CanRenderTo() const {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return !stream_texture_ && target_ != GL_TEXTURE_EXTERNAL_OES;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The service side OpenGL id of the texture.
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLuint service_id() const {
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return service_id_;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetServiceId(GLuint service_id) {
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DCHECK(service_id);
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    service_id_ = service_id;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the target this texure was first bound to or 0 if it has not
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // been bound. Once a texture is bound to a specific target it can never be
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // bound to a different target.
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum target() const {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return target_;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool SafeToRenderFrom() const {
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return cleared_;
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Get the width and height for a particular level. Returns false if level
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // does not exist.
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool GetLevelSize(
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLint target, GLint level, GLsizei* width, GLsizei* height) const;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Get the type of a level. Returns false if level does not exist.
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool GetLevelType(
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLint target, GLint level, GLenum* type, GLenum* internal_format) const;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Get the image bound to a particular level. Returns NULL if level
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // does not exist.
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::GLImage* GetLevelImage(GLint target, GLint level) const;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true of the given dimensions are inside the dimensions of the
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // level and if the format and type match the level.
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool ValidForTexture(
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLint target,
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLint level,
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLint xoffset,
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLint yoffset,
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLsizei width,
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLsizei height,
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLenum format,
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLenum type) const;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsValid() const {
12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return !!target();
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsAttachedToFramebuffer() const {
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return framebuffer_attachment_count_ != 0;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AttachToFramebuffer() {
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++framebuffer_attachment_count_;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DetachFromFramebuffer() {
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_GT(framebuffer_attachment_count_, 0);
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    --framebuffer_attachment_count_;
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool IsStreamTexture() const {
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return stream_texture_;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetImmutable(bool immutable) {
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    immutable_ = immutable;
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool IsImmutable() const {
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return immutable_;
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether a particular level/face is cleared.
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsLevelCleared(GLenum target, GLint level) const;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether the texture has been defined
16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool IsDefined() const {
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return estimated_size() > 0;
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  friend class MailboxManager;
1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  friend class MailboxManagerTest;
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class TextureManager;
16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  friend class TextureRef;
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  friend class TextureTestHelper;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~Texture();
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void AddTextureRef(TextureRef* ref);
17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void RemoveTextureRef(TextureRef* ref, bool have_context);
17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MemoryTypeTracker* GetMemTracker();
17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Condition on which this texture is renderable. Can be ONLY_IF_NPOT if it
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // depends on context support for non-power-of-two textures (i.e. will be
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // renderable if NPOT support is in the context, otherwise not, e.g. texture
17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // with a NPOT level). ALWAYS means it doesn't depend on context features
18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // (e.g. complete POT), NEVER means it's not renderable regardless (e.g.
18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // incomplete).
18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  enum CanRenderCondition {
18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    CAN_RENDER_ALWAYS,
18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    CAN_RENDER_NEVER,
18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    CAN_RENDER_ONLY_IF_NPOT
18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  };
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct LevelInfo {
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LevelInfo();
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LevelInfo(const LevelInfo& rhs);
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~LevelInfo();
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool cleared;
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLenum target;
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLint level;
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLenum internal_format;
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLsizei width;
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLsizei height;
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLsizei depth;
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLint border;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLenum format;
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLenum type;
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<gfx::GLImage> image;
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    uint32 estimated_size;
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the info for a particular level.
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetLevelInfo(
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FeatureInfo* feature_info,
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLenum target,
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLint level,
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLenum internal_format,
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLsizei width,
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLsizei height,
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLsizei depth,
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLint border,
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLenum format,
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLenum type,
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool cleared);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // In GLES2 "texture complete" means it has all required mips for filtering
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // down to a 1x1 pixel texture, they are in the correct order, they are all
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the same format.
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool texture_complete() const {
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return texture_complete_;
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // In GLES2 "cube complete" means all 6 faces level 0 are defined, all the
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // same format, all the same dimensions and all width = height.
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool cube_complete() const {
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return cube_complete_;
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Whether or not this texture is a non-power-of-two texture.
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool npot() const {
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return npot_;
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void SetStreamTexture(bool stream_texture) {
24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    stream_texture_ = stream_texture;
24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    UpdateCanRenderCondition();
24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Marks a particular level as cleared or uncleared.
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetLevelCleared(GLenum target, GLint level, bool cleared);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Updates the cleared flag for this texture by inspecting all the mips.
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateCleared();
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Clears any renderable uncleared levels.
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns false if a GL error was generated.
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool ClearRenderableLevels(GLES2Decoder* decoder);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Clears the level.
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns false if a GL error was generated.
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool ClearLevel(GLES2Decoder* decoder, GLenum target, GLint level);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets a texture parameter.
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(gman): Expand to SetParameteri,f,iv,fv
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns GL_NO_ERROR on success. Otherwise the error to generate.
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum SetParameter(
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FeatureInfo* feature_info, GLenum pname, GLint param);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Makes each of the mip levels as though they were generated.
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool MarkMipmapsGenerated(const FeatureInfo* feature_info);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool NeedsMips() const {
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return min_filter_ != GL_NEAREST && min_filter_ != GL_LINEAR;
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // True if this texture meets all the GLES2 criteria for rendering.
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // See section 3.8.2 of the GLES2 spec.
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool CanRender(const FeatureInfo* feature_info) const;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if mipmaps can be generated by GL.
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool CanGenerateMipmaps(const FeatureInfo* feature_info) const;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets the Texture's target
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Parameters:
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //   target: GL_TEXTURE_2D or GL_TEXTURE_CUBE_MAP or
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //           GL_TEXTURE_EXTERNAL_OES or GL_TEXTURE_RECTANGLE_ARB
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //   max_levels: The maximum levels this type of target can have.
28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void SetTarget(
28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      const FeatureInfo* feature_info, GLenum target, GLint max_levels);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Update info about this texture.
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Update(const FeatureInfo* feature_info);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the image for a particular level.
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetLevelImage(
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FeatureInfo* feature_info,
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLenum target,
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLint level,
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::GLImage* image);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Appends a signature for the given level.
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddToSignature(
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FeatureInfo* feature_info,
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLenum target, GLint level, std::string* signature) const;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void SetMailboxManager(MailboxManager* mailbox_manager);
302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Updates the unsafe textures count in all the managers referencing this
30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // texture.
30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void UpdateSafeToRenderFrom(bool cleared);
30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Updates the uncleared mip count in all the managers referencing this
30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // texture.
30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void UpdateMipCleared(LevelInfo* info, bool cleared);
31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Computes the CanRenderCondition flag.
31290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CanRenderCondition GetCanRenderCondition() const;
31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Updates the unrenderable texture count in all the managers referencing this
31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // texture.
31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void UpdateCanRenderCondition();
31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Increment the framebuffer state change count in all the managers
31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // referencing this texture.
32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void IncAllFramebufferStateChangeCount();
32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MailboxManager* mailbox_manager_;
323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Info about each face and level of texture.
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::vector<LevelInfo> > level_infos_;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The texture refs that point to this Texture.
32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  typedef std::set<TextureRef*> RefSet;
32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  RefSet refs_;
33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The single TextureRef that accounts for memory for this texture. Must be
33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // one of refs_.
33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TextureRef* memory_tracking_ref_;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The id of the texure
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLuint service_id_;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether all renderable mips of this texture have been cleared.
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool cleared_;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_uncleared_mips_;
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The target. 0 if unset, otherwise GL_TEXTURE_2D or GL_TEXTURE_CUBE_MAP.
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum target_;
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Texture parameters.
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum min_filter_;
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum mag_filter_;
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum wrap_s_;
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum wrap_t_;
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum usage_;
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum pool_;
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The maximum level that has been set.
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLint max_level_set_;
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether or not this texture is "texture complete"
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool texture_complete_;
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether or not this texture is "cube complete"
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool cube_complete_;
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether or not this texture is non-power-of-two
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool npot_;
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether this texture has ever been bound.
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool has_been_bound_;
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The number of framebuffers this texture is attached to.
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int framebuffer_attachment_count_;
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether this is a special streaming texture.
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool stream_texture_;
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether the texture is immutable and no further changes to the format
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // or dimensions of the texture object can be made.
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool immutable_;
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Size in bytes this texture is assumed to take in memory.
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32 estimated_size_;
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
38290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Cache of the computed CanRenderCondition flag.
38390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CanRenderCondition can_render_condition_;
38490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Texture);
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
38890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This class represents a texture in a client context group. It's mostly 1:1
38990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// with a client id, though it can outlive the client id if it's still bound to
39090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// a FBO or another context when destroyed.
39190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Multiple TextureRef can point to the same texture with cross-context sharing.
392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch//
393eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Note: for stream textures, the TextureRef that created the stream texture is
394eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// set as the "owner" of the stream texture, i.e. it will call
395eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// DestroyStreamTexture on destruction. This is because the StreamTextureManager
396eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// isn't generally shared between ContextGroups, so ownership can't be at the
397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Texture level. We also can't have multiple StreamTexture on the same service
398eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// id, so there can be only one owner.
39990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class GPU_EXPORT TextureRef : public base::RefCounted<TextureRef> {
40090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
401868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TextureRef(TextureManager* manager, GLuint client_id, Texture* texture);
40290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static scoped_refptr<TextureRef> Create(TextureManager* manager,
403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                          GLuint client_id,
40490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                          GLuint service_id);
40590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const Texture* texture() const { return texture_; }
40690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture() { return texture_; }
407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GLuint client_id() const { return client_id_; }
40890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GLuint service_id() const { return texture_->service_id(); }
40990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
41090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
41190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  friend class base::RefCounted<TextureRef>;
41290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  friend class Texture;
41390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  friend class TextureManager;
41490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
41590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ~TextureRef();
41690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const TextureManager* manager() const { return manager_; }
41790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TextureManager* manager() { return manager_; }
418868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void reset_client_id() { client_id_ = 0; }
419eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void set_is_stream_texture_owner(bool owner) {
420eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    is_stream_texture_owner_ = owner;
421eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
422eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool is_stream_texture_owner() const { return is_stream_texture_owner_; }
42390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
42490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TextureManager* manager_;
42590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Texture* texture_;
426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GLuint client_id_;
427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool is_stream_texture_owner_;
42890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
42990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TextureRef);
43090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
43190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class keeps track of the textures and their sizes so we can do NPOT and
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// texture complete checking.
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// NOTE: To support shared resources an instance of this class will need to be
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// shared by multiple GLES2Decoders.
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GPU_EXPORT TextureManager {
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  class GPU_EXPORT DestructionObserver {
440868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   public:
441868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DestructionObserver();
442868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    virtual ~DestructionObserver();
443868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
444868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Called in ~TextureManager.
445868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    virtual void OnTextureManagerDestroying(TextureManager* manager) = 0;
446868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
447868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Called via ~TextureRef.
448868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    virtual void OnTextureRefDestroying(TextureRef* texture) = 0;
449868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
450868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   private:
451868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(DestructionObserver);
452868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum DefaultAndBlackTextures {
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kTexture2D,
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kCubeMap,
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kExternalOES,
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kRectangleARB,
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kNumDefaultTextures
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TextureManager(MemoryTracker* memory_tracker,
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 FeatureInfo* feature_info,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 GLsizei max_texture_size,
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 GLsizei max_cube_map_texture_size);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~TextureManager();
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void set_framebuffer_manager(FramebufferManager* manager) {
46990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    framebuffer_manager_ = manager;
47090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
47190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
472eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void set_stream_texture_manager(StreamTextureManager* manager) {
473eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    stream_texture_manager_ = manager;
474eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
475eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Init the texture manager.
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Initialize();
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Must call before destruction.
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Destroy(bool have_context);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the maximum number of levels.
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint MaxLevelsForTarget(GLenum target) const {
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (target) {
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_TEXTURE_2D:
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return  max_levels_;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_TEXTURE_EXTERNAL_OES:
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 1;
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return max_cube_map_levels_;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the maximum size.
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei MaxSizeForTarget(GLenum target) const {
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (target) {
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_TEXTURE_2D:
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_TEXTURE_EXTERNAL_OES:
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return max_texture_size_;
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return max_cube_map_texture_size_;
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the maxium number of levels a texture of the given size can have.
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static GLsizei ComputeMipMapCount(
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei width, GLsizei height, GLsizei depth);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks if a dimensions are valid for a given target.
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ValidForTarget(
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target, GLint level,
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei width, GLsizei height, GLsizei depth);
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if this texture meets all the GLES2 criteria for rendering.
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See section 3.8.2 of the GLES2 spec.
51690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool CanRender(const TextureRef* ref) const {
517868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return ref->texture()->CanRender(feature_info_.get());
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if mipmaps can be generated by GL.
52190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool CanGenerateMipmaps(const TextureRef* ref) const {
522868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return ref->texture()->CanGenerateMipmaps(feature_info_.get());
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets the Texture's target
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parameters:
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   target: GL_TEXTURE_2D or GL_TEXTURE_CUBE_MAP
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   max_levels: The maximum levels this type of target can have.
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetTarget(
53090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      TextureRef* ref,
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
533eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Marks a texture as a stream texture, and the ref as the stream texture
534eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // owner.
53590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void SetStreamTexture(TextureRef* ref, bool stream_texture);
53690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
537eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Whether the TextureRef is the stream texture owner.
538eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool IsStreamTextureOwner(TextureRef* ref);
539eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the info for a particular level in a TexureInfo.
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetLevelInfo(
54290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      TextureRef* ref,
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target,
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint level,
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum internal_format,
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei width,
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei height,
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei depth,
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint border,
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum format,
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum type,
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool cleared);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Adapter to call above function.
55590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void SetLevelInfoFromParams(TextureRef* ref,
556b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                              const gpu::AsyncTexImage2DParams& params) {
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetLevelInfo(
55890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        ref, params.target, params.level, params.internal_format,
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        params.width, params.height, 1 /* depth */,
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        params.border, params.format,
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        params.type, true /* cleared */ );
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Texture* Produce(TextureRef* ref);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Maps an existing texture into the texture manager, at a given client ID.
567868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TextureRef* Consume(GLuint client_id, Texture* texture);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets a mip as cleared.
57090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void SetLevelCleared(TextureRef* ref, GLenum target,
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       GLint level, bool cleared);
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets a texture parameter of a Texture
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns GL_NO_ERROR on success. Otherwise the error to generate.
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(gman): Expand to SetParameteri,f,iv,fv
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetParameter(
577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const char* function_name, ErrorState* error_state,
57890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      TextureRef* ref, GLenum pname, GLint param);
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Makes each of the mip levels as though they were generated.
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if that's not allowed for the given texture.
58290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool MarkMipmapsGenerated(TextureRef* ref);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clears any uncleared renderable levels.
58590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool ClearRenderableLevels(GLES2Decoder* decoder, TextureRef* ref);
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear a specific level.
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ClearTextureLevel(
58990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GLES2Decoder* decoder, TextureRef* ref, GLenum target, GLint level);
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a new texture info.
59290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TextureRef* CreateTexture(GLuint client_id, GLuint service_id);
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the texture info for the given texture.
59590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TextureRef* GetTexture(GLuint client_id) const;
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes a texture info.
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RemoveTexture(GLuint client_id);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
600868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Gets a Texture for a given service id (note: it assumes the texture object
601868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // is still mapped in this TextureManager).
602868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Texture* GetTextureForServiceId(GLuint service_id) const;
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TextureRef* GetDefaultTextureInfo(GLenum target) {
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (target) {
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_TEXTURE_2D:
607868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        return default_textures_[kTexture2D].get();
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_TEXTURE_CUBE_MAP:
609868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        return default_textures_[kCubeMap].get();
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_TEXTURE_EXTERNAL_OES:
611868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        return default_textures_[kExternalOES].get();
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_TEXTURE_RECTANGLE_ARB:
613868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        return default_textures_[kRectangleARB].get();
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return NULL;
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HaveUnrenderableTextures() const {
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return num_unrenderable_textures_ > 0;
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HaveUnsafeTextures() const {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return num_unsafe_textures_ > 0;
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HaveUnclearedMips() const {
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return num_uncleared_mips_ > 0;
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint black_texture_id(GLenum target) const {
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (target) {
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_SAMPLER_2D:
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return black_texture_ids_[kTexture2D];
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_SAMPLER_CUBE:
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return black_texture_ids_[kCubeMap];
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_SAMPLER_EXTERNAL_OES:
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return black_texture_ids_[kExternalOES];
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GL_SAMPLER_2D_RECT_ARB:
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return black_texture_ids_[kRectangleARB];
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t mem_represented() const {
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        memory_tracker_managed_->GetMemRepresented() +
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        memory_tracker_unmanaged_->GetMemRepresented();
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetLevelImage(
65590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      TextureRef* ref,
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target,
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint level,
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::GLImage* image);
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddToSignature(
66190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      TextureRef* ref,
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target,
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint level,
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string* signature) const;
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
666868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void AddObserver(DestructionObserver* observer) {
667868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    destruction_observers_.AddObserver(observer);
668868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
669868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
670868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void RemoveObserver(DestructionObserver* observer) {
671868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    destruction_observers_.RemoveObserver(observer);
672868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
673868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class Texture;
67690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  friend class TextureRef;
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper for Initialize().
67990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<TextureRef> CreateDefaultAndBlackTextures(
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target,
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint* black_texture);
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void StartTracking(TextureRef* texture);
68490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void StopTracking(TextureRef* texture);
68590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
68690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void UpdateSafeToRenderFrom(int delta);
68790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void UpdateUnclearedMips(int delta);
68890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void UpdateCanRenderCondition(Texture::CanRenderCondition old_condition,
68990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                Texture::CanRenderCondition new_condition);
69090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void IncFramebufferStateChangeCount();
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MemoryTypeTracker* GetMemTracker(GLenum texture_pool);
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<MemoryTypeTracker> memory_tracker_managed_;
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<MemoryTypeTracker> memory_tracker_unmanaged_;
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FeatureInfo> feature_info_;
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  FramebufferManager* framebuffer_manager_;
699eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  StreamTextureManager* stream_texture_manager_;
70090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Info for each texture in the system.
70290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  typedef base::hash_map<GLuint, scoped_refptr<TextureRef> > TextureMap;
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TextureMap textures_;
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei max_texture_size_;
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei max_cube_map_texture_size_;
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint max_levels_;
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint max_cube_map_levels_;
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_unrenderable_textures_;
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_unsafe_textures_;
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_uncleared_mips_;
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Counts the number of Textures allocated with 'this' as its manager.
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Allows to check no Texture will outlive this.
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  unsigned int texture_count_;
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool have_context_;
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Black (0,0,0,1) textures for when non-renderable textures are used.
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // NOTE: There is no corresponding Texture for these textures.
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TextureInfos are only for textures the client side can access.
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint black_texture_ids_[kNumDefaultTextures];
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The default textures for each target (texture name = 0)
72690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<TextureRef> default_textures_[kNumDefaultTextures];
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ObserverList<DestructionObserver> destruction_observers_;
729868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TextureManager);
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // GPU_COMMAND_BUFFER_SERVICE_TEXTURE_MANAGER_H_
737