text: /*
   * Copyright (C) Texas Instruments - http://www.ti.com/
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  #ifndef __HWC_DEV__
  #define __HWC_DEV__
  
  #include <stdint.h>
  #include <stdbool.h>
  
  #include <hardware/hwcomposer.h>
  #ifdef OMAP_ENHANCEMENT_S3D
  #include <ui/S3DFormat.h>
  #endif
  
  #include <linux/bltsville.h>
  #include <video/dsscomp.h>
  #include <video/omap_hwc.h>
  
  #include "hal_public.h"
  #include "rgz_2d.h"
  
  struct ext_transform {
      uint8_t rotation : 3;          /* 90-degree clockwise rotations */
      uint8_t hflip    : 1;          /* flip l-r (after rotation) */
      uint8_t enabled  : 1;          /* cloning enabled */
      uint8_t docking  : 1;          /* docking vs. mirroring - used for state */
  };
  typedef struct ext_transform ext_transform_t;
  
  /* cloning support and state */
  struct omap_hwc_ext {
      /* support */
      ext_transform_t mirror;             /* mirroring settings */
      ext_transform_t dock;               /* docking settings */
      float lcd_xpy;                      /* pixel ratio for UI */
      bool avoid_mode_change;             /* use HDMI mode used for mirroring if possible */
      bool force_dock;                    /* must dock */
  
      /* state */
      bool hdmi_state;                    /* whether HDMI is connected */
      bool on_tv;                         /* using a tv */
      ext_transform_t current;            /* current settings */
      ext_transform_t last;               /* last-used settings */
  
      /* configuration */
      uint32_t last_xres_used;            /* resolution and pixel ratio used for mode selection */
      uint32_t last_yres_used;
      uint32_t last_mode;                 /* 2-s complement of last HDMI mode set, 0 if none */
      uint32_t mirror_mode;               /* 2-s complement of mode used when mirroring */
      float last_xpy;
      uint16_t width;                     /* external screen dimensions */
      uint16_t height;
      uint32_t xres;                      /* external screen resolution */
      uint32_t yres;
      float m[2][3];                      /* external transformation matrix */
      hwc_rect_t mirror_region;           /* region of screen to mirror */
  #ifdef OMAP_ENHANCEMENT_S3D
      bool s3d_enabled;
      bool s3d_capable;
      enum S3DLayoutType s3d_type;
      enum S3DLayoutOrder s3d_order;
  #endif
  };
  typedef struct omap_hwc_ext omap_hwc_ext_t;
  
  enum bltpolicy {
      BLTPOLICY_DISABLED = 0,
      BLTPOLICY_DEFAULT = 1,    /* Default blit policy */
      BLTPOLICY_ALL,            /* Test mode to attempt to blit all */
  };
  
  enum bltmode {
      BLTMODE_PAINT = 0,    /* Attempt to blit layer by layer */
      BLTMODE_REGION = 1,   /* Attempt to blit layers via regions */
  };
  
  struct omap_hwc_module {
      hwc_module_t base;
  
      IMG_framebuffer_device_public_t *fb_dev;
  };
  typedef struct omap_hwc_module omap_hwc_module_t;
  
  struct counts {
      uint32_t possible_overlay_layers;
      uint32_t composited_layers;
      uint32_t scaled_layers;
      uint32_t RGB;
      uint32_t BGR;
      uint32_t NV12;
      uint32_t dockable;
      uint32_t protected;
  #ifdef OMAP_ENHANCEMENT_S3D
      uint32_t s3d;
  #endif
  
      uint32_t max_hw_overlays;
      uint32_t max_scaling_overlays;
      uint32_t mem;
  };
  typedef struct counts counts_t;
  
  struct omap_hwc_device {
      /* static data */
      hwc_composer_device_1_t base;
      hwc_procs_t *procs;
      pthread_t hdmi_thread;
      pthread_mutex_t lock;
  
      IMG_framebuffer_device_public_t *fb_dev;
      struct dsscomp_display_info fb_dis;
      int fb_fd;                   /* file descriptor for /dev/fb0 */
      int dsscomp_fd;              /* file descriptor for /dev/dsscomp */
      int hdmi_fb_fd;              /* file descriptor for /dev/fb1 */
      int pipe_fds[2];             /* pipe to event thread */
  
      int img_mem_size;           /* size of fb for hdmi */
      void *img_mem_ptr;          /* start of fb for hdmi */
  
      int flags_rgb_order;
      int flags_nv12_only;
      float upscaled_nv12_limit;
  
      bool on_tv;                  /* using a tv */
      int force_sgx;
      omap_hwc_ext_t ext;         /* external mirroring data */
      int idle;
  
      float primary_m[2][3];       /* internal transformation matrix */
      int primary_transform;
      int primary_rotation;
      hwc_rect_t primary_region;
  
      buffer_handle_t *buffers;
      bool use_sgx;
      bool swap_rb;
      uint32_t post2_layers;       /* buffers used with DSS pipes*/
      uint32_t post2_blit_buffers; /* buffers used with blit */
      int ext_ovls;                /* # of overlays on external display for current composition */
      int ext_ovls_wanted;         /* # of overlays that should be on external display for current composition */
      int last_ext_ovls;           /* # of overlays on external/internal display for last composition */
      int last_int_ovls;
  #ifdef OMAP_ENHANCEMENT_S3D
      enum S3DLayoutType s3d_input_type;
      enum S3DLayoutOrder s3d_input_order;
  #endif
      enum bltmode blt_mode;
      enum bltpolicy blt_policy;
  
      uint32_t blit_flags;
      int blit_num;
      struct omap_hwc_data comp_data; /* This is a kernel data structure */
      struct rgz_blt_entry blit_ops[RGZ_MAX_BLITS];
  
      counts_t counts;
  
      int ion_fd;
      struct ion_handle *ion_handles[2];
      bool use_sw_vsync;
  
  };
  typedef struct omap_hwc_device omap_hwc_device_t;
  
  #endif
  