SmartPtr<GLBuffer> GLBuffer::create_buffer ( GLenum target, const GLvoid *data, uint32_t size, GLenum usage) { XCAM_ASSERT (size > 0); GLuint buf_id = 0; glGenBuffers (1, &buf_id); GLenum error = gl_error (); XCAM_FAIL_RETURN ( ERROR, buf_id && (error == GL_NO_ERROR), NULL, "GL buffer creation failed, error flag: %s", gl_error_string (error)); glBindBuffer (target, buf_id); XCAM_FAIL_RETURN ( ERROR, (error = gl_error ()) == GL_NO_ERROR, NULL, "GL buffer creation failed when bind buffer:%d, error flag: %s", buf_id, gl_error_string (error)); glBufferData (target, size, data, usage); XCAM_FAIL_RETURN ( ERROR, (error = gl_error ()) == GL_NO_ERROR, NULL, "GL buffer creation failed in glBufferData, id:%d, error flag: %s", buf_id, gl_error_string (error)); SmartPtr<GLBuffer> buf_obj = new GLBuffer (buf_id, target, usage, size); return buf_obj; }
GLint check_ogl_error(){ GLenum gl_error; GLint retCode = 0; gl_error = glGetError(); while (gl_error != GL_NO_ERROR){ errorlogger("ERROR: glError: ", gl_error_string(gl_error)); std::cout << "ERROR: glError: " << gl_error_string(gl_error) << std::endl; gl_error = glGetError(); retCode = 1; } return retCode; }
XCamReturn GLBuffer::flush_map () { if (!_mapped_range.is_mapped ()) return XCAM_RETURN_ERROR_ORDER; XCAM_FAIL_RETURN ( ERROR, _mapped_range.flags & GL_MAP_FLUSH_EXPLICIT_BIT, XCAM_RETURN_ERROR_GLES, "GL buffer flush_map buf:%d failed, invalid flags(:%d)", _buf_id, _mapped_range.flags); XCamReturn ret = bind (); XCAM_FAIL_RETURN ( ERROR, xcam_ret_is_ok (ret), ret, "GL bind buffer failed, buf_id:%d", _buf_id); glFlushMappedBufferRange (_target, _mapped_range.offset, _mapped_range.len); GLenum error = gl_error (); XCAM_FAIL_RETURN ( ERROR, error == GL_NO_ERROR, XCAM_RETURN_ERROR_GLES, "GL buffer flush_map buf:%d failed, error flag: %s", _buf_id, gl_error_string (error)); return XCAM_RETURN_NO_ERROR; }
void * GLBuffer::map_range (uint32_t offset, uint32_t length, GLbitfield flags) { if (length == 0) length = _size; if (_mapped_range.is_mapped () && _mapped_range.flags == flags && _mapped_range.offset == offset && _mapped_range.len == length) { return _mapped_range.ptr; } _mapped_range.clear (); XCamReturn ret = bind (); XCAM_FAIL_RETURN ( ERROR, xcam_ret_is_ok (ret), NULL, "GL bind buffer failed, buf_id:%d", _buf_id); void *ptr = glMapBufferRange (_target, offset, length, flags); GLenum error = gl_error (); XCAM_FAIL_RETURN ( ERROR, ptr && (error == GL_NO_ERROR), NULL, "GL buffer map range failed, buf_id:%d, offset:%d, len:%d, flags:%d, error flag: %s", _buf_id, offset, length, flags, gl_error_string (error)); _mapped_range.offset = offset; _mapped_range.len = length; _mapped_range.flags = flags; _mapped_range.ptr = ptr; return ptr; }
void gl_call(const char *func, uint32_t line, const char *glfunc) { GLenum err; if ((err = glGetError()) == GL_NO_ERROR) return; log_error("gles2: function %s in %s line %u: %s", glfunc, func, line, gl_error_string(glGetError())); }
XCamReturn GLBuffer::bind () { glBindBuffer (_target, _buf_id); GLenum error = gl_error (); XCAM_FAIL_RETURN ( ERROR, error == GL_NO_ERROR, XCAM_RETURN_ERROR_GLES, "GL bind buffer:%d failed, error flag: %s", _buf_id, gl_error_string (error)); return XCAM_RETURN_NO_ERROR; }
GLBuffer::~GLBuffer () { if (_buf_id) { glDeleteBuffers (1, &_buf_id); GLenum error = gl_error (); if (error != GL_NO_ERROR) { XCAM_LOG_WARNING ( "GL Buffer delete buffer failed, error flag: %s", gl_error_string (error)); } } }
XCamReturn GLBuffer::bind_buffer_range (uint32_t index, uint32_t offset, uint32_t size) { XCamReturn ret = bind (); XCAM_FAIL_RETURN ( ERROR, xcam_ret_is_ok (ret), ret, "GL bind buffer failed, buf_id:%d", _buf_id); glBindBufferRange (_target, index, _buf_id, offset, size); GLenum error = gl_error (); XCAM_FAIL_RETURN ( ERROR, error == GL_NO_ERROR, XCAM_RETURN_ERROR_GLES, "GL bind buffer range failed. buf_id:%d failed, idx:%d, error flag: %s", _buf_id, index, gl_error_string (error)); return XCAM_RETURN_NO_ERROR; }
XCamReturn GLBuffer::unmap () { if (!_mapped_range.is_mapped ()) return XCAM_RETURN_ERROR_ORDER; XCamReturn ret = bind (); XCAM_FAIL_RETURN ( ERROR, xcam_ret_is_ok (ret), ret, "GL bind buffer failed, buf_id:%d", _buf_id); XCAM_FAIL_RETURN ( ERROR, glUnmapBuffer (_target), XCAM_RETURN_ERROR_GLES, "GL buffer unmap buf:%d failed, error flag: %s", _buf_id, gl_error_string (gl_error ())); _mapped_range.clear (); return XCAM_RETURN_NO_ERROR; }
static void gl_call(const char *func, uint32_t line, const char *glfunc) { GLenum error; if ((error = gl.api.glGetError()) == GL_NO_ERROR) return; wlc_log(WLC_LOG_ERROR, "gles2: function %s at line %u: %s == %s", func, line, glfunc, gl_error_string(error)); }