| 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/renderbuffer_manager.h" | 5 #include "gpu/command_buffer/service/renderbuffer_manager.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include "base/format_macros.h" | 10 #include "base/format_macros.h" |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 | 96 |
| 97 void Renderbuffer::SetInfoAndInvalidate(GLsizei samples, | 97 void Renderbuffer::SetInfoAndInvalidate(GLsizei samples, |
| 98 GLenum internalformat, | 98 GLenum internalformat, |
| 99 GLsizei width, | 99 GLsizei width, |
| 100 GLsizei height) { | 100 GLsizei height) { |
| 101 samples_ = samples; | 101 samples_ = samples; |
| 102 internal_format_ = internalformat; | 102 internal_format_ = internalformat; |
| 103 width_ = width; | 103 width_ = width; |
| 104 height_ = height; | 104 height_ = height; |
| 105 cleared_ = false; | 105 cleared_ = false; |
| 106 allocated_ = true; | |
| 107 for (auto& point : framebuffer_attachment_points_) { | 106 for (auto& point : framebuffer_attachment_points_) { |
| 108 point.first->UnmarkAsComplete(); | 107 point.first->UnmarkAsComplete(); |
| 109 } | 108 } |
| 110 } | 109 } |
| 111 | 110 |
| 112 void Renderbuffer::AddToSignature(std::string* signature) const { | 111 void Renderbuffer::AddToSignature(std::string* signature) const { |
| 113 DCHECK(signature); | 112 DCHECK(signature); |
| 114 RenderbufferSignature signature_data(internal_format_, | 113 RenderbufferSignature signature_data(internal_format_, |
| 115 samples_, | 114 samples_, |
| 116 width_, | 115 width_, |
| 117 height_); | 116 height_); |
| 118 | 117 |
| 119 signature->append(RenderbufferTag, sizeof(RenderbufferTag)); | 118 signature->append(RenderbufferTag, sizeof(RenderbufferTag)); |
| 120 signature->append(reinterpret_cast<const char*>(&signature_data), | 119 signature->append(reinterpret_cast<const char*>(&signature_data), |
| 121 sizeof(signature_data)); | 120 sizeof(signature_data)); |
| 122 } | 121 } |
| 123 | 122 |
| 124 Renderbuffer::Renderbuffer(RenderbufferManager* manager, | 123 Renderbuffer::Renderbuffer(RenderbufferManager* manager, |
| 125 GLuint client_id, | 124 GLuint client_id, |
| 126 GLuint service_id) | 125 GLuint service_id) |
| 127 : manager_(manager), | 126 : manager_(manager), |
| 128 client_id_(client_id), | 127 client_id_(client_id), |
| 129 service_id_(service_id), | 128 service_id_(service_id), |
| 130 cleared_(true), | 129 cleared_(true), |
| 131 allocated_(false), | |
| 132 has_been_bound_(false), | 130 has_been_bound_(false), |
| 133 samples_(0), | 131 samples_(0), |
| 134 internal_format_(GL_RGBA4), | 132 internal_format_(GL_RGBA4), |
| 135 width_(0), | 133 width_(0), |
| 136 height_(0) { | 134 height_(0) { |
| 137 manager_->StartTracking(this); | 135 manager_->StartTracking(this); |
| 138 } | 136 } |
| 139 | 137 |
| 140 bool Renderbuffer::RegenerateAndBindBackingObjectIfNeeded() { | |
| 141 if (!allocated_ || !has_been_bound_ || samples_ == 0) { | |
| 142 // Not needed - won't trigger bug (multisample_renderbuffer_resize_broken). | |
| 143 return false; | |
| 144 } | |
| 145 | |
| 146 GLint original_fbo = 0; | |
| 147 glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &original_fbo); | |
| 148 | |
| 149 glDeleteRenderbuffersEXT(1, &service_id_); | |
| 150 service_id_ = 0; | |
| 151 glGenRenderbuffersEXT(1, &service_id_); | |
| 152 glBindRenderbufferEXT(GL_RENDERBUFFER, service_id_); | |
| 153 | |
| 154 // Attach new renderbuffer to all framebuffers | |
| 155 for (auto& point : framebuffer_attachment_points_) { | |
| 156 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER, point.first->service_id()); | |
| 157 glFramebufferRenderbufferEXT(GL_DRAW_FRAMEBUFFER, point.second, | |
| 158 GL_RENDERBUFFER, service_id_); | |
| 159 } | |
| 160 | |
| 161 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER, original_fbo); | |
| 162 | |
| 163 allocated_ = false; | |
| 164 return true; | |
| 165 } | |
| 166 | |
| 167 void Renderbuffer::AddFramebufferAttachmentPoint(Framebuffer* framebuffer, | 138 void Renderbuffer::AddFramebufferAttachmentPoint(Framebuffer* framebuffer, |
| 168 GLenum attachment) { | 139 GLenum attachment) { |
| 169 framebuffer_attachment_points_.insert( | 140 framebuffer_attachment_points_.insert( |
| 170 std::make_pair(framebuffer, attachment)); | 141 std::make_pair(framebuffer, attachment)); |
| 171 } | 142 } |
| 172 | 143 |
| 173 void Renderbuffer::RemoveFramebufferAttachmentPoint(Framebuffer* framebuffer, | 144 void Renderbuffer::RemoveFramebufferAttachmentPoint(Framebuffer* framebuffer, |
| 174 GLenum attachment) { | 145 GLenum attachment) { |
| 175 framebuffer_attachment_points_.erase(std::make_pair(framebuffer, attachment)); | 146 framebuffer_attachment_points_.erase(std::make_pair(framebuffer, attachment)); |
| 176 } | 147 } |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 client_renderbuffer_id); | 312 client_renderbuffer_id); |
| 342 pmd->CreateSharedGlobalAllocatorDump(guid); | 313 pmd->CreateSharedGlobalAllocatorDump(guid); |
| 343 pmd->AddOwnershipEdge(dump->guid(), guid); | 314 pmd->AddOwnershipEdge(dump->guid(), guid); |
| 344 } | 315 } |
| 345 | 316 |
| 346 return true; | 317 return true; |
| 347 } | 318 } |
| 348 | 319 |
| 349 } // namespace gles2 | 320 } // namespace gles2 |
| 350 } // namespace gpu | 321 } // namespace gpu |
| OLD | NEW |