1 /* 2 * Copyright (C) 2005-2019 Team Kodi 3 * This file is part of Kodi - https://kodi.tv 4 * 5 * SPDX-License-Identifier: GPL-2.0-or-later 6 * See LICENSES/README.md for more information. 7 */ 8 9 #pragma once 10 11 #ifdef __cplusplus 12 13 //============================================================================== 14 /// @defgroup cpp_kodi_gui_helpers_gl OpenGL helpers 15 /// @ingroup cpp_kodi_gui_helpers 16 /// @brief **Auxiliary functions for Open GL**\n 17 /// This group includes help for definitions, functions, and classes for 18 /// OpenGL. 19 /// 20 /// To use OpenGL for your system, add the @ref GL.h "#include <kodi/gui/gl/GL.h>". 21 /// 22 /// The @ref HAS_GL is declared if Open GL is required and @ref HAS_GLES if Open GL 23 /// Embedded Systems (ES) is required, with ES the version is additionally given 24 /// in the definition, this can be "2" or "3". 25 /// 26 /// 27 ///----------------------------------------------------------------------------- 28 /// 29 /// Following @ref GL_TYPE_STRING define can be used, for example, to manage 30 /// different folders for GL and GLES and make the selection easier. 31 /// This are on OpenGL <b>"GL"</b> and on Open GL|ES <b>"GLES"</b>. 32 /// 33 /// **Example:** 34 /// ~~~~~~~~~~~~~~~~~{.cpp} 35 /// kodi::GetAddonPath("resources/shaders/" GL_TYPE_STRING "/frag.glsl"); 36 /// ~~~~~~~~~~~~~~~~~ 37 /// 38 /// 39 ///---------------------------------------------------------------------------- 40 /// 41 /// In addition, @ref BUFFER_OFFSET is declared in it which can be used to give an 42 /// offset on the array to GL. 43 /// 44 /// **Example:** 45 /// ~~~~~~~~~~~~~~~~~{.cpp} 46 /// const struct PackedVertex { 47 /// float position[3]; // Position x, y, z 48 /// float color[4]; // Color r, g, b, a 49 /// } vertices[3] = { 50 /// { { -0.5f, -0.5f, 0.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } }, 51 /// { { 0.5f, -0.5f, 0.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } }, 52 /// { { 0.0f, 0.5f, 0.0f }, { 0.0f, 0.0f, 1.0f, 1.0f } } 53 /// }; 54 /// 55 /// glVertexAttribPointer(m_aPosition, 3, GL_FLOAT, GL_FALSE, sizeof(PackedVertex), BUFFER_OFFSET(offsetof(PackedVertex, position))); 56 /// glEnableVertexAttribArray(m_aPosition); 57 /// 58 /// glVertexAttribPointer(m_aColor, 4, GL_FLOAT, GL_FALSE, sizeof(PackedVertex), BUFFER_OFFSET(offsetof(PackedVertex, color))); 59 /// glEnableVertexAttribArray(m_aColor); 60 /// ~~~~~~~~~~~~~~~~~ 61 62 #if HAS_GL 63 #define GL_TYPE_STRING "GL" 64 // always define GL_GLEXT_PROTOTYPES before include gl headers 65 #if !defined(GL_GLEXT_PROTOTYPES) 66 #define GL_GLEXT_PROTOTYPES 67 #endif 68 #if defined(TARGET_LINUX) 69 #include <GL/gl.h> 70 #include <GL/glext.h> 71 #elif (defined(TARGET_FREEBSD)||defined(TARGET_DRAGONFLY)) 72 #include <GL/gl.h> 73 #elif defined(TARGET_DARWIN) 74 #include <OpenGL/gl3.h> 75 #include <OpenGL/gl3ext.h> 76 #elif defined(WIN32) 77 #error Use of GL under Windows is not possible 78 #endif 79 #elif HAS_GLES >= 2 80 #define GL_TYPE_STRING "GLES" 81 #if defined(WIN32) 82 #if defined(HAS_ANGLE) 83 #include <angle_gl.h> 84 #else 85 #error Use of GLES only be available under Windows by the use of angle 86 #endif 87 #elif defined(TARGET_DARWIN) 88 #if HAS_GLES == 3 89 #include <OpenGLES/ES3/gl.h> 90 #include <OpenGLES/ES3/glext.h> 91 #else 92 #include <OpenGLES/ES2/gl.h> 93 #include <OpenGLES/ES2/glext.h> 94 #endif 95 #else 96 #if HAS_GLES == 3 97 #include <GLES3/gl3.h> 98 #include <GLES3/gl3ext.h> 99 #else 100 #include <GLES2/gl2.h> 101 #include <GLES2/gl2ext.h> 102 #endif 103 #endif 104 #endif 105 106 #ifndef BUFFER_OFFSET 107 /// @ingroup cpp_kodi_gui_helpers_gl 108 /// @brief To give a offset number as pointer value. 109 #define BUFFER_OFFSET(i) ((char*)nullptr + (i)) 110 #endif 111 112 #endif /* __cplusplus */ 113