widget/nsShmImage.h
author Andreas Tolfsen <ato@sny.no>
Thu, 11 Oct 2018 16:40:36 +0000
changeset 443621 9ca2c179e63e292808918158eb778b16bf18e67f
parent 343985 6c29f41213feb59ffce360a679a90688526c0233
child 448947 6f3709b3878117466168c40affa7bca0b60cf75b
permissions -rw-r--r--
bug 1492499: marionette: warn on TimedPromise bailing; r=automatedtester We often use TimedPromise to ensure Marionette does not unexpectedly block on a promise that, for whatever reason, does not resolve. It can however be useful to be alerted when they don't, as it quite often means there is an underlying problem. Depends on D8406 Differential Revision: https://phabricator.services.mozilla.com/D8407

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 *
 * 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_widget_nsShmImage_h__
#define __mozilla_widget_nsShmImage_h__

#if defined(MOZ_X11)
#  define MOZ_HAVE_SHMIMAGE
#endif

#ifdef MOZ_HAVE_SHMIMAGE

#include "mozilla/gfx/2D.h"
#include "nsIWidget.h"
#include "Units.h"

#include <X11/Xlib-xcb.h>
#include <xcb/shm.h>

class nsShmImage {
  // bug 1168843, compositor thread may create shared memory instances that are destroyed by main thread on shutdown, so this must use thread-safe RC to avoid hitting assertion
  NS_INLINE_DECL_THREADSAFE_REFCOUNTING(nsShmImage)

public:
  static bool UseShm();

  already_AddRefed<mozilla::gfx::DrawTarget>
    CreateDrawTarget(const mozilla::LayoutDeviceIntRegion& aRegion);

  void Put(const mozilla::LayoutDeviceIntRegion& aRegion);

  nsShmImage(Display* aDisplay,
             Drawable aWindow,
             Visual* aVisual,
             unsigned int aDepth);

private:
  ~nsShmImage();

  bool InitExtension();

  bool CreateShmSegment();
  void DestroyShmSegment();

  bool CreateImage(const mozilla::gfx::IntSize& aSize);
  void DestroyImage();

  void WaitIfPendingReply();

  Display*                     mDisplay;
  xcb_connection_t*            mConnection;
  Window                       mWindow;
  Visual*                      mVisual;
  unsigned int                 mDepth;

  mozilla::gfx::SurfaceFormat  mFormat;
  mozilla::gfx::IntSize        mSize;
  int                          mStride;

  xcb_pixmap_t                 mPixmap;
  xcb_gcontext_t               mGC;
  xcb_get_input_focus_cookie_t mSyncRequest;
  bool                         mRequestPending;

  xcb_shm_seg_t                mShmSeg;
  int                          mShmId;
  uint8_t*                     mShmAddr;
};

#endif // MOZ_HAVE_SHMIMAGE

#endif