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 // sort polygons
rs_hw_batchsorttime = I_GetTimeMicros(); 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); qsort(polygonIndexArray, polygonArraySize, sizeof(unsigned int), comparePolygons);
else else
qsort(polygonIndexArray, polygonArraySize, sizeof(unsigned int), comparePolygonsNoShaders); qsort(polygonIndexArray, polygonArraySize, sizeof(unsigned int), comparePolygonsNoShaders);
@ -272,8 +272,8 @@ void HWR_RenderBatches(void)
// and a color array could replace the color calls. // and a color array could replace the color calls.
// set state for first batch // 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); HWD.pfnSetShader(currentShader);
} }
@ -355,7 +355,7 @@ void HWR_RenderBatches(void)
nextSurfaceInfo = polygonArray[nextIndex].surf; nextSurfaceInfo = polygonArray[nextIndex].surf;
if (nextPolyFlags & PF_NoTexture) if (nextPolyFlags & PF_NoTexture)
nextTexture = 0; nextTexture = 0;
if (currentShader != nextShader) if (currentShader != nextShader && cv_grshaders.value && gr_shadersavailable)
{ {
changeState = true; changeState = true;
changeShader = true; changeShader = true;
@ -370,7 +370,7 @@ void HWR_RenderBatches(void)
changeState = true; changeState = true;
changePolyFlags = 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 || if (currentSurfaceInfo.PolyColor.rgba != nextSurfaceInfo.PolyColor.rgba ||
currentSurfaceInfo.TintColor.rgba != nextSurfaceInfo.TintColor.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]); EXPORT void HWRAPI(PostImgRedraw) (float points[SCREENVERTS][SCREENVERTS][2]);
// jimita // jimita
EXPORT void HWRAPI(LoadShaders) (void); EXPORT boolean HWRAPI(LoadShaders) (void);
EXPORT void HWRAPI(KillShaders) (void); EXPORT void HWRAPI(KillShaders) (void);
EXPORT void HWRAPI(SetShader) (int shader); EXPORT void HWRAPI(SetShader) (int shader);
EXPORT void HWRAPI(UnSetShader) (void); EXPORT void HWRAPI(UnSetShader) (void);
EXPORT void HWRAPI(SetShaderInfo) (hwdshaderinfo_t info, INT32 value); 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(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 // 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_batchsorttime = 0;
int rs_hw_batchdrawtime = 0; int rs_hw_batchdrawtime = 0;
boolean gr_shadersavailable = true;
// ========================================================================== // ==========================================================================
// Lighting // 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; fade_color.rgba = (colormap != NULL) ? (UINT32)colormap->fadergba : GL_DEFAULTFOG;
// Crappy backup coloring if you can't do shaders // 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. // be careful, this may get negative for high lightlevel values.
float tint_alpha, fade_alpha; 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; realcolor.rgba = (colormap != NULL) ? colormap->rgba : GL_DEFAULTMIX;
if (cv_grshaders.value) if (cv_grshaders.value && gr_shadersavailable)
{ {
surfcolor.s.alpha = (255 - light); surfcolor.s.alpha = (255 - light);
} }
@ -5887,7 +5889,8 @@ void HWR_Startup(void)
// read every custom shader // read every custom shader
for (i = 0; i < numwadfiles; i++) for (i = 0; i < numwadfiles; i++)
HWR_ReadShaders(i, (wadfiles[i]->type == RET_PK3)); HWR_ReadShaders(i, (wadfiles[i]->type == RET_PK3));
HWR_LoadShaders(); if (!HWR_LoadShaders())
gr_shadersavailable = false;
} }
if (rendermode == render_opengl) if (rendermode == render_opengl)
@ -6190,9 +6193,9 @@ static inline UINT16 HWR_CheckShader(UINT16 wadnum)
return INT16_MAX; return INT16_MAX;
} }
void HWR_LoadShaders(void) boolean HWR_LoadShaders(void)
{ {
HWD.pfnInitCustomShaders(); return HWD.pfnInitCustomShaders();
} }
void HWR_ReadShaders(UINT16 wadnum, boolean PK3) 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 UINT8 HWR_FogBlockAlpha(INT32 light, extracolormap_t *colormap); // Let's see if this can work
void HWR_ReadShaders(UINT16 wadnum, boolean PK3); void HWR_ReadShaders(UINT16 wadnum, boolean PK3);
void HWR_LoadShaders(void); boolean HWR_LoadShaders(void);
extern CV_PossibleValue_t granisotropicmode_cons_t[]; 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_batchsorttime;
extern int rs_hw_batchdrawtime; extern int rs_hw_batchdrawtime;
extern boolean gr_shadersavailable;
#endif #endif

View File

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