Home | History | Annotate | Download | only in libdrmutils
      1 /*
      2 * Copyright (c) 2017, The Linux Foundation. All rights reserved.
      3 *
      4 * Redistribution and use in source and binary forms, with or without
      5 * modification, are permitted provided that the following conditions are
      6 * met:
      7 *   * Redistributions of source code must retain the above copyright
      8 *     notice, this list of conditions and the following disclaimer.
      9 *   * Redistributions in binary form must reproduce the above
     10 *     copyright notice, this list of conditions and the following
     11 *     disclaimer in the documentation and/or other materials provided
     12 *     with the distribution.
     13 *   * Neither the name of The Linux Foundation nor the names of its
     14 *     contributors may be used to endorse or promote products derived
     15 *     from this software without specific prior written permission.
     16 *
     17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
     18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
     20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
     21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
     27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28 */
     29 
     30 #ifndef __DRM_MASTER_H__
     31 #define __DRM_MASTER_H__
     32 
     33 #include <mutex>
     34 
     35 #include "drm_logger.h"
     36 
     37 namespace drm_utils {
     38 
     39 struct DRMBuffer {
     40   int fd = -1;
     41   uint32_t width = 0;
     42   uint32_t height = 0;
     43   uint32_t drm_format = 0;
     44   uint64_t drm_format_modifier = 0;
     45   uint32_t stride[4] = {};
     46   uint32_t offset[4] = {};
     47   uint32_t num_planes = 1;
     48 };
     49 
     50 class DRMMaster {
     51  public:
     52   ~DRMMaster();
     53   /* Converts from ION fd --> Prime Handle --> FB_ID.
     54    * Input:
     55    *   drm_buffer: A DRMBuffer obj that packages description of buffer
     56    * Output:
     57    *   fb_id: Pointer to store DRM framebuffer id into
     58    * Returns:
     59    *   ioctl error code
     60    */
     61   int CreateFbId(const DRMBuffer &drm_buffer, uint32_t *fb_id);
     62   /* Removes the fb_id from DRM
     63    * Input:
     64    *   fb_id: DRM FB to be removed
     65    * Returns:
     66    *   ioctl error code
     67    */
     68   int RemoveFbId(uint32_t fb_id);
     69   /* Poplulates master DRM fd
     70    * Input:
     71    *   fd: Pointer to store master fd into
     72    */
     73   void GetHandle(int *fd) { *fd = dev_fd_; }
     74 
     75   /* Creates an instance of DRMMaster if it doesn't exist and initializes it. Threadsafe.
     76    * Input:
     77    *   master: Pointer to store a pointer to the instance
     78    * Returns:
     79    *   -ENODEV if device cannot be opened or initilization fails
     80    */
     81   static int GetInstance(DRMMaster **master);
     82   static void DestroyInstance();
     83 
     84  private:
     85   DRMMaster() {}
     86   int Init();
     87 
     88   int dev_fd_ = -1;              // Master fd for DRM
     89   static DRMMaster *s_instance;  // Singleton instance
     90   static std::mutex s_lock;
     91 };
     92 
     93 }  // namespace drm_utils
     94 
     95 #endif  // __DRM_MASTER_H__
     96