Fix up SDL build to enable our multithread stuff.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5996 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2021-07-25 22:55:17 +00:00
parent 8068109392
commit 87245a290a
11 changed files with 160 additions and 60 deletions

View file

@ -386,7 +386,7 @@ ELSEIF(1) #SDL
INCLUDE_DIRECTORIES(${FREETYPE_INCLUDE_DIRS} ${SDL2_INCLUDE_DIRS}) INCLUDE_DIRECTORIES(${FREETYPE_INCLUDE_DIRS} ${SDL2_INCLUDE_DIRS})
#SDL2.0.7 supports vulkan, so lets use it. #SDL2.0.7 supports vulkan, so lets use it.
SET(FTE_DEFINES ${FTE_DEFINES};FTE_SDL) SET(FTE_DEFINES ${FTE_DEFINES};FTE_SDL;MULTITHREAD)
SET(FTE_LIBS ${FTE_LIBS} ${SYS_LIBS} ${CMAKE_DL_LIBS} ${SDL2_LIBRARIES}) SET(FTE_LIBS ${FTE_LIBS} ${SYS_LIBS} ${CMAKE_DL_LIBS} ${SDL2_LIBRARIES})
SET(FTE_ARCH_FILES SET(FTE_ARCH_FILES
engine/client/sys_sdl.c engine/client/sys_sdl.c

View file

@ -1056,13 +1056,13 @@ else
M_LDFLAGS=$(MLDFLAGS) $(IMAGELDFLAGS) `$(SDLCONFIG) --libs` M_LDFLAGS=$(MLDFLAGS) $(IMAGELDFLAGS) `$(SDLCONFIG) --libs`
SV_LDFLAGS=`$(SDLCONFIG) --libs` SV_LDFLAGS=`$(SDLCONFIG) --libs`
endif endif
GL_CFLAGS=-DFTE_SDL $(GLCFLAGS) `$(SDLCONFIG) --cflags` GL_CFLAGS=-DFTE_SDL $(GLCFLAGS) -DMLTITHREAD `$(SDLCONFIG) --cflags`
GLB_DIR=gl_$(FTE_FULLTARGET) GLB_DIR=gl_$(FTE_FULLTARGET)
GLCL_DIR=glcl_$(FTE_FULLTARGET) GLCL_DIR=glcl_$(FTE_FULLTARGET)
SV_DIR?=sv_$(FTE_FULLTARGET) SV_DIR?=sv_$(FTE_FULLTARGET)
VKCL_OBJS=$(VKQUAKE_OBJS) $(D3DGL_OBJS) gl_bloom.o $(BOTLIB_OBJS) gl_vidsdl.o snd_sdl.o cd_sdl.o sys_sdl.o in_sdl.o VKCL_OBJS=$(VKQUAKE_OBJS) $(D3DGL_OBJS) gl_bloom.o $(BOTLIB_OBJS) gl_vidsdl.o snd_sdl.o cd_sdl.o sys_sdl.o in_sdl.o
VK_CFLAGS=-DFTE_SDL $(VKCFLAGS) `$(SDLCONFIG) --cflags` VK_CFLAGS=-DFTE_SDL $(VKCFLAGS) -DMULTITHREAD `$(SDLCONFIG) --cflags`
VKB_DIR=vk_$(FTE_FULLTARGET) VKB_DIR=vk_$(FTE_FULLTARGET)
VKCL_DIR=vk_$(FTE_FULLTARGET) VKCL_DIR=vk_$(FTE_FULLTARGET)
VK_EXE_NAME=../$(EXE_NAME)-vk$(FTE_FULLTARGET) VK_EXE_NAME=../$(EXE_NAME)-vk$(FTE_FULLTARGET)
@ -1070,15 +1070,17 @@ VKCL_EXE_NAME=../$(EXE_NAME)-vkcl$(FTE_FULLTARGET)
SV_OBJS=$(COMMON_OBJS) $(SERVER_OBJS) $(PROGS_OBJS) $(SERVERONLY_OBJS) $(BOTLIB_OBJS) SV_OBJS=$(COMMON_OBJS) $(SERVER_OBJS) $(PROGS_OBJS) $(SERVERONLY_OBJS) $(BOTLIB_OBJS)
SV_EXE_NAME=../$(EXE_NAME)-sv$(FTE_FULLTARGET) SV_EXE_NAME=../$(EXE_NAME)-sv$(FTE_FULLTARGET)
SV_CFLAGS=-DFTE_SDL `$(SDLCONFIG) --cflags` $(SERVER_ONLY_CFLAGS) SV_CFLAGS=-DFTE_SDL -DMULTITHREAD `$(SDLCONFIG) --cflags` $(SERVER_ONLY_CFLAGS)
MINGL_DIR=mingl_$(FTE_FULLTARGET) MINGL_DIR=mingl_$(FTE_FULLTARGET)
MINGL_EXE_NAME=../$(EXE_NAME)-mingl$(FTE_FULLTARGET) MINGL_EXE_NAME=../$(EXE_NAME)-mingl$(FTE_FULLTARGET)
MB_DIR=m_$(FTE_FULLTARGET) MB_DIR=m_$(FTE_FULLTARGET)
MCL_DIR=mcl_$(FTE_FULLTARGET)
M_EXE_NAME=../$(EXE_NAME)-$(FTE_FULLTARGET) M_EXE_NAME=../$(EXE_NAME)-$(FTE_FULLTARGET)
MCL_EXE_NAME=../$(EXE_NAME)-cl$(FTE_FULLTARGET)
MCL_OBJS=$(D3DGL_OBJS) $(GLQUAKE_OBJS) $(SOFTWARE_OBJS) $(BOTLIB_OBJS) gl_vidsdl.o snd_sdl.o cd_sdl.o sys_sdl.o in_sdl.o MCL_OBJS=$(D3DGL_OBJS) $(GLQUAKE_OBJS) $(SOFTWARE_OBJS) $(BOTLIB_OBJS) gl_vidsdl.o snd_sdl.o cd_sdl.o sys_sdl.o in_sdl.o
M_CFLAGS=-DFTE_SDL $(VKCFLAGS) $(GLCFLAGS) `$(SDLCONFIG) --cflags` M_CFLAGS=-DFTE_SDL $(VKCFLAGS) $(GLCFLAGS) -DMULTITHRED `$(SDLCONFIG) --cflags`
QCC_DIR=qcc$(BITS) QCC_DIR=qcc$(BITS)

View file

@ -94,7 +94,7 @@ static uint32_t SDL_GiveFinger(SDL_JoystickID jid, SDL_TouchID tid, SDL_FingerID
#endif #endif
#if SDL_MAJOR_VERSION >= 2 #if SDL_MAJOR_VERSION >= 2
#define MAX_JOYSTICKS 4 #define MAX_JOYSTICKS 16
static struct sdljoy_s static struct sdljoy_s
{ {
//fte doesn't distinguish between joysticks and controllers. //fte doesn't distinguish between joysticks and controllers.
@ -348,10 +348,11 @@ static void J_JoystickButton(SDL_JoystickID jid, int button, qboolean pressed)
void J_Rumble(int id, uint16_t amp_low, uint16_t amp_high, int duration) void J_Rumble(int id, uint16_t amp_low, uint16_t amp_high, int duration)
{ {
#if SDL_VERSION_ATLEAST(2,0,9) #if SDL_VERSION_ATLEAST(2,0,9)
int i;
if (duration > 10000) if (duration > 10000)
duration = 10000; duration = 10000;
for (int i = 0; i < MAX_JOYSTICKS; i++) for (i = 0; i < MAX_JOYSTICKS; i++)
{ {
if (sdljoy[i].qdevid == id) if (sdljoy[i].qdevid == id)
{ {
@ -367,10 +368,11 @@ void J_Rumble(int id, uint16_t amp_low, uint16_t amp_high, int duration)
void J_RumbleTriggers(int id, uint16_t left, uint16_t right, uint32_t duration) void J_RumbleTriggers(int id, uint16_t left, uint16_t right, uint32_t duration)
{ {
#if SDL_VERSION_ATLEAST(2,0,14) #if SDL_VERSION_ATLEAST(2,0,14)
int i;
if (duration > 10000) if (duration > 10000)
duration = 10000; duration = 10000;
for (int i = 0; i < MAX_JOYSTICKS; i++) for (i = 0; i < MAX_JOYSTICKS; i++)
{ {
if (sdljoy[i].qdevid == id) if (sdljoy[i].qdevid == id)
{ {
@ -386,12 +388,13 @@ void J_RumbleTriggers(int id, uint16_t left, uint16_t right, uint32_t duration)
void J_SetLEDColor(int id, vec3_t color) void J_SetLEDColor(int id, vec3_t color)
{ {
#if SDL_VERSION_ATLEAST(2,0,14) #if SDL_VERSION_ATLEAST(2,0,14)
int i;
/* maybe we'll eventually get sRGB LEDs */ /* maybe we'll eventually get sRGB LEDs */
color[0] *= 255.0f; color[0] *= 255.0f;
color[1] *= 255.0f; color[1] *= 255.0f;
color[2] *= 255.0f; color[2] *= 255.0f;
for (int i = 0; i < MAX_JOYSTICKS; i++) for (i = 0; i < MAX_JOYSTICKS; i++)
{ {
if (sdljoy[i].qdevid == id) if (sdljoy[i].qdevid == id)
{ {

View file

@ -187,7 +187,6 @@ int MP_TranslateFTEtoQCCodes(keynum_t code)
case K_MM_TRACK_NEXT: case K_MM_TRACK_NEXT:
case K_MM_TRACK_PREV: case K_MM_TRACK_PREV:
case K_MM_TRACK_STOP: case K_MM_TRACK_STOP:
case K_MAX:
case K_MM_TRACK_PLAYPAUSE: case K_MM_TRACK_PLAYPAUSE:
case K_F13: case K_F13:
case K_F14: case K_F14:
@ -200,6 +199,7 @@ int MP_TranslateFTEtoQCCodes(keynum_t code)
case K_APP: case K_APP:
case K_SEARCH: return -code; case K_SEARCH: return -code;
case K_MAX:
safedefault: safedefault:
if (code == -1) //mod bug if (code == -1) //mod bug
return code; return code;

View file

@ -6764,7 +6764,7 @@ static void QCBUILTIN PF_cl_gp_settriggerfx(pubprogfuncs_t *prinst, struct globa
{ {
int device = G_FLOAT(OFS_PARM0); int device = G_FLOAT(OFS_PARM0);
int size = G_INT(OFS_PARM2); int size = G_INT(OFS_PARM2);
void *fxptr = PR_GetReadQCPtr(prinst, G_INT(OFS_PARM1), size); const void *fxptr = PR_GetReadQCPtr(prinst, G_INT(OFS_PARM1), size);
if (!fxptr) if (!fxptr)
PR_BIError(prinst, "PF_cl_gp_settriggerfx: invalid pointer/size\n"); PR_BIError(prinst, "PF_cl_gp_settriggerfx: invalid pointer/size\n");

View file

@ -309,6 +309,9 @@ void Sys_Quit (void)
{ {
Host_Shutdown(); Host_Shutdown();
SDL_free((char*)host_parms.binarydir);
host_parms.binarydir = NULL;
exit (0); exit (0);
} }
@ -670,6 +673,12 @@ dllhandle_t *Sys_LoadLibrary(const char *name, dllfunction_t *funcs)
void *lib; void *lib;
lib = SDL_LoadObject(name); lib = SDL_LoadObject(name);
if (!lib)
{
char libpath[MAX_OSPATH];
Q_snprintfz(libpath, sizeof(libpath), "%s"ARCH_DL_POSTFIX, name);
lib = SDL_LoadObject(libpath);
}
if (!lib) if (!lib)
return NULL; return NULL;
@ -812,6 +821,7 @@ int QDECL main(int argc, char **argv)
memset(&parms, 0, sizeof(parms)); memset(&parms, 0, sizeof(parms));
parms.basedir = "./"; parms.basedir = "./";
parms.binarydir = SDL_GetBasePath();
parms.argc = argc; parms.argc = argc;
parms.argv = (const char**)argv; parms.argv = (const char**)argv;
@ -940,14 +950,64 @@ void Sys_SaveClipboard(clipboardtype_t cbt, const char *text)
#endif #endif
#ifdef MULTITHREAD #ifdef MULTITHREAD
/* Thread creation calls */
/*Thread management stuff*/
static SDL_threadID mainthread;
static SDL_TLSID tls_threadinfo;
struct threadinfo_s
{
jmp_buf jmpbuf; //so we can actually abort our threads...
int (*threadfunc)(void *args);
void *args;
};
void Sys_ThreadsInit(void)
{
mainthread = SDL_ThreadID();
}
qboolean Sys_IsThread(void *thread)
{
return SDL_GetThreadID(thread) == SDL_ThreadID();
}
qboolean Sys_IsMainThread(void)
{
return mainthread == SDL_ThreadID();
}
void Sys_ThreadAbort(void)
{
//SDL_KillThread(NULL) got removed... so we have to do things the shitty way.
struct threadinfo_s *tinfo = SDL_TLSGet(tls_threadinfo);
if (!tinfo)
{ //erk... not created via Sys_CreateThread?!?
SDL_Delay(10*1000);
exit(0);
}
longjmp(tinfo->jmpbuf, 1);
}
static int FTESDLThread(void *args)
{ //all for Sys_ThreadAbort
struct threadinfo_s *tinfo = args;
int r;
SDL_TLSSet(tls_threadinfo, tinfo, NULL);
if (setjmp(tinfo->jmpbuf))
r = 0; //aborted...
else
r = tinfo->threadfunc(tinfo->args);
SDL_TLSSet(tls_threadinfo, NULL, NULL);
Z_Free(tinfo);
return r;
}
void *Sys_CreateThread(char *name, int (*func)(void *), void *args, int priority, int stacksize) void *Sys_CreateThread(char *name, int (*func)(void *), void *args, int priority, int stacksize)
{ {
// SDL threads do not support setting thread stack size // SDL threads do not support setting thread stack size
struct threadinfo_s *tinfo = Z_Malloc(sizeof(*tinfo));
tinfo->threadfunc = func;
tinfo->args = args;
#if SDL_MAJOR_VERSION >= 2 #if SDL_MAJOR_VERSION >= 2
return (void *)SDL_CreateThread(func, name, args); return (void *)SDL_CreateThread(FTESDLThread, name, tinfo);
#else #else
return (void *)SDL_CreateThread(func, args); return (void *)SDL_CreateThread(FTESDLThread, tinfo);
#endif #endif
} }
@ -958,6 +1018,32 @@ void Sys_WaitOnThread(void *thread)
/* Mutex calls */ /* Mutex calls */
#if SDL_MAJOR_VERSION >= 2
void *Sys_CreateMutex(void)
{
return (void *)SDL_CreateMutex();
}
qboolean Sys_TryLockMutex(void *mutex)
{
return !SDL_TryLockMutex(mutex);
}
qboolean Sys_LockMutex(void *mutex)
{
return !SDL_LockMutex(mutex);
}
qboolean Sys_UnlockMutex(void *mutex)
{
return !SDL_UnlockMutex(mutex);
}
void Sys_DestroyMutex(void *mutex)
{
SDL_DestroyMutex(mutex);
}
#else
// SDL mutexes don't have try-locks for mutexes in the spec so we stick with 1-value semaphores // SDL mutexes don't have try-locks for mutexes in the spec so we stick with 1-value semaphores
void *Sys_CreateMutex(void) void *Sys_CreateMutex(void)
{ {
@ -983,6 +1069,7 @@ void Sys_DestroyMutex(void *mutex)
{ {
SDL_DestroySemaphore(mutex); SDL_DestroySemaphore(mutex);
} }
#endif
/* Conditional wait calls */ /* Conditional wait calls */
typedef struct condvar_s typedef struct condvar_s

View file

@ -4084,7 +4084,7 @@ static void CM_OpenAllPortals(model_t *mod, char *ents) //this is a compleate ha
#endif #endif
#if !defined(CLIENTONLY) && defined(Q3BSPS) #if defined(HAVE_SERVER) && defined(Q3BSPS)
static void CalcClusterPHS(cminfo_t *prv, int cluster) static void CalcClusterPHS(cminfo_t *prv, int cluster)
{ {
int j, k, l, index; int j, k, l, index;
@ -4742,7 +4742,7 @@ static cmodel_t *CM_LoadMap (model_t *mod, qbyte *filein, size_t filelen, qboole
BZ_Free(prv->faces); BZ_Free(prv->faces);
return NULL; return NULL;
} }
#ifndef CLIENTONLY #ifdef HAVE_SERVER
CMQ3_CalcPHS(mod); CMQ3_CalcPHS(mod);
#endif #endif
// BZ_Free(map_verts); // BZ_Free(map_verts);
@ -6839,6 +6839,7 @@ qbyte *CM_ClusterPVS (model_t *mod, int cluster, pvsbuffer_t *buffer, pvsmerge_t
} }
} }
#ifdef HAVE_SERVER
qbyte *CM_ClusterPHS (model_t *mod, int cluster, pvsbuffer_t *buffer) qbyte *CM_ClusterPHS (model_t *mod, int cluster, pvsbuffer_t *buffer)
{ {
cminfo_t *prv = (cminfo_t*)mod->meshinfo; cminfo_t *prv = (cminfo_t*)mod->meshinfo;
@ -6848,6 +6849,7 @@ qbyte *CM_ClusterPHS (model_t *mod, int cluster, pvsbuffer_t *buffer)
if (buffer->buffersize < mod->pvsbytes) if (buffer->buffersize < mod->pvsbytes)
buffer->buffer = BZ_Realloc(buffer->buffer, buffer->buffersize=mod->pvsbytes); buffer->buffer = BZ_Realloc(buffer->buffer, buffer->buffersize=mod->pvsbytes);
#ifdef Q3BSPS
if (mod->fromgame != fg_quake2) if (mod->fromgame != fg_quake2)
{ {
if (cluster != -1 && prv->q3phs->numclusters) if (cluster != -1 && prv->q3phs->numclusters)
@ -6862,6 +6864,7 @@ qbyte *CM_ClusterPHS (model_t *mod, int cluster, pvsbuffer_t *buffer)
return buffer->buffer; return buffer->buffer;
} }
} }
#endif
if (cluster == -1) if (cluster == -1)
memset (buffer->buffer, 0, (mod->numclusters+7)>>3); memset (buffer->buffer, 0, (mod->numclusters+7)>>3);
@ -6869,6 +6872,7 @@ qbyte *CM_ClusterPHS (model_t *mod, int cluster, pvsbuffer_t *buffer)
CM_DecompressVis (mod, ((qbyte*)prv->q2vis) + prv->q2vis->bitofs[cluster][DVIS_PHS], buffer->buffer, false); CM_DecompressVis (mod, ((qbyte*)prv->q2vis) + prv->q2vis->bitofs[cluster][DVIS_PHS], buffer->buffer, false);
return buffer->buffer; return buffer->buffer;
} }
#endif
static unsigned int SV_Q2BSP_FatPVS (model_t *mod, const vec3_t org, pvsbuffer_t *result, qboolean merge) static unsigned int SV_Q2BSP_FatPVS (model_t *mod, const vec3_t org, pvsbuffer_t *result, qboolean merge)
{ {

View file

@ -7331,6 +7331,48 @@ void PR_Common_SaveGame(vfsfile_t *f, pubprogfuncs_t *prinst, qboolean binary)
} }
void *PR_GetWriteQCPtr(pubprogfuncs_t *prinst, int qcptr, int qcsize)
{
// void *r;
if (qcsize < 0)
return NULL;
if (!qcptr)
return NULL;
if (qcptr >= 0 && qcptr <= prinst->stringtablemaxsize)
{
if (qcptr + qcsize <= prinst->stringtablemaxsize)
return prinst->stringtable+qcptr; //its in bounds
}
/*else
{
r = PR_GetString(prinst, qcptr);
if (qcsize < strlen(r))
return r;
}*/
return NULL;
}
const void *PR_GetReadQCPtr(pubprogfuncs_t *prinst, int qcptr, int qcsize)
{
const char *r;
if (qcsize < 0)
return NULL;
if (!qcptr)
return NULL;
if (qcptr >= 0 && qcptr <= prinst->stringtablemaxsize)
{
if (qcptr + qcsize <= prinst->stringtablemaxsize)
return prinst->stringtable+qcptr; //its in bounds
}
else
{
r = PR_GetString(prinst, qcptr);
if (qcsize < strlen(r))
return r;
}
return NULL;
}
#define DEF_SAVEGLOBAL (1u<<15) #define DEF_SAVEGLOBAL (1u<<15)
static void PR_AutoCvarApply(pubprogfuncs_t *prinst, eval_t *val, etype_t type, cvar_t *var) static void PR_AutoCvarApply(pubprogfuncs_t *prinst, eval_t *val, etype_t type, cvar_t *var)
{ {

View file

@ -577,6 +577,9 @@ void PR_Common_Shutdown(pubprogfuncs_t *progs, qboolean errored);
void PR_Common_SaveGame(vfsfile_t *f, pubprogfuncs_t *prinst, qboolean binary); void PR_Common_SaveGame(vfsfile_t *f, pubprogfuncs_t *prinst, qboolean binary);
qboolean PR_Common_LoadGame(pubprogfuncs_t *prinst, char *command, const char **file); qboolean PR_Common_LoadGame(pubprogfuncs_t *prinst, char *command, const char **file);
const void *PR_GetReadQCPtr(pubprogfuncs_t *prinst, int qcptr, int qcsize);
void *PR_GetWriteQCPtr(pubprogfuncs_t *prinst, int qcptr, int qcsize);
uploadfmt_t PR_TranslateTextureFormat(int qcformat); uploadfmt_t PR_TranslateTextureFormat(int qcformat);
//FIXME //FIXME

View file

@ -647,7 +647,7 @@ static const struct wl_shell_surface_listener shell_surface_listener =
#endif #endif
//qkeys are ascii-compatible for the most part. //qkeys are ascii-compatible for the most part.
static qbyte waylandinputsucksbighairydonkeyballs[] = static unsigned short waylandinputsucksbighairydonkeyballs[] =
{ {
0, K_ESCAPE,'1','2','3','4','5','6', //0x 0, K_ESCAPE,'1','2','3','4','5','6', //0x
'7','8','9','0','-','=',K_BACKSPACE,K_TAB, '7','8','9','0','-','=',K_BACKSPACE,K_TAB,
@ -666,7 +666,7 @@ static qbyte waylandinputsucksbighairydonkeyballs[] =
0,0,0,0,0,0,0,K_PAUSE, //7x 0,0,0,0,0,0,0,K_PAUSE, //7x
0,0,0,0,0,K_LWIN,K_RWIN,K_APP 0,0,0,0,0,K_LWIN,K_RWIN,K_APP
}; };
static qbyte waylandinputsucksbighairydonkeyballsshift[] = static unsigned short waylandinputsucksbighairydonkeyballsshift[] =
{ {
0, K_ESCAPE,'!','\"','3','$','%','^', //0x 0, K_ESCAPE,'!','\"','3','$','%','^', //0x
'&','*','(',')','_','+',K_BACKSPACE,K_TAB, '&','*','(',')','_','+',K_BACKSPACE,K_TAB,

View file

@ -272,47 +272,6 @@ static qcstate_t *PR_CreateThread(pubprogfuncs_t *prinst, float retval, float re
return state; return state;
} }
void *PR_GetWriteQCPtr(pubprogfuncs_t *prinst, int qcptr, int qcsize)
{
// void *r;
if (qcsize < 0)
return NULL;
if (!qcptr)
return NULL;
if (qcptr >= 0 && qcptr <= prinst->stringtablemaxsize)
{
if (qcptr + qcsize <= prinst->stringtablemaxsize)
return prinst->stringtable+qcptr; //its in bounds
}
/*else
{
r = PR_GetString(prinst, qcptr);
if (qcsize < strlen(r))
return r;
}*/
return NULL;
}
const void *PR_GetReadQCPtr(pubprogfuncs_t *prinst, int qcptr, int qcsize)
{
const char *r;
if (qcsize < 0)
return NULL;
if (!qcptr)
return NULL;
if (qcptr >= 0 && qcptr <= prinst->stringtablemaxsize)
{
if (qcptr + qcsize <= prinst->stringtablemaxsize)
return prinst->stringtable+qcptr; //its in bounds
}
else
{
r = PR_GetString(prinst, qcptr);
if (qcsize < strlen(r))
return r;
}
return NULL;
}
void PDECL ED_Spawned (struct edict_s *ent, int loading) void PDECL ED_Spawned (struct edict_s *ent, int loading)
{ {
#ifdef VM_Q1 #ifdef VM_Q1