]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_screen.c
only enable SSE if __GNUC__ for the moment... needs fixing later
[xonotic/darkplaces.git] / cl_screen.c
index 3236056d73eb89402f59bd718e82aabae6dcada1..c09ad9ce61583d9d708741f771c412f9dd54b193 100644 (file)
@@ -696,7 +696,7 @@ int speedstringcount, r_timereport_active;
 double r_timereport_temp = 0, r_timereport_current = 0, r_timereport_start = 0;
 int r_speeds_longestitem = 0;
 
-void R_TimeReport(const char *desc)
+void R_TimeReport(char *desc)
 {
        char tempbuf[256];
        int length;
@@ -706,7 +706,7 @@ void R_TimeReport(const char *desc)
                return;
 
        CHECKGLERROR
-       if (r_speeds.integer == 2 && qglFinish)
+       if (r_speeds.integer == 2)
                qglFinish();
        CHECKGLERROR
        r_timereport_temp = r_timereport_current;
@@ -775,7 +775,6 @@ void R_TimeReport_EndFrame(void)
 "%7i lightmap updates (%7i pixels)\n"
 "%4i lights%4i clears%4i scissored%7i light%7i shadow%7i dynamic\n"
 "rendered%6i meshes%8i triangles bloompixels%8i copied%8i drawn\n"
-"updated%5i indexbuffers%8i bytes%5i vertexbuffers%8i bytes\n"
 "%s"
 , loc ? "Location: " : "", loc ? loc->name : ""
 , r_refdef.stats.renders, r_refdef.view.origin[0], r_refdef.view.origin[1], r_refdef.view.origin[2], r_refdef.view.forward[0], r_refdef.view.forward[1], r_refdef.view.forward[2]
@@ -785,7 +784,6 @@ void R_TimeReport_EndFrame(void)
 , r_refdef.stats.lightmapupdates, r_refdef.stats.lightmapupdatepixels
 , r_refdef.stats.lights, r_refdef.stats.lights_clears, r_refdef.stats.lights_scissored, r_refdef.stats.lights_lighttriangles, r_refdef.stats.lights_shadowtriangles, r_refdef.stats.lights_dynamicshadowtriangles
 , r_refdef.stats.meshes, r_refdef.stats.meshes_elements / 3, r_refdef.stats.bloom_copypixels, r_refdef.stats.bloom_drawpixels
-, r_refdef.stats.indexbufferuploadcount, r_refdef.stats.indexbufferuploadsize, r_refdef.stats.vertexbufferuploadcount, r_refdef.stats.vertexbufferuploadsize
 , r_speeds_timestring);
 
                memset(&r_refdef.stats, 0, sizeof(r_refdef.stats));
@@ -1006,14 +1004,14 @@ void SCR_ScreenShot_f (void)
        buffer1 = (unsigned char *)Mem_Alloc(tempmempool, vid.width * vid.height * 4);
        buffer2 = (unsigned char *)Mem_Alloc(tempmempool, vid.width * vid.height * (scr_screenshot_alpha.integer ? 4 : 3));
 
