1 /*
2 * Copyright 2005-2012, Axel Dörfler, axeld@pinc-software.de.
3 * All rights reserved. Distributed under the terms of the MIT License.
4 */
5
6
7 #include "accelerant_protos.h"
8 #include "accelerant.h"
9
10 #include <new>
11
12
13 #define FAKE_OVERLAY_SUPPORT 0
14 // Enables a fake overlay support, making the app_server believe it can
15 // use overlays with this driver; the actual buffers are in the frame
16 // buffer so the on-screen graphics will be messed up.
17
18 #define FAKE_HARDWARE_CURSOR_SUPPORT 0
19 // Enables the faking of a hardware cursor. The cursor will not be
20 // visible, but it will still function.
21
22
23 #if FAKE_OVERLAY_SUPPORT
24 static int32 sOverlayToken;
25 static int32 sOverlayChannelUsed;
26
27
28 static uint32
vesa_overlay_count(const display_mode * mode)29 vesa_overlay_count(const display_mode* mode)
30 {
31 return 1;
32 }
33
34
35 static const uint32*
vesa_overlay_supported_spaces(const display_mode * mode)36 vesa_overlay_supported_spaces(const display_mode* mode)
37 {
38 static const uint32 kSupportedSpaces[] = {B_RGB15, B_RGB16, B_RGB32,
39 B_YCbCr422, 0};
40
41 return kSupportedSpaces;
42 }
43
44
45 static uint32
vesa_overlay_supported_features(uint32 colorSpace)46 vesa_overlay_supported_features(uint32 colorSpace)
47 {
48 return B_OVERLAY_COLOR_KEY
49 | B_OVERLAY_HORIZONTAL_FILTERING
50 | B_OVERLAY_VERTICAL_FILTERING
51 | B_OVERLAY_HORIZONTAL_MIRRORING;
52 }
53
54
55 static const overlay_buffer*
vesa_allocate_overlay_buffer(color_space colorSpace,uint16 width,uint16 height)56 vesa_allocate_overlay_buffer(color_space colorSpace, uint16 width,
57 uint16 height)
58 {
59 debug_printf("allocate_overlay_buffer(width %u, height %u, colorSpace %u)\n",
60 width, height, colorSpace);
61
62 overlay_buffer* buffer = new(std::nothrow) overlay_buffer;
63 if (buffer == NULL)
64 return NULL;
65
66 buffer->space = colorSpace;
67 buffer->width = width;
68 buffer->height = height;
69 buffer->bytes_per_row = gInfo->shared_info->bytes_per_row;
70
71 buffer->buffer = gInfo->shared_info->frame_buffer;
72 buffer->buffer_dma = (uint8*)gInfo->shared_info->physical_frame_buffer;
73
74 return buffer;
75 }
76
77
78 static status_t
vesa_release_overlay_buffer(const overlay_buffer * buffer)79 vesa_release_overlay_buffer(const overlay_buffer* buffer)
80 {
81 debug_printf("release_overlay_buffer(buffer %p)\n", buffer);
82
83 delete buffer;
84 return B_OK;
85 }
86
87
88 static status_t
vesa_get_overlay_constraints(const display_mode * mode,const overlay_buffer * buffer,overlay_constraints * constraints)89 vesa_get_overlay_constraints(const display_mode* mode,
90 const overlay_buffer* buffer, overlay_constraints* constraints)
91 {
92 debug_printf("get_overlay_constraints(buffer %p)\n", buffer);
93
94 // position
95 constraints->view.h_alignment = 0;
96 constraints->view.v_alignment = 0;
97
98 // alignment
99 constraints->view.width_alignment = 7;
100 constraints->view.height_alignment = 0;
101
102 // size
103 constraints->view.width.min = 4;
104 constraints->view.height.min = 4;
105 constraints->view.width.max = buffer->width;
106 constraints->view.height.max = buffer->height;
107
108 // scaler output restrictions
109 constraints->window.h_alignment = 0;
110 constraints->window.v_alignment = 0;
111 constraints->window.width_alignment = 0;
112 constraints->window.height_alignment = 0;
113 constraints->window.width.min = 2;
114 constraints->window.width.max = mode->virtual_width;
115 constraints->window.height.min = 2;
116 constraints->window.height.max = mode->virtual_height;
117
118 constraints->h_scale.min = 1.0f / (1 << 4);
119 constraints->h_scale.max = buffer->width * 7;
120 constraints->v_scale.min = 1.0f / (1 << 4);
121 constraints->v_scale.max = buffer->height * 7;
122
123 return B_OK;
124 }
125
126
127 static overlay_token
vesa_allocate_overlay()128 vesa_allocate_overlay()
129 {
130 debug_printf("allocate_overlay()\n");
131
132 // we only use a single overlay channel
133 if (atomic_or(&sOverlayChannelUsed, 1) != 0)
134 return NULL;
135
136 return (overlay_token)++sOverlayToken;
137 }
138
139
140 static status_t
vesa_release_overlay(overlay_token overlayToken)141 vesa_release_overlay(overlay_token overlayToken)
142 {
143 debug_printf("allocate_overlay(token %ld)\n", (uint32)overlayToken);
144
145 if (overlayToken != (overlay_token)sOverlayToken)
146 return B_BAD_VALUE;
147
148 atomic_and(&sOverlayChannelUsed, 0);
149
150 return B_OK;
151 }
152
153
154 static status_t
vesa_configure_overlay(overlay_token overlayToken,const overlay_buffer * buffer,const overlay_window * window,const overlay_view * view)155 vesa_configure_overlay(overlay_token overlayToken, const overlay_buffer* buffer,
156 const overlay_window* window, const overlay_view* view)
157 {
158 debug_printf("configure_overlay: buffer %p, window %p, view %p\n",
159 buffer, window, view);
160 return B_OK;
161 }
162 #endif // FAKE_OVERLAY_SUPPORT
163
164
165 #if FAKE_HARDWARE_CURSOR_SUPPORT
166 status_t
vesa_set_cursor_shape(uint16 width,uint16 height,uint16 hotX,uint16 hotY,const uint8 * andMask,const uint8 * xorMask)167 vesa_set_cursor_shape(uint16 width, uint16 height, uint16 hotX, uint16 hotY,
168 const uint8* andMask, const uint8* xorMask)
169 {
170 return B_OK;
171 }
172
173
174 status_t
vesa_set_cursor_bitmap(uint16 width,uint16 height,uint16 hotX,uint16 hotY,color_space colorSpace,uint16 bytesPerRow,const uint8 * bitmapData)175 vesa_set_cursor_bitmap(uint16 width, uint16 height, uint16 hotX, uint16 hotY,
176 color_space colorSpace, uint16 bytesPerRow, const uint8* bitmapData)
177 {
178 return B_OK;
179 }
180
181
182 void
vesa_move_cursor(uint16 x,uint16 y)183 vesa_move_cursor(uint16 x, uint16 y)
184 {
185 }
186
187
188 void
vesa_show_cursor(bool isVisible)189 vesa_show_cursor(bool isVisible)
190 {
191 }
192 #endif // # FAKE_HARDWARE_CURSOR_SUPPORT
193
194
195 extern "C" void*
get_accelerant_hook(uint32 feature,void * data)196 get_accelerant_hook(uint32 feature, void* data)
197 {
198 switch (feature) {
199 /* general */
200 case B_INIT_ACCELERANT:
201 return (void*)vesa_init_accelerant;
202 case B_UNINIT_ACCELERANT:
203 return (void*)vesa_uninit_accelerant;
204 case B_CLONE_ACCELERANT:
205 return (void*)vesa_clone_accelerant;
206 case B_ACCELERANT_CLONE_INFO_SIZE:
207 return (void*)vesa_accelerant_clone_info_size;
208 case B_GET_ACCELERANT_CLONE_INFO:
209 return (void*)vesa_get_accelerant_clone_info;
210 case B_GET_ACCELERANT_DEVICE_INFO:
211 return (void*)vesa_get_accelerant_device_info;
212 case B_ACCELERANT_RETRACE_SEMAPHORE:
213 return (void*)vesa_accelerant_retrace_semaphore;
214
215 /* mode configuration */
216 case B_ACCELERANT_MODE_COUNT:
217 return (void*)vesa_accelerant_mode_count;
218 case B_GET_MODE_LIST:
219 return (void*)vesa_get_mode_list;
220 case B_PROPOSE_DISPLAY_MODE:
221 return (void*)vesa_propose_display_mode;
222 case B_SET_DISPLAY_MODE:
223 return (void*)vesa_set_display_mode;
224 case B_GET_DISPLAY_MODE:
225 return (void*)vesa_get_display_mode;
226 case B_GET_EDID_INFO:
227 return (void*)vesa_get_edid_info;
228 case B_GET_FRAME_BUFFER_CONFIG:
229 return (void*)vesa_get_frame_buffer_config;
230 case B_GET_PIXEL_CLOCK_LIMITS:
231 return (void*)vesa_get_pixel_clock_limits;
232 case B_MOVE_DISPLAY:
233 return (void*)vesa_move_display;
234 case B_SET_INDEXED_COLORS:
235 return (void*)vesa_set_indexed_colors;
236 case B_GET_TIMING_CONSTRAINTS:
237 return (void*)vesa_get_timing_constraints;
238
239 /* DPMS */
240 case B_DPMS_CAPABILITIES:
241 return (void*)vesa_dpms_capabilities;
242 case B_DPMS_MODE:
243 return (void*)vesa_dpms_mode;
244 case B_SET_DPMS_MODE:
245 return (void*)vesa_set_dpms_mode;
246
247 /* cursor managment */
248 #if FAKE_HARDWARE_CURSOR_SUPPORT
249 case B_SET_CURSOR_SHAPE:
250 return (void*)vesa_set_cursor_shape;
251 case B_MOVE_CURSOR:
252 return (void*)vesa_move_cursor;
253 case B_SHOW_CURSOR:
254 return (void*)vesa_show_cursor;
255 case B_SET_CURSOR_BITMAP:
256 return (void*)vesa_set_cursor_bitmap;
257 #endif
258
259 #if FAKE_OVERLAY_SUPPORT
260 // overlay
261 case B_OVERLAY_COUNT:
262 return (void*)vesa_overlay_count;
263 case B_OVERLAY_SUPPORTED_SPACES:
264 return (void*)vesa_overlay_supported_spaces;
265 case B_OVERLAY_SUPPORTED_FEATURES:
266 return (void*)vesa_overlay_supported_features;
267 case B_ALLOCATE_OVERLAY_BUFFER:
268 return (void*)vesa_allocate_overlay_buffer;
269 case B_RELEASE_OVERLAY_BUFFER:
270 return (void*)vesa_release_overlay_buffer;
271 case B_GET_OVERLAY_CONSTRAINTS:
272 return (void*)vesa_get_overlay_constraints;
273 case B_ALLOCATE_OVERLAY:
274 return (void*)vesa_allocate_overlay;
275 case B_RELEASE_OVERLAY:
276 return (void*)vesa_release_overlay;
277 case B_CONFIGURE_OVERLAY:
278 return (void*)vesa_configure_overlay;
279 #endif // FAKE_OVERLAY_SUPPORT
280 }
281
282 return NULL;
283 }
284
285