Merge pull request #680 from rg3/vk_restart_tweaks

Vulkan restart tweaks
This commit is contained in:
Yamagi 2021-03-31 19:36:18 +02:00 committed by GitHub
commit 557668c35e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 44 additions and 19 deletions

View File

@ -145,6 +145,7 @@ extern cvar_t *vk_pixel_size;
extern cvar_t *r_fixsurfsky;
extern cvar_t *vid_fullscreen;
extern cvar_t *vid_renderer;
extern cvar_t *vid_gamma;
extern int c_visible_lightmaps;

View File

@ -248,3 +248,4 @@ int Hunk_End (void);
void Hunk_Free (void *base);
void Mod_FreeAll (void);
void Mod_FreeModelsKnown (void);

View File

@ -1634,6 +1634,7 @@ void QVk_WaitAndShutdownAll (void)
}
Mod_FreeAll();
Mod_FreeModelsKnown();
Vk_ShutdownImages();
QVk_Shutdown();
}
@ -1644,6 +1645,7 @@ void QVk_Restart(void)
if (!QVk_Init())
ri.Sys_Error(ERR_FATAL, "Unable to restart Vulkan renderer");
QVk_PostInit();
vid_renderer->modified = true;
}
void QVk_PostInit(void)
@ -2077,7 +2079,8 @@ VkResult QVk_EndFrame(qboolean force)
{
// continue only if QVk_BeginFrame() had been previously issued
if (!vk_frameStarted)
return VK_NOT_READY;
return VK_SUCCESS;
// this may happen if Sys_Error is issued mid-frame, so we need to properly advance the draw pipeline
if (force)
{

View File

@ -101,7 +101,7 @@ void Mod_Reallocate (void)
models_known_max *= 2;
// free up
Mod_FreeAll();
free(models_known);
Mod_FreeModelsKnown();
}
if (models_known_max < (mod_max * 4))
@ -177,6 +177,17 @@ void Mod_FreeAll (void)
}
}
/*
================
Mod_FreeModelsKnown
================
*/
void Mod_FreeModelsKnown (void)
{
free(models_known);
models_known = NULL;
}
/*
===============================================================================

View File

@ -130,6 +130,7 @@ cvar_t *vk_nolerp_list;
cvar_t *r_fixsurfsky;
cvar_t *vid_fullscreen;
cvar_t *vid_renderer;
cvar_t *vid_gamma;
static cvar_t *viewsize;
@ -1194,6 +1195,7 @@ R_Register( void )
ri.Cvar_Set("r_msaa_samples", "0");
vid_fullscreen = ri.Cvar_Get("vid_fullscreen", "0", CVAR_ARCHIVE);
vid_renderer = ri.Cvar_Get("vid_renderer", "gl1", CVAR_ARCHIVE);
vid_gamma = ri.Cvar_Get("vid_gamma", "1.0", CVAR_ARCHIVE);
viewsize = ri.Cvar_Get("viewsize", "100", CVAR_ARCHIVE);
@ -1376,7 +1378,8 @@ RE_BeginFrame( float camera_separation )
world_rendered = false;
// if ri.Sys_Error() had been issued mid-frame, we might end up here without properly submitting the image, so call QVk_EndFrame to be safe
QVk_EndFrame(true);
if (QVk_EndFrame(true) != VK_SUCCESS)
vk_restartNeeded = true;
/*
** change modes if necessary
@ -1407,21 +1410,10 @@ RE_BeginFrame( float camera_separation )
}
}
if (vk_restartNeeded)
{
QVk_Restart();
vk_restartNeeded = false;
}
for (;;)
{
VkResult swapChainValid = QVk_BeginFrame(&vk_viewport, &vk_scissor);
if (swapChainValid == VK_SUCCESS)
break;
QVk_Restart();
}
QVk_BeginRenderpass(RP_WORLD);
if (QVk_BeginFrame(&vk_viewport, &vk_scissor) != VK_SUCCESS)
vk_restartNeeded = true;
else
QVk_BeginRenderpass(RP_WORLD);
}
/*
@ -1432,9 +1424,17 @@ RE_EndFrame
static void
RE_EndFrame( void )
{
QVk_EndFrame(false);
if (QVk_EndFrame(false) != VK_SUCCESS)
vk_restartNeeded = true;
// world has not rendered yet
world_rendered = false;
if (vk_restartNeeded)
{
QVk_Restart();
vk_restartNeeded = false;
}
}
/*

View File

@ -486,9 +486,18 @@ VID_CheckChanges(void)
}
}
// Ignore possible changes in vid_renderer above.
vid_renderer->modified = false;
// Unblock the client.
cls.disable_screen = false;
}
if (vid_renderer->modified)
{
vid_renderer->modified = false;
cl.refresh_prepped = false;
}
}
/*