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

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

Issue 2653933003: Make stream captures work on canvases that are not in the DOM. (Closed)
Patch Set: Created 3 years, 10 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) 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2012 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 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. 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 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 828 matching lines...) Expand 10 before | Expand all | Expand 10 after
839 if (m_imageBuffer) 839 if (m_imageBuffer)
840 m_imageBuffer->notifySurfaceInvalid(); 840 m_imageBuffer->notifySurfaceInvalid();
841 CanvasMetrics::countCanvasContextUsage( 841 CanvasMetrics::countCanvasContextUsage(
842 CanvasMetrics::Accelerated2DCanvasGPUContextLost); 842 CanvasMetrics::Accelerated2DCanvasGPUContextLost);
843 } 843 }
844 return m_surface.get(); 844 return m_surface.get();
845 } 845 }
846 846
847 bool Canvas2DLayerBridge::restoreSurface() { 847 bool Canvas2DLayerBridge::restoreSurface() {
848 DCHECK(!m_destructionInProgress); 848 DCHECK(!m_destructionInProgress);
849 if (m_destructionInProgress) 849 if (m_destructionInProgress || !isAccelerated())
xlai (Olivia) 2017/01/27 22:23:25 Why is this change related to the decoupling of fi
Justin Novosad 2017/02/07 21:52:29 I was getting DCHECK failures below in some of the
850 return false; 850 return false;
851 DCHECK(isAccelerated() && !m_surface); 851 DCHECK(!m_surface);
852 852
853 gpu::gles2::GLES2Interface* sharedGL = nullptr; 853 gpu::gles2::GLES2Interface* sharedGL = nullptr;
854 m_layer->clearTexture(); 854 m_layer->clearTexture();
855 m_contextProvider = WTF::wrapUnique( 855 m_contextProvider = WTF::wrapUnique(
856 Platform::current()->createSharedOffscreenGraphicsContext3DProvider()); 856 Platform::current()->createSharedOffscreenGraphicsContext3DProvider());
857 if (m_contextProvider) 857 if (m_contextProvider)
858 sharedGL = m_contextProvider->contextGL(); 858 sharedGL = m_contextProvider->contextGL();
859 859
860 if (sharedGL && sharedGL->GetGraphicsResetStatusKHR() == GL_NO_ERROR) { 860 if (sharedGL && sharedGL->GetGraphicsResetStatusKHR() == GL_NO_ERROR) {
861 GrContext* grCtx = m_contextProvider->grContext(); 861 GrContext* grCtx = m_contextProvider->grContext();
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
911 cc::TextureMailbox* outMailbox, 911 cc::TextureMailbox* outMailbox,
912 std::unique_ptr<cc::SingleReleaseCallback>* outReleaseCallback) { 912 std::unique_ptr<cc::SingleReleaseCallback>* outReleaseCallback) {
913 if (m_destructionInProgress) { 913 if (m_destructionInProgress) {
914 // It can be hit in the following sequence. 914 // It can be hit in the following sequence.
915 // 1. Canvas draws something. 915 // 1. Canvas draws something.
916 // 2. The compositor begins the frame. 916 // 2. The compositor begins the frame.
917 // 3. Javascript makes a context be lost. 917 // 3. Javascript makes a context be lost.
918 // 4. Here. 918 // 4. Here.
919 return false; 919 return false;
920 } 920 }
921 DCHECK(isAccelerated() || isHibernating() || m_softwareRenderingWhileHidden);
922
923 // if hibernating but not hidden, we want to wake up from
924 // hibernation
925 if ((isHibernating() || m_softwareRenderingWhileHidden) && isHidden())
926 return false;
927 921
928 // If the context is lost, we don't know if we should be producing GPU or 922 // If the context is lost, we don't know if we should be producing GPU or
929 // software frames, until we get a new context, since the compositor will 923 // software frames, until we get a new context, since the compositor will
930 // be trying to get a new context and may change modes. 924 // be trying to get a new context and may change modes.
931 if (!m_contextProvider || 925 if (!m_contextProvider ||
932 m_contextProvider->contextGL()->GetGraphicsResetStatusKHR() != 926 m_contextProvider->contextGL()->GetGraphicsResetStatusKHR() !=
933 GL_NO_ERROR) 927 GL_NO_ERROR)
934 return false; 928 return false;
935 929
930 DCHECK(isAccelerated() || isHibernating() || m_softwareRenderingWhileHidden);
xlai (Olivia) 2017/01/27 22:23:25 Same question.
Justin Novosad 2017/02/07 21:52:29 Same answer.
931
932 // if hibernating but not hidden, we want to wake up from
933 // hibernation
934 if ((isHibernating() || m_softwareRenderingWhileHidden) && isHidden())
935 return false;
936
936 sk_sp<SkImage> image = 937 sk_sp<SkImage> image =
937 newImageSnapshot(PreferAcceleration, SnapshotReasonUnknown); 938 newImageSnapshot(PreferAcceleration, SnapshotReasonUnknown);
938 if (!image || !image->getTexture()) 939 if (!image || !image->getTexture())
939 return false; 940 return false;
940 941
941 // Early exit if canvas was not drawn to since last prepareMailbox. 942 // Early exit if canvas was not drawn to since last prepareMailbox.
942 GLenum filter = getGLFilter(); 943 GLenum filter = getGLFilter();
943 if (image->uniqueID() == m_lastImageId && filter == m_lastFilter) 944 if (image->uniqueID() == m_lastImageId && filter == m_lastFilter)
944 return false; 945 return false;
945 m_lastImageId = image->uniqueID(); 946 m_lastImageId = image->uniqueID();
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
1055 } 1056 }
1056 } 1057 }
1057 if (!m_isRegisteredTaskObserver) { 1058 if (!m_isRegisteredTaskObserver) {
1058 Platform::current()->currentThread()->addTaskObserver(this); 1059 Platform::current()->currentThread()->addTaskObserver(this);
1059 m_isRegisteredTaskObserver = true; 1060 m_isRegisteredTaskObserver = true;
1060 } 1061 }
1061 m_didDrawSinceLastFlush = true; 1062 m_didDrawSinceLastFlush = true;
1062 m_didDrawSinceLastGpuFlush = true; 1063 m_didDrawSinceLastGpuFlush = true;
1063 } 1064 }
1064 1065
1065 void Canvas2DLayerBridge::prepareSurfaceForPaintingIfNeeded() { 1066 void Canvas2DLayerBridge::finalizeFrame() {
1067 DCHECK(!m_destructionInProgress);
1068
1069 // Make sure surface is ready for painting: fix the rendering mode now
1070 // because it will be too late during the paint invalidation phase.
1066 getOrCreateSurface(PreferAcceleration); 1071 getOrCreateSurface(PreferAcceleration);
1067 }
1068 1072
1069 void Canvas2DLayerBridge::finalizeFrame(const FloatRect& dirtyRect) {
1070 DCHECK(!m_destructionInProgress);
1071 if (m_layer && m_accelerationMode != DisableAcceleration)
1072 m_layer->layer()->invalidateRect(enclosingIntRect(dirtyRect));
1073 if (m_rateLimiter) 1073 if (m_rateLimiter)
1074 m_rateLimiter->reset(); 1074 m_rateLimiter->reset();
1075 m_renderingTaskCompletedForCurrentFrame = false; 1075 m_renderingTaskCompletedForCurrentFrame = false;
1076 } 1076 }
1077 1077
1078 void Canvas2DLayerBridge::doPaintInvalidation(const FloatRect& dirtyRect) {
1079 DCHECK(!m_destructionInProgress);
1080 if (m_layer && m_accelerationMode != DisableAcceleration)
1081 m_layer->layer()->invalidateRect(enclosingIntRect(dirtyRect));
1082 }
1083
1078 void Canvas2DLayerBridge::didProcessTask() { 1084 void Canvas2DLayerBridge::didProcessTask() {
1079 TRACE_EVENT0("cc", "Canvas2DLayerBridge::didProcessTask"); 1085 TRACE_EVENT0("cc", "Canvas2DLayerBridge::didProcessTask");
1080 DCHECK(m_isRegisteredTaskObserver); 1086 DCHECK(m_isRegisteredTaskObserver);
1081 // If m_renderTaskProcessedForCurrentFrame is already set to true, 1087 // If m_renderTaskProcessedForCurrentFrame is already set to true,
1082 // it means that rendering tasks are not synchronized with the compositor 1088 // it means that rendering tasks are not synchronized with the compositor
1083 // (i.e. not using requestAnimationFrame), so we are at risk of posting 1089 // (i.e. not using requestAnimationFrame), so we are at risk of posting
1084 // a multi-frame backlog to the GPU 1090 // a multi-frame backlog to the GPU
1085 if (m_renderingTaskCompletedForCurrentFrame) { 1091 if (m_renderingTaskCompletedForCurrentFrame) {
1086 if (isAccelerated()) { 1092 if (isAccelerated()) {
1087 flushGpu(); 1093 flushGpu();
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1149 default; 1155 default;
1150 1156
1151 void Canvas2DLayerBridge::Logger::reportHibernationEvent( 1157 void Canvas2DLayerBridge::Logger::reportHibernationEvent(
1152 HibernationEvent event) { 1158 HibernationEvent event) {
1153 DEFINE_STATIC_LOCAL(EnumerationHistogram, hibernationHistogram, 1159 DEFINE_STATIC_LOCAL(EnumerationHistogram, hibernationHistogram,
1154 ("Canvas.HibernationEvents", HibernationEventCount)); 1160 ("Canvas.HibernationEvents", HibernationEventCount));
1155 hibernationHistogram.count(event); 1161 hibernationHistogram.count(event);
1156 } 1162 }
1157 1163
1158 } // namespace blink 1164 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698