diff --git a/pixelgl/doc.go b/pixelgl/doc.go
index e9695529ebdf54e6e3aa8bb9116de451ed251f87..87bccc4930263d9af1c8c337b92374629e386b08 100644
--- a/pixelgl/doc.go
+++ b/pixelgl/doc.go
@@ -1,2 +1,4 @@
 // Package pixelgl provides higher-level abstractions around the basic OpenGL primitives and operations.
+//
+// This package deliberately does not handle nor report OpenGL errors, it's up to you to cause none.
 package pixelgl
diff --git a/pixelgl/shader.go b/pixelgl/shader.go
index ddc5f979809f6a18c3f1c98eb365ca27f0ba382a..533c56417d8470ea9b6a2a61b9af211b34a05f5a 100644
--- a/pixelgl/shader.go
+++ b/pixelgl/shader.go
@@ -5,7 +5,6 @@ import (
 
 	"github.com/go-gl/gl/v3.3-core/gl"
 	"github.com/go-gl/mathgl/mgl32"
-	"github.com/pkg/errors"
 )
 
 // UniformFormat defines names, purposes and types of uniform variables inside a shader.
@@ -36,9 +35,9 @@ func NewShader(parent Doer, vertexFormat VertexFormat, uniformFormat UniformForm
 		uniforms:      make(map[Attr]int32),
 	}
 