-       if (SCR_ScreenShot (filename, buffer1, buffer2, 0, 0, vid.width, vid.height, false, false, false, jpeg, png, true, scr_screenshot_alpha.integer != 0))
+       if (SCR_ScreenShot (filename, buffer1, buffer2, 0, 0, vid.width, vid.height, false, false, false, jpeg, png, true, scr_screenshot_alpha.integer))
                Con_Printf("Wrote %s\n", filename);
        else
        {
                Con_Printf("Unable to write %s\n", filename);
                if(jpeg || png)
                {
-                       if(SCR_ScreenShot (filename, buffer1, buffer2, 0, 0, vid.width, vid.height, false, false, false, false, false, true, scr_screenshot_alpha.integer != 0))
+                       if(SCR_ScreenShot (filename, buffer1, buffer2, 0, 0, vid.width, vid.height, false, false, false, false, false, true, scr_screenshot_alpha.integer))
                        {
                                strlcpy(filename + strlen(filename) - 3, "tga", 4);
                                Con_Printf("Wrote %s\n", filename);
@@ -1231,8 +1229,7 @@ void SCR_CaptureVideo_VideoFrame(int newframestepframenum)
        CHECKGLERROR
        // speed is critical here, so do saving as directly as possible
 
-       GL_ReadPixelsBGRA(x, y, vid.width, vid.height, cls.capturevideo.screenbuffer);
-
+       qglReadPixels (x, y, vid.width, vid.height, GL_BGRA, GL_UNSIGNED_BYTE, cls.capturevideo.screenbuffer);CHECKGLERROR
        SCR_ScaleDownBGRA (cls.capturevideo.screenbuffer, vid.width, vid.height, cls.capturevideo.outbuffer, width, height);
 
        cls.capturevideo.videoframes(newframestepframenum - cls.capturevideo.framestepframe);
@@ -1314,7 +1311,7 @@ Grab six views for environment mapping tests
 struct envmapinfo_s
 {
        float angles[3];
-       const char *name;
+       char *name;
        qboolean flipx, flipy, flipdiagonaly;
 }
 envmapinfo[12] =
@@ -1477,7 +1474,8 @@ qboolean SCR_ScreenShot(char *filename, unsigned char *buffer1, unsigned char *b
        int     indices[4] = {0,1,2,3}; // BGRA
        qboolean ret;
 
-       GL_ReadPixelsBGRA(x, y, width, height, buffer1);
+       CHECKGLERROR
+       qglReadPixels (x, y, width, height, GL_BGRA, GL_UNSIGNED_BYTE, buffer1);CHECKGLERROR
 
        if(gammacorrect && (scr_screenshot_gammaboost.value != 1 || WANT_SCREENSHOT_HWGAMMA))
        {
@@ -1543,20 +1541,36 @@ qboolean SCR_ScreenShot(char *filename, unsigned char *buffer1, unsigned char *b
 extern void R_UpdateFogColor(void);
 void R_ClearScreen(qboolean fogcolor)
 {
-       float clearcolor[4];
        // clear to black
-       Vector4Clear(clearcolor);
+       CHECKGLERROR
        if (fogcolor)
        {
                R_UpdateFogColor();
-               VectorCopy(r_refdef.fogcolor, clearcolor);
+               qglClearColor(r_refdef.fogcolor[0],r_refdef.fogcolor[1],r_refdef.fogcolor[2],0);CHECKGLERROR
+       }
+       else
+       {
+               qglClearColor(0,0,0,0);CHECKGLERROR
+       }
+       qglClearDepth(1);CHECKGLERROR
+       if (vid.stencil)
+       {
+               // LordHavoc: we use a stencil centered around 128 instead of 0,
+               // to avoid clamping interfering with strange shadow volume
+               // drawing orders
+               qglClearStencil(128);CHECKGLERROR
        }
-       // clear depth is 1.0
-       // LordHavoc: we use a stencil centered around 128 instead of 0,
-       // to avoid clamping interfering with strange shadow volume
-       // drawing orders
        // clear the screen
-       GL_Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | (vid.stencil ? GL_STENCIL_BUFFER_BIT : 0), clearcolor, 1.0f, 128);
+       GL_Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | (vid.stencil ? GL_STENCIL_BUFFER_BIT : 0));
+       // set dithering mode
+       if (gl_dither.integer)
+       {
+               qglEnable(GL_DITHER);CHECKGLERROR
+       }
+       else
+       {
+               qglDisable(GL_DITHER);CHECKGLERROR
+       }
 }
 
 qboolean CL_VM_UpdateView (void);
@@ -1777,7 +1791,7 @@ static void SCR_SetLoadingScreenTexture(void)
                loadingscreentexture_h = vid.height / (float) h;
        }
 
-       loadingscreentexture = R_LoadTexture2D(r_main_texturepool, "loadingscreentexture", w, h, NULL, TEXTYPE_COLORBUFFER, TEXF_RENDERTARGET | TEXF_FORCENEAREST | TEXF_CLAMP, -1, NULL);
+       loadingscreentexture = R_LoadTexture2D(r_main_texturepool, "loadingscreentexture", w, h, NULL, TEXTYPE_COLORBUFFER, TEXF_FORCENEAREST | TEXF_CLAMP, -1, NULL);
        R_Mesh_CopyToTexture(loadingscreentexture, 0, 0, 0, 0, vid.width, vid.height);
 
        loadingscreentexture_vertex3f[2] = loadingscreentexture_vertex3f[5] = loadingscreentexture_vertex3f[8] = loadingscreentexture_vertex3f[11] = 0;
@@ -1897,7 +1911,10 @@ static void SCR_DrawLoadingStack(void)
                GL_DepthRange(0, 1);
                GL_PolygonOffset(0, 0);
                GL_DepthTest(false);
+               R_Mesh_VertexPointer(verts, 0, 0);
+               R_Mesh_ColorPointer(colors, 0, 0);
                R_Mesh_ResetTextureState();
+               R_SetupShader_Generic(NULL, NULL, GL_MODULATE, 1);
                verts[2] = verts[5] = verts[8] = verts[11] = 0;
                verts[0] = verts[9] = 0;
                verts[1] = verts[4] = vid_conheight.integer - scr_loadingscreen_barheight.value;
@@ -1915,9 +1932,7 @@ static void SCR_DrawLoadingStack(void)
                sscanf(scr_loadingscreen_barcolor.string, "%f %f %f", &colors[8], &colors[9], &colors[10]); colors[11] = 1;
                sscanf(scr_loadingscreen_barcolor.string, "%f %f %f", &colors[12], &colors[13], &colors[14]);  colors[15] = 1;
 
-               R_Mesh_PrepareVertices_Generic_Arrays(4, verts, colors, NULL);
-               R_SetupShader_Generic(NULL, NULL, GL_MODULATE, 1);
-               R_Mesh_Draw(0, 4, 0, 2, polygonelement3i, NULL, 0, polygonelement3s, NULL, 0);
+               R_Mesh_Draw(0, 4, 0, 2, polygonelement3i, polygonelement3s, 0, 0);
 
                // make sure everything is cleared, including the progress indicator
                if(loadingscreenheight < 8)
@@ -1936,14 +1951,16 @@ static void SCR_DrawLoadingScreen_SharedSetup (qboolean clear)
        // release mouse grab while loading
        if (!vid.fullscreen)
                VID_SetMouse(false, false, false);
-//     CHECKGLERROR
-       r_refdef.draw2dstage = true;
+       CHECKGLERROR
        R_Viewport_InitOrtho(&viewport, &identitymatrix, 0, 0, vid.width, vid.height, 0, 0, vid_conwidth.integer, vid_conheight.integer, -10, 100, NULL);
        R_SetViewport(&viewport);
-       GL_ColorMask(1,1,1,1);
+       //qglDisable(GL_SCISSOR_TEST);CHECKGLERROR
+       //qglDepthMask(1);CHECKGLERROR
+       qglColorMask(1,1,1,1);CHECKGLERROR
+       qglClearColor(0,0,0,0);CHECKGLERROR
        // when starting up a new video mode, make sure the screen is cleared to black
        if (clear)
-               GL_Clear(GL_COLOR_BUFFER_BIT, NULL, 1.0f, 0);
+               qglClear(GL_COLOR_BUFFER_BIT);CHECKGLERROR
        R_Textures_Frame();
        R_Mesh_Start();
        R_EntityMatrix(&identitymatrix);
@@ -1965,21 +1982,25 @@ static void SCR_DrawLoadingScreen_SharedSetup (qboolean clear)
 static void SCR_DrawLoadingScreen (qboolean clear)
 {
        // we only need to draw the image if it isn't already there
+       GL_Color(1,1,1,1);
        GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        GL_DepthRange(0, 1);
        GL_PolygonOffset(0, 0);
        GL_DepthTest(false);
-       R_Mesh_ResetTextureState();
-       GL_Color(1,1,1,1);
+       R_Mesh_ColorPointer(NULL, 0, 0);
        if(loadingscreentexture)
        {
-               R_Mesh_PrepareVertices_Generic_Arrays(4, loadingscreentexture_vertex3f, NULL, loadingscreentexture_texcoord2f);
+               R_Mesh_VertexPointer(loadingscreentexture_vertex3f, 0, 0);
+               R_Mesh_ResetTextureState();
                R_SetupShader_Generic(loadingscreentexture, NULL, GL_MODULATE, 1);
-               R_Mesh_Draw(0, 4, 0, 2, polygonelement3i, NULL, 0, polygonelement3s, NULL, 0);
+               R_Mesh_TexCoordPointer(0, 2, loadingscreentexture_texcoord2f, 0, 0);
+               R_Mesh_Draw(0, 4, 0, 2, polygonelement3i, polygonelement3s, 0, 0);
        }
-       R_Mesh_PrepareVertices_Generic_Arrays(4, loadingscreenpic_vertex3f, NULL, loadingscreenpic_texcoord2f);
+       R_Mesh_VertexPointer(loadingscreenpic_vertex3f, 0, 0);
+       R_Mesh_ResetTextureState();
        R_SetupShader_Generic(loadingscreenpic->tex, NULL, GL_MODULATE, 1);
-       R_Mesh_Draw(0, 4, 0, 2, polygonelement3i, NULL, 0, polygonelement3s, NULL, 0);
+       R_Mesh_TexCoordPointer(0, 2, loadingscreenpic_texcoord2f, 0, 0);
+       R_Mesh_Draw(0, 4, 0, 2, polygonelement3i, polygonelement3s, 0, 0);
        SCR_DrawLoadingStack();
 }
 
@@ -1988,6 +2009,8 @@ static void SCR_DrawLoadingScreen_SharedFinish (qboolean clear)
        R_Mesh_Finish();
        // refresh
        VID_Finish();
+       // however this IS necessary on Windows Vista
+       qglFinish();
 }
 
 void SCR_UpdateLoadingScreen (qboolean clear)
@@ -2030,8 +2053,7 @@ void SCR_UpdateLoadingScreen (qboolean clear)
        }
        else
        {
-               if (qglDrawBuffer)
-                       qglDrawBuffer(GL_BACK);
+               qglDrawBuffer(GL_BACK);
                SCR_DrawLoadingScreen(clear);
        }
        SCR_DrawLoadingScreen_SharedFinish(clear);
@@ -2070,7 +2092,6 @@ void CL_UpdateScreen(void)
        double rendertime1;
        float conwidth, conheight;
        float f;
-       r_viewport_t viewport;
 
        Sbar_ShowFPS_Update();
 
@@ -2091,10 +2112,7 @@ void CL_UpdateScreen(void)
        }
 
        if (vid_hidden)
