internal/graphicsdriver/opengl: Remove unused code using PBO

Updates #1678
This commit is contained in:
Hajime Hoshi 2021-07-14 21:51:22 +09:00
parent b249fe889d
commit 50d2d7ed61
5 changed files with 2 additions and 156 deletions

View File

@ -496,10 +496,6 @@ func (c *context) needsRestoring() bool {
return false return false
} }
func (c *context) canUsePBO() bool {
return false
}
func (c *context) texSubImage2D(t textureNative, args []*driver.ReplacePixelsArgs) { func (c *context) texSubImage2D(t textureNative, args []*driver.ReplacePixelsArgs) {
c.bindTexture(t) c.bindTexture(t)
for _, a := range args { for _, a := range args {
@ -507,39 +503,6 @@ func (c *context) texSubImage2D(t textureNative, args []*driver.ReplacePixelsArg
} }
} }
func (c *context) newPixelBufferObject(width, height int) buffer {
var b uint32
gl.GenBuffers(1, &b)
gl.BindBuffer(gl.PIXEL_UNPACK_BUFFER, b)
gl.BufferData(gl.PIXEL_UNPACK_BUFFER, 4*width*height, nil, gl.STREAM_DRAW)
gl.BindBuffer(gl.PIXEL_UNPACK_BUFFER, 0)
return buffer(b)
}
func (c *context) replacePixelsWithPBO(buffer buffer, t textureNative, width, height int, args []*driver.ReplacePixelsArgs) {
c.bindTexture(t)
gl.BindBuffer(gl.PIXEL_UNPACK_BUFFER, uint32(buffer))
stride := 4 * width
for _, a := range args {
offset := 4 * (a.Y*width + a.X)
for j := 0; j < a.Height; j++ {
gl.BufferSubData(gl.PIXEL_UNPACK_BUFFER, offset+stride*j, 4*a.Width, gl.Ptr(a.Pixels[4*a.Width*j:4*a.Width*(j+1)]))
}
}
gl.TexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, int32(width), int32(height), gl.RGBA, gl.UNSIGNED_BYTE, nil)
gl.BindBuffer(gl.PIXEL_UNPACK_BUFFER, 0)
}
func (c *context) getBufferSubData(buffer buffer, width, height int) []byte {
gl.BindBuffer(gl.PIXEL_UNPACK_BUFFER, uint32(buffer))
pixels := make([]byte, 4*width*height)
gl.GetBufferSubData(gl.PIXEL_UNPACK_BUFFER, 0, 4*width*height, gl.Ptr(pixels))
gl.BindBuffer(gl.PIXEL_UNPACK_BUFFER, 0)
return pixels
}
func (c *context) enableStencilTest() { func (c *context) enableStencilTest() {
gl.Enable(gl.STENCIL_TEST) gl.Enable(gl.STENCIL_TEST)
} }

View File

