shareable: Reset non-updated-count at ReplacePixels

Before this change, ReplacePixels didn't affect the non-updated-count,
and an image using ReplacePixels tended to be on a shared image.
This was OK, but as lazy pixel loading is going to be introduced,
ReplacePixels also needs to reset the count.

Updates #1414
This commit is contained in:
Hajime Hoshi 2020-11-06 02:10:03 +09:00
parent 34d7385e6d
commit e30d46e947
2 changed files with 37 additions and 2 deletions

View File

@ -187,9 +187,13 @@ func (i *Image) isShared() bool {
return i.node != nil
}
func (i *Image) ensureNotShared() {
func (i *Image) resetNonUpdatedCount() {
i.nonUpdatedCount = 0
delete(imagesToMakeShared, i)
}
func (i *Image) ensureNotShared() {
i.resetNonUpdatedCount()
if i.backend == nil {
i.allocate(false)
@ -419,6 +423,9 @@ func (i *Image) replacePixels(pix []byte) {
if i.disposed {
panic("shareable: the image must not be disposed at replacePixels")
}
i.resetNonUpdatedCount()
if i.backend == nil {
if pix == nil {
return

View File

@ -204,6 +204,7 @@ func TestReshared(t *testing.T) {
}
}
// img1 is on a shared image again.
img0.DrawTriangles([graphics.ShaderImageNum]*Image{img1}, vs, is, nil, driver.CompositeModeCopy, driver.FilterNearest, driver.AddressUnsafe, driver.Region{}, [graphics.ShaderImageNum - 1][2]float32{}, nil, nil)
if got, want := img1.IsSharedForTesting(), true; got != want {
t.Errorf("got: %v, want: %v", got, want)
@ -227,7 +228,34 @@ func TestReshared(t *testing.T) {
}
}
// Use img3 as a render source. img3 never uses a shared texture.
// Use img1 as a render target again.
img1.DrawTriangles([graphics.ShaderImageNum]*Image{img2}, vs, is, nil, driver.CompositeModeCopy, driver.FilterNearest, driver.AddressUnsafe, driver.Region{}, [graphics.ShaderImageNum - 1][2]float32{}, nil, nil)
if got, want := img1.IsSharedForTesting(), false; got != want {
t.Errorf("got: %v, want: %v", got, want)
}
// Use img1 as a render source, but call ReplacePixels.
for i := 0; i < MaxCountForShare; i++ {
if err := MakeImagesSharedForTesting(); err != nil {
t.Fatal(err)
}
img1.ReplacePixels(make([]byte, 4*size*size))
img0.DrawTriangles([graphics.ShaderImageNum]*Image{img1}, vs, is, nil, driver.CompositeModeCopy, driver.FilterNearest, driver.AddressUnsafe, driver.Region{}, [graphics.ShaderImageNum - 1][2]float32{}, nil, nil)
if got, want := img1.IsSharedForTesting(), false; got != want {
t.Errorf("got: %v, want: %v", got, want)
}
}
if err := MakeImagesSharedForTesting(); err != nil {
t.Fatal(err)
}
// img1 is not on a shared image due to ReplacePixels.
img0.DrawTriangles([graphics.ShaderImageNum]*Image{img1}, vs, is, nil, driver.CompositeModeCopy, driver.FilterNearest, driver.AddressUnsafe, driver.Region{}, [graphics.ShaderImageNum - 1][2]float32{}, nil, nil)
if got, want := img1.IsSharedForTesting(), false; got != want {
t.Errorf("got: %v, want: %v", got, want)
}
// Use img3 as a render source. As img3 is volatile, img3 never uses a shared texture.
for i := 0; i < MaxCountForShare*2; i++ {
if err := MakeImagesSharedForTesting(); err != nil {
t.Fatal(err)