LCOV - code coverage report
Current view: top level - gfx/webrender_bindings - RendererOGL.cpp (source / functions) Hit Total Coverage
Test: output.info Lines: 0 66 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 12 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
       2             : /* This Source Code Form is subject to the terms of the Mozilla Public
       3             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       4             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
       5             : 
       6             : #include "RendererOGL.h"
       7             : #include "GLContext.h"
       8             : #include "GLContextProvider.h"
       9             : #include "mozilla/gfx/Logging.h"
      10             : #include "mozilla/layers/CompositorBridgeParent.h"
      11             : #include "mozilla/layers/CompositorThread.h"
      12             : #include "mozilla/webrender/RenderBufferTextureHost.h"
      13             : #include "mozilla/webrender/RenderTextureHostOGL.h"
      14             : #include "mozilla/widget/CompositorWidget.h"
      15             : 
      16             : namespace mozilla {
      17             : namespace wr {
      18             : 
      19           0 : WrExternalImage LockExternalImage(void* aObj, WrExternalImageId aId, uint8_t aChannelIndex)
      20             : {
      21           0 :   RendererOGL* renderer = reinterpret_cast<RendererOGL*>(aObj);
      22           0 :   RenderTextureHost* texture = renderer->GetRenderTexture(aId);
      23             : 
      24           0 :   if (texture->AsBufferTextureHost()) {
      25           0 :     RenderBufferTextureHost* bufferTexture = texture->AsBufferTextureHost();
      26           0 :     MOZ_ASSERT(bufferTexture);
      27           0 :     bufferTexture->Lock();
      28             :     RenderBufferTextureHost::RenderBufferData data =
      29           0 :         bufferTexture->GetBufferDataForRender(aChannelIndex);
      30             : 
      31           0 :     return RawDataToWrExternalImage(data.mData, data.mBufferSize);
      32             :   } else {
      33             :     // texture handle case
      34           0 :     RenderTextureHostOGL* textureOGL = texture->AsTextureHostOGL();
      35           0 :     MOZ_ASSERT(textureOGL);
      36             : 
      37           0 :     textureOGL->SetGLContext(renderer->mGL);
      38           0 :     textureOGL->Lock();
      39           0 :     gfx::IntSize size = textureOGL->GetSize(aChannelIndex);
      40             : 
      41           0 :     return NativeTextureToWrExternalImage(textureOGL->GetGLHandle(aChannelIndex),
      42             :                                           0, 0,
      43           0 :                                           size.width, size.height);
      44             :   }
      45             : }
      46             : 
      47           0 : void UnlockExternalImage(void* aObj, WrExternalImageId aId, uint8_t aChannelIndex)
      48             : {
      49           0 :   RendererOGL* renderer = reinterpret_cast<RendererOGL*>(aObj);
      50           0 :   RenderTextureHost* texture = renderer->GetRenderTexture(aId);
      51           0 :   MOZ_ASSERT(texture);
      52           0 :   texture->Unlock();
      53           0 : }
      54             : 
      55           0 : RendererOGL::RendererOGL(RefPtr<RenderThread>&& aThread,
      56             :                          RefPtr<gl::GLContext>&& aGL,
      57             :                          RefPtr<widget::CompositorWidget>&& aWidget,
      58             :                          wr::WindowId aWindowId,
      59             :                          WrRenderer* aWrRenderer,
      60           0 :                          layers::CompositorBridgeParentBase* aBridge)
      61             :   : mThread(aThread)
      62             :   , mGL(aGL)
      63             :   , mWidget(aWidget)
      64             :   , mWrRenderer(aWrRenderer)
      65             :   , mBridge(aBridge)
      66           0 :   , mWindowId(aWindowId)
      67             : {
      68           0 :   MOZ_ASSERT(mThread);
      69           0 :   MOZ_ASSERT(mGL);
      70           0 :   MOZ_ASSERT(mWidget);
      71           0 :   MOZ_ASSERT(mWrRenderer);
      72           0 :   MOZ_ASSERT(mBridge);
      73           0 :   MOZ_COUNT_CTOR(RendererOGL);
      74           0 : }
      75             : 
      76           0 : RendererOGL::~RendererOGL()
      77             : {
      78           0 :   MOZ_COUNT_DTOR(RendererOGL);
      79           0 :   if (!mGL->MakeCurrent()) {
      80           0 :     gfxCriticalNote << "Failed to make render context current during destroying.";
      81             :     // Leak resources!
      82           0 :     return;
      83             :   }
      84           0 :   wr_renderer_delete(mWrRenderer);
      85           0 : }
      86             : 
      87             : WrExternalImageHandler
      88           0 : RendererOGL::GetExternalImageHandler()
      89             : {
      90             :   return WrExternalImageHandler {
      91             :     this,
      92             :     LockExternalImage,
      93             :     UnlockExternalImage,
      94           0 :   };
      95             : }
      96             : 
      97             : void
      98           0 : RendererOGL::Update()
      99             : {
     100           0 :   wr_renderer_update(mWrRenderer);
     101           0 : }
     102             : 
     103             : bool
     104           0 : RendererOGL::Render()
     105             : {
     106           0 :   if (!mGL->MakeCurrent()) {
     107           0 :     gfxCriticalNote << "Failed to make render context current, can't draw.";
     108             :     // XXX This could cause oom in webrender since pending_texture_updates is not handled.
     109             :     // It needs to be addressed.
     110           0 :     return false;
     111             :   }
     112             : 
     113             :   mozilla::widget::WidgetRenderingContext widgetContext;
     114             : 
     115             : #if defined(XP_MACOSX)
     116             :   widgetContext.mGL = mGL;
     117             : // TODO: we don't have a notion of compositor here.
     118             : //#elif defined(MOZ_WIDGET_ANDROID)
     119             : //  widgetContext.mCompositor = mCompositor;
     120             : #endif
     121             : 
     122           0 :   if (!mWidget->PreRender(&widgetContext)) {
     123             :     // XXX This could cause oom in webrender since pending_texture_updates is not handled.
     124             :     // It needs to be addressed.
     125           0 :     return false;
     126             :   }
     127             :   // XXX set clear color if MOZ_WIDGET_ANDROID is defined.
     128             : 
     129           0 :   auto size = mWidget->GetClientSize();
     130           0 :   wr_renderer_render(mWrRenderer, size.width, size.height);
     131             : 
     132           0 :   mGL->SwapBuffers();
     133           0 :   mWidget->PostRender(&widgetContext);
     134             : 
     135             :   // TODO: Flush pending actions such as texture deletions/unlocks and
     136             :   //       textureHosts recycling.
     137             : 
     138           0 :   return true;
     139             : }
     140             : 
     141             : void
     142           0 : RendererOGL::Pause()
     143             : {
     144             : #ifdef MOZ_WIDGET_ANDROID
     145             :   if (!mGL || mGL->IsDestroyed()) {
     146             :     return;
     147             :   }
     148             :   // ReleaseSurface internally calls MakeCurrent.
     149             :   mGL->ReleaseSurface();
     150             : #endif
     151           0 : }
     152             : 
     153             : bool
     154           0 : RendererOGL::Resume()
     155             : {
     156             : #ifdef MOZ_WIDGET_ANDROID
     157             :   if (!mGL || mGL->IsDestroyed()) {
     158             :     return false;
     159             :   }
     160             :   // RenewSurface internally calls MakeCurrent.
     161             :   return mGL->RenewSurface(mWidget);
     162             : #else
     163           0 :   return true;
     164             : #endif
     165             : }
     166             : 
     167             : void
     168           0 : RendererOGL::SetProfilerEnabled(bool aEnabled)
     169             : {
     170           0 :   wr_renderer_set_profiler_enabled(mWrRenderer, aEnabled);
     171           0 : }
     172             : 
     173             : WrRenderedEpochs*
     174           0 : RendererOGL::FlushRenderedEpochs()
     175             : {
     176           0 :   return wr_renderer_flush_rendered_epochs(mWrRenderer);
     177             : }
     178             : 
     179             : RenderTextureHost*
     180           0 : RendererOGL::GetRenderTexture(WrExternalImageId aExternalImageId)
     181             : {
     182           0 :   return mThread->GetRenderTexture(aExternalImageId);
     183             : }
     184             : 
     185             : } // namespace wr
     186             : } // namespace mozilla

Generated by: LCOV version 1.13