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