-       {
-               VID_Finish();
                return;
-       }
 
        rendertime1 = Sys_DoubleTime();
 
@@ -2136,27 +2154,13 @@ void CL_UpdateScreen(void)
 
        SCR_SetUpToDrawConsole();
 
-       if (qglDrawBuffer)
-       {
-               CHECKGLERROR
-               qglDrawBuffer(GL_BACK);CHECKGLERROR
-               // set dithering mode
-               if (gl_dither.integer)
-               {
-                       qglEnable(GL_DITHER);CHECKGLERROR
-               }
-               else
-               {
-                       qglDisable(GL_DITHER);CHECKGLERROR
-               }
-       }
-
-       R_Viewport_InitOrtho(&viewport, &identitymatrix, 0, 0, vid.width, vid.height, 0, 0, vid_conwidth.integer, vid_conheight.integer, -10, 100, NULL);
-       R_SetViewport(&viewport);
-       GL_ScissorTest(false);
-       GL_ColorMask(1,1,1,1);
-       GL_DepthMask(true);
-
+       CHECKGLERROR
+       qglDrawBuffer(GL_BACK);CHECKGLERROR
+       qglViewport(0, 0, vid.width, vid.height);CHECKGLERROR
+       qglDisable(GL_SCISSOR_TEST);CHECKGLERROR
+       qglDepthMask(1);CHECKGLERROR
+       qglColorMask(1,1,1,1);CHECKGLERROR
+       qglClearColor(0,0,0,0);CHECKGLERROR
        R_ClearScreen(false);
        r_refdef.view.clear = false;
        r_refdef.view.isoverlay = false;
@@ -2190,6 +2194,7 @@ void CL_UpdateScreen(void)
                }
        }
 
+       CHECKGLERROR
        if (R_Stereo_Active())
        {
                matrix4x4_t originalmatrix = r_refdef.view.matrix;
@@ -2234,13 +2239,13 @@ void CL_UpdateScreen(void)
        }
        else
                SCR_DrawScreen();
+       CHECKGLERROR
 
        SCR_CaptureVideo();
 
-       if (qglFlush)
-               qglFlush(); // FIXME: should we really be using qglFlush here?
-
        // quality adjustment according to render time
+       CHECKGLERROR
+       qglFlush(); // FIXME: should we really be using qglFlush here?
        cl_updatescreen_rendertime += ((Sys_DoubleTime() - rendertime1) - cl_updatescreen_rendertime) * bound(0, cl_minfps_fade.value, 1);
        if (cl_minfps.value > 0 && cl_updatescreen_rendertime > 0 && !cls.timedemo && (!cls.capturevideo.active || !cls.capturevideo.realtime))
                cl_updatescreen_quality = 1 / (cl_updatescreen_rendertime * cl_minfps.value);