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

Side by Side Diff: third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.cpp

Issue 2267993002: Expose if we are using swiftshader via WebGraphicsContext3DProvider. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: softwarerendering: . Created 4 years, 4 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
1 /* 1 /*
2 * Copyright (c) 2010, Google Inc. All rights reserved. 2 * Copyright (c) 2010, Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 bool wantDepth, 147 bool wantDepth,
148 bool wantStencil) 148 bool wantStencil)
149 : m_preserveDrawingBuffer(preserve) 149 : m_preserveDrawingBuffer(preserve)
150 , m_webGLVersion(webGLVersion) 150 , m_webGLVersion(webGLVersion)
151 , m_contextProvider(std::move(contextProvider)) 151 , m_contextProvider(std::move(contextProvider))
152 , m_gl(m_contextProvider->contextGL()) 152 , m_gl(m_contextProvider->contextGL())
153 , m_extensionsUtil(std::move(extensionsUtil)) 153 , m_extensionsUtil(std::move(extensionsUtil))
154 , m_discardFramebufferSupported(discardFramebufferSupported) 154 , m_discardFramebufferSupported(discardFramebufferSupported)
155 , m_wantAlphaChannel(wantAlphaChannel) 155 , m_wantAlphaChannel(wantAlphaChannel)
156 , m_premultipliedAlpha(premultipliedAlpha) 156 , m_premultipliedAlpha(premultipliedAlpha)
157 , m_softwareRendering(m_contextProvider->isSoftwareRendering())
157 , m_wantDepth(wantDepth) 158 , m_wantDepth(wantDepth)
158 , m_wantStencil(wantStencil) 159 , m_wantStencil(wantStencil)
159 { 160 {
160 memset(m_colorMask, 0, 4 * sizeof(GLboolean)); 161 memset(m_colorMask, 0, 4 * sizeof(GLboolean));
161 memset(m_clearColor, 0, 4 * sizeof(GLfloat)); 162 memset(m_clearColor, 0, 4 * sizeof(GLfloat));
162 // Used by browser tests to detect the use of a DrawingBuffer. 163 // Used by browser tests to detect the use of a DrawingBuffer.
163 TRACE_EVENT_INSTANT0("test_gpu", "DrawingBufferCreation", TRACE_EVENT_SCOPE_ GLOBAL); 164 TRACE_EVENT_INSTANT0("test_gpu", "DrawingBufferCreation", TRACE_EVENT_SCOPE_ GLOBAL);
164 } 165 }
165 166
166 DrawingBuffer::~DrawingBuffer() 167 DrawingBuffer::~DrawingBuffer()
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
257 return std::move(recycled.bitmap); 258 return std::move(recycled.bitmap);
258 } 259 }
259 260
260 return Platform::current()->allocateSharedBitmap(m_size); 261 return Platform::current()->allocateSharedBitmap(m_size);
261 } 262 }
262 263
263 bool DrawingBuffer::PrepareTextureMailbox(cc::TextureMailbox* outMailbox, 264 bool DrawingBuffer::PrepareTextureMailbox(cc::TextureMailbox* outMailbox,
264 std::unique_ptr<cc::SingleReleaseCallback>* outReleaseCallback, 265 std::unique_ptr<cc::SingleReleaseCallback>* outReleaseCallback,
265 bool useSharedMemory) 266 bool useSharedMemory)
266 { 267 {
268 bool forceGpuResult = false;
269 return prepareTextureMailboxInternal(outMailbox, outReleaseCallback, forceGp uResult);
270 }
271
272 bool DrawingBuffer::prepareTextureMailboxInternal(
danakj 2016/08/22 22:57:44 I added a prepareTextureMailboxInternal that lets
273 cc::TextureMailbox* outMailbox,
274 std::unique_ptr<cc::SingleReleaseCallback>* outReleaseCallback,
275 bool forceGpuResult)
276 {
267 if (m_destructionInProgress) { 277 if (m_destructionInProgress) {
268 // It can be hit in the following sequence. 278 // It can be hit in the following sequence.
269 // 1. WebGL draws something. 279 // 1. WebGL draws something.
270 // 2. The compositor begins the frame. 280 // 2. The compositor begins the frame.
271 // 3. Javascript makes a context lost using WEBGL_lose_context extension . 281 // 3. Javascript makes a context lost using WEBGL_lose_context extension .
272 // 4. Here. 282 // 4. Here.
273 return false; 283 return false;
274 } 284 }
275 ASSERT(!m_isHidden); 285 ASSERT(!m_isHidden);
276 if (!m_contentsChanged) 286 if (!m_contentsChanged)
277 return false; 287 return false;
278 288
289 // If the context is lost, we don't know if we should be producing GPU or
290 // software frames, until we get a new context, since the compositor will
291 // be trying to get a new context and may change modes.
292 if (m_gl->GetGraphicsResetStatusKHR() != GL_NO_ERROR)
293 return false;
294
279 TRACE_EVENT0("blink,rail", "DrawingBuffer::prepareMailbox"); 295 TRACE_EVENT0("blink,rail", "DrawingBuffer::prepareMailbox");
280 296
281 if (m_newMailboxCallback) 297 if (m_newMailboxCallback)
282 (*m_newMailboxCallback)(); 298 (*m_newMailboxCallback)();
283 299
284 // Resolve the multisampled buffer into m_colorBuffer texture. 300 // Resolve the multisampled buffer into m_colorBuffer texture.
285 if (m_antiAliasingMode != None) 301 if (m_antiAliasingMode != None)
286 commit(); 302 commit();
287 303
288 if (useSharedMemory) { 304 if (m_softwareRendering && !forceGpuResult) {
289 std::unique_ptr<cc::SharedBitmap> bitmap = createOrRecycleBitmap(); 305 std::unique_ptr<cc::SharedBitmap> bitmap = createOrRecycleBitmap();
290 if (!bitmap) 306 if (!bitmap)
291 return false; 307 return false;
292 unsigned char* pixels = bitmap->pixels(); 308 unsigned char* pixels = bitmap->pixels();
293 DCHECK(pixels); 309 DCHECK(pixels);
294 310
295 bool needPremultiply = m_wantAlphaChannel && !m_premultipliedAlpha; 311 bool needPremultiply = m_wantAlphaChannel && !m_premultipliedAlpha;
296 WebGLImageConversion::AlphaOp op = needPremultiply ? WebGLImageConversio n::AlphaDoPremultiply : WebGLImageConversion::AlphaDoNothing; 312 WebGLImageConversion::AlphaOp op = needPremultiply ? WebGLImageConversio n::AlphaDoPremultiply : WebGLImageConversion::AlphaDoNothing;
297 readBackFramebuffer(pixels, size().width(), size().height(), ReadbackSki a, op); 313 readBackFramebuffer(pixels, size().width(), size().height(), ReadbackSki a, op);
298 314
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 m_recycledBitmapQueue.append(std::move(recycled)); 414 m_recycledBitmapQueue.append(std::move(recycled));
399 } 415 }
400 416
401 PassRefPtr<StaticBitmapImage> DrawingBuffer::transferToStaticBitmapImage() 417 PassRefPtr<StaticBitmapImage> DrawingBuffer::transferToStaticBitmapImage()
402 { 418 {
403 // This can be null if the context is lost before the first call to grContex t(). 419 // This can be null if the context is lost before the first call to grContex t().
404 GrContext* grContext = m_contextProvider->grContext(); 420 GrContext* grContext = m_contextProvider->grContext();
405 421
406 cc::TextureMailbox textureMailbox; 422 cc::TextureMailbox textureMailbox;
407 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback; 423 std::unique_ptr<cc::SingleReleaseCallback> releaseCallback;
408 bool useSharedMemory = false;
409 bool success = false; 424 bool success = false;
410 if (grContext) 425 if (grContext) {
411 success = PrepareTextureMailbox(&textureMailbox, &releaseCallback, useSh aredMemory); 426 bool forceGpuResult = true;
427 success = prepareTextureMailboxInternal(&textureMailbox, &releaseCallbac k, forceGpuResult);
428 }
412 if (!success) { 429 if (!success) {
413 // If we can't get a mailbox, return an transparent black ImageBitmap. 430 // If we can't get a mailbox, return an transparent black ImageBitmap.
414 // The only situation this could happen is when two or more calls to tra nsferToImageBitmap are made back-to-back, or when the context gets lost. 431 // The only situation this could happen is when two or more calls to tra nsferToImageBitmap are made back-to-back, or when the context gets lost.
415 sk_sp<SkSurface> surface = SkSurface::MakeRasterN32Premul(m_size.width() , m_size.height()); 432 sk_sp<SkSurface> surface = SkSurface::MakeRasterN32Premul(m_size.width() , m_size.height());
416 return StaticBitmapImage::create(fromSkSp(surface->makeImageSnapshot())) ; 433 return StaticBitmapImage::create(fromSkSp(surface->makeImageSnapshot())) ;
417 } 434 }
418 435
419 DCHECK_EQ(m_size.width(), textureMailbox.size_in_pixels().width()); 436 DCHECK_EQ(m_size.width(), textureMailbox.size_in_pixels().width());
420 DCHECK_EQ(m_size.height(), textureMailbox.size_in_pixels().height()); 437 DCHECK_EQ(m_size.height(), textureMailbox.size_in_pixels().height());
421 438
(...skipping 791 matching lines...) Expand 10 before | Expand all | Expand 10 after
1213 1230
1214 void DrawingBuffer::restoreTextureBindings() 1231 void DrawingBuffer::restoreTextureBindings()
1215 { 1232 {
1216 // This class potentially modifies the bindings for GL_TEXTURE_2D and 1233 // This class potentially modifies the bindings for GL_TEXTURE_2D and
1217 // GL_TEXTURE_RECTANGLE. Only GL_TEXTURE_2D needs to be restored since 1234 // GL_TEXTURE_RECTANGLE. Only GL_TEXTURE_2D needs to be restored since
1218 // the public interface for WebGL does not support GL_TEXTURE_RECTANGLE. 1235 // the public interface for WebGL does not support GL_TEXTURE_RECTANGLE.
1219 m_gl->BindTexture(GL_TEXTURE_2D, m_texture2DBinding); 1236 m_gl->BindTexture(GL_TEXTURE_2D, m_texture2DBinding);
1220 } 1237 }
1221 1238
1222 } // namespace blink 1239 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698