widget/nsShmImage.h
author Chris H-C <chutten@mozilla.com>
Mon, 04 Jul 2016 11:16:05 -0400
changeset 312997 df28918fe2361f0b54ca9ce4773a29c4c0675d06
parent 306495 ddcceb6bf9a6e4a1dc12df5967d78674f7d0bd62
permissions -rw-r--r--
bug 1218576 - Support remote accumulation via JS histograms. r=gfritzsche The JS histograms, too, need to dispatch their accumulations from child to parent. JSHistograms_Add now only supports histograms that are in gHistogramsMap or that were created in the parent process. After bug 1288745, maybe we'll be able to change this to be less convoluted. MozReview-Commit-ID: 3qTH89YKbGP

/* -*- 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-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();

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

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

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

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

#endif // MOZ_HAVE_SHMIMAGE

#endif