mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-25 11:18:54 +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
|
src *Image
|
||||||
dst *Image
|
dst *Image
|
||||||
|
|
||||||
transparent bool
|
transparent bool
|
||||||
maxImageSize int
|
maxImageSize int
|
||||||
tmpTextures []mtl.Texture
|
tmpTextures []mtl.Texture
|
||||||
|
needCommitReplacePixels bool
|
||||||
|
|
||||||
pool unsafe.Pointer
|
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 {
|
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]
|
dst := g.images[dstID]
|
||||||
|
|
||||||
if dst.screen {
|
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.CopyFromTexture(t, 0, 0, so, ss, i.texture, 0, 0, do)
|
||||||
}
|
}
|
||||||
bce.EndEncoding()
|
bce.EndEncoding()
|
||||||
|
g.needCommitReplacePixels = true
|
||||||
|
|
||||||
return nil
|
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