From 7842942b2498fd2ff59a3e4f00df5937cbf02790 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Fri, 22 Mar 2024 23:52:13 +0900 Subject: [PATCH] internal/shader: bug fix: need to covert constant type correctly for assignments Closes #2934 --- internal/shader/stmt.go | 6 ++++++ shader_test.go | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/internal/shader/stmt.go b/internal/shader/stmt.go index 902cc7b41..729116bf6 100644 --- a/internal/shader/stmt.go +++ b/internal/shader/stmt.go @@ -582,6 +582,12 @@ func (cs *compileState) assign(block *block, fname string, pos token.Pos, lhs, r cs.addError(pos, fmt.Sprintf("cannot use type %s as type %s in variable declaration", rts[i].String(), lts[i].String())) return nil, false } + switch lts[0].Main { + case shaderir.Int: + r[i].Const = gconstant.ToInt(r[i].Const) + case shaderir.Float: + r[i].Const = gconstant.ToFloat(r[i].Const) + } } if len(lhs) == 1 { diff --git a/shader_test.go b/shader_test.go index df826ab02..e04e7749e 100644 --- a/shader_test.go +++ b/shader_test.go @@ -2559,3 +2559,39 @@ func Fragment(dstPos vec4, srcPos vec2, color vec4) vec4 { } } } + +// Issue #2934 +func TestShaderAssignConst(t *testing.T) { + const w, h = 16, 16 + + dst := ebiten.NewImage(w, h) + s, err := ebiten.NewShader([]byte(`//kage:unit pixels + +package main + +func Fragment(dstPos vec4, srcPos vec2, color vec4) vec4 { + a := 0.0 + a = 1 + b, c := 0.0, 0.0 + b, c = 1, 1 + d := 0.0 + d += 1 + return vec4(a, b, c, d) +} +`)) + if err != nil { + t.Fatal(err) + } + + dst.DrawRectShader(w, h, s, nil) + + for j := 0; j < h; j++ { + for i := 0; i < w; i++ { + got := dst.At(i, j).(color.RGBA) + want := color.RGBA{R: 0xff, G: 0xff, B: 0xff, A: 0xff} + if !sameColors(got, want, 2) { + t.Errorf("dst.At(%d, %d): got: %v, want: %v", i, j, got, want) + } + } + } +}