@ -599,54 +599,6 @@ func (c *context) texSubImage2D(t textureNative, args []*driver.ReplacePixelsArg
} }
} }
func (c *context) newPixelBufferObject(width, height int) buffer {
gl := c.gl
b := gl.createBuffer.Invoke()
gl.bindBuffer.Invoke(gles.PIXEL_UNPACK_BUFFER, js.Value(b))
gl.bufferData.Invoke(gles.PIXEL_UNPACK_BUFFER, 4*width*height, gles.STREAM_DRAW)
gl.bindBuffer.Invoke(gles.PIXEL_UNPACK_BUFFER, nil)
return buffer(b)
}
func (c *context) replacePixelsWithPBO(buffer buffer, t textureNative, width, height int, args []*driver.ReplacePixelsArgs) {
if !isWebGL2Available {
panic("opengl: WebGL2 must be available when replacePixelsWithPBO is called")
}
c.bindTexture(t)
gl := c.gl
gl.bindBuffer.Invoke(gles.PIXEL_UNPACK_BUFFER, js.Value(buffer))
stride := 4 * width
for _, a := range args {
arr := jsutil.TemporaryUint8Array(len(a.Pixels), a.Pixels)
offset := 4 * (a.Y*width + a.X)
for j := 0; j < a.Height; j++ {
gl.bufferSubData.Invoke(gles.PIXEL_UNPACK_BUFFER, offset+stride*j, arr, 4*a.Width*j, 4*a.Width)
}
}
// void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
// GLsizei width, GLsizei height,
// GLenum format, GLenum type, GLintptr offset);
gl.texSubImage2D.Invoke(gles.TEXTURE_2D, 0, 0, 0, width, height, gles.RGBA, gles.UNSIGNED_BYTE, 0)
gl.bindBuffer.Invoke(gles.PIXEL_UNPACK_BUFFER, nil)
}
func (c *context) getBufferSubData(buffer buffer, width, height int) []byte {
if !isWebGL2Available {
panic("opengl: WebGL2 must be available when getBufferSubData is called")
}
gl := c.gl
gl.bindBuffer.Invoke(gles.PIXEL_UNPACK_BUFFER, js.Value(buffer))
l := 4 * width * height
arr := jsutil.TemporaryUint8Array(l, nil)
gl.getBufferSubData.Invoke(gles.PIXEL_UNPACK_BUFFER, 0, arr, 0, l)
gl.bindBuffer.Invoke(gles.PIXEL_UNPACK_BUFFER, nil)
return jsutil.Uint8ArrayToSlice(arr, l)
}
func (c *context) enableStencilTest() { func (c *context) enableStencilTest() {
gl := c.gl gl := c.gl
gl.enable.Invoke(gles.STENCIL_TEST) gl.enable.Invoke(gles.STENCIL_TEST)

View File

@ -469,38 +469,6 @@ func (c *context) texSubImage2D(t textureNative, args []*driver.ReplacePixelsArg
} }
} }
func (c *context) newPixelBufferObject(width, height int) buffer {
b := c.ctx.GenBuffers(1)[0]
c.ctx.BindBuffer(gles.PIXEL_UNPACK_BUFFER, b)
c.ctx.BufferData(gles.PIXEL_UNPACK_BUFFER, 4*width*height, nil, gles.STREAM_DRAW)
c.ctx.BindBuffer(gles.PIXEL_UNPACK_BUFFER, 0)
return buffer(b)
}
func (c *context) replacePixelsWithPBO(buffer buffer, t textureNative, width, height int, args []*driver.ReplacePixelsArgs) {
// This implementation is not used yet so far. See the comment at canUsePBO.
c.bindTexture(t)
c.ctx.BindBuffer(gles.PIXEL_UNPACK_BUFFER, uint32(buffer))
stride := 4 * width
for _, a := range args {
offset := 4 * (a.Y*width + a.X)
for j := 0; j < a.Height; j++ {
c.ctx.BufferSubData(gles.PIXEL_UNPACK_BUFFER, offset+stride*j, a.Pixels[4*a.Width*j:4*a.Width*(j+1)])
}
}
c.ctx.TexSubImage2D(gles.TEXTURE_2D, 0, 0, 0, int32(width), int32(height), gles.RGBA, gles.UNSIGNED_BYTE, nil)
c.ctx.BindBuffer(gles.PIXEL_UNPACK_BUFFER, 0)
}
func (c *context) getBufferSubData(buffer buffer, width, height int) []byte {
// gl.GetBufferSubData doesn't exist on OpenGL ES 2 and 3.
// As PBO is not used in mobiles, leave this unimplemented so far.
panic("opengl: getBufferSubData is not implemented for mobiles")
}
func (c *context) enableStencilTest() { func (c *context) enableStencilTest() {
c.ctx.Enable(gles.STENCIL_TEST) c.ctx.Enable(gles.STENCIL_TEST)
} }

View File

