void submitDeferred() { for (auto i = deferred.begin(); i != deferred.end(); ++i) { try { Rectanglei rect; allocator->rect(i.key(), rect); submitImage(*i.value(), rect); } catch (Error const &er) { LOG_GL_ERROR("Allocation %s could not be submitted: %s") << i.key() << er.asText(); } delete i.value(); // we own the Image } deferred.clear(); }
void xlGLCanvas::CreateGLContext() { static log4cpp::Category &logger_opengl_trace = log4cpp::Category::getInstance(std::string("log_opengl_trace")); if (m_context == nullptr) { //trying to detect OGL verions and stuff can result in unwanted logs wxLogLevel cur = wxLog::GetLogLevel(); wxLog::SetLogLevel(wxLOG_Error); wxLog::Suspend(); wxConfigBase* config = wxConfigBase::Get(); int ver = 99; config->Read("ForceOpenGLVer", &ver, 99); static bool supportsCoreProfile = true; if (supportsCoreProfile && m_coreProfile && ver >= 3) { wxGLContextAttrs atts; static log4cpp::Category &logger_opengl = log4cpp::Category::getInstance(std::string("log_opengl")); atts.PlatformDefaults().OGLVersion(3, 3).CoreProfile(); if (logger_opengl_trace.isDebugEnabled()) { atts.ForwardCompatible().DebugCtx().EndList(); } atts.EndList(); glGetError(); LOG_GL_ERRORV(m_context = new wxGLContext(this, nullptr, &atts)); if (!m_context->IsOK()) { logger_opengl.debug("Could not create a valid CoreProfile context"); LOG_GL_ERRORV(delete m_context); m_context = nullptr; supportsCoreProfile = false; } else { LOG_GL_ERROR(); const GLubyte* rend = glGetString(GL_RENDERER); if (wxString(rend) == "GDI Generic") { //no way 3.x is going to work, software rendered, flip to 1.x LOG_GL_ERRORV(delete m_context); m_context = nullptr; supportsCoreProfile = false; } } } if (m_context == nullptr) { glGetError(); LOG_GL_ERRORV(m_context = new wxGLContext(this)); } if (!functionsLoaded) { LOG_GL_ERROR(); functionsLoaded = DrawGLUtils::LoadGLFunctions(); glGetError(); // likely a function not there } if (!m_context->IsOK()) { LOG_GL_ERRORV(delete m_context); m_context = nullptr; } wxLog::SetLogLevel(cur); wxLog::Resume(); if (m_context == nullptr) { static log4cpp::Category &logger_opengl = log4cpp::Category::getInstance(std::string("log_opengl")); logger_opengl.error("Error creating GL context."); } } }
void C2DPrimitiveRenderer_GL::RenderViaVertexAttribArray( const General2DVertex *pVertices, uint num_vertices, ushort *indices, uint num_indices, GLenum primitive_type ) { const uint vertex_size = sizeof(General2DVertex); LOG_GL_ERROR( " Clearing OpenGL errors..." ); // Unbind GL_ARRAY_BUFFER and GL_ELEMENT_ARRAY_BUFFER to source a standard memory location (RAM). glBindBuffer( GL_ARRAY_BUFFER, 0 ); glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 ); // position const uchar *pV = (uchar *)pVertices; const uchar *pPos = pV + 0;//mesh.GetVertexElementOffset( VEE::POSITION ); glEnableVertexAttribArray( 0 ); glVertexAttribPointer( 0, 4, GL_FLOAT, GL_FALSE, vertex_size, pPos ); // diffuse color glEnableVertexAttribArray( 1 ); glVertexAttribPointer( 1, 4, GL_FLOAT, GL_FALSE, vertex_size, pV + sizeof(float) * 4 ); // 2D texture coordinates glEnableVertexAttribArray( 2 ); glVertexAttribPointer( 2, 2, GL_FLOAT, GL_FALSE, vertex_size, pV + sizeof(float) * 8 ); uchar *pI = NULL; LOG_GL_ERROR( " Clearing OpenGL errors..." ); if( indices ) { pI = (uchar *)indices; GLenum index_type = GL_UNSIGNED_SHORT; glDrawElements( primitive_type, num_indices, index_type, pI ); LOG_GL_ERROR( "glDrawElements() failed." ); } else { GLint first = 0; GLsizei count = 0; switch( primitive_type ) { case GL_TRIANGLE_STRIP: count = num_vertices; break; case GL_TRIANGLE_FAN: count = num_vertices; break; case GL_TRIANGLES: count = num_vertices; break; break; default: break; } glDrawArrays( primitive_type, first, count ); LOG_GL_ERROR( "glDrawArrays() failed." ); } }