Initialise 720p and 1080p display modes in VideoInit(). gsoc2009_ps3
authorMartin Lowinski <martin@goldtopf.org>
Sat, 13 Jun 2009 05:20:57 +0000
branchgsoc2009_ps3
changeset 3145 7828eed2f31a
parent 3144 0d8d1f870964
child 3146 9e902f423497
Initialise 720p and 1080p display modes in VideoInit(). Added setting display mode.
src/video/ps3/SDL_ps3video.c
src/video/ps3/SDL_ps3video.h
--- a/src/video/ps3/SDL_ps3video.c	Wed Jun 10 09:15:33 2009 +0000
+++ b/src/video/ps3/SDL_ps3video.c	Sat Jun 13 05:20:57 2009 +0000
@@ -49,6 +49,8 @@
 /* Initialization/Query functions */
 static int PS3_VideoInit(_THIS);
 static int PS3_SetDisplayMode(_THIS, SDL_DisplayMode * mode);
+void PS3_InitModes(_THIS);
+void PS3_GetDisplayModes(_THIS);
 static void PS3_VideoQuit(_THIS);
 
 /* Stores the SPE executable name of fb_writer_spu */
@@ -104,6 +106,7 @@
     device->VideoInit = PS3_VideoInit;
     device->VideoQuit = PS3_VideoQuit;
     device->SetDisplayMode = PS3_SetDisplayMode;
+    device->GetDisplayModes = PS3_GetDisplayModes;
     device->PumpEvents = PS3_PumpEvents;
 
     device->free = PS3_DeleteDevice;
@@ -125,10 +128,9 @@
     SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
     SDL_DisplayMode mode;
 
+#if 0
     /* Use a fake 32-bpp desktop mode */
     mode.format = SDL_PIXELFORMAT_RGB888;
-    //mode.w = 1024;
-    //mode.h = 768;
     mode.w = 1920;
     mode.h = 1080;
     mode.refresh_rate = 0;
@@ -136,8 +138,11 @@
     SDL_AddBasicVideoDisplay(&mode);
     SDL_AddRenderDriver(0, &SDL_PS3_RenderDriver);
 
-    SDL_zero(mode);
+    //SDL_zero(mode);
     SDL_AddDisplayMode(0, &mode);
+    display.desktop_mode = mode;
+    display.current_mode = mode;
+#endif
 
     /* 
      *PS3 stuff 
@@ -194,6 +199,10 @@
     /* Blank screen */
     memset(data->frame_buffer, 0x00, fb_finfo.smem_len);
 
+    PS3_InitModes(_this);
+
+    SDL_AddRenderDriver(0, &SDL_PS3_RenderDriver);
+
     /* We're done! */
     return 0;
 }
@@ -202,9 +211,74 @@
 PS3_SetDisplayMode(_THIS, SDL_DisplayMode * mode)
 {
     deprintf(1, "PS3_SetDisplayMode()\n");
+    SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
+    SDL_DisplayData *dispdata = (SDL_DisplayData *) mode->driverdata;
+
+    if (ioctl(data->fbdev, PS3FB_IOCTL_SETMODE, (unsigned long)&dispdata->mode)) {
+        SDL_SetError("Could not set videomode");
+        return -1;
+    }
     return 0;
 }
 
+void PS3_GetDisplayModes(_THIS) {
+    deprintf(1, "PS3_GetDisplayModes()\n");
+}
+
+void
+PS3_InitModes(_THIS)
+{
+    deprintf(1, "PS3_InitModes()\n");
+    SDL_VideoDisplay display;
+    SDL_DisplayMode mode, mode1080p;
+    SDL_DisplayData *displaydata;
+    SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
+
+    displaydata = (SDL_DisplayData *) SDL_malloc(sizeof(*displaydata));
+    if (!displaydata) {
+        return;
+    }
+
+    struct ps3fb_ioctl_res res;
+    if (ioctl(data->fbdev, PS3FB_IOCTL_SCREENINFO, &res)) {
+        SDL_SetError("Can't get PS3FB_IOCTL_SCREENINFO");
+    }
+    mode.format = SDL_PIXELFORMAT_RGB888;
+    mode.refresh_rate = 0;
+    mode.w = res.xres;
+    mode.h = res.yres;
+
+    int vid = 0;
+    if (ioctl(data->fbdev, PS3FB_IOCTL_GETMODE, (unsigned long)&vid)) {
+        SDL_SetError("Can't get PS3FB_IOCTL_GETMODE");
+    }
+    printf("PS3FB_IOCTL_GETMODE = %u\n", vid);
+
+    displaydata->mode = vid;
+    mode.driverdata = displaydata;
+
+    SDL_zero(display);
+    display.desktop_mode = mode;
+    display.current_mode = mode;
+
+    SDL_AddVideoDisplay(&display);
+    SDL_AddDisplayMode(_this->current_display, &mode);
+
+    mode1080p.format = SDL_PIXELFORMAT_RGB888;
+    mode1080p.refresh_rate = 0;
+    mode1080p.w = 1920;
+    mode1080p.h = 1080;
+
+    displaydata = (SDL_DisplayData *) SDL_malloc(sizeof(*displaydata));
+    if (!displaydata) {
+        return;
+    }
+
+    displaydata->mode = 133;
+    mode1080p.driverdata = displaydata;
+    SDL_AddDisplayMode(_this->current_display, &mode1080p);
+}
+
 void
 PS3_VideoQuit(_THIS)
 {
--- a/src/video/ps3/SDL_ps3video.h	Wed Jun 10 09:15:33 2009 +0000
+++ b/src/video/ps3/SDL_ps3video.h	Sat Jun 13 05:20:57 2009 +0000
@@ -27,6 +27,9 @@
 #include "../SDL_sysvideo.h"
 #include "SDL_ps3spe_c.h"
 
+#include <linux/fb.h>
+#include <asm/ps3fb.h>
+
 /* Debugging
  * 0: No debug messages
  * 1: Video debug messages
@@ -65,6 +68,12 @@
     volatile struct fb_writer_parms_t * fb_parms __attribute__((aligned(128)));
 } SDL_VideoData;
 
+typedef struct
+{
+    unsigned long mode;
+    struct ps3fb_ioctl_res res;
+} SDL_DisplayData;
+
 #endif /* _SDL_ps3video_h */
 
 /* vi: set ts=4 sw=4 expandtab: */