OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef GPU_COMMAND_BUFFER_SERVICE_TEXTURE_MANAGER_H_ | 5 #ifndef GPU_COMMAND_BUFFER_SERVICE_TEXTURE_MANAGER_H_ |
6 #define GPU_COMMAND_BUFFER_SERVICE_TEXTURE_MANAGER_H_ | 6 #define GPU_COMMAND_BUFFER_SERVICE_TEXTURE_MANAGER_H_ |
7 | 7 |
8 #include <vector> | 8 #include <vector> |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/hash_tables.h" | 10 #include "base/hash_tables.h" |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "base/memory/ref_counted.h" | 12 #include "base/memory/ref_counted.h" |
| 13 #include "base/memory/weak_ptr.h" |
13 #include "gpu/command_buffer/service/gl_utils.h" | 14 #include "gpu/command_buffer/service/gl_utils.h" |
14 | 15 |
15 namespace gpu { | 16 namespace gpu { |
16 namespace gles2 { | 17 namespace gles2 { |
17 | 18 |
18 class FeatureInfo; | 19 class FeatureInfo; |
19 | 20 |
20 // This class keeps track of the textures and their sizes so we can do NPOT and | 21 // This class keeps track of the textures and their sizes so we can do NPOT and |
21 // texture complete checking. | 22 // texture complete checking. |
22 // | 23 // |
23 // NOTE: To support shared resources an instance of this class will need to be | 24 // NOTE: To support shared resources an instance of this class will need to be |
24 // shared by multiple GLES2Decoders. | 25 // shared by multiple GLES2Decoders. |
25 class TextureManager { | 26 class TextureManager : public base::SupportsWeakPtr<TextureManager> { |
26 public: | 27 public: |
27 // Info about Textures currently in the system. | 28 // Info about Textures currently in the system. |
28 class TextureInfo : public base::RefCounted<TextureInfo> { | 29 class TextureInfo : public base::RefCounted<TextureInfo> { |
29 public: | 30 public: |
30 typedef scoped_refptr<TextureInfo> Ref; | 31 typedef scoped_refptr<TextureInfo> Ref; |
31 | 32 |
32 explicit TextureInfo(GLuint service_id) | 33 explicit TextureInfo(GLuint service_id) |
33 : service_id_(service_id), | 34 : service_id_(service_id), |
34 deleted_(false), | 35 deleted_(false), |
35 target_(0), | 36 target_(0), |
36 min_filter_(GL_NEAREST_MIPMAP_LINEAR), | 37 min_filter_(GL_NEAREST_MIPMAP_LINEAR), |
37 mag_filter_(GL_LINEAR), | 38 mag_filter_(GL_LINEAR), |
38 wrap_s_(GL_REPEAT), | 39 wrap_s_(GL_REPEAT), |
39 wrap_t_(GL_REPEAT), | 40 wrap_t_(GL_REPEAT), |
40 max_level_set_(-1), | 41 max_level_set_(-1), |
41 texture_complete_(false), | 42 texture_complete_(false), |
42 cube_complete_(false), | 43 cube_complete_(false), |
43 npot_(false), | 44 npot_(false), |
44 has_been_bound_(false), | 45 has_been_bound_(false), |
45 framebuffer_attachment_count_(0), | 46 framebuffer_attachment_count_(0) { |
46 owned_(true) { | |
47 } | 47 } |
48 | 48 |
49 GLenum min_filter() const { | 49 GLenum min_filter() const { |
50 return min_filter_; | 50 return min_filter_; |
51 } | 51 } |
52 | 52 |
53 GLenum mag_filter() const { | 53 GLenum mag_filter() const { |
54 return mag_filter_; | 54 return mag_filter_; |
55 } | 55 } |
56 | 56 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 // same format, all the same dimensions and all width = height. | 89 // same format, all the same dimensions and all width = height. |
90 bool cube_complete() const { | 90 bool cube_complete() const { |
91 return cube_complete_; | 91 return cube_complete_; |
92 } | 92 } |
93 | 93 |
94 // Whether or not this texture is a non-power-of-two texture. | 94 // Whether or not this texture is a non-power-of-two texture. |
95 bool npot() const { | 95 bool npot() const { |
96 return npot_; | 96 return npot_; |
97 } | 97 } |
98 | 98 |
| 99 TextureManager* owner() const { |
| 100 return owner_.get(); |
| 101 } |
| 102 |
99 // Returns true if mipmaps can be generated by GL. | 103 // Returns true if mipmaps can be generated by GL. |
100 bool CanGenerateMipmaps(const FeatureInfo* feature_info) const; | 104 bool CanGenerateMipmaps(const FeatureInfo* feature_info) const; |
101 | 105 |
102 // Get the width and height for a particular level. Returns false if level | 106 // Get the width and height for a particular level. Returns false if level |
103 // does not exist. | 107 // does not exist. |
104 bool GetLevelSize( | 108 bool GetLevelSize( |
105 GLint face, GLint level, GLsizei* width, GLsizei* height) const; | 109 GLint face, GLint level, GLsizei* width, GLsizei* height) const; |
106 | 110 |
107 // Get the type of a level. Returns false if level does not exist. | 111 // Get the type of a level. Returns false if level does not exist. |
108 bool GetLevelType( | 112 bool GetLevelType( |
(...skipping 12 matching lines...) Expand all Loading... |
121 GLint yoffset, | 125 GLint yoffset, |
122 GLsizei width, | 126 GLsizei width, |
123 GLsizei height, | 127 GLsizei height, |
124 GLenum format, | 128 GLenum format, |
125 GLenum type) const; | 129 GLenum type) const; |
126 | 130 |
127 bool IsValid() const { | 131 bool IsValid() const { |
128 return target() && !IsDeleted(); | 132 return target() && !IsDeleted(); |
129 } | 133 } |
130 | 134 |
131 void SetNotOwned() { | |
132 owned_ = false; | |
133 } | |
134 | |
135 bool IsAttachedToFramebuffer() const { | 135 bool IsAttachedToFramebuffer() const { |
136 return framebuffer_attachment_count_ != 0; | 136 return framebuffer_attachment_count_ != 0; |
137 } | 137 } |
138 | 138 |
139 void AttachToFramebuffer() { | 139 void AttachToFramebuffer() { |
140 ++framebuffer_attachment_count_; | 140 ++framebuffer_attachment_count_; |
141 } | 141 } |
142 | 142 |
143 void DetachFromFramebuffer() { | 143 void DetachFromFramebuffer() { |
144 DCHECK(framebuffer_attachment_count_ > 0); | 144 DCHECK(framebuffer_attachment_count_ > 0); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 | 243 |
244 // Whether or not this texture is non-power-of-two | 244 // Whether or not this texture is non-power-of-two |
245 bool npot_; | 245 bool npot_; |
246 | 246 |
247 // Whether this texture has ever been bound. | 247 // Whether this texture has ever been bound. |
248 bool has_been_bound_; | 248 bool has_been_bound_; |
249 | 249 |
250 // The number of framebuffers this texture is attached to. | 250 // The number of framebuffers this texture is attached to. |
251 int framebuffer_attachment_count_; | 251 int framebuffer_attachment_count_; |
252 | 252 |
253 // Whether the associated context group owns this texture and should delete | 253 // The framebuffer manager that controls the lifetime of this framebuffer |
254 // it. | 254 // or NULL if it has been deleted. |
255 bool owned_; | 255 base::WeakPtr<TextureManager> owner_; |
256 | 256 |
257 DISALLOW_COPY_AND_ASSIGN(TextureInfo); | 257 DISALLOW_COPY_AND_ASSIGN(TextureInfo); |
258 }; | 258 }; |
259 | 259 |
260 TextureManager(GLsizei max_texture_size, | 260 TextureManager(GLsizei max_texture_size, |
261 GLsizei max_cube_map_texture_size); | 261 GLsizei max_cube_map_texture_size); |
262 ~TextureManager(); | 262 ~TextureManager(); |
263 | 263 |
264 // Init the texture manager. | 264 // Init the texture manager. |
265 bool Initialize(const FeatureInfo* feature_info); | 265 bool Initialize(const FeatureInfo* feature_info); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 const FeatureInfo* feature_info, | 331 const FeatureInfo* feature_info, |
332 TextureManager::TextureInfo* info); | 332 TextureManager::TextureInfo* info); |
333 | 333 |
334 // Creates a new texture info. | 334 // Creates a new texture info. |
335 TextureInfo* CreateTextureInfo( | 335 TextureInfo* CreateTextureInfo( |
336 const FeatureInfo* feature_info, GLuint client_id, GLuint service_id); | 336 const FeatureInfo* feature_info, GLuint client_id, GLuint service_id); |
337 | 337 |
338 // Gets the texture info for the given texture. | 338 // Gets the texture info for the given texture. |
339 TextureInfo* GetTextureInfo(GLuint client_id); | 339 TextureInfo* GetTextureInfo(GLuint client_id); |
340 | 340 |
| 341 // Adds a texture info for a texture owned by another texture |
| 342 // manager. |
| 343 void AddTextureInfo(const FeatureInfo* feature_info, |
| 344 GLuint client_id, |
| 345 TextureInfo* info); |
| 346 |
341 // Removes a texture info. | 347 // Removes a texture info. |
342 void RemoveTextureInfo(const FeatureInfo* feature_info, GLuint client_id); | 348 void RemoveTextureInfo(const FeatureInfo* feature_info, GLuint client_id); |
343 | 349 |
344 // Gets a client id for a given service id. | 350 // Gets a client id for a given service id. |
345 bool GetClientId(GLuint service_id, GLuint* client_id) const; | 351 bool GetClientId(GLuint service_id, GLuint* client_id) const; |
346 | 352 |
347 TextureInfo* GetDefaultTextureInfo(GLenum target) { | 353 TextureInfo* GetDefaultTextureInfo(GLenum target) { |
348 switch (target) { | 354 switch (target) { |
349 case GL_TEXTURE_2D: | 355 case GL_TEXTURE_2D: |
350 return default_texture_2d_; | 356 return default_texture_2d_; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
400 TextureInfo::Ref default_texture_cube_map_; | 406 TextureInfo::Ref default_texture_cube_map_; |
401 TextureInfo::Ref default_texture_external_oes_; | 407 TextureInfo::Ref default_texture_external_oes_; |
402 | 408 |
403 DISALLOW_COPY_AND_ASSIGN(TextureManager); | 409 DISALLOW_COPY_AND_ASSIGN(TextureManager); |
404 }; | 410 }; |
405 | 411 |
406 } // namespace gles2 | 412 } // namespace gles2 |
407 } // namespace gpu | 413 } // namespace gpu |
408 | 414 |
409 #endif // GPU_COMMAND_BUFFER_SERVICE_TEXTURE_MANAGER_H_ | 415 #endif // GPU_COMMAND_BUFFER_SERVICE_TEXTURE_MANAGER_H_ |
OLD | NEW |