-	var err, glerr error
+	var err error
 	parent.Do(func(ctx Context) {
-		err, glerr = DoErrGLErr(func() error {
+		err = DoErr(func() error {
 			var vshader, fshader uint32
 
 			// vertex shader
@@ -120,15 +119,9 @@ func NewShader(parent Doer, vertexFormat VertexFormat, uniformFormat UniformForm
 			return nil
 		})
 	})
-	if err != nil && glerr != nil {
-		return nil, errors.Wrap(glerr, err.Error())
-	}
 	if err != nil {
 		return nil, err
 	}
-	if glerr != nil {
-		return nil, glerr
-	}
 
 	return shader, nil
 }
diff --git a/pixelgl/texture.go b/pixelgl/texture.go
index 1c5c4be9aeb064c23078eb56a4280c59bddddfbf..708bc4eb5f239262f161c8c9657520e4824881d8 100644
--- a/pixelgl/texture.go
+++ b/pixelgl/texture.go
@@ -1,9 +1,6 @@
 package pixelgl
 
-import (
-	"github.com/go-gl/gl/v3.3-core/gl"
-	"github.com/pkg/errors"
-)
+import "github.com/go-gl/gl/v3.3-core/gl"
 
 // Texture is an OpenGL texture.
 type Texture struct {
@@ -17,9 +14,8 @@ type Texture struct {
 func NewTexture(parent Doer, width, height int, pixels []uint8) (*Texture, error) {
 	texture := &Texture{parent: parent}
 
-	var err error
 	parent.Do(func(ctx Context) {
-		err = DoGLErr(func() {
+		Do(func() {
 			gl.GenTextures(1, &texture.tex)
 			gl.BindTexture(gl.TEXTURE_2D, texture.tex)
 
@@ -40,9 +36,6 @@ func NewTexture(parent Doer, width, height int, pixels []uint8) (*Texture, error
 			gl.BindTexture(gl.TEXTURE_2D, 0)
 		})
 	})
-	if err != nil {
-		return nil, errors.Wrap(err, "failed to create a texture")
-	}
 
 	return texture, nil
 }
diff --git a/pixelgl/thread.go b/pixelgl/thread.go
index 330309a8391d52f2ef41889e2d823f159e4c3e05..818e95b9adfe18fa7473b2fe6a7b7dd33ddd24fd 100644
--- a/pixelgl/thread.go
+++ b/pixelgl/thread.go
@@ -1,7 +1,6 @@
 package pixelgl
 
 import (
-	"fmt"
 	"runtime"
 
 	"github.com/go-gl/gl/v3.3-core/gl"
@@ -97,73 +96,3 @@ func DoVal(f func() interface{}) interface{} {
 	}
 	return <-val
 }
-
-// DoGLErr is same as Do, but also return an error generated by OpenGL.
-func DoGLErr(f func()) (gl error) {
-	glerr := make(chan error)
-	callQueue <- func() {
-		getLastGLErr() // swallow
-		f()
-		glerr <- getLastGLErr()
-	}
-	return <-glerr
-}
-
-// DoErrGLErr is same as DoErr, but also returns an error generated by OpenGL.
-func DoErrGLErr(f func() error) (_, gl error) {
-	err := make(chan error)
-	glerr := make(chan error)
-	callQueue <- func() {
-		getLastGLErr() // swallow
-		err <- f()
-		glerr <- getLastGLErr()
-	}
-	return <-err, <-glerr
-}
-
-// DoValGLErr is same as DoVal, but also returns an error generated by OpenGL.
-func DoValGLErr(f func() interface{}) (_ interface{}, gl error) {
-	val := make(chan interface{})
-	glerr := make(chan error)
-	callQueue <- func() {
-		getLastGLErr() // swallow
-		val <- f()
-		glerr <- getLastGLErr()
-	}
-	return <-val, <-glerr
-}
-
-// GLError represents an error code generated by OpenGL.
-type GLError uint32
-
-// Error returns a human-readable textual representation of an OpenGL error.
-func (err GLError) Error() string {
-	if desc, ok := glErrors[uint32(err)]; ok {
-		return fmt.Sprintf("OpenGL error: %s", desc)
-	}
-	return fmt.Sprintf("OpenGL error: unknown error")
-}
-
-var glErrors = map[uint32]string{
-	gl.INVALID_ENUM:                  "invalid enum",
-	gl.INVALID_VALUE:                 "invalid value",
-	gl.INVALID_OPERATION:             "invalid operation",
-	gl.STACK_OVERFLOW:                "stack overflow",
-	gl.STACK_UNDERFLOW:               "stack underflow",
-	gl.OUT_OF_MEMORY:                 "out of memory",
-	gl.INVALID_FRAMEBUFFER_OPERATION: "invalid framebuffer operation",
-	gl.CONTEXT_LOST:                  "context lost",
-}
-
-// getLastGLErr returns (and consumes) the last error generated by OpenGL.
-// Don't use outside DoGLErr, DoErrGLErr and DoValGLErr.
-func getLastGLErr() error {
-	err := uint32(gl.NO_ERROR)
-	for e := gl.GetError(); e != gl.NO_ERROR; e = gl.GetError() {
-		err = e
-	}
-	if err != gl.NO_ERROR {
-		return GLError(err)
-	}
-	return nil
-}
diff --git a/pixelgl/vertex.go b/pixelgl/vertex.go
index e007d235d766a9466ce2051ed9ff43e5d0570b60..8a8f4ae9e63f2390df5501f3431472a5d4190310 100644
--- a/pixelgl/vertex.go
+++ b/pixelgl/vertex.go
@@ -105,9 +105,9 @@ func NewVertexArray(parent Doer, format VertexFormat, mode VertexDrawMode, usage
 		offset += attr.Type.Size()
 	}
 
-	var err, glerr error
+	var err error
 	parent.Do(func(ctx Context) {
-		err, glerr = DoErrGLErr(func() error {
+		err = DoErr(func() error {
 			gl.GenVertexArrays(1, &va.vao)
 			gl.BindVertexArray(va.vao)
 
@@ -149,15 +149,9 @@ func NewVertexArray(parent Doer, format VertexFormat, mode VertexDrawMode, usage
 			return nil
 		})
 	})
-	if err != nil && glerr != nil {
-		return nil, errors.Wrap(errors.Wrap(glerr, err.Error()), "failed to create vertex array")
-	}
 	if err != nil {
 		return nil, errors.Wrap(err, "failed to create vertex array")
 	}
-	if glerr != nil {
-		return nil, errors.Wrap(glerr, "failed to create vertex array")
-	}
 
 	return va, nil
 }
@@ -222,10 +216,6 @@ func (va *VertexArray) SetVertex(vertex int, data interface{}) {
 		gl.BufferSubData(gl.ARRAY_BUFFER, offset, va.format.Size(), gl.Ptr(data))
 
 		gl.BindBuffer(gl.ARRAY_BUFFER, 0)
-
-		if err := getLastGLErr(); err != nil {
-			panic(errors.Wrap(err, "set vertex error"))
-		}
 	})
 }
 
@@ -253,10 +243,6 @@ func (va *VertexArray) SetVertexAttributeFloat(vertex int, purpose AttrPurpose,
 		gl.BufferSubData(gl.ARRAY_BUFFER, offset, attr.Type.Size(), unsafe.Pointer(&value))
 
 		gl.BindBuffer(gl.ARRAY_BUFFER, 0)
-
-		if err := getLastGLErr(); err != nil {
-			panic(errors.Wrap(err, "set attribute vertex"))
-		}
 	})
 	return true
 }
@@ -279,10 +265,6 @@ func (va *VertexArray) SetVertexAttributeVec2(vertex int, purpose AttrPurpose, v
 		gl.BufferSubData(gl.ARRAY_BUFFER, offset, attr.Type.Size(), unsafe.Pointer(&value))
 
 		gl.BindBuffer(gl.ARRAY_BUFFER, 0)
-
-		if err := getLastGLErr(); err != nil {
-			panic(errors.Wrap(err, "set attribute vertex"))
-		}
 	})
 	return true
 }
@@ -305,10 +287,6 @@ func (va *VertexArray) SetVertexAttributeVec3(vertex int, purpose AttrPurpose, v
 		gl.BufferSubData(gl.ARRAY_BUFFER, offset, attr.Type.Size(), unsafe.Pointer(&value))
 
 		gl.BindBuffer(gl.ARRAY_BUFFER, 0)
-
-		if err := getLastGLErr(); err != nil {
-			panic(errors.Wrap(err, "set attribute vertex"))
-		}
 	})
 	return true
 }
@@ -331,10 +309,6 @@ func (va *VertexArray) SetVertexAttributeVec4(vertex int, purpose AttrPurpose, v
 		gl.BufferSubData(gl.ARRAY_BUFFER, offset, attr.Type.Size(), unsafe.Pointer(&value))
 
 		gl.BindBuffer(gl.ARRAY_BUFFER, 0)
-
-		if err := getLastGLErr(); err != nil {
-			panic(errors.Wrap(err, "set attribute vertex"))
-		}
 	})
 	return true
 }