]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - r_modules.c
add DeviceLost and DeviceRestored functions to R_Modules system
[xonotic/darkplaces.git] / r_modules.c
index 969519a6f00c5cae30d6368f7ab0b093bff1c759..541ef0439ea11ef6b811d0017c1c754b7a40c1d6 100644 (file)
@@ -1,7 +1,7 @@
 
 #include "quakedef.h"
 
-#define MAXRENDERMODULES 64
+#define MAXRENDERMODULES 20
 
 typedef struct rendermodule_s
 {
@@ -10,6 +10,8 @@ typedef struct rendermodule_s
        void(*start)(void);
        void(*shutdown)(void);
        void(*newmap)(void);
+       void(*devicelost)(void);
+       void(*devicerestored)(void);
 }
 rendermodule_t;
 
@@ -17,12 +19,10 @@ rendermodule_t rendermodule[MAXRENDERMODULES];
 
 void R_Modules_Init(void)
 {
-       int i;
-       for (i = 0;i < MAXRENDERMODULES;i++)
-               rendermodule[i].name = NULL;
+       Cmd_AddCommand("r_restart", R_Modules_Restart, "restarts renderer");
 }
 
-void R_RegisterModule(char *name, void(*start)(void), void(*shutdown)(void), void(*newmap)(void))
+void R_RegisterModule(char *name, void(*start)(void), void(*shutdown)(void), void(*newmap)(void), void(*devicelost)(void), void(*devicerestored)(void))
 {
        int i;
        for (i = 0;i < MAXRENDERMODULES;i++)
@@ -30,15 +30,20 @@ void R_RegisterModule(char *name, void(*start)(void), void(*shutdown)(void), voi
                if (rendermodule[i].name == NULL)
                        break;
                if (!strcmp(name, rendermodule[i].name))
-                       Sys_Error("R_RegisterModule: module \"%s\" registered twice\n", name);
+               {
+                       Con_Printf("R_RegisterModule: module \"%s\" registered twice\n", name);
+                       return;
+               }
        }
        if (i >= MAXRENDERMODULES)
-               Sys_Error("R_RegisterModule: ran out of renderer module slots (%i)\n", MAXRENDERMODULES);
+               Sys_Error("R_RegisterModule: ran out of renderer module slots (%i)", MAXRENDERMODULES);
        rendermodule[i].active = 0;
        rendermodule[i].name = name;
        rendermodule[i].start = start;
        rendermodule[i].shutdown = shutdown;
        rendermodule[i].newmap = newmap;
+       rendermodule[i].devicelost = devicelost;
+       rendermodule[i].devicerestored = devicerestored;
 }
 
 void R_Modules_Start(void)
@@ -49,7 +54,10 @@ void R_Modules_Start(void)
                if (rendermodule[i].name == NULL)
                        continue;
                if (rendermodule[i].active)
-                       Sys_Error("R_StartModules: module \"%s\" already active\n", rendermodule[i].name);
+               {
+                       Con_Printf ("R_StartModules: module \"%s\" already active\n", rendermodule[i].name);
+                       continue;
+               }
                rendermodule[i].active = 1;
                rendermodule[i].start();
        }
@@ -58,7 +66,8 @@ void R_Modules_Start(void)
 void R_Modules_Shutdown(void)
 {
        int i;
-       for (i = 0;i < MAXRENDERMODULES;i++)
+       // shutdown in reverse
+       for (i = MAXRENDERMODULES - 1;i >= 0;i--)
        {
                if (rendermodule[i].name == NULL)
                        continue;
@@ -71,6 +80,8 @@ void R_Modules_Shutdown(void)
 
 void R_Modules_Restart(void)
 {
+       Host_StartVideo();
+       Con_Print("restarting renderer\n");
        R_Modules_Shutdown();
        R_Modules_Start();
 }
@@ -78,6 +89,7 @@ void R_Modules_Restart(void)
 void R_Modules_NewMap(void)
 {
        int i;
+       R_SkinFrame_PrepareForPurge();
        for (i = 0;i < MAXRENDERMODULES;i++)
        {
                if (rendermodule[i].name == NULL)
@@ -86,4 +98,37 @@ void R_Modules_NewMap(void)
                        continue;
                rendermodule[i].newmap();
        }
+       R_SkinFrame_Purge();
+}
+
+void R_Modules_DeviceLost(void)
+{
+       int i;
+       for (i = 0;i < MAXRENDERMODULES;i++)
+       {
+               if (rendermodule[i].name == NULL)
+                       continue;
+               if (!rendermodule[i].active)
+                       continue;
+               if (!rendermodule[i].devicelost)
+                       continue;
+               rendermodule[i].devicelost();
+       }
 }
+
+
+void R_Modules_DeviceRestored(void)
+{
+       int i;
+       for (i = 0;i < MAXRENDERMODULES;i++)
+       {
+               if (rendermodule[i].name == NULL)
+                       continue;
+               if (!rendermodule[i].active)
+                       continue;
+               if (!rendermodule[i].devicerestored)
+                       continue;
+               rendermodule[i].devicerestored();
+       }
+}
+