]> git.sesse.net Git - casparcg/blob - common/gl/gl_check.cpp
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
[casparcg] / common / gl / gl_check.cpp
1 ////////////////////////////////////////////////////////////\r
2 //\r
3 // SFML - Simple and Fast Multimedia Library\r
4 // Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com)\r
5 //\r
6 // This software is provided 'as-is', without any express or implied warranty.\r
7 // In no event will the authors be held liable for any damages arising from the use of this software.\r
8 //\r
9 // Permission is granted to anyone to use this software for any purpose,\r
10 // including commercial applications, and to alter it and redistribute it freely,\r
11 // subject to the following restrictions:\r
12 //\r
13 // 1. The origin of this software must not be misrepresented;\r
14 //    you must not claim that you wrote the original software.\r
15 //    If you use this software in a product, an acknowledgment\r
16 //    in the product documentation would be appreciated but is not required.\r
17 //\r
18 // 2. Altered source versions must be plainly marked as such,\r
19 //    and must not be misrepresented as being the original software.\r
20 //\r
21 // 3. This notice may not be removed or altered from any source distribution.\r
22 //\r
23 ////////////////////////////////////////////////////////////\r
24 \r
25 #pragma once\r
26 \r
27 #include "../stdafx.h"\r
28 \r
29 #include "gl_check.h"\r
30 \r
31 #include <GL/glew.h>\r
32 \r
33 #include "../exception/exceptions.h"\r
34 #include "../log/log.h"\r
35 \r
36 #include <boost/lexical_cast.hpp>\r
37 \r
38 namespace caspar { namespace gl {       \r
39 \r
40 void SMFL_GLCheckError(const std::string& expr, const std::string& file, unsigned int line)\r
41 {\r
42         // Get the last error\r
43         GLenum LastErrorCode = GL_NO_ERROR;\r
44 \r
45         for(GLenum ErrorCode = glGetError(); ErrorCode != GL_NO_ERROR; ErrorCode = glGetError())\r
46         {\r
47                 CASPAR_LOG(error) << "OpenGL Error: " << ErrorCode << L" " << glewGetErrorString(ErrorCode);\r
48                 LastErrorCode = ErrorCode;\r
49         }\r
50 \r
51         if (LastErrorCode != GL_NO_ERROR)\r
52         {\r
53                 // Decode the error code\r
54                 switch (LastErrorCode)\r
55                 {\r
56                         case GL_INVALID_ENUM :\r
57                                 BOOST_THROW_EXCEPTION(ogl_invalid_enum()\r
58                                         << msg_info("an unacceptable value has been specified for an enumerated argument")\r
59                                         << errorstr("GL_INVALID_ENUM")\r
60                                         << line_info(line)\r
61                                         << source_info(file));\r
62 \r
63                         case GL_INVALID_VALUE :\r
64                                 BOOST_THROW_EXCEPTION(ogl_invalid_value()\r
65                                         << msg_info("a numeric argument is out of range")\r
66                                         << errorstr("GL_INVALID_VALUE")\r
67                                         << line_info(line)\r
68                                         << source_info(file));\r
69 \r
70                         case GL_INVALID_OPERATION :\r
71                                 BOOST_THROW_EXCEPTION(ogl_invalid_operation()\r
72                                         << msg_info("the specified operation is not allowed in the current state")\r
73                                         << errorstr("GL_INVALID_OPERATION")\r
74                                         << line_info(line)\r
75                                         << source_info(file));\r
76 \r
77                         case GL_STACK_OVERFLOW :\r
78                                 BOOST_THROW_EXCEPTION(ogl_stack_overflow()\r
79                                         << msg_info("this command would cause a stack overflow")\r
80                                         << errorstr("GL_STACK_OVERFLOW")\r
81                                         << line_info(line)\r
82                                         << source_info(file));\r
83 \r
84                         case GL_STACK_UNDERFLOW :\r
85                                 BOOST_THROW_EXCEPTION(ogl_stack_underflow()\r
86                                         << msg_info("this command would cause a stack underflow")\r
87                                         << errorstr("GL_STACK_UNDERFLOW")\r
88                                         << line_info(line)\r
89                                         << source_info(file));\r
90 \r
91                         case GL_OUT_OF_MEMORY :\r
92                                 BOOST_THROW_EXCEPTION(ogl_out_of_memory()\r
93                                         << msg_info("there is not enough memory left to execute the command")\r
94                                         << errorstr("GL_OUT_OF_MEMORY")\r
95                                         << line_info(line)\r
96                                         << source_info(file));\r
97 \r
98                         case GL_INVALID_FRAMEBUFFER_OPERATION_EXT :\r
99                                 BOOST_THROW_EXCEPTION(ogl_stack_underflow()\r
100                                         << msg_info("the object bound to FRAMEBUFFER_BINDING_EXT is not \"framebuffer complete\"")\r
101                                         << errorstr("GL_INVALID_FRAMEBUFFER_OPERATION_EXT")\r
102                                         << line_info(line)\r
103                                         << source_info(file));\r
104                 }\r
105         }\r
106 }\r
107 \r
108 }}