void RenderContext::create() { if(s_primedContext || s_creationLock) { logThrowGL("[RenderContext] You cannot create a RenderContext while " "another is primed or being created!"); } s_creationLock = true; // context needs to be current to call glewInit makeCurrent(); // glewExperimental to use context versions above 3.2 // TODO: call glewInit just once (???) glewExperimental = GL_TRUE; GLenum status = glewInit(); // check for errors if(status != GLEW_OK) { logThrowGL("[RenderContext] glewInit() failed with status <", status, ">!"); } // check for GL error (glew often causes one when using new context versions) auto err = glGetError(); if(err != GL_NO_ERROR) { logNotice("[RenderContext] glewInit() caused an openGL error <", translateGLError(err), ">."); } // configure context configure(); // reset state resetCurrent(); s_creationLock = false; m_wasCreated = true; }
GLTexture::GLTexture(GLenum target) : target(target) { glGenTextures(1, &name); if (!name) panic("Unable to allocate GL texture: glGenTextures() failed: " + translateGLError(glGetError())); }
std::shared_ptr<GLTexture> GLTexture::create2d( GLenum internalFormat, FilterRule filterRule, EdgeRule edgeRule, PixelImage &image) { auto that = std::shared_ptr<GLTexture>(new GLTexture(GL_TEXTURE_2D)); that->bind(); glTexParameteri(that->target, GL_TEXTURE_MIN_FILTER, filterRule.minFilter); glTexParameteri(that->target, GL_TEXTURE_MAG_FILTER, filterRule.magFilter); glTexParameteri(that->target, GL_TEXTURE_WRAP_S, edgeRule.edgeX); glTexParameteri(that->target, GL_TEXTURE_WRAP_T, edgeRule.edgeY); glTexParameteri(that->target, GL_TEXTURE_WRAP_R, edgeRule.edgeZ); GLenum imageFormat; GLenum imageUnitType; switch (image.getFormat()) { case PixelImage::Format::RGB: imageFormat = GL_RGB; imageUnitType = GL_UNSIGNED_BYTE; break; case PixelImage::Format::RGBA: imageFormat = GL_RGBA; imageUnitType = GL_UNSIGNED_BYTE; break; default: complain("Unrecognized/unsupported pixel image format"); return nullptr; } glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, image.getWidth(), image.getHeight(), 0, imageFormat, imageUnitType, image.getData()); GLenum err = glGetError(); if (err) { complain("Error creating texture from pixel image: glTexImage2D() failed: " + translateGLError(err)); return nullptr; } return that; }
GLRenderBuffer::GLRenderBuffer() { glGenRenderbuffers(1, &name); if (!name) panic("Unable to create a GL renderbuffer: glGenRenderbuffers() failed: " + translateGLError(glGetError())); }