# Global Metrics

path: .metrics.nexits.sum
old: 1.0
new: 13.0
path: .metrics.nexits.average
old: 1.0
new: 0.8666666666666667
path: .metrics.nargs.average
old: 0.0
new: 1.3333333333333333
path: .metrics.nargs.sum
old: 0.0
new: 20.0
path: .metrics.cyclomatic.sum
old: 2.0
new: 53.0
path: .metrics.halstead.purity_ratio
old: 1.944234353490973
new: 1.1520124007995094
path: .metrics.halstead.estimated_program_length
old: 13.60964047443681
new: 812.1687425636541
path: .metrics.halstead.vocabulary
old: 7.0
new: 124.0
path: .metrics.halstead.length
old: 7.0
new: 705.0
path: .metrics.halstead.level
old: 0.4
new: 0.09011857707509882
path: .metrics.halstead.N2
old: 2.0
new: 253.0
path: .metrics.halstead.volume
old: 19.651484454403228
new: 4902.708398822747
path: .metrics.halstead.n1
old: 5.0
new: 10.0
path: .metrics.halstead.difficulty
old: 2.5
new: 11.096491228070176
path: .metrics.halstead.time
old: 2.7293728408893374
new: 3022.381152295699
path: .metrics.halstead.effort
old: 49.12871113600807
new: 54402.86074132258
path: .metrics.halstead.N1
old: 5.0
new: 452.0
path: .metrics.halstead.bugs
old: 0.004471319041702271
new: 0.4785859046094203
path: .metrics.halstead.n2
old: 2.0
new: 114.0
path: .metrics.mi.mi_original
old: 132.59563637273845
new: 31.2333655331973
path: .metrics.mi.mi_sei
old: 115.79785476526216
new: -3.8575473358899792
path: .metrics.mi.mi_visual_studio
old: 77.54130782031488
new: 18.26512604280544
path: .metrics.nom.total
old: 1.0
new: 15.0
path: .metrics.nom.functions
old: 1.0
new: 15.0
path: .metrics.loc.blank
old: 0.0
new: 19.0
path: .metrics.loc.cloc
old: 0.0
new: 14.0
path: .metrics.loc.ploc
old: 4.0
new: 139.0
path: .metrics.loc.lloc
old: 1.0
new: 15.0
path: .metrics.loc.sloc
old: 4.0
new: 172.0

# Spaces Data

## Minimal test - lines (27, 170)

path: .spaces[0].metrics.mi.mi_original
old: 132.82563637273847
new: 34.59484198666132
path: .spaces[0].metrics.mi.mi_sei
old: 116.0278547652622
new: -6.2622908107657675
path: .spaces[0].metrics.mi.mi_visual_studio
old: 77.67581074429151
new: 20.23090174658557
path: .spaces[0].metrics.nom.total
old: 1.0
new: 15.0
path: .spaces[0].metrics.nom.functions
old: 1.0
new: 15.0
path: .spaces[0].metrics.cyclomatic.sum
old: 1.0
new: 52.0
path: .spaces[0].metrics.halstead.time
old: 2.7293728408893374
new: 2697.629183044905
path: .spaces[0].metrics.halstead.difficulty
old: 2.5
new: 10.398058252427184
path: .spaces[0].metrics.halstead.length
old: 7.0
new: 686.0
path: .spaces[0].metrics.halstead.N2
old: 2.0
new: 238.0
path: .spaces[0].metrics.halstead.level
old: 0.4
new: 0.096171802054155
path: .spaces[0].metrics.halstead.vocabulary
old: 7.0
new: 112.0
path: .spaces[0].metrics.halstead.effort
old: 49.12871113600807
new: 48557.32529480829
path: .spaces[0].metrics.halstead.estimated_program_length
old: 13.60964047443681
new: 717.2388793128523
path: .spaces[0].metrics.halstead.purity_ratio
old: 1.944234353490973
new: 1.0455377249458488
path: .spaces[0].metrics.halstead.n2
old: 2.0
new: 103.0
path: .spaces[0].metrics.halstead.N1
old: 5.0
new: 448.0
path: .spaces[0].metrics.halstead.n1
old: 5.0
new: 9.0
path: .spaces[0].metrics.halstead.volume
old: 19.651484454403228
new: 4669.845476531516
path: .spaces[0].metrics.halstead.bugs
old: 0.004471319041702271
new: 0.4436582714499318
path: .spaces[0].metrics.nargs.average
old: 0.0
new: 1.3333333333333333
path: .spaces[0].metrics.nargs.sum
old: 0.0
new: 20.0
path: .spaces[0].metrics.nexits.average
old: 1.0
new: 0.8666666666666667
path: .spaces[0].metrics.nexits.sum
old: 1.0
new: 13.0
path: .spaces[0].metrics.loc.cloc
old: 0.0
new: 5.0
path: .spaces[0].metrics.loc.blank
old: 0.0
new: 16.0
path: .spaces[0].metrics.loc.lloc
old: 1.0
new: 15.0
path: .spaces[0].metrics.loc.sloc
old: 4.0
new: 144.0
path: .spaces[0].metrics.loc.ploc
old: 4.0
new: 123.0

