bool R_SetMode (void) { bool result; viddefContext_t prevCtx; viddefContext_t newCtx; vidmode_t vidmode; Com_Printf("I: setting mode %d\n", vid_mode->integer); /* not values we must restitute */ r_ext_texture_compression->modified = false; viddef.stretch = vid_stretch->integer; /* store old values if new ones will fail */ prevCtx = viddef.context; /* new values */ newCtx = viddef.context; newCtx.mode = vid_mode->integer; newCtx.fullscreen = vid_fullscreen->integer; newCtx.multisample = r_multisample->integer; newCtx.swapinterval = r_swapinterval->integer; if (!VID_GetModeInfo(newCtx.mode, &vidmode)) { Com_Printf("I: invalid mode\n"); Cvar_Set("vid_mode", "-1"); return false; } newCtx.width = vidmode.width; newCtx.height = vidmode.height; result = R_InitGraphics(&newCtx); if (!result) { /* failed, revert */ Com_Printf("Failed to set video mode %dx%d %s.\n", newCtx.width, newCtx.height, (newCtx.fullscreen ? "fullscreen" : "windowed")); result = R_InitGraphics(&prevCtx); if (!result) return false; newCtx = prevCtx; } R_UpdateVidDef(&newCtx); R_ShutdownFBObjects(); R_InitFBObjects(); UI_InvalidateStack(); Com_Printf("I: %dx%d (fullscreen: %s)\n", viddef.context.width, viddef.context.height, viddef.context.fullscreen ? "yes" : "no"); return true; }
/** * @sa R_Init */ void R_Shutdown (void) { const cmdList_t *commands; for (commands = r_commands; commands->name; commands++) Cmd_RemoveCommand(commands->name); R_ShutdownThreads(); R_ShutdownModels(true); R_ShutdownImages(); R_ShutdownPrograms(); R_FontShutdown(); R_ShutdownFBObjects(); /* shut down OS specific OpenGL stuff like contexts, etc. */ Rimp_Shutdown(); }
/** * @brief Re-initializes OpenGL state machine, all textures and renderer variables, this needed when application is put to background on Android. */ void R_ReinitOpenglContext (void) { /* De-allocate old GL state, these functinos will call glDeleteTexture(), so they should go before everything else */ R_FontCleanCache(); R_ShutdownFBObjects(); R_ShutdownPrograms(); R_BeginBuildingLightmaps(); /* This function will also call glDeleteTexture() */ /* Re-initialize GL state */ R_SetDefaultState(); R_InitPrograms(); /* Re-upload all textures */ R_InitMiscTexture(); R_ReloadImages(); /* Re-upload other GL stuff */ R_InitFBObjects(); R_UpdateDefaultMaterial("", "", "", NULL); /* Re-upload the battlescape terrain geometry */ if (!qglBindBuffer) return; for (int tile = 0; tile < r_numMapTiles; tile++) { model_t *mod = r_mapTiles[tile]; int vertind = 0, coordind = 0, tangind = 0; mBspSurface_t *surf = mod->bsp.surfaces; for (int i = 0; i < mod->bsp.numsurfaces; i++, surf++) { vertind += 3 * surf->numedges; coordind += 2 * surf->numedges; tangind += 4 * surf->numedges; } qglGenBuffers(1, &mod->bsp.vertex_buffer); qglBindBuffer(GL_ARRAY_BUFFER, mod->bsp.vertex_buffer); qglBufferData(GL_ARRAY_BUFFER, vertind * sizeof(GLfloat), mod->bsp.verts, GL_STATIC_DRAW); qglGenBuffers(1, &mod->bsp.texcoord_buffer); qglBindBuffer(GL_ARRAY_BUFFER, mod->bsp.texcoord_buffer); qglBufferData(GL_ARRAY_BUFFER, coordind * sizeof(GLfloat), mod->bsp.texcoords, GL_STATIC_DRAW); qglGenBuffers(1, &mod->bsp.lmtexcoord_buffer); qglBindBuffer(GL_ARRAY_BUFFER, mod->bsp.lmtexcoord_buffer); qglBufferData(GL_ARRAY_BUFFER, coordind * sizeof(GLfloat), mod->bsp.lmtexcoords, GL_STATIC_DRAW); qglGenBuffers(1, &mod->bsp.normal_buffer); qglBindBuffer(GL_ARRAY_BUFFER, mod->bsp.normal_buffer); qglBufferData(GL_ARRAY_BUFFER, vertind * sizeof(GLfloat), mod->bsp.normals, GL_STATIC_DRAW); qglGenBuffers(1, &mod->bsp.tangent_buffer); qglBindBuffer(GL_ARRAY_BUFFER, mod->bsp.tangent_buffer); qglBufferData(GL_ARRAY_BUFFER, tangind * sizeof(GLfloat), mod->bsp.tangents, GL_STATIC_DRAW); qglGenBuffers(1, &mod->bsp.index_buffer); qglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mod->bsp.index_buffer); qglBufferData(GL_ELEMENT_ARRAY_BUFFER, mod->bsp.numIndexes * sizeof(GLushort), mod->bsp.indexes, GL_STATIC_DRAW); qglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); for (int i = 0; i < mod->bsp.numsurfaces; i++) R_CreateSurfaceLightmap(&mod->bsp.surfaces[i]); } R_EndBuildingLightmaps(); qglBindBuffer(GL_ARRAY_BUFFER, 0); }