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

Side by Side Diff: content/browser/compositor/buffered_output_surface.cc

Issue 516663003: Surfaceless OutputSurface implementation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 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
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/compositor/buffered_output_surface.h"
6
7 #include "content/common/gpu/client/context_provider_command_buffer.h"
8 #include "gpu/GLES2/gl2extchromium.h"
9 #include "gpu/command_buffer/client/gles2_interface.h"
10
11 namespace content {
12
13 BufferedOutputSurface::BufferedOutputSurface(
14 scoped_refptr<cc::ContextProvider> context_provider,
15 unsigned int internalformat)
16 : context_provider_(context_provider),
17 fbo_(0),
18 allocated_count_(0),
19 internalformat_(internalformat) {
20 }
21
22 BufferedOutputSurface::~BufferedOutputSurface() {
23 FreeAllSurfaces();
24
25 gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
26 if (fbo_)
27 gl->DeleteFramebuffers(1, &fbo_);
28 }
29
30 bool BufferedOutputSurface::Initialize() {
31 gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
32 gl->GenFramebuffers(1, &fbo_);
33 return fbo_ != 0;
34 }
35
36 void BufferedOutputSurface::BindFramebuffer() {
37 gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
38 gl->BindFramebuffer(GL_FRAMEBUFFER, fbo_);
39
40 if (!current_surface_.texture) {
41 current_surface_ = GetNextSurface();
42 gl->FramebufferTexture2D(GL_FRAMEBUFFER,
43 GL_COLOR_ATTACHMENT0,
44 GL_TEXTURE_2D,
45 current_surface_.texture,
46 0);
47 }
48 }
49
50 void BufferedOutputSurface::SwapBuffers() {
51 in_flight_surfaces_.push(current_surface_);
52 current_surface_.texture = 0;
53 current_surface_.image = 0;
54 }
55
56 void BufferedOutputSurface::Reshape(const gfx::Size& size, float scale_factor) {
57 DCHECK(!current_surface_.texture);
58 if (size == size_)
59 return;
60 size_ = size;
61
62 // TODO: add stencil buffer when needed.
63 gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
64 gl->BindFramebuffer(GL_FRAMEBUFFER, fbo_);
65 gl->FramebufferTexture2D(
66 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
67
68 FreeAllSurfaces();
69 }
70
71 void BufferedOutputSurface::PageFlipComplete() {
72 if (in_flight_surfaces_.size() > 1) {
73 available_surfaces_.push_back(in_flight_surfaces_.front());
74 in_flight_surfaces_.pop();
75 }
76 }
77
78 void BufferedOutputSurface::FreeAllSurfaces() {
79 FreeSurface(&current_surface_);
80 while (!in_flight_surfaces_.empty()) {
81 FreeSurface(&in_flight_surfaces_.front());
82 in_flight_surfaces_.pop();
83 }
84 for (size_t i = 0; i < available_surfaces_.size(); i++)
85 FreeSurface(&available_surfaces_[i]);
86 available_surfaces_.clear();
87 }
88
89 void BufferedOutputSurface::FreeSurface(AllocatedSurface* surface) {
90 if (surface->texture) {
91 gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
92 gl->BindTexture(GL_TEXTURE_2D, surface->texture);
93 gl->ReleaseTexImage2DCHROMIUM(GL_TEXTURE_2D, surface->image);
94 gl->DeleteTextures(1, &surface->texture);
95 gl->DestroyImageCHROMIUM(surface->image);
96 surface->image = 0;
97 surface->texture = 0;
98 allocated_count_--;
99 }
100 }
101
102 BufferedOutputSurface::AllocatedSurface
103 BufferedOutputSurface::GetNextSurface() {
104 if (!available_surfaces_.empty()) {
105 AllocatedSurface id = available_surfaces_.back();
106 available_surfaces_.pop_back();
107 return id;
108 }
109
110 unsigned int texture;
piman 2014/09/12 21:58:29 nit: =0 If the context is lost, GenTextures may n
achaulk 2014/09/15 16:31:43 Done.
111 gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
112 gl->GenTextures(1, &texture);
113
114 // We don't want to allow anything more than triple buffering.
115 DCHECK_LT(allocated_count_, 4U);
116
117 unsigned int id = context_provider_->ContextGL()->CreateImageCHROMIUM(
118 size_.width(),
119 size_.height(),
120 internalformat_,
121 GL_IMAGE_SCANOUT_CHROMIUM);
122 DCHECK(id);
piman 2014/09/12 21:58:30 nit: if the context is lost, id will be 0.
achaulk 2014/09/15 16:31:42 Done.
piman 2014/09/15 18:29:58 I still see the DCHECK in the new code. Is the DC
achaulk 2014/09/15 18:41:24 Yeah, forgot to save the file after removing that
123 allocated_count_++;
124 gl->BindTexture(GL_TEXTURE_2D, texture);
125 gl->BindTexImage2DCHROMIUM(GL_TEXTURE_2D, id);
126 return AllocatedSurface(texture, id);
127 }
128
129 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698