]> git.sesse.net Git - casparcg/blob - common/gl/gl_check.cpp
2.0.0.2: bluefish_consumer: Refactored.
[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 <Glee.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 ErrorCode = glGetError();\r
44 \r
45         if (ErrorCode != GL_NO_ERROR)\r
46         {\r
47                 std::string Error = "unknown error";\r
48                 std::string Desc  = "no description";\r
49 \r
50                 // Decode the error code\r
51                 switch (ErrorCode)\r
52                 {\r
53                         case GL_INVALID_ENUM :\r
54                                 BOOST_THROW_EXCEPTION(ogl_invalid_enum()\r
55                                         << msg_info("an unacceptable value has been specified for an enumerated argument")\r
56                                         << errorstr("GL_INVALID_ENUM"));\r
57 \r
58                         case GL_INVALID_VALUE :\r
59                                 BOOST_THROW_EXCEPTION(ogl_invalid_value()\r
60                                         << msg_info("a numeric argument is out of range")\r
61                                         << errorstr("GL_INVALID_VALUE"));\r
62 \r
63                         case GL_INVALID_OPERATION :\r
64                                 BOOST_THROW_EXCEPTION(ogl_invalid_operation()\r
65                                         << msg_info("the specified operation is not allowed in the current state")\r
66                                         << errorstr("GL_INVALID_OPERATION"));\r
67 \r
68                         case GL_STACK_OVERFLOW :\r
69                                 BOOST_THROW_EXCEPTION(ogl_stack_overflow()\r
70                                         << msg_info("this command would cause a stack overflow")\r
71                                         << errorstr("GL_STACK_OVERFLOW"));\r
72 \r
73                         case GL_STACK_UNDERFLOW :\r
74                                 BOOST_THROW_EXCEPTION(ogl_stack_underflow()\r
75                                         << msg_info("this command would cause a stack underflow")\r
76                                         << errorstr("GL_STACK_UNDERFLOW"));\r
77 \r
78                         case GL_OUT_OF_MEMORY :\r
79                                 BOOST_THROW_EXCEPTION(ogl_stack_underflow()\r
80                                         << msg_info("there is not enough memory left to execute the command")\r
81                                         << errorstr("GL_OUT_OF_MEMORY"));\r
82 \r
83                         case GL_INVALID_FRAMEBUFFER_OPERATION_EXT :\r
84                                 BOOST_THROW_EXCEPTION(ogl_stack_underflow()\r
85                                         << msg_info("the object bound to FRAMEBUFFER_BINDING_EXT is not \"framebuffer complete\"")\r
86                                         << errorstr("GL_INVALID_FRAMEBUFFER_OPERATION_EXT"));\r
87                 }\r
88         }\r
89 }\r
90 \r
91 #ifdef _DEBUG\r
92         \r
93 #define CASPAR_GL_EXPR_STR(expr) #expr\r
94 \r
95 #define GL(expr) \\r
96         do \\r
97         { \\r
98                 (expr);  \\r
99                 caspar::gl::SMFL_GLCheckError(CASPAR_GL_EXPR_STR(expr), __FILE__, __LINE__);\\r
100         }while(0);\r
101 #else\r
102 #define GL(expr) expr\r
103 #endif\r
104 \r
105 }}