mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-11-10 04:57:26 +01:00
internal/graphicsdriver/metal: bug fix: need to commit replace-pixels commands at DrawTriangles
Closes #2154
This commit is contained in:
parent
667bf2ff9d
commit
ac802cf0d0
@ -331,9 +331,10 @@ type Graphics struct {
|
||||
src *Image
|
||||
dst *Image
|
||||
|
||||
transparent bool
|
||||
maxImageSize int
|
||||
tmpTextures []mtl.Texture
|
||||
transparent bool
|
||||
maxImageSize int
|
||||
tmpTextures []mtl.Texture
|
||||
needCommitReplacePixels bool
|
||||
|
||||
pool unsafe.Pointer
|
||||
}
|
||||
@ -878,6 +879,17 @@ func (g *Graphics) draw(rps mtl.RenderPipelineState, dst *Image, dstRegion graph
|
||||
}
|
||||
|
||||
func (g *Graphics) DrawTriangles(dstID graphicsdriver.ImageID, srcIDs [graphics.ShaderImageNum]graphicsdriver.ImageID, offsets [graphics.ShaderImageNum - 1][2]float32, shaderID graphicsdriver.ShaderID, indexLen int, indexOffset int, mode graphicsdriver.CompositeMode, colorM graphicsdriver.ColorM, filter graphicsdriver.Filter, address graphicsdriver.Address, dstRegion, srcRegion graphicsdriver.Region, uniforms [][]float32, evenOdd bool) error {
|
||||
// Resolve all the replace-pixels commands before rendering with vertices (#2154).
|
||||
// TODO: Find a better way to sync a copy-engine and a draw-engine with MTLFence.
|
||||
if g.needCommitReplacePixels {
|
||||
if g.cb != (mtl.CommandBuffer{}) {
|
||||
g.cb.Commit()
|
||||
g.cb.WaitUntilCompleted()
|
||||
g.cb = mtl.CommandBuffer{}
|
||||
}
|
||||
g.needCommitReplacePixels = false
|
||||
}
|
||||
|
||||
dst := g.images[dstID]
|
||||
|
||||
if dst.screen {
|
||||
@ -1266,6 +1278,7 @@ func (i *Image) ReplacePixels(args []*graphicsdriver.ReplacePixelsArgs) error {
|
||||
bce.CopyFromTexture(t, 0, 0, so, ss, i.texture, 0, 0, do)
|
||||
}
|
||||
bce.EndEncoding()
|
||||
g.needCommitReplacePixels = true
|
||||
|
||||
return nil
|
||||
}
|
||||
|
91
internal/processtest/testdata/issue2154.go
vendored
Normal file
91
internal/processtest/testdata/issue2154.go
vendored
Normal file
@ -0,0 +1,91 @@
|
||||
// Copyright 2022 The Ebitengine Authors
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
//go:build ignore
|
||||
// +build ignore
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"image/color"
|
||||
|
||||
"github.com/hajimehoshi/ebiten/v2"
|
||||
)
|
||||
|
||||
var regularTermination = errors.New("regular termination")
|
||||
|
||||
var src *ebiten.Image
|
||||
|
||||
func init() {
|
||||
const (
|
||||
w = 2
|
||||
h = 2
|
||||
)
|
||||
|
||||
src0 := ebiten.NewImage(w, h)
|
||||
src0.Fill(color.RGBA{0xff, 0xff, 0xff, 0xff})
|
||||
for j := 0; j < h; j++ {
|
||||
for i := 0; i < w; i++ {
|
||||
src0.Set(i, j, color.RGBA{0, 0, 0, 0xff})
|
||||
}
|
||||
}
|
||||
|
||||
src1 := ebiten.NewImage(w, h)
|
||||
src1.DrawImage(src0, nil)
|
||||
|
||||
src = src1
|
||||
}
|
||||
|
||||
type Game struct {
|
||||
count int
|
||||
dst *ebiten.Image
|
||||
}
|
||||
|
||||
func (g *Game) Update() error {
|
||||
g.count++
|
||||
if g.count == 16 {
|
||||
return regularTermination
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (g *Game) Draw(screen *ebiten.Image) {
|
||||
screen.Fill(color.RGBA{0xff, 0xff, 0xff, 0xff})
|
||||
screen.DrawImage(src, nil)
|
||||
|
||||
if g.dst == nil {
|
||||
g.dst = ebiten.NewImage(screen.Size())
|
||||
return
|
||||
}
|
||||
|
||||
// Get the pixel at the next frame.
|
||||
g.dst.DrawImage(screen, nil)
|
||||
got := g.dst.At(0, 0)
|
||||
want := color.RGBA{0, 0, 0, 0xff}
|
||||
if got != want {
|
||||
panic(fmt.Sprintf("got: %v, want: %v", got, want))
|
||||
}
|
||||
}
|
||||
|
||||
func (g *Game) Layout(width, height int) (int, int) {
|
||||
return width, height
|
||||
}
|
||||
|
||||
func main() {
|
||||
if err := ebiten.RunGame(&Game{}); err != nil && err != regularTermination {
|
||||
panic(err)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user