OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 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_RENDERBUFFER_MANAGER_H_ | 5 #ifndef GPU_COMMAND_BUFFER_SERVICE_RENDERBUFFER_MANAGER_H_ |
6 #define GPU_COMMAND_BUFFER_SERVICE_RENDERBUFFER_MANAGER_H_ | 6 #define GPU_COMMAND_BUFFER_SERVICE_RENDERBUFFER_MANAGER_H_ |
7 | 7 |
8 #include <string> | 8 #include <string> |
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/memory/ref_counted.h" | 11 #include "base/memory/ref_counted.h" |
12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
13 #include "gpu/command_buffer/service/gl_utils.h" | 13 #include "gpu/command_buffer/service/gl_utils.h" |
14 #include "gpu/command_buffer/service/memory_tracking.h" | 14 #include "gpu/command_buffer/service/memory_tracking.h" |
15 #include "gpu/gpu_export.h" | 15 #include "gpu/gpu_export.h" |
16 | 16 |
17 namespace gpu { | 17 namespace gpu { |
18 namespace gles2 { | 18 namespace gles2 { |
19 | 19 |
| 20 class RenderbufferManager; |
| 21 |
| 22 // Info about a Renderbuffer. |
| 23 class GPU_EXPORT Renderbuffer |
| 24 : public base::RefCounted<Renderbuffer> { |
| 25 public: |
| 26 Renderbuffer(RenderbufferManager* manager, GLuint service_id); |
| 27 |
| 28 GLuint service_id() const { |
| 29 return service_id_; |
| 30 } |
| 31 |
| 32 bool cleared() const { |
| 33 return cleared_; |
| 34 } |
| 35 |
| 36 GLenum internal_format() const { |
| 37 return internal_format_; |
| 38 } |
| 39 |
| 40 GLsizei samples() const { |
| 41 return samples_; |
| 42 } |
| 43 |
| 44 GLsizei width() const { |
| 45 return width_; |
| 46 } |
| 47 |
| 48 GLsizei height() const { |
| 49 return height_; |
| 50 } |
| 51 |
| 52 bool IsDeleted() const { |
| 53 return deleted_; |
| 54 } |
| 55 |
| 56 void MarkAsValid() { |
| 57 has_been_bound_ = true; |
| 58 } |
| 59 |
| 60 bool IsValid() const { |
| 61 return has_been_bound_ && !IsDeleted(); |
| 62 } |
| 63 |
| 64 size_t EstimatedSize(); |
| 65 |
| 66 void AddToSignature(std::string* signature) const; |
| 67 |
| 68 private: |
| 69 friend class RenderbufferManager; |
| 70 friend class base::RefCounted<Renderbuffer>; |
| 71 |
| 72 ~Renderbuffer(); |
| 73 |
| 74 void set_cleared(bool cleared) { |
| 75 cleared_ = cleared; |
| 76 } |
| 77 |
| 78 void SetInfo( |
| 79 GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { |
| 80 samples_ = samples; |
| 81 internal_format_ = internalformat; |
| 82 width_ = width; |
| 83 height_ = height; |
| 84 cleared_ = false; |
| 85 } |
| 86 |
| 87 void MarkAsDeleted() { |
| 88 deleted_ = true; |
| 89 } |
| 90 |
| 91 // RenderbufferManager that owns this Renderbuffer. |
| 92 RenderbufferManager* manager_; |
| 93 |
| 94 bool deleted_; |
| 95 |
| 96 // Service side renderbuffer id. |
| 97 GLuint service_id_; |
| 98 |
| 99 // Whether this renderbuffer has been cleared |
| 100 bool cleared_; |
| 101 |
| 102 // Whether this renderbuffer has ever been bound. |
| 103 bool has_been_bound_; |
| 104 |
| 105 // Number of samples (for multi-sampled renderbuffers) |
| 106 GLsizei samples_; |
| 107 |
| 108 // Renderbuffer internalformat set through RenderbufferStorage(). |
| 109 GLenum internal_format_; |
| 110 |
| 111 // Dimensions of renderbuffer. |
| 112 GLsizei width_; |
| 113 GLsizei height_; |
| 114 }; |
| 115 |
20 // This class keeps track of the renderbuffers and whether or not they have | 116 // This class keeps track of the renderbuffers and whether or not they have |
21 // been cleared. | 117 // been cleared. |
22 class GPU_EXPORT RenderbufferManager { | 118 class GPU_EXPORT RenderbufferManager { |
23 public: | 119 public: |
24 // Info about Renderbuffers currently in the system. | |
25 class GPU_EXPORT RenderbufferInfo | |
26 : public base::RefCounted<RenderbufferInfo> { | |
27 public: | |
28 typedef scoped_refptr<RenderbufferInfo> Ref; | |
29 | |
30 RenderbufferInfo(RenderbufferManager* manager, GLuint service_id) | |
31 : manager_(manager), | |
32 deleted_(false), | |
33 service_id_(service_id), | |
34 cleared_(true), | |
35 has_been_bound_(false), | |
36 samples_(0), | |
37 internal_format_(GL_RGBA4), | |
38 width_(0), | |
39 height_(0) { | |
40 manager_->StartTracking(this); | |
41 } | |
42 | |
43 GLuint service_id() const { | |
44 return service_id_; | |
45 } | |
46 | |
47 bool cleared() const { | |
48 return cleared_; | |
49 } | |
50 | |
51 GLenum internal_format() const { | |
52 return internal_format_; | |
53 } | |
54 | |
55 GLsizei samples() const { | |
56 return samples_; | |
57 } | |
58 | |
59 GLsizei width() const { | |
60 return width_; | |
61 } | |
62 | |
63 GLsizei height() const { | |
64 return height_; | |
65 } | |
66 | |
67 bool IsDeleted() const { | |
68 return deleted_; | |
69 } | |
70 | |
71 void MarkAsValid() { | |
72 has_been_bound_ = true; | |
73 } | |
74 | |
75 bool IsValid() const { | |
76 return has_been_bound_ && !IsDeleted(); | |
77 } | |
78 | |
79 size_t EstimatedSize(); | |
80 | |
81 void AddToSignature(std::string* signature) const; | |
82 | |
83 private: | |
84 friend class RenderbufferManager; | |
85 friend class base::RefCounted<RenderbufferInfo>; | |
86 | |
87 ~RenderbufferInfo(); | |
88 | |
89 void set_cleared(bool cleared) { | |
90 cleared_ = cleared; | |
91 } | |
92 | |
93 void SetInfo( | |
94 GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { | |
95 samples_ = samples; | |
96 internal_format_ = internalformat; | |
97 width_ = width; | |
98 height_ = height; | |
99 cleared_ = false; | |
100 } | |
101 | |
102 void MarkAsDeleted() { | |
103 deleted_ = true; | |
104 } | |
105 | |
106 // RenderbufferManager that owns this RenderbufferInfo. | |
107 RenderbufferManager* manager_; | |
108 | |
109 bool deleted_; | |
110 | |
111 // Service side renderbuffer id. | |
112 GLuint service_id_; | |
113 | |
114 // Whether this renderbuffer has been cleared | |
115 bool cleared_; | |
116 | |
117 // Whether this renderbuffer has ever been bound. | |
118 bool has_been_bound_; | |
119 | |
120 // Number of samples (for multi-sampled renderbuffers) | |
121 GLsizei samples_; | |
122 | |
123 // Renderbuffer internalformat set through RenderbufferStorage(). | |
124 GLenum internal_format_; | |
125 | |
126 // Dimensions of renderbuffer. | |
127 GLsizei width_; | |
128 GLsizei height_; | |
129 }; | |
130 | |
131 RenderbufferManager(MemoryTracker* memory_tracker, | 120 RenderbufferManager(MemoryTracker* memory_tracker, |
132 GLint max_renderbuffer_size, | 121 GLint max_renderbuffer_size, |
133 GLint max_samples); | 122 GLint max_samples); |
134 ~RenderbufferManager(); | 123 ~RenderbufferManager(); |
135 | 124 |
136 GLint max_renderbuffer_size() const { | 125 GLint max_renderbuffer_size() const { |
137 return max_renderbuffer_size_; | 126 return max_renderbuffer_size_; |
138 } | 127 } |
139 | 128 |
140 GLint max_samples() const { | 129 GLint max_samples() const { |
141 return max_samples_; | 130 return max_samples_; |
142 } | 131 } |
143 | 132 |
144 bool HaveUnclearedRenderbuffers() const { | 133 bool HaveUnclearedRenderbuffers() const { |
145 return num_uncleared_renderbuffers_ != 0; | 134 return num_uncleared_renderbuffers_ != 0; |
146 } | 135 } |
147 | 136 |
148 void SetInfo( | 137 void SetInfo( |
149 RenderbufferInfo* renderbuffer, | 138 Renderbuffer* renderbuffer, |
150 GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); | 139 GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); |
151 | 140 |
152 void SetCleared(RenderbufferInfo* renderbuffer, bool cleared); | 141 void SetCleared(Renderbuffer* renderbuffer, bool cleared); |
153 | 142 |
154 // Must call before destruction. | 143 // Must call before destruction. |
155 void Destroy(bool have_context); | 144 void Destroy(bool have_context); |
156 | 145 |
157 // Creates a RenderbufferInfo for the given renderbuffer. | 146 // Creates a Renderbuffer for the given renderbuffer. |
158 void CreateRenderbufferInfo(GLuint client_id, GLuint service_id); | 147 void CreateRenderbuffer(GLuint client_id, GLuint service_id); |
159 | 148 |
160 // Gets the renderbuffer info for the given renderbuffer. | 149 // Gets the renderbuffer info for the given renderbuffer. |
161 RenderbufferInfo* GetRenderbufferInfo(GLuint client_id); | 150 Renderbuffer* GetRenderbuffer(GLuint client_id); |
162 | 151 |
163 // Removes a renderbuffer info for the given renderbuffer. | 152 // Removes a renderbuffer info for the given renderbuffer. |
164 void RemoveRenderbufferInfo(GLuint client_id); | 153 void RemoveRenderbuffer(GLuint client_id); |
165 | 154 |
166 // Gets a client id for a given service id. | 155 // Gets a client id for a given service id. |
167 bool GetClientId(GLuint service_id, GLuint* client_id) const; | 156 bool GetClientId(GLuint service_id, GLuint* client_id) const; |
168 | 157 |
169 size_t mem_represented() const { | 158 size_t mem_represented() const { |
170 return memory_tracker_->GetMemRepresented(); | 159 return memory_tracker_->GetMemRepresented(); |
171 } | 160 } |
172 | 161 |
173 static bool ComputeEstimatedRenderbufferSize( | 162 static bool ComputeEstimatedRenderbufferSize( |
174 int width, int height, int samples, int internal_format, uint32* size); | 163 int width, int height, int samples, int internal_format, uint32* size); |
175 static GLenum InternalRenderbufferFormatToImplFormat(GLenum impl_format); | 164 static GLenum InternalRenderbufferFormatToImplFormat(GLenum impl_format); |
176 | 165 |
177 private: | 166 private: |
178 void StartTracking(RenderbufferInfo* renderbuffer); | 167 friend class Renderbuffer; |
179 void StopTracking(RenderbufferInfo* renderbuffer); | 168 |
| 169 void StartTracking(Renderbuffer* renderbuffer); |
| 170 void StopTracking(Renderbuffer* renderbuffer); |
180 | 171 |
181 scoped_ptr<MemoryTypeTracker> memory_tracker_; | 172 scoped_ptr<MemoryTypeTracker> memory_tracker_; |
182 | 173 |
183 GLint max_renderbuffer_size_; | 174 GLint max_renderbuffer_size_; |
184 GLint max_samples_; | 175 GLint max_samples_; |
185 | 176 |
186 int num_uncleared_renderbuffers_; | 177 int num_uncleared_renderbuffers_; |
187 | 178 |
188 // Counts the number of RenderbufferInfo allocated with 'this' as its manager. | 179 // Counts the number of Renderbuffer allocated with 'this' as its manager. |
189 // Allows to check no RenderbufferInfo will outlive this. | 180 // Allows to check no Renderbuffer will outlive this. |
190 unsigned renderbuffer_info_count_; | 181 unsigned renderbuffer_info_count_; |
191 | 182 |
192 bool have_context_; | 183 bool have_context_; |
193 | 184 |
194 // Info for each renderbuffer in the system. | 185 // Info for each renderbuffer in the system. |
195 typedef base::hash_map<GLuint, RenderbufferInfo::Ref> RenderbufferInfoMap; | 186 typedef base::hash_map<GLuint, |
| 187 scoped_refptr<Renderbuffer> > RenderbufferInfoMap; |
196 RenderbufferInfoMap renderbuffer_infos_; | 188 RenderbufferInfoMap renderbuffer_infos_; |
197 | 189 |
198 DISALLOW_COPY_AND_ASSIGN(RenderbufferManager); | 190 DISALLOW_COPY_AND_ASSIGN(RenderbufferManager); |
199 }; | 191 }; |
200 | 192 |
201 } // namespace gles2 | 193 } // namespace gles2 |
202 } // namespace gpu | 194 } // namespace gpu |
203 | 195 |
204 #endif // GPU_COMMAND_BUFFER_SERVICE_RENDERBUFFER_MANAGER_H_ | 196 #endif // GPU_COMMAND_BUFFER_SERVICE_RENDERBUFFER_MANAGER_H_ |
OLD | NEW |