| 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 |