From a4b0e2183c23c0173167833c75f0e2970f3ab524 Mon Sep 17 00:00:00 2001 From: Arvid Nilsson Date: Fri, 13 Dec 2013 15:57:26 +0100 Subject: Quick: Support reparenting To support reparenting, we make the compositing surface independent of the window by using gfx::TEXTURE_TRANSPORT. We also need to be able to keep frame data across window changes so we can reconstruct the QSGNode tree in a new context, so extract that data into DelegatedFrameNodeData class. Any context-specific data is still stored in DelegatedFrameNode. Also hook up window changes to WebContents::WasShown/Hidden for Quick. Remove checking of Qt isVisible state, this mechanism is used to sync Chromium with Qt, not the other way around. WasShown/Hidden is orthogonal to Show/Hide, and can use different triggers. However for Widgets it probably makes sense to hook both up to widget visibility. Change-Id: I1ef4b50cd61b8e54b791e03f0b41929c42fec8bf Reviewed-by: Jocelyn Turcotte --- src/core/render_widget_host_view_qt.cpp | 53 +++++++++++++-------------------- 1 file changed, 21 insertions(+), 32 deletions(-) (limited to 'src/core/render_widget_host_view_qt.cpp') diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp index 0e85c5857..9279c57b0 100644 --- a/src/core/render_widget_host_view_qt.cpp +++ b/src/core/render_widget_host_view_qt.cpp @@ -141,11 +141,12 @@ RenderWidgetHostViewQt::RenderWidgetHostViewQt(content::RenderWidgetHost* widget : m_host(content::RenderWidgetHostImpl::From(widget)) , m_gestureRecognizer(ui::GestureRecognizer::Create(this)) , m_backingStore(0) + , m_frameNodeData(new DelegatedFrameNodeData) + , m_needsDelegatedFrameAck(false) , m_adapterClient(0) , m_anchorPositionWithinSelection(0) , m_cursorPositionWithinSelection(0) , m_initPending(false) - , m_readyForSurface(false) { m_host->SetView(this); } @@ -244,8 +245,7 @@ gfx::NativeView RenderWidgetHostViewQt::GetNativeView() const gfx::NativeViewId RenderWidgetHostViewQt::GetNativeViewId() const { - const_cast(this)->m_readyForSurface = true; - return m_delegate->nativeWindowIdForCompositor(); + return 0; } gfx::NativeViewAccessible RenderWidgetHostViewQt::GetNativeViewAccessible() @@ -333,17 +333,11 @@ gfx::NativeView RenderWidgetHostViewQt::BuildInputMethodsGtkMenu() void RenderWidgetHostViewQt::WasShown() { - if (m_delegate->isVisible()) - return; - m_host->WasShown(); } void RenderWidgetHostViewQt::WasHidden() { - if (!m_delegate->isVisible()) - return; - m_host->WasHidden(); } @@ -584,10 +578,12 @@ bool RenderWidgetHostViewQt::HasAcceleratedSurface(const gfx::Size&) void RenderWidgetHostViewQt::OnSwapCompositorFrame(uint32 output_surface_id, scoped_ptr frame) { - Q_ASSERT(!m_pendingFrameData); - Q_ASSERT(frame->delegated_frame_data); + Q_ASSERT(!m_needsDelegatedFrameAck); + m_needsDelegatedFrameAck = true; m_pendingOutputSurfaceId = output_surface_id; - m_pendingFrameData = frame->delegated_frame_data.Pass(); + Q_ASSERT(frame->delegated_frame_data); + Q_ASSERT(!m_frameNodeData->frameData || m_frameNodeData->frameData->resource_list.empty()); + m_frameNodeData->frameData = frame->delegated_frame_data.Pass(); m_delegate->update(); } @@ -611,12 +607,9 @@ gfx::Rect RenderWidgetHostViewQt::GetBoundsInRootWindow() gfx::GLSurfaceHandle RenderWidgetHostViewQt::GetCompositingSurface() { - gfx::NativeViewId nativeViewId = GetNativeViewId(); -#if defined(OS_WIN) - return nativeViewId ? gfx::GLSurfaceHandle(reinterpret_cast(nativeViewId), gfx::NATIVE_TRANSPORT) : gfx::GLSurfaceHandle(); -#else - return nativeViewId ? gfx::GLSurfaceHandle(nativeViewId, gfx::NATIVE_TRANSPORT) : gfx::GLSurfaceHandle(); -#endif + if (!m_delegate->supportsHardwareAcceleration()) + return gfx::GLSurfaceHandle(); + return gfx::GLSurfaceHandle(gfx::kNullPluginWindow, gfx::TEXTURE_TRANSPORT); } void RenderWidgetHostViewQt::SetHasHorizontalScrollbar(bool) { } @@ -648,20 +641,19 @@ void RenderWidgetHostViewQt::paint(QPainter *painter, const QRectF& boundingRect QSGNode *RenderWidgetHostViewQt::updatePaintNode(QSGNode *oldNode, QQuickWindow *window) { #if (QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)) - if (!m_pendingFrameData) - return oldNode; - DelegatedFrameNode *frameNode = static_cast(oldNode); if (!frameNode) frameNode = new DelegatedFrameNode(window); - frameNode->commit(m_pendingFrameData.get(), &m_resourcesToRelease); - m_pendingFrameData.reset(); + frameNode->commit(m_frameNodeData.data(), &m_resourcesToRelease); // This is possibly called from the Qt render thread, post the ack back to the UI // to tell the child compositors to release resources and trigger a new frame. - content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, - base::Bind(&RenderWidgetHostViewQt::sendDelegatedFrameAck, AsWeakPtr())); + if (m_needsDelegatedFrameAck) { + m_needsDelegatedFrameAck = false; + content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, + base::Bind(&RenderWidgetHostViewQt::sendDelegatedFrameAck, AsWeakPtr())); + } return frameNode; #else @@ -743,11 +735,10 @@ QVariant RenderWidgetHostViewQt::inputMethodQuery(Qt::InputMethodQuery query) co } } -void RenderWidgetHostViewQt::compositingSurfaceUpdated() +void RenderWidgetHostViewQt::windowChanged() { - // Don't report an update until we get asked at least once. - if (m_readyForSurface) - m_host->CompositingSurfaceUpdated(); + if (m_delegate->window()) + m_host->NotifyScreenInfoChanged(); } void RenderWidgetHostViewQt::ProcessAckedTouchEvent(const content::TouchEventWithLatencyInfo &touch, content::InputEventAckState ack_result) { @@ -767,12 +758,10 @@ void RenderWidgetHostViewQt::ProcessAckedTouchEvent(const content::TouchEventWit void RenderWidgetHostViewQt::sendDelegatedFrameAck() { cc::CompositorFrameAck ack; - cc::TransferableResource::ReturnResources(m_resourcesToRelease, &ack.resources); + m_resourcesToRelease.swap(ack.resources); content::RenderWidgetHostImpl::SendSwapCompositorFrameAck( m_host->GetRoutingID(), m_pendingOutputSurfaceId, m_host->GetProcess()->GetID(), ack); - - m_resourcesToRelease.clear(); } void RenderWidgetHostViewQt::Paint(const gfx::Rect& damage_rect) -- cgit v1.2.3