1 /**
2  * @file
3  * @brief Error checking function
4  */
5 
6 /*
7 Copyright (C) 2002-2013 UFO: Alien Invasion.
8 
9 This program is free software; you can redistribute it and/or
10 modify it under the terms of the GNU General Public License
11 as published by the Free Software Foundation; either version 2
12 of the License, or (at your option) any later version.
13 
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 
18 See the GNU General Public License for more details.
19 
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
23 
24 */
25 
26 #pragma once
27 
28 #define R_CheckError() R_CheckErrorDebug(__FILE__, __LINE__, __PRETTY_FUNCTION__)
29 #define GL_ERROR_TRANSLATE(e) case e: return #e;
30 
R_TranslateError(GLenum error)31 static inline const char* R_TranslateError (GLenum error)
32 {
33 	switch (error) {
34 	/* openGL errors */
35 	GL_ERROR_TRANSLATE(GL_INVALID_ENUM)
36 	GL_ERROR_TRANSLATE(GL_INVALID_VALUE)
37 	GL_ERROR_TRANSLATE(GL_INVALID_OPERATION)
38 	GL_ERROR_TRANSLATE(GL_OUT_OF_MEMORY)
39 	GL_ERROR_TRANSLATE(GL_STACK_OVERFLOW)
40 	GL_ERROR_TRANSLATE(GL_STACK_UNDERFLOW)
41 	GL_ERROR_TRANSLATE(GL_INVALID_FRAMEBUFFER_OPERATION_EXT)
42 	/* framebuffer-extension specific errors */
43 	GL_ERROR_TRANSLATE(GL_FRAMEBUFFER_UNSUPPORTED_EXT)
44 	GL_ERROR_TRANSLATE(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT)
45 	GL_ERROR_TRANSLATE(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT)
46 	GL_ERROR_TRANSLATE(GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT)
47 	GL_ERROR_TRANSLATE(GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT)
48 #ifndef GL_VERSION_ES_CM_1_0
49 #ifdef GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT
50 	GL_ERROR_TRANSLATE(GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT)
51 #endif
52 	GL_ERROR_TRANSLATE(GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT)
53 	GL_ERROR_TRANSLATE(GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT)
54 #endif
55 	default:
56 		return "UNKNOWN";
57 	}
58 }
59 
60 /**
61  * @brief Checks for opengl errors
62  */
R_CheckErrorDebug(const char * file,int line,const char * function)63 static int R_CheckErrorDebug (const char* file, int line, const char* function)
64 {
65 	int ret = 0;
66 	if (r_checkerror && r_checkerror->integer) {
67 		/* check gl errors (can return multiple errors) */
68 		for (;;) {
69 			GLenum error = glGetError();
70 			if (error != GL_NO_ERROR) {
71 				Com_Printf("OpenGL err: %s (%d): %s %s (0x%X)\n", file, line,
72 						function, R_TranslateError(error), error);
73 				ret++;
74 			}
75 			else
76 				break;
77 		}
78 		/* check framebuffer errors (can *NOT* return multiple errors)*/
79 		if (qglCheckFramebufferStatusEXT) {
80 			GLenum error = qglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
81 			if (error != GL_FRAMEBUFFER_COMPLETE_EXT) {
82 				Com_Printf("OpenGL FBO err: %s (%d): %s %s (0x%X)\n", file, line,
83 						function, R_TranslateError(error), error);
84 				ret++;
85 			}
86 		}
87 	} else {
88 		glGetError();
89 	}
90 
91 	return ret;
92 }
93