Continue working on QNX GF and Photon support.
--- a/src/video/photon/SDL_photon.c Wed Jun 10 05:56:36 2009 +0000
+++ b/src/video/photon/SDL_photon.c Wed Jun 10 08:09:04 2009 +0000
@@ -61,7 +61,7 @@
#endif /* SDL_VIDEO_OPENGL_ES */
/* Low level device graphics driver names, which they are reporting */
-Photon_DeviceCaps photon_devicename[] = {
+static const Photon_DeviceCaps photon_devicename[] = {
/* ATI Rage 128 graphics driver (devg-ati_rage128) */
{"ati_rage128", SDL_PHOTON_ACCELERATED | SDL_PHOTON_UNACCELERATED_3D}
,
@@ -384,19 +384,47 @@
/* Query photon about graphics hardware caps and current video mode */
status = PgGetGraphicsHWCaps(&hwcaps);
if (status != 0) {
- SDL_SetError("Photon: Can't get graphics capabilities");
- SDL_free(didata->cursor);
- SDL_free(didata);
- return -1;
- }
+ PhRect_t extent;
+ PdOffscreenContext_t* curctx;
+
+ /* If error happens, this also could mean, that photon is working */
+ /* under custom (not listed by photon) video mode */
+ status=PhWindowQueryVisible(Ph_QUERY_GRAPHICS, 0, 0, &extent);
+ if (status != 0) {
+ SDL_SetError("Photon: Can't get graphics driver region");
+ SDL_free(didata->cursor);
+ SDL_free(didata);
+ return -1;
+ }
+ modeinfo.width=extent.lr.x+1;
+ modeinfo.height=extent.lr.y+1;
+ /* Hardcode 60Hz, as the base refresh rate frequency */
+ hwcaps.current_rrate=60;
+ /* Clear current video driver name, no way to get it somehow */
+ hwcaps.chip_name[0]=0x00;
- /* Get current video mode details */
- status = PgGetVideoModeInfo(hwcaps.current_video_mode, &modeinfo);
- if (status != 0) {
- SDL_SetError("Photon: Can't get current video mode information");
- SDL_free(didata->cursor);
- SDL_free(didata);
- return -1;
+ /* Create offscreen context from video memory, which is currently */
+ /* displayed on the screen */
+ curctx=PdCreateOffscreenContext(0, 0, 0, Pg_OSC_MAIN_DISPLAY);
+ if (curctx==NULL)
+ {
+ SDL_SetError("Photon: Can't get display area capabilities");
+ SDL_free(didata->cursor);
+ SDL_free(didata);
+ return -1;
+ }
+ /* Retrieve current bpp */
+ modeinfo.type=curctx->format;
+ PhDCRelease(curctx);
+ } else {
+ /* Get current video mode details */
+ status = PgGetVideoModeInfo(hwcaps.current_video_mode, &modeinfo);
+ if (status != 0) {
+ SDL_SetError("Photon: Can't get current video mode information");
+ SDL_free(didata->cursor);
+ SDL_free(didata);
+ return -1;
+ }
}
/* Setup current desktop mode for SDL */
@@ -527,6 +555,27 @@
mode.format = photon_image_to_sdl_pixelformat(modeinfo.type);
mode.driverdata = NULL;
SDL_AddDisplayMode(_this->current_display, &mode);
+
+ /* If mode is RGBA8888, add the same mode as RGBx888 */
+ if (modeinfo.type == Pg_IMAGE_DIRECT_8888) {
+ mode.w = modeinfo.width;
+ mode.h = modeinfo.height;
+ mode.refresh_rate = modeinfo.refresh_rates[jt];
+ mode.format = SDL_PIXELFORMAT_RGB888;
+ mode.driverdata = NULL;
+ SDL_AddDisplayMode(_this->current_display, &mode);
+ }
+
+ /* If mode is RGBA1555, add the same mode as RGBx555 */
+ if (modeinfo.type == Pg_IMAGE_DIRECT_1555) {
+ mode.w = modeinfo.width;
+ mode.h = modeinfo.height;
+ mode.refresh_rate = modeinfo.refresh_rates[jt];
+ mode.format = SDL_PIXELFORMAT_RGB555;
+ mode.driverdata = NULL;
+ SDL_AddDisplayMode(_this->current_display, &mode);
+ }
+
jt++;
} else {
break;
@@ -1453,7 +1502,7 @@
if (configs == 0) {
int32_t it;
int32_t jt;
- GLint depthbits[4] = { 32, 24, 16, EGL_DONT_CARE };
+ static const GLint depthbits[4] = { 32, 24, 16, EGL_DONT_CARE };
for (it = 0; it < 4; it++) {
for (jt = 16; jt >= 0; jt--) {
--- a/src/video/photon/SDL_photon_pixelfmt.c Wed Jun 10 05:56:36 2009 +0000
+++ b/src/video/photon/SDL_photon_pixelfmt.c Wed Jun 10 08:09:04 2009 +0000
@@ -72,6 +72,11 @@
return 15;
}
break;
+ case SDL_PIXELFORMAT_RGB555:
+ {
+ return 15;
+ }
+ break;
case SDL_PIXELFORMAT_ABGR1555:
{
return 15;
@@ -82,9 +87,14 @@
return 16;
}
break;
+ case SDL_PIXELFORMAT_RGB24:
+ {
+ return 24;
+ }
+ break;
case SDL_PIXELFORMAT_RGB888:
{
- return 24;
+ return 32;
}
break;
case SDL_PIXELFORMAT_BGRA8888:
@@ -133,12 +143,12 @@
break;
case Pg_IMAGE_DIRECT_8888:
{
- return SDL_PIXELFORMAT_BGRA8888;
+ return SDL_PIXELFORMAT_ARGB8888;
}
break;
case Pg_IMAGE_DIRECT_888:
{
- return SDL_PIXELFORMAT_RGB888;
+ return SDL_PIXELFORMAT_RGB24;
}
break;
case Pg_IMAGE_DIRECT_565:
@@ -170,12 +180,12 @@
return Pg_IMAGE_PALETTE_BYTE;
}
break;
- case SDL_PIXELFORMAT_BGRA8888:
+ case SDL_PIXELFORMAT_ARGB8888:
{
return Pg_IMAGE_DIRECT_8888;
}
break;
- case SDL_PIXELFORMAT_RGB888:
+ case SDL_PIXELFORMAT_RGB24:
{
return Pg_IMAGE_DIRECT_888;
}
@@ -190,6 +200,11 @@
return Pg_IMAGE_DIRECT_1555;
}
break;
+ case SDL_PIXELFORMAT_RGB555:
+ {
+ return Pg_IMAGE_DIRECT_555;
+ }
+ break;
}
return 0;
--- a/src/video/qnxgf/SDL_gf_pixelfmt.c Wed Jun 10 05:56:36 2009 +0000
+++ b/src/video/qnxgf/SDL_gf_pixelfmt.c Wed Jun 10 08:09:04 2009 +0000
@@ -41,8 +41,9 @@
return GF_FORMAT_PACK_ARGB1555;
}
break;
- case SDL_PIXELFORMAT_ABGR1555:
+ case SDL_PIXELFORMAT_RGB555:
{
+ /* RGB555 is the same as ARGB1555, but alpha is ignored */
return GF_FORMAT_PACK_ARGB1555;
}
break;
@@ -51,18 +52,33 @@
return GF_FORMAT_PACK_RGB565;
}
break;
- case SDL_PIXELFORMAT_RGB888:
+ case SDL_PIXELFORMAT_BGR565:
{
+ return GF_FORMAT_PKBE_RGB565;
+ }
+ break;
+ case SDL_PIXELFORMAT_RGB24:
+ {
+ /* GF has wrong components order */
return GF_FORMAT_BGR888;
}
break;
- case SDL_PIXELFORMAT_BGRA8888:
+ case SDL_PIXELFORMAT_RGB888:
{
+ /* The same format as ARGB8888, but with alpha ignored */
+ /* and GF has wrong components order */
return GF_FORMAT_BGRA8888;
}
break;
case SDL_PIXELFORMAT_ARGB8888:
{
+ /* GF has wrong components order */
+ return GF_FORMAT_BGRA8888;
+ }
+ break;
+ case SDL_PIXELFORMAT_BGRA8888:
+ {
+ /* GF has wrong components order */
return GF_FORMAT_ARGB8888;
}
break;
@@ -110,14 +126,9 @@
return SDL_PIXELFORMAT_ARGB1555;
}
break;
- case GF_FORMAT_PKBE_ARGB1555:
- {
- return SDL_PIXELFORMAT_ABGR1555;
- }
- break;
case GF_FORMAT_PKBE_RGB565:
{
- return SDL_PIXELFORMAT_RGB565;
+ return SDL_PIXELFORMAT_BGR565;
}
break;
case GF_FORMAT_PKLE_RGB565:
@@ -132,20 +143,22 @@
break;
case GF_FORMAT_BGR888:
{
- return SDL_PIXELFORMAT_RGB888;
+ /* GF has wrong components order */
+ return SDL_PIXELFORMAT_RGB24;
}
break;
case GF_FORMAT_BGRA8888:
{
- return SDL_PIXELFORMAT_BGRA8888;
+ /* GF has wrong components order */
+ return SDL_PIXELFORMAT_ARGB8888;
}
break;
case GF_FORMAT_ARGB8888:
{
- return SDL_PIXELFORMAT_ARGB8888;
+ /* GF has wrong components order */
+ return SDL_PIXELFORMAT_BGRA8888;
}
break;
-
case GF_FORMAT_PLANAR_YUV_YV12:
{
return SDL_PIXELFORMAT_YV12;
--- a/src/video/qnxgf/SDL_qnxgf.c Wed Jun 10 05:56:36 2009 +0000
+++ b/src/video/qnxgf/SDL_qnxgf.c Wed Jun 10 08:09:04 2009 +0000
@@ -47,7 +47,7 @@
/* but some drivers are not. Later we can distinguish one driver from another */
/* Feel free to add any new custom graphics mode */
/******************************************************************************/
-static SDL_DisplayMode generic_mode[] = {
+static const SDL_DisplayMode generic_mode[] = {
{0, 320, 200, 70, NULL}, /* 320x200 modes are 70Hz and 85Hz */
{0, 320, 200, 85, NULL},
{0, 320, 240, 70, NULL}, /* 320x240 modes are 70Hz and 85Hz */
@@ -100,7 +100,7 @@
};
/* Low level device graphics driver names, which they are reporting */
-GF_DeviceCaps gf_devicename[] = {
+static const GF_DeviceCaps gf_devicename[] = {
/* ATI Rage 128 graphics driver (devg-ati_rage128) */
{"ati_rage128", SDL_GF_ACCELERATED | SDL_GF_NOLOWRESOLUTION |
SDL_GF_UNACCELERATED_3D | SDL_GF_VIDEOMEMORY},
@@ -644,6 +644,25 @@
mode.driverdata = NULL;
SDL_AddDisplayMode(_this->current_display, &mode);
+ /* If mode is RGBA8888, add the same mode as RGBx888 */
+ if (modeinfo.primary_format==GF_FORMAT_BGRA8888) {
+ mode.w = generic_mode[jt].w;
+ mode.h = generic_mode[jt].h;
+ mode.refresh_rate = generic_mode[jt].refresh_rate;
+ mode.format = SDL_PIXELFORMAT_RGB888;
+ mode.driverdata = NULL;
+ SDL_AddDisplayMode(_this->current_display, &mode);
+ }
+ /* If mode is RGBA1555, add the same mode as RGBx555 */
+ if (modeinfo.primary_format==GF_FORMAT_PACK_ARGB1555) {
+ mode.w = generic_mode[jt].w;
+ mode.h = generic_mode[jt].h;
+ mode.refresh_rate = generic_mode[jt].refresh_rate;
+ mode.format = SDL_PIXELFORMAT_RGB555;
+ mode.driverdata = NULL;
+ SDL_AddDisplayMode(_this->current_display, &mode);
+ }
+
jt++;
} while (1);
} else {
@@ -660,6 +679,26 @@
primary_format);
mode.driverdata = NULL;
SDL_AddDisplayMode(_this->current_display, &mode);
+
+ /* If mode is RGBA8888, add the same mode as RGBx888 */
+ if (modeinfo.primary_format==GF_FORMAT_BGRA8888) {
+ mode.w = modeinfo.xres;
+ mode.h = modeinfo.yres;
+ mode.refresh_rate = modeinfo.refresh[jt];
+ mode.format = SDL_PIXELFORMAT_RGB888;
+ mode.driverdata = NULL;
+ SDL_AddDisplayMode(_this->current_display, &mode);
+ }
+ /* If mode is RGBA1555, add the same mode as RGBx555 */
+ if (modeinfo.primary_format==GF_FORMAT_PACK_ARGB1555) {
+ mode.w = modeinfo.xres;
+ mode.h = modeinfo.yres;
+ mode.refresh_rate = modeinfo.refresh[jt];
+ mode.format = SDL_PIXELFORMAT_RGB555;
+ mode.driverdata = NULL;
+ SDL_AddDisplayMode(_this->current_display, &mode);
+ }
+
jt++;
} else {
break;
@@ -823,7 +862,7 @@
/* Mark main display layer is attached */
didata->layer_attached = SDL_TRUE;
- /* Set layer source and destination viewport */
+ /* Set layer source and destination viewports */
gf_layer_set_src_viewport(didata->layer, 0, 0, mode->w - 1, mode->h - 1);
gf_layer_set_dst_viewport(didata->layer, 0, 0, mode->w - 1, mode->h - 1);
@@ -1464,7 +1503,7 @@
if (configs == 0) {
int32_t it;
int32_t jt;
- GLint depthbits[4] = { 32, 24, 16, EGL_DONT_CARE };
+ static const GLint depthbits[4] = { 32, 24, 16, EGL_DONT_CARE };
for (it = 0; it < 4; it++) {
for (jt = 16; jt >= 0; jt--) {
@@ -1520,7 +1559,7 @@
SDL_VIDEO_GF_OPENGLES_CONFS, &configs);
if (status != EGL_TRUE) {
SDL_SetError
- ("Photon: Can't find closest configuration for OpenGL ES");
+ ("GF: Can't find closest configuration for OpenGL ES");
return NULL;
}
if (configs != 0) {
@@ -1535,7 +1574,7 @@
/* No available configs */
if (configs == 0) {
SDL_SetError
- ("Photon: Can't find any configuration for OpenGL ES");
+ ("GF: Can't find any configuration for OpenGL ES");
return NULL;
}
}