internal/restorable: performance optimization

This commit is contained in:
Hajime Hoshi 2024-10-25 19:25:43 +09:00
parent 0da99e2c37
commit d334db8291

View File

@ -337,24 +337,39 @@ func (i *Image) DrawTriangles(srcs [graphics.ShaderSrcImageCount]*Image, vertice
return return
} }
// Use the fast path when this package is not enabled.
if !needsRestoration() || !i.needsRestoration() {
var srcImages [graphics.ShaderSrcImageCount]*graphicscommand.Image
for i, src := range srcs {
if src == nil {
continue
}
srcImages[i] = src.image
}
i.makeStale(dstRegion)
i.image.DrawTriangles(srcImages, vertices, indices, blend, dstRegion, srcRegions, shader.shader, uniforms, fillRule)
return
}
// makeStaleIfDependingOnAtRegion is not available here. // makeStaleIfDependingOnAtRegion is not available here.
// This might create cyclic dependency. // This might create cyclic dependency.
theImages.makeStaleIfDependingOn(i) theImages.makeStaleIfDependingOn(i)
// TODO: Add tests to confirm this logic. // TODO: Add tests to confirm this logic.
var srcstale bool var srcstale bool
for _, src := range srcs { var srcImages [graphics.ShaderSrcImageCount]*graphicscommand.Image
for i, src := range srcs {
if src == nil { if src == nil {
continue continue
} }
srcImages[i] = src.image
if src.stale || src.imageType == ImageTypeVolatile { if src.stale || src.imageType == ImageTypeVolatile {
srcstale = true srcstale = true
break
} }
} }
// Even if the image is already stale, call makeStale to extend the stale region. // Even if the image is already stale, call makeStale to extend the stale region.
if srcstale || !needsRestoration() || !i.needsRestoration() { if srcstale {
i.makeStale(dstRegion) i.makeStale(dstRegion)
} else if i.stale { } else if i.stale {
var overwrite bool var overwrite bool
@ -376,14 +391,7 @@ func (i *Image) DrawTriangles(srcs [graphics.ShaderSrcImageCount]*Image, vertice
i.appendDrawTrianglesHistory(srcs, vertices, indices, blend, dstRegion, srcRegions, shader, uniforms, fillRule, hint) i.appendDrawTrianglesHistory(srcs, vertices, indices, blend, dstRegion, srcRegions, shader, uniforms, fillRule, hint)
} }
var imgs [graphics.ShaderSrcImageCount]*graphicscommand.Image i.image.DrawTriangles(srcImages, vertices, indices, blend, dstRegion, srcRegions, shader.shader, uniforms, fillRule)
for i, src := range srcs {
if src == nil {
continue
}
imgs[i] = src.image
}
i.image.DrawTriangles(imgs, vertices, indices, blend, dstRegion, srcRegions, shader.shader, uniforms, fillRule)
} }
func (i *Image) areStaleRegionsIncludedIn(r image.Rectangle) bool { func (i *Image) areStaleRegionsIncludedIn(r image.Rectangle) bool {