diff --git a/gpu/gpu.go b/gpu/gpu.go index 9d3dafee..4a91e9a2 100644 --- a/gpu/gpu.go +++ b/gpu/gpu.go @@ -224,7 +224,7 @@ type blitter struct { type blitColUniforms struct { vert struct { blitUniforms - _ [8]byte // Padding to a multiple of 16. + _ [10]byte // Padding to a multiple of 16. } frag struct { colorUniforms @@ -234,7 +234,7 @@ type blitColUniforms struct { type blitTexUniforms struct { vert struct { blitUniforms - _ [8]byte // Padding to a multiple of 16. + _ [10]byte // Padding to a multiple of 16. } } @@ -250,12 +250,9 @@ type program struct { } type blitUniforms struct { - z float32 - _ float32 // Padding. - scale [2]float32 - offset [2]float32 - uvScale [2]float32 - uvOffset [2]float32 + transform [4]float32 + uvTransform [4]float32 + z float32 } type colorUniforms struct { @@ -554,8 +551,7 @@ func (r *renderer) intersectPath(p *pathOp, clip image.Rectangle) { fbo := r.pather.stenciler.cover(p.place.Idx) r.ctx.BindTexture(0, fbo.tex) coverScale, coverOff := texSpaceTransform(toRectF(uv), fbo.size) - r.pather.stenciler.iprog.uniforms.vert.uvScale = [2]float32{coverScale.X, coverScale.Y} - r.pather.stenciler.iprog.uniforms.vert.uvOffset = [2]float32{coverOff.X, coverOff.Y} + r.pather.stenciler.iprog.uniforms.vert.uvTransform = [4]float32{coverScale.X, coverScale.Y, coverOff.X, coverOff.Y} r.pather.stenciler.iprog.prog.UploadUniforms() r.ctx.DrawArrays(backend.DrawModeTriangleStrip, 0, 4) } @@ -911,13 +907,11 @@ func (b *blitter) blit(z float32, mat materialType, col [4]float32, scale, off, b.colUniforms.frag.color = col uniforms = &b.colUniforms.vert.blitUniforms case materialTexture: - b.texUniforms.vert.uvScale = [2]float32{uvScale.X, uvScale.Y} - b.texUniforms.vert.uvOffset = [2]float32{uvOff.X, uvOff.Y} + b.texUniforms.vert.uvTransform = [4]float32{uvScale.X, uvScale.Y, uvOff.X, uvOff.Y} uniforms = &b.texUniforms.vert.blitUniforms } uniforms.z = z - uniforms.scale = [2]float32{scale.X, scale.Y} - uniforms.offset = [2]float32{off.X, off.Y} + uniforms.transform = [4]float32{scale.X, scale.Y, off.X, off.Y} p.UploadUniforms() b.ctx.DrawArrays(backend.DrawModeTriangleStrip, 0, 4) } diff --git a/gpu/path.go b/gpu/path.go index 2c5f0fc1..d436af11 100644 --- a/gpu/path.go +++ b/gpu/path.go @@ -35,14 +35,14 @@ type coverer struct { type coverTexUniforms struct { vert struct { coverUniforms - _ [8]byte // Padding to multiple of 16. + _ [12]byte // Padding to multiple of 16. } } type coverColUniforms struct { vert struct { coverUniforms - _ [8]byte // Padding to multiple of 16. + _ [12]byte // Padding to multiple of 16. } frag struct { colorUniforms @@ -50,14 +50,10 @@ type coverColUniforms struct { } type coverUniforms struct { - z float32 - _ float32 // Padding. - scale [2]float32 - offset [2]float32 - uvCoverScale [2]float32 - uvCoverOffset [2]float32 - uvScale [2]float32 - uvOffset [2]float32 + transform [4]float32 + uvCoverTransform [4]float32 + uvTransform [4]float32 + z float32 } type stenciler struct { @@ -79,8 +75,7 @@ type stenciler struct { type stencilUniforms struct { vert struct { - scale [2]float32 - offset [2]float32 + transform [4]float32 pathOffset [2]float32 _ [8]byte // Padding to multiple of 16. } @@ -88,8 +83,7 @@ type stencilUniforms struct { type intersectUniforms struct { vert struct { - uvScale [2]float32 - uvOffset [2]float32 + uvTransform [4]float32 } } @@ -329,8 +323,7 @@ func (s *stenciler) stencilPath(bounds image.Rectangle, offset f32.Point, uv ima texSize := f32.Point{X: float32(bounds.Dx()), Y: float32(bounds.Dy())} scale := f32.Point{X: 2 / texSize.X, Y: 2 / texSize.Y} orig := f32.Point{X: -1 - float32(bounds.Min.X)*2/texSize.X, Y: -1 - float32(bounds.Min.Y)*2/texSize.Y} - s.prog.uniforms.vert.scale = [2]float32{scale.X, scale.Y} - s.prog.uniforms.vert.offset = [2]float32{orig.X, orig.Y} + s.prog.uniforms.vert.transform = [4]float32{scale.X, scale.Y, orig.X, orig.Y} s.prog.uniforms.vert.pathOffset = [2]float32{offset.X, offset.Y} s.prog.prog.UploadUniforms() // Draw in batches that fit in uint16 indices. @@ -361,15 +354,12 @@ func (c *coverer) cover(z float32, mat materialType, col [4]float32, scale, off, c.colUniforms.frag.color = col uniforms = &c.colUniforms.vert.coverUniforms case materialTexture: - c.texUniforms.vert.uvScale = [2]float32{uvScale.X, uvScale.Y} - c.texUniforms.vert.uvOffset = [2]float32{uvOff.X, uvOff.Y} + c.texUniforms.vert.uvTransform = [4]float32{uvScale.X, uvScale.Y, uvOff.X, uvOff.Y} uniforms = &c.texUniforms.vert.coverUniforms } uniforms.z = z - uniforms.scale = [2]float32{scale.X, scale.Y} - uniforms.offset = [2]float32{off.X, off.Y} - uniforms.uvCoverScale = [2]float32{coverScale.X, coverScale.Y} - uniforms.uvCoverOffset = [2]float32{coverOff.X, coverOff.Y} + uniforms.transform = [4]float32{scale.X, scale.Y, off.X, off.Y} + uniforms.uvCoverTransform = [4]float32{coverScale.X, coverScale.Y, coverOff.X, coverOff.Y} p.UploadUniforms() c.ctx.DrawArrays(backend.DrawModeTriangleStrip, 0, 4) } diff --git a/gpu/shaders.go b/gpu/shaders.go index 6101eac3..f0218923 100644 --- a/gpu/shaders.go +++ b/gpu/shaders.go @@ -94,19 +94,17 @@ var ( Inputs: []backend.InputLocation{backend.InputLocation{Name: "pos", Location: 0, Semantic: "POSITION", SemanticIndex: 0, Type: 0x0, Size: 2}, backend.InputLocation{Name: "uv", Location: 1, Semantic: "NORMAL", SemanticIndex: 0, Type: 0x0, Size: 2}}, Uniforms: backend.UniformsReflection{ Blocks: []backend.UniformBlock{backend.UniformBlock{Name: "Block", Binding: 0}}, - Locations: []backend.UniformLocation{backend.UniformLocation{Name: "_15.z", Type: 0x0, Size: 1, Offset: 0}, backend.UniformLocation{Name: "_15.scale", Type: 0x0, Size: 2, Offset: 8}, backend.UniformLocation{Name: "_15.offset", Type: 0x0, Size: 2, Offset: 16}, backend.UniformLocation{Name: "_15.uvScale", Type: 0x0, Size: 2, Offset: 24}, backend.UniformLocation{Name: "_15.uvOffset", Type: 0x0, Size: 2, Offset: 32}}, - Size: 40, + Locations: []backend.UniformLocation{backend.UniformLocation{Name: "_16.transform", Type: 0x0, Size: 4, Offset: 0}, backend.UniformLocation{Name: "_16.uvTransform", Type: 0x0, Size: 4, Offset: 16}, backend.UniformLocation{Name: "_16.z", Type: 0x0, Size: 1, Offset: 32}}, + Size: 36, }, - GLSL100ES: "#version 100\n\nstruct Block\n{\n float z;\n vec2 scale;\n vec2 offset;\n vec2 uvScale;\n vec2 uvOffset;\n};\n\nuniform Block _15;\n\nattribute vec2 pos;\nvarying vec2 vUV;\nattribute vec2 uv;\n\nvoid main()\n{\n vec2 p = pos;\n p *= _15.scale;\n p += _15.offset;\n gl_Position = vec4(p, _15.z, 1.0);\n vUV = (uv * _15.uvScale) + _15.uvOffset;\n}\n\n", - GLSL300ES: "#version 300 es\n\nlayout(std140) uniform Block\n{\n float z;\n vec2 scale;\n vec2 offset;\n vec2 uvScale;\n vec2 uvOffset;\n} _15;\n\nlayout(location = 0) in vec2 pos;\nout vec2 vUV;\nlayout(location = 1) in vec2 uv;\n\nvoid main()\n{\n vec2 p = pos;\n p *= _15.scale;\n p += _15.offset;\n gl_Position = vec4(p, _15.z, 1.0);\n vUV = (uv * _15.uvScale) + _15.uvOffset;\n}\n\n", + GLSL100ES: "#version 100\n\nstruct Block\n{\n vec4 transform;\n vec4 uvTransform;\n float z;\n};\n\nuniform Block _16;\n\nattribute vec2 pos;\nvarying vec2 vUV;\nattribute vec2 uv;\n\nvoid main()\n{\n vec2 p = (pos * _16.transform.xy) + _16.transform.zw;\n gl_Position = vec4(p, _16.z, 1.0);\n vUV = (uv * _16.uvTransform.xy) + _16.uvTransform.zw;\n}\n\n", + GLSL300ES: "#version 300 es\n\nlayout(std140) uniform Block\n{\n vec4 transform;\n vec4 uvTransform;\n float z;\n} _16;\n\nlayout(location = 0) in vec2 pos;\nout vec2 vUV;\nlayout(location = 1) in vec2 uv;\n\nvoid main()\n{\n vec2 p = (pos * _16.transform.xy) + _16.transform.zw;\n gl_Position = vec4(p, _16.z, 1.0);\n vUV = (uv * _16.uvTransform.xy) + _16.uvTransform.zw;\n}\n\n", /* cbuffer Block : register(b0) { - float _15_z : packoffset(c0); - float2 _15_scale : packoffset(c0.z); - float2 _15_offset : packoffset(c1); - float2 _15_uvScale : packoffset(c1.z); - float2 _15_uvOffset : packoffset(c2); + float4 _16_transform : packoffset(c0); + float4 _16_uvTransform : packoffset(c1); + float _16_z : packoffset(c2); }; @@ -129,11 +127,9 @@ var ( void vert_main() { - float2 p = pos; - p *= _15_scale; - p += _15_offset; - gl_Position = float4(p, _15_z, 1.0f); - vUV = (uv * _15_uvScale) + _15_uvOffset; + float2 p = (pos * _16_transform.xy) + _16_transform.zw; + gl_Position = float4(p, _16_z, 1.0f); + vUV = (uv * _16_uvTransform.xy) + _16_uvTransform.zw; } SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) @@ -254,21 +250,18 @@ var ( Inputs: []backend.InputLocation{backend.InputLocation{Name: "pos", Location: 0, Semantic: "POSITION", SemanticIndex: 0, Type: 0x0, Size: 2}, backend.InputLocation{Name: "uv", Location: 1, Semantic: "NORMAL", SemanticIndex: 0, Type: 0x0, Size: 2}}, Uniforms: backend.UniformsReflection{ Blocks: []backend.UniformBlock{backend.UniformBlock{Name: "Block", Binding: 0}}, - Locations: []backend.UniformLocation{backend.UniformLocation{Name: "_58.z", Type: 0x0, Size: 1, Offset: 0}, backend.UniformLocation{Name: "_58.scale", Type: 0x0, Size: 2, Offset: 8}, backend.UniformLocation{Name: "_58.offset", Type: 0x0, Size: 2, Offset: 16}, backend.UniformLocation{Name: "_58.uvCoverScale", Type: 0x0, Size: 2, Offset: 24}, backend.UniformLocation{Name: "_58.uvCoverOffset", Type: 0x0, Size: 2, Offset: 32}, backend.UniformLocation{Name: "_58.uvScale", Type: 0x0, Size: 2, Offset: 40}, backend.UniformLocation{Name: "_58.uvOffset", Type: 0x0, Size: 2, Offset: 48}}, - Size: 56, + Locations: []backend.UniformLocation{backend.UniformLocation{Name: "_58.transform", Type: 0x0, Size: 4, Offset: 0}, backend.UniformLocation{Name: "_58.uvCoverTransform", Type: 0x0, Size: 4, Offset: 16}, backend.UniformLocation{Name: "_58.uvTransform", Type: 0x0, Size: 4, Offset: 32}, backend.UniformLocation{Name: "_58.z", Type: 0x0, Size: 1, Offset: 48}}, + Size: 52, }, - GLSL100ES: "#version 100\n\nstruct Block\n{\n float z;\n vec2 scale;\n vec2 offset;\n vec2 uvCoverScale;\n vec2 uvCoverOffset;\n vec2 uvScale;\n vec2 uvOffset;\n};\n\nuniform Block _58;\n\nattribute vec2 pos;\nvarying vec2 vUV;\nattribute vec2 uv;\nvarying vec2 vCoverUV;\n\nvec3[2] fboTextureTransform()\n{\n vec3 t[2];\n t[0] = vec3(1.0, 0.0, 0.0);\n t[1] = vec3(0.0, 1.0, 0.0);\n return t;\n}\n\nvec3 transform3x2(vec3 t[2], vec3 v)\n{\n return vec3(dot(t[0], v), dot(t[1], v), dot(vec3(0.0, 0.0, 1.0), v));\n}\n\nvoid main()\n{\n gl_Position = vec4((pos * _58.scale) + _58.offset, _58.z, 1.0);\n vUV = (uv * _58.uvScale) + _58.uvOffset;\n vec3 fboTrans[2] = fboTextureTransform();\n vec3 param[2] = fboTrans;\n vec3 param_1 = vec3(uv, 1.0);\n vec3 uv3 = transform3x2(param, param_1);\n vCoverUV = ((uv3 * vec3(_58.uvCoverScale, 1.0)) + vec3(_58.uvCoverOffset, 0.0)).xy;\n}\n\n", - GLSL300ES: "#version 300 es\n\nlayout(std140) uniform Block\n{\n float z;\n vec2 scale;\n vec2 offset;\n vec2 uvCoverScale;\n vec2 uvCoverOffset;\n vec2 uvScale;\n vec2 uvOffset;\n} _58;\n\nlayout(location = 0) in vec2 pos;\nout vec2 vUV;\nlayout(location = 1) in vec2 uv;\nout vec2 vCoverUV;\n\nvec3[2] fboTextureTransform()\n{\n vec3 t[2];\n t[0] = vec3(1.0, 0.0, 0.0);\n t[1] = vec3(0.0, 1.0, 0.0);\n return t;\n}\n\nvec3 transform3x2(vec3 t[2], vec3 v)\n{\n return vec3(dot(t[0], v), dot(t[1], v), dot(vec3(0.0, 0.0, 1.0), v));\n}\n\nvoid main()\n{\n gl_Position = vec4((pos * _58.scale) + _58.offset, _58.z, 1.0);\n vUV = (uv * _58.uvScale) + _58.uvOffset;\n vec3 fboTrans[2] = fboTextureTransform();\n vec3 param[2] = fboTrans;\n vec3 param_1 = vec3(uv, 1.0);\n vec3 uv3 = transform3x2(param, param_1);\n vCoverUV = ((uv3 * vec3(_58.uvCoverScale, 1.0)) + vec3(_58.uvCoverOffset, 0.0)).xy;\n}\n\n", + GLSL100ES: "#version 100\n\nstruct Block\n{\n vec4 transform;\n vec4 uvCoverTransform;\n vec4 uvTransform;\n float z;\n};\n\nuniform Block _58;\n\nattribute vec2 pos;\nvarying vec2 vUV;\nattribute vec2 uv;\nvarying vec2 vCoverUV;\n\nvec3[2] fboTextureTransform()\n{\n vec3 t[2];\n t[0] = vec3(1.0, 0.0, 0.0);\n t[1] = vec3(0.0, 1.0, 0.0);\n return t;\n}\n\nvec3 transform3x2(vec3 t[2], vec3 v)\n{\n return vec3(dot(t[0], v), dot(t[1], v), dot(vec3(0.0, 0.0, 1.0), v));\n}\n\nvoid main()\n{\n gl_Position = vec4((pos * _58.transform.xy) + _58.transform.zw, _58.z, 1.0);\n vUV = (uv * _58.uvTransform.xy) + _58.uvTransform.zw;\n vec3 fboTrans[2] = fboTextureTransform();\n vec3 param[2] = fboTrans;\n vec3 param_1 = vec3(uv, 1.0);\n vec3 uv3 = transform3x2(param, param_1);\n vCoverUV = ((uv3 * vec3(_58.uvCoverTransform.xy, 1.0)) + vec3(_58.uvCoverTransform.zw, 0.0)).xy;\n}\n\n", + GLSL300ES: "#version 300 es\n\nlayout(std140) uniform Block\n{\n vec4 transform;\n vec4 uvCoverTransform;\n vec4 uvTransform;\n float z;\n} _58;\n\nlayout(location = 0) in vec2 pos;\nout vec2 vUV;\nlayout(location = 1) in vec2 uv;\nout vec2 vCoverUV;\n\nvec3[2] fboTextureTransform()\n{\n vec3 t[2];\n t[0] = vec3(1.0, 0.0, 0.0);\n t[1] = vec3(0.0, 1.0, 0.0);\n return t;\n}\n\nvec3 transform3x2(vec3 t[2], vec3 v)\n{\n return vec3(dot(t[0], v), dot(t[1], v), dot(vec3(0.0, 0.0, 1.0), v));\n}\n\nvoid main()\n{\n gl_Position = vec4((pos * _58.transform.xy) + _58.transform.zw, _58.z, 1.0);\n vUV = (uv * _58.uvTransform.xy) + _58.uvTransform.zw;\n vec3 fboTrans[2] = fboTextureTransform();\n vec3 param[2] = fboTrans;\n vec3 param_1 = vec3(uv, 1.0);\n vec3 uv3 = transform3x2(param, param_1);\n vCoverUV = ((uv3 * vec3(_58.uvCoverTransform.xy, 1.0)) + vec3(_58.uvCoverTransform.zw, 0.0)).xy;\n}\n\n", /* cbuffer Block : register(b0) { - float _58_z : packoffset(c0); - float2 _58_scale : packoffset(c0.z); - float2 _58_offset : packoffset(c1); - float2 _58_uvCoverScale : packoffset(c1.z); - float2 _58_uvCoverOffset : packoffset(c2); - float2 _58_uvScale : packoffset(c2.z); - float2 _58_uvOffset : packoffset(c3); + float4 _58_transform : packoffset(c0); + float4 _58_uvCoverTransform : packoffset(c1); + float4 _58_uvTransform : packoffset(c2); + float _58_z : packoffset(c3); }; @@ -306,15 +299,15 @@ var ( void vert_main() { - gl_Position = float4((pos * _58_scale) + _58_offset, _58_z, 1.0f); - vUV = (uv * _58_uvScale) + _58_uvOffset; - float3 _88[2]; - fboTextureTransform(_88); - float3 fboTrans[2] = _88; + gl_Position = float4((pos * _58_transform.xy) + _58_transform.zw, _58_z, 1.0f); + vUV = (uv * _58_uvTransform.xy) + _58_uvTransform.zw; + float3 _91[2]; + fboTextureTransform(_91); + float3 fboTrans[2] = _91; float3 param[2] = fboTrans; float3 param_1 = float3(uv, 1.0f); float3 uv3 = transform3x2(param, param_1); - vCoverUV = ((uv3 * float3(_58_uvCoverScale, 1.0f)) + float3(_58_uvCoverOffset, 0.0f)).xy; + vCoverUV = ((uv3 * float3(_58_uvCoverTransform.xy, 1.0f)) + float3(_58_uvCoverTransform.zw, 0.0f)).xy; } SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) @@ -375,16 +368,15 @@ var ( Inputs: []backend.InputLocation{backend.InputLocation{Name: "pos", Location: 0, Semantic: "POSITION", SemanticIndex: 0, Type: 0x0, Size: 2}, backend.InputLocation{Name: "uv", Location: 1, Semantic: "NORMAL", SemanticIndex: 0, Type: 0x0, Size: 2}}, Uniforms: backend.UniformsReflection{ Blocks: []backend.UniformBlock{backend.UniformBlock{Name: "Block", Binding: 0}}, - Locations: []backend.UniformLocation{backend.UniformLocation{Name: "_40.scale", Type: 0x0, Size: 2, Offset: 0}, backend.UniformLocation{Name: "_40.offset", Type: 0x0, Size: 2, Offset: 8}}, + Locations: []backend.UniformLocation{backend.UniformLocation{Name: "_40.uvTransform", Type: 0x0, Size: 4, Offset: 0}}, Size: 16, }, - GLSL100ES: "#version 100\n\nstruct Block\n{\n vec2 scale;\n vec2 offset;\n};\n\nuniform Block _40;\n\nattribute vec2 pos;\nvarying vec2 vUV;\nattribute vec2 uv;\n\nvoid main()\n{\n vec2 p = pos;\n p.y = -p.y;\n gl_Position = vec4(p, 0.0, 1.0);\n vUV = (uv * _40.scale) + _40.offset;\n}\n\n", - GLSL300ES: "#version 300 es\n\nlayout(std140) uniform Block\n{\n vec2 scale;\n vec2 offset;\n} _40;\n\nlayout(location = 0) in vec2 pos;\nout vec2 vUV;\nlayout(location = 1) in vec2 uv;\n\nvoid main()\n{\n vec2 p = pos;\n p.y = -p.y;\n gl_Position = vec4(p, 0.0, 1.0);\n vUV = (uv * _40.scale) + _40.offset;\n}\n\n", + GLSL100ES: "#version 100\n\nstruct Block\n{\n vec4 uvTransform;\n};\n\nuniform Block _40;\n\nattribute vec2 pos;\nvarying vec2 vUV;\nattribute vec2 uv;\n\nvoid main()\n{\n vec2 p = pos;\n p.y = -p.y;\n gl_Position = vec4(p, 0.0, 1.0);\n vUV = (uv * _40.uvTransform.xy) + _40.uvTransform.zw;\n}\n\n", + GLSL300ES: "#version 300 es\n\nlayout(std140) uniform Block\n{\n vec4 uvTransform;\n} _40;\n\nlayout(location = 0) in vec2 pos;\nout vec2 vUV;\nlayout(location = 1) in vec2 uv;\n\nvoid main()\n{\n vec2 p = pos;\n p.y = -p.y;\n gl_Position = vec4(p, 0.0, 1.0);\n vUV = (uv * _40.uvTransform.xy) + _40.uvTransform.zw;\n}\n\n", /* cbuffer Block : register(b0) { - float2 _40_scale : packoffset(c0); - float2 _40_offset : packoffset(c0.z); + float4 _40_uvTransform : packoffset(c0); }; @@ -410,7 +402,7 @@ var ( float2 p = pos; p.y = -p.y; gl_Position = float4(p, 0.0f, 1.0f); - vUV = (uv * _40_scale) + _40_offset; + vUV = (uv * _40_uvTransform.xy) + _40_uvTransform.zw; } SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) @@ -496,17 +488,16 @@ var ( Inputs: []backend.InputLocation{backend.InputLocation{Name: "corner", Location: 0, Semantic: "POSITION", SemanticIndex: 0, Type: 0x1, Size: 2}, backend.InputLocation{Name: "maxy", Location: 1, Semantic: "NORMAL", SemanticIndex: 0, Type: 0x0, Size: 1}, backend.InputLocation{Name: "from", Location: 2, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}, backend.InputLocation{Name: "ctrl", Location: 3, Semantic: "TEXCOORD", SemanticIndex: 1, Type: 0x0, Size: 2}, backend.InputLocation{Name: "to", Location: 4, Semantic: "TEXCOORD", SemanticIndex: 2, Type: 0x0, Size: 2}}, Uniforms: backend.UniformsReflection{ Blocks: []backend.UniformBlock{backend.UniformBlock{Name: "Block", Binding: 0}}, - Locations: []backend.UniformLocation{backend.UniformLocation{Name: "_15.scale", Type: 0x0, Size: 2, Offset: 0}, backend.UniformLocation{Name: "_15.offset", Type: 0x0, Size: 2, Offset: 8}, backend.UniformLocation{Name: "_15.pathOffset", Type: 0x0, Size: 2, Offset: 16}}, + Locations: []backend.UniformLocation{backend.UniformLocation{Name: "_16.transform", Type: 0x0, Size: 4, Offset: 0}, backend.UniformLocation{Name: "_16.pathOffset", Type: 0x0, Size: 2, Offset: 16}}, Size: 24, }, - GLSL100ES: "#version 100\n\nstruct Block\n{\n vec2 scale;\n vec2 offset;\n vec2 pathOffset;\n};\n\nuniform Block _15;\n\nattribute vec2 from;\nattribute vec2 ctrl;\nattribute vec2 to;\nattribute float maxy;\nattribute ivec2 corner;\nvarying vec2 vFrom;\nvarying vec2 vCtrl;\nvarying vec2 vTo;\n\nvoid main()\n{\n vec2 from_1 = from + _15.pathOffset;\n vec2 ctrl_1 = ctrl + _15.pathOffset;\n vec2 to_1 = to + _15.pathOffset;\n float maxy_1 = maxy + _15.pathOffset.y;\n vec2 pos;\n if (corner.x > 0)\n {\n pos.x = max(max(from_1.x, ctrl_1.x), to_1.x) + 1.0;\n }\n else\n {\n pos.x = min(min(from_1.x, ctrl_1.x), to_1.x) - 1.0;\n }\n if (corner.y > 0)\n {\n pos.y = maxy_1 + 1.0;\n }\n else\n {\n pos.y = min(min(from_1.y, ctrl_1.y), to_1.y) - 1.0;\n }\n vFrom = from_1 - pos;\n vCtrl = ctrl_1 - pos;\n vTo = to_1 - pos;\n pos *= _15.scale;\n pos += _15.offset;\n gl_Position = vec4(pos, 1.0, 1.0);\n}\n\n", - GLSL300ES: "#version 300 es\n\nlayout(std140) uniform Block\n{\n vec2 scale;\n vec2 offset;\n vec2 pathOffset;\n} _15;\n\nlayout(location = 2) in vec2 from;\nlayout(location = 3) in vec2 ctrl;\nlayout(location = 4) in vec2 to;\nlayout(location = 1) in float maxy;\nlayout(location = 0) in ivec2 corner;\nout vec2 vFrom;\nout vec2 vCtrl;\nout vec2 vTo;\n\nvoid main()\n{\n vec2 from_1 = from + _15.pathOffset;\n vec2 ctrl_1 = ctrl + _15.pathOffset;\n vec2 to_1 = to + _15.pathOffset;\n float maxy_1 = maxy + _15.pathOffset.y;\n vec2 pos;\n if (corner.x > 0)\n {\n pos.x = max(max(from_1.x, ctrl_1.x), to_1.x) + 1.0;\n }\n else\n {\n pos.x = min(min(from_1.x, ctrl_1.x), to_1.x) - 1.0;\n }\n if (corner.y > 0)\n {\n pos.y = maxy_1 + 1.0;\n }\n else\n {\n pos.y = min(min(from_1.y, ctrl_1.y), to_1.y) - 1.0;\n }\n vFrom = from_1 - pos;\n vCtrl = ctrl_1 - pos;\n vTo = to_1 - pos;\n pos *= _15.scale;\n pos += _15.offset;\n gl_Position = vec4(pos, 1.0, 1.0);\n}\n\n", + GLSL100ES: "#version 100\n\nstruct Block\n{\n vec4 transform;\n vec2 pathOffset;\n};\n\nuniform Block _16;\n\nattribute vec2 from;\nattribute vec2 ctrl;\nattribute vec2 to;\nattribute float maxy;\nattribute ivec2 corner;\nvarying vec2 vFrom;\nvarying vec2 vCtrl;\nvarying vec2 vTo;\n\nvoid main()\n{\n vec2 from_1 = from + _16.pathOffset;\n vec2 ctrl_1 = ctrl + _16.pathOffset;\n vec2 to_1 = to + _16.pathOffset;\n float maxy_1 = maxy + _16.pathOffset.y;\n vec2 pos;\n if (corner.x > 0)\n {\n pos.x = max(max(from_1.x, ctrl_1.x), to_1.x) + 1.0;\n }\n else\n {\n pos.x = min(min(from_1.x, ctrl_1.x), to_1.x) - 1.0;\n }\n if (corner.y > 0)\n {\n pos.y = maxy_1 + 1.0;\n }\n else\n {\n pos.y = min(min(from_1.y, ctrl_1.y), to_1.y) - 1.0;\n }\n vFrom = from_1 - pos;\n vCtrl = ctrl_1 - pos;\n vTo = to_1 - pos;\n pos = (pos * _16.transform.xy) + _16.transform.zw;\n gl_Position = vec4(pos, 1.0, 1.0);\n}\n\n", + GLSL300ES: "#version 300 es\n\nlayout(std140) uniform Block\n{\n vec4 transform;\n vec2 pathOffset;\n} _16;\n\nlayout(location = 2) in vec2 from;\nlayout(location = 3) in vec2 ctrl;\nlayout(location = 4) in vec2 to;\nlayout(location = 1) in float maxy;\nlayout(location = 0) in ivec2 corner;\nout vec2 vFrom;\nout vec2 vCtrl;\nout vec2 vTo;\n\nvoid main()\n{\n vec2 from_1 = from + _16.pathOffset;\n vec2 ctrl_1 = ctrl + _16.pathOffset;\n vec2 to_1 = to + _16.pathOffset;\n float maxy_1 = maxy + _16.pathOffset.y;\n vec2 pos;\n if (corner.x > 0)\n {\n pos.x = max(max(from_1.x, ctrl_1.x), to_1.x) + 1.0;\n }\n else\n {\n pos.x = min(min(from_1.x, ctrl_1.x), to_1.x) - 1.0;\n }\n if (corner.y > 0)\n {\n pos.y = maxy_1 + 1.0;\n }\n else\n {\n pos.y = min(min(from_1.y, ctrl_1.y), to_1.y) - 1.0;\n }\n vFrom = from_1 - pos;\n vCtrl = ctrl_1 - pos;\n vTo = to_1 - pos;\n pos = (pos * _16.transform.xy) + _16.transform.zw;\n gl_Position = vec4(pos, 1.0, 1.0);\n}\n\n", /* cbuffer Block : register(b0) { - float2 _15_scale : packoffset(c0); - float2 _15_offset : packoffset(c0.z); - float2 _15_pathOffset : packoffset(c1); + float4 _16_transform : packoffset(c0); + float2 _16_pathOffset : packoffset(c1); }; @@ -539,10 +530,10 @@ var ( void vert_main() { - float2 from_1 = from + _15_pathOffset; - float2 ctrl_1 = ctrl + _15_pathOffset; - float2 to_1 = to + _15_pathOffset; - float maxy_1 = maxy + _15_pathOffset.y; + float2 from_1 = from + _16_pathOffset; + float2 ctrl_1 = ctrl + _16_pathOffset; + float2 to_1 = to + _16_pathOffset; + float maxy_1 = maxy + _16_pathOffset.y; float2 pos; if (corner.x > 0) { @@ -563,8 +554,7 @@ var ( vFrom = from_1 - pos; vCtrl = ctrl_1 - pos; vTo = to_1 - pos; - pos *= _15_scale; - pos += _15_offset; + pos = (pos * _16_transform.xy) + _16_transform.zw; gl_Position = float4(pos, 1.0f, 1.0f); } diff --git a/gpu/shaders/blit.vert b/gpu/shaders/blit.vert index b064dcac..d68f7713 100644 --- a/gpu/shaders/blit.vert +++ b/gpu/shaders/blit.vert @@ -5,11 +5,9 @@ precision highp float; layout(binding = 0) uniform Block { + vec4 transform; + vec4 uvTransform; float z; - vec2 scale; - vec2 offset; - vec2 uvScale; - vec2 uvOffset; }; layout(location = 0) in vec2 pos; @@ -19,9 +17,7 @@ layout(location = 1) in vec2 uv; layout(location = 0) out vec2 vUV; void main() { - vec2 p = pos; - p *= scale; - p += offset; + vec2 p = pos*transform.xy + transform.zw; gl_Position = vec4(p, z, 1); - vUV = uv*uvScale + uvOffset; + vUV = uv*uvTransform.xy + uvTransform.zw; } diff --git a/gpu/shaders/cover.vert b/gpu/shaders/cover.vert index c8d3cfbd..d9d8ebe0 100644 --- a/gpu/shaders/cover.vert +++ b/gpu/shaders/cover.vert @@ -7,13 +7,10 @@ precision highp float; #include layout(binding = 0) uniform Block { + vec4 transform; + vec4 uvCoverTransform; + vec4 uvTransform; float z; - vec2 scale; - vec2 offset; - vec2 uvCoverScale; - vec2 uvCoverOffset; - vec2 uvScale; - vec2 uvOffset; }; layout(location = 0) in vec2 pos; @@ -24,9 +21,9 @@ layout(location = 1) in vec2 uv; layout(location = 1) out vec2 vUV; void main() { - gl_Position = vec4(pos*scale + offset, z, 1); - vUV = uv*uvScale + uvOffset; + gl_Position = vec4(pos*transform.xy + transform.zw, z, 1); + vUV = uv*uvTransform.xy + uvTransform.zw; vec3[2] fboTrans = fboTextureTransform(); vec3 uv3 = transform3x2(fboTrans, vec3(uv, 1.0)); - vCoverUV = (uv3*vec3(uvCoverScale, 1.0)+vec3(uvCoverOffset, 0.0)).xy; + vCoverUV = (uv3*vec3(uvCoverTransform.xy, 1.0)+vec3(uvCoverTransform.zw, 0.0)).xy; } diff --git a/gpu/shaders/intersect.vert b/gpu/shaders/intersect.vert index 2a353c40..3cbf6aac 100644 --- a/gpu/shaders/intersect.vert +++ b/gpu/shaders/intersect.vert @@ -8,8 +8,7 @@ layout(location = 0) in vec2 pos; layout(location = 1) in vec2 uv; layout(binding = 0) uniform Block { - vec2 scale; - vec2 offset; + vec4 uvTransform; }; layout(location = 0) out vec2 vUV; @@ -18,5 +17,5 @@ void main() { vec2 p = pos; p.y = -p.y; gl_Position = vec4(p, 0, 1); - vUV = uv*scale + offset; + vUV = uv*uvTransform.xy + uvTransform.zw; } diff --git a/gpu/shaders/stencil.vert b/gpu/shaders/stencil.vert index 1f62bbeb..667c9595 100644 --- a/gpu/shaders/stencil.vert +++ b/gpu/shaders/stencil.vert @@ -5,8 +5,7 @@ precision highp float; layout(binding = 0) uniform Block { - vec2 scale; - vec2 offset; + vec4 transform; vec2 pathOffset; }; @@ -46,8 +45,7 @@ void main() { vFrom = from-pos; vCtrl = ctrl-pos; vTo = to-pos; - pos *= scale; - pos += offset; + pos = pos*transform.xy + transform.zw; gl_Position = vec4(pos, 1, 1); }