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

Side by Side Diff: content/browser/compositor/io_surface_texture_mac.mm

Issue 647553002: Revert of Use a single CGLContextObj to draw and update the IOSurface (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 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
« no previous file with comments | « content/browser/compositor/io_surface_texture_mac.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/browser/compositor/io_surface_texture_mac.h" 5 #include "content/browser/compositor/io_surface_texture_mac.h"
6 6
7 #include <OpenGL/CGLIOSurface.h> 7 #include <OpenGL/CGLIOSurface.h>
8 #include <OpenGL/CGLRenderers.h> 8 #include <OpenGL/CGLRenderers.h>
9 #include <OpenGL/OpenGL.h> 9 #include <OpenGL/OpenGL.h>
10 #include <OpenGL/gl.h> 10 #include <OpenGL/gl.h>
(...skipping 17 matching lines...) Expand all
28 #include "third_party/skia/include/core/SkBitmap.h" 28 #include "third_party/skia/include/core/SkBitmap.h"
29 #include "ui/gfx/rect.h" 29 #include "ui/gfx/rect.h"
30 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h" 30 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h"
31 #include "ui/gfx/size_conversions.h" 31 #include "ui/gfx/size_conversions.h"
32 #include "ui/gl/gl_context.h" 32 #include "ui/gl/gl_context.h"
33 33
34 namespace content { 34 namespace content {
35 35
36 // static 36 // static
37 scoped_refptr<IOSurfaceTexture> IOSurfaceTexture::Create() { 37 scoped_refptr<IOSurfaceTexture> IOSurfaceTexture::Create() {
38 scoped_refptr<IOSurfaceContext> context = IOSurfaceContext::Get(); 38 scoped_refptr<IOSurfaceContext> offscreen_context =
39 if (!context.get()) { 39 IOSurfaceContext::Get(
40 IOSurfaceContext::kOffscreenContext);
41 if (!offscreen_context.get()) {
40 LOG(ERROR) << "Failed to create context for offscreen operations"; 42 LOG(ERROR) << "Failed to create context for offscreen operations";
41 return NULL; 43 return NULL;
42 } 44 }
43 45
44 return new IOSurfaceTexture(context); 46 return new IOSurfaceTexture(offscreen_context);
45 } 47 }
46 48
47 IOSurfaceTexture::IOSurfaceTexture( 49 IOSurfaceTexture::IOSurfaceTexture(
48 const scoped_refptr<IOSurfaceContext>& context) 50 const scoped_refptr<IOSurfaceContext>& offscreen_context)
49 : context_(context), 51 : offscreen_context_(offscreen_context),
50 texture_(0), 52 texture_(0),
51 gl_error_(GL_NO_ERROR), 53 gl_error_(GL_NO_ERROR),
52 eviction_queue_iterator_(eviction_queue_.Get().end()), 54 eviction_queue_iterator_(eviction_queue_.Get().end()),
53 eviction_has_been_drawn_since_updated_(false) { 55 eviction_has_been_drawn_since_updated_(false) {
54 CHECK(context_.get()); 56 CHECK(offscreen_context_.get());
55 } 57 }
56 58
57 IOSurfaceTexture::~IOSurfaceTexture() { 59 IOSurfaceTexture::~IOSurfaceTexture() {
58 ReleaseIOSurfaceAndTexture(); 60 ReleaseIOSurfaceAndTexture();
59 context_ = NULL; 61 offscreen_context_ = NULL;
60 DCHECK(eviction_queue_iterator_ == eviction_queue_.Get().end()); 62 DCHECK(eviction_queue_iterator_ == eviction_queue_.Get().end());
61 } 63 }
62 64
63 bool IOSurfaceTexture::DrawIOSurface() { 65 bool IOSurfaceTexture::DrawIOSurface() {
64 TRACE_EVENT0("browser", "IOSurfaceTexture::DrawIOSurface"); 66 TRACE_EVENT0("browser", "IOSurfaceTexture::DrawIOSurface");
65 67
66 // If we have release the IOSurface, clear the screen to light grey and 68 // If we have release the IOSurface, clear the screen to light grey and
67 // early-out. 69 // early-out.
68 if (!io_surface_) { 70 if (!io_surface_) {
69 glClearColor(0.9, 0.9, 0.9, 1); 71 glClearColor(0.9, 0.9, 0.9, 1);
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 167
166 // Actual IOSurface size is rounded up to reduce reallocations during window 168 // Actual IOSurface size is rounded up to reduce reallocations during window
167 // resize. Get the actual size to properly map the texture. 169 // resize. Get the actual size to properly map the texture.
168 gfx::Size rounded_size(IOSurfaceGetWidth(io_surface_), 170 gfx::Size rounded_size(IOSurfaceGetWidth(io_surface_),
169 IOSurfaceGetHeight(io_surface_)); 171 IOSurfaceGetHeight(io_surface_));
170 172
171 // Create the GL texture and set it to be backed by the IOSurface. 173 // Create the GL texture and set it to be backed by the IOSurface.
172 CGLError cgl_error = kCGLNoError; 174 CGLError cgl_error = kCGLNoError;
173 { 175 {
174 gfx::ScopedCGLSetCurrentContext scoped_set_current_context( 176 gfx::ScopedCGLSetCurrentContext scoped_set_current_context(
175 context_->cgl_context()); 177 offscreen_context_->cgl_context());
176 glGenTextures(1, &texture_); 178 glGenTextures(1, &texture_);
177 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture_); 179 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture_);
178 glTexParameterf( 180 glTexParameterf(
179 GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 181 GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
180 glTexParameterf( 182 glTexParameterf(
181 GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 183 GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
182 cgl_error = CGLTexImageIOSurface2D( 184 cgl_error = CGLTexImageIOSurface2D(
183 context_->cgl_context(), 185 offscreen_context_->cgl_context(),
184 GL_TEXTURE_RECTANGLE_ARB, 186 GL_TEXTURE_RECTANGLE_ARB,
185 GL_RGBA, 187 GL_RGBA,
186 rounded_size.width(), 188 rounded_size.width(),
187 rounded_size.height(), 189 rounded_size.height(),
188 GL_BGRA, 190 GL_BGRA,
189 GL_UNSIGNED_INT_8_8_8_8_REV, 191 GL_UNSIGNED_INT_8_8_8_8_REV,
190 io_surface_.get(), 192 io_surface_.get(),
191 0 /* plane */); 193 0 /* plane */);
192 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); 194 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);
193 GetAndSaveGLError(); 195 GetAndSaveGLError();
194 } 196 }
195 197
196 // Return failure if an error was encountered by CGL or GL. 198 // Return failure if an error was encountered by CGL or GL.
197 if (cgl_error != kCGLNoError) { 199 if (cgl_error != kCGLNoError) {
198 LOG(ERROR) << "CGLTexImageIOSurface2D failed with CGL error: " << cgl_error; 200 LOG(ERROR) << "CGLTexImageIOSurface2D failed with CGL error: " << cgl_error;
199 return false; 201 return false;
200 } 202 }
201 if (gl_error_ != GL_NO_ERROR) { 203 if (gl_error_ != GL_NO_ERROR) {
202 LOG(ERROR) << "Hit GL error in SetIOSurface: " << gl_error_; 204 LOG(ERROR) << "Hit GL error in SetIOSurface: " << gl_error_;
203 return false; 205 return false;
204 } 206 }
205 207
206 ignore_result(error_runner.Release()); 208 ignore_result(error_runner.Release());
207 return true; 209 return true;
208 } 210 }
209 211
210 void IOSurfaceTexture::ReleaseIOSurfaceAndTexture() { 212 void IOSurfaceTexture::ReleaseIOSurfaceAndTexture() {
211 gfx::ScopedCGLSetCurrentContext scoped_set_current_context( 213 gfx::ScopedCGLSetCurrentContext scoped_set_current_context(
212 context_->cgl_context()); 214 offscreen_context_->cgl_context());
213 215
214 if (texture_) { 216 if (texture_) {
215 glDeleteTextures(1, &texture_); 217 glDeleteTextures(1, &texture_);
216 texture_ = 0; 218 texture_ = 0;
217 } 219 }
218 pixel_size_ = gfx::Size(); 220 pixel_size_ = gfx::Size();
219 io_surface_.reset(); 221 io_surface_.reset();
220 222
221 EvictionMarkEvicted(); 223 EvictionMarkEvicted();
222 } 224 }
223 225
226 bool IOSurfaceTexture::HasBeenPoisoned() const {
227 return offscreen_context_->HasBeenPoisoned();
228 }
229
224 GLenum IOSurfaceTexture::GetAndSaveGLError() { 230 GLenum IOSurfaceTexture::GetAndSaveGLError() {
225 GLenum gl_error = glGetError(); 231 GLenum gl_error = glGetError();
226 if (gl_error_ == GL_NO_ERROR) 232 if (gl_error_ == GL_NO_ERROR)
227 gl_error_ = gl_error; 233 gl_error_ = gl_error;
228 return gl_error; 234 return gl_error;
229 } 235 }
230 236
231 void IOSurfaceTexture::EvictionMarkUpdated() { 237 void IOSurfaceTexture::EvictionMarkUpdated() {
232 EvictionMarkEvicted(); 238 EvictionMarkEvicted();
233 eviction_queue_.Get().push_back(this); 239 eviction_queue_.Get().push_back(this);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 } 288 }
283 289
284 // static 290 // static
285 base::LazyInstance<IOSurfaceTexture::EvictionQueue> 291 base::LazyInstance<IOSurfaceTexture::EvictionQueue>
286 IOSurfaceTexture::eviction_queue_; 292 IOSurfaceTexture::eviction_queue_;
287 293
288 // static 294 // static
289 bool IOSurfaceTexture::eviction_scheduled_ = false; 295 bool IOSurfaceTexture::eviction_scheduled_ = false;
290 296
291 } // namespace content 297 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/compositor/io_surface_texture_mac.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698