op/paint: make every ImageOp unique

The gioui.org/commit/74407a50d598bfd27e8f8e48b6832cc5df04de77
added a NewImageOp constructor that always copies the supplied
image. It does that for two reasons:

First, the image.Image reference is used in the image=>texture
map of cached textures. Without a copy, we wouldn't detect a
modified image even if a new ImageOp was created.

Second, we don't want the program to touch the image while the GPU
is uploading it.

The second reason was removed in a previous change that blocks
FrameEvent.Frame until we're done with the operations, including
uploading images to the GPU.

The first reason is easily fixed by using a unique per ImageOp,
as pointed out by Alessandro Arzilli.

This change switches to using the unique key. Alessandro's patch
avoids the copy when possible.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2019-11-07 18:27:06 +01:00
parent d980c4652a
commit 97299dc2f9
3 changed files with 52 additions and 37 deletions
+4 -2
View File
@@ -34,7 +34,7 @@ const (
TypeTransformLen = 1 + 4*2
TypeLayerLen = 1
TypeRedrawLen = 1 + 8
TypeImageLen = 1 + 4*4
TypeImageLen = 1
TypePaintLen = 1 + 4*4
TypeColorLen = 1 + 4
TypeAreaLen = 1 + 1 + 4*4
@@ -74,8 +74,10 @@ func (t OpType) Size() int {
func (t OpType) NumRefs() int {
switch t {
case TypeMacro, TypeImage, TypeKeyInput, TypePointerInput, TypeProfile:
case TypeMacro, TypeKeyInput, TypePointerInput, TypeProfile:
return 1
case TypeImage:
return 2
default:
return 0
}