### Code

    namespace mozilla {
    namespace widget {

    typedef struct gbm_device* (*CreateDeviceFunc)(int);
    typedef struct gbm_bo* (*CreateFunc)(struct gbm_device*, uint32_t, uint32_t,
                                         uint32_t, uint32_t);
    typedef struct gbm_bo* (*CreateWithModifiersFunc)(struct gbm_device*, uint32_t,
                                                      uint32_t, uint32_t,
                                                      const uint64_t*,
                                                      const unsigned int);
    typedef uint64_t (*GetModifierFunc)(struct gbm_bo*);
    typedef uint32_t (*GetStrideFunc)(struct gbm_bo*);
    typedef int (*GetFdFunc)(struct gbm_bo*);
    typedef void (*DestroyFunc)(struct gbm_bo*);
    typedef void* (*MapFunc)(struct gbm_bo*, uint32_t, uint32_t, uint32_t, uint32_t,
                             uint32_t, uint32_t*, void**);
    typedef void (*UnmapFunc)(struct gbm_bo*, void*);
    typedef int (*GetPlaneCountFunc)(struct gbm_bo*);
    typedef union gbm_bo_handle (*GetHandleForPlaneFunc)(struct gbm_bo*, int);
    typedef uint32_t (*GetStrideForPlaneFunc)(struct gbm_bo*, int);
    typedef uint32_t (*GetOffsetFunc)(struct gbm_bo*, int);
    typedef int (*DeviceIsFormatSupportedFunc)(struct gbm_device*, uint32_t,
                                               uint32_t);
    typedef int (*DrmPrimeHandleToFDFunc)(int, uint32_t, uint32_t, int*);

    class nsGbmLib {
     public:
      static bool Load();
      static bool IsLoaded();
      static bool IsAvailable();
      static bool IsModifierAvailable();

      static struct gbm_device* CreateDevice(int fd) { return sCreateDevice(fd); };
      static struct gbm_bo* Create(struct gbm_device* gbm, uint32_t width,
                                   uint32_t height, uint32_t format,
                                   uint32_t flags) {
        return sCreate(gbm, width, height, format, flags);
      }
      static void Destroy(struct gbm_bo* bo) { sDestroy(bo); }
      static uint32_t GetStride(struct gbm_bo* bo) { return sGetStride(bo); }
      static int GetFd(struct gbm_bo* bo) { return sGetFd(bo); }
      static void* Map(struct gbm_bo* bo, uint32_t x, uint32_t y, uint32_t width,
                       uint32_t height, uint32_t flags, uint32_t* stride,
                       void** map_data) {
        return sMap(bo, x, y, width, height, flags, stride, map_data);
      }
      static void Unmap(struct gbm_bo* bo, void* map_data) { sUnmap(bo, map_data); }
      static struct gbm_bo* CreateWithModifiers(struct gbm_device* gbm,
                                                uint32_t width, uint32_t height,
                                                uint32_t format,
                                                const uint64_t* modifiers,
                                                const unsigned int count) {
        return sCreateWithModifiers(gbm, width, height, format, modifiers, count);
      }
      static uint64_t GetModifier(struct gbm_bo* bo) { return sGetModifier(bo); }
      static int GetPlaneCount(struct gbm_bo* bo) { return sGetPlaneCount(bo); }
      static union gbm_bo_handle GetHandleForPlane(struct gbm_bo* bo, int plane) {
        return sGetHandleForPlane(bo, plane);
      }
      static uint32_t GetStrideForPlane(struct gbm_bo* bo, int plane) {
        return sGetStrideForPlane(bo, plane);
      }
      static uint32_t GetOffset(struct gbm_bo* bo, int plane) {
        return sGetOffset(bo, plane);
      }
      static int DeviceIsFormatSupported(struct gbm_device* gbm, uint32_t format,
                                         uint32_t usage) {
        return sDeviceIsFormatSupported(gbm, format, usage);
      }

      static int DrmPrimeHandleToFD(int fd, uint32_t handle, uint32_t flags,
                                    int* prime_fd) {
        return sDrmPrimeHandleToFD(fd, handle, flags, prime_fd);
      }

     private:
      static CreateDeviceFunc sCreateDevice;
      static CreateFunc sCreate;
      static CreateWithModifiersFunc sCreateWithModifiers;
      static GetModifierFunc sGetModifier;
      static GetStrideFunc sGetStride;
      static GetFdFunc sGetFd;
      static DestroyFunc sDestroy;
      static MapFunc sMap;
      static UnmapFunc sUnmap;
      static GetPlaneCountFunc sGetPlaneCount;
      static GetHandleForPlaneFunc sGetHandleForPlane;
      static GetStrideForPlaneFunc sGetStrideForPlane;
      static GetOffsetFunc sGetOffset;
      static DeviceIsFormatSupportedFunc sDeviceIsFormatSupported;
      static DrmPrimeHandleToFDFunc sDrmPrimeHandleToFD;

      static void* sGbmLibHandle;
      static void* sXf86DrmLibHandle;
      static bool sLibLoaded;
    };

    struct GbmFormat {
      bool mIsSupported;
      bool mHasAlpha;
      int mFormat;
      uint64_t* mModifiers;
      int mModifiersCount;
    };

    class nsDMABufDevice {
     public:
      nsDMABufDevice();
      ~nsDMABufDevice();

      gbm_device* GetGbmDevice();
      // Returns -1 if we fails to gbm device file descriptor.
      int GetGbmDeviceFd();

      // Use dmabuf for WebRender general web content
      bool IsDMABufTexturesEnabled();
      // Use dmabuf for VA-API video playback
      bool IsDMABufVAAPIEnabled();
      // Use dmabuf for WebGL content
      bool IsDMABufWebGLEnabled();

      GbmFormat* GetGbmFormat(bool aHasAlpha);
      GbmFormat* GetExactGbmFormat(int aFormat);
      void ResetFormatsModifiers();
      void AddFormatModifier(bool aHasAlpha, int aFormat, uint32_t mModifierHi,
                             uint32_t mModifierLo);

     private:
      bool IsDMABufEnabled();
      bool Configure();

      void* mRegistry;

      GbmFormat mXRGBFormat;
      GbmFormat mARGBFormat;

      gbm_device* mGbmDevice;
      int mGbmFd;
    };

    nsDMABufDevice* GetDMABufDevice();

    }  // namespace widget
    }  // namespace mozilla