1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- 2 * 3 * This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef __mozilla_widget_nsShmImage_h__ 8 #define __mozilla_widget_nsShmImage_h__ 9 10 #if defined(MOZ_X11) 11 # define MOZ_HAVE_SHMIMAGE 12 #endif 13 14 #ifdef MOZ_HAVE_SHMIMAGE 15 16 # include "mozilla/gfx/2D.h" 17 # include "nsIWidget.h" 18 # include "Units.h" 19 20 # include <X11/Xlib-xcb.h> 21 # include <xcb/shm.h> 22 23 class nsShmImage { 24 // bug 1168843, compositor thread may create shared memory instances that are 25 // destroyed by main thread on shutdown, so this must use thread-safe RC to 26 // avoid hitting assertion 27 NS_INLINE_DECL_THREADSAFE_REFCOUNTING(nsShmImage) 28 29 public: 30 static bool UseShm(); 31 32 already_AddRefed<mozilla::gfx::DrawTarget> CreateDrawTarget( 33 const mozilla::LayoutDeviceIntRegion& aRegion); 34 35 void Put(const mozilla::LayoutDeviceIntRegion& aRegion); 36 37 nsShmImage(Display* aDisplay, Drawable aWindow, Visual* aVisual, 38 unsigned int aDepth); 39 40 private: 41 ~nsShmImage(); 42 43 bool InitExtension(); 44 45 bool CreateShmSegment(); 46 void DestroyShmSegment(); 47 48 bool CreateImage(const mozilla::gfx::IntSize& aSize); 49 void DestroyImage(); 50 51 void WaitIfPendingReply(); 52 53 Display* mDisplay; 54 xcb_connection_t* mConnection; 55 Window mWindow; 56 Visual* mVisual; 57 unsigned int mDepth; 58 59 mozilla::gfx::SurfaceFormat mFormat; 60 mozilla::gfx::IntSize mSize; 61 int mStride; 62 63 xcb_pixmap_t mPixmap; 64 xcb_gcontext_t mGC; 65 xcb_get_input_focus_cookie_t mSyncRequest; 66 bool mRequestPending; 67 68 xcb_shm_seg_t mShmSeg; 69 int mShmId; 70 uint8_t* mShmAddr; 71 }; 72 73 #endif // MOZ_HAVE_SHMIMAGE 74 75 #endif 76