widget/nsShmImage.h
author David Anderson <danderson@mozilla.com>
Sun, 26 Jun 2016 23:33:14 -0700
changeset 342737 6ec2097515dc60d8dde4532eb8db1d767a89ffa0
parent 332041 31b3a03707447d000981a6c1aa2dc81697458fc8
child 345097 803d0028289a74df1be4220a61dd88802a3563a9
permissions -rw-r--r--
Don't initialize gfxPrefs with libpref in the GPU process. (bug 1280822 part 1, r=milan)

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 *
 * 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.h>
#include <X11/extensions/XShm.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();

  static Bool FindEvent(Display* aDisplay, XEvent* aEvent, XPointer aArg);
  bool RequestWasProcessed();
  void WaitForRequest();
  void SendEvent();

  XImage*                      mImage;
  Display*                     mDisplay;
  Window                       mWindow;
  Visual*                      mVisual;
  unsigned int                 mDepth;
  XShmSegmentInfo              mInfo;
  mozilla::gfx::SurfaceFormat  mFormat;
  Pixmap                       mPixmap;
  GC                           mGC;
  unsigned long                mRequest;
  unsigned long                mPreviousRequestProcessed;
};

#endif // MOZ_HAVE_SHMIMAGE

#endif