Extrenal srt problem gst-1 solved.
[openblackhole/openblackhole-enigma2.git] / lib / gdi / bcm.cpp
1 /*
2   Interface to the Dreambox dm800/dm8000 proprietary accel interface.
3 */
4
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <fcntl.h>
8 #include <unistd.h>
9 #include <linux/fb.h>
10 #include <sys/mman.h>
11 #include <sys/ioctl.h>
12 #include <lib/base/eerror.h>
13
14 #define FBIO_ACCEL  0x23
15
16 static unsigned int displaylist[1024];
17 static int ptr;
18 static bool supportblendingflags = true;
19
20 #define P(x, y) do { displaylist[ptr++] = x; displaylist[ptr++] = y; } while (0)
21 #define C(x) P(x, 0)
22
23 static int fb_fd = -1;
24 static int exec_list(void);
25
26 int bcm_accel_init(void)
27 {
28         fb_fd = open("/dev/fb0", O_RDWR);
29         if (fb_fd < 0)
30         {
31                 eDebug("[bcm] /dev/fb0 %m");
32                 return 1;
33         }
34         if (exec_list())
35         {
36                 eDebug("[bcm] interface not available - %m");
37                 close(fb_fd);
38                 fb_fd = -1;
39                 return 1;
40         }
41         /* now test for blending flags support */
42         P(0x80, 0);
43         if (exec_list())
44         {
45                 supportblendingflags = false;
46         }
47 #ifdef FORCE_NO_BLENDING_ACCELERATION
48         /* hardware doesn't allow us to detect whether the opcode is working */
49         supportblendingflags = false;
50 #endif
51         return 0;
52 }
53
54 void bcm_accel_close(void)
55 {
56         if (fb_fd >= 0)
57         {
58                 close(fb_fd);
59                 fb_fd = -1;
60         }
61 }
62
63 static int exec_list(void)
64 {
65         int ret;
66         struct
67         {
68                 void *ptr;
69                 int len;
70         } l;
71
72         if (fb_fd < 0) return -1;
73
74         l.ptr = displaylist;
75         l.len = ptr;
76         ret = ioctl(fb_fd, FBIO_ACCEL, &l);
77         ptr = 0;
78         return ret;
79 }
80
81 bool bcm_accel_has_alphablending()
82 {
83         return supportblendingflags;
84 }
85
86 void bcm_accel_blit(
87                 int src_addr, int src_width, int src_height, int src_stride, int src_format,
88                 int dst_addr, int dst_width, int dst_height, int dst_stride,
89                 int src_x, int src_y, int width, int height,
90                 int dst_x, int dst_y, int dwidth, int dheight,
91                 int pal_addr, int flags)
92 {
93         C(0x43); // reset source
94         C(0x53); // reset dest
95         C(0x5b);  // reset pattern
96         C(0x67); // reset blend
97         C(0x75); // reset output
98
99         P(0x0, src_addr); // set source addr
100         P(0x1, src_stride);  // set source pitch
101         P(0x2, src_width); // source width
102         P(0x3, src_height); // height
103         switch (src_format)
104         {
105         case 0:
106                 P(0x4, 0x7e48888); // format: ARGB 8888
107                 break;
108         case 1:
109                 P(0x4, 0x12e40008); // indexed 8bit
110                 P(0x78, 256);
111                 P(0x79, pal_addr);
112                 P(0x7a, 0x7e48888);
113                 break;
114         }
115
116         C(0x5); // set source surface (based on last parameters)
117
118         P(0x2e, src_x); // define  rect
119         P(0x2f, src_y);
120         P(0x30, width);
121         P(0x31, height);
122
123         C(0x32); // set this rect as source rect
124
125         P(0x0, dst_addr); // prepare output surface
126         P(0x1, dst_stride);
127         P(0x2, dst_width);
128         P(0x3, dst_height);
129         P(0x4, 0x7e48888);
130
131         C(0x69); // set output surface
132
133         P(0x2e, dst_x); // prepare output rect
134         P(0x2f, dst_y);
135         P(0x30, dwidth);
136         P(0x31, dheight);
137
138         C(0x6e); // set this rect as output rect
139
140         if (supportblendingflags && flags) P(0x80, flags); /* blend flags... We'd really like some blending support in the drivers, to avoid punching holes in the osd */
141
142         C(0x77);  // do it
143
144         exec_list();
145 }
146
147 void bcm_accel_fill(
148                 int dst_addr, int dst_width, int dst_height, int dst_stride,
149                 int x, int y, int width, int height,
150                 unsigned long color)
151 {
152         C(0x43); // reset source
153         C(0x53); // reset dest
154         C(0x5b); // reset pattern
155         C(0x67); // reset blend
156         C(0x75); // reset output
157
158         // clear dest surface
159         P(0x0, 0);
160         P(0x1, 0);
161         P(0x2, 0);
162         P(0x3, 0);
163         P(0x4, 0);
164         C(0x45);
165
166         // clear src surface
167         P(0x0, 0);
168         P(0x1, 0);
169         P(0x2, 0);
170         P(0x3, 0);
171         P(0x4, 0);
172         C(0x5);
173
174         P(0x2d, color);
175
176         P(0x2e, x); // prepare output rect
177         P(0x2f, y);
178         P(0x30, width);
179         P(0x31, height);
180         C(0x6e); // set this rect as output rect
181
182         P(0x0, dst_addr); // prepare output surface
183         P(0x1, dst_stride);
184         P(0x2, dst_width);
185         P(0x3, dst_height);
186         P(0x4, 0x7e48888);
187         C(0x69); // set output surface
188
189         P(0x6f, 0);
190         P(0x70, 0);
191         P(0x71, 2);
192         P(0x72, 2);
193         C(0x73); // select color keying
194
195         C(0x77);  // do it
196
197         exec_list();
198 }
199