7 #if defined(SENS_OS_MACIOS)
8 # include <OpenGLES/ES3/gl.h>
9 # include <OpenGLES/ES3/glext.h>
10 #elif defined(SENS_OS_MACOS)
12 #elif defined(SENS_OS_ANDROID)
14 # include <GLES3/gl3.h>
15 # include <GLES2/gl2ext.h>
16 # ifndef GL_CLAMP_TO_BORDER
17 # define GL_CLAMP_TO_BORDER GL_CLAMP_TO_BORDER_OES
19 #elif defined(SENS_OS_WINDOWS)
21 #elif defined(SENS_OS_LINUX)
24 # error "SL has not been ported to this OS"
28 # if defined(DEBUG) || defined(_DEBUG)
29 # define GET_GL_ERROR SENSGLTextureReader::getGLError((const char*)__FILE__, __LINE__, false)
46 std::string versionStr = std::string((
const char*)glGetString(GL_SHADING_LANGUAGE_VERSION));
47 size_t dotPos = versionStr.find(
'.');
49 NO[0] = versionStr[dotPos - 1];
50 NO[1] = versionStr[dotPos + 1];
53 return std::string(NO);
60 GLuint shaderHandle = glCreateShader(shaderType);
64 std::string glVersion = std::string((
const char*)glGetString(GL_VERSION));
65 bool glIsES3 = (glVersion.find(
"OpenGL ES 3") != string::npos);
66 std::string srcVersion =
"#version " + versionGLSL;
71 std::string completeSrc = srcVersion + source;
73 if (isGlExternalTexture)
75 Utils::replaceString(completeSrc,
"#include extension",
"#extension GL_OES_EGL_image_external_essl3 : enable");
84 const char* src = completeSrc.c_str();
86 glShaderSource(shaderHandle, 1, &src,
nullptr);
87 glCompileShader(shaderHandle);
91 glGetShaderiv(shaderHandle, GL_COMPILE_STATUS, &compileSuccess);
96 glGetShaderiv(shaderHandle, GL_INFO_LOG_LENGTH, &logSize);
98 GLchar*
log =
new GLchar[logSize];
100 glGetShaderInfoLog(shaderHandle, logSize,
nullptr,
log);
110 : _extTextureId(textureId),
111 _isGlTextureExternal(isGlTextureExternal),
112 _targetWidth(targetWidth),
113 _targetHeight(targetHeight)
121 glDeleteFramebuffers(1, &
_fbo);
122 glDeleteVertexArrays(1, &
_VAO);
123 glDeleteBuffers(1, &
_VBO);
124 glDeleteBuffers(1, &
_EBO);
125 glDeleteProgram(
_prog);
133 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &lastFBO);
135 glGetIntegerv(GL_TEXTURE_BINDING_2D, &lastTex);
139 static std::string vertexShSrc =
141 " precision highp float;\n"
144 "layout (location = 0) in vec2 aPos;\n"
145 "layout (location = 1) in vec2 aTexCoords;\n"
147 "out vec2 TexCoords;\n"
151 " gl_Position = vec4(aPos.x, aPos.y, 0.0, 1.0);\n"
152 " TexCoords = aTexCoords;\n"
155 static std::string fragShSrc =
156 "#include extension\n"
158 " precision highp float;\n"
161 "out vec4 FragColor;\n"
163 "in vec2 TexCoords;\n"
165 "#include sampler texture0;\n"
169 " //ATTENTION: order is changed to bgr\n"
170 " FragColor = texture(texture0, vec2(TexCoords.x, TexCoords.y)).bgra;\n"
175 _prog = glCreateProgram();
176 glAttachShader(
_prog, vertexSh);
177 glAttachShader(
_prog, fragSh);
178 glLinkProgram(
_prog);
179 glDeleteShader(vertexSh);
180 glDeleteShader(fragSh);
188 1.0f, 1.0f, 1.0f, 1.0f,
189 1.0f, -1.0f, 1.0f, 0.0f,
190 -1.0f, -1.0f, 0.0f, 0.0f,
191 -1.0f, 1.0f, 0.0f, 1.0f
194 unsigned int indices[] = {
200 glGenVertexArrays(1, &
_VAO);
201 glGenBuffers(1, &
_VBO);
202 glGenBuffers(1, &
_EBO);
204 glBindVertexArray(
_VAO);
206 glBindBuffer(GL_ARRAY_BUFFER,
_VBO);
207 glBufferData(GL_ARRAY_BUFFER,
sizeof(vertices), vertices, GL_STATIC_DRAW);
209 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,
_EBO);
210 glBufferData(GL_ELEMENT_ARRAY_BUFFER,
sizeof(indices), indices, GL_STATIC_DRAW);
213 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 *
sizeof(
float), (
void*)0);
214 glEnableVertexAttribArray(0);
216 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 *
sizeof(
float), (
void*)(2 *
sizeof(
float)));
217 glEnableVertexAttribArray(1);
219 glBindBuffer(GL_ARRAY_BUFFER, 0);
220 glBindVertexArray(0);
222 glGenFramebuffers(1, &
_fbo);
223 glBindFramebuffer(GL_FRAMEBUFFER,
_fbo);
233 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
234 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
237 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
_targetTex, 0);
241 GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
242 if (status != GL_FRAMEBUFFER_COMPLETE)
243 Utils::log(
"SENSGLTextureReader",
"failed to make complete framebuffer object %x", status);
247 glBindFramebuffer(GL_FRAMEBUFFER, lastFBO);
248 glBindTexture(GL_TEXTURE_2D, lastTex);
256 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &lastFBO);
258 glGetIntegerv(GL_TEXTURE_BINDING_2D, &lastTex);
260 GLboolean lastDepthTestV;
261 glGetBooleanv(GL_DEPTH_TEST, &lastDepthTestV);
263 GLboolean lastStencilTestV;
264 glGetBooleanv(GL_STENCIL_TEST, &lastStencilTestV);
266 GLint lastViewport[4];
267 glGetIntegerv(GL_VIEWPORT, lastViewport);
270 glBindFramebuffer(GL_FRAMEBUFFER,
_fbo);
273 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
274 glClear(GL_COLOR_BUFFER_BIT);
276 glDisable(GL_DEPTH_TEST);
277 if (lastStencilTestV)
278 glDisable(GL_STENCIL_TEST);
283 glBindVertexArray(
_VAO);
284 glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
293 glBindFramebuffer(GL_FRAMEBUFFER, lastFBO);
294 glBindTexture(GL_TEXTURE_2D, lastTex);
295 glViewport(lastViewport[0], lastViewport[1], lastViewport[2], lastViewport[3]);
297 glEnable(GL_DEPTH_TEST);
298 if (lastStencilTestV)
299 glEnable(GL_STENCIL_TEST);
314 if ((err = glGetError()) != GL_NO_ERROR)
319 case GL_INVALID_ENUM:
320 errStr =
"GL_INVALID_ENUM";
322 case GL_INVALID_VALUE:
323 errStr =
"GL_INVALID_VALUE";
325 case GL_INVALID_OPERATION:
326 errStr =
"GL_INVALID_OPERATION";
328 case GL_INVALID_FRAMEBUFFER_OPERATION:
329 errStr =
"GL_INVALID_FRAMEBUFFER_OPERATION";
331 case GL_OUT_OF_MEMORY:
332 errStr =
"GL_OUT_OF_MEMORY";
335 errStr =
"Unknown error";
340 snprintf(sLine,
sizeof(sLine),
"%d", line);
342 std::string newErr(file);
349 bool errExists = std::find(
_errors.begin(),
356 Utils::log(
"SENSGLTextureReader",
"OpenGL Error in %s, line %d: %s\n", file, line, errStr.c_str());
GLuint buildShaderFromSource(std::string source, GLenum shaderType, bool isGlExternalTexture)
std::string glSLVersionNO()
Returns the OpenGL Shading Language version number as a string.
static void getGLError(const char *file, int line, bool quit)
Checks if an OpenGL error occurred.
SENSGLTextureReader(unsigned int textureId, bool isGlTextureExternal, int targetWidth, int targetHeight)
ATTENTION: make sure this constructor is called from gl thread.
bool _isGlTextureExternal
cv::Mat readImageFromGpu()
static std::vector< std::string > _errors
vector for errors collected in getGLError
unsigned int _extTextureId
id of externally generated texture
void replaceString(string &source, const string &from, const string &to)
Replaces in the source string the from string by the to string.
void log(const char *tag, const char *format,...)
logs a formatted string platform independently