Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(77)

Side by Side Diff: content/renderer/gpu/mailbox_output_surface.cc

Issue 16305019: Simplify mailbox handling in MailboxOutputSurface (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « content/renderer/gpu/mailbox_output_surface.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "content/renderer/gpu/mailbox_output_surface.h" 5 #include "content/renderer/gpu/mailbox_output_surface.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "cc/output/compositor_frame.h" 8 #include "cc/output/compositor_frame.h"
9 #include "cc/output/compositor_frame_ack.h" 9 #include "cc/output/compositor_frame_ack.h"
10 #include "cc/output/gl_frame_data.h" 10 #include "cc/output/gl_frame_data.h"
(...skipping 29 matching lines...) Expand all
40 40
41 void MailboxOutputSurface::EnsureBackbuffer() { 41 void MailboxOutputSurface::EnsureBackbuffer() {
42 is_backbuffer_discarded_ = false; 42 is_backbuffer_discarded_ = false;
43 43
44 if (!current_backing_.texture_id) { 44 if (!current_backing_.texture_id) {
45 // Find a texture of matching size to recycle. 45 // Find a texture of matching size to recycle.
46 while (!returned_textures_.empty()) { 46 while (!returned_textures_.empty()) {
47 TransferableFrame& texture = returned_textures_.front(); 47 TransferableFrame& texture = returned_textures_.front();
48 if (texture.size == size_) { 48 if (texture.size == size_) {
49 current_backing_ = texture; 49 current_backing_ = texture;
50 ConsumeTexture(texture);
51 returned_textures_.pop(); 50 returned_textures_.pop();
52 break; 51 break;
53 } 52 }
54 53
55 ConsumeTexture(texture);
56 context3d_->deleteTexture(texture.texture_id); 54 context3d_->deleteTexture(texture.texture_id);
57 returned_textures_.pop(); 55 returned_textures_.pop();
58 } 56 }
59 57
60 if (!current_backing_.texture_id) { 58 if (!current_backing_.texture_id) {
61 current_backing_.texture_id = context3d_->createTexture(); 59 current_backing_.texture_id = context3d_->createTexture();
62 current_backing_.size = size_; 60 current_backing_.size = size_;
63 context3d_->genMailboxCHROMIUM(current_backing_.mailbox.name);
64 context3d_->bindTexture(GL_TEXTURE_2D, current_backing_.texture_id); 61 context3d_->bindTexture(GL_TEXTURE_2D, current_backing_.texture_id);
65 context3d_->texParameteri( 62 context3d_->texParameteri(
66 GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 63 GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
67 context3d_->texParameteri( 64 context3d_->texParameteri(
68 GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 65 GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
69 context3d_->texParameteri( 66 context3d_->texParameteri(
70 GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 67 GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
71 context3d_->texParameteri( 68 context3d_->texParameteri(
72 GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 69 GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
73 context3d_->texImage2D( 70 context3d_->texImage2D(
74 GL_TEXTURE_2D, 0, GL_RGBA, size_.width(), size_.height(), 0, 71 GL_TEXTURE_2D, 0, GL_RGBA, size_.width(), size_.height(), 0,
75 GL_RGBA, GL_UNSIGNED_BYTE, NULL); 72 GL_RGBA, GL_UNSIGNED_BYTE, NULL);
73 context3d_->genMailboxCHROMIUM(current_backing_.mailbox.name);
74 context3d_->produceTextureCHROMIUM(
75 GL_TEXTURE_2D, current_backing_.mailbox.name);
76 } 76 }
77 } 77 }
78 } 78 }
79 79
80 void MailboxOutputSurface::DiscardBackbuffer() { 80 void MailboxOutputSurface::DiscardBackbuffer() {
81 is_backbuffer_discarded_ = true; 81 is_backbuffer_discarded_ = true;
82 82
83 if (current_backing_.texture_id) { 83 if (current_backing_.texture_id) {
84 context3d_->deleteTexture(current_backing_.texture_id); 84 context3d_->deleteTexture(current_backing_.texture_id);
85 current_backing_ = TransferableFrame(); 85 current_backing_ = TransferableFrame();
86 } 86 }
87 87
88 while (!returned_textures_.empty()) { 88 while (!returned_textures_.empty()) {
89 const TransferableFrame& frame = returned_textures_.front(); 89 const TransferableFrame& frame = returned_textures_.front();
90 ConsumeTexture(frame);
91 context3d_->deleteTexture(frame.texture_id); 90 context3d_->deleteTexture(frame.texture_id);
92 returned_textures_.pop(); 91 returned_textures_.pop();
93 } 92 }
94 93
95 if (fbo_) { 94 if (fbo_) {
96 context3d_->bindFramebuffer(GL_FRAMEBUFFER, fbo_); 95 context3d_->bindFramebuffer(GL_FRAMEBUFFER, fbo_);
97 context3d_->deleteFramebuffer(fbo_); 96 context3d_->deleteFramebuffer(fbo_);
98 fbo_ = 0; 97 fbo_ = 0;
99 } 98 }
100 } 99 }
(...skipping 20 matching lines...) Expand all
121 } 120 }
122 121
123 void MailboxOutputSurface::SendFrameToParentCompositor( 122 void MailboxOutputSurface::SendFrameToParentCompositor(
124 cc::CompositorFrame* frame) { 123 cc::CompositorFrame* frame) {
125 frame->gl_frame_data.reset(new GLFrameData()); 124 frame->gl_frame_data.reset(new GLFrameData());
126 125
127 DCHECK(!size_.IsEmpty()); 126 DCHECK(!size_.IsEmpty());
128 DCHECK(size_ == current_backing_.size); 127 DCHECK(size_ == current_backing_.size);
129 DCHECK(!current_backing_.mailbox.IsZero()); 128 DCHECK(!current_backing_.mailbox.IsZero());
130 129
131 context3d_->framebufferTexture2D(
132 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
no sievers 2013/06/03 22:03:51 This was necessary for some Android driver that ha
133 context3d_->bindFramebuffer(GL_FRAMEBUFFER, 0);
134 context3d_->bindTexture(GL_TEXTURE_2D, current_backing_.texture_id);
135 context3d_->produceTextureCHROMIUM(
136 GL_TEXTURE_2D, current_backing_.mailbox.name);
137 frame->gl_frame_data->mailbox = current_backing_.mailbox; 130 frame->gl_frame_data->mailbox = current_backing_.mailbox;
138 frame->gl_frame_data->size = current_backing_.size; 131 frame->gl_frame_data->size = current_backing_.size;
139 context3d_->flush(); 132 context3d_->flush();
140 frame->gl_frame_data->sync_point = context3d_->insertSyncPoint(); 133 frame->gl_frame_data->sync_point = context3d_->insertSyncPoint();
141 CompositorOutputSurface::SendFrameToParentCompositor(frame); 134 CompositorOutputSurface::SendFrameToParentCompositor(frame);
142 135
143 pending_textures_.push_back(current_backing_); 136 pending_textures_.push_back(current_backing_);
144 current_backing_ = TransferableFrame(); 137 current_backing_ = TransferableFrame();
145 } 138 }
146 139
(...skipping 11 matching lines...) Expand all
158 DCHECK(it->size == ack.gl_frame_data->size); 151 DCHECK(it->size == ack.gl_frame_data->size);
159 break; 152 break;
160 } 153 }
161 } 154 }
162 DCHECK(it != pending_textures_.end()); 155 DCHECK(it != pending_textures_.end());
163 it->sync_point = ack.gl_frame_data->sync_point; 156 it->sync_point = ack.gl_frame_data->sync_point;
164 157
165 if (!is_backbuffer_discarded_) { 158 if (!is_backbuffer_discarded_) {
166 returned_textures_.push(*it); 159 returned_textures_.push(*it);
167 } else { 160 } else {
168 ConsumeTexture(*it);
169 context3d_->deleteTexture(it->texture_id); 161 context3d_->deleteTexture(it->texture_id);
170 } 162 }
171 163
172 pending_textures_.erase(it); 164 pending_textures_.erase(it);
173 } else { 165 } else {
174 DCHECK(!pending_textures_.empty()); 166 DCHECK(!pending_textures_.empty());
175 // The browser always keeps one texture as the frontbuffer. 167 // The browser always keeps one texture as the frontbuffer.
176 // If it does not return a mailbox, it discarded the frontbuffer which is 168 // If it does not return a mailbox, it discarded the frontbuffer which is
177 // the oldest texture we sent. 169 // the oldest texture we sent.
178 uint32 texture_id = pending_textures_.front().texture_id; 170 uint32 texture_id = pending_textures_.front().texture_id;
179 if (texture_id) 171 if (texture_id)
180 context3d_->deleteTexture(texture_id); 172 context3d_->deleteTexture(texture_id);
181 pending_textures_.pop_front(); 173 pending_textures_.pop_front();
182 } 174 }
183 CompositorOutputSurface::OnSwapAck(ack); 175 CompositorOutputSurface::OnSwapAck(ack);
184 } 176 }
185 177
186 void MailboxOutputSurface::SwapBuffers(const ui::LatencyInfo&) { 178 void MailboxOutputSurface::SwapBuffers(const ui::LatencyInfo&) {
187 } 179 }
188 180
189 void MailboxOutputSurface::PostSubBuffer(gfx::Rect rect, 181 void MailboxOutputSurface::PostSubBuffer(gfx::Rect rect,
190 const ui::LatencyInfo&) { 182 const ui::LatencyInfo&) {
191 NOTIMPLEMENTED() 183 NOTIMPLEMENTED()
192 << "Partial swap not supported with composite-to-mailbox yet."; 184 << "Partial swap not supported with composite-to-mailbox yet.";
193 185
194 // The browser only copies damage correctly for two buffers in use. 186 // The browser only copies damage correctly for two buffers in use.
195 DCHECK(GetNumAcksPending() < 2); 187 DCHECK(GetNumAcksPending() < 2);
196 } 188 }
197 189
198 void MailboxOutputSurface::ConsumeTexture(const TransferableFrame& frame) {
199 DCHECK(!frame.mailbox.IsZero());
200 if (frame.sync_point)
201 context3d_->waitSyncPoint(frame.sync_point);
202
203 context3d_->bindTexture(GL_TEXTURE_2D, frame.texture_id);
204 context3d_->consumeTextureCHROMIUM(GL_TEXTURE_2D, frame.mailbox.name);
205 }
206
207 size_t MailboxOutputSurface::GetNumAcksPending() { 190 size_t MailboxOutputSurface::GetNumAcksPending() {
208 DCHECK(pending_textures_.size()); 191 DCHECK(pending_textures_.size());
209 return pending_textures_.size() - 1; 192 return pending_textures_.size() - 1;
210 } 193 }
211 194
212 } // namespace content 195 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/gpu/mailbox_output_surface.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698