mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-25 03:08:54 +01:00
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:
parent
34d7385e6d
commit
e30d46e947
@ -187,9 +187,13 @@ func (i *Image) isShared() bool {
|
|||||||
return i.node != nil
|
return i.node != nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *Image) ensureNotShared() {
|
func (i *Image) resetNonUpdatedCount() {
|
||||||
i.nonUpdatedCount = 0
|
i.nonUpdatedCount = 0
|
||||||
delete(imagesToMakeShared, i)
|
delete(imagesToMakeShared, i)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *Image) ensureNotShared() {
|
||||||
|
i.resetNonUpdatedCount()
|
||||||
|
|
||||||
if i.backend == nil {
|
if i.backend == nil {
|
||||||
i.allocate(false)
|
i.allocate(false)
|
||||||
@ -419,6 +423,9 @@ func (i *Image) replacePixels(pix []byte) {
|
|||||||
if i.disposed {
|
if i.disposed {
|
||||||
panic("shareable: the image must not be disposed at replacePixels")
|
panic("shareable: the image must not be disposed at replacePixels")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
i.resetNonUpdatedCount()
|
||||||
|
|
||||||
if i.backend == nil {
|
if i.backend == nil {
|
||||||
if pix == nil {
|
if pix == nil {
|
||||||
return
|
return
|
||||||
|
@ -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)
|
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 {
|
if got, want := img1.IsSharedForTesting(), true; got != want {
|
||||||
t.Errorf("got: %v, want: %v", 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++ {
|
for i := 0; i < MaxCountForShare*2; i++ {
|
||||||
if err := MakeImagesSharedForTesting(); err != nil {
|
if err := MakeImagesSharedForTesting(); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
Loading…
Reference in New Issue
Block a user