gfx/webrender_bindings/RendererOGL.h
author Mike Hommey <mh+mozilla@glandium.org>
Thu, 28 Sep 2017 08:46:43 +0900
changeset 384593 d6dc8ba8b0762681e7c0ed4005ca5a194d48b325
parent 377666 919487ecd16f41a7e2251130d24e0dc2d959b4ae
child 389027 5f74d262924171a8fa0b4483a64f4cac34c4c9b8
permissions -rw-r--r--
Bug 1403366 - Don't use nsDirectoryService::Create in nsDirectoryService::GetCurrentProcessDirectory. r=froydnj Back in the day, there was no global with an already initialized DirectoryService. But now there is, and, in fact, GetCurrentProcessDirectory already errors out if that global is not set by the time it's called. All calling nsDirectoryService::Create achieves is doing the check again and calling QueryInterface, which we don't need to do anyways.

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set sw=2 sts=2 ts=8 et tw=99 : */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef MOZILLA_LAYERS_RENDEREROGL_H
#define MOZILLA_LAYERS_RENDEREROGL_H

#include "mozilla/layers/CompositorTypes.h"
#include "mozilla/layers/SyncObject.h"
#include "mozilla/webrender/RenderThread.h"
#include "mozilla/webrender/WebRenderTypes.h"
#include "mozilla/webrender/webrender_ffi.h"

namespace mozilla {

namespace gfx {
class DrawTarget;
}

namespace gl {
class GLContext;
}

namespace layers {
class CompositorBridgeParentBase;
}

namespace widget {
class CompositorWidget;
}

namespace wr {

class RenderTextureHost;

/// Owns the WebRender renderer and GL context.
///
/// There is one renderer per window, all owned by the render thread.
/// This class is a similar abstraction to CompositorOGL except that it is used
/// on the render thread instead of the compositor thread.
class RendererOGL
{
  friend wr::WrExternalImage LockExternalImage(void* aObj, wr::WrExternalImageId aId, uint8_t aChannelIndex);
  friend void UnlockExternalImage(void* aObj, wr::WrExternalImageId aId, uint8_t aChannelIndex);

public:
  wr::WrExternalImageHandler GetExternalImageHandler();

  /// This can be called on the render thread only.
  void Update();

  /// This can be called on the render thread only.
  bool Render();

  /// This can be called on the render thread only.
  bool RenderToTarget(gfx::DrawTarget& aTarget);

  /// This can be called on the render thread only.
  void SetProfilerEnabled(bool aEnabled);

  /// This can be called on the render thread only.
  void SetFrameStartTime(const TimeStamp& aTime);

  /// This can be called on the render thread only.
  ~RendererOGL();

  /// This can be called on the render thread only.
  RendererOGL(RefPtr<RenderThread>&& aThread,
              RefPtr<gl::GLContext>&& aGL,
              RefPtr<widget::CompositorWidget>&&,
              wr::WindowId aWindowId,
              wr::Renderer* aRenderer,
              layers::CompositorBridgeParentBase* aBridge);

  /// This can be called on the render thread only.
  void Pause();

  /// This can be called on the render thread only.
  bool Resume();

  layers::SyncObjectHost* GetSyncObject() const { return mSyncObject.get(); }

  layers::CompositorBridgeParentBase* GetCompositorBridge() { return mBridge; }

  wr::WrRenderedEpochs* FlushRenderedEpochs();

  RenderTextureHost* GetRenderTexture(wr::WrExternalImageId aExternalImageId);

  wr::Renderer* GetRenderer() { return mRenderer; }

protected:
  void NotifyWebRenderError(WebRenderError aError);

  RefPtr<RenderThread> mThread;
  RefPtr<gl::GLContext> mGL;
  RefPtr<widget::CompositorWidget> mWidget;
  wr::Renderer* mRenderer;
  layers::CompositorBridgeParentBase* mBridge;
  wr::WindowId mWindowId;
  TimeStamp mFrameStartTime;
  RefPtr<layers::SyncObjectHost> mSyncObject;
  wr::DebugFlags mDebugFlags;
};

} // namespace wr
} // namespace mozilla

#endif