1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef GPU_COMMAND_BUFFER_SERVICE_TEXTURE_DEFINITION_H_
6#define GPU_COMMAND_BUFFER_SERVICE_TEXTURE_DEFINITION_H_
7
8#include <vector>
9
10#include "base/memory/ref_counted.h"
11#include "gpu/command_buffer/service/gl_utils.h"
12
13namespace gfx {
14class GLImage;
15}
16
17namespace gpu {
18namespace gles2 {
19
20class Texture;
21
22class NativeImageBuffer : public base::RefCountedThreadSafe<NativeImageBuffer> {
23 public:
24  static scoped_refptr<NativeImageBuffer> Create(GLuint texture_id);
25
26  virtual void AddClient(gfx::GLImage* client) = 0;
27  virtual void RemoveClient(gfx::GLImage* client) = 0;
28  virtual bool IsClient(gfx::GLImage* client) = 0;
29  virtual void BindToTexture(GLenum target) = 0;
30
31 protected:
32  friend class base::RefCountedThreadSafe<NativeImageBuffer>;
33  NativeImageBuffer() {}
34  virtual ~NativeImageBuffer() {}
35
36  DISALLOW_COPY_AND_ASSIGN(NativeImageBuffer);
37};
38
39// An immutable description that can be used to create a texture that shares
40// the underlying image buffer(s).
41class TextureDefinition {
42 public:
43  TextureDefinition(GLenum target,
44                    Texture* texture,
45                    unsigned int version,
46                    const scoped_refptr<NativeImageBuffer>& image);
47  virtual ~TextureDefinition();
48
49  Texture* CreateTexture() const;
50  void UpdateTexture(Texture* texture) const;
51
52  unsigned int version() const { return version_; }
53  bool IsOlderThan(unsigned int version) const {
54    return (version - version_) < 0x80000000;
55  }
56  bool Matches(const Texture* texture) const;
57
58  scoped_refptr<NativeImageBuffer> image() { return image_buffer_; }
59
60 private:
61  struct LevelInfo {
62    LevelInfo(GLenum target,
63              GLenum internal_format,
64              GLsizei width,
65              GLsizei height,
66              GLsizei depth,
67              GLint border,
68              GLenum format,
69              GLenum type,
70              bool cleared);
71    ~LevelInfo();
72
73    GLenum target;
74    GLenum internal_format;
75    GLsizei width;
76    GLsizei height;
77    GLsizei depth;
78    GLint border;
79    GLenum format;
80    GLenum type;
81    bool cleared;
82  };
83
84  typedef std::vector<std::vector<LevelInfo> > LevelInfos;
85
86  unsigned int version_;
87  GLenum target_;
88  scoped_refptr<NativeImageBuffer> image_buffer_;
89  GLenum min_filter_;
90  GLenum mag_filter_;
91  GLenum wrap_s_;
92  GLenum wrap_t_;
93  GLenum usage_;
94  bool immutable_;
95  LevelInfos level_infos_;
96};
97
98}  // namespage gles2
99}  // namespace gpu
100
101#endif  // GPU_COMMAND_BUFFER_SERVICE_TEXTURE_DEFINITION_H_
102