func (q *commandQueue) Flush(context *opengl.Context) error { q.m.Lock() defer q.m.Unlock() // glViewport must be called at least at every frame on iOS. context.ResetViewportSize() for _, g := range q.commandGroups() { n := 0 for _, c := range g { switch c := c.(type) { case *drawImageCommand: n += len(c.vertices) } } vertices := make([]float32, 0, n) for _, c := range g { switch c := c.(type) { case *drawImageCommand: vertices = append(vertices, c.vertices...) } } if 0 < len(vertices) { context.BufferSubData(opengl.ArrayBuffer, vertices) } // NOTE: WebGL doesn't seem to have Check gl.MAX_ELEMENTS_VERTICES or gl.MAX_ELEMENTS_INDICES so far. // Let's use them to compare to len(quads) in the future. if maxQuads < len(vertices)*opengl.Float.SizeInBytes()/QuadVertexSizeInBytes() { return fmt.Errorf("len(quads) must be equal to or less than %d", maxQuads) } numc := len(g) indexOffsetInBytes := 0 for _, c := range g { if err := c.Exec(context, indexOffsetInBytes); err != nil { return err } if c, ok := c.(*drawImageCommand); ok { n := len(c.vertices) * opengl.Float.SizeInBytes() / QuadVertexSizeInBytes() indexOffsetInBytes += 6 * n * 2 } } if 0 < numc { // Call glFlush to prevent black flicking (especially on Android (#226) and iOS). context.Flush() } } q.commands = []command{} return nil }