diff --git a/src/hardware/hw_batching.c b/src/hardware/hw_batching.c
index 67cda03058309ba15f48231b179e4bb83ec7eb10..5c5379f6ddee431a9e3eb0948898a51838d3b099 100644
--- a/src/hardware/hw_batching.c
+++ b/src/hardware/hw_batching.c
@@ -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 ||
diff --git a/src/hardware/hw_drv.h b/src/hardware/hw_drv.h
index 50ac6cbec16fb0220fe8aec64da62a3c564dd103..2e4ea10ccf9a714a32475ca96abd889899548e18 100644
--- a/src/hardware/hw_drv.h
+++ b/src/hardware/hw_drv.h
@@ -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
diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c
index 3163b701aff4cb49b361a6e3e71216b59e72111a..b89ffe9e6d595558cad558c5b86d4a8bf924379a 100644
--- a/src/hardware/hw_main.c
+++ b/src/hardware/hw_main.c
@@ -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)
diff --git a/src/hardware/hw_main.h b/src/hardware/hw_main.h
index 4aadc2c3977ca46c4b0434088b3327701192eab1..21bd7ddb3ed12081428f8eeb74667083db0340e3 100644
--- a/src/hardware/hw_main.h
+++ b/src/hardware/hw_main.h
@@ -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
diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c
index 6fe9f7a36627fb9c5cae862e5124b059e59e0cd3..41ec703bc46c203c0eb77b822442b4c8495a0a38 100644
--- a/src/hardware/r_opengl/r_opengl.c
+++ b/src/hardware/r_opengl/r_opengl.c
@@ -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;