X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=vid_shared.c;h=620a757a4d3bee2055bcce6bd6c5db03d370fbe9;hb=4bb49ed5cd51849bd95bdd0bf973e09726edd254;hp=14498edfc0e1fc32e91825e3965ee6fe135f5143;hpb=9d9d545b49f6924d1bc35e5048bd39817ffd9444;p=xonotic%2Fdarkplaces.git diff --git a/vid_shared.c b/vid_shared.c index 14498edf..620a757a 100644 --- a/vid_shared.c +++ b/vid_shared.c @@ -14,6 +14,7 @@ qboolean in_client_mouse = true; // AK where should it be placed ? float in_mouse_x, in_mouse_y; +float in_windowmouse_x, in_windowmouse_y; // value of GL_MAX_TEXTURE__SIZE int gl_max_texture_size = 0; @@ -62,6 +63,8 @@ int gl_support_fragment_shader = false; int gl_support_arb_vertex_buffer_object = false; //GL_ARB_texture_compression int gl_support_texture_compression = false; +//GL_ARB_occlusion_query +int gl_support_arb_occlusion_query = false; // LordHavoc: if window is hidden, don't update screen qboolean vid_hidden = true; @@ -381,6 +384,15 @@ void (GLAPIENTRY *qglCompressedTexSubImage2DARB)(GLenum target, GLint level, GLi void (GLAPIENTRY *qglCompressedTexSubImage1DARB)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); void (GLAPIENTRY *qglGetCompressedTexImageARB)(GLenum target, GLint lod, void *img); +void (GLAPIENTRY *qglGenQueriesARB)(GLsizei n, GLuint *ids); +void (GLAPIENTRY *qglDeleteQueriesARB)(GLsizei n, const GLuint *ids); +GLboolean (GLAPIENTRY *qglIsQueryARB)(GLuint qid); +void (GLAPIENTRY *qglBeginQueryARB)(GLenum target, GLuint qid); +void (GLAPIENTRY *qglEndQueryARB)(GLenum target); +void (GLAPIENTRY *qglGetQueryivARB)(GLenum target, GLenum pname, GLint *params); +void (GLAPIENTRY *qglGetQueryObjectivARB)(GLuint qid, GLenum pname, GLint *params); +void (GLAPIENTRY *qglGetQueryObjectuivARB)(GLuint qid, GLenum pname, GLuint *params); + int GL_CheckExtension(const char *name, const dllfunction_t *funcs, const char *disableparm, int silent) { int failed = false; @@ -397,29 +409,27 @@ int GL_CheckExtension(const char *name, const dllfunction_t *funcs, const char * return false; } - if (strstr(gl_extensions, name) || strstr(gl_platformextensions, name) || (strncmp(name, "GL_", 3) && strncmp(name, "WGL_", 4) && strncmp(name, "GLX_", 4) && strncmp(name, "AGL_", 4))) + if ((name[2] == '_' || name[3] == '_') && !strstr(gl_extensions ? gl_extensions : "", name) && !strstr(gl_platformextensions ? gl_platformextensions : "", name)) + { + Con_DPrint("not detected\n"); + return false; + } + + for (func = funcs;func && func->name != NULL;func++) { - for (func = funcs;func && func->name != NULL;func++) + // functions are cleared before all the extensions are evaluated + if (!(*func->funcvariable = (void *) GL_GetProcAddress(func->name))) { - // functions are cleared before all the extensions are evaluated - if (!(*func->funcvariable = (void *) GL_GetProcAddress(func->name))) - { - if (!silent) - Con_DPrintf("OpenGL extension \"%s\" is missing function \"%s\" - broken driver!\n", name, func->name); - failed = true; - } + if (!silent) + Con_DPrintf("OpenGL extension \"%s\" is missing function \"%s\" - broken driver!\n", name, func->name); + failed = true; } - // delay the return so it prints all missing functions - if (failed) - return false; - Con_DPrint("enabled\n"); - return true; } - else - { - Con_DPrint("not detected\n"); + // delay the return so it prints all missing functions + if (failed) return false; - } + Con_DPrint("enabled\n"); + return true; } static dllfunction_t opengl110funcs[] = @@ -706,6 +716,19 @@ static dllfunction_t texturecompressionfuncs[] = {NULL, NULL} }; +static dllfunction_t occlusionqueryfuncs[] = +{ + {"glGenQueriesARB", (void **) &qglGenQueriesARB}, + {"glDeleteQueriesARB", (void **) &qglDeleteQueriesARB}, + {"glIsQueryARB", (void **) &qglIsQueryARB}, + {"glBeginQueryARB", (void **) &qglBeginQueryARB}, + {"glEndQueryARB", (void **) &qglEndQueryARB}, + {"glGetQueryivARB", (void **) &qglGetQueryivARB}, + {"glGetQueryObjectivARB", (void **) &qglGetQueryObjectivARB}, + {"glGetQueryObjectuivARB", (void **) &qglGetQueryObjectuivARB}, + {NULL, NULL} +}; + void VID_CheckExtensions(void) { gl_stencil = vid_bitsperpixel.integer == 32; @@ -735,6 +758,7 @@ void VID_CheckExtensions(void) gl_support_fragment_shader = false; gl_support_arb_vertex_buffer_object = false; gl_support_texture_compression = false; + gl_support_arb_occlusion_query = false; if (!GL_CheckExtension("OpenGL 1.1.0", opengl110funcs, NULL, false)) Sys_Error("OpenGL 1.1.0 functions not found"); @@ -772,9 +796,6 @@ void VID_CheckExtensions(void) // COMMANDLINEOPTION: GL: -nocubemap disables GL_ARB_texture_cube_map (required for bumpmapping) if ((gl_texturecubemap = GL_CheckExtension("GL_ARB_texture_cube_map", NULL, "-nocubemap", false))) qglGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB, &gl_max_cube_map_texture_size); - // TODO: blacklist this extension on Radeon X1600-X1950 hardware (they support it only with certain filtering/repeat modes) -// COMMANDLINEOPTION: GL: -notexturenonpoweroftwo disables GL_ARB_texture_non_power_of_two (which saves video memory if it is supported, but crashes on some buggy drivers) - gl_support_arb_texture_non_power_of_two = GL_CheckExtension("GL_ARB_texture_non_power_of_two", NULL, "-notexturenonpoweroftwo", false); // COMMANDLINEOPTION: GL: -notexturecompression disables GL_ARB_texture_compression (which saves video memory if it is supported, but can also degrade image quality, see gl_texturecompression cvar documentation for more information) gl_support_texture_compression = GL_CheckExtension("GL_ARB_texture_compression", texturecompressionfuncs, "-notexturecompression", false); // COMMANDLINEOPTION: GL: -nocva disables GL_EXT_compiled_vertex_array (renders faster) @@ -811,6 +832,21 @@ void VID_CheckExtensions(void) if ((gl_support_vertex_shader = GL_CheckExtension("GL_ARB_vertex_shader", vertexshaderfuncs, "-novertexshader", false))) gl_support_fragment_shader = GL_CheckExtension("GL_ARB_fragment_shader", NULL, "-nofragmentshader", false); CHECKGLERROR +#ifndef __APPLE__ + // LordHavoc: this is blocked on Mac OS X because the drivers claim support but often can't accelerate it or crash when used. +// COMMANDLINEOPTION: GL: -notexturenonpoweroftwo disables GL_ARB_texture_non_power_of_two (which saves video memory if it is supported, but crashes on some buggy drivers) + + { + // blacklist this extension on Radeon X1600-X1950 hardware (they support it only with certain filtering/repeat modes) + int val = 0; + if(gl_support_vertex_shader) + qglGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB, &val); + gl_support_arb_texture_non_power_of_two = val > 0 && GL_CheckExtension("GL_ARB_texture_non_power_of_two", NULL, "-notexturenonpoweroftwo", false); + } +#endif + +// COMMANDLINEOPTION: GL: -noocclusionquery disables GL_ARB_occlusion_query (which allows coronas to fade according to visibility, and potentially used for rendering optimizations) + gl_support_arb_occlusion_query = GL_CheckExtension("GL_ARB_occlusion_query", occlusionqueryfuncs, "-noocclusionquery", false); } void Force_CenterView_f (void) @@ -1067,9 +1103,11 @@ void VID_Shared_Init(void) int VID_Mode(int fullscreen, int width, int height, int bpp, int refreshrate, int stereobuffer, int samples) { + int requestedWidth = width; + int requestedHeight = height; cl_ignoremousemoves = 2; - Con_Printf("Initialized Video Mode: %s %dx%dx%dx%dhz%s%s\n", fullscreen ? "fullscreen" : "window", width, height, bpp, refreshrate, stereobuffer ? " stereo" : "", samples > 1 ? va(" (%ix AA)", samples) : ""); - if (VID_InitMode(fullscreen, width, height, bpp, vid_userefreshrate.integer ? max(1, refreshrate) : 0, stereobuffer, samples)) + Con_Printf("Initializing Video Mode: %s %dx%dx%dx%dhz%s%s\n", fullscreen ? "fullscreen" : "window", width, height, bpp, refreshrate, stereobuffer ? " stereo" : "", samples > 1 ? va(" (%ix AA)", samples) : ""); + if (VID_InitMode(fullscreen, &width, &height, bpp, vid_userefreshrate.integer ? max(1, refreshrate) : 0, stereobuffer, samples)) { vid.fullscreen = fullscreen; vid.width = width; @@ -1087,6 +1125,10 @@ int VID_Mode(int fullscreen, int width, int height, int bpp, int refreshrate, in if(vid_userefreshrate.integer) Cvar_SetValueQuick(&vid_refreshrate, refreshrate); Cvar_SetValueQuick(&vid_stereobuffer, stereobuffer); + + if(width != requestedWidth || height != requestedHeight) + Con_Printf("Chose a similar video mode %dx%d instead of the requested mode %dx%d\n", width, height, requestedWidth, requestedHeight); + return true; } else