@ -149,11 +149,6 @@ func (g *Graphics) SetVertices(vertices []float32, indices []uint16) {
func (g *Graphics) DrawTriangles(dstID driver.ImageID, srcIDs [graphics.ShaderImageNum]driver.ImageID, offsets [graphics.ShaderImageNum - 1][2]float32, shaderID driver.ShaderID, indexLen int, indexOffset int, mode driver.CompositeMode, colorM *affine.ColorM, filter driver.Filter, address driver.Address, dstRegion, srcRegion driver.Region, uniforms []interface{}, evenOdd bool) error { func (g *Graphics) DrawTriangles(dstID driver.ImageID, srcIDs [graphics.ShaderImageNum]driver.ImageID, offsets [graphics.ShaderImageNum - 1][2]float32, shaderID driver.ShaderID, indexLen int, indexOffset int, mode driver.CompositeMode, colorM *affine.ColorM, filter driver.Filter, address driver.Address, dstRegion, srcRegion driver.Region, uniforms []interface{}, evenOdd bool) error {
destination := g.images[dstID] destination := g.images[dstID]
if !destination.pbo.equal(*new(buffer)) {
g.context.deleteBuffer(destination.pbo)
destination.pbo = *new(buffer)
}
g.drawCalled = true g.drawCalled = true
if err := destination.setViewport(); err != nil { if err := destination.setViewport(); err != nil {

View File

@ -25,7 +25,6 @@ type Image struct {
texture textureNative texture textureNative
stencil renderbufferNative stencil renderbufferNative
framebuffer *framebuffer framebuffer *framebuffer
pbo buffer
width int width int
height int height int
screen bool screen bool
@ -40,9 +39,6 @@ func (i *Image) IsInvalidated() bool {
} }
func (i *Image) Dispose() { func (i *Image) Dispose() {
if !i.pbo.equal(*new(buffer)) {
i.graphics.context.deleteBuffer(i.pbo)
}
if i.framebuffer != nil { if i.framebuffer != nil {
i.framebuffer.delete(&i.graphics.context) i.framebuffer.delete(&i.graphics.context)
} }
@ -69,15 +65,7 @@ func (i *Image) Pixels() ([]byte, error) {
return nil, err return nil, err
} }
// PBO is created only when PBO is enabled AND ReplacePixels is called. p := i.graphics.context.framebufferPixels(i.framebuffer, i.width, i.height)
// If PBO is enabled but the buffer doesn't exist, this means either ReplacePixels is not called or
// different draw calls than ReplacePixels were called.
if !i.graphics.context.canUsePBO() || i.pbo.equal(*new(buffer)) {
p := i.graphics.context.framebufferPixels(i.framebuffer, i.width, i.height)
return p, nil
}
p := i.graphics.context.getBufferSubData(i.pbo, i.width, i.height)
return p, nil return p, nil
} }
@ -144,25 +132,5 @@ func (i *Image) ReplacePixels(args []*driver.ReplacePixelsArgs) {
i.graphics.context.flush() i.graphics.context.flush()
} }
i.graphics.drawCalled = false i.graphics.drawCalled = false
i.graphics.context.texSubImage2D(i.texture, args)
// TODO: Now canUsePBO always returns false (#1678). Remove the code for PBO.
if !i.graphics.context.canUsePBO() {
i.graphics.context.texSubImage2D(i.texture, args)
return
}
w, h := i.width, i.height
if i.pbo.equal(*new(buffer)) {
i.pbo = i.graphics.context.newPixelBufferObject(w, h)
if i.pbo.equal(*new(buffer)) {
panic("opengl: newPixelBufferObject failed")
}
if i.framebuffer != nil {
i.graphics.context.framebufferPixelsToBuffer(i.framebuffer, i.pbo, i.width, i.height)
}
}
if i.pbo.equal(*new(buffer)) {
panic("opengl: newPixelBufferObject failed")
}
i.graphics.context.replacePixelsWithPBO(i.pbo, i.texture, w, h, args)
} }