X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=vid_sdl.c;h=c301160af09adffd8a3fbd0c507ebd00f7389a33;hp=de9e5f9dff3af4e20fba458cd41985c6d0f2c13b;hb=72febe336719285ecd4f855454d1e90f7aa99834;hpb=d1a7d5d11e065a2fef1d0d9665cc8920fc42716f diff --git a/vid_sdl.c b/vid_sdl.c index de9e5f9d..c301160a 100644 --- a/vid_sdl.c +++ b/vid_sdl.c @@ -66,9 +66,6 @@ int cl_available = true; qboolean vid_supportrefreshrate = false; -cvar_t vid_soft = {CVAR_SAVE, "vid_soft", "0", "enables use of the DarkPlaces Software Rasterizer rather than OpenGL or Direct3D"}; -cvar_t vid_soft_threads = {CVAR_SAVE, "vid_soft_threads", "2", "the number of threads the DarkPlaces Software Rasterizer should use"}; -cvar_t vid_soft_interlace = {CVAR_SAVE, "vid_soft_interlace", "1", "whether the DarkPlaces Software Rasterizer should interlace the screen bands occupied by each thread"}; cvar_t joy_detected = {CVAR_READONLY, "joy_detected", "0", "number of joysticks detected by engine"}; cvar_t joy_enable = {CVAR_SAVE, "joy_enable", "0", "enables joystick support"}; cvar_t joy_index = {0, "joy_index", "0", "selects which joystick to use if you have multiple"}; @@ -93,7 +90,7 @@ cvar_t joy_sensitivityroll = {0, "joy_sensitivityroll", "1", "movement multiplie cvar_t joy_axiskeyevents = {CVAR_SAVE, "joy_axiskeyevents", "0", "generate uparrow/leftarrow etc. keyevents for joystick axes, use if your joystick driver is not generating them"}; cvar_t joy_axiskeyevents_deadzone = {CVAR_SAVE, "joy_axiskeyevents_deadzone", "0.5", "deadzone value for axes"}; -#ifdef __IPHONEOS__ +#ifdef USE_GLES2 # define SETVIDEOMODE 0 #else # if SDL_MAJOR_VERSION == 1 && SDL_MINOR_VERSION == 2 @@ -1025,11 +1022,9 @@ void Sys_SendKeyEvents( void ) break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: -#ifndef __IPHONEOS__ if (!vid_touchscreen.integer) if (event.button.button <= 18) Key_Event( buttonremap[event.button.button - 1], 0, event.button.state == SDL_PRESSED ); -#endif break; case SDL_JOYBUTTONDOWN: if (!joy_enable.integer) @@ -1225,9 +1220,12 @@ void Sys_SendKeyEvents( void ) // Video system //// +#ifdef USE_GLES2 #ifdef __IPHONEOS__ -//#include #include +#else +#include +#endif GLboolean wrapglIsBuffer(GLuint buffer) {return glIsBuffer(buffer);} GLboolean wrapglIsEnabled(GLenum cap) {return glIsEnabled(cap);} @@ -1249,7 +1247,7 @@ void wrapglActiveTexture(GLenum e) {glActiveTexture(e);} void wrapglAlphaFunc(GLenum func, GLclampf ref) {Con_Printf("glAlphaFunc(func, ref)\n");} void wrapglArrayElement(GLint i) {Con_Printf("glArrayElement(i)\n");} void wrapglAttachShader(GLuint containerObj, GLuint obj) {glAttachShader(containerObj, obj);} -void wrapglBegin(GLenum mode) {Con_Printf("glBegin(mode)\n");} +//void wrapglBegin(GLenum mode) {Con_Printf("glBegin(mode)\n");} //void wrapglBeginQuery(GLenum target, GLuint qid) {glBeginQuery(target, qid);} void wrapglBindAttribLocation(GLuint programObj, GLuint index, const GLchar *name) {glBindAttribLocation(programObj, index, name);} void wrapglBindFragDataLocation(GLuint programObj, GLuint index, const GLchar *name) {glBindFragDataLocation(programObj, index, name);} @@ -1302,7 +1300,7 @@ void wrapglDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *i void wrapglEnable(GLenum cap) {glEnable(cap);} void wrapglEnableClientState(GLenum cap) {Con_Printf("glEnableClientState(cap)\n");} void wrapglEnableVertexAttribArray(GLuint index) {glEnableVertexAttribArray(index);} -void wrapglEnd(void) {Con_Printf("glEnd()\n");} +//void wrapglEnd(void) {Con_Printf("glEnd()\n");} //void wrapglEndQuery(GLenum target) {glEndQuery(target);} void wrapglFinish(void) {glFinish();} void wrapglFlush(void) {glFlush();} @@ -1353,7 +1351,7 @@ void wrapglMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLflo void wrapglNormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr) {Con_Printf("glNormalPointer(type, stride, ptr)\n");} void wrapglPixelStorei(GLenum pname, GLint param) {glPixelStorei(pname, param);} void wrapglPointSize(GLfloat size) {Con_Printf("glPointSize(size)\n");} -void wrapglPolygonMode(GLenum face, GLenum mode) {Con_Printf("glPolygonMode(face, mode)\n");} +//void wrapglPolygonMode(GLenum face, GLenum mode) {Con_Printf("glPolygonMode(face, mode)\n");} void wrapglPolygonOffset(GLfloat factor, GLfloat units) {glPolygonOffset(factor, units);} void wrapglPolygonStipple(const GLubyte *mask) {Con_Printf("glPolygonStipple(mask)\n");} void wrapglReadBuffer(GLenum mode) {Con_Printf("glReadBuffer(mode)\n");} @@ -1471,7 +1469,7 @@ void GLES_Init(void) qglAlphaFunc = wrapglAlphaFunc; qglArrayElement = wrapglArrayElement; qglAttachShader = wrapglAttachShader; - qglBegin = wrapglBegin; +// qglBegin = wrapglBegin; // qglBeginQueryARB = wrapglBeginQuery; qglBindAttribLocation = wrapglBindAttribLocation; qglBindFragDataLocation = wrapglBindFragDataLocation; @@ -1523,7 +1521,7 @@ void GLES_Init(void) qglEnable = wrapglEnable; qglEnableClientState = wrapglEnableClientState; qglEnableVertexAttribArray = wrapglEnableVertexAttribArray; - qglEnd = wrapglEnd; +// qglEnd = wrapglEnd; // qglEndQueryARB = wrapglEndQuery; qglFinish = wrapglFinish; qglFlush = wrapglFlush; @@ -1574,7 +1572,7 @@ void GLES_Init(void) qglNormalPointer = wrapglNormalPointer; qglPixelStorei = wrapglPixelStorei; qglPointSize = wrapglPointSize; - qglPolygonMode = wrapglPolygonMode; +// qglPolygonMode = wrapglPolygonMode; qglPolygonOffset = wrapglPolygonOffset; // qglPolygonStipple = wrapglPolygonStipple; qglReadBuffer = wrapglReadBuffer; @@ -1688,6 +1686,9 @@ void GLES_Init(void) // LordHavoc: report supported extensions Con_DPrintf("\nQuakeC extensions for server and client: %s\nQuakeC extensions for menu: %s\n", vm_sv_extensions, vm_m_extensions ); + + // GLES devices in general do not like GL_BGRA, so use GL_RGBA + vid.forcetextype = TEXTYPE_RGBA; vid.support.gl20shaders = true; vid.support.amd_texture_texture4 = false; @@ -1712,6 +1713,7 @@ void GLES_Init(void) vid.support.ext_texture_compression_s3tc = false; vid.support.ext_texture_edge_clamp = true; vid.support.ext_texture_filter_anisotropic = false; // probably don't want to use it... + vid.support.ext_texture_srgb = false; qglGetIntegerv(GL_MAX_TEXTURE_SIZE, (GLint*)&vid.maxtexturesize_2d); if (vid.support.ext_texture_filter_anisotropic) @@ -1743,6 +1745,8 @@ void GLES_Init(void) Con_DPrintf("Using GLES2.0 rendering path - %i texture matrix, %i texture images, %i texcoords%s\n", vid.texunits, vid.teximageunits, vid.texarrayunits, vid.support.ext_framebuffer_object ? ", shadowmapping supported" : ""); vid.renderpath = RENDERPATH_GLES2; vid.useinterleavedarrays = false; + vid.sRGBcapable2D = false; + vid.sRGBcapable3D = false; // VorteX: set other info (maybe place them in VID_InitMode?) extern cvar_t gl_info_vendor; @@ -1774,9 +1778,6 @@ void VID_Init (void) Cvar_RegisterVariable(&apple_mouse_noaccel); #endif #endif - Cvar_RegisterVariable(&vid_soft); - Cvar_RegisterVariable(&vid_soft_threads); - Cvar_RegisterVariable(&vid_soft_interlace); Cvar_RegisterVariable(&joy_detected); Cvar_RegisterVariable(&joy_enable); Cvar_RegisterVariable(&joy_index); @@ -1821,20 +1822,20 @@ void VID_Init (void) #ifdef WIN32 #include "resource.h" #include -static void VID_SetCaption(void) +static SDL_Surface *VID_WrapSDL_SetVideoMode(int screenwidth, int screenheight, int screenbpp, int screenflags) { - SDL_SysWMinfo info; - HICON icon; - - // set the caption + SDL_Surface *screen = NULL; + SDL_SysWMinfo info; + HICON icon; SDL_WM_SetCaption( gamename, NULL ); - - // get the HWND handle - SDL_VERSION( &info.version ); - if( !SDL_GetWMInfo( &info ) ) - return; - - icon = LoadIcon( GetModuleHandle( NULL ), MAKEINTRESOURCE( IDI_ICON1 ) ); + screen = SDL_SetVideoMode(screenwidth, screenheight, screenbpp, screenflags); + if (screen) + { + // get the HWND handle + SDL_VERSION( &info.version ); + if (SDL_GetWMInfo(&info)) + { + icon = LoadIcon( GetModuleHandle( NULL ), MAKEINTRESOURCE( IDI_ICON1 ) ); #ifndef _W64 //If Windows 64bit data types don't exist #ifndef SetClassLongPtr #define SetClassLongPtr SetClassLong @@ -1846,20 +1847,26 @@ static void VID_SetCaption(void) #define LONG_PTR LONG #endif #endif - SetClassLongPtr( info.window, GCLP_HICON, (LONG_PTR)icon ); -} -static void VID_SetIcon_Pre(void) -{ + SetClassLongPtr( info.window, GCLP_HICON, (LONG_PTR)icon ); + } + } + return screen; } -static void VID_SetIcon_Post(void) +#elif defined(MACOSX) +static SDL_Surface *VID_WrapSDL_SetVideoMode(int screenwidth, int screenheight, int screenbpp, int screenflags) { + SDL_Surface *screen = NULL; + SDL_WM_SetCaption( gamename, NULL ); + screen = SDL_SetVideoMode(screenwidth, screenheight, screenbpp, screenflags); + // we don't use SDL_WM_SetIcon here because the icon in the .app should be used + return screen; } #else // Adding the OS independent XPM version --blub #include "darkplaces.xpm" #include "nexuiz.xpm" static SDL_Surface *icon = NULL; -static void VID_SetIcon_Pre(void) +static SDL_Surface *VID_WrapSDL_SetVideoMode(int screenwidth, int screenheight, int screenbpp, int screenflags) { /* * Somewhat restricted XPM reader. Only supports XPMs saved by GIMP 2.4 at @@ -1873,7 +1880,11 @@ static void VID_SetIcon_Pre(void) char *xpm; char **idata, *data; const SDL_version *version; + SDL_Surface *screen = NULL; + if (icon) + SDL_FreeSurface(icon); + icon = NULL; version = SDL_Linked_Version(); // only use non-XPM icon support in SDL v1.3 and higher // SDL v1.2 does not support "smooth" transparency, and thus is better @@ -1899,14 +1910,14 @@ static void VID_SetIcon_Pre(void) icon = SDL_CreateRGBSurface(SDL_SRCALPHA, width, height, 32, LittleLong(red), LittleLong(green), LittleLong(blue), LittleLong(alpha)); - if(icon == NULL) { + if (icon) + icon->pixels = data; + else + { Con_Printf( "Failed to create surface for the window Icon!\n" "%s\n", SDL_GetError()); free(data); - return; } - - icon->pixels = data; } } @@ -1925,107 +1936,114 @@ static void VID_SetIcon_Pre(void) data = idata[0]; - if(sscanf(data, "%i %i %i %i", &width, &height, &colors, &isize) != 4) + if(sscanf(data, "%i %i %i %i", &width, &height, &colors, &isize) == 4) { - // NOTE: Only 1-char colornames are supported - Con_Printf("Sorry, but this does not even look similar to an XPM.\n"); - return; - } - - if(isize != 1) - { - // NOTE: Only 1-char colornames are supported - Con_Printf("This XPM's palette is either huge or idiotically unoptimized. It's key size is %i\n", isize); - return; - } + if(isize == 1) + { + for(i = 0; i < colors; ++i) + { + unsigned int r, g, b; + char idx; - for(i = 0; i < colors; ++i) - { - unsigned int r, g, b; - char idx; + if(sscanf(idata[i+1], "%c c #%02x%02x%02x", &idx, &r, &g, &b) != 4) + { + char foo[2]; + if(sscanf(idata[i+1], "%c c Non%1[e]", &idx, foo) != 2) // I take the DailyWTF credit for this. --div0 + break; + else + { + palette[i].r = 255; // color key + palette[i].g = 0; + palette[i].b = 255; + thenone = i; // weeeee + palenc[(unsigned char) idx] = i; + } + } + else + { + palette[i].r = r - (r == 255 && g == 0 && b == 255); // change 255/0/255 pink to 254/0/255 for color key + palette[i].g = g; + palette[i].b = b; + palenc[(unsigned char) idx] = i; + } + } - if(sscanf(idata[i+1], "%c c #%02x%02x%02x", &idx, &r, &g, &b) != 4) - { - char foo[2]; - if(sscanf(idata[i+1], "%c c Non%1[e]", &idx, foo) != 2) // I take the DailyWTF credit for this. --div0 + if (i == colors) { - Con_Printf("This XPM's palette looks odd. Can't continue.\n"); - return; + // allocate the image data + data = (char*) malloc(width*height); + + for(j = 0; j < height; ++j) + { + for(i = 0; i < width; ++i) + { + // casting to the safest possible datatypes ^^ + data[j * width + i] = palenc[((unsigned char*)idata[colors+j+1])[i]]; + } + } + + if(icon != NULL) + { + // SDL_FreeSurface should free the data too + // but for completeness' sake... + if(icon->flags & SDL_PREALLOC) + { + free(icon->pixels); + icon->pixels = NULL; // safety + } + SDL_FreeSurface(icon); + } + + icon = SDL_CreateRGBSurface(SDL_SRCCOLORKEY, width, height, 8, 0,0,0,0);// rmask, gmask, bmask, amask); no mask needed + // 8 bit surfaces get an empty palette allocated according to the docs + // so it's a palette image for sure :) no endian check necessary for the mask + + if(icon) + { + icon->pixels = data; + SDL_SetPalette(icon, SDL_PHYSPAL|SDL_LOGPAL, palette, 0, colors); + SDL_SetColorKey(icon, SDL_SRCCOLORKEY, thenone); + } + else + { + Con_Printf( "Failed to create surface for the window Icon!\n" + "%s\n", SDL_GetError()); + free(data); + } } else { - palette[i].r = 255; // color key - palette[i].g = 0; - palette[i].b = 255; - thenone = i; // weeeee + Con_Printf("This XPM's palette looks odd. Can't continue.\n"); } } else { - palette[i].r = r - (r == 255 && g == 0 && b == 255); // change 255/0/255 pink to 254/0/255 for color key - palette[i].g = g; - palette[i].b = b; + // NOTE: Only 1-char colornames are supported + Con_Printf("This XPM's palette is either huge or idiotically unoptimized. It's key size is %i\n", isize); } - - palenc[(unsigned char) idx] = i; } - - // allocate the image data - data = (char*) malloc(width*height); - - for(j = 0; j < height; ++j) - { - for(i = 0; i < width; ++i) - { - // casting to the safest possible datatypes ^^ - data[j * width + i] = palenc[((unsigned char*)idata[colors+j+1])[i]]; - } - } - - if(icon != NULL) + else { - // SDL_FreeSurface should free the data too - // but for completeness' sake... - if(icon->flags & SDL_PREALLOC) - { - free(icon->pixels); - icon->pixels = NULL; // safety - } - SDL_FreeSurface(icon); + // NOTE: Only 1-char colornames are supported + Con_Printf("Sorry, but this does not even look similar to an XPM.\n"); } + } - icon = SDL_CreateRGBSurface(SDL_SRCCOLORKEY, width, height, 8, 0,0,0,0);// rmask, gmask, bmask, amask); no mask needed - // 8 bit surfaces get an empty palette allocated according to the docs - // so it's a palette image for sure :) no endian check necessary for the mask - - if(icon == NULL) { - Con_Printf( "Failed to create surface for the window Icon!\n" - "%s\n", SDL_GetError()); - free(data); - return; - } + if (icon) + SDL_WM_SetIcon(icon, NULL); - icon->pixels = data; - SDL_SetPalette(icon, SDL_PHYSPAL|SDL_LOGPAL, palette, 0, colors); - SDL_SetColorKey(icon, SDL_SRCCOLORKEY, thenone); - } + SDL_WM_SetCaption( gamename, NULL ); + screen = SDL_SetVideoMode(screenwidth, screenheight, screenbpp, screenflags); - SDL_WM_SetIcon(icon, NULL); -} -static void VID_SetIcon_Post(void) -{ #if SDL_MAJOR_VERSION == 1 && SDL_MINOR_VERSION == 2 // LordHavoc: info.info.x11.lock_func and accompanying code do not seem to compile with SDL 1.3 #if SDL_VIDEO_DRIVER_X11 && !SDL_VIDEO_DRIVER_QUARTZ - int j; - char *data; - const SDL_version *version; version = SDL_Linked_Version(); // only use non-XPM icon support in SDL v1.3 and higher // SDL v1.2 does not support "smooth" transparency, and thus is better // off the xpm way - if(!(version->major >= 2 || (version->major == 1 && version->minor >= 3))) + if(screen && (!(version->major >= 2 || (version->major == 1 && version->minor >= 3)))) { // in this case, we did not set the good icon yet SDL_SysWMinfo info; @@ -2070,13 +2088,9 @@ static void VID_SetIcon_Post(void) } #endif #endif + return screen; } - -static void VID_SetCaption(void) -{ - SDL_WM_SetCaption( gamename, NULL ); -} #endif #endif @@ -2142,7 +2156,8 @@ qboolean VID_InitModeGL(viddef_mode_t *mode) mode->fullscreen = true; // hide the menu with SDL_WINDOW_BORDERLESS windowflags |= SDL_WINDOW_FULLSCREEN | SDL_WINDOW_BORDERLESS; -#else +#endif +#ifndef USE_GLES2 if ((qglGetString = (const GLubyte* (GLAPIENTRY *)(GLenum name))GL_GetProcAddress("glGetString")) == NULL) { VID_Shutdown(); @@ -2194,22 +2209,17 @@ qboolean VID_InitModeGL(viddef_mode_t *mode) else SDL_GL_SetAttribute (SDL_GL_SWAP_CONTROL, 0); #else -#ifdef __IPHONEOS__ +#ifdef USE_GLES2 SDL_GL_SetAttribute (SDL_GL_CONTEXT_MAJOR_VERSION, 2); SDL_GL_SetAttribute (SDL_GL_CONTEXT_MINOR_VERSION, 0); SDL_GL_SetAttribute (SDL_GL_RETAINED_BACKING, 1); - // FIXME: get proper resolution from OS somehow (iPad for instance...) - mode->width = 320; - mode->height = 480; #endif #endif video_bpp = mode->bitsperpixel; #if SETVIDEOMODE video_flags = flags; - VID_SetIcon_Pre(); - screen = SDL_SetVideoMode(mode->width, mode->height, mode->bitsperpixel, flags); - VID_SetIcon_Post(); + screen = VID_WrapSDL_SetVideoMode(mode->width, mode->height, mode->bitsperpixel, flags); if (screen == NULL) { Con_Printf("Failed to set video mode to %ix%i: %s\n", mode->width, mode->height, SDL_GetError()); @@ -2240,10 +2250,6 @@ qboolean VID_InitModeGL(viddef_mode_t *mode) vid_softsurface = NULL; vid.softpixels = NULL; -#if SETVIDEOMODE - // set window title - VID_SetCaption(); -#endif // init keyboard SDL_EnableUNICODE( SDL_ENABLE ); // enable key repeat since everyone expects it @@ -2257,7 +2263,7 @@ qboolean VID_InitModeGL(viddef_mode_t *mode) gl_platform = "SDL"; gl_platformextensions = ""; -#ifdef __IPHONEOS__ +#ifdef USE_GLES2 GLES_Init(); #else GL_Init(); @@ -2304,6 +2310,7 @@ qboolean VID_InitModeSoft(viddef_mode_t *mode) int i; #if SETVIDEOMODE int flags = SDL_HWSURFACE; + if(!COM_CheckParm("-noasyncblit")) flags |= SDL_ASYNCBLIT; #else int windowflags = SDL_WINDOW_SHOWN; #endif @@ -2333,9 +2340,7 @@ qboolean VID_InitModeSoft(viddef_mode_t *mode) video_bpp = mode->bitsperpixel; #if SETVIDEOMODE video_flags = flags; - VID_SetIcon_Pre(); - screen = SDL_SetVideoMode(mode->width, mode->height, mode->bitsperpixel, flags); - VID_SetIcon_Post(); + screen = VID_WrapSDL_SetVideoMode(mode->width, mode->height, mode->bitsperpixel, flags); if (screen == NULL) { Con_Printf("Failed to set video mode to %ix%i: %s\n", mode->width, mode->height, SDL_GetError()); @@ -2375,71 +2380,12 @@ qboolean VID_InitModeSoft(viddef_mode_t *mode) return false; } -#if SETVIDEOMODE - // set window title - VID_SetCaption(); -#endif // init keyboard SDL_EnableUNICODE( SDL_ENABLE ); // enable key repeat since everyone expects it SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); - gl_platform = "SDLSoft"; - gl_platformextensions = ""; - - gl_renderer = "DarkPlaces-Soft"; - gl_vendor = "Forest Hale"; - gl_version = "0.0"; - gl_extensions = ""; - - // clear the extension flags - memset(&vid.support, 0, sizeof(vid.support)); - Cvar_SetQuick(&gl_info_extensions, ""); - - vid.forcevbo = false; - vid.support.arb_depth_texture = true; - vid.support.arb_draw_buffers = true; - vid.support.arb_occlusion_query = true; - vid.support.arb_shadow = true; - //vid.support.arb_texture_compression = true; - vid.support.arb_texture_cube_map = true; - vid.support.arb_texture_non_power_of_two = false; - vid.support.arb_vertex_buffer_object = true; - vid.support.ext_blend_subtract = true; - vid.support.ext_draw_range_elements = true; - vid.support.ext_framebuffer_object = true; - vid.support.ext_texture_3d = true; - //vid.support.ext_texture_compression_s3tc = true; - vid.support.ext_texture_filter_anisotropic = true; - vid.support.ati_separate_stencil = true; - - vid.maxtexturesize_2d = 16384; - vid.maxtexturesize_3d = 512; - vid.maxtexturesize_cubemap = 16384; - vid.texunits = 4; - vid.teximageunits = 32; - vid.texarrayunits = 8; - vid.max_anisotropy = 1; - vid.maxdrawbuffers = 4; - - vid.texunits = bound(4, vid.texunits, MAX_TEXTUREUNITS); - vid.teximageunits = bound(16, vid.teximageunits, MAX_TEXTUREUNITS); - vid.texarrayunits = bound(8, vid.texarrayunits, MAX_TEXTUREUNITS); - Con_DPrintf("Using DarkPlaces Software Rasterizer rendering path\n"); - vid.renderpath = RENDERPATH_SOFT; - vid.useinterleavedarrays = false; - - Cvar_SetQuick(&gl_info_vendor, gl_vendor); - Cvar_SetQuick(&gl_info_renderer, gl_renderer); - Cvar_SetQuick(&gl_info_version, gl_version); - Cvar_SetQuick(&gl_info_platform, gl_platform ? gl_platform : ""); - Cvar_SetQuick(&gl_info_driver, gl_driver); - - // LordHavoc: report supported extensions - Con_DPrintf("\nQuakeC extensions for server and client: %s\nQuakeC extensions for menu: %s\n", vm_sv_extensions, vm_m_extensions ); - - // clear to black (loading plaque will be seen over this) - GL_Clear(GL_COLOR_BUFFER_BIT, NULL, 1.0f, 128); + VID_Soft_SharedSetup(); vid_numjoysticks = SDL_NumJoysticks(); vid_numjoysticks = bound(0, vid_numjoysticks, MAX_JOYSTICKS); @@ -2474,7 +2420,7 @@ qboolean VID_InitMode(viddef_mode_t *mode) { if (!SDL_WasInit(SDL_INIT_VIDEO) && SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) Sys_Error ("Failed to init SDL video subsystem: %s", SDL_GetError()); -#ifdef SSE2_PRESENT +#ifdef SSE_POSSIBLE if (vid_soft.integer) return VID_InitModeSoft(mode); else @@ -2489,10 +2435,12 @@ void VID_Shutdown (void) #if SETVIDEOMODE #ifndef WIN32 +#ifndef MACOSX if (icon) SDL_FreeSurface(icon); icon = NULL; #endif +#endif #endif if (vid_softsurface) @@ -2536,7 +2484,7 @@ void VID_Finish (void) appstate = SDL_GetAppState(); vid_hidden = !(appstate & SDL_APPACTIVE); - vid_hasfocus = (appstate & SDL_APPMOUSEFOCUS) && (appstate & SDL_APPINPUTFOCUS); + vid_hasfocus = (appstate & SDL_APPINPUTFOCUS) != 0; #endif vid_activewindow = !vid_hidden && vid_hasfocus; @@ -2549,12 +2497,11 @@ void VID_Finish (void) case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: CHECKGLERROR if (r_speeds.integer == 2 || gl_finish.integer) - { - qglFinish();CHECKGLERROR - } + GL_Finish(); #if SDL_MAJOR_VERSION == 1 && SDL_MINOR_VERSION == 2 #else { @@ -2578,8 +2525,11 @@ void VID_Finish (void) case RENDERPATH_SOFT: DPSOFTRAST_Finish(); #if SETVIDEOMODE +// if (!r_test.integer) + { SDL_BlitSurface(vid_softsurface, NULL, screen, NULL); SDL_Flip(screen); + } #else { SDL_Surface *screen = SDL_GetWindowSurface(window); @@ -2591,6 +2541,8 @@ void VID_Finish (void) case RENDERPATH_D3D9: case RENDERPATH_D3D10: case RENDERPATH_D3D11: + if (r_speeds.integer == 2 || gl_finish.integer) + GL_Finish(); break; } } @@ -2603,7 +2555,7 @@ size_t VID_ListModes(vid_mode_t *modes, size_t maxcount) int bpp = SDL_GetVideoInfo()->vfmt->BitsPerPixel; k = 0; - for(vidmodes = SDL_ListModes(NULL, SDL_FULLSCREEN|SDL_HWSURFACE); *vidmodes; ++vidmodes) + for(vidmodes = SDL_ListModes(NULL, SDL_FULLSCREEN|SDL_HWSURFACE); vidmodes && *vidmodes; ++vidmodes) { if(k >= maxcount) break;