From c2eae69b474e4d987bb814bdb2b0e5d51e0e9c5f Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Thu, 14 Nov 2019 00:08:44 +0900 Subject: [PATCH] graphicscommand: Refactoring --- internal/graphicscommand/command.go | 59 +++++++++++++---------------- 1 file changed, 26 insertions(+), 33 deletions(-) diff --git a/internal/graphicscommand/command.go b/internal/graphicscommand/command.go index b3c82609e..6c5825127 100644 --- a/internal/graphicscommand/command.go +++ b/internal/graphicscommand/command.go @@ -52,7 +52,7 @@ type command interface { NumIndices() int AddNumVertices(n int) AddNumIndices(n int) - CanMerge(dst, src *Image, color *affine.ColorM, mode driver.CompositeMode, filter driver.Filter, address driver.Address) bool + CanMergeWithDrawTrianglesCommand(dst, src *Image, color *affine.ColorM, mode driver.CompositeMode, filter driver.Filter, address driver.Address) bool } type size struct { @@ -120,30 +120,6 @@ func (q *commandQueue) appendIndices(indices []uint16, offset uint16) { q.nindices += len(indices) } -func (q *commandQueue) doEnqueueDrawTrianglesCommand(dst, src *Image, nvertices, nindices int, color *affine.ColorM, mode driver.CompositeMode, filter driver.Filter, address driver.Address, forceNewCommand bool) { - if nindices > graphics.IndicesNum { - panic(fmt.Sprintf("graphicscommand: nindices must be <= graphics.IndicesNum but not at doEnqueueDrawTrianglesCommand: nindices: %d, graphics.IndicesNum: %d", nindices, graphics.IndicesNum)) - } - if !forceNewCommand && 0 < len(q.commands) { - if last := q.commands[len(q.commands)-1]; last.CanMerge(dst, src, color, mode, filter, address) { - last.AddNumVertices(nvertices) - last.AddNumIndices(nindices) - return - } - } - c := &drawTrianglesCommand{ - dst: dst, - src: src, - nvertices: nvertices, - nindices: nindices, - color: color, - mode: mode, - filter: filter, - address: address, - } - q.commands = append(q.commands, c) -} - // EnqueueDrawTrianglesCommand enqueues a drawing-image command. func (q *commandQueue) EnqueueDrawTrianglesCommand(dst, src *Image, vertices []float32, indices []uint16, color *affine.ColorM, mode driver.CompositeMode, filter driver.Filter, address driver.Address) { if len(indices) > graphics.IndicesNum { @@ -165,7 +141,24 @@ func (q *commandQueue) EnqueueDrawTrianglesCommand(dst, src *Image, vertices []f q.tmpNumIndices += len(indices) // TODO: If dst is the screen, reorder the command to be the last. - q.doEnqueueDrawTrianglesCommand(dst, src, len(vertices), len(indices), color, mode, filter, address, split) + if !split && 0 < len(q.commands) { + if last := q.commands[len(q.commands)-1]; last.CanMergeWithDrawTrianglesCommand(dst, src, color, mode, filter, address) { + last.AddNumVertices(len(vertices)) + last.AddNumIndices(len(indices)) + return + } + } + c := &drawTrianglesCommand{ + dst: dst, + src: src, + nvertices: len(vertices), + nindices: len(indices), + color: color, + mode: mode, + filter: filter, + address: address, + } + q.commands = append(q.commands, c) } // Enqueue enqueues a drawing command other than a draw-triangles command. @@ -415,9 +408,9 @@ func (c *drawTrianglesCommand) AddNumIndices(n int) { c.nindices += n } -// CanMerge returns a boolean value indicating whether the other drawTrianglesCommand can be merged +// CanMergeWithDrawTrianglesCommand returns a boolean value indicating whether the other drawTrianglesCommand can be merged // with the drawTrianglesCommand c. -func (c *drawTrianglesCommand) CanMerge(dst, src *Image, color *affine.ColorM, mode driver.CompositeMode, filter driver.Filter, address driver.Address) bool { +func (c *drawTrianglesCommand) CanMergeWithDrawTrianglesCommand(dst, src *Image, color *affine.ColorM, mode driver.CompositeMode, filter driver.Filter, address driver.Address) bool { if c.dst != dst { return false } @@ -473,7 +466,7 @@ func (c *replacePixelsCommand) AddNumVertices(n int) { func (c *replacePixelsCommand) AddNumIndices(n int) { } -func (c *replacePixelsCommand) CanMerge(dst, src *Image, color *affine.ColorM, mode driver.CompositeMode, filter driver.Filter, address driver.Address) bool { +func (c *replacePixelsCommand) CanMergeWithDrawTrianglesCommand(dst, src *Image, color *affine.ColorM, mode driver.CompositeMode, filter driver.Filter, address driver.Address) bool { return false } @@ -510,7 +503,7 @@ func (c *pixelsCommand) AddNumVertices(n int) { func (c *pixelsCommand) AddNumIndices(n int) { } -func (c *pixelsCommand) CanMerge(dst, src *Image, color *affine.ColorM, mode driver.CompositeMode, filter driver.Filter, address driver.Address) bool { +func (c *pixelsCommand) CanMergeWithDrawTrianglesCommand(dst, src *Image, color *affine.ColorM, mode driver.CompositeMode, filter driver.Filter, address driver.Address) bool { return false } @@ -543,7 +536,7 @@ func (c *disposeCommand) AddNumVertices(n int) { func (c *disposeCommand) AddNumIndices(n int) { } -func (c *disposeCommand) CanMerge(dst, src *Image, color *affine.ColorM, mode driver.CompositeMode, filter driver.Filter, address driver.Address) bool { +func (c *disposeCommand) CanMergeWithDrawTrianglesCommand(dst, src *Image, color *affine.ColorM, mode driver.CompositeMode, filter driver.Filter, address driver.Address) bool { return false } @@ -582,7 +575,7 @@ func (c *newImageCommand) AddNumVertices(n int) { func (c *newImageCommand) AddNumIndices(n int) { } -func (c *newImageCommand) CanMerge(dst, src *Image, color *affine.ColorM, mode driver.CompositeMode, filter driver.Filter, address driver.Address) bool { +func (c *newImageCommand) CanMergeWithDrawTrianglesCommand(dst, src *Image, color *affine.ColorM, mode driver.CompositeMode, filter driver.Filter, address driver.Address) bool { return false } @@ -618,7 +611,7 @@ func (c *newScreenFramebufferImageCommand) AddNumVertices(n int) { func (c *newScreenFramebufferImageCommand) AddNumIndices(n int) { } -func (c *newScreenFramebufferImageCommand) CanMerge(dst, src *Image, color *affine.ColorM, mode driver.CompositeMode, filter driver.Filter, address driver.Address) bool { +func (c *newScreenFramebufferImageCommand) CanMergeWithDrawTrianglesCommand(dst, src *Image, color *affine.ColorM, mode driver.CompositeMode, filter driver.Filter, address driver.Address) bool { return false }