diff --git a/window.go b/window.go
index 5d33c9d2fef07ca53a30ad71659160c318dac61b..68974d470c644fafa073adc7513156f8d6692aa7 100644
--- a/window.go
+++ b/window.go
@@ -56,7 +56,6 @@ type Window struct {
 	enabled       bool
 	window        *glfw.Window
 	config        WindowConfig
-	contextHolder pixelgl.ContextHolder
 	defaultShader *pixelgl.Shader
 
 	// need to save these to correctly restore a fullscreen window
@@ -107,20 +106,20 @@ func NewWindow(config WindowConfig) (*Window, error) {
 
 	w.SetFullscreen(config.Fullscreen)
 
-	defaultShader, err := pixelgl.NewShader(
-		&w.contextHolder,
-		defaultVertexFormat,
-		defaultUniformFormat,
-		defaultVertexShader,
-		defaultFragmentShader,
-	)
+	w.Do(func(pixelgl.Context) {
+		w.defaultShader, err = pixelgl.NewShader(
+			pixelgl.NoOpDoer,
+			defaultVertexFormat,
+			defaultUniformFormat,
+			defaultVertexShader,
+			defaultFragmentShader,
+		)
+	})
 	if err != nil {
 		w.Delete()
 		return nil, errors.Wrap(err, "creating window failed")
 	}
 
-	w.defaultShader = defaultShader
-
 	return w, nil
 }
 
@@ -304,7 +303,7 @@ func (w *Window) Do(sub func(pixelgl.Context)) {
 	if w.defaultShader != nil {
 		w.defaultShader.Do(sub)
 	} else {
-		w.contextHolder.Do(sub)
+		sub(pixelgl.Context{})
 	}
 	w.enabled = false
 }