ebiten: Remove shaders from DrawImage

Updates #1325
This commit is contained in:
Hajime Hoshi 2020-09-20 18:13:57 +09:00
parent 0db7dc22b2
commit 938d78122f
2 changed files with 12 additions and 44 deletions

View File

@ -116,8 +116,6 @@ type DrawImageOptions struct {
// ColorM is a color matrix to draw. // ColorM is a color matrix to draw.
// The default (zero) value is identity, which doesn't change any color. // The default (zero) value is identity, which doesn't change any color.
//
// If Shader is not nil, ColorM is ignored.
ColorM ColorM ColorM ColorM
// CompositeMode is a composite mode to draw. // CompositeMode is a composite mode to draw.
@ -134,18 +132,8 @@ type DrawImageOptions struct {
// FilterNearest is used. // FilterNearest is used.
// If either is FilterDefault and the other is not, the latter is used. // If either is FilterDefault and the other is not, the latter is used.
// Otherwise, Filter specified at DrawImageOptions is used. // Otherwise, Filter specified at DrawImageOptions is used.
//
// If Shader is not nil, Filter is ignored.
Filter Filter Filter Filter
// Shader is a shader.
Shader *Shader
// Uniforms is a set of uniform variables for the shader.
//
// Uniforms is used only when Shader is not nil.
Uniforms map[string]interface{}
// Deprecated: (as of 1.5.0) Use SubImage instead. // Deprecated: (as of 1.5.0) Use SubImage instead.
ImageParts ImageParts ImageParts ImageParts
@ -181,7 +169,6 @@ type DrawImageOptions struct {
// elements. // elements.
// * All CompositeMode values are same // * All CompositeMode values are same
// * All Filter values are same // * All Filter values are same
// * All Shader values are nil
// //
// Even when all the above conditions are satisfied, multiple draw commands can // Even when all the above conditions are satisfied, multiple draw commands can
// be used in really rare cases. Ebiten images usually share an internal // be used in really rare cases. Ebiten images usually share an internal
@ -193,8 +180,6 @@ type DrawImageOptions struct {
// //
// For more performance tips, see https://ebiten.org/documents/performancetips.html // For more performance tips, see https://ebiten.org/documents/performancetips.html
// //
// ColorM and Filter are ignored when Shader is not nil.
//
// DrawImage always returns nil as of 1.5.0. // DrawImage always returns nil as of 1.5.0.
func (i *Image) DrawImage(img *Image, options *DrawImageOptions) error { func (i *Image) DrawImage(img *Image, options *DrawImageOptions) error {
i.copyCheck() i.copyCheck()
@ -257,12 +242,10 @@ func (i *Image) DrawImage(img *Image, options *DrawImageOptions) error {
mode := driver.CompositeMode(options.CompositeMode) mode := driver.CompositeMode(options.CompositeMode)
filter := driver.FilterNearest filter := driver.FilterNearest
if options.Shader == nil { if options.Filter != FilterDefault {
if options.Filter != FilterDefault { filter = driver.Filter(options.Filter)
filter = driver.Filter(options.Filter) } else if img.filter != FilterDefault {
} else if img.filter != FilterDefault { filter = driver.Filter(img.filter)
filter = driver.Filter(img.filter)
}
} }
a, b, c, d, tx, ty := options.GeoM.elements32() a, b, c, d, tx, ty := options.GeoM.elements32()
@ -275,22 +258,7 @@ func (i *Image) DrawImage(img *Image, options *DrawImageOptions) error {
is := graphics.QuadIndices() is := graphics.QuadIndices()
srcs := [graphics.ShaderImageNum]*mipmap.Mipmap{img.mipmap} srcs := [graphics.ShaderImageNum]*mipmap.Mipmap{img.mipmap}
if options.Shader == nil { i.mipmap.DrawTriangles(srcs, vs, is, options.ColorM.impl, mode, filter, driver.AddressUnsafe, driver.Region{}, [graphics.ShaderImageNum - 1][2]float32{}, nil, nil, canSkipMipmap(options.GeoM, filter))
i.mipmap.DrawTriangles(srcs, vs, is, options.ColorM.impl, mode, filter, driver.AddressUnsafe, driver.Region{}, [graphics.ShaderImageNum - 1][2]float32{}, nil, nil, canSkipMipmap(options.GeoM, filter))
return nil
}
// Pass the source region only when the shader is used, since this affects the condition of merging graphics
// commands (#1293).
sr := driver.Region{
X: float32(bounds.Min.X),
Y: float32(bounds.Min.Y),
Width: float32(bounds.Dx()),
Height: float32(bounds.Dy()),
}
us := options.Shader.convertUniforms(options.Uniforms)
i.mipmap.DrawTriangles(srcs, vs, is, nil, mode, filter, driver.AddressUnsafe, sr, [graphics.ShaderImageNum - 1][2]float32{}, options.Shader.shader, us, canSkipMipmap(options.GeoM, filter))
return nil return nil
} }
@ -365,7 +333,7 @@ type DrawTrianglesOptions struct {
// Images is a set of the additional source images. // Images is a set of the additional source images.
// All the image must be the same size as the img argument at DrawTriangles. // All the image must be the same size as the img argument at DrawTriangles.
// //
// If Shader is nil, Imagse is ignored. // Images is used only when Shader is not nil.
Images [3]*Image Images [3]*Image
} }

View File

@ -67,9 +67,9 @@ func Fragment(position vec4, texCoord vec2, color vec4) vec4 {
} }
src, _ := NewImage(w/2, h/2, FilterDefault) src, _ := NewImage(w/2, h/2, FilterDefault)
op := &DrawImageOptions{} op := &DrawRectShaderOptions{}
op.Shader = s op.Images[0] = src
dst.DrawImage(src, op) dst.DrawRectShader(w/2, h/2, s, op)
for j := 0; j < h; j++ { for j := 0; j < h; j++ {
for i := 0; i < w; i++ { for i := 0; i < w; i++ {
@ -785,9 +785,9 @@ func Fragment(position vec4, texCoord vec2, color vec4) vec4 {
} }
src, _ := NewImage(w, h, FilterDefault) src, _ := NewImage(w, h, FilterDefault)
op := &DrawImageOptions{} op := &DrawRectShaderOptions{}
op.Shader = s op.Images[0] = src
dst.DrawImage(src, op) dst.DrawRectShader(w, h, s, op)
for j := 0; j < h; j++ { for j := 0; j < h; j++ {
for i := 0; i < w; i++ { for i := 0; i < w; i++ {