summaryrefslogtreecommitdiffstats
path: root/hwc/hwc_dev.h
blob: 32cc273ce95d7d386cba1e3b93a061f681967ab3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
/*
 * 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;
#ifdef SYSFS_VSYNC_NOTIFICATION
    pthread_t vsync_thread;
#endif
    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