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 #include "gpu/command_buffer/service/framebuffer_manager.h" | 5 #include "gpu/command_buffer/service/framebuffer_manager.h" |
6 #include "base/logging.h" | 6 #include "base/logging.h" |
7 #include "base/strings/stringprintf.h" | 7 #include "base/strings/stringprintf.h" |
8 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 8 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
9 #include "gpu/command_buffer/service/renderbuffer_manager.h" | 9 #include "gpu/command_buffer/service/renderbuffer_manager.h" |
10 #include "gpu/command_buffer/service/texture_manager.h" | 10 #include "gpu/command_buffer/service/texture_manager.h" |
(...skipping 30 matching lines...) Expand all Loading... |
41 } | 41 } |
42 | 42 |
43 class RenderbufferAttachment | 43 class RenderbufferAttachment |
44 : public Framebuffer::Attachment { | 44 : public Framebuffer::Attachment { |
45 public: | 45 public: |
46 explicit RenderbufferAttachment( | 46 explicit RenderbufferAttachment( |
47 Renderbuffer* renderbuffer) | 47 Renderbuffer* renderbuffer) |
48 : renderbuffer_(renderbuffer) { | 48 : renderbuffer_(renderbuffer) { |
49 } | 49 } |
50 | 50 |
51 virtual GLsizei width() const override { | 51 GLsizei width() const override { return renderbuffer_->width(); } |
52 return renderbuffer_->width(); | |
53 } | |
54 | 52 |
55 virtual GLsizei height() const override { | 53 GLsizei height() const override { return renderbuffer_->height(); } |
56 return renderbuffer_->height(); | |
57 } | |
58 | 54 |
59 virtual GLenum internal_format() const override { | 55 GLenum internal_format() const override { |
60 return renderbuffer_->internal_format(); | 56 return renderbuffer_->internal_format(); |
61 } | 57 } |
62 | 58 |
63 virtual GLenum texture_type() const override { | 59 GLenum texture_type() const override { return 0; } |
64 return 0; | |
65 } | |
66 | 60 |
67 virtual GLsizei samples() const override { | 61 GLsizei samples() const override { return renderbuffer_->samples(); } |
68 return renderbuffer_->samples(); | |
69 } | |
70 | 62 |
71 virtual GLuint object_name() const override { | 63 GLuint object_name() const override { return renderbuffer_->client_id(); } |
72 return renderbuffer_->client_id(); | |
73 } | |
74 | 64 |
75 virtual bool cleared() const override { | 65 bool cleared() const override { return renderbuffer_->cleared(); } |
76 return renderbuffer_->cleared(); | |
77 } | |
78 | 66 |
79 virtual void SetCleared( | 67 void SetCleared(RenderbufferManager* renderbuffer_manager, |
80 RenderbufferManager* renderbuffer_manager, | 68 TextureManager* /* texture_manager */, |
81 TextureManager* /* texture_manager */, | 69 bool cleared) override { |
82 bool cleared) override { | |
83 renderbuffer_manager->SetCleared(renderbuffer_.get(), cleared); | 70 renderbuffer_manager->SetCleared(renderbuffer_.get(), cleared); |
84 } | 71 } |
85 | 72 |
86 virtual bool IsTexture( | 73 bool IsTexture(TextureRef* /* texture */) const override { return false; } |
87 TextureRef* /* texture */) const override { | |
88 return false; | |
89 } | |
90 | 74 |
91 virtual bool IsRenderbuffer( | 75 bool IsRenderbuffer(Renderbuffer* renderbuffer) const override { |
92 Renderbuffer* renderbuffer) const override { | |
93 return renderbuffer_.get() == renderbuffer; | 76 return renderbuffer_.get() == renderbuffer; |
94 } | 77 } |
95 | 78 |
96 virtual bool CanRenderTo() const override { | 79 bool CanRenderTo() const override { return true; } |
97 return true; | |
98 } | |
99 | 80 |
100 virtual void DetachFromFramebuffer(Framebuffer* framebuffer) const override { | 81 void DetachFromFramebuffer(Framebuffer* framebuffer) const override { |
101 // Nothing to do for renderbuffers. | 82 // Nothing to do for renderbuffers. |
102 } | 83 } |
103 | 84 |
104 virtual bool ValidForAttachmentType( | 85 bool ValidForAttachmentType(GLenum attachment_type, |
105 GLenum attachment_type, uint32 max_color_attachments) override { | 86 uint32 max_color_attachments) override { |
106 uint32 need = GLES2Util::GetChannelsNeededForAttachmentType( | 87 uint32 need = GLES2Util::GetChannelsNeededForAttachmentType( |
107 attachment_type, max_color_attachments); | 88 attachment_type, max_color_attachments); |
108 uint32 have = GLES2Util::GetChannelsForFormat(internal_format()); | 89 uint32 have = GLES2Util::GetChannelsForFormat(internal_format()); |
109 return (need & have) != 0; | 90 return (need & have) != 0; |
110 } | 91 } |
111 | 92 |
112 Renderbuffer* renderbuffer() const { | 93 Renderbuffer* renderbuffer() const { |
113 return renderbuffer_.get(); | 94 return renderbuffer_.get(); |
114 } | 95 } |
115 | 96 |
116 virtual size_t GetSignatureSize( | 97 size_t GetSignatureSize(TextureManager* texture_manager) const override { |
117 TextureManager* texture_manager) const override { | |
118 return renderbuffer_->GetSignatureSize(); | 98 return renderbuffer_->GetSignatureSize(); |
119 } | 99 } |
120 | 100 |
121 virtual void AddToSignature( | 101 void AddToSignature(TextureManager* texture_manager, |
122 TextureManager* texture_manager, std::string* signature) const override { | 102 std::string* signature) const override { |
123 DCHECK(signature); | 103 DCHECK(signature); |
124 renderbuffer_->AddToSignature(signature); | 104 renderbuffer_->AddToSignature(signature); |
125 } | 105 } |
126 | 106 |
127 virtual void OnWillRenderTo() const override {} | 107 void OnWillRenderTo() const override {} |
128 virtual void OnDidRenderTo() const override {} | 108 void OnDidRenderTo() const override {} |
129 virtual bool FormsFeedbackLoop( | 109 bool FormsFeedbackLoop(TextureRef* /* texture */, |
130 TextureRef* /* texture */, GLint /*level */) const override { | 110 GLint /*level */) const override { |
131 return false; | 111 return false; |
132 } | 112 } |
133 | 113 |
134 protected: | 114 protected: |
135 virtual ~RenderbufferAttachment() { } | 115 ~RenderbufferAttachment() override {} |
136 | 116 |
137 private: | 117 private: |
138 scoped_refptr<Renderbuffer> renderbuffer_; | 118 scoped_refptr<Renderbuffer> renderbuffer_; |
139 | 119 |
140 DISALLOW_COPY_AND_ASSIGN(RenderbufferAttachment); | 120 DISALLOW_COPY_AND_ASSIGN(RenderbufferAttachment); |
141 }; | 121 }; |
142 | 122 |
143 class TextureAttachment | 123 class TextureAttachment |
144 : public Framebuffer::Attachment { | 124 : public Framebuffer::Attachment { |
145 public: | 125 public: |
146 TextureAttachment( | 126 TextureAttachment( |
147 TextureRef* texture_ref, GLenum target, GLint level, GLsizei samples) | 127 TextureRef* texture_ref, GLenum target, GLint level, GLsizei samples) |
148 : texture_ref_(texture_ref), | 128 : texture_ref_(texture_ref), |
149 target_(target), | 129 target_(target), |
150 level_(level), | 130 level_(level), |
151 samples_(samples) { | 131 samples_(samples) { |
152 } | 132 } |
153 | 133 |
154 virtual GLsizei width() const override { | 134 GLsizei width() const override { |
155 GLsizei temp_width = 0; | 135 GLsizei temp_width = 0; |
156 GLsizei temp_height = 0; | 136 GLsizei temp_height = 0; |
157 texture_ref_->texture()->GetLevelSize( | 137 texture_ref_->texture()->GetLevelSize( |
158 target_, level_, &temp_width, &temp_height); | 138 target_, level_, &temp_width, &temp_height); |
159 return temp_width; | 139 return temp_width; |
160 } | 140 } |
161 | 141 |
162 virtual GLsizei height() const override { | 142 GLsizei height() const override { |
163 GLsizei temp_width = 0; | 143 GLsizei temp_width = 0; |
164 GLsizei temp_height = 0; | 144 GLsizei temp_height = 0; |
165 texture_ref_->texture()->GetLevelSize( | 145 texture_ref_->texture()->GetLevelSize( |
166 target_, level_, &temp_width, &temp_height); | 146 target_, level_, &temp_width, &temp_height); |
167 return temp_height; | 147 return temp_height; |
168 } | 148 } |
169 | 149 |
170 virtual GLenum internal_format() const override { | 150 GLenum internal_format() const override { |
171 GLenum temp_type = 0; | 151 GLenum temp_type = 0; |
172 GLenum temp_internal_format = 0; | 152 GLenum temp_internal_format = 0; |
173 texture_ref_->texture()->GetLevelType( | 153 texture_ref_->texture()->GetLevelType( |
174 target_, level_, &temp_type, &temp_internal_format); | 154 target_, level_, &temp_type, &temp_internal_format); |
175 return temp_internal_format; | 155 return temp_internal_format; |
176 } | 156 } |
177 | 157 |
178 virtual GLenum texture_type() const override { | 158 GLenum texture_type() const override { |
179 GLenum temp_type = 0; | 159 GLenum temp_type = 0; |
180 GLenum temp_internal_format = 0; | 160 GLenum temp_internal_format = 0; |
181 texture_ref_->texture()->GetLevelType( | 161 texture_ref_->texture()->GetLevelType( |
182 target_, level_, &temp_type, &temp_internal_format); | 162 target_, level_, &temp_type, &temp_internal_format); |
183 return temp_type; | 163 return temp_type; |
184 } | 164 } |
185 | 165 |
186 virtual GLsizei samples() const override { | 166 GLsizei samples() const override { return samples_; } |
187 return samples_; | |
188 } | |
189 | 167 |
190 virtual GLuint object_name() const override { | 168 GLuint object_name() const override { return texture_ref_->client_id(); } |
191 return texture_ref_->client_id(); | |
192 } | |
193 | 169 |
194 virtual bool cleared() const override { | 170 bool cleared() const override { |
195 return texture_ref_->texture()->IsLevelCleared(target_, level_); | 171 return texture_ref_->texture()->IsLevelCleared(target_, level_); |
196 } | 172 } |
197 | 173 |
198 virtual void SetCleared( | 174 void SetCleared(RenderbufferManager* /* renderbuffer_manager */, |
199 RenderbufferManager* /* renderbuffer_manager */, | 175 TextureManager* texture_manager, |
200 TextureManager* texture_manager, | 176 bool cleared) override { |
201 bool cleared) override { | |
202 texture_manager->SetLevelCleared( | 177 texture_manager->SetLevelCleared( |
203 texture_ref_.get(), target_, level_, cleared); | 178 texture_ref_.get(), target_, level_, cleared); |
204 } | 179 } |
205 | 180 |
206 virtual bool IsTexture(TextureRef* texture) const override { | 181 bool IsTexture(TextureRef* texture) const override { |
207 return texture == texture_ref_.get(); | 182 return texture == texture_ref_.get(); |
208 } | 183 } |
209 | 184 |
210 virtual bool IsRenderbuffer( | 185 bool IsRenderbuffer(Renderbuffer* /* renderbuffer */) const override { |
211 Renderbuffer* /* renderbuffer */) | |
212 const override { | |
213 return false; | 186 return false; |
214 } | 187 } |
215 | 188 |
216 TextureRef* texture() const { | 189 TextureRef* texture() const { |
217 return texture_ref_.get(); | 190 return texture_ref_.get(); |
218 } | 191 } |
219 | 192 |
220 virtual bool CanRenderTo() const override { | 193 bool CanRenderTo() const override { |
221 return texture_ref_->texture()->CanRenderTo(); | 194 return texture_ref_->texture()->CanRenderTo(); |
222 } | 195 } |
223 | 196 |
224 virtual void DetachFromFramebuffer(Framebuffer* framebuffer) | 197 void DetachFromFramebuffer(Framebuffer* framebuffer) const override { |
225 const override { | |
226 texture_ref_->texture()->DetachFromFramebuffer(); | 198 texture_ref_->texture()->DetachFromFramebuffer(); |
227 framebuffer->OnTextureRefDetached(texture_ref_.get()); | 199 framebuffer->OnTextureRefDetached(texture_ref_.get()); |
228 } | 200 } |
229 | 201 |
230 virtual bool ValidForAttachmentType( | 202 bool ValidForAttachmentType(GLenum attachment_type, |
231 GLenum attachment_type, uint32 max_color_attachments) override { | 203 uint32 max_color_attachments) override { |
232 GLenum type = 0; | 204 GLenum type = 0; |
233 GLenum internal_format = 0; | 205 GLenum internal_format = 0; |
234 if (!texture_ref_->texture()->GetLevelType( | 206 if (!texture_ref_->texture()->GetLevelType( |
235 target_, level_, &type, &internal_format)) { | 207 target_, level_, &type, &internal_format)) { |
236 return false; | 208 return false; |
237 } | 209 } |
238 uint32 need = GLES2Util::GetChannelsNeededForAttachmentType( | 210 uint32 need = GLES2Util::GetChannelsNeededForAttachmentType( |
239 attachment_type, max_color_attachments); | 211 attachment_type, max_color_attachments); |
240 uint32 have = GLES2Util::GetChannelsForFormat(internal_format); | 212 uint32 have = GLES2Util::GetChannelsForFormat(internal_format); |
241 | 213 |
242 // Workaround for NVIDIA drivers that incorrectly expose these formats as | 214 // Workaround for NVIDIA drivers that incorrectly expose these formats as |
243 // renderable: | 215 // renderable: |
244 if (internal_format == GL_LUMINANCE || internal_format == GL_ALPHA || | 216 if (internal_format == GL_LUMINANCE || internal_format == GL_ALPHA || |
245 internal_format == GL_LUMINANCE_ALPHA) { | 217 internal_format == GL_LUMINANCE_ALPHA) { |
246 return false; | 218 return false; |
247 } | 219 } |
248 return (need & have) != 0; | 220 return (need & have) != 0; |
249 } | 221 } |
250 | 222 |
251 virtual size_t GetSignatureSize( | 223 size_t GetSignatureSize(TextureManager* texture_manager) const override { |
252 TextureManager* texture_manager) const override { | |
253 return texture_manager->GetSignatureSize(); | 224 return texture_manager->GetSignatureSize(); |
254 } | 225 } |
255 | 226 |
256 virtual void AddToSignature( | 227 void AddToSignature(TextureManager* texture_manager, |
257 TextureManager* texture_manager, std::string* signature) const override { | 228 std::string* signature) const override { |
258 DCHECK(signature); | 229 DCHECK(signature); |
259 texture_manager->AddToSignature( | 230 texture_manager->AddToSignature( |
260 texture_ref_.get(), target_, level_, signature); | 231 texture_ref_.get(), target_, level_, signature); |
261 } | 232 } |
262 | 233 |
263 virtual void OnWillRenderTo() const override { | 234 void OnWillRenderTo() const override { |
264 texture_ref_->texture()->OnWillModifyPixels(); | 235 texture_ref_->texture()->OnWillModifyPixels(); |
265 } | 236 } |
266 | 237 |
267 virtual void OnDidRenderTo() const override { | 238 void OnDidRenderTo() const override { |
268 texture_ref_->texture()->OnDidModifyPixels(); | 239 texture_ref_->texture()->OnDidModifyPixels(); |
269 } | 240 } |
270 | 241 |
271 virtual bool FormsFeedbackLoop( | 242 bool FormsFeedbackLoop(TextureRef* texture, GLint level) const override { |
272 TextureRef* texture, GLint level) const override { | |
273 return texture == texture_ref_.get() && level == level_; | 243 return texture == texture_ref_.get() && level == level_; |
274 } | 244 } |
275 | 245 |
276 protected: | 246 protected: |
277 virtual ~TextureAttachment() {} | 247 ~TextureAttachment() override {} |
278 | 248 |
279 private: | 249 private: |
280 scoped_refptr<TextureRef> texture_ref_; | 250 scoped_refptr<TextureRef> texture_ref_; |
281 GLenum target_; | 251 GLenum target_; |
282 GLint level_; | 252 GLint level_; |
283 GLsizei samples_; | 253 GLsizei samples_; |
284 | 254 |
285 DISALLOW_COPY_AND_ASSIGN(TextureAttachment); | 255 DISALLOW_COPY_AND_ASSIGN(TextureAttachment); |
286 }; | 256 }; |
287 | 257 |
(...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
763 ++it) { | 733 ++it) { |
764 TextureDetachObserver* observer = *it; | 734 TextureDetachObserver* observer = *it; |
765 observer->OnTextureRefDetachedFromFramebuffer(texture); | 735 observer->OnTextureRefDetachedFromFramebuffer(texture); |
766 } | 736 } |
767 } | 737 } |
768 | 738 |
769 } // namespace gles2 | 739 } // namespace gles2 |
770 } // namespace gpu | 740 } // namespace gpu |
771 | 741 |
772 | 742 |
OLD | NEW |