mirror of
https://github.com/nzp-team/fteqw.git
synced 2024-11-24 21:02:26 +00:00
Added x11 unicode input support. Added wayland support (FTE_TARGET=linux-wayland). Added properly support for rpi+egl (FTE_TARGET=linux-rpi, warning: expects to cross-compile).
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4622 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
4499164f27
commit
7e80062ab9
37 changed files with 1882 additions and 1163 deletions
|
@ -685,7 +685,7 @@ GLCL_DIR=glcl_$(FTE_FULLTARGET)
|
|||
SV_OBJS=$(COMMON_OBJS) $(SERVER_OBJS) $(PROGS_OBJS) $(SERVERONLY_OBJS)
|
||||
SV_EXE_NAME=../fteqw_sv$(FTE_FULLTARGET)
|
||||
SV_CFLAGS=$(SERVER_ONLY_CFLAGS)
|
||||
SV_LDFLAGS=-lz
|
||||
SV_LDFLAGS=
|
||||
|
||||
MINGL_DIR=mingl_$(FTE_FULLTARGET)
|
||||
MINGL_EXE_NAME=../fteqw_mingl$(FTE_FULLTARGET)
|
||||
|
@ -693,7 +693,7 @@ MINGL_EXE_NAME=../fteqw_mingl$(FTE_FULLTARGET)
|
|||
MB_DIR=m_$(FTE_FULLTARGET)
|
||||
M_EXE_NAME=../fteqw_$(FTE_FULLTARGET)
|
||||
MCL_OBJS=$(D3DGL_OBJS) $(GLQUAKE_OBJS) $(SOFTWARE_OBJS) gl_vidsdl.o snd_sdl.o cd_sdl.o sys_sdl.o in_sdl.o
|
||||
M_CFLAGS=$(GLCFLAGS) `$(SDLCONFIG) --cflags` -D_MERGED_SDL
|
||||
M_CFLAGS=$(GLCFLAGS) `$(SDLCONFIG) --cflags`
|
||||
M_LDFLAGS=$(GLLDFLAGS) $(IMAGELDFLAGS) $(OGGVORBISLDFLAGS)
|
||||
|
||||
ifdef windir
|
||||
|
@ -703,6 +703,13 @@ else
|
|||
M_LDFLAGS=$(MLDFLAGS) `$(SDLCONFIG) --libs` $(IMAGELDFLAGS) $(OGGVORBISLDFLAGS)
|
||||
endif
|
||||
|
||||
ifeq (,$(findstring NO_ZLIB,$(CFLAGS)))
|
||||
SV_LDFLAGS+=-lz
|
||||
GL_LDFLAGS+=-lz
|
||||
M_LDFLAGS+=-lz
|
||||
endif
|
||||
|
||||
|
||||
|
||||
#specific targets override those defaults as needed.
|
||||
#google native client
|
||||
|
@ -1007,11 +1014,10 @@ ifeq ($(FTE_TARGET),bsd)
|
|||
MINGL_EXE_NAME=../fteqw.mingl
|
||||
MINGL_DIR=mingl_bsd
|
||||
endif
|
||||
ifneq ($(shell echo $(FTE_TARGET)|grep linux),)
|
||||
|
||||
ifneq (,$(findstring linux,$(FTE_TARGET)))
|
||||
SV_DIR=sv_linux$(BITS)
|
||||
SV_LDFLAGS=-lz
|
||||
SV_EXE_NAME=../fteqw.sv$(BITS)
|
||||
SV_LDFLAGS=
|
||||
|
||||
NPFTE_OBJS=httpclient.o image.o sys_linux_threads.o sys_npfte.o sys_axfte.o sys_plugfte.o
|
||||
NPFTE_DLL_NAME=../npfte$(BITS).so
|
||||
|
@ -1022,25 +1028,49 @@ ifneq ($(shell echo $(FTE_TARGET)|grep linux),)
|
|||
GLCL_OBJS=$(GL_OBJS) $(D3DGL_OBJS) $(GLQUAKE_OBJS) $(BOTLIB_OBJS) $(SPEEX_OBJS) gl_vidlinuxglx.o gl_videgl.o snd_alsa.o snd_linux.o cd_linux.o sys_linux.o sys_linux_threads.o
|
||||
GL_EXE_NAME=../fteqw.gl$(BITS)
|
||||
GLCL_EXE_NAME=../fteqwcl.gl$(BITS)
|
||||
GL_LDFLAGS=$(GLLDFLAGS) $(XLDFLAGS) $(OGGVORBISLDFLAGS) -lz
|
||||
GL_LDFLAGS=$(GLLDFLAGS) $(XLDFLAGS) $(OGGVORBISLDFLAGS)
|
||||
GL_CFLAGS=$(GLCFLAGS) -I/usr/X11R6/include $(SPEEXCFLAGS) -DMULTITHREAD -DLIBVORBISFILE_STATIC -DDYNAMIC_LIBPNG -DDYNAMIC_LIBJPEG
|
||||
GLB_DIR=gl_linux$(BITS)
|
||||
GLCL_DIR=glcl_linux$(BITS)
|
||||
|
||||
MCL_OBJS=$(D3DGL_OBJS) $(GLQUAKE_OBJS) $(SOFTWARE_OBJS) $(BOTLIB_OBJS) $(SPEEX_OBJS) gl_vidlinuxglx.o snd_linux.o snd_alsa.o cd_linux.o sys_linux.o sys_linux_threads.o
|
||||
MCL_OBJS=$(D3DGL_OBJS) $(GLQUAKE_OBJS) $(SOFTWARE_OBJS) $(BOTLIB_OBJS) $(SPEEX_OBJS) gl_vidlinuxglx.o gl_videgl.o snd_linux.o snd_alsa.o cd_linux.o sys_linux.o sys_linux_threads.o
|
||||
M_EXE_NAME=../fteqw$(BITS)
|
||||
MCL_EXE_NAME=../fteqwcl$(BITS)
|
||||
M_LDFLAGS=$(GLLDFLAGS) $(XLDFLAGS) $(OGGVORBISLDFLAGS) -lz
|
||||
M_CFLAGS=$(GLCFLAGS) -I/usr/X11R6/include $(SPEEXCFLAGS) -DLIBVORBISFILE_STATIC -DDYNAMIC_LIBPNG -DDYNAMIC_LIBJPEG
|
||||
M_LDFLAGS=$(GL_LDFLAGS)
|
||||
M_CFLAGS=$(GL_CFLAGS)
|
||||
MB_DIR=m_linux$(BITS)
|
||||
MCL_DIR=mcl_linux$(BITS)
|
||||
|
||||
IMAGELDFLAGS=
|
||||
|
||||
ifeq (,$(findstring NO_ZLIB,$(CFLAGS)))
|
||||
SV_LDFLAGS+= -lz
|
||||
GL_LDFLAGS+= -lz
|
||||
M_LDFLAGS+= -lz
|
||||
endif
|
||||
|
||||
|
||||
MINGL_EXE_NAME=../fteqw.mingl$(BITS)
|
||||
MINGL_DIR=mingl_linux$(BITS)
|
||||
|
||||
endif
|
||||
ifneq (,$(findstring rpi,$(FTE_TARGET)))
|
||||
#These next two lines enable cross compiling. If you're compiling natively you can just kill the two.
|
||||
RPI_SYSROOT:=$(realpath $(shell echo ~)/rpi/rpi-sysroot/)
|
||||
CC=~/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc --sysroot=$(RPI_SYSROOT)
|
||||
SDLCONFIG=$(RPI_SYSROOT)/usr/bin/sdl-config --prefix=$(RPI_SYSROOT)/usr
|
||||
GL_CFLAGS+= -I$(RPI_SYSROOT)/opt/vc/include -I$(RPI_SYSROOT)/opt/vc/include/interface/vmcs_host/linux -I$(RPI_SYSROOT)/opt/vc/include/interface/vcos/pthreads -DFTE_RPI -DUSE_EGL
|
||||
GL_LDFLAGS+= -L$(RPI_SYSROOT)/opt/vc/lib -Wl,--sysroot=$(RPI_SYSROOT),-rpath=/opt/vc/lib,-rpath-link=$(RPI_SYSROOT)/opt/vc/lib -lbcm_host
|
||||
GLCL_OBJS+=gl_vidrpi.o
|
||||
endif
|
||||
ifneq (,$(findstring wayland,$(FTE_TARGET)))
|
||||
GL_CFLAGS+=-DUSE_EGL
|
||||
GLCL_OBJS+=gl_vidwayland.o
|
||||
GL_LDFLAGS+=-lwayland-client -lwayland-egl
|
||||
endif
|
||||
ifneq (,$(findstring fbdev,$(FTE_TARGET)))
|
||||
GL_CFLAGS+=-DUSE_EGL
|
||||
GLCL_OBJS+=gl_vidfbdev.o
|
||||
endif
|
||||
ifneq ($(shell echo $(FTE_TARGET)|grep macosx),)
|
||||
SV_DIR=sv_macosx$(EXTENSION)$(BITS)
|
||||
|
@ -1162,8 +1192,8 @@ ifeq ($(FTE_TARGET),web)
|
|||
JSLIBS=--js-library web/ftejslib.js -s DISABLE_GL_EMULATION=1
|
||||
EMCC_ARGS=$(JSLIBS) $(WEB_PREJS) --shell-file web/fteshell.html -s ERROR_ON_UNDEFINED_SYMBOLS=1
|
||||
RELEASE_CFLAGS=-DOMIT_QCC -DGL_STATIC -DFTE_TARGET_WEB
|
||||
DEBUG_CFLAGS=-g --jcache -DOMIT_QCC -DGL_STATIC -DFTE_TARGET_WEB
|
||||
RELEASE_LDFLAGS=-s ASM_JS=1 -O1 -s TOTAL_MEMORY=$(ASMJS_MEMORY) $(EMCC_ARGS)
|
||||
DEBUG_CFLAGS=-g -DOMIT_QCC -DGL_STATIC -DFTE_TARGET_WEB
|
||||
RELEASE_LDFLAGS=-s ASM_JS=1 -O2 -s TOTAL_MEMORY=$(ASMJS_MEMORY) $(EMCC_ARGS)
|
||||
# RELEASE_LDFLAGS=-s ASM_JS=0 -O1 -s TOTAL_MEMORY=$(WEB_MEMORY) $(EMCC_ARGS)
|
||||
DEBUG_LDLAGS=-O0 -s TOTAL_MEMORY=$(WEB_MEMORY) $(EMCC_ARGS)
|
||||
CC=emcc
|
||||
|
@ -1311,7 +1341,7 @@ PRECOMPHEADERS ?= $(OUT_DIR)/quakedef.h.gch
|
|||
#god knows how gcc loads the list properly.
|
||||
#or at least I hope he does. It makes no sence to mortals.
|
||||
|
||||
DO_LD ?= $(CC) -o $@ $(LTO_LD) $(WCFLAGS) $(CFLAGS)
|
||||
DO_LD ?= $(DO_ECHO) $(CC) -o $@ $(LTO_LD) $(WCFLAGS) $(CFLAGS)
|
||||
$(OUT_DIR)/$(EXE_NAME): $(PRECOMPHEADERS) $(foreach fn, $(CUSTOMOBJS) $(foreach ol, $(OBJS), $($(ol))),$(if $(findstring ltox,$(fn)),,$(OUT_DIR)/$(fn)))
|
||||
$(DO_LD) $(foreach fn, $(CUSTOMOBJS) $(foreach ol, $(OBJS) $(LTO_END), $($(ol))),$(if $(findstring ltox,$(fn)),$(subst ltox,-x ,$(fn)),$(NATIVE_OUT_DIR)/$(fn)) ) $(LDFLAGS)
|
||||
|
||||
|
|
|
@ -1383,7 +1383,7 @@ void SCR_SetLoadingFile(char *str)
|
|||
}
|
||||
}
|
||||
|
||||
void SCR_DrawLoading (void)
|
||||
void SCR_DrawLoading (qboolean opaque)
|
||||
{
|
||||
int sizex, x, y;
|
||||
mpic_t *pic;
|
||||
|
@ -1399,6 +1399,8 @@ void SCR_DrawLoading (void)
|
|||
R2D_ImageColours(1, 1, 1, 1);
|
||||
R2D_ScalePic (0, 0, vid.width, vid.height, pic);
|
||||
}
|
||||
else if (opaque)
|
||||
R2D_ConsoleBackground (0, vid.height, true);
|
||||
|
||||
qdepth = COM_FDepthFile("gfx/loading.lmp", true);
|
||||
h2depth = COM_FDepthFile("gfx/menu/loading.lmp", true);
|
||||
|
@ -1606,7 +1608,7 @@ void SCR_ImageName (char *mapname)
|
|||
scr_disabled_for_loading = false;
|
||||
scr_drawloading = true;
|
||||
GL_BeginRendering ();
|
||||
SCR_DrawLoading();
|
||||
SCR_DrawLoading(false);
|
||||
SCR_SetUpToDrawConsole();
|
||||
if (Key_Dest_Has(kdm_console) || !*levelshotname)
|
||||
SCR_DrawConsole(!!*levelshotname);
|
||||
|
@ -2163,7 +2165,7 @@ void SCR_DrawTwoDimensional(int uimenu, qboolean nohud)
|
|||
|
||||
if (scr_drawloading || loading_stage)
|
||||
{
|
||||
SCR_DrawLoading();
|
||||
SCR_DrawLoading(false);
|
||||
|
||||
SCR_ShowPics_Draw();
|
||||
}
|
||||
|
|
|
@ -910,7 +910,6 @@ void VARGS Con_DPrintf (const char *fmt, ...)
|
|||
{
|
||||
va_list argptr;
|
||||
char msg[MAXPRINTMSG];
|
||||
extern cvar_t log_developer;
|
||||
|
||||
#ifdef CRAZYDEBUGGING
|
||||
va_start (argptr,fmt);
|
||||
|
@ -919,6 +918,7 @@ void VARGS Con_DPrintf (const char *fmt, ...)
|
|||
Sys_Printf("%s", msg);
|
||||
return;
|
||||
#else
|
||||
extern cvar_t log_developer;
|
||||
if (!developer.value && !log_developer.value)
|
||||
return; // early exit
|
||||
#endif
|
||||
|
|
|
@ -309,9 +309,10 @@ typedef struct rendererinfo_s {
|
|||
|
||||
qboolean (*VID_Init) (rendererstate_t *info, unsigned char *palette);
|
||||
void (*VID_DeInit) (void);
|
||||
void (*VID_SwapBuffers) (void); //force a buffer swap, regardless of what's displayed.
|
||||
qboolean (*VID_ApplyGammaRamps) (unsigned short *ramps);
|
||||
char *(*VID_GetRGBInfo) (int prepad, int *truevidwidth, int *truevidheight);
|
||||
void (*VID_SetWindowCaption) (char *msg);
|
||||
char *(*VID_GetRGBInfo) (int prepad, int *truevidwidth, int *truevidheight);
|
||||
|
||||
void (*SCR_UpdateScreen) (void);
|
||||
|
||||
|
@ -349,6 +350,8 @@ typedef struct rendererinfo_s {
|
|||
|
||||
#define rf currentrendererstate.renderer
|
||||
|
||||
#define VID_SwapBuffers rf->VID_SwapBuffers
|
||||
|
||||
#define R_LoadTexture rf->IMG_LoadTexture
|
||||
#define R_LoadTexture8Pal24 rf->IMG_LoadTexture8Pal24
|
||||
#define R_LoadTexture8Pal32 rf->IMG_LoadTexture8Pal32
|
||||
|
|
|
@ -229,7 +229,7 @@ void R2D_Init(void)
|
|||
"blendfunc blend\n"
|
||||
"}\n"
|
||||
"}\n");
|
||||
shader_contrastup = R_RegisterShader("constrastupshader", SUF_NONE,
|
||||
shader_contrastup = R_RegisterShader("contrastupshader", SUF_NONE,
|
||||
"{\n"
|
||||
"program defaultfill\n"
|
||||
"{\n"
|
||||
|
@ -241,7 +241,7 @@ void R2D_Init(void)
|
|||
"}\n"
|
||||
"}\n"
|
||||
);
|
||||
shader_contrastdown = R_RegisterShader("constrastdownshader", SUF_NONE,
|
||||
shader_contrastdown = R_RegisterShader("contrastdownshader", SUF_NONE,
|
||||
"{\n"
|
||||
"program defaultfill\n"
|
||||
"{\n"
|
||||
|
@ -938,6 +938,7 @@ void R2D_BrightenScreen (void)
|
|||
if (r2d_canhwgamma)
|
||||
return;
|
||||
|
||||
TRACE(("R2D_BrightenScreen: brightening\n"));
|
||||
if (v_gamma.value != 1 && shader_gammacb->prog)
|
||||
{
|
||||
//this should really be done properly, with render-to-texture
|
||||
|
|
|
@ -795,11 +795,10 @@ rendererinfo_t dedicatedrendererinfo = {
|
|||
|
||||
NULL, //VID_Init,
|
||||
NULL, //VID_DeInit,
|
||||
NULL, //VID_SwapBuffers
|
||||
NULL, //VID_ApplyGammaRamps,
|
||||
NULL, //VID_GetRGBInfo,
|
||||
|
||||
|
||||
NULL, //set caption
|
||||
NULL, //VID_GetRGBInfo,
|
||||
|
||||
NULL, //SCR_UpdateScreen;
|
||||
|
||||
|
@ -832,6 +831,9 @@ rendererinfo_t *pdedicatedrendererinfo = &dedicatedrendererinfo;
|
|||
#ifdef GLQUAKE
|
||||
extern rendererinfo_t openglrendererinfo;
|
||||
rendererinfo_t eglrendererinfo;
|
||||
extern rendererinfo_t rpirendererinfo;
|
||||
rendererinfo_t waylandrendererinfo;
|
||||
rendererinfo_t fbdevrendererinfo;
|
||||
#endif
|
||||
#ifdef D3DQUAKE
|
||||
rendererinfo_t d3d9rendererinfo;
|
||||
|
@ -847,8 +849,13 @@ rendererinfo_t *rendererinfo[] =
|
|||
&dedicatedrendererinfo,
|
||||
#endif
|
||||
#ifdef GLQUAKE
|
||||
#ifdef FTE_RPI
|
||||
&rpirendererinfo,
|
||||
#endif
|
||||
&openglrendererinfo,
|
||||
&eglrendererinfo,
|
||||
&waylandrendererinfo,
|
||||
&fbdevrendererinfo,
|
||||
#endif
|
||||
#ifdef D3DQUAKE
|
||||
&d3d9rendererinfo,
|
||||
|
|
|
@ -55,7 +55,7 @@ void SCR_ImageName (char *mapname);
|
|||
void RSpeedShow(void);
|
||||
|
||||
void SCR_CrosshairPosition(playerview_t *pview, float *x, float *y);
|
||||
void SCR_DrawLoading (void);
|
||||
void SCR_DrawLoading (qboolean opaque);
|
||||
void SCR_TileClear (void);
|
||||
void SCR_DrawNotifyString (void);
|
||||
void SCR_CheckDrawCenterString (void);
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -201,6 +201,8 @@ void Sys_Printf (char *fmt, ...)
|
|||
putc(tab[w&31], stdout);
|
||||
}
|
||||
}
|
||||
else if (w < ' ' && w != '\t' && w != '\r' && w != '\n')
|
||||
putc('?', stdout); //don't let anyone print escape codes or other things that could crash an xterm.
|
||||
else
|
||||
{
|
||||
/*putwc doesn't like me. force it in utf8*/
|
||||
|
@ -731,7 +733,6 @@ int main (int c, const char **v)
|
|||
{
|
||||
double time, oldtime, newtime;
|
||||
quakeparms_t parms;
|
||||
int j;
|
||||
|
||||
// char cwd[1024];
|
||||
char bindir[1024];
|
||||
|
|
|
@ -547,7 +547,7 @@ void Validation_Apply_Ruleset(void)
|
|||
}
|
||||
if (!rs->rulesetname)
|
||||
{
|
||||
Con_Printf("Cannot apply ruleset %s - not recognised\n", rs->rulesetname);
|
||||
Con_Printf("Cannot apply ruleset %s - not recognised\n", ruleset.string);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -102,8 +102,9 @@ int GLVID_SetMode (rendererstate_t *info, unsigned char *palette);
|
|||
// sets the mode; only used by the Quake engine for resetting to mode 0 (the
|
||||
// base mode) on memory allocation failures
|
||||
|
||||
qboolean GLVID_Is8bit();
|
||||
qboolean GLVID_Is8bit(void);
|
||||
|
||||
void GLVID_SwapBuffers(void);
|
||||
char *GLVID_GetRGBInfo(int prepadbytes, int *truewidth, int *trueheight);
|
||||
void GLVID_SetCaption(char *caption);
|
||||
#endif
|
||||
|
|
|
@ -590,11 +590,11 @@ void COM_Locate_f (void)
|
|||
{
|
||||
if (!*loc.rawname)
|
||||
{
|
||||
Con_Printf("File is %i bytes compressed inside %s\n", loc.len, loc.search->logicalpath);
|
||||
Con_Printf("File is %u bytes compressed inside %s\n", (unsigned)loc.len, loc.search->logicalpath);
|
||||
}
|
||||
else
|
||||
{
|
||||
Con_Printf("Inside %s (%i bytes)\n %s\n", loc.rawname, loc.len, loc.search->logicalpath);
|
||||
Con_Printf("Inside %s (%u bytes)\n %s\n", loc.rawname, (unsigned)loc.len, loc.search->logicalpath);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
|
@ -300,7 +300,7 @@ static void QDECL FSSTDIO_ReadFile(searchpathfuncs_t *handle, flocation_t *loc,
|
|||
result = fread(buffer, 1, loc->len, f); // do soemthing with result
|
||||
|
||||
if (result != loc->len)
|
||||
Con_Printf("FSSTDIO_ReadFile() fread: Filename: %s, expected %i, result was %u (%s)\n",loc->rawname,loc->len,(unsigned int)result,strerror(errno));
|
||||
Con_Printf("FSSTDIO_ReadFile() fread: Filename: %s, expected %u, result was %u (%s)\n",loc->rawname,(unsigned int)loc->len,(unsigned int)result,strerror(errno));
|
||||
|
||||
fclose(f);
|
||||
}
|
||||
|
|
|
@ -27,43 +27,43 @@ typedef struct DSTRUCT* gnutls_anon_client_credentials;
|
|||
struct gnutls_session_int;
|
||||
typedef struct gnutls_session_int* gnutls_session_t;
|
||||
typedef void * gnutls_transport_ptr_t;
|
||||
struct gnutls_x509_crt_int;
|
||||
struct gnutls_x509_crt_int;
|
||||
typedef struct gnutls_x509_crt_int *gnutls_x509_crt_t;
|
||||
typedef struct
|
||||
{
|
||||
unsigned char *data;
|
||||
unsigned int size;
|
||||
typedef struct
|
||||
{
|
||||
unsigned char *data;
|
||||
unsigned int size;
|
||||
} gnutls_datum_t;
|
||||
|
||||
typedef enum gnutls_kx_algorithm { GNUTLS_KX_RSA=1, GNUTLS_KX_DHE_DSS,
|
||||
GNUTLS_KX_DHE_RSA, GNUTLS_KX_ANON_DH, GNUTLS_KX_SRP,
|
||||
GNUTLS_KX_RSA_EXPORT, GNUTLS_KX_SRP_RSA, GNUTLS_KX_SRP_DSS
|
||||
} gnutls_kx_algorithm;
|
||||
typedef enum {
|
||||
GNUTLS_CRT_UNKNOWN = 0,
|
||||
GNUTLS_CRT_X509 = 1,
|
||||
GNUTLS_CRT_OPENPGP = 2,
|
||||
GNUTLS_CRT_RAW = 3
|
||||
typedef enum {
|
||||
GNUTLS_CRT_UNKNOWN = 0,
|
||||
GNUTLS_CRT_X509 = 1,
|
||||
GNUTLS_CRT_OPENPGP = 2,
|
||||
GNUTLS_CRT_RAW = 3
|
||||
} gnutls_certificate_type_t;
|
||||
typedef enum {
|
||||
GNUTLS_X509_FMT_DER = 0,
|
||||
GNUTLS_X509_FMT_PEM = 1
|
||||
typedef enum {
|
||||
GNUTLS_X509_FMT_DER = 0,
|
||||
GNUTLS_X509_FMT_PEM = 1
|
||||
} gnutls_x509_crt_fmt_t;
|
||||
typedef enum
|
||||
{
|
||||
GNUTLS_CERT_INVALID = 1<<1,
|
||||
GNUTLS_CERT_REVOKED = 1<<5,
|
||||
GNUTLS_CERT_SIGNER_NOT_FOUND = 1<<6,
|
||||
GNUTLS_CERT_SIGNER_NOT_CA = 1<<7,
|
||||
GNUTLS_CERT_INSECURE_ALGORITHM = 1<<8,
|
||||
GNUTLS_CERT_NOT_ACTIVATED = 1<<9,
|
||||
GNUTLS_CERT_EXPIRED = 1<<10,
|
||||
GNUTLS_CERT_SIGNATURE_FAILURE = 1<<11,
|
||||
GNUTLS_CERT_REVOCATION_DATA_SUPERSEDED = 1<<12,
|
||||
GNUTLS_CERT_UNEXPECTED_OWNER = 1<<14,
|
||||
GNUTLS_CERT_REVOCATION_DATA_ISSUED_IN_FUTURE = 1<<15,
|
||||
GNUTLS_CERT_SIGNER_CONSTRAINTS_FAILURE = 1<<16,
|
||||
GNUTLS_CERT_MISMATCH = 1<<17,
|
||||
typedef enum
|
||||
{
|
||||
GNUTLS_CERT_INVALID = 1<<1,
|
||||
GNUTLS_CERT_REVOKED = 1<<5,
|
||||
GNUTLS_CERT_SIGNER_NOT_FOUND = 1<<6,
|
||||
GNUTLS_CERT_SIGNER_NOT_CA = 1<<7,
|
||||
GNUTLS_CERT_INSECURE_ALGORITHM = 1<<8,
|
||||
GNUTLS_CERT_NOT_ACTIVATED = 1<<9,
|
||||
GNUTLS_CERT_EXPIRED = 1<<10,
|
||||
GNUTLS_CERT_SIGNATURE_FAILURE = 1<<11,
|
||||
GNUTLS_CERT_REVOCATION_DATA_SUPERSEDED = 1<<12,
|
||||
GNUTLS_CERT_UNEXPECTED_OWNER = 1<<14,
|
||||
GNUTLS_CERT_REVOCATION_DATA_ISSUED_IN_FUTURE = 1<<15,
|
||||
GNUTLS_CERT_SIGNER_CONSTRAINTS_FAILURE = 1<<16,
|
||||
GNUTLS_CERT_MISMATCH = 1<<17,
|
||||
} gnutls_certificate_status_t;
|
||||
typedef enum gnutls_connection_end { GNUTLS_SERVER=1, GNUTLS_CLIENT } gnutls_connection_end;
|
||||
typedef enum gnutls_credentials_type { GNUTLS_CRD_CERTIFICATE=1, GNUTLS_CRD_ANON, GNUTLS_CRD_SRP } gnutls_credentials_type;
|
||||
|
@ -229,10 +229,10 @@ static int QDECL SSL_CheckCert(gnutls_session_t session)
|
|||
if (certstatus == 0)
|
||||
return 0;
|
||||
|
||||
type = gnutls_certificate_type_get (session);
|
||||
type = gnutls_certificate_type_get (session);
|
||||
if (gnutls_certificate_verification_status_print(certstatus, type, &out, 0) >= 0)
|
||||
{
|
||||
Con_Printf("%s: %s\n", file->certname, out.data);
|
||||
Con_Printf("%s: %s\n", file->certname, out.data);
|
||||
gnutls_free(out.data);
|
||||
|
||||
#else
|
||||
|
@ -358,15 +358,15 @@ static int QDECL SSL_Write(struct vfsfile_s *f, const void *buffer, int bytestow
|
|||
return -1; //closed by remote connection.
|
||||
return written;
|
||||
}
|
||||
static qboolean QDECL SSL_Seek (struct vfsfile_s *file, unsigned long pos)
|
||||
static qboolean QDECL SSL_Seek (struct vfsfile_s *file, qofs_t pos)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
static unsigned long QDECL SSL_Tell (struct vfsfile_s *file)
|
||||
static qofs_t QDECL SSL_Tell (struct vfsfile_s *file)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static unsigned long QDECL SSL_GetLen (struct vfsfile_s *file)
|
||||
static qofs_t QDECL SSL_GetLen (struct vfsfile_s *file)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
@ -463,8 +463,8 @@ vfsfile_t *FS_OpenSSL(const char *hostname, vfsfile_t *source, qboolean server)
|
|||
#ifdef GNUTLS_VERSION_3_0_0_PLUS
|
||||
gnutls_certificate_set_x509_system_trust (xcred);
|
||||
#else
|
||||
gnutls_certificate_set_x509_trust_file (xcred, CAFILE, GNUTLS_X509_FMT_PEM);
|
||||
#endif
|
||||
gnutls_certificate_set_x509_trust_file (xcred, CAFILE, GNUTLS_X509_FMT_PEM);
|
||||
#endif
|
||||
gnutls_certificate_set_verify_function (xcred, SSL_CheckCert);
|
||||
|
||||
needinit = false;
|
||||
|
|
|
@ -2657,7 +2657,6 @@ static void BE_SubmitMeshChain(void)
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
qglDrawRangeElements(batchtype, startv, endv, endi-starti, GL_INDEX_TYPE, (index_t*)shaderstate.sourcevbo->indicies.gl.addr + starti);
|
||||
RQuantAdd(RQUANT_DRAWS, 1);
|
||||
}
|
||||
|
@ -4864,7 +4863,6 @@ void GLBE_DrawWorld (qboolean drawworld, qbyte *vis)
|
|||
|
||||
if (!r_refdef.recurse)
|
||||
{
|
||||
GL_DoSwap();
|
||||
if (shaderstate.wbatch + 50 > shaderstate.maxwbatches)
|
||||
{
|
||||
int newm = shaderstate.wbatch + 100;
|
||||
|
|
|
@ -513,7 +513,7 @@ TRACE(("dbg: GLDraw_ReInit: Allocating upload buffers\n"));
|
|||
|
||||
TRACE(("dbg: GLDraw_ReInit: GL_EndRendering\n"));
|
||||
GL_EndRendering ();
|
||||
GL_DoSwap();
|
||||
VID_SwapBuffers();
|
||||
|
||||
GL_SetupSceneProcessingTextures();
|
||||
|
||||
|
|
|
@ -997,7 +997,6 @@ void GLR_DrawPortal(batch_t *batch, batch_t **blist, batch_t *depthmasklist[2],
|
|||
//transform the old surface plane into the new view matrix
|
||||
if (Matrix4_Invert(r_refdef.m_view, ivmat))
|
||||
{
|
||||
extern cvar_t temp1;
|
||||
Matrix4_Multiply(ivmat, vmat, trmat);
|
||||
plane.normal[0] = -(oplane.normal[0] * trmat[0] + oplane.normal[1] * trmat[1] + oplane.normal[2] * trmat[2]);
|
||||
plane.normal[1] = -(oplane.normal[0] * trmat[4] + oplane.normal[1] * trmat[5] + oplane.normal[2] * trmat[6]);
|
||||
|
@ -1465,8 +1464,6 @@ void GLR_RenderView (void)
|
|||
|
||||
checkglerror();
|
||||
|
||||
GL_DoSwap();
|
||||
|
||||
if (r_norefresh.value || !vid.pixelwidth || !vid.pixelheight)
|
||||
return;
|
||||
|
||||
|
|
|
@ -584,21 +584,18 @@ void GLR_TimeRefresh_f (void)
|
|||
if (frames < 1)
|
||||
frames = 128;
|
||||
|
||||
#if defined(_WIN32) && !defined(FTE_SDL)
|
||||
if (finish == 2)
|
||||
{
|
||||
extern HDC maindc;
|
||||
qglFinish ();
|
||||
start = Sys_DoubleTime ();
|
||||
for (i=0 ; i<frames ; i++)
|
||||
{
|
||||
r_refdef.viewangles[1] = i/(float)frames*360.0;
|
||||
R_RenderView ();
|
||||
qSwapBuffers(maindc);
|
||||
VID_SwapBuffers();
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
if (qglDrawBuffer)
|
||||
qglDrawBuffer (GL_FRONT);
|
||||
|
@ -621,7 +618,7 @@ void GLR_TimeRefresh_f (void)
|
|||
if (qglDrawBuffer)
|
||||
qglDrawBuffer (GL_BACK);
|
||||
GL_EndRendering ();
|
||||
GL_DoSwap();
|
||||
VID_SwapBuffers();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -85,10 +85,10 @@ void GLSCR_UpdateScreen (void)
|
|||
{
|
||||
GL_BeginRendering ();
|
||||
scr_drawloading = true;
|
||||
SCR_DrawLoading ();
|
||||
SCR_DrawLoading (true);
|
||||
scr_drawloading = false;
|
||||
GL_EndRendering ();
|
||||
GL_DoSwap();
|
||||
VID_SwapBuffers();
|
||||
RSpeedEnd(RSPEED_TOTALREFRESH);
|
||||
return;
|
||||
}
|
||||
|
@ -123,7 +123,7 @@ void GLSCR_UpdateScreen (void)
|
|||
if (key_dest_mask & kdm_console)
|
||||
Con_DrawConsole(vid.height/2, false);
|
||||
GL_EndRendering ();
|
||||
GL_DoSwap();
|
||||
VID_SwapBuffers();
|
||||
RSpeedEnd(RSPEED_TOTALREFRESH);
|
||||
return;
|
||||
}
|
||||
|
@ -137,8 +137,8 @@ void GLSCR_UpdateScreen (void)
|
|||
#endif
|
||||
R2D_BrightenScreen();
|
||||
GL_EndRendering ();
|
||||
GL_DoSwap();
|
||||
GL_Set2D (false);
|
||||
VID_SwapBuffers();
|
||||
RSpeedEnd(RSPEED_TOTALREFRESH);
|
||||
return;
|
||||
}
|
||||
|
@ -161,18 +161,17 @@ void GLSCR_UpdateScreen (void)
|
|||
nohud = true;
|
||||
else
|
||||
#endif
|
||||
{
|
||||
if (uimenu != 1)
|
||||
{
|
||||
if (r_worldentity.model && cls.state == ca_active)
|
||||
V_RenderView ();
|
||||
else
|
||||
{
|
||||
GL_DoSwap();
|
||||
noworld = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
GL_DoSwap();
|
||||
}
|
||||
|
||||
GL_Set2D (false);
|
||||
|
||||
|
@ -206,6 +205,7 @@ void GLSCR_UpdateScreen (void)
|
|||
|
||||
RSpeedRemark();
|
||||
GL_EndRendering ();
|
||||
VID_SwapBuffers();
|
||||
RSpeedEnd(RSPEED_FINISH);
|
||||
}
|
||||
|
||||
|
|
|
@ -222,15 +222,14 @@ FTEPFNGLACTIVESTENCILFACEEXTPROC qglActiveStencilFaceEXT;
|
|||
#define DEBUG
|
||||
#endif
|
||||
#if defined(DEBUG)
|
||||
#ifndef GL_ARB_debug_output
|
||||
typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,
|
||||
//always defining this, my system headers use void instead of GLvoid which results in gcc warnings.
|
||||
typedef void (APIENTRY *qGLDEBUGPROCARB)(GLenum source,
|
||||
GLenum type,
|
||||
GLuint id,
|
||||
GLenum severity,
|
||||
GLsizei length,
|
||||
const GLchar* message,
|
||||
GLvoid* userParam);
|
||||
#endif
|
||||
void (APIENTRY *qglDebugMessageControlARB)(GLenum source,
|
||||
GLenum type,
|
||||
GLenum severity,
|
||||
|
@ -243,7 +242,7 @@ void (APIENTRY *qglDebugMessageInsertARB)(GLenum source,
|
|||
GLenum severity,
|
||||
GLsizei length,
|
||||
const char* buf);
|
||||
void (APIENTRY *qglDebugMessageCallbackARB)(GLDEBUGPROCARB callback,
|
||||
void (APIENTRY *qglDebugMessageCallbackARB)(qGLDEBUGPROCARB callback,
|
||||
void* userParam);
|
||||
GLuint (APIENTRY *qglGetDebugMessageLogARB)(GLuint count,
|
||||
GLsizei bufsize,
|
||||
|
@ -254,6 +253,7 @@ GLuint (APIENTRY *qglGetDebugMessageLogARB)(GLuint count,
|
|||
GLsizei* lengths,
|
||||
char* messageLog);
|
||||
|
||||
#ifndef GL_ARB_debug_output
|
||||
#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242
|
||||
#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143
|
||||
#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144
|
||||
|
@ -276,6 +276,7 @@ GLuint (APIENTRY *qglGetDebugMessageLogARB)(GLuint count,
|
|||
#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146
|
||||
#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147
|
||||
#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148
|
||||
#endif
|
||||
|
||||
|
||||
void (APIENTRY myGLDEBUGPROCAMD)(GLenum source,
|
||||
|
@ -480,7 +481,9 @@ void GL_CheckExtensions (void *(*getglfunction) (char *name))
|
|||
#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001
|
||||
#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002
|
||||
#define GL_CONTEXT_FLAGS 0x821E
|
||||
#ifndef GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT
|
||||
#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001
|
||||
#endif
|
||||
qglGetIntegerv(GL_CONTEXT_PROFILE_MASK, &profile);
|
||||
|
||||
if (!profile)
|
||||
|
@ -627,6 +630,13 @@ void GL_CheckExtensions (void *(*getglfunction) (char *name))
|
|||
|
||||
#ifndef qglActiveTextureARB
|
||||
if (!qglActiveTextureARB || !qglClientActiveTextureARB || !qglMultiTexCoord2fARB)
|
||||
gl_mtexable = false;
|
||||
else if (gl_mtexarbable == 1)
|
||||
{
|
||||
Con_Printf("OpenGL Driver Bug detected: 1 texture is NOT multitexture\n");
|
||||
gl_mtexable = false;
|
||||
}
|
||||
if (!gl_mtexable)
|
||||
{
|
||||
qglActiveTextureARB = NULL;
|
||||
qglClientActiveTextureARB = NULL;
|
||||
|
@ -663,7 +673,7 @@ void GL_CheckExtensions (void *(*getglfunction) (char *name))
|
|||
|
||||
#ifndef GL_STATIC
|
||||
qglStencilOpSeparateATI = NULL;
|
||||
if ((gl_config.gles && gl_config.glversion >= 2) || gl_config.glversion >= 3) //theoretically that should be a 2 not 3.
|
||||
if ((gl_config.gles && gl_config.glversion >= 2) || (!gl_config.gles && gl_config.glversion >= 3)) //theoretically that should be a 2 not 3.
|
||||
qglStencilOpSeparateATI = (void *) getglext("glStencilOpSeparate");
|
||||
else if (GL_CheckExtension("GL_ATI_separate_stencil"))
|
||||
qglStencilOpSeparateATI = (void *) getglext("glStencilOpSeparateATI");
|
||||
|
@ -890,14 +900,16 @@ void GL_CheckExtensions (void *(*getglfunction) (char *name))
|
|||
qglGenVertexArrays = NULL;
|
||||
qglBindVertexArray = NULL;
|
||||
}
|
||||
else if (gl_config.glversion >= 3)
|
||||
else if (gl_config.glversion >= 3 && !gl_config.gles)
|
||||
{
|
||||
/*yay core!*/
|
||||
Con_Printf("Using vao (core)\n");
|
||||
qglGenVertexArrays = (void *)getglext("glGenVertexArrays");
|
||||
qglBindVertexArray = (void *)getglext("glBindVertexArray");
|
||||
}
|
||||
else if (GL_CheckExtension("GL_ARB_vertex_array_object"))
|
||||
{
|
||||
Con_Printf("Using vao (extension)\n");
|
||||
qglGenVertexArrays = (void *)getglext("glGenVertexArraysARB");
|
||||
qglBindVertexArray = (void *)getglext("glBindVertexArrayARB");
|
||||
}
|
||||
|
@ -1868,7 +1880,7 @@ void DumpGLState(void)
|
|||
GLint glint;
|
||||
GLint glint4[4];
|
||||
|
||||
if (qglGetVertexAttribiv)
|
||||
// if (qglGetVertexAttribiv)
|
||||
{
|
||||
qglGetIntegerv(GL_VERTEX_ARRAY_BINDING, &rval);
|
||||
Sys_Printf("VERTEX_ARRAY_BINDING: %i\n", rval);
|
||||
|
@ -1920,6 +1932,7 @@ void DumpGLState(void)
|
|||
Sys_Printf("GL_VERTEX_ARRAY: %s %i:%p\n", qglIsEnabled(GL_VERTEX_ARRAY)?"en":"dis", rval, ptr);
|
||||
}
|
||||
|
||||
if (qglGetVertexAttribiv)
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
int en, bo, as, st, ty, no;
|
||||
|
@ -2019,10 +2032,10 @@ rendererinfo_t openglrendererinfo = {
|
|||
|
||||
GLVID_Init,
|
||||
GLVID_DeInit,
|
||||
GLVID_SwapBuffers,
|
||||
GLVID_ApplyGammaRamps,
|
||||
GLVID_GetRGBInfo,
|
||||
|
||||
GLVID_SetCaption, //setcaption
|
||||
GLVID_GetRGBInfo,
|
||||
|
||||
|
||||
GLSCR_UpdateScreen,
|
||||
|
|
|
@ -36,10 +36,7 @@ void *GLES_GetSymbol(char *symname)
|
|||
}
|
||||
|
||||
#if 1
|
||||
void GL_BeginRendering(void)
|
||||
{
|
||||
}
|
||||
void GL_EndRendering (void)
|
||||
void GLVID_SwapBuffers(void)
|
||||
{
|
||||
}
|
||||
void GLVID_DeInit(void)
|
||||
|
@ -174,20 +171,12 @@ qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette)
|
|||
return true;
|
||||
}
|
||||
|
||||
void GL_BeginRendering(void)
|
||||
{
|
||||
}
|
||||
|
||||
void GL_EndRendering (void)
|
||||
void GLVID_SwapBuffers(void)
|
||||
{
|
||||
eglSwapBuffers(sys_display, sys_surface);
|
||||
}
|
||||
#endif
|
||||
|
||||
void GL_DoSwap(void)
|
||||
{
|
||||
}
|
||||
|
||||
qboolean GLVID_ApplyGammaRamps (unsigned short *ramps)
|
||||
{
|
||||
return false;
|
||||
|
|
|
@ -1,227 +1,235 @@
|
|||
#include "bothdefs.h"
|
||||
#if defined(GLQUAKE) && defined(USE_EGL)
|
||||
#include "gl_videgl.h"
|
||||
|
||||
EGLContext eglctx = EGL_NO_CONTEXT;
|
||||
EGLDisplay egldpy = EGL_NO_DISPLAY;
|
||||
EGLSurface eglsurf = EGL_NO_SURFACE;
|
||||
|
||||
static dllhandle_t egllibrary;
|
||||
static dllhandle_t eslibrary;
|
||||
|
||||
static EGLint (*qeglGetError)(void);
|
||||
|
||||
static EGLDisplay (*qeglGetDisplay)(EGLNativeDisplayType display_id);
|
||||
static EGLBoolean (*qeglInitialize)(EGLDisplay dpy, EGLint *major, EGLint *minor);
|
||||
static EGLBoolean (*qeglTerminate)(EGLDisplay dpy);
|
||||
|
||||
static EGLBoolean (*qeglGetConfigs)(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
|
||||
static EGLBoolean (*qeglChooseConfig)(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
|
||||
|
||||
static EGLSurface (*qeglCreateWindowSurface)(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list);
|
||||
static EGLBoolean (*qeglDestroySurface)(EGLDisplay dpy, EGLSurface surface);
|
||||
static EGLBoolean (*qeglQuerySurface)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);
|
||||
|
||||
static EGLBoolean (*qeglSwapBuffers)(EGLDisplay dpy, EGLSurface surface);
|
||||
static EGLBoolean (*qeglMakeCurrent)(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
|
||||
static EGLContext (*qeglCreateContext)(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list);
|
||||
static EGLBoolean (*qeglDestroyContext)(EGLDisplay dpy, EGLContext ctx);
|
||||
static void *(*qeglGetProcAddress) (char *name);
|
||||
|
||||
static dllfunction_t qeglfuncs[] =
|
||||
{
|
||||
{(void*)&qeglGetError, "eglGetError"},
|
||||
|
||||
{(void*)&qeglGetDisplay, "eglGetDisplay"},
|
||||
{(void*)&qeglInitialize, "eglInitialize"},
|
||||
{(void*)&qeglTerminate, "eglTerminate"},
|
||||
|
||||
{(void*)&qeglGetConfigs, "eglGetConfigs"},
|
||||
{(void*)&qeglChooseConfig, "eglChooseConfig"},
|
||||
|
||||
{(void*)&qeglCreateWindowSurface, "eglCreateWindowSurface"},
|
||||
{(void*)&qeglDestroySurface, "eglDestroySurface"},
|
||||
{(void*)&qeglQuerySurface, "eglQuerySurface"},
|
||||
|
||||
{(void*)&qeglSwapBuffers, "eglSwapBuffers"},
|
||||
{(void*)&qeglMakeCurrent, "eglMakeCurrent"},
|
||||
{(void*)&qeglCreateContext, "eglCreateContext"},
|
||||
{(void*)&qeglDestroyContext, "eglDestroyContext"},
|
||||
|
||||
{(void*)&qeglGetProcAddress, "eglGetProcAddress"},
|
||||
|
||||
{NULL}
|
||||
};
|
||||
|
||||
|
||||
void *EGL_Proc(char *f)
|
||||
{
|
||||
void *proc = NULL;
|
||||
|
||||
/*
|
||||
char fname[512];
|
||||
{
|
||||
sprintf(fname, "wrap_%s", f);
|
||||
f = fname;
|
||||
}
|
||||
*/
|
||||
|
||||
if (qeglGetProcAddress)
|
||||
proc = qeglGetProcAddress(f);
|
||||
if (!proc)
|
||||
proc = Sys_GetAddressForName(eslibrary, f);
|
||||
if (!proc)
|
||||
proc = Sys_GetAddressForName(egllibrary, f);
|
||||
|
||||
return proc;
|
||||
}
|
||||
|
||||
void EGL_UnloadLibrary(void)
|
||||
{
|
||||
if (egllibrary)
|
||||
Sys_CloseLibrary(egllibrary);
|
||||
if (egllibrary == eslibrary)
|
||||
eslibrary = NULL;
|
||||
if (eslibrary)
|
||||
Sys_CloseLibrary(eslibrary);
|
||||
eslibrary = egllibrary = NULL;
|
||||
}
|
||||
|
||||
qboolean EGL_LoadLibrary(char *driver)
|
||||
{
|
||||
/* apps seem to load glesv2 first for dependency issues */
|
||||
Sys_Printf("Attempting to dlopen libGLESv2... ");
|
||||
eslibrary = Sys_LoadLibrary("libGLESv2", NULL);
|
||||
if (!eslibrary)
|
||||
{
|
||||
Sys_Printf("failed\n");
|
||||
// return false;
|
||||
}
|
||||
else
|
||||
Sys_Printf("success\n");
|
||||
if (!eslibrary)
|
||||
{
|
||||
eslibrary = dlopen("libGL", RTLD_NOW|RTLD_GLOBAL);
|
||||
if (eslibrary) Sys_Printf("Loaded libGL\n");
|
||||
}
|
||||
if (!eslibrary)
|
||||
{
|
||||
eslibrary = dlopen("libGL.so.1.2", RTLD_NOW|RTLD_GLOBAL);
|
||||
if (eslibrary) Sys_Printf("Loaded libGL.so.1.2\n");
|
||||
}
|
||||
if (!eslibrary)
|
||||
{
|
||||
eslibrary = dlopen("libGL.so.1", RTLD_NOW|RTLD_GLOBAL);
|
||||
if (eslibrary) Sys_Printf("Loaded libGL.so.1\n");
|
||||
}
|
||||
if (!eslibrary)
|
||||
Sys_Printf("unable to load some libGL\n");
|
||||
|
||||
Sys_Printf("Attempting to dlopen libEGL... ");
|
||||
egllibrary = Sys_LoadLibrary("libEGL", qeglfuncs);
|
||||
if (!egllibrary)
|
||||
{
|
||||
Sys_Printf("failed\n");
|
||||
Con_Printf("libEGL library not loadable\n");
|
||||
/* TODO: some implementations combine EGL/GLESv2 into single library... */
|
||||
Sys_CloseLibrary(eslibrary);
|
||||
return false;
|
||||
}
|
||||
Sys_Printf("success\n");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void EGL_Shutdown(void)
|
||||
{
|
||||
if (eglctx == EGL_NO_CONTEXT)
|
||||
return;
|
||||
|
||||
qeglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||
qeglDestroyContext(egldpy, eglctx);
|
||||
|
||||
if (eglsurf != EGL_NO_SURFACE)
|
||||
qeglDestroySurface(egldpy, eglsurf);
|
||||
|
||||
qeglTerminate(egldpy);
|
||||
|
||||
eglctx = EGL_NO_CONTEXT;
|
||||
egldpy = EGL_NO_DISPLAY;
|
||||
eglsurf = EGL_NO_SURFACE;
|
||||
}
|
||||
|
||||
void EGL_BeginRendering (void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void EGL_EndRendering (void)
|
||||
{
|
||||
qeglSwapBuffers(egldpy, eglsurf);
|
||||
/* TODO: check result? */
|
||||
}
|
||||
|
||||
qboolean EGL_Init (rendererstate_t *info, unsigned char *palette, EGLNativeWindowType window, EGLNativeDisplayType dpy)
|
||||
{
|
||||
EGLint numconfig;
|
||||
EGLConfig cfg;
|
||||
EGLint major, minor;
|
||||
EGLint attrib[] =
|
||||
{
|
||||
EGL_BUFFER_SIZE, info->bpp,
|
||||
EGL_SAMPLES, info->multisample,
|
||||
EGL_STENCIL_SIZE, 8,
|
||||
EGL_ALPHA_MASK_SIZE, 8,
|
||||
EGL_DEPTH_SIZE, 16,
|
||||
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
|
||||
EGL_NONE
|
||||
};
|
||||
EGLint contextattr[] =
|
||||
{
|
||||
EGL_CONTEXT_CLIENT_VERSION, 2,
|
||||
EGL_NONE, EGL_NONE
|
||||
};
|
||||
|
||||
/* if (!EGL_LoadLibrary(""))
|
||||
{
|
||||
Con_Printf(CON_ERROR "EGL: unable to load library!\n");
|
||||
return false;
|
||||
}
|
||||
*/
|
||||
egldpy = qeglGetDisplay(dpy);
|
||||
if (egldpy == EGL_NO_DISPLAY)
|
||||
#include "bothdefs.h"
|
||||
#if defined(GLQUAKE) && defined(USE_EGL)
|
||||
#include "gl_videgl.h"
|
||||
|
||||
EGLContext eglctx = EGL_NO_CONTEXT;
|
||||
EGLDisplay egldpy = EGL_NO_DISPLAY;
|
||||
EGLSurface eglsurf = EGL_NO_SURFACE;
|
||||
|
||||
static dllhandle_t egllibrary;
|
||||
static dllhandle_t eslibrary;
|
||||
|
||||
static EGLint (*qeglGetError)(void);
|
||||
|
||||
static EGLDisplay (*qeglGetDisplay)(EGLNativeDisplayType display_id);
|
||||
static EGLBoolean (*qeglInitialize)(EGLDisplay dpy, EGLint *major, EGLint *minor);
|
||||
static EGLBoolean (*qeglTerminate)(EGLDisplay dpy);
|
||||
|
||||
static EGLBoolean (*qeglGetConfigs)(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
|
||||
static EGLBoolean (*qeglChooseConfig)(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
|
||||
|
||||
static EGLSurface (*qeglCreateWindowSurface)(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list);
|
||||
static EGLBoolean (*qeglDestroySurface)(EGLDisplay dpy, EGLSurface surface);
|
||||
static EGLBoolean (*qeglQuerySurface)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);
|
||||
|
||||
static EGLBoolean (*qeglSwapBuffers)(EGLDisplay dpy, EGLSurface surface);
|
||||
static EGLBoolean (*qeglMakeCurrent)(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
|
||||
static EGLContext (*qeglCreateContext)(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list);
|
||||
static EGLBoolean (*qeglDestroyContext)(EGLDisplay dpy, EGLContext ctx);
|
||||
static void *(*qeglGetProcAddress) (char *name);
|
||||
|
||||
static dllfunction_t qeglfuncs[] =
|
||||
{
|
||||
{(void*)&qeglGetError, "eglGetError"},
|
||||
|
||||
{(void*)&qeglGetDisplay, "eglGetDisplay"},
|
||||
{(void*)&qeglInitialize, "eglInitialize"},
|
||||
{(void*)&qeglTerminate, "eglTerminate"},
|
||||
|
||||
{(void*)&qeglGetConfigs, "eglGetConfigs"},
|
||||
{(void*)&qeglChooseConfig, "eglChooseConfig"},
|
||||
|
||||
{(void*)&qeglCreateWindowSurface, "eglCreateWindowSurface"},
|
||||
{(void*)&qeglDestroySurface, "eglDestroySurface"},
|
||||
{(void*)&qeglQuerySurface, "eglQuerySurface"},
|
||||
|
||||
{(void*)&qeglSwapBuffers, "eglSwapBuffers"},
|
||||
{(void*)&qeglMakeCurrent, "eglMakeCurrent"},
|
||||
{(void*)&qeglCreateContext, "eglCreateContext"},
|
||||
{(void*)&qeglDestroyContext, "eglDestroyContext"},
|
||||
|
||||
{(void*)&qeglGetProcAddress, "eglGetProcAddress"},
|
||||
|
||||
{NULL}
|
||||
};
|
||||
|
||||
|
||||
void *EGL_Proc(char *f)
|
||||
{
|
||||
void *proc = NULL;
|
||||
|
||||
/*
|
||||
char fname[512];
|
||||
{
|
||||
sprintf(fname, "wrap_%s", f);
|
||||
f = fname;
|
||||
}
|
||||
*/
|
||||
|
||||
if (qeglGetProcAddress)
|
||||
proc = qeglGetProcAddress(f);
|
||||
if (!proc)
|
||||
proc = Sys_GetAddressForName(eslibrary, f);
|
||||
if (!proc)
|
||||
proc = Sys_GetAddressForName(egllibrary, f);
|
||||
|
||||
return proc;
|
||||
}
|
||||
|
||||
void EGL_UnloadLibrary(void)
|
||||
{
|
||||
if (egllibrary)
|
||||
Sys_CloseLibrary(egllibrary);
|
||||
if (egllibrary == eslibrary)
|
||||
eslibrary = NULL;
|
||||
if (eslibrary)
|
||||
Sys_CloseLibrary(eslibrary);
|
||||
eslibrary = egllibrary = NULL;
|
||||
}
|
||||
|
||||
qboolean EGL_LoadLibrary(char *driver)
|
||||
{
|
||||
/* apps seem to load glesv2 first for dependency issues */
|
||||
Sys_Printf("Attempting to dlopen libGLESv2... ");
|
||||
eslibrary = Sys_LoadLibrary("libGLESv2", NULL);
|
||||
if (!eslibrary)
|
||||
{
|
||||
Sys_Printf("failed\n");
|
||||
// return false;
|
||||
}
|
||||
else
|
||||
Sys_Printf("success\n");
|
||||
if (!eslibrary)
|
||||
{
|
||||
eslibrary = dlopen("libGL", RTLD_NOW|RTLD_GLOBAL);
|
||||
if (eslibrary) Sys_Printf("Loaded libGL\n");
|
||||
}
|
||||
if (!eslibrary)
|
||||
{
|
||||
eslibrary = dlopen("libGL.so.1.2", RTLD_NOW|RTLD_GLOBAL);
|
||||
if (eslibrary) Sys_Printf("Loaded libGL.so.1.2\n");
|
||||
}
|
||||
if (!eslibrary)
|
||||
{
|
||||
eslibrary = dlopen("libGL.so.1", RTLD_NOW|RTLD_GLOBAL);
|
||||
if (eslibrary) Sys_Printf("Loaded libGL.so.1\n");
|
||||
}
|
||||
if (!eslibrary)
|
||||
Sys_Printf("unable to load some libGL\n");
|
||||
|
||||
Sys_Printf("Attempting to dlopen libEGL... ");
|
||||
egllibrary = Sys_LoadLibrary("libEGL", qeglfuncs);
|
||||
if (!egllibrary)
|
||||
{
|
||||
Sys_Printf("failed\n");
|
||||
Con_Printf("libEGL library not loadable\n");
|
||||
/* TODO: some implementations combine EGL/GLESv2 into single library... */
|
||||
Sys_CloseLibrary(eslibrary);
|
||||
return false;
|
||||
}
|
||||
Sys_Printf("success\n");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void EGL_Shutdown(void)
|
||||
{
|
||||
if (eglctx == EGL_NO_CONTEXT)
|
||||
return;
|
||||
|
||||
qeglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||
qeglDestroyContext(egldpy, eglctx);
|
||||
|
||||
if (eglsurf != EGL_NO_SURFACE)
|
||||
qeglDestroySurface(egldpy, eglsurf);
|
||||
|
||||
qeglTerminate(egldpy);
|
||||
|
||||
eglctx = EGL_NO_CONTEXT;
|
||||
egldpy = EGL_NO_DISPLAY;
|
||||
eglsurf = EGL_NO_SURFACE;
|
||||
}
|
||||
|
||||
void EGL_SwapBuffers (void)
|
||||
{
|
||||
TRACE(("EGL_SwapBuffers\n"));
|
||||
TRACE(("swapping buffers\n"));
|
||||
qeglSwapBuffers(egldpy, eglsurf);
|
||||
/* TODO: check result? */
|
||||
TRACE(("EGL_SwapBuffers done\n"));
|
||||
}
|
||||
|
||||
qboolean EGL_Init (rendererstate_t *info, unsigned char *palette, EGLNativeWindowType window, EGLNativeDisplayType dpy)
|
||||
{
|
||||
EGLint numconfig;
|
||||
EGLConfig cfg;
|
||||
EGLint major, minor;
|
||||
EGLint attrib[] =
|
||||
{
|
||||
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
|
||||
// EGL_BUFFER_SIZE, info->bpp,
|
||||
// EGL_SAMPLES, info->multisample,
|
||||
// EGL_STENCIL_SIZE, 8,
|
||||
EGL_ALPHA_MASK_SIZE, 0,
|
||||
EGL_DEPTH_SIZE, 16,
|
||||
EGL_RED_SIZE, 1,
|
||||
EGL_GREEN_SIZE, 1,
|
||||
EGL_BLUE_SIZE, 1,
|
||||
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
|
||||
EGL_NONE
|
||||
};
|
||||
EGLint contextattr[] =
|
||||
{
|
||||
EGL_CONTEXT_CLIENT_VERSION, 2,
|
||||
EGL_NONE, EGL_NONE
|
||||
};
|
||||
|
||||
/* if (!EGL_LoadLibrary(""))
|
||||
{
|
||||
Con_Printf(CON_ERROR "EGL: unable to load library!\n");
|
||||
return false;
|
||||
}
|
||||
*/
|
||||
egldpy = qeglGetDisplay(dpy);
|
||||
if (egldpy == EGL_NO_DISPLAY)
|
||||
egldpy = qeglGetDisplay(EGL_DEFAULT_DISPLAY);
|
||||
if (egldpy == EGL_NO_DISPLAY)
|
||||
{
|
||||
Con_Printf(CON_ERROR "EGL: can't get display!\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
//NOTE: mesa's egl really loves to crash on this call, and I define crash as 'anything that fails to return to caller', which fucks everything up.
|
||||
if (!qeglInitialize(egldpy, &major, &minor))
|
||||
{
|
||||
Con_Printf(CON_ERROR "EGL: can't initialize display!\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
if (!qeglGetConfigs(egldpy, NULL, 0, &numconfigs) || !numconfigs)
|
||||
{
|
||||
Con_Printf(CON_ERROR "EGL: can't get configs!\n");
|
||||
return false;
|
||||
}
|
||||
*/
|
||||
|
||||
if (!qeglChooseConfig(egldpy, attrib, &cfg, 1, &numconfig))
|
||||
{
|
||||
Con_Printf(CON_ERROR "EGL: can't choose config!\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
eglsurf = qeglCreateWindowSurface(egldpy, cfg, window, NULL);
|
||||
if (eglsurf == EGL_NO_SURFACE)
|
||||
{
|
||||
Con_Printf(CON_ERROR "EGL: no surface!\n");
|
||||
{
|
||||
Con_Printf(CON_ERROR "EGL: can't get display!\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
//NOTE: mesa's egl really loves to crash on this call, and I define crash as 'anything that fails to return to caller', which fucks everything up.
|
||||
if (!qeglInitialize(egldpy, &major, &minor))
|
||||
{
|
||||
Con_Printf(CON_ERROR "EGL: can't initialize display!\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
if (!qeglGetConfigs(egldpy, NULL, 0, &numconfigs) || !numconfigs)
|
||||
{
|
||||
Con_Printf(CON_ERROR "EGL: can't get configs!\n");
|
||||
return false;
|
||||
}
|
||||
*/
|
||||
|
||||
if (!qeglChooseConfig(egldpy, attrib, &cfg, 1, &numconfig))
|
||||
{
|
||||
Con_Printf(CON_ERROR "EGL: can't choose config!\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!numconfig)
|
||||
{
|
||||
Con_Printf(CON_ERROR "EGL: no configs!\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
eglsurf = qeglCreateWindowSurface(egldpy, cfg, window, NULL);
|
||||
if (eglsurf == EGL_NO_SURFACE)
|
||||
{
|
||||
Con_Printf(CON_ERROR "EGL: eglCreateWindowSurface failed: %x\n", qeglGetError());
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -237,8 +245,8 @@ qboolean EGL_Init (rendererstate_t *info, unsigned char *palette, EGLNativeWindo
|
|||
Con_Printf(CON_ERROR "EGL: can't make current!\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -10,8 +10,7 @@ void *EGL_Proc(char *f);
|
|||
void EGL_UnloadLibrary(void);
|
||||
qboolean EGL_LoadLibrary(char *driver);
|
||||
void EGL_Shutdown(void);
|
||||
void EGL_BeginRendering (void);
|
||||
void EGL_EndRendering (void);
|
||||
void EGL_SwapBuffers (void);
|
||||
qboolean EGL_Init (rendererstate_t *info, unsigned char *palette, EGLNativeWindowType window, EGLNativeDisplayType dpy);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -18,6 +18,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
|
||||
*/
|
||||
|
||||
/*
|
||||
Small note: anything concerning EGL in here is specific to egl-with-x11.
|
||||
if you want egl-with-framebuffer, look elsewhere.
|
||||
*/
|
||||
|
||||
/*
|
||||
X11 is a huge pile of shit. I don't mean just the old x11 protocol, but all the _current_ standards that don't even try to fix the issues too.
|
||||
|
||||
|
@ -52,12 +57,12 @@ none of these issues will be fixed by a compositing window manager, because ther
|
|||
#include "quakedef.h"
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xatom.h>
|
||||
#include "glquake.h"
|
||||
|
||||
#include <GL/glx.h>
|
||||
#ifdef USE_EGL
|
||||
#include "gl_videgl.h"
|
||||
#endif
|
||||
#include "glquake.h"
|
||||
|
||||
#include <X11/keysym.h>
|
||||
#include <X11/cursorfont.h>
|
||||
|
@ -69,6 +74,7 @@ static Window vid_decoywindow; //for legacy mode, this is a boring window that w
|
|||
static Window vid_root;
|
||||
static GLXContext ctx = NULL;
|
||||
static int scrnum;
|
||||
static long vid_x_eventmask;
|
||||
static enum
|
||||
{
|
||||
PSL_NONE,
|
||||
|
@ -92,6 +98,8 @@ extern long sys_parentwindow;
|
|||
|
||||
#define X_MASK (KEY_MASK | MOUSE_MASK | ResizeRequest | StructureNotifyMask | FocusChangeMask | VisibilityChangeMask)
|
||||
|
||||
struct _XrmHashBucketRec;
|
||||
|
||||
static struct
|
||||
{
|
||||
void *lib;
|
||||
|
@ -145,6 +153,22 @@ static struct
|
|||
int (*pXUngrabKeyboard)(Display *display, Time time);
|
||||
int (*pXUngrabPointer)(Display *display, Time time);
|
||||
int (*pXWarpPointer)(Display *display, Window src_w, Window dest_w, int src_x, int src_y, unsigned int src_width, unsigned int src_height, int dest_x, int dest_y);
|
||||
Status (*pXMatchVisualInfo)(Display *display, int screen, int depth, int class, XVisualInfo *vinfo_return);
|
||||
|
||||
char *(*pXSetLocaleModifiers)(char *modifier_list);
|
||||
Bool (*pXSupportsLocale)(void);
|
||||
XIM (*pXOpenIM)(Display *display, struct _XrmHashBucketRec *db, char *res_name, char *res_class);
|
||||
XIC (*pXCreateIC)(XIM im, ...);
|
||||
void (*pXSetICFocus)(XIC ic);
|
||||
char * (*pXGetICValues)(XIC ic, ...);
|
||||
Bool (*pXFilterEvent)(XEvent *event, Window w);
|
||||
int (*pXutf8LookupString)(XIC ic, XKeyPressedEvent *event, char *buffer_return, int bytes_buffer, KeySym *keysym_return, Status *status_return);
|
||||
int (*pXwcLookupString)(XIC ic, XKeyPressedEvent *event, wchar_t *buffer_return, int bytes_buffer, KeySym *keysym_return, Status *status_return);
|
||||
void (*pXDestroyIC)(XIC ic);
|
||||
Status (*pXCloseIM)(XIM im);
|
||||
qboolean dounicode;
|
||||
XIC unicodecontext;
|
||||
XIM inputmethod;
|
||||
} x11;
|
||||
static qboolean x11_initlib(void)
|
||||
{
|
||||
|
@ -198,6 +222,7 @@ static qboolean x11_initlib(void)
|
|||
{(void**)&x11.pXUngrabKeyboard, "XUngrabKeyboard"},
|
||||
{(void**)&x11.pXUngrabPointer, "XUngrabPointer"},
|
||||
{(void**)&x11.pXWarpPointer, "XWarpPointer"},
|
||||
{(void**)&x11.pXMatchVisualInfo, "XMatchVisualInfo"},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
|
@ -214,8 +239,22 @@ static qboolean x11_initlib(void)
|
|||
//these ones are extensions, and the reason we're doing this.
|
||||
if (x11.lib)
|
||||
{
|
||||
x11.pXGetEventData = Sys_GetAddressForName(x11.lib, "XGetEventData");
|
||||
x11.pXFreeEventData = Sys_GetAddressForName(x11.lib, "XFreeEventData");
|
||||
//raw input (yay mouse deltas)
|
||||
x11.pXGetEventData = Sys_GetAddressForName(x11.lib, "XGetEventData");
|
||||
x11.pXFreeEventData = Sys_GetAddressForName(x11.lib, "XFreeEventData");
|
||||
|
||||
//internationalisation
|
||||
x11.pXSetLocaleModifiers = Sys_GetAddressForName(x11.lib, "XSetLocaleModifiers");
|
||||
x11.pXSupportsLocale = Sys_GetAddressForName(x11.lib, "XSupportsLocale");
|
||||
x11.pXOpenIM = Sys_GetAddressForName(x11.lib, "XOpenIM");
|
||||
x11.pXCreateIC = Sys_GetAddressForName(x11.lib, "XCreateIC");
|
||||
x11.pXSetICFocus = Sys_GetAddressForName(x11.lib, "XSetICFocus");
|
||||
x11.pXGetICValues = Sys_GetAddressForName(x11.lib, "XGetICValues");
|
||||
x11.pXFilterEvent = Sys_GetAddressForName(x11.lib, "XFilterEvent");
|
||||
x11.pXutf8LookupString = Sys_GetAddressForName(x11.lib, "Xutf8LookupString");
|
||||
x11.pXwcLookupString = Sys_GetAddressForName(x11.lib, "XwcLookupString");
|
||||
x11.pXDestroyIC = Sys_GetAddressForName(x11.lib, "XDestroyIC");
|
||||
x11.pXCloseIM = Sys_GetAddressForName(x11.lib, "XCloseIM");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -299,7 +338,7 @@ static qboolean VMODE_Init(void)
|
|||
|
||||
if (!x11.pXQueryExtension(vid_dpy, "XFree86-VidModeExtension", &vm.opcode, &vm.event, &vm.error))
|
||||
{
|
||||
Con_Printf("DGA extension not available.\n");
|
||||
Con_Printf("VidModeExtension extension not available.\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -308,14 +347,14 @@ static qboolean VMODE_Init(void)
|
|||
|
||||
if (vm.lib)
|
||||
{
|
||||
if (vm.pXF86VidModeQueryVersion(vid_dpy, &vm.vmajor, &vm.vminor))
|
||||
Con_Printf("Using XF86-VidModeExtension Ver. %d.%d\n", vm.vmajor, vm.vminor);
|
||||
if (vm.pXF86VidModeQueryVersion(vid_dpy, &vm.vmajor, &vm.vminor))
|
||||
Con_Printf("Using XF86-VidModeExtension Ver. %d.%d\n", vm.vmajor, vm.vminor);
|
||||
else
|
||||
{
|
||||
Con_Printf("No XF86-VidModeExtension support\n");
|
||||
{
|
||||
Con_Printf("No XF86-VidModeExtension support\n");
|
||||
vm.vmajor = 0;
|
||||
vm.vminor = 0;
|
||||
}
|
||||
vm.vminor = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return vm.vmajor;
|
||||
|
@ -429,7 +468,12 @@ static qboolean XI2_Init(void)
|
|||
|
||||
if (!xi2.libxi)
|
||||
{
|
||||
xi2.libxi = Sys_LoadLibrary("libXi.so.6", xi2_functable);
|
||||
#ifdef __CYGWIN__
|
||||
if (!xi2.libxi)
|
||||
xi2.libxi = Sys_LoadLibrary("cygXi-6.dll", xi2_functable);
|
||||
#endif
|
||||
if (!xi2.libxi)
|
||||
xi2.libxi = Sys_LoadLibrary("libXi.so.6", xi2_functable);
|
||||
if (!xi2.libxi)
|
||||
xi2.libxi = Sys_LoadLibrary("libXi", xi2_functable);
|
||||
if (!xi2.libxi)
|
||||
|
@ -507,6 +551,10 @@ qboolean GLX_InitLibrary(char *driver)
|
|||
gllibrary = Sys_LoadLibrary(driver, funcs);
|
||||
else
|
||||
gllibrary = NULL;
|
||||
#ifdef __CYGWIN__
|
||||
if (!gllibrary)
|
||||
gllibrary = Sys_LoadLibrary("cygGL-1.dll", funcs);
|
||||
#endif
|
||||
if (!gllibrary) //I hate this.
|
||||
gllibrary = Sys_LoadLibrary("libGL.so.1", funcs);
|
||||
if (!gllibrary)
|
||||
|
@ -535,24 +583,116 @@ void *GLX_GetSymbol(char *name)
|
|||
return symb;
|
||||
}
|
||||
|
||||
static int XLateKey(XKeyEvent *ev, unsigned int *unicode)
|
||||
static void X_ShutdownUnicode(void)
|
||||
{
|
||||
if (x11.unicodecontext)
|
||||
x11.pXDestroyIC(x11.unicodecontext);
|
||||
if (x11.inputmethod)
|
||||
x11.pXCloseIM(x11.inputmethod);
|
||||
x11.dounicode = false;
|
||||
}
|
||||
#include <locale.h>
|
||||
static long X_InitUnicode(void)
|
||||
{
|
||||
long requiredevents = 0;
|
||||
//return 0;
|
||||
X_ShutdownUnicode();
|
||||
|
||||
if (x11.pXSetLocaleModifiers && x11.pXSupportsLocale && x11.pXOpenIM && x11.pXCreateIC && x11.pXSetICFocus && x11.pXGetICValues && x11.pXFilterEvent && (x11.pXutf8LookupString || x11.pXwcLookupString) && x11.pXDestroyIC && x11.pXCloseIM)
|
||||
{
|
||||
setlocale(LC_CTYPE, "");
|
||||
x11.pXSetLocaleModifiers("");
|
||||
if (x11.pXSupportsLocale())
|
||||
{
|
||||
x11.inputmethod = x11.pXOpenIM(vid_dpy, NULL, NULL, NULL);
|
||||
if (x11.inputmethod)
|
||||
{
|
||||
x11.unicodecontext = x11.pXCreateIC(x11.inputmethod,
|
||||
XNInputStyle, XIMPreeditNothing | XIMStatusNothing,
|
||||
XNClientWindow, vid_window,
|
||||
XNFocusWindow, vid_window,
|
||||
NULL);
|
||||
if (x11.unicodecontext)
|
||||
{
|
||||
x11.pXSetICFocus(x11.unicodecontext);
|
||||
x11.dounicode = true;
|
||||
|
||||
x11.pXGetICValues(x11.unicodecontext, XNFilterEvents, &requiredevents, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
// setlocale(LC_ALL, "C");
|
||||
}
|
||||
|
||||
Con_Printf("Unicode support: %s\n", x11.dounicode?"available":"unavailable");
|
||||
|
||||
return requiredevents;
|
||||
}
|
||||
|
||||
static void X_KeyEvent(XKeyEvent *ev, qboolean pressed)
|
||||
{
|
||||
int i;
|
||||
int key;
|
||||
char buf[64];
|
||||
KeySym keysym, shifted;
|
||||
|
||||
unsigned int unichar[64];
|
||||
int unichars = 0;
|
||||
key = 0;
|
||||
|
||||
keysym = x11.pXLookupKeysym(ev, 0);
|
||||
if (unicode)
|
||||
if (pressed)
|
||||
{
|
||||
if ((keysym & 0xff000000) == 0x01000000)
|
||||
*unicode = keysym & 0x00ffffff;
|
||||
if (x11.dounicode)
|
||||
{
|
||||
Status status = XLookupNone;
|
||||
if (x11.pXutf8LookupString)
|
||||
{
|
||||
char buf1[1] = {0};
|
||||
char *buf = buf1, *c;
|
||||
int count = x11.pXutf8LookupString(x11.unicodecontext, (XKeyPressedEvent*)ev, buf1, sizeof(buf1), NULL, &status);
|
||||
if (status == XBufferOverflow)
|
||||
{
|
||||
buf = alloca(count+1);
|
||||
count = x11.pXutf8LookupString(x11.unicodecontext, (XKeyPressedEvent*)ev, buf, count, NULL, &status);
|
||||
}
|
||||
for (c = buf; c < &buf[count]; )
|
||||
{
|
||||
int error;
|
||||
unsigned int uc = utf8_decode(&error, c, &c);
|
||||
if (uc)
|
||||
unichar[unichars++] = uc;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//is allowed some weird encodings...
|
||||
wchar_t buf1[4] = {0};
|
||||
wchar_t *buf = buf1;
|
||||
int count = x11.pXwcLookupString(x11.unicodecontext, (XKeyPressedEvent*)ev, buf, sizeof(buf1), &shifted, &status);
|
||||
if (status == XBufferOverflow)
|
||||
{
|
||||
buf = alloca(sizeof(wchar_t)*(count+1));
|
||||
printf("XBufferOverflow\n");
|
||||
count = x11.pXwcLookupString(x11.unicodecontext, (XKeyPressedEvent*)ev, buf, count, NULL, &status);
|
||||
}
|
||||
printf("Translated to \"%ls\" (%i %i)\n", buf, count, status);
|
||||
//if wchar_t is 16bit, then expect problems when we completely ignore surrogates. this is why we favour the utf8 route as it doesn't care whether wchar_t is defined as 16bit or 32bit.
|
||||
for (i = 0; i < count; i++)
|
||||
if (buf[i])
|
||||
unichar[unichars++] = buf[i];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
x11.pXLookupString(ev, buf, sizeof buf, &shifted, 0);
|
||||
*unicode = (unsigned char)buf[0];
|
||||
char buf[64];
|
||||
if ((keysym & 0xff000000) == 0x01000000)
|
||||
unichar[unichars++] = keysym & 0x00ffffff;
|
||||
else
|
||||
{
|
||||
int count = x11.pXLookupString(ev, buf, sizeof(buf), &shifted, 0);
|
||||
for (i = 0; i < count; i++)
|
||||
if (buf[i])
|
||||
unichar[unichars++] = (unsigned char)buf[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -676,7 +816,21 @@ static int XLateKey(XKeyEvent *ev, unsigned int *unicode)
|
|||
break;
|
||||
}
|
||||
|
||||
return key;
|
||||
if (unichars)
|
||||
{
|
||||
//we got some text, this is fun isn't it?
|
||||
//the key value itself is sent with the last text char. this avoids multiple presses, and dead keys were already sent.
|
||||
for (i = 0; i < unichars-1; i++)
|
||||
{
|
||||
IN_KeyEvent(0, pressed, 0, unichar[i]);
|
||||
}
|
||||
IN_KeyEvent(0, pressed, key, unichar[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
//no text available, just do the keypress
|
||||
IN_KeyEvent(0, pressed, key, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void install_grabs(void)
|
||||
|
@ -737,12 +891,18 @@ static void GetEvent(void)
|
|||
{
|
||||
XEvent event, rep;
|
||||
int b;
|
||||
unsigned int uc;
|
||||
qboolean x11violations = true;
|
||||
Window mw;
|
||||
|
||||
x11.pXNextEvent(vid_dpy, &event);
|
||||
|
||||
if (x11.dounicode)
|
||||
if (x11.pXFilterEvent(&event, vid_window))
|
||||
{
|
||||
Con_Printf("Event filtered\n");
|
||||
return;
|
||||
}
|
||||
|
||||
switch (event.type)
|
||||
{
|
||||
case GenericEvent:
|
||||
|
@ -833,12 +993,10 @@ static void GetEvent(void)
|
|||
// x11.pXMoveWindow(vid_dpy, vid_window, 0, 0);
|
||||
break;
|
||||
case KeyPress:
|
||||
b = XLateKey(&event.xkey, &uc);
|
||||
Key_Event(0, b, uc, true);
|
||||
X_KeyEvent(&event.xkey, true);
|
||||
break;
|
||||
case KeyRelease:
|
||||
b = XLateKey(&event.xkey, NULL);
|
||||
Key_Event(0, b, 0, false);
|
||||
X_KeyEvent(&event.xkey, false);
|
||||
break;
|
||||
|
||||
case MotionNotify:
|
||||
|
@ -857,10 +1015,10 @@ static void GetEvent(void)
|
|||
IN_MouseMove(0, false, event.xmotion.x - cx, event.xmotion.y - cy, 0, 0);
|
||||
|
||||
/* move the mouse to the window center again (disabling warp first so we don't see it*/
|
||||
x11.pXSelectInput(vid_dpy, vid_window, X_MASK & ~PointerMotionMask);
|
||||
x11.pXSelectInput(vid_dpy, vid_window, vid_x_eventmask & ~PointerMotionMask);
|
||||
x11.pXWarpPointer(vid_dpy, None, vid_window, 0, 0, 0, 0,
|
||||
cx, cy);
|
||||
x11.pXSelectInput(vid_dpy, vid_window, X_MASK);
|
||||
x11.pXSelectInput(vid_dpy, vid_window, vid_x_eventmask);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -1066,6 +1224,8 @@ void GLVID_Shutdown(void)
|
|||
if (vm.originalapplied)
|
||||
vm.pXF86VidModeSetGammaRamp(vid_dpy, scrnum, 256, vm.originalramps[0], vm.originalramps[1], vm.originalramps[2]);
|
||||
|
||||
X_ShutdownUnicode();
|
||||
|
||||
switch(currentpsl)
|
||||
{
|
||||
#ifdef USE_EGL
|
||||
|
@ -1178,35 +1338,14 @@ qboolean GLVID_ApplyGammaRamps(unsigned short *ramps)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
GL_BeginRendering
|
||||
|
||||
=================
|
||||
*/
|
||||
void GL_BeginRendering (void)
|
||||
void GLVID_SwapBuffers (void)
|
||||
{
|
||||
switch(currentpsl)
|
||||
{
|
||||
#ifdef USE_EGL
|
||||
default:
|
||||
case PSL_EGL:
|
||||
EGL_BeginRendering();
|
||||
break;
|
||||
#endif
|
||||
case PSL_GLX:
|
||||
case PSL_NONE:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void GL_EndRendering (void)
|
||||
{
|
||||
switch(currentpsl)
|
||||
{
|
||||
#ifdef USE_EGL
|
||||
case PSL_EGL:
|
||||
EGL_EndRendering();
|
||||
EGL_SwapBuffers();
|
||||
break;
|
||||
#endif
|
||||
case PSL_GLX:
|
||||
|
@ -1214,8 +1353,6 @@ void GL_EndRendering (void)
|
|||
//chances are, it's version is more suitable anyway. At least there's the chance that it might be.
|
||||
qglXSwapBuffers(vid_dpy, vid_window);
|
||||
break;
|
||||
case PSL_NONE:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1225,11 +1362,16 @@ void X_StoreIcon(Window wnd)
|
|||
int i;
|
||||
unsigned long data[64*64+2];
|
||||
unsigned int *indata = (unsigned int*)icon.pixel_data;
|
||||
unsigned int inwidth = icon.width;
|
||||
unsigned int inheight = icon.height;
|
||||
|
||||
//FIXME: support loading an icon from the filesystem.
|
||||
|
||||
Atom propname = x11.pXInternAtom(vid_dpy, "_NET_WM_ICON", false);
|
||||
Atom proptype = x11.pXInternAtom(vid_dpy, "CARDINAL", false);
|
||||
|
||||
data[0] = icon.width;
|
||||
data[1] = icon.height;
|
||||
data[0] = inwidth;
|
||||
data[1] = inheight;
|
||||
for (i = 0; i < data[0]*data[1]; i++)
|
||||
data[i+2] = indata[i];
|
||||
|
||||
|
@ -1352,7 +1494,7 @@ Window X_CreateWindow(qboolean override, XVisualInfo *visinfo, unsigned int widt
|
|||
attr.background_pixel = 0;
|
||||
attr.border_pixel = 0;
|
||||
attr.colormap = x11.pXCreateColormap(vid_dpy, vid_root, visinfo->visual, AllocNone);
|
||||
attr.event_mask = X_MASK;
|
||||
attr.event_mask = vid_x_eventmask = X_MASK;
|
||||
attr.backing_store = NotUseful;
|
||||
attr.save_under = False;
|
||||
mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask | CWBackingStore |CWSaveUnder;
|
||||
|
@ -1576,6 +1718,9 @@ qboolean X11VID_Init (rendererstate_t *info, unsigned char *palette, int psl)
|
|||
else
|
||||
vid_window = X_CreateWindow(false, visinfo, width, height, fullscreen);
|
||||
|
||||
vid_x_eventmask |= X_InitUnicode();
|
||||
x11.pXSelectInput(vid_dpy, vid_window, vid_x_eventmask);
|
||||
|
||||
CL_UpdateWindowTitle();
|
||||
/*make it visible*/
|
||||
|
||||
|
@ -1629,7 +1774,7 @@ qboolean X11VID_Init (rendererstate_t *info, unsigned char *palette, int psl)
|
|||
break;
|
||||
#ifdef USE_EGL
|
||||
case PSL_EGL:
|
||||
if (!EGL_Init(info, palette, vid_window, vid_dpy))
|
||||
if (!EGL_Init(info, palette, (EGLNativeWindowType)vid_window, (EGLNativeDisplayType)vid_dpy))
|
||||
{
|
||||
Con_Printf("Failed to create EGL context.\n");
|
||||
GLVID_Shutdown();
|
||||
|
@ -1662,17 +1807,17 @@ qboolean X11VID_Init (rendererstate_t *info, unsigned char *palette, int psl)
|
|||
if (!COM_CheckParm("-noxi2") && XI2_Init())
|
||||
{
|
||||
x11_input_method = XIM_XI2;
|
||||
Con_Printf("Using XInput2\n");
|
||||
Con_DPrintf("Using XInput2\n");
|
||||
}
|
||||
else if (!COM_CheckParm("-nodga") && !COM_CheckParm("-nomdga") && DGAM_Init())
|
||||
{
|
||||
x11_input_method = XIM_DGA;
|
||||
Con_Printf("Using DGA mouse\n");
|
||||
Con_DPrintf("Using DGA mouse\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
x11_input_method = XIM_ORIG;
|
||||
Con_Printf("Using X11 mouse\n");
|
||||
Con_DPrintf("Using X11 mouse\n");
|
||||
}
|
||||
|
||||
if (Cvar_Get("vidx_grabkeyboard", "0", 0, "Additional video options")->value)
|
||||
|
@ -1843,8 +1988,6 @@ void INS_Shutdown(void)
|
|||
{
|
||||
}
|
||||
|
||||
void GL_DoSwap(void) {}
|
||||
|
||||
void GLVID_SetCaption(char *text)
|
||||
{
|
||||
x11.pXStoreName(vid_dpy, vid_window, text);
|
||||
|
@ -1855,7 +1998,7 @@ void GLVID_SetCaption(char *text)
|
|||
#include "gl_draw.h"
|
||||
rendererinfo_t eglrendererinfo =
|
||||
{
|
||||
"EGL",
|
||||
"EGL(X11)",
|
||||
{
|
||||
"egl"
|
||||
},
|
||||
|
@ -1880,16 +2023,13 @@ rendererinfo_t eglrendererinfo =
|
|||
GLR_NewMap,
|
||||
GLR_PreNewMap,
|
||||
|
||||
Surf_AddStain,
|
||||
Surf_LessenStains,
|
||||
|
||||
EGLVID_Init,
|
||||
GLVID_DeInit,
|
||||
GLVID_SetPalette,
|
||||
GLVID_ShiftPalette,
|
||||
GLVID_GetRGBInfo,
|
||||
GLVID_SwapBuffers,
|
||||
GLVID_ApplyGammaRamps,
|
||||
|
||||
GLVID_SetCaption, //setcaption
|
||||
GLVID_GetRGBInfo,
|
||||
|
||||
|
||||
GLSCR_UpdateScreen,
|
||||
|
@ -1906,8 +2046,16 @@ rendererinfo_t eglrendererinfo =
|
|||
GLBE_UploadAllLightmaps,
|
||||
GLBE_SelectEntity,
|
||||
GLBE_SelectDLight,
|
||||
GLBE_Scissor,
|
||||
GLBE_LightCullModel,
|
||||
|
||||
GLBE_VBO_Begin,
|
||||
GLBE_VBO_Data,
|
||||
GLBE_VBO_Finish,
|
||||
GLBE_VBO_Destroy,
|
||||
|
||||
GLBE_RenderToTextureUpdate2d,
|
||||
|
||||
""
|
||||
};
|
||||
#endif
|
||||
|
|
|
@ -113,10 +113,6 @@ void GLVID_DeInit(void)
|
|||
killCocoa();
|
||||
}
|
||||
|
||||
void GL_DoSwap(void)
|
||||
{
|
||||
}
|
||||
|
||||
void GLVID_SetPalette (unsigned char *palette)
|
||||
{
|
||||
qbyte *pal;
|
||||
|
@ -179,11 +175,7 @@ void GLVID_SetCaption(char *text)
|
|||
{
|
||||
}
|
||||
|
||||
void GL_BeginRendering (void)
|
||||
{
|
||||
}
|
||||
|
||||
void GL_EndRendering(void)
|
||||
void GLVID_SwapBuffers(void)
|
||||
{
|
||||
flushCocoa();
|
||||
}
|
||||
|
|
|
@ -581,19 +581,11 @@ void GLVID_DeInit(void)
|
|||
}
|
||||
}
|
||||
|
||||
void GL_BeginRendering(void)
|
||||
{
|
||||
}
|
||||
|
||||
void GL_EndRendering (void)
|
||||
void GLVID_SwapBuffers (void)
|
||||
{
|
||||
glASwapBuffers();
|
||||
}
|
||||
|
||||
void GL_DoSwap(void)
|
||||
{
|
||||
}
|
||||
|
||||
void GLVID_SetPalette (unsigned char *palette)
|
||||
{
|
||||
qbyte *pal;
|
||||
|
|
|
@ -1274,25 +1274,6 @@ qboolean VID_AttachGL (rendererstate_t *info)
|
|||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
GL_BeginRendering
|
||||
|
||||
=================
|
||||
*/
|
||||
void GL_BeginRendering (void)
|
||||
{
|
||||
vid.pixelwidth = WindowRect.right - WindowRect.left;
|
||||
vid.pixelheight = WindowRect.bottom - WindowRect.top;
|
||||
|
||||
qglDisable(GL_SCISSOR_TEST);
|
||||
|
||||
// if (!wglMakeCurrent( maindc, baseRC ))
|
||||
// Sys_Error ("wglMakeCurrent failed");
|
||||
|
||||
// glViewport (*x, *y, *width, *height);
|
||||
}
|
||||
|
||||
void VID_Wait_Override_Callback(struct cvar_s *var, char *oldvalue)
|
||||
{
|
||||
if (qwglSwapIntervalEXT && *vid_vsync.string)
|
||||
|
@ -1371,13 +1352,8 @@ void VID_WndAlpha_Override_Callback(struct cvar_s *var, char *oldvalue)
|
|||
#endif
|
||||
}
|
||||
|
||||
qboolean screenflush;
|
||||
void GL_DoSwap (void)
|
||||
void GLVID_SwapBuffers (void)
|
||||
{
|
||||
if (!screenflush)
|
||||
return;
|
||||
screenflush = 0;
|
||||
|
||||
qSwapBuffers(maindc);
|
||||
|
||||
// handle the mouse state when windowed if that's changed
|
||||
|
@ -1385,13 +1361,6 @@ void GL_DoSwap (void)
|
|||
INS_UpdateGrabs(modestate != MS_WINDOWED, ActiveApp);
|
||||
}
|
||||
|
||||
void GL_EndRendering (void)
|
||||
{
|
||||
screenflush = true;
|
||||
if (!gl_lateswap.value)
|
||||
GL_DoSwap();
|
||||
}
|
||||
|
||||
void OblitterateOldGamma(void)
|
||||
{
|
||||
int i;
|
||||
|
|
|
@ -29,15 +29,7 @@ void GLD_EndDirectRect(int x, int y, int width, int height)
|
|||
{
|
||||
}
|
||||
|
||||
void GL_BeginRendering (void)
|
||||
{
|
||||
}
|
||||
|
||||
void GL_EndRendering (void)
|
||||
{
|
||||
}
|
||||
|
||||
void GL_DoSwap(void)
|
||||
void GLVID_SwapBuffers(void)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
146
engine/gl/gl_vidrpi.c
Normal file
146
engine/gl/gl_vidrpi.c
Normal file
|
@ -0,0 +1,146 @@
|
|||
#include "bothdefs.h"
|
||||
#if defined(GLQUAKE) && defined(USE_EGL)
|
||||
#include "gl_videgl.h"
|
||||
|
||||
#include <bcm_host.h>
|
||||
#include "glquake.h"
|
||||
#include "shader.h"
|
||||
qboolean RPI_Init (rendererstate_t *info, unsigned char *palette)
|
||||
{
|
||||
static EGL_DISPMANX_WINDOW_T nativewindow;
|
||||
|
||||
DISPMANX_ELEMENT_HANDLE_T dispman_element;
|
||||
DISPMANX_DISPLAY_HANDLE_T dispman_display;
|
||||
DISPMANX_UPDATE_HANDLE_T dispman_update;
|
||||
VC_RECT_T dst_rect;
|
||||
VC_RECT_T src_rect;
|
||||
int rw, rh;
|
||||
|
||||
if (!EGL_LoadLibrary(info->subrenderer))
|
||||
{
|
||||
Con_Printf("couldn't load EGL library\n");
|
||||
return false;
|
||||
}
|
||||
bcm_host_init();
|
||||
|
||||
graphics_get_display_size(0 /* LCD */, &rw, &rh);
|
||||
Con_Printf("Screen size is actually %i*%i\n", rw, rh);
|
||||
|
||||
if (info->width < 64 || info->height < 64)
|
||||
{
|
||||
info->width = rw;
|
||||
info->height = rh;
|
||||
}
|
||||
dispman_display = vc_dispmanx_display_open(0 /* LCD */);
|
||||
dispman_update = vc_dispmanx_update_start(0);
|
||||
|
||||
|
||||
dst_rect.x = 0;
|
||||
dst_rect.y = 0;
|
||||
dst_rect.width = info->width;
|
||||
dst_rect.height = info->height;
|
||||
|
||||
src_rect.x = 0;
|
||||
src_rect.y = 0;
|
||||
src_rect.width = info->width << 16;
|
||||
src_rect.height = info->height << 16;
|
||||
|
||||
vid.pixelwidth = info->width;
|
||||
vid.pixelheight = info->height;
|
||||
|
||||
dispman_element = vc_dispmanx_element_add(dispman_update, dispman_display, 0/*layer*/, &dst_rect, 0/*src*/, &src_rect, DISPMANX_PROTECTION_NONE, 0 /*alpha*/, 0/*clamp*/, 0/*transform*/);
|
||||
|
||||
nativewindow.element = dispman_element;
|
||||
nativewindow.width = info->width;
|
||||
nativewindow.height = info->height;
|
||||
vc_dispmanx_update_submit_sync(dispman_update);
|
||||
|
||||
|
||||
if (!EGL_Init(info, palette, &nativewindow, EGL_DEFAULT_DISPLAY))
|
||||
{
|
||||
Con_Printf("couldn't initialise EGL context\n");
|
||||
return false;
|
||||
}
|
||||
GL_Init(&EGL_Proc);
|
||||
return true;
|
||||
}
|
||||
void RPI_DeInit(void)
|
||||
{
|
||||
EGL_Shutdown();
|
||||
}
|
||||
qboolean RPI_ApplyGammaRamps(unsigned short *ramps)
|
||||
{
|
||||
//not supported
|
||||
return false;
|
||||
}
|
||||
void RPI_SetCaption(char *text)
|
||||
{
|
||||
}
|
||||
|
||||
#include "gl_draw.h"
|
||||
rendererinfo_t rpirendererinfo =
|
||||
{
|
||||
"EGL(VideoCore)",
|
||||
{
|
||||
"rpi",
|
||||
"videocore",
|
||||
"rpiegl"
|
||||
},
|
||||
QR_OPENGL,
|
||||
|
||||
GLDraw_Init,
|
||||
GLDraw_DeInit,
|
||||
|
||||
GL_LoadTextureFmt,
|
||||
GL_LoadTexture8Pal24,
|
||||
GL_LoadTexture8Pal32,
|
||||
GL_LoadCompressed,
|
||||
GL_FindTexture,
|
||||
GL_AllocNewTexture,
|
||||
GL_UploadFmt,
|
||||
GL_DestroyTexture,
|
||||
|
||||
GLR_Init,
|
||||
GLR_DeInit,
|
||||
GLR_RenderView,
|
||||
|
||||
GLR_NewMap,
|
||||
GLR_PreNewMap,
|
||||
|
||||
RPI_Init,
|
||||
RPI_DeInit,
|
||||
RPI_ApplyGammaRamps,
|
||||
GLVID_GetRGBInfo,
|
||||
|
||||
RPI_SetCaption, //setcaption
|
||||
|
||||
|
||||
GLSCR_UpdateScreen,
|
||||
|
||||
GLBE_SelectMode,
|
||||
GLBE_DrawMesh_List,
|
||||
GLBE_DrawMesh_Single,
|
||||
GLBE_SubmitBatch,
|
||||
GLBE_GetTempBatch,
|
||||
GLBE_DrawWorld,
|
||||
GLBE_Init,
|
||||
GLBE_GenBrushModelVBO,
|
||||
GLBE_ClearVBO,
|
||||
GLBE_UploadAllLightmaps,
|
||||
GLBE_SelectEntity,
|
||||
GLBE_SelectDLight,
|
||||
GLBE_Scissor,
|
||||
GLBE_LightCullModel,
|
||||
|
||||
GLBE_VBO_Begin,
|
||||
GLBE_VBO_Data,
|
||||
GLBE_VBO_Finish,
|
||||
GLBE_VBO_Destroy,
|
||||
|
||||
GLBE_RenderToTextureUpdate2d,
|
||||
|
||||
""
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -230,21 +230,8 @@ void GLVID_DeInit (void)
|
|||
}
|
||||
|
||||
|
||||
void GL_BeginRendering (void)
|
||||
void GLVID_SwapBuffers (void)
|
||||
{
|
||||
// if (!wglMakeCurrent( maindc, baseRC ))
|
||||
// Sys_Error ("wglMakeCurrent failed");
|
||||
|
||||
// qglViewport (*x, *y, *width, *height);
|
||||
}
|
||||
|
||||
qboolean screenflush;
|
||||
void GL_DoSwap (void)
|
||||
{
|
||||
if (!screenflush)
|
||||
return;
|
||||
screenflush = 0;
|
||||
|
||||
#if SDL_MAJOR_VERSION >= 2
|
||||
if (vid_vsync.modified)
|
||||
{
|
||||
|
@ -279,13 +266,6 @@ void GL_DoSwap (void)
|
|||
}
|
||||
}
|
||||
|
||||
void GL_EndRendering (void)
|
||||
{
|
||||
screenflush = true;
|
||||
if (!gl_lateswap.value)
|
||||
GL_DoSwap();
|
||||
}
|
||||
|
||||
qboolean GLVID_ApplyGammaRamps (unsigned short *ramps)
|
||||
{
|
||||
#if SDL_MAJOR_VERSION >= 2
|
||||
|
|
473
engine/gl/gl_vidwayland.c
Normal file
473
engine/gl/gl_vidwayland.c
Normal file
|
@ -0,0 +1,473 @@
|
|||
#include "bothdefs.h"
|
||||
#if defined(GLQUAKE) && defined(USE_EGL)
|
||||
#include <wayland-client.h>
|
||||
#include <wayland-egl.h>
|
||||
#include <linux/input.h> //this is shite.
|
||||
#include "gl_videgl.h"
|
||||
|
||||
#if WAYLAND_VERSION_MAJOR < 1
|
||||
#error "wayland headers are too old"
|
||||
#endif
|
||||
|
||||
#include "glquake.h"
|
||||
#include "shader.h"
|
||||
|
||||
static struct wdisplay_s
|
||||
{
|
||||
//display stuff
|
||||
struct wl_display *display;
|
||||
struct wl_registry *registry;
|
||||
struct wl_compositor *compositor;
|
||||
struct wl_shell *shell;
|
||||
|
||||
//seat stuff
|
||||
void *pointer;
|
||||
void *keyboard;
|
||||
void *seat;
|
||||
|
||||
//window stuff
|
||||
struct wl_egl_window *enwindow;
|
||||
struct wl_surface *surface;
|
||||
struct wl_shell_surface *ssurface;
|
||||
} w;
|
||||
static void WL_shell_handle_ping(void *data, struct wl_shell_surface *shell_surface, uint32_t serial)
|
||||
{
|
||||
wl_shell_surface_pong(shell_surface, serial);
|
||||
}
|
||||
static void WL_shell_handle_configure(void *data, struct wl_shell_surface *shell_surface, uint32_t edges, int32_t width, int32_t height)
|
||||
{
|
||||
if (w.enwindow)
|
||||
wl_egl_window_resize(w.enwindow, width, height, 0, 0);
|
||||
|
||||
vid.pixelwidth = width;
|
||||
vid.pixelheight = height;
|
||||
}
|
||||
static void WL_shell_handle_popup_done(void *data, struct wl_shell_surface *shell_surface)
|
||||
{
|
||||
}
|
||||
|
||||
static const struct wl_shell_surface_listener shell_surface_listener =
|
||||
{
|
||||
WL_shell_handle_ping,
|
||||
WL_shell_handle_configure,
|
||||
WL_shell_handle_popup_done
|
||||
};
|
||||
|
||||
//qkeys are ascii-compatible for the most part.
|
||||
qbyte waylandinputsucksbighairydonkeyballs[] =
|
||||
{
|
||||
0, K_ESCAPE,'1','2','3','4','5','6', //0x
|
||||
'7','8','9','0','-','=',K_BACKSPACE,K_TAB,
|
||||
'q','w','e','r','t','y','u','i', //1x
|
||||
'o','p','[',']',K_ENTER,K_LCTRL,'a', 's',
|
||||
'd','f','g','h','j','k','l',';', //2x
|
||||
'\'','`',K_LSHIFT,'#','z','x','c','v',
|
||||
'b','n','m',',','.','/',K_RSHIFT,K_KP_STAR, //3x
|
||||
K_LALT,' ',K_CAPSLOCK,K_F1,K_F2,K_F3,K_F4,K_F5,
|
||||
K_F6,K_F7,K_F8,K_F9,K_F10,K_KP_NUMLOCK,K_SCRLCK,K_KP_HOME,//4x
|
||||
K_KP_UPARROW,K_KP_PGUP,K_KP_MINUS,K_KP_LEFTARROW,K_KP_5,K_KP_RIGHTARROW,K_KP_PLUS,K_KP_END,
|
||||
K_KP_DOWNARROW,K_KP_PGDN,K_KP_INS,K_KP_DEL,0,0,'\\',K_F11, //5x
|
||||
K_F12,0,0,0,0,0,0,0,
|
||||
K_KP_ENTER,0,K_KP_SLASH,0,K_RALT,0,K_HOME,K_UPARROW, //6x
|
||||
K_PGUP,K_LEFTARROW,K_RIGHTARROW,K_END,K_DOWNARROW,K_PGDN,K_INS,K_DEL,
|
||||
0,0,0,0,0,0,0,K_PAUSE, //7x
|
||||
0,0,0,0,0,K_LWIN,K_RWIN,K_APP
|
||||
};
|
||||
qbyte waylandinputsucksbighairydonkeyballsshift[] =
|
||||
{
|
||||
0, K_ESCAPE,'!','\"','3','$','%','^', //0x
|
||||
'&','*','(',')','_','+',K_BACKSPACE,K_TAB,
|
||||
'Q','W','E','R','T','Y','U','I', //1x
|
||||
'O','P','{','}',K_ENTER,K_LCTRL,'A', 'S',
|
||||
'D','F','G','H','J','K','L',':', //2x
|
||||
'@','`',K_LSHIFT,'~','Z','X','C','V',
|
||||
'B','N','M','<','>','?',K_RSHIFT,K_KP_STAR, //3x
|
||||
K_LALT,' ',K_CAPSLOCK,K_F1,K_F2,K_F3,K_F4,K_F5,
|
||||
K_F6,K_F7,K_F8,K_F9,K_F10,K_KP_NUMLOCK,K_SCRLCK,K_KP_HOME,//4x
|
||||
K_KP_UPARROW,K_KP_PGUP,K_KP_MINUS,K_KP_LEFTARROW,K_KP_5,K_KP_RIGHTARROW,K_KP_PLUS,K_KP_END,
|
||||
K_KP_DOWNARROW,K_KP_PGDN,K_KP_INS,K_KP_DEL,0,0,'|',K_F11, //5x
|
||||
K_F12,0,0,0,0,0,0,0,
|
||||
K_KP_ENTER,0,K_KP_SLASH,0,K_RALT,0,K_HOME,K_UPARROW, //6x
|
||||
K_PGUP,K_LEFTARROW,K_RIGHTARROW,K_END,K_DOWNARROW,K_PGDN,K_INS,K_DEL,
|
||||
0,0,0,0,0,0,0,K_PAUSE, //7x
|
||||
0,0,0,0,0,K_LWIN,K_RWIN,K_APP
|
||||
};
|
||||
static void WL_pointer_handle_enter(void *data, struct wl_pointer *pointer, uint32_t serial, struct wl_surface *surface, wl_fixed_t sx, wl_fixed_t sy)
|
||||
{
|
||||
/*
|
||||
struct display *display = data;
|
||||
struct wl_buffer *buffer;
|
||||
struct wl_cursor *cursor = display->default_cursor;
|
||||
struct wl_cursor_image *image;
|
||||
|
||||
if (display->window->fullscreen)
|
||||
wl_pointer_set_cursor(pointer, serial, NULL, 0, 0);
|
||||
else if (cursor) {
|
||||
image = display->default_cursor->images[0];
|
||||
buffer = wl_cursor_image_get_buffer(image);
|
||||
wl_pointer_set_cursor(pointer, serial,
|
||||
display->cursor_surface,
|
||||
image->hotspot_x,
|
||||
image->hotspot_y);
|
||||
wl_surface_attach(display->cursor_surface, buffer, 0, 0);
|
||||
wl_surface_damage(display->cursor_surface, 0, 0,
|
||||
image->width, image->height);
|
||||
wl_surface_commit(display->cursor_surface);
|
||||
}
|
||||
*/
|
||||
}
|
||||
static void WL_pointer_handle_leave(void *data, struct wl_pointer *pointer, uint32_t serial, struct wl_surface *surface)
|
||||
{
|
||||
}
|
||||
|
||||
static void WL_pointer_handle_motion(void *data, struct wl_pointer *pointer, uint32_t time, wl_fixed_t sx, wl_fixed_t sy)
|
||||
{
|
||||
//wayland is shite shite shite.
|
||||
//1.4 still has no relative mouse motion.
|
||||
IN_MouseMove(0, true, wl_fixed_to_double(sx), wl_fixed_to_double(sy), 0, 0);
|
||||
}
|
||||
|
||||
static void WL_pointer_handle_button(void *data, struct wl_pointer *wl_pointer, uint32_t serial, uint32_t time, uint32_t button, uint32_t state)
|
||||
{
|
||||
struct wdisplay *display = data;
|
||||
int qkey;
|
||||
|
||||
switch(button)
|
||||
{
|
||||
default:
|
||||
return; //blurgh.
|
||||
case BTN_LEFT:
|
||||
qkey = K_MOUSE1;
|
||||
break;
|
||||
case BTN_RIGHT:
|
||||
qkey = K_MOUSE2;
|
||||
break;
|
||||
case BTN_MIDDLE:
|
||||
qkey = K_MOUSE3;
|
||||
break;
|
||||
case BTN_SIDE:
|
||||
qkey = K_MOUSE4;
|
||||
break;
|
||||
case BTN_EXTRA:
|
||||
qkey = K_MOUSE5;
|
||||
break;
|
||||
case BTN_FORWARD:
|
||||
qkey = K_MOUSE6;
|
||||
break;
|
||||
case BTN_BACK:
|
||||
qkey = K_MOUSE7;
|
||||
break;
|
||||
case BTN_TASK:
|
||||
qkey = K_MOUSE8;
|
||||
break;
|
||||
}
|
||||
IN_KeyEvent(0, !!state, qkey, 0);
|
||||
// wl_shell_surface_move(display->window->shell_surface, display->seat, serial);
|
||||
}
|
||||
|
||||
static void WL_pointer_handle_axis(void *data, struct wl_pointer *wl_pointer, uint32_t time, uint32_t axis, wl_fixed_t value)
|
||||
{
|
||||
if (value < 0)
|
||||
{
|
||||
IN_KeyEvent(0, 1, K_MWHEELUP, 0);
|
||||
IN_KeyEvent(0, 0, K_MWHEELUP, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
IN_KeyEvent(0, 1, K_MWHEELDOWN, 0);
|
||||
IN_KeyEvent(0, 0, K_MWHEELDOWN, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static const struct wl_pointer_listener pointer_listener =
|
||||
{
|
||||
WL_pointer_handle_enter,
|
||||
WL_pointer_handle_leave,
|
||||
WL_pointer_handle_motion,
|
||||
WL_pointer_handle_button,
|
||||
WL_pointer_handle_axis,
|
||||
};
|
||||
|
||||
static void WL_keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard, uint32_t format, int fd, uint32_t size)
|
||||
{
|
||||
}
|
||||
|
||||
static void WL_keyboard_handle_enter(void *data, struct wl_keyboard *keyboard, uint32_t serial, struct wl_surface *surface, struct wl_array *keys)
|
||||
{
|
||||
}
|
||||
|
||||
static void WL_keyboard_handle_leave(void *data, struct wl_keyboard *keyboard, uint32_t serial, struct wl_surface *surface)
|
||||
{
|
||||
}
|
||||
|
||||
static void WL_keyboard_handle_key(void *data, struct wl_keyboard *keyboard, uint32_t serial, uint32_t time, uint32_t key, uint32_t state)
|
||||
{
|
||||
extern int shift_down;
|
||||
struct display *d = data;
|
||||
uint32_t qkey;
|
||||
uint32_t ukey;
|
||||
|
||||
if (key < sizeof(waylandinputsucksbighairydonkeyballs)/sizeof(waylandinputsucksbighairydonkeyballs[0]))
|
||||
{
|
||||
qkey = waylandinputsucksbighairydonkeyballs[key];
|
||||
if (shift_down)
|
||||
ukey = waylandinputsucksbighairydonkeyballsshift[key];
|
||||
else
|
||||
ukey = waylandinputsucksbighairydonkeyballs[key];
|
||||
}
|
||||
else
|
||||
ukey = qkey = 0;
|
||||
if (ukey < ' ' || ukey > 127)
|
||||
ukey = 0;
|
||||
|
||||
if (state)
|
||||
IN_KeyEvent(0, 1, qkey, ukey);
|
||||
else
|
||||
IN_KeyEvent(0, 0, qkey, 0);
|
||||
}
|
||||
|
||||
static void WL_keyboard_handle_modifiers(void *data, struct wl_keyboard *keyboard, uint32_t serial, uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked, uint32_t group)
|
||||
{
|
||||
}
|
||||
|
||||
static const struct wl_keyboard_listener keyboard_listener =
|
||||
{
|
||||
WL_keyboard_handle_keymap,
|
||||
WL_keyboard_handle_enter,
|
||||
WL_keyboard_handle_leave,
|
||||
WL_keyboard_handle_key,
|
||||
WL_keyboard_handle_modifiers
|
||||
};
|
||||
static void WL_seat_handle_capabilities(void *data, struct wl_seat *seat, enum wl_seat_capability caps)
|
||||
{
|
||||
struct wdisplay_s *s = data;
|
||||
if ((caps & WL_SEAT_CAPABILITY_POINTER) && !s->pointer)
|
||||
{
|
||||
s->pointer = wl_seat_get_pointer(seat);
|
||||
wl_pointer_add_listener(s->pointer, &pointer_listener, s);
|
||||
}
|
||||
else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && s->pointer)
|
||||
{
|
||||
wl_pointer_destroy(s->pointer);
|
||||
s->pointer = NULL;
|
||||
}
|
||||
|
||||
if ((caps & WL_SEAT_CAPABILITY_KEYBOARD) && !s->keyboard)
|
||||
{
|
||||
s->keyboard = wl_seat_get_keyboard(seat);
|
||||
wl_keyboard_add_listener(s->keyboard, &keyboard_listener, s);
|
||||
}
|
||||
else if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && s->keyboard)
|
||||
{
|
||||
wl_keyboard_destroy(s->keyboard);
|
||||
s->keyboard = NULL;
|
||||
}
|
||||
}
|
||||
static const struct wl_seat_listener seat_listener =
|
||||
{
|
||||
WL_seat_handle_capabilities
|
||||
};
|
||||
|
||||
static void WL_handle_global(void *data, struct wl_registry *registry,
|
||||
uint32_t id, const char *interface, uint32_t version)
|
||||
{
|
||||
struct wdisplay_s *d = data;
|
||||
//Sys_Printf("Interface %s id %u\n", interface, id);
|
||||
if (strcmp(interface, "wl_compositor") == 0)
|
||||
d->compositor = wl_registry_bind(registry, id, &wl_compositor_interface, 1);
|
||||
else if (strcmp(interface, "wl_shell") == 0)
|
||||
d->shell = wl_registry_bind(registry, id, &wl_shell_interface, 1);
|
||||
else if (strcmp(interface, "wl_seat") == 0 && !d->seat)
|
||||
{
|
||||
d->seat = wl_registry_bind(registry, id, &wl_seat_interface, 1);
|
||||
wl_seat_add_listener(d->seat, &seat_listener, d);
|
||||
}
|
||||
/* else if (!strcmp(interface, "input_device"))
|
||||
display_add_input(id);
|
||||
*/
|
||||
}
|
||||
|
||||
static const struct wl_registry_listener WL_registry_listener = {
|
||||
WL_handle_global
|
||||
};
|
||||
|
||||
static void WL_waitabit(void)
|
||||
{
|
||||
wl_display_roundtrip(w.display);
|
||||
}
|
||||
|
||||
static void WL_SwapBuffers(void)
|
||||
{
|
||||
float r;
|
||||
TRACE(("WL_SwapBuffers\n"));
|
||||
|
||||
wl_surface_set_opaque_region(w.surface, NULL);
|
||||
|
||||
EGL_SwapBuffers();
|
||||
//wl_surface_damage(w.surface, 0, 0, vid.pixelwidth, vid.pixelheight);
|
||||
wl_display_dispatch_pending(w.display);
|
||||
}
|
||||
|
||||
static qboolean WL_Init (rendererstate_t *info, unsigned char *palette)
|
||||
{
|
||||
cvar_t *v;
|
||||
w.display = wl_display_connect(NULL);
|
||||
if (!w.display)
|
||||
{
|
||||
Con_Printf("couldn't connect to wayland server\n");
|
||||
return false;
|
||||
}
|
||||
w.registry = wl_display_get_registry(w.display);
|
||||
wl_registry_add_listener(w.registry, &WL_registry_listener, &w); //w.compositor =
|
||||
|
||||
v = Cvar_FindVar("gl_menutint_shader");
|
||||
if (v && v->ival)
|
||||
{
|
||||
Con_Printf("Disabling gl_menutint_shader to avoid wayland/mesa EGL bugs.\n");
|
||||
Cvar_SetValue(v, 0);
|
||||
}
|
||||
v = Cvar_FindVar("r_waterstyle");
|
||||
if (v && v->ival>1)
|
||||
{
|
||||
Con_Printf("Disabling r_waterstyle to avoid wayland/mesa EGL bugs.\n");
|
||||
Cvar_SetValue(v, 1);
|
||||
}
|
||||
v = Cvar_FindVar("r_slimestyle");
|
||||
if (v && v->ival>1)
|
||||
{
|
||||
Con_Printf("Disabling r_slimestyle to avoid wayland/mesa EGL bugs.\n");
|
||||
Cvar_SetValue(v, 1);
|
||||
}
|
||||
v = Cvar_FindVar("r_lavastyle");
|
||||
if (v && v->ival>1)
|
||||
{
|
||||
Con_Printf("Disabling r_lavastyle to avoid wayland/mesa EGL bugs.\n");
|
||||
Cvar_SetValue(v, 1);
|
||||
}
|
||||
|
||||
WL_waitabit();
|
||||
|
||||
if (!w.compositor)
|
||||
{
|
||||
Con_Printf("no compositor running, apparently\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
w.surface = wl_compositor_create_surface(w.compositor);
|
||||
w.ssurface = wl_shell_get_shell_surface(w.shell, w.surface);
|
||||
wl_shell_surface_add_listener(w.ssurface, &shell_surface_listener, &w);
|
||||
w.enwindow = wl_egl_window_create(w.surface, info->width, info->height);
|
||||
|
||||
vid.pixelwidth = info->width;
|
||||
vid.pixelheight = info->height;
|
||||
|
||||
setenv("EGL_PLATFORM", "wayland", 1);
|
||||
if (!EGL_LoadLibrary(info->subrenderer))
|
||||
{
|
||||
Con_Printf("couldn't load EGL library\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!EGL_Init(info, palette, (EGLNativeWindowType)w.enwindow, (EGLNativeDisplayType) w.display))
|
||||
{
|
||||
Con_Printf("couldn't initialise EGL context\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (info->fullscreen)
|
||||
wl_shell_surface_set_fullscreen(w.ssurface, WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT, 60, NULL);
|
||||
else
|
||||
wl_shell_surface_set_toplevel(w.ssurface);
|
||||
|
||||
|
||||
//window_set_keyboard_focus_handler(window, WL_handler_keyfocus);
|
||||
//window_set_resize_handler(w.surface, WL_handler_resize);
|
||||
|
||||
wl_display_dispatch_pending(w.display);
|
||||
|
||||
GL_Init(&EGL_Proc);
|
||||
|
||||
// while(1)
|
||||
// WL_SwapBuffers();
|
||||
return true;
|
||||
}
|
||||
static void WL_DeInit(void)
|
||||
{
|
||||
EGL_Shutdown();
|
||||
wl_egl_window_destroy(w.enwindow);
|
||||
}
|
||||
static qboolean WL_ApplyGammaRamps(unsigned short *ramps)
|
||||
{
|
||||
//not supported
|
||||
return false;
|
||||
}
|
||||
static void WL_SetCaption(char *text)
|
||||
{
|
||||
wl_shell_surface_set_title(w.ssurface, text);
|
||||
}
|
||||
|
||||
#include "gl_draw.h"
|
||||
rendererinfo_t waylandrendererinfo =
|
||||
{
|
||||
"Wayland",
|
||||
{
|
||||
"wayland"
|
||||
},
|
||||
QR_OPENGL,
|
||||
|
||||
GLDraw_Init,
|
||||
GLDraw_DeInit,
|
||||
|
||||
GL_LoadTextureFmt,
|
||||
GL_LoadTexture8Pal24,
|
||||
GL_LoadTexture8Pal32,
|
||||
GL_LoadCompressed,
|
||||
GL_FindTexture,
|
||||
GL_AllocNewTexture,
|
||||
GL_UploadFmt,
|
||||
GL_DestroyTexture,
|
||||
|
||||
GLR_Init,
|
||||
GLR_DeInit,
|
||||
GLR_RenderView,
|
||||
|
||||
GLR_NewMap,
|
||||
GLR_PreNewMap,
|
||||
|
||||
WL_Init,
|
||||
WL_DeInit,
|
||||
WL_SwapBuffers,
|
||||
WL_ApplyGammaRamps,
|
||||
WL_SetCaption, //setcaption
|
||||
GLVID_GetRGBInfo,
|
||||
|
||||
|
||||
GLSCR_UpdateScreen,
|
||||
|
||||
GLBE_SelectMode,
|
||||
GLBE_DrawMesh_List,
|
||||
GLBE_DrawMesh_Single,
|
||||
GLBE_SubmitBatch,
|
||||
GLBE_GetTempBatch,
|
||||
GLBE_DrawWorld,
|
||||
GLBE_Init,
|
||||
GLBE_GenBrushModelVBO,
|
||||
GLBE_ClearVBO,
|
||||
GLBE_UploadAllLightmaps,
|
||||
GLBE_SelectEntity,
|
||||
GLBE_SelectDLight,
|
||||
GLBE_Scissor,
|
||||
GLBE_LightCullModel,
|
||||
|
||||
GLBE_VBO_Begin,
|
||||
GLBE_VBO_Data,
|
||||
GLBE_VBO_Finish,
|
||||
GLBE_VBO_Destroy,
|
||||
|
||||
GLBE_RenderToTextureUpdate2d,
|
||||
|
||||
""
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -59,29 +59,13 @@ extern r_config_t r_config;
|
|||
#endif
|
||||
#else
|
||||
#include <GLES2/gl2.h>
|
||||
/*gles has no fixed function*/
|
||||
#define GL_PROJECTION 0
|
||||
#define GL_MODELVIEW 0
|
||||
#define GL_CLIP_PLANE0 0
|
||||
#define GL_ALPHA_TEST 0
|
||||
#define GL_MODULATE 0
|
||||
#define GL_FLAT 0
|
||||
#define GL_SMOOTH 0
|
||||
#define GL_DECAL 0
|
||||
#define GL_ADD 0
|
||||
#define GL_TEXTURE_ENV 0
|
||||
#define GL_TEXTURE_ENV_MODE 0
|
||||
#define GL_COLOR_ARRAY 0
|
||||
#define GL_VERTEX_ARRAY 0
|
||||
#define GL_TEXTURE_COORD_ARRAY 0
|
||||
#endif
|
||||
/*gles has no doubles*/
|
||||
#define GLclampd GLclampf
|
||||
#define GLdouble GLfloat
|
||||
#define GL_CLAMP GL_CLAMP_TO_EDGE
|
||||
#define GL_NONE 0
|
||||
|
||||
#define GL_FILL (Sys_Error("GL_FILL was used"),0)
|
||||
#define GL_QUADS (Sys_Error("GL_QUADS was used"),0)
|
||||
#elif defined(__MACOSX__)
|
||||
//apple, you suck.
|
||||
|
@ -90,28 +74,6 @@ extern r_config_t r_config;
|
|||
#include <GLES2/gl2.h>
|
||||
#define GLclampd GLclampf
|
||||
#define GLdouble GLfloat
|
||||
#define GL_CLAMP GL_CLAMP_TO_EDGE
|
||||
#define GL_POLYGON (Con_Printf("GL_POLYGON was used"),0)
|
||||
#define GL_QUAD_STRIP (Con_Printf("GL_QUAD_STRIP was used"),0)
|
||||
#define GL_QUADS (Con_Printf("GL_QUADS was used"),0)
|
||||
|
||||
|
||||
#define GL_PROJECTION (Con_Printf("GL_PROJECTION was used"),0)
|
||||
#define GL_MODELVIEW (Con_Printf("GL_MODELVIEW was used"),0)
|
||||
#define GL_CLIP_PLANE0 (Con_Printf("GL_CLIP_PLANE0 was used"),0)
|
||||
#define GL_MODULATE (Con_Printf("GL_MODULATE was used"),0)
|
||||
#define GL_FLAT (Con_Printf("GL_FLAT was used"),0)
|
||||
#define GL_SMOOTH (Con_Printf("GL_SMOOTH was used"),0)
|
||||
#define GL_DECAL (Con_Printf("GL_DECAL was used"),0)
|
||||
#define GL_ADD (Con_Printf("GL_ADD was used"),0)
|
||||
#define GL_FILL (Con_Printf("GL_FILL was used"),0)
|
||||
#define GL_TEXTURE_ENV (Con_Printf("GL_TEXTURE_ENV was used"),0)
|
||||
#define GL_TEXTURE_ENV_MODE (Con_Printf("GL_TEXTURE_ENV_MODE was used"),0)
|
||||
#define GL_COLOR_ARRAY (Con_Printf("GL_COLOR_ARRAY was used"),0)
|
||||
#define GL_VERTEX_ARRAY (Con_Printf("GL_VERTEX_ARRAY was used"),0)
|
||||
#define GL_TEXTURE_COORD_ARRAY (Con_Printf("GL_TEXTURE_COORD_ARRAY was used"),0)
|
||||
|
||||
|
||||
#else
|
||||
#include <GL/gl.h>
|
||||
#ifdef GL_STATIC
|
||||
|
@ -121,11 +83,53 @@ extern r_config_t r_config;
|
|||
#endif
|
||||
//#include <GL/glu.h>
|
||||
#include "glsupp.h"
|
||||
|
||||
|
||||
|
||||
/*gles2 has no fixed function*/
|
||||
#ifndef GL_ALPHA_TEST
|
||||
#define GL_ALPHA_TEST 0
|
||||
#endif
|
||||
#ifndef GL_FILL
|
||||
#define GL_FILL (Sys_Error("GL_FILL was used"),0)
|
||||
#endif
|
||||
#ifndef GL_CLAMP
|
||||
#define GL_CLAMP GL_CLAMP_TO_EDGE
|
||||
#endif
|
||||
#ifndef GL_TEXTURE_ENV
|
||||
#define GL_TEXTURE_ENV (Con_Printf("GL_TEXTURE_ENV was used"),0)
|
||||
#define GL_TEXTURE_ENV_MODE (Con_Printf("GL_TEXTURE_ENV_MODE was used"),0)
|
||||
#define GL_VERTEX_ARRAY (Con_Printf("GL_VERTEX_ARRAY was used"),0)
|
||||
#define GL_COLOR_ARRAY (Con_Printf("GL_COLOR_ARRAY was used"),0)
|
||||
#define GL_TEXTURE_COORD_ARRAY (Con_Printf("GL_TEXTURE_COORD_ARRAY was used"),0)
|
||||
#define GL_DECAL (Con_Printf("GL_DECAL was used"),0)
|
||||
#define GL_ADD (Con_Printf("GL_ADD was used"),0)
|
||||
#define GL_FLAT (Con_Printf("GL_FLAT was used"),0)
|
||||
#define GL_SMOOTH (Con_Printf("GL_SMOOTH was used"),0)
|
||||
#define GL_MODULATE 0x2100
|
||||
#define GL_PROJECTION (Con_Printf("GL_PROJECTION was used"),0)
|
||||
#define GL_MODELVIEW (Con_Printf("GL_MODELVIEW was used"),0)
|
||||
#define GL_CLIP_PLANE0 (Con_Printf("GL_CLIP_PLANE0 was used"),0)
|
||||
#endif
|
||||
#ifndef GL_COLOR_ARRAY_POINTER
|
||||
#define GL_COLOR_ARRAY_POINTER 0
|
||||
#define GL_NORMAL_ARRAY 0
|
||||
#define GL_NORMAL_ARRAY_POINTER 0
|
||||
#define GL_TEXTURE_COORD_ARRAY_POINTER 0
|
||||
#define GL_VERTEX_ARRAY_POINTER 0
|
||||
#define GL_BLEND_SRC 0
|
||||
#define GL_BLEND_DST 0
|
||||
#endif
|
||||
#ifndef GL_POLYGON
|
||||
#define GL_POLYGON (Con_Printf("GL_POLYGON was used"),0)
|
||||
#define GL_QUAD_STRIP (Con_Printf("GL_QUAD_STRIP was used"),0)
|
||||
#define GL_QUADS (Con_Printf("GL_QUADS was used"),0)
|
||||
#endif
|
||||
|
||||
void GL_InitFogTexture(void);
|
||||
|
||||
void GL_BeginRendering (void);
|
||||
void GL_EndRendering (void);
|
||||
#define GL_BeginRendering()
|
||||
#define GL_EndRendering()
|
||||
|
||||
void GL_FlushSkinCache(void);
|
||||
void GL_GAliasFlushSkinCache(void);
|
||||
|
@ -342,13 +346,6 @@ void GL_ForceDepthWritable(void);
|
|||
|
||||
#endif
|
||||
|
||||
//
|
||||
// vid_gl*.c
|
||||
//
|
||||
#ifdef GLQUAKE
|
||||
void GL_DoSwap (void);
|
||||
#endif
|
||||
|
||||
//
|
||||
// gl_backend.c
|
||||
//
|
||||
|
|
|
@ -159,9 +159,9 @@ static int QDECL SendFileNameTo(const char *rawname, qofs_t size, void *param, s
|
|||
fname = slash+1;
|
||||
|
||||
if (isdir)
|
||||
sprintf(buffer, "drw-r--r--\t1\troot\troot\t%8u Jan 1 12:00 %s\r\n", size, fname);
|
||||
sprintf(buffer, "drw-r--r--\t1\troot\troot\t%8u Jan 1 12:00 %s\r\n", (unsigned int)size, fname);
|
||||
else
|
||||
sprintf(buffer, "-rw-r--r--\t1\troot\troot\t%8u Jan 1 12:00 %s\r\n", size, fname);
|
||||
sprintf(buffer, "-rw-r--r--\t1\troot\troot\t%8u Jan 1 12:00 %s\r\n", (unsigned int)size, fname);
|
||||
|
||||
// strcpy(buffer, fname);
|
||||
// for (i = strlen(buffer); i < 40; i+=8)
|
||||
|
|
|
@ -730,14 +730,14 @@ void HTTPDL_Establish(struct dl_download *dl)
|
|||
Q_snprintfz(con->buffer, con->bufferlen,
|
||||
"POST %s HTTP/1.1\r\n"
|
||||
"Host: %s\r\n"
|
||||
"Content-Length: %i\r\n"
|
||||
"Content-Length: %u\r\n"
|
||||
"Content-Type: %s\r\n"
|
||||
"Connection: close\r\n"
|
||||
#if !defined(NPFTE) && defined(AVAIL_ZLIB)
|
||||
"Accept-Encoding: gzip\r\n"
|
||||
#endif
|
||||
"User-Agent: "FULLENGINENAME"\r\n"
|
||||
"\r\n", uri, server, dl->postlen, dl->postmimetype);
|
||||
"\r\n", uri, server, (unsigned int)dl->postlen, dl->postmimetype);
|
||||
con->bufferused = strlen(con->buffer);
|
||||
memcpy(con->buffer + con->bufferused, dl->postdata, dl->postlen);
|
||||
con->bufferused += dl->postlen;
|
||||
|
|
|
@ -2949,7 +2949,7 @@ char *QCC_PR_CheckCompConstTooltip(char *word, char *outstart, char *outend)
|
|||
QC_snprintfz(out, outend-out, "%s", c->params[i]);
|
||||
out += strlen(out);
|
||||
}
|
||||
QC_snprintfz(out, outend-out, ")", c->name);
|
||||
QC_snprintfz(out, outend-out, ")");
|
||||
}
|
||||
else
|
||||
QC_snprintfz(out, outend-out, "#define %s", c->name);
|
||||
|
|
|
@ -2784,7 +2784,7 @@ void SV_DownloadSize_f(void)
|
|||
break;
|
||||
case -5: /*package*/
|
||||
case 0: /*exists*/
|
||||
name = va("dlsize \"%s\" %u\n", name, loc.len);
|
||||
name = va("dlsize \"%s\" %u\n", name, (unsigned int)loc.len);
|
||||
ClientReliableWrite_Begin (host_client, svc_stufftext, 2+strlen(name));
|
||||
ClientReliableWrite_String (host_client, name);
|
||||
break;
|
||||
|
|
|
@ -142,17 +142,8 @@ void GLVID_DeInit (void)
|
|||
}
|
||||
|
||||
|
||||
void GL_BeginRendering (void)
|
||||
void VIDGL_SwapBuffers (void)
|
||||
{
|
||||
}
|
||||
|
||||
qboolean screenflush;
|
||||
void GL_DoSwap (void)
|
||||
{
|
||||
if (!screenflush)
|
||||
return;
|
||||
screenflush = 0;
|
||||
|
||||
//webgl doesn't support swapbuffers.
|
||||
//you can't use it for loading screens.
|
||||
//such things must result in waiting until the following frame.
|
||||
|
@ -179,13 +170,6 @@ void GL_DoSwap (void)
|
|||
*/
|
||||
}
|
||||
|
||||
void GL_EndRendering (void)
|
||||
{
|
||||
screenflush = true;
|
||||
if (!gl_lateswap.value)
|
||||
GL_DoSwap();
|
||||
}
|
||||
|
||||
qboolean GLVID_ApplyGammaRamps (unsigned short *ramps)
|
||||
{
|
||||
gammaworks = false;
|
||||
|
|
Loading…
Reference in a new issue