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_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 "base/basictypes.h" | 8 #include "base/basictypes.h" |
9 #include "base/hash_tables.h" | 9 #include "base/hash_tables.h" |
10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
11 #include "base/memory/scoped_ptr.h" | 11 #include "base/memory/scoped_ptr.h" |
12 #include "gpu/command_buffer/service/gl_utils.h" | 12 #include "gpu/command_buffer/service/gl_utils.h" |
13 | 13 |
14 namespace gpu { | 14 namespace gpu { |
15 namespace gles2 { | 15 namespace gles2 { |
16 | 16 |
17 // This class keeps track of the renderbuffers and whether or not they have | 17 // This class keeps track of the renderbuffers and whether or not they have |
18 // been cleared. | 18 // been cleared. |
19 class RenderbufferManager { | 19 class RenderbufferManager { |
20 public: | 20 public: |
21 // Info about Renderbuffers currently in the system. | 21 // Info about Renderbuffers currently in the system. |
22 class RenderbufferInfo : public base::RefCounted<RenderbufferInfo> { | 22 class RenderbufferInfo : public base::RefCounted<RenderbufferInfo> { |
23 public: | 23 public: |
24 typedef scoped_refptr<RenderbufferInfo> Ref; | 24 typedef scoped_refptr<RenderbufferInfo> Ref; |
25 | 25 |
26 explicit RenderbufferInfo(GLuint service_id) | 26 explicit RenderbufferInfo(GLuint service_id) |
27 : service_id_(service_id), | 27 : service_id_(service_id), |
28 cleared_(false), | 28 cleared_(true), |
29 has_been_bound_(false), | 29 has_been_bound_(false), |
30 samples_(0), | 30 samples_(0), |
31 internal_format_(GL_RGBA4), | 31 internal_format_(GL_RGBA4), |
32 width_(0), | 32 width_(0), |
33 height_(0) { | 33 height_(0) { |
34 } | 34 } |
35 | 35 |
36 GLuint service_id() const { | 36 GLuint service_id() const { |
37 return service_id_; | 37 return service_id_; |
38 } | 38 } |
39 | 39 |
40 bool cleared() const { | 40 bool cleared() const { |
41 return cleared_; | 41 return cleared_; |
42 } | 42 } |
43 | 43 |
44 void set_cleared() { | |
45 cleared_ = true; | |
46 } | |
47 | |
48 GLenum internal_format() const { | 44 GLenum internal_format() const { |
49 return internal_format_; | 45 return internal_format_; |
50 } | 46 } |
51 | 47 |
52 GLsizei samples() const { | 48 GLsizei samples() const { |
53 return samples_; | 49 return samples_; |
54 } | 50 } |
55 | 51 |
56 GLsizei width() const { | 52 GLsizei width() const { |
57 return width_; | 53 return width_; |
58 } | 54 } |
59 | 55 |
60 GLsizei height() const { | 56 GLsizei height() const { |
61 return height_; | 57 return height_; |
62 } | 58 } |
63 | 59 |
64 void SetInfo( | |
65 GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { | |
66 samples_ = samples; | |
67 internal_format_ = internalformat; | |
68 width_ = width; | |
69 height_ = height; | |
70 cleared_ = false; | |
71 } | |
72 | |
73 bool IsDeleted() const { | 60 bool IsDeleted() const { |
74 return service_id_ == 0; | 61 return service_id_ == 0; |
75 } | 62 } |
76 | 63 |
77 void MarkAsValid() { | 64 void MarkAsValid() { |
78 has_been_bound_ = true; | 65 has_been_bound_ = true; |
79 } | 66 } |
80 | 67 |
81 bool IsValid() const { | 68 bool IsValid() const { |
82 return has_been_bound_ && !IsDeleted(); | 69 return has_been_bound_ && !IsDeleted(); |
83 } | 70 } |
84 | 71 |
85 private: | 72 private: |
86 friend class RenderbufferManager; | 73 friend class RenderbufferManager; |
87 friend class base::RefCounted<RenderbufferInfo>; | 74 friend class base::RefCounted<RenderbufferInfo>; |
88 | 75 |
89 ~RenderbufferInfo() { } | 76 ~RenderbufferInfo() { } |
90 | 77 |
| 78 void set_cleared() { |
| 79 cleared_ = true; |
| 80 } |
| 81 |
| 82 void SetInfo( |
| 83 GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { |
| 84 samples_ = samples; |
| 85 internal_format_ = internalformat; |
| 86 width_ = width; |
| 87 height_ = height; |
| 88 cleared_ = false; |
| 89 } |
| 90 |
91 void MarkAsDeleted() { | 91 void MarkAsDeleted() { |
92 service_id_ = 0; | 92 service_id_ = 0; |
93 } | 93 } |
94 | 94 |
95 // Service side renderbuffer id. | 95 // Service side renderbuffer id. |
96 GLuint service_id_; | 96 GLuint service_id_; |
97 | 97 |
98 // Whether this renderbuffer has been cleared | 98 // Whether this renderbuffer has been cleared |
99 bool cleared_; | 99 bool cleared_; |
100 | 100 |
(...skipping 15 matching lines...) Expand all Loading... |
116 ~RenderbufferManager(); | 116 ~RenderbufferManager(); |
117 | 117 |
118 GLint max_renderbuffer_size() const { | 118 GLint max_renderbuffer_size() const { |
119 return max_renderbuffer_size_; | 119 return max_renderbuffer_size_; |
120 } | 120 } |
121 | 121 |
122 GLint max_samples() const { | 122 GLint max_samples() const { |
123 return max_samples_; | 123 return max_samples_; |
124 } | 124 } |
125 | 125 |
| 126 bool HaveUnclearedRenderbuffers() const { |
| 127 return num_uncleared_renderbuffers_ != 0; |
| 128 } |
| 129 |
| 130 void SetInfo( |
| 131 RenderbufferInfo* renderbuffer, |
| 132 GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); |
| 133 |
| 134 void SetCleared(RenderbufferInfo* renderbuffer); |
| 135 |
126 // Must call before destruction. | 136 // Must call before destruction. |
127 void Destroy(bool have_context); | 137 void Destroy(bool have_context); |
128 | 138 |
129 // Creates a RenderbufferInfo for the given renderbuffer. | 139 // Creates a RenderbufferInfo for the given renderbuffer. |
130 void CreateRenderbufferInfo(GLuint client_id, GLuint service_id); | 140 void CreateRenderbufferInfo(GLuint client_id, GLuint service_id); |
131 | 141 |
132 // Gets the renderbuffer info for the given renderbuffer. | 142 // Gets the renderbuffer info for the given renderbuffer. |
133 RenderbufferInfo* GetRenderbufferInfo(GLuint client_id); | 143 RenderbufferInfo* GetRenderbufferInfo(GLuint client_id); |
134 | 144 |
135 // Removes a renderbuffer info for the given renderbuffer. | 145 // Removes a renderbuffer info for the given renderbuffer. |
136 void RemoveRenderbufferInfo(GLuint client_id); | 146 void RemoveRenderbufferInfo(GLuint client_id); |
137 | 147 |
138 // Gets a client id for a given service id. | 148 // Gets a client id for a given service id. |
139 bool GetClientId(GLuint service_id, GLuint* client_id) const; | 149 bool GetClientId(GLuint service_id, GLuint* client_id) const; |
140 | 150 |
141 private: | 151 private: |
142 GLint max_renderbuffer_size_; | 152 GLint max_renderbuffer_size_; |
143 GLint max_samples_; | 153 GLint max_samples_; |
144 | 154 |
| 155 int num_uncleared_renderbuffers_; |
| 156 |
145 // Info for each renderbuffer in the system. | 157 // Info for each renderbuffer in the system. |
146 typedef base::hash_map<GLuint, RenderbufferInfo::Ref> RenderbufferInfoMap; | 158 typedef base::hash_map<GLuint, RenderbufferInfo::Ref> RenderbufferInfoMap; |
147 RenderbufferInfoMap renderbuffer_infos_; | 159 RenderbufferInfoMap renderbuffer_infos_; |
148 | 160 |
149 DISALLOW_COPY_AND_ASSIGN(RenderbufferManager); | 161 DISALLOW_COPY_AND_ASSIGN(RenderbufferManager); |
150 }; | 162 }; |
151 | 163 |
152 } // namespace gles2 | 164 } // namespace gles2 |
153 } // namespace gpu | 165 } // namespace gpu |
154 | 166 |
155 #endif // GPU_COMMAND_BUFFER_SERVICE_RENDERBUFFER_MANAGER_H_ | 167 #endif // GPU_COMMAND_BUFFER_SERVICE_RENDERBUFFER_MANAGER_H_ |
OLD | NEW |