21 #include "../../SDL_internal.h" 23 #if SDL_VIDEO_DRIVER_DIRECTFB 28 #define DFB_MAX_MODES 200 30 struct screen_callback_t
39 struct modes_callback_t
45 static DFBEnumerationResult
48 struct modes_callback_t *modedata = (
struct modes_callback_t *) data;
57 if (modedata->nummodes < DFB_MAX_MODES) {
58 modedata->modelist[modedata->nummodes++] =
mode;
64 static DFBEnumerationResult
65 EnumScreensCallback(DFBScreenID screen_id, DFBScreenDescription desc,
68 struct screen_callback_t *devdata = (
struct screen_callback_t *) callbackdata;
70 devdata->screenid[devdata->numscreens++] = screen_id;
74 static DFBEnumerationResult
75 EnumLayersCallback(DFBDisplayLayerID layer_id, DFBDisplayLayerDescription desc,
78 struct screen_callback_t *devdata = (
struct screen_callback_t *) callbackdata;
80 if (desc.caps & DLCAPS_SURFACE) {
81 if ((desc.type & DLTF_GRAPHICS) && (desc.type & DLTF_VIDEO)) {
82 if (devdata->vidlayer[devdata->aux] == -1)
83 devdata->vidlayer[devdata->aux] = layer_id;
84 }
else if (desc.type & DLTF_GRAPHICS) {
85 if (devdata->gralayer[devdata->aux] == -1)
86 devdata->gralayer[devdata->aux] = layer_id;
96 DFBDisplayLayerConfig
config;
97 DFBDisplayLayerConfigFlags failed;
100 DLSCL_ADMINISTRATIVE));
101 config.width = mode->
w;
102 config.height = mode->
h;
104 config.flags = DLCONF_WIDTH | DLCONF_HEIGHT | DLCONF_PIXELFORMAT;
105 if (devdata->use_yuv_underlays) {
106 config.flags |= DLCONF_OPTIONS;
107 config.options = DLOP_ALPHACHANNEL;
110 data->layer->TestConfiguration(data->layer, &config, &failed);
119 SDL_DFB_ERR(
"Mode %d x %d not available: %x\n", mode->
w,
131 #if (DFB_VERSION_ATLEAST(1,0,0)) 138 DFB_DisplayData *dispdata = (DFB_DisplayData *) display->
driverdata;
141 if (dispdata->vidIDinuse)
142 SDL_DFB_CHECK(dispdata->vidlayer->SwitchContext(dispdata->vidlayer,
153 DFB_DisplayData *dispdata =
NULL;
155 DFBGraphicsDeviceDescription caps;
156 DFBDisplayLayerConfig dlc;
157 struct screen_callback_t *screencbdata;
166 screencbdata->numscreens = 0;
169 screencbdata->gralayer[
i] = -1;
170 screencbdata->vidlayer[
i] = -1;
173 SDL_DFB_CHECKERR(devdata->dfb->EnumScreens(devdata->dfb, &EnumScreensCallback,
176 for (i = 0; i < screencbdata->numscreens; i++) {
180 screencbdata->screenid
183 screencbdata->aux =
i;
186 screen->GetSize(screen, &tcw[i], &tch[i]);
188 screen->Release(screen);
193 devdata->dfb->GetDeviceDescription(devdata->dfb, &caps);
195 for (i = 0; i < screencbdata->numscreens; i++) {
197 screencbdata->gralayer
201 DLSCL_ADMINISTRATIVE));
202 layer->EnableCursor(layer, 1);
205 if (devdata->use_yuv_underlays) {
206 dlc.flags = DLCONF_PIXELFORMAT | DLCONF_OPTIONS;
207 dlc.pixelformat = DSPF_ARGB;
208 dlc.options = DLOP_ALPHACHANNEL;
210 ret = layer->SetConfiguration(layer, &dlc);
213 dlc.pixelformat = DSPF_AiRGB;
219 dlc.flags = DLCONF_ALL;
225 SDL_DFB_ERR(
"Unknown dfb pixelformat %x !\n", dlc.pixelformat);
236 dispdata->layer =
layer;
237 dispdata->pixelformat = dlc.pixelformat;
238 dispdata->cw = tcw[
i];
239 dispdata->ch = tch[
i];
243 dispdata->vidID = screencbdata->vidlayer[
i];
244 dispdata->vidIDinuse = 0;
252 #if (DFB_VERSION_ATLEAST(1,2,0)) 254 DLCONF_WIDTH | DLCONF_HEIGHT | DLCONF_PIXELFORMAT |
256 ret = layer->SetConfiguration(layer, &dlc);
276 DFB_DisplayData *dispdata = (DFB_DisplayData *) display->
driverdata;
278 struct modes_callback_t data;
285 EnumModesCallback, &data));
287 for (i = 0; i < data.nummodes; ++
i) {
288 mode = data.modelist[
i];
291 CheckSetDisplayMode(
_this, display, dispdata, &mode);
293 CheckSetDisplayMode(
_this, display, dispdata, &mode);
295 CheckSetDisplayMode(
_this, display, dispdata, &mode);
297 CheckSetDisplayMode(
_this, display, dispdata, &mode);
299 CheckSetDisplayMode(
_this, display, dispdata, &mode);
316 DFB_DisplayData *data = (DFB_DisplayData *) display->
driverdata;
317 DFBDisplayLayerConfig config, rconfig;
318 DFBDisplayLayerConfigFlags fail = 0;
321 DLSCL_ADMINISTRATIVE));
324 config.flags = DLCONF_WIDTH | DLCONF_HEIGHT;
326 config.flags |= DLCONF_PIXELFORMAT;
328 data->pixelformat = config.pixelformat;
330 config.width = mode->
w;
331 config.height = mode->
h;
333 if (devdata->use_yuv_underlays) {
334 config.flags |= DLCONF_OPTIONS;
335 config.options = DLOP_ALPHACHANNEL;
338 data->layer->TestConfiguration(data->layer, &config, &fail);
341 (DLCONF_WIDTH | DLCONF_HEIGHT | DLCONF_PIXELFORMAT |
343 SDL_DFB_ERR(
"Error setting mode %dx%d-%x\n", mode->
w, mode->
h,
348 config.flags &= ~fail;
350 #if (DFB_VERSION_ATLEAST(1,2,0)) 358 layer->SetCooperativeLevel(data->layer, DLSCL_SHARED));
360 if ((config.width != rconfig.width) || (config.height != rconfig.height)
362 && (config.pixelformat != rconfig.pixelformat))) {
363 SDL_DFB_ERR(
"Error setting mode %dx%d-%x\n", mode->
w, mode->
h,
368 data->pixelformat = rconfig.pixelformat;
369 data->cw = config.width;
370 data->ch = config.height;
386 DFB_DisplayData *dispdata = (DFB_DisplayData *) display->
driverdata;
395 if (dispdata->layer) {
397 layer->SetCooperativeLevel(dispdata->layer,
398 DLSCL_ADMINISTRATIVE));
400 layer->SetCursorOpacity(dispdata->layer, 0x00));
402 layer->SetCooperativeLevel(dispdata->layer,
#define SDL_DFB_LOG(x...)
DFBSurfacePixelFormat DirectFB_SDLToDFBPixelFormat(Uint32 format)
#define SDL_GetDesktopDisplayMode
The structure that defines a display mode.
void DirectFB_SetContext(_THIS, SDL_Window *window)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLenum GLuint GLint GLint layer
Uint32 DirectFB_DFBToSDLPixelFormat(DFBSurfacePixelFormat pixelformat)
int SDL_AddVideoDisplay(const SDL_VideoDisplay *display)
GLint GLint GLsizei width
#define SDL_DFB_RELEASE(x)
static SDL_VideoDevice * _this
void DirectFB_GetDisplayModes(_THIS, SDL_VideoDisplay *display)
#define SDL_DFB_DEVICEDATA(dev)
void DirectFB_QuitModes(_THIS)
void DirectFB_InitModes(_THIS)
SDL_DisplayMode current_mode
SDL_VideoDisplay * displays
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
SDL_DisplayMode desktop_mode
#define SDL_DFB_ALLOC_CLEAR(r, s)
#define SDL_DFB_ERR(x...)
#define SDL_DFB_CHECKERR(x...)
GLint GLint GLsizei GLsizei height
SDL_VideoDisplay * SDL_GetDisplayForWindow(SDL_Window *window)
EGLSurface EGLNativeWindowType * window
#define SDL_DFB_CHECK(x...)
The type used to identify a window.
SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode *mode)
int DirectFB_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode)
#define SDL_DFB_CALLOC(r, n, s)