func (c *replacePixelsCommand) Exec(context *opengl.Context, indexOffsetInBytes int) error { f, err := c.dst.createFramebufferIfNeeded(context) if err != nil { return err } if err := f.setAsViewport(context); err != nil { return err } // Filling with non black or white color is required here for glTexSubImage2D. // Very mysterious but this actually works (Issue #186). // This is needed even after fixing a shader bug at f537378f2a6a8ef56e1acf1c03034967b77c7b51. if err := context.FillFramebuffer(0, 0, 0.5, 1); err != nil { return err } // This is necessary on Android. We can't call glClear just before glTexSubImage2D without // glFlush. glTexSubImage2D didn't work without this hack at least on Nexus 5x (#211). // This also happens when a fillCommand precedes a replacePixelsCommand. // TODO: Can we have a better way like optimizing commands? context.Flush() if err := context.BindTexture(c.dst.texture.native); err != nil { return err } context.TexSubImage2D(c.pixels, c.dst.width, c.dst.height) return nil }