Merge branch 'shaderless-support-next' into 'next'

Backwards compatibility for shaderless hardware

See merge request STJr/SRB2!1003
This commit is contained in:
Nev3r 2020-06-18 13:49:09 -04:00
commit 8063814f1c
5 changed files with 27 additions and 19 deletions

View File

@ -250,7 +250,7 @@ void HWR_RenderBatches(void)
// sort polygons
rs_hw_batchsorttime = I_GetTimeMicros();
if (cv_grshaders.value) // TODO also have the shader availability check here when its done
if (cv_grshaders.value && gr_shadersavailable)
qsort(polygonIndexArray, polygonArraySize, sizeof(unsigned int), comparePolygons);
else
qsort(polygonIndexArray, polygonArraySize, sizeof(unsigned int), comparePolygonsNoShaders);
@ -272,8 +272,8 @@ void HWR_RenderBatches(void)
// and a color array could replace the color calls.
// set state for first batch
if (cv_grshaders.value) // TODO also have the shader availability check here when its done
if (cv_grshaders.value && gr_shadersavailable)
{
HWD.pfnSetShader(currentShader);
}
@ -355,7 +355,7 @@ void HWR_RenderBatches(void)
nextSurfaceInfo = polygonArray[nextIndex].surf;
if (nextPolyFlags & PF_NoTexture)
nextTexture = 0;
if (currentShader != nextShader)
if (currentShader != nextShader && cv_grshaders.value && gr_shadersavailable)
{
changeState = true;
changeShader = true;
@ -370,7 +370,7 @@ void HWR_RenderBatches(void)
changeState = true;
changePolyFlags = true;
}
if (cv_grshaders.value) // TODO also have the shader availability check here when its done
if (cv_grshaders.value && gr_shadersavailable)
{
if (currentSurfaceInfo.PolyColor.rgba != nextSurfaceInfo.PolyColor.rgba ||
currentSurfaceInfo.TintColor.rgba != nextSurfaceInfo.TintColor.rgba ||

View File

@ -68,14 +68,14 @@ EXPORT void HWRAPI(DrawScreenFinalTexture) (int width, int height);
EXPORT void HWRAPI(PostImgRedraw) (float points[SCREENVERTS][SCREENVERTS][2]);
// jimita
EXPORT void HWRAPI(LoadShaders) (void);
EXPORT boolean HWRAPI(LoadShaders) (void);
EXPORT void HWRAPI(KillShaders) (void);
EXPORT void HWRAPI(SetShader) (int shader);
EXPORT void HWRAPI(UnSetShader) (void);
EXPORT void HWRAPI(SetShaderInfo) (hwdshaderinfo_t info, INT32 value);
EXPORT void HWRAPI(LoadCustomShader) (int number, char *shader, size_t size, boolean fragment);
EXPORT void HWRAPI(InitCustomShaders) (void);
EXPORT boolean HWRAPI(InitCustomShaders) (void);
// ==========================================================================
// HWR DRIVER OBJECT, FOR CLIENT PROGRAM

View File

@ -162,6 +162,8 @@ int rs_hw_numcolors = 0;
int rs_hw_batchsorttime = 0;
int rs_hw_batchdrawtime = 0;
boolean gr_shadersavailable = true;
// ==========================================================================
// Lighting
@ -176,7 +178,7 @@ void HWR_Lighting(FSurfaceInfo *Surface, INT32 light_level, extracolormap_t *col
fade_color.rgba = (colormap != NULL) ? (UINT32)colormap->fadergba : GL_DEFAULTFOG;
// Crappy backup coloring if you can't do shaders
if (!cv_grshaders.value)
if (!cv_grshaders.value || !gr_shadersavailable)
{
// be careful, this may get negative for high lightlevel values.
float tint_alpha, fade_alpha;
@ -227,7 +229,7 @@ UINT8 HWR_FogBlockAlpha(INT32 light, extracolormap_t *colormap) // Let's see if
realcolor.rgba = (colormap != NULL) ? colormap->rgba : GL_DEFAULTMIX;
if (cv_grshaders.value)
if (cv_grshaders.value && gr_shadersavailable)
{
surfcolor.s.alpha = (255 - light);
}
@ -5887,7 +5889,8 @@ void HWR_Startup(void)
// read every custom shader
for (i = 0; i < numwadfiles; i++)
HWR_ReadShaders(i, (wadfiles[i]->type == RET_PK3));
HWR_LoadShaders();
if (!HWR_LoadShaders())
gr_shadersavailable = false;
}
if (rendermode == render_opengl)
@ -6190,9 +6193,9 @@ static inline UINT16 HWR_CheckShader(UINT16 wadnum)
return INT16_MAX;
}
void HWR_LoadShaders(void)
boolean HWR_LoadShaders(void)
{
HWD.pfnInitCustomShaders();
return HWD.pfnInitCustomShaders();
}
void HWR_ReadShaders(UINT16 wadnum, boolean PK3)

View File

@ -70,7 +70,7 @@ void HWR_Lighting(FSurfaceInfo *Surface, INT32 light_level, extracolormap_t *col
UINT8 HWR_FogBlockAlpha(INT32 light, extracolormap_t *colormap); // Let's see if this can work
void HWR_ReadShaders(UINT16 wadnum, boolean PK3);
void HWR_LoadShaders(void);
boolean HWR_LoadShaders(void);
extern CV_PossibleValue_t granisotropicmode_cons_t[];
@ -124,4 +124,6 @@ extern int rs_hw_numcolors;
extern int rs_hw_batchsorttime;
extern int rs_hw_batchdrawtime;
extern boolean gr_shadersavailable;
#endif

View File

@ -866,12 +866,14 @@ void SetupGLFunc4(void)
}
// jimita
EXPORT void HWRAPI(LoadShaders) (void)
EXPORT boolean HWRAPI(LoadShaders) (void)
{
#ifdef GL_SHADERS
GLuint gl_vertShader, gl_fragShader;
GLint i, result;
if (!pglUseProgram) return false;
gl_customvertexshaders[0] = NULL;
gl_customfragmentshaders[0] = NULL;
@ -993,6 +995,7 @@ EXPORT void HWRAPI(LoadShaders) (void)
#undef GETUNI
}
#endif
return true;
}
//
@ -1023,6 +1026,7 @@ EXPORT void HWRAPI(SetShaderInfo) (hwdshaderinfo_t info, INT32 value)
EXPORT void HWRAPI(LoadCustomShader) (int number, char *shader, size_t size, boolean fragment)
{
#ifdef GL_SHADERS
if (!pglUseProgram) return;
if (number < 1 || number > MAXSHADERS)
I_Error("LoadCustomShader(): cannot load shader %d (max %d)", number, MAXSHADERS);
@ -1046,11 +1050,11 @@ EXPORT void HWRAPI(LoadCustomShader) (int number, char *shader, size_t size, boo
#endif
}
EXPORT void HWRAPI(InitCustomShaders) (void)
EXPORT boolean HWRAPI(InitCustomShaders) (void)
{
#ifdef GL_SHADERS
KillShaders();
LoadShaders();
return LoadShaders();
#endif
}
@ -1078,6 +1082,7 @@ EXPORT void HWRAPI(UnSetShader) (void)
#ifdef GL_SHADERS
gl_shadersenabled = false;
gl_currentshaderprogram = 0;
if (!pglUseProgram) return;
pglUseProgram(0);
#endif
}
@ -1868,7 +1873,7 @@ EXPORT void HWRAPI(SetTexture) (FTextureInfo *pTexInfo)
static void *Shader_Load(FSurfaceInfo *Surface, GLRGBAFloat *poly, GLRGBAFloat *tint, GLRGBAFloat *fade)
{
#ifdef GL_SHADERS
if (gl_shadersenabled)
if (gl_shadersenabled && pglUseProgram)
{
gl_shaderprogram_t *shader = &gl_shaderprograms[gl_currentshaderprogram];
if (shader->program)
@ -1884,8 +1889,6 @@ static void *Shader_Load(FSurfaceInfo *Surface, GLRGBAFloat *poly, GLRGBAFloat *
else
pglUseProgram(0);
}
else
pglUseProgram(0);
#else
(void)Surface;
(void)poly;