Support for HID devices (mice and keyboards only for now) has been added
--HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%403589
This commit is contained in:
parent
79abe77b26
commit
cf3c16b210
10 changed files with 2261 additions and 76 deletions
1187
src/video/qnxgf/SDL_gf_input.c
Normal file
1187
src/video/qnxgf/SDL_gf_input.c
Normal file
File diff suppressed because it is too large
Load diff
165
src/video/qnxgf/SDL_gf_input.h
Normal file
165
src/video/qnxgf/SDL_gf_input.h
Normal file
|
@ -0,0 +1,165 @@
|
||||||
|
/*
|
||||||
|
SDL - Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2009 Sam Lantinga
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
Sam Lantinga
|
||||||
|
slouken@libsdl.org
|
||||||
|
|
||||||
|
QNX Graphics Framework SDL driver
|
||||||
|
Copyright (C) 2009 Mike Gorchak
|
||||||
|
(mike@malva.ua, lestat@i.com.ua)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SDL_GF_INPUT_H__
|
||||||
|
#define __SDL_GF_INPUT_H__
|
||||||
|
|
||||||
|
#include "SDL_config.h"
|
||||||
|
#include "SDL_video.h"
|
||||||
|
#include "../SDL_sysvideo.h"
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <gf/gf.h>
|
||||||
|
|
||||||
|
#include <sys/hiddi.h>
|
||||||
|
#include <sys/hidut.h>
|
||||||
|
|
||||||
|
#include "SDL_qnxgf.h"
|
||||||
|
|
||||||
|
typedef struct SDL_MouseData
|
||||||
|
{
|
||||||
|
SDL_DisplayData* didata;
|
||||||
|
} SDL_MouseData;
|
||||||
|
|
||||||
|
int32_t gf_addinputdevices(_THIS);
|
||||||
|
int32_t gf_delinputdevices(_THIS);
|
||||||
|
|
||||||
|
#define SDL_GF_MOUSE_COLOR_BLACK 0xFF000000
|
||||||
|
#define SDL_GF_MOUSE_COLOR_WHITE 0xFFFFFFFF
|
||||||
|
#define SDL_GF_MOUSE_COLOR_TRANS 0x00000000
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* This is HIDDI closed interface declarations */
|
||||||
|
/*****************************************************************************/
|
||||||
|
#define HID_TYPE_MAIN 0x0
|
||||||
|
#define HID_TYPE_GLOBAL 0x1
|
||||||
|
#define HID_TYPE_LOCAL 0x2
|
||||||
|
#define HID_TYPE_RESERVED 0x3
|
||||||
|
|
||||||
|
#define HID_GLOBAL_USAGE_PAGE 0x0
|
||||||
|
#define HID_LOCAL_USAGE 0x0
|
||||||
|
|
||||||
|
typedef struct _hid_byte
|
||||||
|
{
|
||||||
|
uint8_t HIDB_Length;
|
||||||
|
uint8_t HIDB_Type;
|
||||||
|
uint8_t HIDB_Tag;
|
||||||
|
uint8_t reserved[1];
|
||||||
|
} hid_byte_t;
|
||||||
|
|
||||||
|
typedef struct _hidd_global_item
|
||||||
|
{
|
||||||
|
uint16_t usage_page;
|
||||||
|
uint16_t logical_min;
|
||||||
|
uint16_t logical_max;
|
||||||
|
uint16_t physical_min;
|
||||||
|
uint16_t physical_max;
|
||||||
|
uint16_t unit_expo;
|
||||||
|
uint16_t unit;
|
||||||
|
uint16_t report_size;
|
||||||
|
uint16_t report_id;
|
||||||
|
uint16_t report_count;
|
||||||
|
} hidd_global_item_t;
|
||||||
|
|
||||||
|
typedef struct _hidd_local_item
|
||||||
|
{
|
||||||
|
uint16_t type;
|
||||||
|
uint8_t reserved[2];
|
||||||
|
uint32_t value;
|
||||||
|
struct _hidd_local_item* next_local;
|
||||||
|
struct _hidd_local_item* alt_local;
|
||||||
|
} hidd_local_item_t;
|
||||||
|
|
||||||
|
typedef struct _hidd_local_table
|
||||||
|
{
|
||||||
|
hidd_local_item_t* usage_info;
|
||||||
|
hidd_local_item_t* designator_info;
|
||||||
|
hidd_local_item_t* string_info;
|
||||||
|
uint8_t delimiter;
|
||||||
|
uint8_t reserved[3];
|
||||||
|
} hidd_local_table_t;
|
||||||
|
|
||||||
|
typedef struct _hidd_field
|
||||||
|
{
|
||||||
|
struct hidd_report_instance* report;
|
||||||
|
struct hidd_collection* collection;
|
||||||
|
uint16_t report_offset;
|
||||||
|
uint16_t flags;
|
||||||
|
hidd_global_item_t gitem;
|
||||||
|
hidd_local_table_t* ltable;
|
||||||
|
struct _hidd_field* next_field;
|
||||||
|
void* user;
|
||||||
|
} hidd_field_t;
|
||||||
|
|
||||||
|
typedef struct hidd_report_instance
|
||||||
|
{
|
||||||
|
uint8_t report_id;
|
||||||
|
uint8_t reserved[1];
|
||||||
|
uint16_t report_type;
|
||||||
|
hidd_field_t* field;
|
||||||
|
uint16_t num_field;
|
||||||
|
uint16_t byte_len;
|
||||||
|
uint16_t bit_len;
|
||||||
|
uint8_t reserved2[2];
|
||||||
|
struct hidd_collection* collection;
|
||||||
|
struct hidd_report_instance* next_col_report;
|
||||||
|
struct hidd_report_instance* next_report;
|
||||||
|
} hidd_report_instance_t;
|
||||||
|
|
||||||
|
typedef struct hidd_report
|
||||||
|
{
|
||||||
|
TAILQ_ENTRY(hidd_report) link;
|
||||||
|
hidd_report_instance_t* rinst;
|
||||||
|
hidd_device_instance_t* dev_inst;
|
||||||
|
uint32_t flags;
|
||||||
|
struct hidd_connection* connection;
|
||||||
|
void* user;
|
||||||
|
} hidd_report_t;
|
||||||
|
|
||||||
|
typedef struct hidview_device
|
||||||
|
{
|
||||||
|
struct hidd_report_instance* instance;
|
||||||
|
struct hidd_report* report;
|
||||||
|
} hidview_device_t;
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Closed HIDDI interface declarations end */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/* Maximum devices and subdevices amount per host */
|
||||||
|
#define SDL_HIDDI_MAX_DEVICES 64
|
||||||
|
|
||||||
|
/* Detected device/subdevice type for SDL */
|
||||||
|
#define SDL_GF_HIDDI_NONE 0x00000000
|
||||||
|
#define SDL_GF_HIDDI_MOUSE 0x00000001
|
||||||
|
#define SDL_GF_HIDDI_KEYBOARD 0x00000002
|
||||||
|
#define SDL_GF_HIDDI_JOYSTICK 0x00000003
|
||||||
|
|
||||||
|
extern void hiddi_enable_mouse();
|
||||||
|
extern void hiddi_disable_mouse();
|
||||||
|
|
||||||
|
#endif /* __SDL_GF_INPUT_H__ */
|
|
@ -1,8 +1,3 @@
|
||||||
Date: Mon, 23 Mar 2009 09:17:24 +0200
|
|
||||||
From: "Mike Gorchak" <mike@malva.ua>
|
|
||||||
To: "Sam Lantinga" <slouken@devolution.com>
|
|
||||||
Subject: New QNX patches
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
SDL - Simple DirectMedia Layer
|
SDL - Simple DirectMedia Layer
|
||||||
Copyright (C) 1997-2009 Sam Lantinga
|
Copyright (C) 1997-2009 Sam Lantinga
|
||||||
|
@ -53,4 +48,3 @@ GLAPI void APIENTRY glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte
|
||||||
glColor4f(((GLfloat)red)/255.f, ((GLfloat)green)/255.f, ((GLfloat)blue)/255.f, ((GLfloat)alpha)/255.f);
|
glColor4f(((GLfloat)red)/255.f, ((GLfloat)green)/255.f, ((GLfloat)blue)/255.f, ((GLfloat)alpha)/255.f);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
37
src/video/qnxgf/SDL_gf_opengles.h
Normal file
37
src/video/qnxgf/SDL_gf_opengles.h
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
SDL - Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2009 Sam Lantinga
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
Sam Lantinga
|
||||||
|
slouken@libsdl.org
|
||||||
|
|
||||||
|
QNX Graphics Framework SDL driver
|
||||||
|
Copyright (C) 2009 Mike Gorchak
|
||||||
|
(mike@malva.ua, lestat@i.com.ua)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SDL_GF_OPENGLES_H__
|
||||||
|
#define __SDL_GF_OPENGLES_H__
|
||||||
|
|
||||||
|
#include <GLES/gl.h>
|
||||||
|
#include <GLES/glext.h>
|
||||||
|
|
||||||
|
GLAPI void APIENTRY glTexParameteri(GLenum target, GLenum pname, GLint param);
|
||||||
|
GLAPI void APIENTRY glTexParameteriv(GLenum target, GLenum pname, const GLint* params);
|
||||||
|
GLAPI void APIENTRY glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
|
||||||
|
|
||||||
|
#endif /* __SDL_GF_OPENGLES_H__ */
|
|
@ -35,24 +35,24 @@
|
||||||
#include "SDL_qnxgf.h"
|
#include "SDL_qnxgf.h"
|
||||||
|
|
||||||
static SDL_Renderer* gf_createrenderer(SDL_Window* window, Uint32 flags);
|
static SDL_Renderer* gf_createrenderer(SDL_Window* window, Uint32 flags);
|
||||||
static int gf_displaymodechanged(SDL_Renderer* renderer);
|
static int gf_displaymodechanged(SDL_Renderer* renderer);
|
||||||
static int gf_activaterenderer(SDL_Renderer* renderer);
|
static int gf_activaterenderer(SDL_Renderer* renderer);
|
||||||
static int gf_createtexture(SDL_Renderer* renderer, SDL_Texture* texture);
|
static int gf_createtexture(SDL_Renderer* renderer, SDL_Texture* texture);
|
||||||
static int gf_querytexturepixels(SDL_Renderer* renderer, SDL_Texture* texture, void** pixels, int* pitch);
|
static int gf_querytexturepixels(SDL_Renderer* renderer, SDL_Texture* texture, void** pixels, int* pitch);
|
||||||
static int gf_settexturepalette(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Color* colors, int firstcolor, int ncolors);
|
static int gf_settexturepalette(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Color* colors, int firstcolor, int ncolors);
|
||||||
static int gf_gettexturepalette(SDL_Renderer* renderer, SDL_Texture* texture, SDL_Color* colors, int firstcolor, int ncolors);
|
static int gf_gettexturepalette(SDL_Renderer* renderer, SDL_Texture* texture, SDL_Color* colors, int firstcolor, int ncolors);
|
||||||
static int gf_settexturecolormod(SDL_Renderer* renderer, SDL_Texture* texture);
|
static int gf_settexturecolormod(SDL_Renderer* renderer, SDL_Texture* texture);
|
||||||
static int gf_settexturealphamod(SDL_Renderer* renderer, SDL_Texture* texture);
|
static int gf_settexturealphamod(SDL_Renderer* renderer, SDL_Texture* texture);
|
||||||
static int gf_settextureblendmode(SDL_Renderer* renderer, SDL_Texture* texture);
|
static int gf_settextureblendmode(SDL_Renderer* renderer, SDL_Texture* texture);
|
||||||
static int gf_settexturescalemode(SDL_Renderer* renderer, SDL_Texture* texture);
|
static int gf_settexturescalemode(SDL_Renderer* renderer, SDL_Texture* texture);
|
||||||
static int gf_updatetexture(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Rect* rect, const void* pixels, int pitch);
|
static int gf_updatetexture(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Rect* rect, const void* pixels, int pitch);
|
||||||
static int gf_locktexture(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Rect* rect, int markDirty, void** pixels, int* pitch);
|
static int gf_locktexture(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Rect* rect, int markDirty, void** pixels, int* pitch);
|
||||||
static void gf_unlocktexture(SDL_Renderer* renderer, SDL_Texture* texture);
|
static void gf_unlocktexture(SDL_Renderer* renderer, SDL_Texture* texture);
|
||||||
static void gf_dirtytexture(SDL_Renderer* renderer, SDL_Texture* texture, int numrects, const SDL_Rect* rects);
|
static void gf_dirtytexture(SDL_Renderer* renderer, SDL_Texture* texture, int numrects, const SDL_Rect* rects);
|
||||||
static int gf_renderpoint(SDL_Renderer* renderer, int x, int y);
|
static int gf_renderpoint(SDL_Renderer* renderer, int x, int y);
|
||||||
static int gf_renderline(SDL_Renderer* renderer, int x1, int y1, int x2, int y2);
|
static int gf_renderline(SDL_Renderer* renderer, int x1, int y1, int x2, int y2);
|
||||||
static int gf_renderfill(SDL_Renderer* renderer, const SDL_Rect* rect);
|
static int gf_renderfill(SDL_Renderer* renderer, const SDL_Rect* rect);
|
||||||
static int gf_rendercopy(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Rect* srcrect, const SDL_Rect* dstrect);
|
static int gf_rendercopy(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Rect* srcrect, const SDL_Rect* dstrect);
|
||||||
static void gf_renderpresent(SDL_Renderer* renderer);
|
static void gf_renderpresent(SDL_Renderer* renderer);
|
||||||
static void gf_destroytexture(SDL_Renderer* renderer, SDL_Texture* texture);
|
static void gf_destroytexture(SDL_Renderer* renderer, SDL_Texture* texture);
|
||||||
static void gf_destroyrenderer(SDL_Renderer* renderer);
|
static void gf_destroyrenderer(SDL_Renderer* renderer);
|
||||||
|
@ -222,7 +222,6 @@ static SDL_Renderer* gf_createrenderer(SDL_Window* window, Uint32 flags)
|
||||||
for (it=0; it<rdata->surfaces_count; it++)
|
for (it=0; it<rdata->surfaces_count; it++)
|
||||||
{
|
{
|
||||||
/* TODO: add palette creation */
|
/* TODO: add palette creation */
|
||||||
/* do not waste surfaces when using GL ES */
|
|
||||||
|
|
||||||
/* Create displayable surfaces */
|
/* Create displayable surfaces */
|
||||||
status=gf_surface_create_layer(&rdata->surface[it], &didata->layer, 1, 0,
|
status=gf_surface_create_layer(&rdata->surface[it], &didata->layer, 1, 0,
|
||||||
|
@ -236,6 +235,7 @@ static SDL_Renderer* gf_createrenderer(SDL_Window* window, Uint32 flags)
|
||||||
for (jt=it-1; jt>0; jt--)
|
for (jt=it-1; jt>0; jt--)
|
||||||
{
|
{
|
||||||
gf_surface_free(rdata->surface[jt]);
|
gf_surface_free(rdata->surface[jt]);
|
||||||
|
rdata->surface[jt]=NULL;
|
||||||
}
|
}
|
||||||
SDL_free(rdata);
|
SDL_free(rdata);
|
||||||
SDL_free(renderer);
|
SDL_free(renderer);
|
||||||
|
@ -288,10 +288,10 @@ static int gf_activaterenderer(SDL_Renderer* renderer)
|
||||||
SDL_DisplayData* didata = (SDL_DisplayData*)display->driverdata;
|
SDL_DisplayData* didata = (SDL_DisplayData*)display->driverdata;
|
||||||
|
|
||||||
/* Setup current surface as visible */
|
/* Setup current surface as visible */
|
||||||
gf_layer_set_surfaces(didata->layer, &rdata->surface[rdata->surface_visible_idx], 1);
|
// gf_layer_set_surfaces(didata->layer, &rdata->surface[rdata->surface_visible_idx], 1);
|
||||||
|
|
||||||
/* Set visible surface when hardware in idle state */
|
/* Set visible surface when hardware in idle state */
|
||||||
gf_layer_update(didata->layer, GF_LAYER_UPDATE_NO_WAIT_IDLE);
|
// gf_layer_update(didata->layer, GF_LAYER_UPDATE_NO_WAIT_IDLE);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -391,7 +391,10 @@ static void gf_destroyrenderer(SDL_Renderer* renderer)
|
||||||
|
|
||||||
for (it=0; it<rdata->surfaces_count; it++)
|
for (it=0; it<rdata->surfaces_count; it++)
|
||||||
{
|
{
|
||||||
gf_surface_free(rdata->surface[it]);
|
if (rdata->surface[it]!=NULL)
|
||||||
|
{
|
||||||
|
gf_surface_free(rdata->surface[it]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
34
src/video/qnxgf/SDL_hiddi_joystick.h
Normal file
34
src/video/qnxgf/SDL_hiddi_joystick.h
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
SDL - Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2009 Sam Lantinga
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
Sam Lantinga
|
||||||
|
slouken@libsdl.org
|
||||||
|
|
||||||
|
QNX Graphics Framework SDL driver
|
||||||
|
Copyright (C) 2009 Mike Gorchak
|
||||||
|
(mike@malva.ua, lestat@i.com.ua)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SDL_HIDDI_JOYSTICK_H__
|
||||||
|
#define __SDL_HIDDI_JOYSTICK_H__
|
||||||
|
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __SDL_HIDDI_JOYSTICK_H__ */
|
159
src/video/qnxgf/SDL_hiddi_keyboard.h
Normal file
159
src/video/qnxgf/SDL_hiddi_keyboard.h
Normal file
|
@ -0,0 +1,159 @@
|
||||||
|
/*
|
||||||
|
SDL - Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2009 Sam Lantinga
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
Sam Lantinga
|
||||||
|
slouken@libsdl.org
|
||||||
|
|
||||||
|
QNX Graphics Framework SDL driver
|
||||||
|
Copyright (C) 2009 Mike Gorchak
|
||||||
|
(mike@malva.ua, lestat@i.com.ua)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SDL_HIDDI_KEYBOARD_H__
|
||||||
|
#define __SDL_HIDDI_KEYBOARD_H__
|
||||||
|
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
/* PS/2 and USB keyboards are generating this packet */
|
||||||
|
typedef struct key_packet
|
||||||
|
{
|
||||||
|
uint8_t modifiers;
|
||||||
|
uint8_t data;
|
||||||
|
uint8_t codes[6];
|
||||||
|
} key_packet;
|
||||||
|
|
||||||
|
/* Key modifier codes */
|
||||||
|
#define HIDDI_MKEY_LEFT_CTRL 0x00000001
|
||||||
|
#define HIDDI_MKEY_LEFT_SHIFT 0x00000002
|
||||||
|
#define HIDDI_MKEY_LEFT_ALT 0x00000004
|
||||||
|
#define HIDDI_MKEY_LEFT_WFLAG 0x00000008
|
||||||
|
#define HIDDI_MKEY_RIGHT_CTRL 0x00000010
|
||||||
|
#define HIDDI_MKEY_RIGHT_SHIFT 0x00000020
|
||||||
|
#define HIDDI_MKEY_RIGHT_ALT 0x00000040
|
||||||
|
#define HIDDI_MKEY_RIGHT_WFLAG 0x00000080
|
||||||
|
|
||||||
|
/* Key codes */
|
||||||
|
#define HIDDI_KEY_UNPRESSED 0x00000000
|
||||||
|
#define HIDDI_KEY_OVERFLOW 0x00000001
|
||||||
|
#define HIDDI_KEY_ESC 0x00000029
|
||||||
|
#define HIDDI_KEY_F1 0x0000003A
|
||||||
|
#define HIDDI_KEY_F2 0x0000003B
|
||||||
|
#define HIDDI_KEY_F3 0x0000003C
|
||||||
|
#define HIDDI_KEY_F4 0x0000003D
|
||||||
|
#define HIDDI_KEY_F5 0x0000003E
|
||||||
|
#define HIDDI_KEY_F6 0x0000003F
|
||||||
|
#define HIDDI_KEY_F7 0x00000040
|
||||||
|
#define HIDDI_KEY_F8 0x00000041
|
||||||
|
#define HIDDI_KEY_F9 0x00000042
|
||||||
|
#define HIDDI_KEY_F10 0x00000043
|
||||||
|
#define HIDDI_KEY_F11 0x00000044
|
||||||
|
#define HIDDI_KEY_F12 0x00000045
|
||||||
|
|
||||||
|
#define HIDDI_KEY_BACKQUOTE 0x00000035
|
||||||
|
#define HIDDI_KEY_1 0x0000001E
|
||||||
|
#define HIDDI_KEY_2 0x0000001F
|
||||||
|
#define HIDDI_KEY_3 0x00000020
|
||||||
|
#define HIDDI_KEY_4 0x00000021
|
||||||
|
#define HIDDI_KEY_5 0x00000022
|
||||||
|
#define HIDDI_KEY_6 0x00000023
|
||||||
|
#define HIDDI_KEY_7 0x00000024
|
||||||
|
#define HIDDI_KEY_8 0x00000025
|
||||||
|
#define HIDDI_KEY_9 0x00000026
|
||||||
|
#define HIDDI_KEY_0 0x00000027
|
||||||
|
#define HIDDI_KEY_MINUS 0x0000002D
|
||||||
|
#define HIDDI_KEY_EQUAL 0x0000002E
|
||||||
|
#define HIDDI_KEY_BACKSPACE 0x0000002A
|
||||||
|
|
||||||
|
#define HIDDI_KEY_TAB 0x0000002B
|
||||||
|
#define HIDDI_KEY_Q 0x00000014
|
||||||
|
#define HIDDI_KEY_W 0x0000001A
|
||||||
|
#define HIDDI_KEY_E 0x00000008
|
||||||
|
#define HIDDI_KEY_R 0x00000015
|
||||||
|
#define HIDDI_KEY_T 0x00000017
|
||||||
|
#define HIDDI_KEY_Y 0x0000001C
|
||||||
|
#define HIDDI_KEY_U 0x00000018
|
||||||
|
#define HIDDI_KEY_I 0x0000000C
|
||||||
|
#define HIDDI_KEY_O 0x00000012
|
||||||
|
#define HIDDI_KEY_P 0x00000013
|
||||||
|
#define HIDDI_KEY_LEFT_SQ_BRACKET 0x0000002F
|
||||||
|
#define HIDDI_KEY_RIGHT_SQ_BRACKET 0x00000030
|
||||||
|
#define HIDDI_KEY_BACKSLASH 0x00000031
|
||||||
|
|
||||||
|
#define HIDDI_KEY_CAPSLOCK 0x00000039
|
||||||
|
#define HIDDI_KEY_A 0x00000004
|
||||||
|
#define HIDDI_KEY_S 0x00000016
|
||||||
|
#define HIDDI_KEY_D 0x00000007
|
||||||
|
#define HIDDI_KEY_F 0x00000009
|
||||||
|
#define HIDDI_KEY_G 0x0000000A
|
||||||
|
#define HIDDI_KEY_H 0x0000000B
|
||||||
|
#define HIDDI_KEY_J 0x0000000D
|
||||||
|
#define HIDDI_KEY_K 0x0000000E
|
||||||
|
#define HIDDI_KEY_L 0x0000000F
|
||||||
|
#define HIDDI_KEY_SEMICOLON 0x00000033
|
||||||
|
#define HIDDI_KEY_QUOTE 0x00000034
|
||||||
|
#define HIDDI_KEY_ENTER 0x00000028
|
||||||
|
|
||||||
|
#define HIDDI_KEY_Z 0x0000001D
|
||||||
|
#define HIDDI_KEY_X 0x0000001B
|
||||||
|
#define HIDDI_KEY_C 0x00000006
|
||||||
|
#define HIDDI_KEY_V 0x00000019
|
||||||
|
#define HIDDI_KEY_B 0x00000005
|
||||||
|
#define HIDDI_KEY_N 0x00000011
|
||||||
|
#define HIDDI_KEY_M 0x00000010
|
||||||
|
#define HIDDI_KEY_COMMA 0x00000036
|
||||||
|
#define HIDDI_KEY_POINT 0x00000037
|
||||||
|
#define HIDDI_KEY_SLASH 0x00000038
|
||||||
|
|
||||||
|
#define HIDDI_KEY_SPACE 0x0000002C
|
||||||
|
#define HIDDI_KEY_MENU 0x00000065
|
||||||
|
|
||||||
|
#define HIDDI_KEY_PRINTSCREEN 0x00000046
|
||||||
|
#define HIDDI_KEY_SCROLLLOCK 0x00000047
|
||||||
|
#define HIDDI_KEY_PAUSE 0x00000048
|
||||||
|
|
||||||
|
#define HIDDI_KEY_INSERT 0x00000049
|
||||||
|
#define HIDDI_KEY_HOME 0x0000004A
|
||||||
|
#define HIDDI_KEY_PAGEUP 0x0000004B
|
||||||
|
#define HIDDI_KEY_DELETE 0x0000004C
|
||||||
|
#define HIDDI_KEY_END 0x0000004D
|
||||||
|
#define HIDDI_KEY_PAGEDOWN 0x0000004E
|
||||||
|
|
||||||
|
#define HIDDI_KEY_UP 0x00000052
|
||||||
|
#define HIDDI_KEY_LEFT 0x00000050
|
||||||
|
#define HIDDI_KEY_DOWN 0x00000051
|
||||||
|
#define HIDDI_KEY_RIGHT 0x0000004F
|
||||||
|
|
||||||
|
#define HIDDI_KEY_NUMLOCK 0x00000053
|
||||||
|
#define HIDDI_KEY_GR_SLASH 0x00000054
|
||||||
|
#define HIDDI_KEY_GR_ASTERISK 0x00000055
|
||||||
|
#define HIDDI_KEY_GR_MINUS 0x00000056
|
||||||
|
#define HIDDI_KEY_GR_7 0x0000005F
|
||||||
|
#define HIDDI_KEY_GR_8 0x00000060
|
||||||
|
#define HIDDI_KEY_GR_9 0x00000061
|
||||||
|
#define HIDDI_KEY_GR_PLUS 0x00000057
|
||||||
|
#define HIDDI_KEY_GR_4 0x0000005C
|
||||||
|
#define HIDDI_KEY_GR_5 0x0000005D
|
||||||
|
#define HIDDI_KEY_GR_6 0x0000005E
|
||||||
|
#define HIDDI_KEY_GR_1 0x00000059
|
||||||
|
#define HIDDI_KEY_GR_2 0x0000005A
|
||||||
|
#define HIDDI_KEY_GR_3 0x0000005B
|
||||||
|
#define HIDDI_KEY_GR_ENTER 0x00000058
|
||||||
|
#define HIDDI_KEY_GR_0 0x00000062
|
||||||
|
#define HIDDI_KEY_GR_DELETE 0x00000063
|
||||||
|
|
||||||
|
#endif /* __SDL_HIDDI_KEYBOARD_H__ */
|
69
src/video/qnxgf/SDL_hiddi_mouse.h
Normal file
69
src/video/qnxgf/SDL_hiddi_mouse.h
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
/*
|
||||||
|
SDL - Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2009 Sam Lantinga
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
Sam Lantinga
|
||||||
|
slouken@libsdl.org
|
||||||
|
|
||||||
|
QNX Graphics Framework SDL driver
|
||||||
|
Copyright (C) 2009 Mike Gorchak
|
||||||
|
(mike@malva.ua, lestat@i.com.ua)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SDL_HIDDI_MOUSE_H__
|
||||||
|
#define __SDL_HIDDI_MOUSE_H__
|
||||||
|
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
/* USB keyboard multimedia keys are generating this packet */
|
||||||
|
typedef struct mouse_packet2
|
||||||
|
{
|
||||||
|
uint8_t buttons;
|
||||||
|
int8_t wheel;
|
||||||
|
} mouse_packet2;
|
||||||
|
|
||||||
|
/* PS/2 mice are generating this packet */
|
||||||
|
typedef struct mouse_packet4
|
||||||
|
{
|
||||||
|
uint8_t buttons;
|
||||||
|
int8_t horizontal;
|
||||||
|
int8_t vertical;
|
||||||
|
int8_t wheel;
|
||||||
|
} mouse_packet4;
|
||||||
|
|
||||||
|
/* USB keyboard with mice wheel onboard generating this packet */
|
||||||
|
typedef struct mouse_packet5
|
||||||
|
{
|
||||||
|
uint8_t buttons;
|
||||||
|
int8_t horizontal;
|
||||||
|
int8_t vertical;
|
||||||
|
int8_t wheel;
|
||||||
|
uint8_t state;
|
||||||
|
} mouse_packet5;
|
||||||
|
|
||||||
|
/* USB multi-button mice are generating this packet */
|
||||||
|
typedef struct mouse_packet8
|
||||||
|
{
|
||||||
|
uint8_t buttons;
|
||||||
|
int8_t horizontal;
|
||||||
|
int8_t vertical;
|
||||||
|
int8_t wheel;
|
||||||
|
int16_t horizontal_precision;
|
||||||
|
int16_t vertical_precision;
|
||||||
|
} mouse_packet8;
|
||||||
|
|
||||||
|
#endif /* __SDL_HIDDI_MOUSE_H__ */
|
|
@ -37,6 +37,8 @@
|
||||||
#include "SDL_qnxgf.h"
|
#include "SDL_qnxgf.h"
|
||||||
#include "SDL_gf_render.h"
|
#include "SDL_gf_render.h"
|
||||||
#include "SDL_gf_pixelfmt.h"
|
#include "SDL_gf_pixelfmt.h"
|
||||||
|
#include "SDL_gf_opengles.h"
|
||||||
|
#include "SDL_gf_input.h"
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
/* SDL Generic video modes, which could provide GF */
|
/* SDL Generic video modes, which could provide GF */
|
||||||
|
@ -248,6 +250,13 @@ static SDL_VideoDevice* qnxgf_create(int devindex)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (gfdata->gfdev_info.description==NULL)
|
||||||
|
{
|
||||||
|
gf_dev_detach(gfdata->gfdev);
|
||||||
|
SDL_SetError("GF: Failed to initialize graphics driver");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Setup amount of available displays and current display */
|
/* Setup amount of available displays and current display */
|
||||||
device->num_displays=0;
|
device->num_displays=0;
|
||||||
device->current_display=0;
|
device->current_display=0;
|
||||||
|
@ -312,6 +321,10 @@ int qnxgf_videoinit(_THIS)
|
||||||
uint32_t it;
|
uint32_t it;
|
||||||
uint32_t jt;
|
uint32_t jt;
|
||||||
char* override;
|
char* override;
|
||||||
|
int32_t status;
|
||||||
|
|
||||||
|
/* By default GF uses buffer swap on vsync */
|
||||||
|
gfdata->swapinterval=1;
|
||||||
|
|
||||||
/* Add each detected output to SDL */
|
/* Add each detected output to SDL */
|
||||||
for (it=0; it<gfdata->gfdev_info.ndisplays; it++)
|
for (it=0; it<gfdata->gfdev_info.ndisplays; it++)
|
||||||
|
@ -319,7 +332,6 @@ int qnxgf_videoinit(_THIS)
|
||||||
SDL_VideoDisplay display;
|
SDL_VideoDisplay display;
|
||||||
SDL_DisplayMode current_mode;
|
SDL_DisplayMode current_mode;
|
||||||
SDL_DisplayData* didata;
|
SDL_DisplayData* didata;
|
||||||
int status;
|
|
||||||
|
|
||||||
didata=(SDL_DisplayData*)SDL_calloc(1, sizeof(SDL_DisplayData));
|
didata=(SDL_DisplayData*)SDL_calloc(1, sizeof(SDL_DisplayData));
|
||||||
if (didata==NULL)
|
if (didata==NULL)
|
||||||
|
@ -329,6 +341,36 @@ int qnxgf_videoinit(_THIS)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set default cursor settings, maximum 128x128 cursor */
|
||||||
|
didata->cursor_visible=SDL_FALSE;
|
||||||
|
didata->cursor.type=GF_CURSOR_BITMAP;
|
||||||
|
didata->cursor.hotspot.x=0;
|
||||||
|
didata->cursor.hotspot.y=0;
|
||||||
|
didata->cursor.cursor.bitmap.w=SDL_VIDEO_GF_MAX_CURSOR_SIZE;
|
||||||
|
didata->cursor.cursor.bitmap.h=SDL_VIDEO_GF_MAX_CURSOR_SIZE;
|
||||||
|
didata->cursor.cursor.bitmap.stride=(didata->cursor.cursor.bitmap.w+7)/
|
||||||
|
(sizeof(uint8_t)*8);
|
||||||
|
didata->cursor.cursor.bitmap.color0=0x00000000;
|
||||||
|
didata->cursor.cursor.bitmap.color1=0x00000000;
|
||||||
|
didata->cursor.cursor.bitmap.image0=SDL_calloc(sizeof(uint8_t), (didata->cursor.cursor.bitmap.w+7)*
|
||||||
|
didata->cursor.cursor.bitmap.h/(sizeof(uint8_t)*8));
|
||||||
|
if (didata->cursor.cursor.bitmap.image0==NULL)
|
||||||
|
{
|
||||||
|
SDL_free(didata);
|
||||||
|
SDL_OutOfMemory();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
didata->cursor.cursor.bitmap.image1=SDL_calloc(sizeof(uint8_t), (didata->cursor.cursor.bitmap.w+7)*
|
||||||
|
didata->cursor.cursor.bitmap.h/(sizeof(uint8_t)*8));
|
||||||
|
if (didata->cursor.cursor.bitmap.image1==NULL)
|
||||||
|
{
|
||||||
|
SDL_OutOfMemory();
|
||||||
|
SDL_free((void*)didata->cursor.cursor.bitmap.image0);
|
||||||
|
SDL_free(didata);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Query current display settings */
|
||||||
status=gf_display_query(gfdata->gfdev, it, &didata->display_info);
|
status=gf_display_query(gfdata->gfdev, it, &didata->display_info);
|
||||||
if (status==GF_ERR_OK)
|
if (status==GF_ERR_OK)
|
||||||
{
|
{
|
||||||
|
@ -342,6 +384,8 @@ int qnxgf_videoinit(_THIS)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* video initialization problem */
|
/* video initialization problem */
|
||||||
|
SDL_free((void*)didata->cursor.cursor.bitmap.image0);
|
||||||
|
SDL_free((void*)didata->cursor.cursor.bitmap.image1);
|
||||||
SDL_free(didata);
|
SDL_free(didata);
|
||||||
SDL_SetError("GF: Display query failed");
|
SDL_SetError("GF: Display query failed");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -352,6 +396,8 @@ int qnxgf_videoinit(_THIS)
|
||||||
if (status!=GF_ERR_OK)
|
if (status!=GF_ERR_OK)
|
||||||
{
|
{
|
||||||
/* video initialization problem */
|
/* video initialization problem */
|
||||||
|
SDL_free((void*)didata->cursor.cursor.bitmap.image0);
|
||||||
|
SDL_free((void*)didata->cursor.cursor.bitmap.image1);
|
||||||
SDL_free(didata);
|
SDL_free(didata);
|
||||||
SDL_SetError("GF: Couldn't attach to display");
|
SDL_SetError("GF: Couldn't attach to display");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -364,18 +410,64 @@ int qnxgf_videoinit(_THIS)
|
||||||
status=gf_layer_attach(&didata->layer, didata->display, didata->display_info.main_layer_index, 0);
|
status=gf_layer_attach(&didata->layer, didata->display, didata->display_info.main_layer_index, 0);
|
||||||
if (status!=GF_ERR_OK)
|
if (status!=GF_ERR_OK)
|
||||||
{
|
{
|
||||||
SDL_SetError("GF: Couldn't attach to main layer, it could be busy");
|
|
||||||
|
|
||||||
/* Failed to attach to main layer */
|
/* Failed to attach to main layer */
|
||||||
|
SDL_free((void*)didata->cursor.cursor.bitmap.image0);
|
||||||
|
SDL_free((void*)didata->cursor.cursor.bitmap.image1);
|
||||||
|
SDL_free(didata);
|
||||||
|
SDL_SetError("GF: Couldn't attach to main layer, it could be busy");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Mark main display layer is attached */
|
||||||
|
didata->layer_attached=SDL_TRUE;
|
||||||
|
|
||||||
|
/* Set layer source and destination viewport */
|
||||||
|
gf_layer_set_src_viewport(didata->layer, 0, 0, current_mode.w-1, current_mode.h-1);
|
||||||
|
gf_layer_set_dst_viewport(didata->layer, 0, 0, current_mode.w-1, current_mode.h-1);
|
||||||
|
|
||||||
|
/* Create main visible on display surface */
|
||||||
|
status=gf_surface_create_layer(&didata->surface[0], &didata->layer,
|
||||||
|
1, 0, current_mode.w, current_mode.h,
|
||||||
|
qnxgf_sdl_to_gf_pixelformat(current_mode.format),
|
||||||
|
NULL, GF_SURFACE_CREATE_2D_ACCESSIBLE | GF_SURFACE_CREATE_3D_ACCESSIBLE |
|
||||||
|
GF_SURFACE_CREATE_SHAREABLE);
|
||||||
|
if (status!=GF_ERR_OK)
|
||||||
|
{
|
||||||
|
gf_layer_disable(didata->layer);
|
||||||
|
gf_layer_detach(didata->layer);
|
||||||
|
didata->layer_attached=SDL_FALSE;
|
||||||
|
SDL_free((void*)didata->cursor.cursor.bitmap.image0);
|
||||||
|
SDL_free((void*)didata->cursor.cursor.bitmap.image1);
|
||||||
|
SDL_free(didata);
|
||||||
|
SDL_SetError("GF: Can't create main layer surface at init (%d)\n", status);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set just created surface as main visible on the layer */
|
||||||
|
// gf_layer_set_surfaces(didata->layer, &didata->surface[0], 1);
|
||||||
|
|
||||||
|
/* Update layer parameters */
|
||||||
|
status=gf_layer_update(didata->layer, GF_LAYER_UPDATE_NO_WAIT_IDLE);
|
||||||
|
if (status!=GF_ERR_OK)
|
||||||
|
{
|
||||||
|
/* Free allocated surface */
|
||||||
|
gf_surface_free(didata->surface[0]);
|
||||||
|
didata->surface[0]=NULL;
|
||||||
|
|
||||||
|
/* Disable and detach from layer */
|
||||||
|
gf_layer_disable(didata->layer);
|
||||||
|
gf_layer_detach(didata->layer);
|
||||||
|
didata->layer_attached=SDL_FALSE;
|
||||||
|
SDL_free((void*)didata->cursor.cursor.bitmap.image0);
|
||||||
|
SDL_free((void*)didata->cursor.cursor.bitmap.image1);
|
||||||
|
SDL_free(didata);
|
||||||
|
SDL_SetError("GF: Can't update layer parameters\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Enable layer in case if hardware supports layer enable/disable */
|
/* Enable layer in case if hardware supports layer enable/disable */
|
||||||
gf_layer_enable(didata->layer);
|
gf_layer_enable(didata->layer);
|
||||||
|
|
||||||
/* Mark main display layer is attached */
|
|
||||||
didata->layer_attached=SDL_TRUE;
|
|
||||||
|
|
||||||
/* Copy device name for each display */
|
/* Copy device name for each display */
|
||||||
SDL_strlcpy(didata->description, gfdata->gfdev_info.description, SDL_VIDEO_GF_DEVICENAME_MAX-1);
|
SDL_strlcpy(didata->description, gfdata->gfdev_info.description, SDL_VIDEO_GF_DEVICENAME_MAX-1);
|
||||||
|
|
||||||
|
@ -395,9 +487,9 @@ int qnxgf_videoinit(_THIS)
|
||||||
|
|
||||||
/* Initialize display structure */
|
/* Initialize display structure */
|
||||||
SDL_zero(display);
|
SDL_zero(display);
|
||||||
display.desktop_mode = current_mode;
|
display.desktop_mode=current_mode;
|
||||||
display.current_mode = current_mode;
|
display.current_mode=current_mode;
|
||||||
display.driverdata = didata;
|
display.driverdata=didata;
|
||||||
didata->current_mode=current_mode;
|
didata->current_mode=current_mode;
|
||||||
SDL_AddVideoDisplay(&display);
|
SDL_AddVideoDisplay(&display);
|
||||||
|
|
||||||
|
@ -411,11 +503,26 @@ int qnxgf_videoinit(_THIS)
|
||||||
didata->custom_refresh=0;
|
didata->custom_refresh=0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Get all display modes for this display */
|
||||||
|
_this->current_display=it;
|
||||||
|
qnxgf_getdisplaymodes(_this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Restore default display */
|
||||||
|
_this->current_display=0;
|
||||||
|
|
||||||
/* Add GF renderer to SDL */
|
/* Add GF renderer to SDL */
|
||||||
gf_addrenderdriver(_this);
|
gf_addrenderdriver(_this);
|
||||||
|
|
||||||
|
/* Add GF input devices */
|
||||||
|
status=gf_addinputdevices(_this);
|
||||||
|
if (status!=0)
|
||||||
|
{
|
||||||
|
/* SDL error is set by gf_addinputdevices() function */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/* video has been initialized successfully */
|
/* video has been initialized successfully */
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -425,11 +532,58 @@ void qnxgf_videoquit(_THIS)
|
||||||
SDL_DisplayData* didata;
|
SDL_DisplayData* didata;
|
||||||
uint32_t it;
|
uint32_t it;
|
||||||
|
|
||||||
/* SDL will restore our desktop mode on exit */
|
/* Delete GF input devices */
|
||||||
|
gf_delinputdevices(_this);
|
||||||
|
|
||||||
|
/* SDL will restore old desktop mode on exit */
|
||||||
for(it=0; it<_this->num_displays; it++)
|
for(it=0; it<_this->num_displays; it++)
|
||||||
{
|
{
|
||||||
didata=_this->displays[it].driverdata;
|
didata=_this->displays[it].driverdata;
|
||||||
|
|
||||||
|
/* Free cursor image */
|
||||||
|
if (didata->cursor.cursor.bitmap.image0!=NULL)
|
||||||
|
{
|
||||||
|
SDL_free((void*)didata->cursor.cursor.bitmap.image0);
|
||||||
|
}
|
||||||
|
if (didata->cursor.cursor.bitmap.image1!=NULL)
|
||||||
|
{
|
||||||
|
SDL_free((void*)didata->cursor.cursor.bitmap.image1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free main surface */
|
||||||
|
if (didata->surface[0]!=NULL)
|
||||||
|
{
|
||||||
|
gf_surface_free(didata->surface[0]);
|
||||||
|
didata->surface[0]=NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free back surface */
|
||||||
|
if (didata->surface[1]!=NULL)
|
||||||
|
{
|
||||||
|
gf_surface_free(didata->surface[1]);
|
||||||
|
didata->surface[1]=NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free second back surface */
|
||||||
|
if (didata->surface[2]!=NULL)
|
||||||
|
{
|
||||||
|
gf_surface_free(didata->surface[2]);
|
||||||
|
didata->surface[2]=NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Detach layer before quit */
|
||||||
|
if (didata->layer_attached==SDL_TRUE)
|
||||||
|
{
|
||||||
|
/* Disable layer if hardware supports this */
|
||||||
|
gf_layer_disable(didata->layer);
|
||||||
|
|
||||||
|
/* Detach from layer, free it for others */
|
||||||
|
gf_layer_detach(didata->layer);
|
||||||
|
|
||||||
|
/* Mark it as detached */
|
||||||
|
didata->layer_attached=SDL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Detach from selected display */
|
/* Detach from selected display */
|
||||||
gf_display_detach(didata->display);
|
gf_display_detach(didata->display);
|
||||||
}
|
}
|
||||||
|
@ -523,7 +677,7 @@ int qnxgf_setdisplaymode(_THIS, SDL_DisplayMode* mode)
|
||||||
{
|
{
|
||||||
SDL_DisplayData* didata=(SDL_DisplayData*)SDL_CurrentDisplay.driverdata;
|
SDL_DisplayData* didata=(SDL_DisplayData*)SDL_CurrentDisplay.driverdata;
|
||||||
uint32_t refresh_rate=0;
|
uint32_t refresh_rate=0;
|
||||||
int result;
|
int status;
|
||||||
|
|
||||||
/* Current display dimensions and bpp are no more valid */
|
/* Current display dimensions and bpp are no more valid */
|
||||||
didata->current_mode.format=SDL_PIXELFORMAT_UNKNOWN;
|
didata->current_mode.format=SDL_PIXELFORMAT_UNKNOWN;
|
||||||
|
@ -617,6 +771,27 @@ int qnxgf_setdisplaymode(_THIS, SDL_DisplayMode* mode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Free main surface */
|
||||||
|
if (didata->surface[0]!=NULL)
|
||||||
|
{
|
||||||
|
gf_surface_free(didata->surface[0]);
|
||||||
|
didata->surface[0]=NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free back surface */
|
||||||
|
if (didata->surface[1]!=NULL)
|
||||||
|
{
|
||||||
|
gf_surface_free(didata->surface[1]);
|
||||||
|
didata->surface[1]=NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free second back surface */
|
||||||
|
if (didata->surface[2]!=NULL)
|
||||||
|
{
|
||||||
|
gf_surface_free(didata->surface[2]);
|
||||||
|
didata->surface[2]=NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Detach layer before switch to new graphics mode */
|
/* Detach layer before switch to new graphics mode */
|
||||||
if (didata->layer_attached==SDL_TRUE)
|
if (didata->layer_attached==SDL_TRUE)
|
||||||
{
|
{
|
||||||
|
@ -631,9 +806,9 @@ int qnxgf_setdisplaymode(_THIS, SDL_DisplayMode* mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set new display video mode */
|
/* Set new display video mode */
|
||||||
result=gf_display_set_mode(didata->display, mode->w, mode->h, refresh_rate,
|
status=gf_display_set_mode(didata->display, mode->w, mode->h, refresh_rate,
|
||||||
qnxgf_sdl_to_gf_pixelformat(mode->format), 0);
|
qnxgf_sdl_to_gf_pixelformat(mode->format), 0);
|
||||||
if (result!=GF_ERR_OK)
|
if (status!=GF_ERR_OK)
|
||||||
{
|
{
|
||||||
/* Display mode/resolution switch has been failed */
|
/* Display mode/resolution switch has been failed */
|
||||||
SDL_SetError("GF: Mode is not supported by graphics driver");
|
SDL_SetError("GF: Mode is not supported by graphics driver");
|
||||||
|
@ -646,8 +821,8 @@ int qnxgf_setdisplaymode(_THIS, SDL_DisplayMode* mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Attach to main display layer */
|
/* Attach to main display layer */
|
||||||
result=gf_layer_attach(&didata->layer, didata->display, didata->display_info.main_layer_index, 0);
|
status=gf_layer_attach(&didata->layer, didata->display, didata->display_info.main_layer_index, 0);
|
||||||
if (result!=GF_ERR_OK)
|
if (status!=GF_ERR_OK)
|
||||||
{
|
{
|
||||||
SDL_SetError("GF: Couldn't attach to main layer, it could be busy");
|
SDL_SetError("GF: Couldn't attach to main layer, it could be busy");
|
||||||
|
|
||||||
|
@ -655,12 +830,56 @@ int qnxgf_setdisplaymode(_THIS, SDL_DisplayMode* mode)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Enable layer in case if hardware supports layer enable/disable */
|
|
||||||
gf_layer_enable(didata->layer);
|
|
||||||
|
|
||||||
/* Mark main display layer is attached */
|
/* Mark main display layer is attached */
|
||||||
didata->layer_attached=SDL_TRUE;
|
didata->layer_attached=SDL_TRUE;
|
||||||
|
|
||||||
|
/* Set layer source and destination viewport */
|
||||||
|
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);
|
||||||
|
|
||||||
|
/* Create main visible on display surface */
|
||||||
|
status=gf_surface_create_layer(&didata->surface[0], &didata->layer, 1, 0,
|
||||||
|
mode->w, mode->h, qnxgf_sdl_to_gf_pixelformat(mode->format),
|
||||||
|
NULL, GF_SURFACE_CREATE_2D_ACCESSIBLE | GF_SURFACE_CREATE_3D_ACCESSIBLE |
|
||||||
|
GF_SURFACE_CREATE_SHAREABLE);
|
||||||
|
if (status!=GF_ERR_OK)
|
||||||
|
{
|
||||||
|
gf_layer_disable(didata->layer);
|
||||||
|
gf_layer_detach(didata->layer);
|
||||||
|
didata->layer_attached=SDL_FALSE;
|
||||||
|
SDL_SetError("GF: Can't create main layer surface at modeswitch (%d)\n", status);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set just created surface as main visible on the layer */
|
||||||
|
gf_layer_set_surfaces(didata->layer, &didata->surface[0], 1);
|
||||||
|
|
||||||
|
/* Update layer parameters */
|
||||||
|
status=gf_layer_update(didata->layer, GF_LAYER_UPDATE_NO_WAIT_IDLE);
|
||||||
|
if (status!=GF_ERR_OK)
|
||||||
|
{
|
||||||
|
/* Free main surface */
|
||||||
|
gf_surface_free(didata->surface[0]);
|
||||||
|
didata->surface[0]=NULL;
|
||||||
|
|
||||||
|
/* Detach layer */
|
||||||
|
gf_layer_disable(didata->layer);
|
||||||
|
gf_layer_detach(didata->layer);
|
||||||
|
didata->layer_attached=SDL_FALSE;
|
||||||
|
SDL_SetError("GF: Can't update layer parameters\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Restore cursor if it was visible */
|
||||||
|
if (didata->cursor_visible==SDL_TRUE)
|
||||||
|
{
|
||||||
|
gf_cursor_set(didata->display, 0, &didata->cursor);
|
||||||
|
gf_cursor_enable(didata->display, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Enable layer in case if hardware supports layer enable/disable */
|
||||||
|
gf_layer_enable(didata->layer);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -766,7 +985,7 @@ int qnxgf_createwindow(_THIS, SDL_Window* window)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Setup our own window decorations, which are depend on fullscreen mode */
|
/* Setup our own window decorations and states, which are depend on fullscreen mode */
|
||||||
window->flags|=SDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESS |
|
window->flags|=SDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESS |
|
||||||
SDL_WINDOW_MAXIMIZED | SDL_WINDOW_INPUT_GRABBED |
|
SDL_WINDOW_MAXIMIZED | SDL_WINDOW_INPUT_GRABBED |
|
||||||
SDL_WINDOW_INPUT_FOCUS | SDL_WINDOW_MOUSE_FOCUS;
|
SDL_WINDOW_INPUT_FOCUS | SDL_WINDOW_MOUSE_FOCUS;
|
||||||
|
@ -823,6 +1042,13 @@ int qnxgf_createwindow(_THIS, SDL_Window* window)
|
||||||
#endif /* SDL_VIDEO_OPENGL_ES */
|
#endif /* SDL_VIDEO_OPENGL_ES */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Enable mouse event collecting */
|
||||||
|
hiddi_enable_mouse();
|
||||||
|
|
||||||
|
/* By default last created window got a input focus */
|
||||||
|
SDL_SetKeyboardFocus(0, window->id);
|
||||||
|
SDL_SetMouseFocus(0, window->id);
|
||||||
|
|
||||||
/* Window has been successfully created */
|
/* Window has been successfully created */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -896,9 +1122,9 @@ void qnxgf_destroywindow(_THIS, SDL_Window* window)
|
||||||
if (wdata->target_created==SDL_TRUE)
|
if (wdata->target_created==SDL_TRUE)
|
||||||
{
|
{
|
||||||
gf_3d_target_free(wdata->target);
|
gf_3d_target_free(wdata->target);
|
||||||
|
wdata->target_created==SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
gfdata->egl_refcount--;
|
gfdata->egl_refcount--;
|
||||||
if (gfdata->egl_refcount==0)
|
if (gfdata->egl_refcount==0)
|
||||||
{
|
{
|
||||||
|
@ -1001,8 +1227,22 @@ void* qnxgf_gl_getprocaddres(_THIS, const char* proc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Add emulated OpenGL ES 1.1 functions */
|
||||||
|
if (SDL_strcmp(proc, "glTexParameteri")==0)
|
||||||
|
{
|
||||||
|
return glTexParameteri;
|
||||||
|
}
|
||||||
|
if (SDL_strcmp(proc, "glTexParameteriv")==0)
|
||||||
|
{
|
||||||
|
return glTexParameteriv;
|
||||||
|
}
|
||||||
|
if (SDL_strcmp(proc, "glColor4ub")==0)
|
||||||
|
{
|
||||||
|
return glColor4ub;
|
||||||
|
}
|
||||||
|
|
||||||
/* Failed to get GL ES function address pointer */
|
/* Failed to get GL ES function address pointer */
|
||||||
SDL_SetError("GF: Cannot locate given function name");
|
SDL_SetError("GF: Cannot locate OpenGL ES function name");
|
||||||
return NULL;
|
return NULL;
|
||||||
#else
|
#else
|
||||||
SDL_SetError("GF: OpenGL ES support is not compiled in");
|
SDL_SetError("GF: OpenGL ES support is not compiled in");
|
||||||
|
@ -1036,6 +1276,125 @@ SDL_GLContext qnxgf_gl_createcontext(_THIS, SDL_Window* window)
|
||||||
EGLint configs;
|
EGLint configs;
|
||||||
uint32_t surfaces;
|
uint32_t surfaces;
|
||||||
uint32_t attr_pos;
|
uint32_t attr_pos;
|
||||||
|
EGLint attr_value;
|
||||||
|
EGLint cit;
|
||||||
|
|
||||||
|
/* Choose buffeingr scheme */
|
||||||
|
if (!_this->gl_config.double_buffer)
|
||||||
|
{
|
||||||
|
surfaces=1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
surfaces=2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free main surface */
|
||||||
|
if (didata->surface[0]!=NULL)
|
||||||
|
{
|
||||||
|
gf_surface_free(didata->surface[0]);
|
||||||
|
didata->surface[0]=NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free back surface */
|
||||||
|
if (didata->surface[1]!=NULL)
|
||||||
|
{
|
||||||
|
gf_surface_free(didata->surface[1]);
|
||||||
|
didata->surface[1]=NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free second back surface */
|
||||||
|
if (didata->surface[2]!=NULL)
|
||||||
|
{
|
||||||
|
gf_surface_free(didata->surface[2]);
|
||||||
|
didata->surface[2]=NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Detach layer before switch to new graphics mode */
|
||||||
|
if (didata->layer_attached==SDL_TRUE)
|
||||||
|
{
|
||||||
|
/* Disable layer if hardware supports this */
|
||||||
|
gf_layer_disable(didata->layer);
|
||||||
|
|
||||||
|
/* Detach from layer, free it for others */
|
||||||
|
gf_layer_detach(didata->layer);
|
||||||
|
|
||||||
|
/* Mark it as detached */
|
||||||
|
didata->layer_attached=SDL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Attach to main display layer */
|
||||||
|
gfstatus=gf_layer_attach(&didata->layer, didata->display, didata->display_info.main_layer_index, 0);
|
||||||
|
if (gfstatus!=GF_ERR_OK)
|
||||||
|
{
|
||||||
|
SDL_SetError("GF: Couldn't attach to main layer, it could be busy");
|
||||||
|
|
||||||
|
/* Failed to attach to main displayable layer */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Mark main display layer is attached */
|
||||||
|
didata->layer_attached=SDL_TRUE;
|
||||||
|
|
||||||
|
/* Set layer source and destination viewport */
|
||||||
|
gf_layer_set_src_viewport(didata->layer, 0, 0, didata->current_mode.w-1, didata->current_mode.h-1);
|
||||||
|
gf_layer_set_dst_viewport(didata->layer, 0, 0, didata->current_mode.w-1, didata->current_mode.h-1);
|
||||||
|
|
||||||
|
/* Create main visible on display surface */
|
||||||
|
gfstatus=gf_surface_create_layer(&didata->surface[0], &didata->layer, 1, 0,
|
||||||
|
didata->current_mode.w, didata->current_mode.h, qnxgf_sdl_to_gf_pixelformat(didata->current_mode.format),
|
||||||
|
NULL, GF_SURFACE_CREATE_2D_ACCESSIBLE | GF_SURFACE_CREATE_3D_ACCESSIBLE |
|
||||||
|
GF_SURFACE_CREATE_SHAREABLE);
|
||||||
|
if (gfstatus!=GF_ERR_OK)
|
||||||
|
{
|
||||||
|
gf_layer_disable(didata->layer);
|
||||||
|
gf_layer_detach(didata->layer);
|
||||||
|
didata->layer_attached=SDL_FALSE;
|
||||||
|
SDL_SetError("GF: Can't create main layer surface at glctx (%d)\n", gfstatus);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set just created surface as main visible on the layer */
|
||||||
|
// gf_layer_set_surfaces(didata->layer, &didata->surface[0], 1);
|
||||||
|
|
||||||
|
if (surfaces>1)
|
||||||
|
{
|
||||||
|
/* Create back display surface */
|
||||||
|
gfstatus=gf_surface_create_layer(&didata->surface[1], &didata->layer, 1, 0,
|
||||||
|
didata->current_mode.w, didata->current_mode.h, qnxgf_sdl_to_gf_pixelformat(didata->current_mode.format),
|
||||||
|
NULL, GF_SURFACE_CREATE_2D_ACCESSIBLE | GF_SURFACE_CREATE_3D_ACCESSIBLE |
|
||||||
|
GF_SURFACE_CREATE_SHAREABLE);
|
||||||
|
if (gfstatus!=GF_ERR_OK)
|
||||||
|
{
|
||||||
|
gf_surface_free(didata->surface[0]);
|
||||||
|
gf_layer_disable(didata->layer);
|
||||||
|
gf_layer_detach(didata->layer);
|
||||||
|
didata->layer_attached=SDL_FALSE;
|
||||||
|
SDL_SetError("GF: Can't create main layer surface at glctx (%d)\n", gfstatus);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update layer parameters */
|
||||||
|
gfstatus=gf_layer_update(didata->layer, GF_LAYER_UPDATE_NO_WAIT_IDLE);
|
||||||
|
if (gfstatus!=GF_ERR_OK)
|
||||||
|
{
|
||||||
|
/* Free main and back surfaces */
|
||||||
|
gf_surface_free(didata->surface[1]);
|
||||||
|
didata->surface[1]=NULL;
|
||||||
|
gf_surface_free(didata->surface[0]);
|
||||||
|
didata->surface[0]=NULL;
|
||||||
|
|
||||||
|
/* Detach layer */
|
||||||
|
gf_layer_disable(didata->layer);
|
||||||
|
gf_layer_detach(didata->layer);
|
||||||
|
didata->layer_attached=SDL_FALSE;
|
||||||
|
SDL_SetError("GF: Can't update layer parameters\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Enable layer in case if hardware supports layer enable/disable */
|
||||||
|
gf_layer_enable(didata->layer);
|
||||||
|
|
||||||
/* Prepare attributes list to pass them to OpenGL ES */
|
/* Prepare attributes list to pass them to OpenGL ES */
|
||||||
attr_pos=0;
|
attr_pos=0;
|
||||||
|
@ -1069,19 +1428,6 @@ SDL_GLContext qnxgf_gl_createcontext(_THIS, SDL_Window* window)
|
||||||
wdata->gles_attributes[attr_pos++]=_this->gl_config.buffer_size;
|
wdata->gles_attributes[attr_pos++]=_this->gl_config.buffer_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* OpenGL ES 1.0 uses double buffer by default, so if application */
|
|
||||||
/* do not requested double buffering, switch to single buffer */
|
|
||||||
if (!_this->gl_config.double_buffer)
|
|
||||||
{
|
|
||||||
wdata->gles_attributes[attr_pos++]=EGL_SINGLE_BUFFER;
|
|
||||||
wdata->gles_attributes[attr_pos++]=EGL_TRUE;
|
|
||||||
surfaces=1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
surfaces=2;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set number of samples in multisampling */
|
/* Set number of samples in multisampling */
|
||||||
if (_this->gl_config.multisamplesamples)
|
if (_this->gl_config.multisamplesamples)
|
||||||
{
|
{
|
||||||
|
@ -1100,15 +1446,161 @@ SDL_GLContext qnxgf_gl_createcontext(_THIS, SDL_Window* window)
|
||||||
wdata->gles_attributes[attr_pos]=EGL_NONE;
|
wdata->gles_attributes[attr_pos]=EGL_NONE;
|
||||||
|
|
||||||
/* Request first suitable framebuffer configuration */
|
/* Request first suitable framebuffer configuration */
|
||||||
status=eglChooseConfig(gfdata->egldisplay, wdata->gles_attributes, &wdata->gles_config, 1, &configs);
|
status=eglChooseConfig(gfdata->egldisplay, wdata->gles_attributes,
|
||||||
|
wdata->gles_configs, SDL_VIDEO_GF_OPENGLES_CONFS, &configs);
|
||||||
if (status!=EGL_TRUE)
|
if (status!=EGL_TRUE)
|
||||||
{
|
{
|
||||||
SDL_SetError("GF: Can't find closest configuration for OpenGL ES");
|
SDL_SetError("GF: Can't find closest configuration for OpenGL ES");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check if nothing has been found, try "don't care" settings */
|
||||||
|
if (configs==0)
|
||||||
|
{
|
||||||
|
int32_t it;
|
||||||
|
int32_t jt;
|
||||||
|
GLint depthbits[4]={32, 24, 16, EGL_DONT_CARE};
|
||||||
|
|
||||||
|
for (it=0; it<4; it++)
|
||||||
|
{
|
||||||
|
for (jt=16; jt>=0; jt--)
|
||||||
|
{
|
||||||
|
/* Don't care about color buffer bits, use what exist */
|
||||||
|
/* Replace previous data set with EGL_DONT_CARE */
|
||||||
|
attr_pos=0;
|
||||||
|
wdata->gles_attributes[attr_pos++]=EGL_NATIVE_VISUAL_ID;
|
||||||
|
wdata->gles_attributes[attr_pos++]=qnxgf_sdl_to_gf_pixelformat(didata->current_mode.format);
|
||||||
|
wdata->gles_attributes[attr_pos++]=EGL_RED_SIZE;
|
||||||
|
wdata->gles_attributes[attr_pos++]=EGL_DONT_CARE;
|
||||||
|
wdata->gles_attributes[attr_pos++]=EGL_GREEN_SIZE;
|
||||||
|
wdata->gles_attributes[attr_pos++]=EGL_DONT_CARE;
|
||||||
|
wdata->gles_attributes[attr_pos++]=EGL_BLUE_SIZE;
|
||||||
|
wdata->gles_attributes[attr_pos++]=EGL_DONT_CARE;
|
||||||
|
wdata->gles_attributes[attr_pos++]=EGL_ALPHA_SIZE;
|
||||||
|
wdata->gles_attributes[attr_pos++]=EGL_DONT_CARE;
|
||||||
|
wdata->gles_attributes[attr_pos++]=EGL_BUFFER_SIZE;
|
||||||
|
wdata->gles_attributes[attr_pos++]=EGL_DONT_CARE;
|
||||||
|
|
||||||
|
/* Try to find requested or smallest depth */
|
||||||
|
if (_this->gl_config.depth_size)
|
||||||
|
{
|
||||||
|
wdata->gles_attributes[attr_pos++]=EGL_DEPTH_SIZE;
|
||||||
|
wdata->gles_attributes[attr_pos++]=depthbits[it];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wdata->gles_attributes[attr_pos++]=EGL_DEPTH_SIZE;
|
||||||
|
wdata->gles_attributes[attr_pos++]=EGL_DONT_CARE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_this->gl_config.stencil_size)
|
||||||
|
{
|
||||||
|
wdata->gles_attributes[attr_pos++]=EGL_STENCIL_SIZE;
|
||||||
|
wdata->gles_attributes[attr_pos++]=jt;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wdata->gles_attributes[attr_pos++]=EGL_STENCIL_SIZE;
|
||||||
|
wdata->gles_attributes[attr_pos++]=EGL_DONT_CARE;
|
||||||
|
|
||||||
|
/* exit from stencil loop */
|
||||||
|
jt=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Don't care about antialiasing */
|
||||||
|
wdata->gles_attributes[attr_pos++]=EGL_SAMPLES;
|
||||||
|
wdata->gles_attributes[attr_pos++]=EGL_DONT_CARE;
|
||||||
|
wdata->gles_attributes[attr_pos++]=EGL_SAMPLE_BUFFERS;
|
||||||
|
wdata->gles_attributes[attr_pos++]=EGL_DONT_CARE;
|
||||||
|
wdata->gles_attributes[attr_pos]=EGL_NONE;
|
||||||
|
|
||||||
|
/* Request first suitable framebuffer configuration */
|
||||||
|
status=eglChooseConfig(gfdata->egldisplay, wdata->gles_attributes,
|
||||||
|
wdata->gles_configs, SDL_VIDEO_GF_OPENGLES_CONFS, &configs);
|
||||||
|
if (status!=EGL_TRUE)
|
||||||
|
{
|
||||||
|
SDL_SetError("Photon: Can't find closest configuration for OpenGL ES");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (configs!=0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (configs!=0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* No available configs */
|
||||||
|
if (configs==0)
|
||||||
|
{
|
||||||
|
SDL_SetError("Photon: Can't find any configuration for OpenGL ES");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize config index */
|
||||||
|
wdata->gles_config=0;
|
||||||
|
|
||||||
|
/* Now check each configuration to find out the best */
|
||||||
|
for (cit=0; cit<configs; cit++)
|
||||||
|
{
|
||||||
|
uint32_t stencil_found;
|
||||||
|
uint32_t depth_found;
|
||||||
|
|
||||||
|
stencil_found=0;
|
||||||
|
depth_found=0;
|
||||||
|
|
||||||
|
if (_this->gl_config.stencil_size)
|
||||||
|
{
|
||||||
|
status=eglGetConfigAttrib(gfdata->egldisplay, wdata->gles_configs[cit], EGL_STENCIL_SIZE, &attr_value);
|
||||||
|
if (status==EGL_TRUE)
|
||||||
|
{
|
||||||
|
if (attr_value!=0)
|
||||||
|
{
|
||||||
|
stencil_found=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
stencil_found=1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_this->gl_config.depth_size)
|
||||||
|
{
|
||||||
|
status=eglGetConfigAttrib(gfdata->egldisplay, wdata->gles_configs[cit], EGL_DEPTH_SIZE, &attr_value);
|
||||||
|
if (status==EGL_TRUE)
|
||||||
|
{
|
||||||
|
if (attr_value!=0)
|
||||||
|
{
|
||||||
|
depth_found=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
depth_found=1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Exit from loop if found appropriate configuration */
|
||||||
|
if ((depth_found!=0) && (stencil_found!=0))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If best could not be found, use first */
|
||||||
|
if (cit==configs)
|
||||||
|
{
|
||||||
|
cit=0;
|
||||||
|
}
|
||||||
|
wdata->gles_config=cit;
|
||||||
|
|
||||||
/* Create OpenGL ES context */
|
/* Create OpenGL ES context */
|
||||||
wdata->gles_context=eglCreateContext(gfdata->egldisplay, wdata->gles_config, EGL_NO_CONTEXT, NULL);
|
wdata->gles_context=eglCreateContext(gfdata->egldisplay, wdata->gles_configs[wdata->gles_config], EGL_NO_CONTEXT, NULL);
|
||||||
if (wdata->gles_context==EGL_NO_CONTEXT)
|
if (wdata->gles_context==EGL_NO_CONTEXT)
|
||||||
{
|
{
|
||||||
SDL_SetError("GF: OpenGL ES context creation has been failed");
|
SDL_SetError("GF: OpenGL ES context creation has been failed");
|
||||||
|
@ -1119,13 +1611,13 @@ SDL_GLContext qnxgf_gl_createcontext(_THIS, SDL_Window* window)
|
||||||
if (wdata->target_created==SDL_TRUE)
|
if (wdata->target_created==SDL_TRUE)
|
||||||
{
|
{
|
||||||
gf_3d_target_free(wdata->target);
|
gf_3d_target_free(wdata->target);
|
||||||
|
wdata->target_created==SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create surface(s) target for OpenGL ES */
|
/* Create surface(s) target for OpenGL ES */
|
||||||
gfstatus=gf_3d_target_create(&wdata->target, didata->layer, NULL,
|
gfstatus=gf_3d_target_create(&wdata->target, didata->layer, &didata->surface[0],
|
||||||
surfaces, didata->current_mode.w, didata->current_mode.h,
|
surfaces, didata->current_mode.w, didata->current_mode.h,
|
||||||
qnxgf_sdl_to_gf_pixelformat(didata->current_mode.format));
|
qnxgf_sdl_to_gf_pixelformat(didata->current_mode.format));
|
||||||
|
|
||||||
if (gfstatus!=GF_ERR_OK)
|
if (gfstatus!=GF_ERR_OK)
|
||||||
{
|
{
|
||||||
/* Destroy just created context */
|
/* Destroy just created context */
|
||||||
|
@ -1143,7 +1635,7 @@ SDL_GLContext qnxgf_gl_createcontext(_THIS, SDL_Window* window)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create target rendering surface on whole screen */
|
/* Create target rendering surface on whole screen */
|
||||||
wdata->gles_surface=eglCreateWindowSurface(gfdata->egldisplay, wdata->gles_config, wdata->target, NULL);
|
wdata->gles_surface=eglCreateWindowSurface(gfdata->egldisplay, wdata->gles_configs[wdata->gles_config], wdata->target, NULL);
|
||||||
if (wdata->gles_surface==EGL_NO_SURFACE)
|
if (wdata->gles_surface==EGL_NO_SURFACE)
|
||||||
{
|
{
|
||||||
/* Destroy 3d target */
|
/* Destroy 3d target */
|
||||||
|
@ -1192,7 +1684,39 @@ SDL_GLContext qnxgf_gl_createcontext(_THIS, SDL_Window* window)
|
||||||
/* Always clear stereo enable, since OpenGL ES do not supports stereo */
|
/* Always clear stereo enable, since OpenGL ES do not supports stereo */
|
||||||
_this->gl_config.stereo=0;
|
_this->gl_config.stereo=0;
|
||||||
|
|
||||||
/* Failed to create GL ES context */
|
/* Get back samples and samplebuffers configurations. Rest framebuffer */
|
||||||
|
/* parameters could be obtained through the OpenGL ES API */
|
||||||
|
status=eglGetConfigAttrib(gfdata->egldisplay, wdata->gles_configs[wdata->gles_config], EGL_SAMPLES, &attr_value);
|
||||||
|
if (status==EGL_TRUE)
|
||||||
|
{
|
||||||
|
_this->gl_config.multisamplesamples=attr_value;
|
||||||
|
}
|
||||||
|
status=eglGetConfigAttrib(gfdata->egldisplay, wdata->gles_configs[wdata->gles_config], EGL_SAMPLE_BUFFERS, &attr_value);
|
||||||
|
if (status==EGL_TRUE)
|
||||||
|
{
|
||||||
|
_this->gl_config.multisamplebuffers=attr_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get back stencil and depth buffer sizes */
|
||||||
|
status=eglGetConfigAttrib(gfdata->egldisplay, wdata->gles_configs[wdata->gles_config], EGL_DEPTH_SIZE, &attr_value);
|
||||||
|
if (status==EGL_TRUE)
|
||||||
|
{
|
||||||
|
_this->gl_config.depth_size=attr_value;
|
||||||
|
}
|
||||||
|
status=eglGetConfigAttrib(gfdata->egldisplay, wdata->gles_configs[wdata->gles_config], EGL_STENCIL_SIZE, &attr_value);
|
||||||
|
if (status==EGL_TRUE)
|
||||||
|
{
|
||||||
|
_this->gl_config.stencil_size=attr_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Restore cursor if it was visible */
|
||||||
|
if (didata->cursor_visible==SDL_TRUE)
|
||||||
|
{
|
||||||
|
gf_cursor_set(didata->display, 0, &didata->cursor);
|
||||||
|
gf_cursor_enable(didata->display, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* GL ES context was successfully created */
|
||||||
return wdata->gles_context;
|
return wdata->gles_context;
|
||||||
#else
|
#else
|
||||||
SDL_SetError("GF: OpenGL ES support is not compiled in");
|
SDL_SetError("GF: OpenGL ES support is not compiled in");
|
||||||
|
@ -1283,6 +1807,10 @@ void qnxgf_gl_swapwindow(_THIS, SDL_Window* window)
|
||||||
SDL_VideoData* gfdata=(SDL_VideoData*)_this->driverdata;
|
SDL_VideoData* gfdata=(SDL_VideoData*)_this->driverdata;
|
||||||
SDL_WindowData* wdata=(SDL_WindowData*)window->driverdata;
|
SDL_WindowData* wdata=(SDL_WindowData*)window->driverdata;
|
||||||
|
|
||||||
|
/* Finish all drawings */
|
||||||
|
glFinish();
|
||||||
|
|
||||||
|
/* Swap buffers */
|
||||||
eglSwapBuffers(gfdata->egldisplay, wdata->gles_surface);
|
eglSwapBuffers(gfdata->egldisplay, wdata->gles_surface);
|
||||||
#else
|
#else
|
||||||
SDL_SetError("GF: OpenGL ES support is not compiled in");
|
SDL_SetError("GF: OpenGL ES support is not compiled in");
|
||||||
|
|
|
@ -48,7 +48,8 @@ typedef struct SDL_VideoData
|
||||||
#endif /* SDL_VIDEO_OPENGL_ES */
|
#endif /* SDL_VIDEO_OPENGL_ES */
|
||||||
} SDL_VideoData;
|
} SDL_VideoData;
|
||||||
|
|
||||||
#define SDL_VIDEO_GF_DEVICENAME_MAX 257
|
#define SDL_VIDEO_GF_DEVICENAME_MAX 257
|
||||||
|
#define SDL_VIDEO_GF_MAX_CURSOR_SIZE 128
|
||||||
|
|
||||||
typedef struct SDL_DisplayData
|
typedef struct SDL_DisplayData
|
||||||
{
|
{
|
||||||
|
@ -61,15 +62,23 @@ typedef struct SDL_DisplayData
|
||||||
uint32_t caps; /* Device capabilities */
|
uint32_t caps; /* Device capabilities */
|
||||||
SDL_bool layer_attached; /* Layer attach status */
|
SDL_bool layer_attached; /* Layer attach status */
|
||||||
gf_layer_t layer; /* Graphics layer to which attached */
|
gf_layer_t layer; /* Graphics layer to which attached */
|
||||||
|
gf_surface_t surface[3]; /* Visible surface on the display */
|
||||||
|
SDL_bool cursor_visible; /* SDL_TRUE if cursor visible */
|
||||||
|
gf_cursor_t cursor; /* Cursor shape which was set last */
|
||||||
} SDL_DisplayData;
|
} SDL_DisplayData;
|
||||||
|
|
||||||
|
/* Maximum amount of OpenGL ES framebuffer configurations */
|
||||||
|
#define SDL_VIDEO_GF_OPENGLES_CONFS 32
|
||||||
|
|
||||||
typedef struct SDL_WindowData
|
typedef struct SDL_WindowData
|
||||||
{
|
{
|
||||||
SDL_bool uses_gles; /* true if window support OpenGL ES */
|
SDL_bool uses_gles; /* true if window support OpenGL ES */
|
||||||
#if defined(SDL_VIDEO_OPENGL_ES)
|
#if defined(SDL_VIDEO_OPENGL_ES)
|
||||||
gf_3d_target_t target; /* OpenGL ES window target */
|
gf_3d_target_t target; /* OpenGL ES window target */
|
||||||
SDL_bool target_created; /* GF 3D target is created if true */
|
SDL_bool target_created; /* GF 3D target is created if true */
|
||||||
EGLConfig gles_config; /* OpenGL ES framebuffer configuration*/
|
EGLConfig gles_configs[SDL_VIDEO_GF_OPENGLES_CONFS];
|
||||||
|
/* OpenGL ES framebuffer confs */
|
||||||
|
EGLint gles_config; /* Config index in the array of cfgs */
|
||||||
EGLContext gles_context; /* OpenGL ES context */
|
EGLContext gles_context; /* OpenGL ES context */
|
||||||
EGLint gles_attributes[256]; /* OpenGL ES attributes for context */
|
EGLint gles_attributes[256]; /* OpenGL ES attributes for context */
|
||||||
EGLSurface gles_surface; /* OpenGL ES target rendering surface */
|
EGLSurface gles_surface; /* OpenGL ES target rendering surface */
|
||||||
|
@ -103,16 +112,16 @@ typedef struct GF_DeviceCaps
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
/* Display and window functions */
|
/* Display and window functions */
|
||||||
int qnxgf_videoinit(_THIS);
|
int qnxgf_videoinit(_THIS);
|
||||||
void qnxgf_videoquit(_THIS);
|
void qnxgf_videoquit(_THIS);
|
||||||
void qnxgf_getdisplaymodes(_THIS);
|
void qnxgf_getdisplaymodes(_THIS);
|
||||||
int qnxgf_setdisplaymode(_THIS, SDL_DisplayMode* mode);
|
int qnxgf_setdisplaymode(_THIS, SDL_DisplayMode* mode);
|
||||||
int qnxgf_setdisplaypalette(_THIS, SDL_Palette* palette);
|
int qnxgf_setdisplaypalette(_THIS, SDL_Palette* palette);
|
||||||
int qnxgf_getdisplaypalette(_THIS, SDL_Palette* palette);
|
int qnxgf_getdisplaypalette(_THIS, SDL_Palette* palette);
|
||||||
int qnxgf_setdisplaygammaramp(_THIS, Uint16* ramp);
|
int qnxgf_setdisplaygammaramp(_THIS, Uint16* ramp);
|
||||||
int qnxgf_getdisplaygammaramp(_THIS, Uint16* ramp);
|
int qnxgf_getdisplaygammaramp(_THIS, Uint16* ramp);
|
||||||
int qnxgf_createwindow(_THIS, SDL_Window* window);
|
int qnxgf_createwindow(_THIS, SDL_Window* window);
|
||||||
int qnxgf_createwindowfrom(_THIS, SDL_Window* window, const void* data);
|
int qnxgf_createwindowfrom(_THIS, SDL_Window* window, const void* data);
|
||||||
void qnxgf_setwindowtitle(_THIS, SDL_Window* window);
|
void qnxgf_setwindowtitle(_THIS, SDL_Window* window);
|
||||||
void qnxgf_setwindowicon(_THIS, SDL_Window* window, SDL_Surface* icon);
|
void qnxgf_setwindowicon(_THIS, SDL_Window* window, SDL_Surface* icon);
|
||||||
void qnxgf_setwindowposition(_THIS, SDL_Window* window);
|
void qnxgf_setwindowposition(_THIS, SDL_Window* window);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue