~eliasnaur/gio

e03b3cd808b471dd3659e2169bf2d8ee65dd6951 — Elias Naur 4 years ago d65bfdc
app/internal/d3d11: add Direct3D backend

Signed-off-by: Elias Naur <mail@eliasnaur.com>
M app/headless/headless_gl.go => app/headless/headless_gl.go +2 -0
@@ 1,5 1,7 @@
// SPDX-License-Identifier: Unlicense OR MIT

// +build !windows

package headless

func newContext() (context, error) {

A app/headless/headless_windows.go => app/headless/headless_windows.go +40 -0
@@ 0,0 1,40 @@
// SPDX-License-Identifier: Unlicense OR MIT

package headless

import (
	"gioui.org/app/internal/d3d11"
	"gioui.org/gpu/backend"
)

type d3d11Context struct {
	*d3d11.Device
}

func newContext() (context, error) {
	dev, err := d3d11.NewDevice()
	if err != nil {
		return nil, err
	}
	return &d3d11Context{Device: dev}, nil
}

func (c *d3d11Context) Backend() (backend.Device, error) {
	backend, err := d3d11.NewBackend(c.Device)
	if err != nil {
		return nil, err
	}
	return backend, nil
}

func (c *d3d11Context) MakeCurrent() error {
	return nil
}

func (c *d3d11Context) ReleaseCurrent() {
}

func (c *d3d11Context) Release() {
	c.Device.Release()
	c.Device = nil
}

M app/headless/shaders.go => app/headless/shaders.go +3 -3
@@ 40,7 40,7 @@ var (
		   }

		*/
		HLSL: []byte(nil),
		HLSL: []byte{0x44, 0x58, 0x42, 0x43, 0xaf, 0xcc, 0x41, 0x1f, 0xdd, 0x6b, 0x5a, 0x4d, 0x6, 0x75, 0x6f, 0xf3, 0xb2, 0xc9, 0xcb, 0xdc, 0x1, 0x0, 0x0, 0x0, 0xb4, 0x1, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xf4, 0x0, 0x0, 0x0, 0x38, 0x1, 0x0, 0x0, 0x52, 0x44, 0x45, 0x46, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfe, 0xff, 0x0, 0x1, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x0, 0xab, 0xab, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf, 0x0, 0x0, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x0, 0xab, 0xab, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0, 0x53, 0x48, 0x44, 0x52, 0x3c, 0x0, 0x0, 0x0, 0x40, 0x0, 0x1, 0x0, 0xf, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x3, 0xf2, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, 0x0, 0x0, 0x4, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0x5, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x1e, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x1, 0x53, 0x54, 0x41, 0x54, 0x74, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
	}
	shader_simple_frag = backend.ShaderSources{
		GLSL100ES: "precision mediump float;\nprecision highp int;\n\nvoid main()\n{\n    gl_FragData[0] = vec4(0.25, 0.550000011920928955078125, 0.75, 1.0);\n}\n\n",


@@ 69,7 69,7 @@ var (
		   }

		*/
		HLSL: []byte(nil),
		HLSL: []byte{0x44, 0x58, 0x42, 0x43, 0xd5, 0x82, 0x22, 0x7f, 0x92, 0x2d, 0x1, 0x6b, 0x10, 0xb0, 0x2c, 0xbc, 0xa1, 0x19, 0x12, 0x9e, 0x1, 0x0, 0x0, 0x0, 0x8c, 0x1, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x0, 0x9c, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x10, 0x1, 0x0, 0x0, 0x52, 0x44, 0x45, 0x46, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x0, 0x1, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x0, 0xab, 0xab, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x0, 0xab, 0xab, 0x53, 0x48, 0x44, 0x52, 0x38, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x3, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0x8, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3e, 0xcd, 0xcc, 0xc, 0x3f, 0x0, 0x0, 0x40, 0x3f, 0x0, 0x0, 0x80, 0x3f, 0x3e, 0x0, 0x0, 0x1, 0x53, 0x54, 0x41, 0x54, 0x74, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
	}
	shader_simple_vert = backend.ShaderSources{
		GLSL100ES: "\nvoid main()\n{\n    float x;\n    float y;\n    if (gl_VertexID == 0)\n    {\n        x = 0.0;\n        y = 0.5;\n    }\n    else\n    {\n        if (gl_VertexID == 1)\n        {\n            x = 0.5;\n            y = -0.5;\n        }\n        else\n        {\n            x = -0.5;\n            y = -0.5;\n        }\n    }\n    gl_Position = vec4(x, y, 0.5, 1.0);\n}\n\n",


@@ 124,6 124,6 @@ var (
		   }

		*/
		HLSL: []byte(nil),
		HLSL: []byte{0x44, 0x58, 0x42, 0x43, 0x23, 0x35, 0xde, 0x2e, 0xd2, 0x4a, 0x81, 0xe1, 0x7f, 0xf2, 0xcd, 0x3b, 0xc5, 0x96, 0x4d, 0x6d, 0x1, 0x0, 0x0, 0x0, 0x54, 0x2, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xf4, 0x0, 0x0, 0x0, 0xd8, 0x1, 0x0, 0x0, 0x52, 0x44, 0x45, 0x46, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfe, 0xff, 0x0, 0x1, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x0, 0xab, 0xab, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x53, 0x56, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x44, 0x0, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0, 0x53, 0x48, 0x44, 0x52, 0xdc, 0x0, 0x0, 0x0, 0x40, 0x0, 0x1, 0x0, 0x37, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x4, 0x12, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x67, 0x0, 0x0, 0x4, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x2, 0x1, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x7, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x37, 0x0, 0x0, 0xf, 0x32, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x0, 0x0, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x0, 0x0, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x0, 0x0, 0xc, 0x32, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0x8, 0xc2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x0, 0x0, 0x80, 0x3f, 0x3e, 0x0, 0x0, 0x1, 0x53, 0x54, 0x41, 0x54, 0x74, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
	}
)

A app/internal/d3d11/backend_windows.go => app/internal/d3d11/backend_windows.go +812 -0
@@ 0,0 1,812 @@
// SPDX-License-Identifier: Unlicense OR MIT

package d3d11

import (
	"errors"
	"fmt"
	"image"
	"math"
	"unsafe"

	"gioui.org/gpu/backend"
	gunsafe "gioui.org/internal/unsafe"
	"golang.org/x/sys/windows"
)

const debug = false

type Device struct {
	dev         *_ID3D11Device
	ctx         *_ID3D11DeviceContext
	featLvl     uint32
	depthStates map[depthState]*_ID3D11DepthStencilState
	blendStates map[blendState]*_ID3D11BlendState
}

type Backend struct {
	clearColor [4]float32
	clearDepth float32
	viewport   _D3D11_VIEWPORT
	depthState depthState
	blendState blendState
	prog       *Program

	dev  *Device
	caps backend.Caps

	// fbo is the currently bound fbo.
	fbo *Framebuffer
}

type blendState struct {
	enable  bool
	sfactor backend.BlendFactor
	dfactor backend.BlendFactor
}

type depthState struct {
	enable bool
	mask   bool
	fn     backend.DepthFunc
}

type Texture struct {
	backend  *Backend
	format   uint32
	bindings backend.BufferBinding
	tex      *_ID3D11Texture2D
	sampler  *_ID3D11SamplerState
	resView  *_ID3D11ShaderResourceView
	width    int
	height   int
}

type Program struct {
	backend *Backend

	vert struct {
		shader   *_ID3D11VertexShader
		uniforms *Buffer
	}
	frag struct {
		shader   *_ID3D11PixelShader
		uniforms *Buffer
	}
}

type Framebuffer struct {
	dev          *Device
	format       uint32
	resource     *_ID3D11Resource
	renderTarget *_ID3D11RenderTargetView
	depthView    *_ID3D11DepthStencilView
	foreign      bool
}

type Buffer struct {
	backend   *Backend
	bind      uint32
	buf       *_ID3D11Buffer
	immutable bool
}

type InputLayout struct {
	dev    *Device
	layout *_ID3D11InputLayout
}

type SwapChain struct {
	swchain *_IDXGISwapChain
	fbo     *Framebuffer
}

func NewDevice() (*Device, error) {
	var flags uint32
	if debug {
		flags |= _D3D11_CREATE_DEVICE_DEBUG
	}
	d3ddev, d3dctx, featLvl, err := _D3D11CreateDevice(
		_D3D_DRIVER_TYPE_HARDWARE,
		flags,
	)
	if err != nil {
		return nil, fmt.Errorf("NewContext: %v", err)
	}
	dev := &Device{dev: d3ddev, ctx: d3dctx, featLvl: featLvl}
	if featLvl < _D3D_FEATURE_LEVEL_9_1 {
		_IUnknownRelease(unsafe.Pointer(d3ddev), d3ddev.vtbl.Release)
		return nil, fmt.Errorf("d3d11: feature level too low: %d", featLvl)
	}
	dev.depthStates = make(map[depthState]*_ID3D11DepthStencilState)
	dev.blendStates = make(map[blendState]*_ID3D11BlendState)
	return dev, nil
}

func (d *Device) CreateSwapChain(hwnd windows.Handle) (*SwapChain, error) {
	dxgiDev, err := _IUnknownQueryInterface(unsafe.Pointer(d.dev), d.dev.vtbl.QueryInterface, &_IID_IDXGIDevice)
	if err != nil {
		return nil, fmt.Errorf("NewContext: %v", err)
	}
	adapter, err := (*_IDXGIDevice)(unsafe.Pointer(dxgiDev)).GetAdapter()
	_IUnknownRelease(unsafe.Pointer(dxgiDev), dxgiDev.vtbl.Release)
	if err != nil {
		return nil, fmt.Errorf("NewContext: %v", err)
	}
	dxgiFactory, err := (*_IDXGIObject)(unsafe.Pointer(adapter)).GetParent(&_IID_IDXGIFactory)
	_IUnknownRelease(unsafe.Pointer(adapter), adapter.vtbl.Release)
	if err != nil {
		return nil, fmt.Errorf("NewContext: %v", err)
	}
	d3dswchain, err := (*_IDXGIFactory)(unsafe.Pointer(dxgiFactory)).CreateSwapChain(
		(*_IUnknown)(unsafe.Pointer(d.dev)),
		&_DXGI_SWAP_CHAIN_DESC{
			BufferDesc: _DXGI_MODE_DESC{
				Format: _DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
			},
			SampleDesc: _DXGI_SAMPLE_DESC{
				Count: 1,
			},
			BufferUsage:  _DXGI_USAGE_RENDER_TARGET_OUTPUT,
			BufferCount:  1,
			OutputWindow: hwnd,
			Windowed:     1,
			SwapEffect:   _DXGI_SWAP_EFFECT_DISCARD,
		},
	)
	_IUnknownRelease(unsafe.Pointer(dxgiFactory), dxgiFactory.vtbl.Release)
	if err != nil {
		return nil, fmt.Errorf("NewContext: %v", err)
	}
	return &SwapChain{swchain: d3dswchain, fbo: &Framebuffer{}}, nil
}

func (s *SwapChain) Framebuffer(d *Device) (*Framebuffer, error) {
	if s.fbo.renderTarget != nil {
		return s.fbo, nil
	}
	backBuffer, err := s.swchain.GetBuffer(0, &_IID_ID3D11Texture2D)
	if err != nil {
		return nil, err
	}
	texture := (*_ID3D11Resource)(unsafe.Pointer(backBuffer))
	renderTarget, err := d.dev.CreateRenderTargetView(texture)
	_IUnknownRelease(unsafe.Pointer(backBuffer), backBuffer.vtbl.Release)
	if err != nil {
		return nil, err
	}
	s.fbo.renderTarget = renderTarget
	s.fbo.dev = d
	return s.fbo, nil
}

func (d *Device) Release() {
	_IUnknownRelease(unsafe.Pointer(d.ctx), d.ctx.vtbl.Release)
	_IUnknownRelease(unsafe.Pointer(d.dev), d.dev.vtbl.Release)
	d.ctx = nil
	d.dev = nil
	for _, state := range d.depthStates {
		_IUnknownRelease(unsafe.Pointer(state), state.vtbl.Release)
	}
	d.depthStates = nil
	for _, state := range d.blendStates {
		_IUnknownRelease(unsafe.Pointer(state), state.vtbl.Release)
	}
	d.blendStates = nil
}

func (s *SwapChain) Resize() error {
	if s.fbo.renderTarget != nil {
		s.fbo.Release()
	}
	return s.swchain.ResizeBuffers(0, 0, 0, _DXGI_FORMAT_UNKNOWN, 0)
}

func (s *SwapChain) Release() {
	_IUnknownRelease(unsafe.Pointer(s.swchain), s.swchain.vtbl.Release)
}

func (s *SwapChain) Present() error {
	return s.swchain.Present(0, 0)
}

func NewBackend(d *Device) (*Backend, error) {
	caps := backend.Caps{
		MaxTextureSize: 2048, // 9.1 maximum
	}
	switch {
	case d.featLvl >= _D3D_FEATURE_LEVEL_11_0:
		caps.MaxTextureSize = 16384
	case d.featLvl >= _D3D_FEATURE_LEVEL_9_3:
		caps.MaxTextureSize = 4096
	}
	b := &Backend{dev: d, caps: caps}
	// Disable backface culling to match OpenGL.
	state, err := b.dev.dev.CreateRasterizerState(&_D3D11_RASTERIZER_DESC{
		CullMode:        _D3D11_CULL_NONE,
		FillMode:        _D3D11_FILL_SOLID,
		DepthClipEnable: 1,
	})
	if err != nil {
		return nil, err
	}
	b.dev.ctx.RSSetState(state)
	_IUnknownRelease(unsafe.Pointer(state), state.vtbl.Release)
	return b, nil
}

func (b *Backend) BeginFrame() {
}

func (b *Backend) EndFrame() {
}

func (b *Backend) Caps() backend.Caps {
	return b.caps
}

func (b *Backend) NewTimer() backend.Timer {
	panic("timers not supported")
}

func (b *Backend) IsTimeContinuous() bool {
	panic("timers not supported")
}

func (b *Backend) NewTexture(format backend.TextureFormat, width, height int, minFilter, magFilter backend.TextureFilter, bindings backend.BufferBinding) (backend.Texture, error) {
	var d3dfmt uint32
	switch format {
	case backend.TextureFormatFloat:
		d3dfmt = _DXGI_FORMAT_R16_FLOAT
	case backend.TextureFormatSRGB:
		d3dfmt = _DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
	default:
		return nil, fmt.Errorf("unsupported texture format %d", format)
	}
	tex, err := b.dev.dev.CreateTexture2D(&_D3D11_TEXTURE2D_DESC{
		Width:     uint32(width),
		Height:    uint32(height),
		MipLevels: 1,
		ArraySize: 1,
		Format:    d3dfmt,
		SampleDesc: _DXGI_SAMPLE_DESC{
			Count:   1,
			Quality: 0,
		},
		BindFlags: convBufferBinding(bindings),
	})
	if err != nil {
		return nil, err
	}
	var (
		sampler *_ID3D11SamplerState
		resView *_ID3D11ShaderResourceView
	)
	if bindings&backend.BufferBindingTexture != 0 {
		var filter uint32
		switch {
		case minFilter == backend.FilterNearest && magFilter == backend.FilterNearest:
			filter = _D3D11_FILTER_MIN_MAG_MIP_POINT
		case minFilter == backend.FilterLinear && magFilter == backend.FilterLinear:
			filter = _D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT
		default:
			_IUnknownRelease(unsafe.Pointer(tex), tex.vtbl.Release)
			return nil, fmt.Errorf("unsupported texture filter combination %d, %d", minFilter, magFilter)
		}
		var err error
		sampler, err = b.dev.dev.CreateSamplerState(&_D3D11_SAMPLER_DESC{
			Filter:        filter,
			AddressU:      _D3D11_TEXTURE_ADDRESS_CLAMP,
			AddressV:      _D3D11_TEXTURE_ADDRESS_CLAMP,
			AddressW:      _D3D11_TEXTURE_ADDRESS_CLAMP,
			MaxAnisotropy: 1,
			MinLOD:        -math.MaxFloat32,
			MaxLOD:        math.MaxFloat32,
		})
		if err != nil {
			_IUnknownRelease(unsafe.Pointer(tex), tex.vtbl.Release)
			return nil, err
		}
		resView, err = b.dev.dev.CreateShaderResourceViewTEX2D(
			(*_ID3D11Resource)(unsafe.Pointer(tex)),
			&_D3D11_SHADER_RESOURCE_VIEW_DESC_TEX2D{
				_D3D11_SHADER_RESOURCE_VIEW_DESC: _D3D11_SHADER_RESOURCE_VIEW_DESC{
					Format:        d3dfmt,
					ViewDimension: _D3D11_SRV_DIMENSION_TEXTURE2D,
				},
				Texture2D: _D3D11_TEX2D_SRV{
					MostDetailedMip: 0,
					MipLevels:       ^uint32(0),
				},
			},
		)
		if err != nil {
			_IUnknownRelease(unsafe.Pointer(tex), tex.vtbl.Release)
			_IUnknownRelease(unsafe.Pointer(sampler), sampler.vtbl.Release)
			return nil, err
		}
	}
	return &Texture{backend: b, format: d3dfmt, tex: tex, sampler: sampler, resView: resView, bindings: bindings, width: width, height: height}, nil
}

func (b *Backend) CurrentFramebuffer() backend.Framebuffer {
	renderTarget := b.dev.ctx.OMGetRenderTargets()
	// Assume someone else is holding on to it.
	_IUnknownRelease(unsafe.Pointer(renderTarget), renderTarget.vtbl.Release)
	if renderTarget == b.fbo.renderTarget {
		return b.fbo
	}
	return &Framebuffer{dev: b.dev, renderTarget: renderTarget, foreign: true}
}

func (b *Backend) NewFramebuffer(tex backend.Texture, depthBits int) (backend.Framebuffer, error) {
	d3dtex := tex.(*Texture)
	if d3dtex.bindings&backend.BufferBindingFramebuffer == 0 {
		return nil, errors.New("the texture was created without BufferBindingFramebuffer binding")
	}
	resource := (*_ID3D11Resource)(unsafe.Pointer(d3dtex.tex))
	renderTarget, err := b.dev.dev.CreateRenderTargetView(resource)
	if err != nil {
		return nil, err
	}
	fbo := &Framebuffer{dev: b.dev, format: d3dtex.format, resource: resource, renderTarget: renderTarget}
	if depthBits > 0 {
		depthTex, err := b.dev.dev.CreateTexture2D(&_D3D11_TEXTURE2D_DESC{
			Width:     uint32(d3dtex.width),
			Height:    uint32(d3dtex.height),
			MipLevels: 1,
			ArraySize: 1,
			Format:    _DXGI_FORMAT_D24_UNORM_S8_UINT,
			SampleDesc: _DXGI_SAMPLE_DESC{
				Count:   1,
				Quality: 0,
			},
			BindFlags: _D3D11_BIND_DEPTH_STENCIL,
		})
		if err != nil {
			_IUnknownRelease(unsafe.Pointer(renderTarget), renderTarget.vtbl.Release)
			return nil, err
		}
		depthView, err := b.dev.dev.CreateDepthStencilViewTEX2D(
			(*_ID3D11Resource)(unsafe.Pointer(depthTex)),
			&_D3D11_DEPTH_STENCIL_VIEW_DESC_TEX2D{
				Format:        _DXGI_FORMAT_D24_UNORM_S8_UINT,
				ViewDimension: _D3D11_DSV_DIMENSION_TEXTURE2D,
			},
		)
		_IUnknownRelease(unsafe.Pointer(depthTex), depthTex.vtbl.Release)
		if err != nil {
			_IUnknownRelease(unsafe.Pointer(renderTarget), renderTarget.vtbl.Release)
			return nil, err
		}
		fbo.depthView = depthView
	}
	return fbo, nil
}

func (b *Backend) NewInputLayout(vertexShader backend.ShaderSources, layout []backend.InputDesc) (backend.InputLayout, error) {
	if len(vertexShader.Inputs) != len(layout) {
		return nil, fmt.Errorf("NewInputLayout: got %d inputs, expected %d", len(layout), len(vertexShader.Inputs))
	}
	descs := make([]_D3D11_INPUT_ELEMENT_DESC, len(layout))
	for i, l := range layout {
		inp := vertexShader.Inputs[i]
		cname, err := windows.BytePtrFromString(inp.Semantic)
		if err != nil {
			return nil, err
		}
		var format uint32
		switch l.Type {
		case backend.DataTypeFloat:
			switch l.Size {
			case 1:
				format = _DXGI_FORMAT_R32_FLOAT
			case 2:
				format = _DXGI_FORMAT_R32G32_FLOAT
			case 3:
				format = _DXGI_FORMAT_R32G32B32_FLOAT
			case 4:
				format = _DXGI_FORMAT_R32G32B32A32_FLOAT
			default:
				panic("unsupported float data size")
			}
		case backend.DataTypeShort:
			switch l.Size {
			case 1:
				format = _DXGI_FORMAT_R16_SINT
			case 2:
				format = _DXGI_FORMAT_R16G16_SINT
			default:
				panic("unsupported float data size")
			}
		default:
			panic("unsupported data type")
		}
		descs[i] = _D3D11_INPUT_ELEMENT_DESC{
			SemanticName:      cname,
			SemanticIndex:     uint32(inp.SemanticIndex),
			Format:            format,
			AlignedByteOffset: uint32(l.Offset),
		}
	}
	l, err := b.dev.dev.CreateInputLayout(descs, vertexShader.HLSL)
	if err != nil {
		return nil, err
	}
	return &InputLayout{dev: b.dev, layout: l}, nil
}

func (b *Backend) NewBuffer(typ backend.BufferBinding, size int) (backend.Buffer, error) {
	if typ&backend.BufferBindingUniforms != 0 {
		if typ != backend.BufferBindingUniforms {
			return nil, errors.New("uniform buffers cannot have other bindings")
		}
		if size%16 != 0 {
			return nil, fmt.Errorf("constant buffer size is %d, expected a multiple of 16", size)
		}
	}
	bind := convBufferBinding(typ)
	buf, err := b.dev.dev.CreateBuffer(&_D3D11_BUFFER_DESC{
		ByteWidth: uint32(size),
		BindFlags: bind,
	}, nil)
	if err != nil {
		return nil, err
	}
	return &Buffer{backend: b, buf: buf, bind: bind}, nil
}

func (b *Backend) NewImmutableBuffer(typ backend.BufferBinding, data []byte) (backend.Buffer, error) {
	if typ&backend.BufferBindingUniforms != 0 {
		if typ != backend.BufferBindingUniforms {
			return nil, errors.New("uniform buffers cannot have other bindings")
		}
		if len(data)%16 != 0 {
			return nil, fmt.Errorf("constant buffer size is %d, expected a multiple of 16", len(data))
		}
	}
	bind := convBufferBinding(typ)
	buf, err := b.dev.dev.CreateBuffer(&_D3D11_BUFFER_DESC{
		ByteWidth: uint32(len(data)),
		Usage:     _D3D11_USAGE_IMMUTABLE,
		BindFlags: bind,
	}, data)
	if err != nil {
		return nil, err
	}
	return &Buffer{backend: b, buf: buf, bind: bind, immutable: true}, nil
}

func (b *Backend) NewProgram(vertexShader, fragmentShader backend.ShaderSources) (backend.Program, error) {
	vs, err := b.dev.dev.CreateVertexShader(vertexShader.HLSL)
	if err != nil {
		return nil, err
	}
	ps, err := b.dev.dev.CreatePixelShader(fragmentShader.HLSL)
	if err != nil {
		return nil, err
	}
	p := &Program{backend: b}
	p.vert.shader = vs
	p.frag.shader = ps
	return p, nil
}

func (b *Backend) ClearColor(colr, colg, colb, cola float32) {
	b.clearColor = [...]float32{colr, colg, colb, cola}
}

func (b *Backend) Clear(buffers backend.BufferAttachments) {
	if buffers&backend.BufferAttachmentColor != 0 {
		b.dev.ctx.ClearRenderTargetView(b.fbo.renderTarget, &b.clearColor)
	}
	if buffers&backend.BufferAttachmentDepth != 0 {
		b.dev.ctx.ClearDepthStencilView(b.fbo.depthView, _D3D11_CLEAR_DEPTH|_D3D11_CLEAR_STENCIL, b.clearDepth, 0)
	}
}

func (b *Backend) Viewport(x, y, width, height int) {
	b.viewport = _D3D11_VIEWPORT{
		TopLeftX: float32(x),
		TopLeftY: float32(y),
		Width:    float32(width),
		Height:   float32(height),
		MinDepth: 0.0,
		MaxDepth: 1.0,
	}
	b.dev.ctx.RSSetViewports(&b.viewport)
}

func (b *Backend) DrawArrays(mode backend.DrawMode, off, count int) {
	b.prepareDraw(mode)
	b.dev.ctx.Draw(uint32(count), uint32(off))
}

func (b *Backend) DrawElements(mode backend.DrawMode, off, count int) {
	b.prepareDraw(mode)
	b.dev.ctx.DrawIndexed(uint32(count), uint32(off), 0)
}

func (b *Backend) prepareDraw(mode backend.DrawMode) {
	if p := b.prog; p != nil {
		b.dev.ctx.VSSetShader(p.vert.shader)
		b.dev.ctx.PSSetShader(p.frag.shader)
		if buf := p.vert.uniforms; buf != nil {
			b.dev.ctx.VSSetConstantBuffers(buf.buf)
		}
		if buf := p.frag.uniforms; buf != nil {
			b.dev.ctx.PSSetConstantBuffers(buf.buf)
		}
	}
	var topology uint32
	switch mode {
	case backend.DrawModeTriangles:
		topology = _D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST
	case backend.DrawModeTriangleStrip:
		topology = _D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP
	default:
		panic("unsupported draw mode")
	}
	b.dev.ctx.IASetPrimitiveTopology(topology)

	depthState, ok := b.dev.depthStates[b.depthState]
	if !ok {
		var desc _D3D11_DEPTH_STENCIL_DESC
		if b.depthState.enable {
			desc.DepthEnable = 1
		}
		if !b.depthState.mask {
			desc.DepthWriteMask = _D3D11_DEPTH_WRITE_MASK_ALL
		}
		switch b.depthState.fn {
		case backend.DepthFuncGreater:
			desc.DepthFunc = _D3D11_COMPARISON_GREATER
		default:
			panic("unsupported depth func")
		}
		var err error
		depthState, err = b.dev.dev.CreateDepthStencilState(&desc)
		if err != nil {
			panic(err)
		}
		b.dev.depthStates[b.depthState] = depthState
	}
	b.dev.ctx.OMSetDepthStencilState(depthState, 0)

	blendState, ok := b.dev.blendStates[b.blendState]
	if !ok {
		var desc _D3D11_BLEND_DESC
		t0 := &desc.RenderTarget[0]
		t0.RenderTargetWriteMask = _D3D11_COLOR_WRITE_ENABLE_ALL
		t0.BlendOp = _D3D11_BLEND_OP_ADD
		t0.BlendOpAlpha = _D3D11_BLEND_OP_ADD
		if b.blendState.enable {
			t0.BlendEnable = 1
		}
		scol, salpha := toBlendFactor(b.blendState.sfactor)
		dcol, dalpha := toBlendFactor(b.blendState.dfactor)
		t0.SrcBlend = scol
		t0.SrcBlendAlpha = salpha
		t0.DestBlend = dcol
		t0.DestBlendAlpha = dalpha
		var err error
		blendState, err = b.dev.dev.CreateBlendState(&desc)
		if err != nil {
			panic(err)
		}
		b.dev.blendStates[b.blendState] = blendState
	}
	b.dev.ctx.OMSetBlendState(blendState, nil, 0xffffffff)
}

func (b *Backend) DepthFunc(f backend.DepthFunc) {
	b.depthState.fn = f
}

func (b *Backend) ClearDepth(d float32) {
	b.clearDepth = d
}

func (b *Backend) SetBlend(enable bool) {
	b.blendState.enable = enable
}

func (b *Backend) SetDepthTest(enable bool) {
	b.depthState.enable = enable
}

func (b *Backend) DepthMask(mask bool) {
	b.depthState.mask = mask
}

func (b *Backend) BlendFunc(sfactor, dfactor backend.BlendFactor) {
	b.blendState.sfactor = sfactor
	b.blendState.dfactor = dfactor
}

func (t *Texture) Upload(img *image.RGBA) {
	b := img.Bounds()
	w := b.Dx()
	if img.Stride != w*4 {
		panic("unsupported stride")
	}
	start := (b.Min.X + b.Min.Y*w) * 4
	end := (b.Max.X + (b.Max.Y-1)*w) * 4
	pixels := img.Pix[start:end]
	res := (*_ID3D11Resource)(unsafe.Pointer(t.tex))
	t.backend.dev.ctx.UpdateSubresource(res, uint32(img.Stride), uint32(len(pixels)), pixels)
}

func (t *Texture) Release() {
	_IUnknownRelease(unsafe.Pointer(t.tex), t.tex.vtbl.Release)
	t.tex = nil
	if t.sampler != nil {
		_IUnknownRelease(unsafe.Pointer(t.sampler), t.sampler.vtbl.Release)
		t.sampler = nil
	}
	if t.resView != nil {
		_IUnknownRelease(unsafe.Pointer(t.resView), t.resView.vtbl.Release)
		t.resView = nil
	}
}

func (b *Backend) BindTexture(unit int, tex backend.Texture) {
	t := tex.(*Texture)
	b.dev.ctx.PSSetSamplers(uint32(unit), t.sampler)
	b.dev.ctx.PSSetShaderResources(uint32(unit), t.resView)
}

func (b *Backend) BindProgram(prog backend.Program) {
	b.prog = prog.(*Program)
}

func (p *Program) Release() {
	_IUnknownRelease(unsafe.Pointer(p.vert.shader), p.vert.shader.vtbl.Release)
	_IUnknownRelease(unsafe.Pointer(p.frag.shader), p.frag.shader.vtbl.Release)
	p.vert.shader = nil
	p.frag.shader = nil
}

func (p *Program) SetVertexUniforms(buf backend.Buffer) {
	p.vert.uniforms = buf.(*Buffer)
}

func (p *Program) SetFragmentUniforms(buf backend.Buffer) {
	p.frag.uniforms = buf.(*Buffer)
}

func (b *Backend) BindVertexBuffer(buf backend.Buffer, stride, offset int) {
	b.dev.ctx.IASetVertexBuffers(buf.(*Buffer).buf, uint32(stride), uint32(offset))
}

func (b *Backend) BindIndexBuffer(buf backend.Buffer) {
	b.dev.ctx.IASetIndexBuffer(buf.(*Buffer).buf, _DXGI_FORMAT_R16_UINT, 0)
}

func (b *Buffer) Upload(data []byte) {
	b.backend.dev.ctx.UpdateSubresource((*_ID3D11Resource)(unsafe.Pointer(b.buf)), 0, 0, data)
}

func (b *Buffer) Release() {
	_IUnknownRelease(unsafe.Pointer(b.buf), b.buf.vtbl.Release)
	b.buf = nil
}

func (f *Framebuffer) ReadPixels(src image.Rectangle, pixels []byte) error {
	if f.resource == nil {
		return errors.New("framebuffer does not support ReadPixels")
	}
	w, h := src.Dx(), src.Dy()
	tex, err := f.dev.dev.CreateTexture2D(&_D3D11_TEXTURE2D_DESC{
		Width:     uint32(w),
		Height:    uint32(h),
		MipLevels: 1,
		ArraySize: 1,
		Format:    f.format,
		SampleDesc: _DXGI_SAMPLE_DESC{
			Count:   1,
			Quality: 0,
		},
		Usage:          _D3D11_USAGE_STAGING,
		CPUAccessFlags: _D3D11_CPU_ACCESS_READ,
	})
	if err != nil {
		return fmt.Errorf("ReadPixels: %v", err)
	}
	defer _IUnknownRelease(unsafe.Pointer(tex), tex.vtbl.Release)
	res := (*_ID3D11Resource)(unsafe.Pointer(tex))
	f.dev.ctx.CopySubresourceRegion(
		res,
		0,       // Destination subresource.
		0, 0, 0, // Destination coordinates (x, y, z).
		f.resource,
		0, // Source subresource.
		&_D3D11_BOX{
			left:   uint32(src.Min.X),
			top:    uint32(src.Min.Y),
			right:  uint32(src.Max.X),
			bottom: uint32(src.Max.Y),
			front:  0,
			back:   1,
		},
	)
	resMap, err := f.dev.ctx.Map(res, 0, _D3D11_MAP_READ, 0)
	if err != nil {
		return fmt.Errorf("ReadPixels: %v", err)
	}
	defer f.dev.ctx.Unmap(res, 0)
	pitch := w * 4
	if int(resMap.RowPitch) != pitch {
		return fmt.Errorf("ReadPixels: got row pitch %d, expected %d", resMap.RowPitch, pitch)
	}
	n := pitch * h
	data := gunsafe.SliceOf(resMap.pData)[:n:n]
	copy(pixels, data)
	return nil
}

func (b *Backend) BindFramebuffer(fbo backend.Framebuffer) {
	b.fbo = fbo.(*Framebuffer)
	b.dev.ctx.OMSetRenderTargets(b.fbo.renderTarget, b.fbo.depthView)
}

func (f *Framebuffer) Invalidate() {
}

func (f *Framebuffer) Release() {
	if f.foreign {
		panic("cannot release Framebuffer from CurrentFramebuffer")
	}
	if f.renderTarget != nil {
		_IUnknownRelease(unsafe.Pointer(f.renderTarget), f.renderTarget.vtbl.Release)
		f.renderTarget = nil
	}
	if f.depthView != nil {
		_IUnknownRelease(unsafe.Pointer(f.depthView), f.depthView.vtbl.Release)
		f.depthView = nil
	}
}

func (b *Backend) BindInputLayout(layout backend.InputLayout) {
	b.dev.ctx.IASetInputLayout(layout.(*InputLayout).layout)
}

func (l *InputLayout) Release() {
	_IUnknownRelease(unsafe.Pointer(l.layout), l.layout.vtbl.Release)
	l.layout = nil
}

func convBufferBinding(typ backend.BufferBinding) uint32 {
	var bindings uint32
	if typ&backend.BufferBindingVertices != 0 {
		bindings |= _D3D11_BIND_VERTEX_BUFFER
	}
	if typ&backend.BufferBindingIndices != 0 {
		bindings |= _D3D11_BIND_INDEX_BUFFER
	}
	if typ&backend.BufferBindingUniforms != 0 {
		bindings |= _D3D11_BIND_CONSTANT_BUFFER
	}
	if typ&backend.BufferBindingTexture != 0 {
		bindings |= _D3D11_BIND_SHADER_RESOURCE
	}
	if typ&backend.BufferBindingFramebuffer != 0 {
		bindings |= _D3D11_BIND_RENDER_TARGET
	}
	return bindings
}

func toBlendFactor(f backend.BlendFactor) (uint32, uint32) {
	switch f {
	case backend.BlendFactorOne:
		return _D3D11_BLEND_ONE, _D3D11_BLEND_ONE
	case backend.BlendFactorOneMinusSrcAlpha:
		return _D3D11_BLEND_INV_SRC_ALPHA, _D3D11_BLEND_INV_SRC_ALPHA
	case backend.BlendFactorZero:
		return _D3D11_BLEND_ZERO, _D3D11_BLEND_ZERO
	case backend.BlendFactorDstColor:
		return _D3D11_BLEND_DEST_COLOR, _D3D11_BLEND_DEST_ALPHA
	default:
		panic("unsupported blend source factor")
	}
}

A app/internal/d3d11/d3d11_windows.go => app/internal/d3d11/d3d11_windows.go +1386 -0
@@ 0,0 1,1386 @@
// SPDX-License-Identifier: Unlicense OR MIT

package d3d11

import (
	"fmt"
	"math"
	"unsafe"

	"syscall"

	gunsafe "gioui.org/internal/unsafe"

	"golang.org/x/sys/windows"
)

type _DXGI_SWAP_CHAIN_DESC struct {
	BufferDesc   _DXGI_MODE_DESC
	SampleDesc   _DXGI_SAMPLE_DESC
	BufferUsage  uint32
	BufferCount  uint32
	OutputWindow windows.Handle
	Windowed     uint32
	SwapEffect   uint32
	Flags        uint32
}

type _DXGI_SAMPLE_DESC struct {
	Count   uint32
	Quality uint32
}

type _DXGI_MODE_DESC struct {
	Width            uint32
	Height           uint32
	RefreshRate      _DXGI_RATIONAL
	Format           uint32
	ScanlineOrdering uint32
	Scaling          uint32
}

type _DXGI_RATIONAL struct {
	Numerator   uint32
	Denominator uint32
}

type _D3D11_TEXTURE2D_DESC struct {
	Width          uint32
	Height         uint32
	MipLevels      uint32
	ArraySize      uint32
	Format         uint32
	SampleDesc     _DXGI_SAMPLE_DESC
	Usage          uint32
	BindFlags      uint32
	CPUAccessFlags uint32
	MiscFlags      uint32
}

type _D3D11_SAMPLER_DESC struct {
	Filter         uint32
	AddressU       uint32
	AddressV       uint32
	AddressW       uint32
	MipLODBias     float32
	MaxAnisotropy  uint32
	ComparisonFunc uint32
	BorderColor    [4]float32
	MinLOD         float32
	MaxLOD         float32
}

type _D3D11_SHADER_RESOURCE_VIEW_DESC_TEX2D struct {
	_D3D11_SHADER_RESOURCE_VIEW_DESC
	Texture2D _D3D11_TEX2D_SRV
}

type _D3D11_SHADER_RESOURCE_VIEW_DESC struct {
	Format        uint32
	ViewDimension uint32
}

type _D3D11_TEX2D_SRV struct {
	MostDetailedMip uint32
	MipLevels       uint32
}

type _D3D11_INPUT_ELEMENT_DESC struct {
	SemanticName         *byte
	SemanticIndex        uint32
	Format               uint32
	InputSlot            uint32
	AlignedByteOffset    uint32
	InputSlotClass       uint32
	InstanceDataStepRate uint32
}

type _IDXGISwapChain struct {
	vtbl *struct {
		_IUnknownVTbl
		SetPrivateData          uintptr
		SetPrivateDataInterface uintptr
		GetPrivateData          uintptr
		GetParent               uintptr
		GetDevice               uintptr
		Present                 uintptr
		GetBuffer               uintptr
		SetFullscreenState      uintptr
		GetFullscreenState      uintptr
		GetDesc                 uintptr
		ResizeBuffers           uintptr
		ResizeTarget            uintptr
		GetContainingOutput     uintptr
		GetFrameStatistics      uintptr
		GetLastPresentCount     uintptr
	}
}

type _ID3D11Device struct {
	vtbl *struct {
		_IUnknownVTbl
		CreateBuffer                         uintptr
		CreateTexture1D                      uintptr
		CreateTexture2D                      uintptr
		CreateTexture3D                      uintptr
		CreateShaderResourceView             uintptr
		CreateUnorderedAccessView            uintptr
		CreateRenderTargetView               uintptr
		CreateDepthStencilView               uintptr
		CreateInputLayout                    uintptr
		CreateVertexShader                   uintptr
		CreateGeometryShader                 uintptr
		CreateGeometryShaderWithStreamOutput uintptr
		CreatePixelShader                    uintptr
		CreateHullShader                     uintptr
		CreateDomainShader                   uintptr
		CreateComputeShader                  uintptr
		CreateClassLinkage                   uintptr
		CreateBlendState                     uintptr
		CreateDepthStencilState              uintptr
		CreateRasterizerState                uintptr
		CreateSamplerState                   uintptr
		CreateQuery                          uintptr
		CreatePredicate                      uintptr
		CreateCounter                        uintptr
		CreateDeferredContext                uintptr
		OpenSharedResource                   uintptr
		CheckFormatSupport                   uintptr
		CheckMultisampleQualityLevels        uintptr
		CheckCounterInfo                     uintptr
		CheckCounter                         uintptr
		CheckFeatureSupport                  uintptr
		GetPrivateData                       uintptr
		SetPrivateData                       uintptr
		SetPrivateDataInterface              uintptr
		GetFeatureLevel                      uintptr
		GetCreationFlags                     uintptr
		GetDeviceRemovedReason               uintptr
		GetImmediateContext                  uintptr
		SetExceptionMode                     uintptr
		GetExceptionMode                     uintptr
	}
}

type _ID3D11DeviceContext struct {
	vtbl *struct {
		_IUnknownVTbl
		GetDevice                                 uintptr
		GetPrivateData                            uintptr
		SetPrivateData                            uintptr
		SetPrivateDataInterface                   uintptr
		VSSetConstantBuffers                      uintptr
		PSSetShaderResources                      uintptr
		PSSetShader                               uintptr
		PSSetSamplers                             uintptr
		VSSetShader                               uintptr
		DrawIndexed                               uintptr
		Draw                                      uintptr
		Map                                       uintptr
		Unmap                                     uintptr
		PSSetConstantBuffers                      uintptr
		IASetInputLayout                          uintptr
		IASetVertexBuffers                        uintptr
		IASetIndexBuffer                          uintptr
		DrawIndexedInstanced                      uintptr
		DrawInstanced                             uintptr
		GSSetConstantBuffers                      uintptr
		GSSetShader                               uintptr
		IASetPrimitiveTopology                    uintptr
		VSSetShaderResources                      uintptr
		VSSetSamplers                             uintptr
		Begin                                     uintptr
		End                                       uintptr
		GetData                                   uintptr
		SetPredication                            uintptr
		GSSetShaderResources                      uintptr
		GSSetSamplers                             uintptr
		OMSetRenderTargets                        uintptr
		OMSetRenderTargetsAndUnorderedAccessViews uintptr
		OMSetBlendState                           uintptr
		OMSetDepthStencilState                    uintptr
		SOSetTargets                              uintptr
		DrawAuto                                  uintptr
		DrawIndexedInstancedIndirect              uintptr
		DrawInstancedIndirect                     uintptr
		Dispatch                                  uintptr
		DispatchIndirect                          uintptr
		RSSetState                                uintptr
		RSSetViewports                            uintptr
		RSSetScissorRects                         uintptr
		CopySubresourceRegion                     uintptr
		CopyResource                              uintptr
		UpdateSubresource                         uintptr
		CopyStructureCount                        uintptr
		ClearRenderTargetView                     uintptr
		ClearUnorderedAccessViewUint              uintptr
		ClearUnorderedAccessViewFloat             uintptr
		ClearDepthStencilView                     uintptr
		GenerateMips                              uintptr
		SetResourceMinLOD                         uintptr
		GetResourceMinLOD                         uintptr
		ResolveSubresource                        uintptr
		ExecuteCommandList                        uintptr
		HSSetShaderResources                      uintptr
		HSSetShader                               uintptr
		HSSetSamplers                             uintptr
		HSSetConstantBuffers                      uintptr
		DSSetShaderResources                      uintptr
		DSSetShader                               uintptr
		DSSetSamplers                             uintptr
		DSSetConstantBuffers                      uintptr
		CSSetShaderResources                      uintptr
		CSSetUnorderedAccessViews                 uintptr
		CSSetShader                               uintptr
		CSSetSamplers                             uintptr
		CSSetConstantBuffers                      uintptr
		VSGetConstantBuffers                      uintptr
		PSGetShaderResources                      uintptr
		PSGetShader                               uintptr
		PSGetSamplers                             uintptr
		VSGetShader                               uintptr
		PSGetConstantBuffers                      uintptr
		IAGetInputLayout                          uintptr
		IAGetVertexBuffers                        uintptr
		IAGetIndexBuffer                          uintptr
		GSGetConstantBuffers                      uintptr
		GSGetShader                               uintptr
		IAGetPrimitiveTopology                    uintptr
		VSGetShaderResources                      uintptr
		VSGetSamplers                             uintptr
		GetPredication                            uintptr
		GSGetShaderResources                      uintptr
		GSGetSamplers                             uintptr
		OMGetRenderTargets                        uintptr
		OMGetRenderTargetsAndUnorderedAccessViews uintptr
		OMGetBlendState                           uintptr
		OMGetDepthStencilState                    uintptr
		SOGetTargets                              uintptr
		RSGetState                                uintptr
		RSGetViewports                            uintptr
		RSGetScissorRects                         uintptr
		HSGetShaderResources                      uintptr
		HSGetShader                               uintptr
		HSGetSamplers                             uintptr
		HSGetConstantBuffers                      uintptr
		DSGetShaderResources                      uintptr
		DSGetShader                               uintptr
		DSGetSamplers                             uintptr
		DSGetConstantBuffers                      uintptr
		CSGetShaderResources                      uintptr
		CSGetUnorderedAccessViews                 uintptr
		CSGetShader                               uintptr
		CSGetSamplers                             uintptr
		CSGetConstantBuffers                      uintptr
		ClearState                                uintptr
		Flush                                     uintptr
		GetType                                   uintptr
		GetContextFlags                           uintptr
		FinishCommandList                         uintptr
	}
}

type _ID3D11RenderTargetView struct {
	vtbl *struct {
		_IUnknownVTbl
	}
}

type _ID3D11Resource struct {
	vtbl *struct {
		_IUnknownVTbl
	}
}

type _ID3D11Texture2D struct {
	vtbl *struct {
		_IUnknownVTbl
	}
}

type _ID3D11Buffer struct {
	vtbl *struct {
		_IUnknownVTbl
	}
}

type _ID3D11SamplerState struct {
	vtbl *struct {
		_IUnknownVTbl
	}
}

type _ID3D11PixelShader struct {
	vtbl *struct {
		_IUnknownVTbl
	}
}

type _ID3D11ShaderResourceView struct {
	vtbl *struct {
		_IUnknownVTbl
	}
}

type _ID3D11DepthStencilView struct {
	vtbl *struct {
		_IUnknownVTbl
	}
}

type _ID3D11BlendState struct {
	vtbl *struct {
		_IUnknownVTbl
	}
}

type _ID3D11DepthStencilState struct {
	vtbl *struct {
		_IUnknownVTbl
	}
}

type _ID3D11VertexShader struct {
	vtbl *struct {
		_IUnknownVTbl
	}
}

type _ID3D11RasterizerState struct {
	vtbl *struct {
		_IUnknownVTbl
	}
}

type _ID3D11InputLayout struct {
	vtbl *struct {
		_IUnknownVTbl
		GetBufferPointer uintptr
		GetBufferSize    uintptr
	}
}

type _ID3DBlob struct {
	vtbl *struct {
		_IUnknownVTbl
		GetBufferPointer uintptr
		GetBufferSize    uintptr
	}
}

type _D3D11_DEPTH_STENCIL_DESC struct {
	DepthEnable      uint32
	DepthWriteMask   uint32
	DepthFunc        uint32
	StencilEnable    uint32
	StencilReadMask  uint8
	StencilWriteMask uint8
	FrontFace        _D3D11_DEPTH_STENCILOP_DESC
	BackFace         _D3D11_DEPTH_STENCILOP_DESC
}

type _D3D11_DEPTH_STENCILOP_DESC struct {
	StencilFailOp      uint32
	StencilDepthFailOp uint32
	StencilPassOp      uint32
	StencilFunc        uint32
}

type _D3D11_DEPTH_STENCIL_VIEW_DESC_TEX2D struct {
	Format        uint32
	ViewDimension uint32
	Flags         uint32
	Texture2D     _D3D11_TEX2D_DSV
}

type _D3D11_TEX2D_DSV struct {
	MipSlice uint32
}

type _D3D11_BLEND_DESC struct {
	AlphaToCoverageEnable  uint32
	IndependentBlendEnable uint32
	RenderTarget           [8]_D3D11_RENDER_TARGET_BLEND_DESC
}

type _D3D11_RENDER_TARGET_BLEND_DESC struct {
	BlendEnable           uint32
	SrcBlend              uint32
	DestBlend             uint32
	BlendOp               uint32
	SrcBlendAlpha         uint32
	DestBlendAlpha        uint32
	BlendOpAlpha          uint32
	RenderTargetWriteMask uint8
}

type _IDXGIObject struct {
	vtbl *struct {
		_IUnknownVTbl
		SetPrivateData          uintptr
		SetPrivateDataInterface uintptr
		GetPrivateData          uintptr
		GetParent               uintptr
	}
}

type _IDXGIAdapter struct {
	vtbl *struct {
		_IUnknownVTbl
		SetPrivateData          uintptr
		SetPrivateDataInterface uintptr
		GetPrivateData          uintptr
		GetParent               uintptr
		EnumOutputs             uintptr
		GetDesc                 uintptr
		CheckInterfaceSupport   uintptr
		GetDesc1                uintptr
	}
}

type _IDXGIFactory struct {
	vtbl *struct {
		_IUnknownVTbl
		SetPrivateData          uintptr
		SetPrivateDataInterface uintptr
		GetPrivateData          uintptr
		GetParent               uintptr
		EnumAdapters            uintptr
		MakeWindowAssociation   uintptr
		GetWindowAssociation    uintptr
		CreateSwapChain         uintptr
		CreateSoftwareAdapter   uintptr
	}
}

type _IDXGIDevice struct {
	vtbl *struct {
		_IUnknownVTbl
		SetPrivateData          uintptr
		SetPrivateDataInterface uintptr
		GetPrivateData          uintptr
		GetParent               uintptr
		GetAdapter              uintptr
		CreateSurface           uintptr
		QueryResourceResidency  uintptr
		SetGPUThreadPriority    uintptr
		GetGPUThreadPriority    uintptr
	}
}

type _IUnknown struct {
	vtbl *struct {
		_IUnknownVTbl
	}
}

type _IUnknownVTbl struct {
	QueryInterface uintptr
	AddRef         uintptr
	Release        uintptr
}

type _D3D11_BUFFER_DESC struct {
	ByteWidth           uint32
	Usage               uint32
	BindFlags           uint32
	CPUAccessFlags      uint32
	MiscFlags           uint32
	StructureByteStride uint32
}

type _GUID struct {
	Data1   uint32
	Data2   uint16
	Data3   uint16
	Data4_0 uint8
	Data4_1 uint8
	Data4_2 uint8
	Data4_3 uint8
	Data4_4 uint8
	Data4_5 uint8
	Data4_6 uint8
	Data4_7 uint8
}

type _D3D11_VIEWPORT struct {
	TopLeftX float32
	TopLeftY float32
	Width    float32
	Height   float32
	MinDepth float32
	MaxDepth float32
}

type _D3D11_SUBRESOURCE_DATA struct {
	pSysMem *byte
}

type _D3D11_BOX struct {
	left   uint32
	top    uint32
	front  uint32
	right  uint32
	bottom uint32
	back   uint32
}

type _D3D11_MAPPED_SUBRESOURCE struct {
	pData      uintptr
	RowPitch   uint32
	DepthPitch uint32
}

type ErrorCode struct {
	Name string
	Code int
}

type _D3D11_RASTERIZER_DESC struct {
	FillMode              uint32
	CullMode              uint32
	FrontCounterClockwise uint32
	DepthBias             int32
	DepthBiasClamp        float32
	SlopeScaledDepthBias  float32
	DepthClipEnable       uint32
	ScissorEnable         uint32
	MultisampleEnable     uint32
	AntialiasedLineEnable uint32
}

var (
	_IID_ID3D11Texture2D = _GUID{0x6f15aaf2, 0xd208, 0x4e89, 0x9a, 0xb4, 0x48, 0x95, 0x35, 0xd3, 0x4f, 0x9c}
	_IID_IDXGIDevice     = _GUID{0x54ec77fa, 0x1377, 0x44e6, 0x8c, 0x32, 0x88, 0xfd, 0x5f, 0x44, 0xc8, 0x4c}
	_IID_IDXGIFactory    = _GUID{0x7b7166ec, 0x21c7, 0x44ae, 0xb2, 0x1a, 0xc9, 0xae, 0x32, 0x1a, 0xe3, 0x69}
)

var (
	d3d11 = windows.NewLazySystemDLL("d3d11.dll")

	__D3D11CreateDevice             = d3d11.NewProc("D3D11CreateDevice")
	__D3D11CreateDeviceAndSwapChain = d3d11.NewProc("D3D11CreateDeviceAndSwapChain")

	d3dcompiler_47 = windows.NewLazySystemDLL("d3dcompiler_47.dll")

	__D3DCompile = d3dcompiler_47.NewProc("D3DCompile")
)

const (
	_D3D11_SDK_VERSION        = 7
	_D3D_DRIVER_TYPE_HARDWARE = 1

	_DXGI_FORMAT_UNKNOWN             = 0
	_DXGI_FORMAT_R16_FLOAT           = 54
	_DXGI_FORMAT_R32_FLOAT           = 41
	_DXGI_FORMAT_R32G32_FLOAT        = 16
	_DXGI_FORMAT_R32G32B32_FLOAT     = 6
	_DXGI_FORMAT_R32G32B32A32_FLOAT  = 2
	_DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = 29
	_DXGI_FORMAT_R16_SINT            = 59
	_DXGI_FORMAT_R16G16_SINT         = 38

	_DXGI_USAGE_RENDER_TARGET_OUTPUT = 1 << (1 + 4)

	_D3D11_CPU_ACCESS_READ = 0x20000

	_D3D11_MAP_READ = 1

	_DXGI_SWAP_EFFECT_DISCARD = 0

	_DXGI_FORMAT_R16_UINT = 57

	_D3D_FEATURE_LEVEL_9_1  = 0x9100
	_D3D_FEATURE_LEVEL_9_3  = 0x9300
	_D3D_FEATURE_LEVEL_11_0 = 0xb000

	_D3D11_USAGE_IMMUTABLE = 1
	_D3D11_USAGE_STAGING   = 3

	_D3D11_BIND_VERTEX_BUFFER   = 0x1
	_D3D11_BIND_INDEX_BUFFER    = 0x2
	_D3D11_BIND_CONSTANT_BUFFER = 0x4
	_D3D11_BIND_SHADER_RESOURCE = 0x8
	_D3D11_BIND_RENDER_TARGET   = 0x20
	_D3D11_BIND_DEPTH_STENCIL   = 0x40

	_D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST  = 4
	_D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP = 5

	_D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT = 0x14
	_D3D11_FILTER_MIN_MAG_MIP_POINT        = 0

	_D3D11_TEXTURE_ADDRESS_MIRROR = 2
	_D3D11_TEXTURE_ADDRESS_CLAMP  = 3
	_D3D11_TEXTURE_ADDRESS_WRAP   = 1

	_D3D11_SRV_DIMENSION_TEXTURE2D = 4

	_D3D11_CREATE_DEVICE_DEBUG = 0x2

	_D3D11_FILL_SOLID = 3

	_D3D11_CULL_NONE = 1

	_D3D11_CLEAR_DEPTH   = 0x1
	_D3D11_CLEAR_STENCIL = 0x2

	_DXGI_FORMAT_D24_UNORM_S8_UINT = 45

	_D3D11_DSV_DIMENSION_TEXTURE2D = 3

	_D3D11_DEPTH_WRITE_MASK_ALL = 1

	_D3D11_COMPARISON_GREATER = 5

	_D3D11_BLEND_OP_ADD        = 1
	_D3D11_BLEND_ONE           = 2
	_D3D11_BLEND_INV_SRC_ALPHA = 6
	_D3D11_BLEND_ZERO          = 1
	_D3D11_BLEND_DEST_COLOR    = 9
	_D3D11_BLEND_DEST_ALPHA    = 7

	_D3D11_COLOR_WRITE_ENABLE_ALL = 1 | 2 | 4 | 8

	DXGI_STATUS_OCCLUDED      = 0x087A0001
	DXGI_ERROR_DEVICE_RESET   = 0x887A0007
	DXGI_ERROR_DEVICE_REMOVED = 0x887A0005
	D3DDDIERR_DEVICEREMOVED   = 1<<31 | 0x876<<16 | 2160
)

func _D3D11CreateDevice(driverType uint32, flags uint32) (*_ID3D11Device, *_ID3D11DeviceContext, uint32, error) {
	var (
		dev     *_ID3D11Device
		ctx     *_ID3D11DeviceContext
		featLvl uint32
	)
	r, _, _ := __D3D11CreateDevice.Call(
		0,                                 // pAdapter
		uintptr(driverType),               // driverType
		0,                                 // Software
		uintptr(flags),                    // Flags
		0,                                 // pFeatureLevels
		0,                                 // FeatureLevels
		_D3D11_SDK_VERSION,                // SDKVersion
		uintptr(unsafe.Pointer(&dev)),     // ppDevice
		uintptr(unsafe.Pointer(&featLvl)), // pFeatureLevel
		uintptr(unsafe.Pointer(&ctx)),     // ppImmediateContext
	)
	if r != 0 {
		return nil, nil, 0, fmt.Errorf("D3D11CreateDevice: %#x", r)
	}
	return dev, ctx, featLvl, nil
}

func _D3D11CreateDeviceAndSwapChain(driverType uint32, flags uint32, swapDesc *_DXGI_SWAP_CHAIN_DESC) (*_ID3D11Device, *_ID3D11DeviceContext, *_IDXGISwapChain, uint32, error) {
	var (
		dev     *_ID3D11Device
		ctx     *_ID3D11DeviceContext
		swchain *_IDXGISwapChain
		featLvl uint32
	)
	r, _, _ := __D3D11CreateDeviceAndSwapChain.Call(
		0,                                 // pAdapter
		uintptr(driverType),               // driverType
		0,                                 // Software
		uintptr(flags),                    // Flags
		0,                                 // pFeatureLevels
		0,                                 // FeatureLevels
		_D3D11_SDK_VERSION,                // SDKVersion
		uintptr(unsafe.Pointer(swapDesc)), // pSwapChainDesc
		uintptr(unsafe.Pointer(&swchain)), // ppSwapChain
		uintptr(unsafe.Pointer(&dev)),     // ppDevice
		uintptr(unsafe.Pointer(&featLvl)), // pFeatureLevel
		uintptr(unsafe.Pointer(&ctx)),     // ppImmediateContext
	)
	if r != 0 {
		return nil, nil, nil, 0, fmt.Errorf("D3D11CreateDeviceAndSwapChain: %#x", r)
	}
	return dev, ctx, swchain, featLvl, nil
}

func _D3DCompile(src []byte, entryPoint, target string) ([]byte, error) {
	var (
		code   *_ID3DBlob
		errors *_ID3DBlob
	)
	entryPoint0 := []byte(entryPoint + "\x00")
	target0 := []byte(target + "\x00")
	r, _, _ := __D3DCompile.Call(
		uintptr(unsafe.Pointer(&src[0])),
		uintptr(len(src)),
		0, // pSourceName
		0, // pDefines
		0, // pInclude
		uintptr(unsafe.Pointer(&entryPoint0[0])),
		uintptr(unsafe.Pointer(&target0[0])),
		0, // Flags1
		0, // Flags2
		uintptr(unsafe.Pointer(&code)),
		uintptr(unsafe.Pointer(&errors)),
	)
	var compileErr string
	if errors != nil {
		compileErr = string(errors.data())
		_IUnknownRelease(unsafe.Pointer(errors), errors.vtbl.Release)
	}
	if r != 0 {
		return nil, fmt.Errorf("D3D11Compile: %#x: %s", r, compileErr)
	}
	bytecode := code.data()
	cp := make([]byte, len(bytecode))
	copy(cp, bytecode)
	_IUnknownRelease(unsafe.Pointer(code), code.vtbl.Release)
	return cp, nil
}

func (d *_ID3D11Device) CreateBuffer(desc *_D3D11_BUFFER_DESC, data []byte) (*_ID3D11Buffer, error) {
	var dataDesc *_D3D11_SUBRESOURCE_DATA
	if len(data) > 0 {
		dataDesc = &_D3D11_SUBRESOURCE_DATA{
			pSysMem: &data[0],
		}
	}
	var buf *_ID3D11Buffer
	r, _, _ := syscall.Syscall6(
		d.vtbl.CreateBuffer,
		4,
		uintptr(unsafe.Pointer(d)),
		uintptr(unsafe.Pointer(desc)),
		uintptr(unsafe.Pointer(dataDesc)),
		uintptr(unsafe.Pointer(&buf)),
		0, 0,
	)
	if r != 0 {
		return nil, fmt.Errorf("ID3D11DeviceCreateBuffer: %#x", r)
	}
	return buf, nil
}

func (d *_ID3D11Device) CreateDepthStencilViewTEX2D(res *_ID3D11Resource, desc *_D3D11_DEPTH_STENCIL_VIEW_DESC_TEX2D) (*_ID3D11DepthStencilView, error) {
	var view *_ID3D11DepthStencilView
	r, _, _ := syscall.Syscall6(
		d.vtbl.CreateDepthStencilView,
		4,
		uintptr(unsafe.Pointer(d)),
		uintptr(unsafe.Pointer(res)),
		uintptr(unsafe.Pointer(desc)),
		uintptr(unsafe.Pointer(&view)),
		0, 0,
	)
	if r != 0 {
		return nil, fmt.Errorf("ID3D11DeviceCreateDepthStencilView: %#x", r)
	}
	return view, nil
}

func (d *_ID3D11Device) CreatePixelShader(bytecode []byte) (*_ID3D11PixelShader, error) {
	var shader *_ID3D11PixelShader
	r, _, _ := syscall.Syscall6(
		d.vtbl.CreatePixelShader,
		5,
		uintptr(unsafe.Pointer(d)),
		uintptr(unsafe.Pointer(&bytecode[0])),
		uintptr(len(bytecode)),
		0, // pClassLinkage
		uintptr(unsafe.Pointer(&shader)),
		0,
	)
	if r != 0 {
		return nil, fmt.Errorf("ID3D11DeviceCreatePixelShader; %#x", r)
	}
	return shader, nil
}

func (d *_ID3D11Device) CreateVertexShader(bytecode []byte) (*_ID3D11VertexShader, error) {
	var shader *_ID3D11VertexShader
	r, _, _ := syscall.Syscall6(
		d.vtbl.CreateVertexShader,
		5,
		uintptr(unsafe.Pointer(d)),
		uintptr(unsafe.Pointer(&bytecode[0])),
		uintptr(len(bytecode)),
		0, // pClassLinkage
		uintptr(unsafe.Pointer(&shader)),
		0,
	)
	if r != 0 {
		return nil, fmt.Errorf("ID3D11DeviceCreateVertexShader; %#x", r)
	}
	return shader, nil
}

func (d *_ID3D11Device) CreateShaderResourceViewTEX2D(res *_ID3D11Resource, desc *_D3D11_SHADER_RESOURCE_VIEW_DESC_TEX2D) (*_ID3D11ShaderResourceView, error) {
	var resView *_ID3D11ShaderResourceView
	r, _, _ := syscall.Syscall6(
		d.vtbl.CreateShaderResourceView,
		4,
		uintptr(unsafe.Pointer(d)),
		uintptr(unsafe.Pointer(res)),
		uintptr(unsafe.Pointer(desc)),
		uintptr(unsafe.Pointer(&resView)),
		0, 0,
	)
	if r != 0 {
		return nil, fmt.Errorf("ID3D11DeviceCreateShaderResourceView: %#x", r)
	}
	return resView, nil
}

func (d *_ID3D11Device) CreateRasterizerState(desc *_D3D11_RASTERIZER_DESC) (*_ID3D11RasterizerState, error) {
	var state *_ID3D11RasterizerState
	r, _, _ := syscall.Syscall(
		d.vtbl.CreateRasterizerState,
		3,
		uintptr(unsafe.Pointer(d)),
		uintptr(unsafe.Pointer(desc)),
		uintptr(unsafe.Pointer(&state)),
	)
	if r != 0 {
		return nil, fmt.Errorf("ID3D11DeviceCreateRasterizerState: %#x", r)
	}
	return state, nil
}

func (d *_ID3D11Device) CreateInputLayout(descs []_D3D11_INPUT_ELEMENT_DESC, bytecode []byte) (*_ID3D11InputLayout, error) {
	var pdesc *_D3D11_INPUT_ELEMENT_DESC
	if len(descs) > 0 {
		pdesc = &descs[0]
	}
	var layout *_ID3D11InputLayout
	r, _, _ := syscall.Syscall6(
		d.vtbl.CreateInputLayout,
		6,
		uintptr(unsafe.Pointer(d)),
		uintptr(unsafe.Pointer(pdesc)),
		uintptr(len(descs)),
		uintptr(unsafe.Pointer(&bytecode[0])),
		uintptr(len(bytecode)),
		uintptr(unsafe.Pointer(&layout)),
	)
	if r != 0 {
		return nil, fmt.Errorf("ID3D11DeviceCreateInputLayout: %#x", r)
	}
	return layout, nil
}

func (d *_ID3D11Device) CreateSamplerState(desc *_D3D11_SAMPLER_DESC) (*_ID3D11SamplerState, error) {
	var sampler *_ID3D11SamplerState
	r, _, _ := syscall.Syscall(
		d.vtbl.CreateSamplerState,
		3,
		uintptr(unsafe.Pointer(d)),
		uintptr(unsafe.Pointer(desc)),
		uintptr(unsafe.Pointer(&sampler)),
	)
	if r != 0 {
		return nil, fmt.Errorf("ID3D11DeviceCreateSamplerState: %#x", r)
	}
	return sampler, nil
}

func (d *_ID3D11Device) CreateTexture2D(desc *_D3D11_TEXTURE2D_DESC) (*_ID3D11Texture2D, error) {
	var tex *_ID3D11Texture2D
	r, _, _ := syscall.Syscall6(
		d.vtbl.CreateTexture2D,
		4,
		uintptr(unsafe.Pointer(d)),
		uintptr(unsafe.Pointer(desc)),
		0, // pInitialData
		uintptr(unsafe.Pointer(&tex)),
		0, 0,
	)
	if r != 0 {
		return nil, fmt.Errorf("ID3D11CreateTexture2D: %#x", r)
	}
	return tex, nil
}

func (d *_ID3D11Device) CreateRenderTargetView(res *_ID3D11Resource) (*_ID3D11RenderTargetView, error) {
	var target *_ID3D11RenderTargetView
	r, _, _ := syscall.Syscall6(
		d.vtbl.CreateRenderTargetView,
		4,
		uintptr(unsafe.Pointer(d)),
		uintptr(unsafe.Pointer(res)),
		0, // pDesc
		uintptr(unsafe.Pointer(&target)),
		0, 0,
	)
	if r != 0 {
		return nil, fmt.Errorf("ID3D11DeviceCreateRenderTargetView: %#x", r)
	}
	return target, nil
}

func (d *_ID3D11Device) CreateBlendState(desc *_D3D11_BLEND_DESC) (*_ID3D11BlendState, error) {
	var state *_ID3D11BlendState
	r, _, _ := syscall.Syscall(
		d.vtbl.CreateBlendState,
		3,
		uintptr(unsafe.Pointer(d)),
		uintptr(unsafe.Pointer(desc)),
		uintptr(unsafe.Pointer(&state)),
	)
	if r != 0 {
		return nil, fmt.Errorf("ID3D11DeviceCreateBlendState: %#x", r)
	}
	return state, nil
}

func (d *_ID3D11Device) CreateDepthStencilState(desc *_D3D11_DEPTH_STENCIL_DESC) (*_ID3D11DepthStencilState, error) {
	var state *_ID3D11DepthStencilState
	r, _, _ := syscall.Syscall(
		d.vtbl.CreateDepthStencilState,
		3,
		uintptr(unsafe.Pointer(d)),
		uintptr(unsafe.Pointer(desc)),
		uintptr(unsafe.Pointer(&state)),
	)
	if r != 0 {
		return nil, fmt.Errorf("ID3D11DeviceCreateDepthStencilState: %#x", r)
	}
	return state, nil
}

func (s *_IDXGISwapChain) ResizeBuffers(buffers, width, height, newFormat, flags uint32) error {
	r, _, _ := syscall.Syscall6(
		s.vtbl.ResizeBuffers,
		6,
		uintptr(unsafe.Pointer(s)),
		uintptr(buffers),
		uintptr(width),
		uintptr(height),
		uintptr(newFormat),
		uintptr(flags),
	)
	if r != 0 {
		return fmt.Errorf("IDXGISwapChainResizeBuffers: %#x", r)
	}
	return nil
}

func (s *_IDXGISwapChain) Present(SyncInterval int, Flags uint32) error {
	r, _, _ := syscall.Syscall(
		s.vtbl.Present,
		3,
		uintptr(unsafe.Pointer(s)),
		uintptr(SyncInterval),
		uintptr(Flags),
	)
	if r != 0 {
		return ErrorCode{Name: "IDXGISwapChainPresent", Code: int(r)}
	}
	return nil
}

func (s *_IDXGISwapChain) GetBuffer(index int, riid *_GUID) (*_IUnknown, error) {
	var buf *_IUnknown
	r, _, _ := syscall.Syscall6(
		s.vtbl.GetBuffer,
		4,
		uintptr(unsafe.Pointer(s)),
		uintptr(index),
		uintptr(unsafe.Pointer(riid)),
		uintptr(unsafe.Pointer(&buf)),
		0,
		0,
	)
	if r != 0 {
		return nil, fmt.Errorf("IDXGISwapChainGetBuffer: %#x", r)
	}
	return buf, nil
}

func (c *_ID3D11DeviceContext) Unmap(resource *_ID3D11Resource, subResource uint32) {
	syscall.Syscall(
		c.vtbl.Unmap,
		3,
		uintptr(unsafe.Pointer(c)),
		uintptr(unsafe.Pointer(resource)),
		uintptr(subResource),
	)
}

func (c *_ID3D11DeviceContext) Map(resource *_ID3D11Resource, subResource, mapType, mapFlags uint32) (_D3D11_MAPPED_SUBRESOURCE, error) {
	var resMap _D3D11_MAPPED_SUBRESOURCE
	r, _, _ := syscall.Syscall6(
		c.vtbl.Map,
		6,
		uintptr(unsafe.Pointer(c)),
		uintptr(unsafe.Pointer(resource)),
		uintptr(subResource),
		uintptr(mapType),
		uintptr(mapFlags),
		uintptr(unsafe.Pointer(&resMap)),
	)
	if r != 0 {
		return resMap, fmt.Errorf("ID3D11DeviceContextMap: %#x", r)
	}
	return resMap, nil
}

func (c *_ID3D11DeviceContext) CopySubresourceRegion(dst *_ID3D11Resource, dstSubresource, dstX, dstY, dstZ uint32, src *_ID3D11Resource, srcSubresource uint32, srcBox *_D3D11_BOX) {
	syscall.Syscall9(
		c.vtbl.CopySubresourceRegion,
		9,
		uintptr(unsafe.Pointer(c)),
		uintptr(unsafe.Pointer(dst)),
		uintptr(dstSubresource),
		uintptr(dstX),
		uintptr(dstY),
		uintptr(dstZ),
		uintptr(unsafe.Pointer(src)),
		uintptr(srcSubresource),
		uintptr(unsafe.Pointer(srcBox)),
	)
}

func (c *_ID3D11DeviceContext) ClearDepthStencilView(target *_ID3D11DepthStencilView, flags uint32, depth float32, stencil uint8) {
	syscall.Syscall6(
		c.vtbl.ClearDepthStencilView,
		5,
		uintptr(unsafe.Pointer(c)),
		uintptr(unsafe.Pointer(target)),
		uintptr(flags),
		uintptr(math.Float32bits(depth)),
		uintptr(stencil),
		0,
	)
}

func (c *_ID3D11DeviceContext) ClearRenderTargetView(target *_ID3D11RenderTargetView, color *[4]float32) {
	syscall.Syscall(
		c.vtbl.ClearRenderTargetView,
		3,
		uintptr(unsafe.Pointer(c)),
		uintptr(unsafe.Pointer(target)),
		uintptr(unsafe.Pointer(color)),
	)
}

func (c *_ID3D11DeviceContext) RSSetViewports(viewport *_D3D11_VIEWPORT) {
	syscall.Syscall(
		c.vtbl.RSSetViewports,
		3,
		uintptr(unsafe.Pointer(c)),
		1, // NumViewports
		uintptr(unsafe.Pointer(viewport)),
	)
}

func (c *_ID3D11DeviceContext) VSSetShader(s *_ID3D11VertexShader) {
	syscall.Syscall6(
		c.vtbl.VSSetShader,
		4,
		uintptr(unsafe.Pointer(c)),
		uintptr(unsafe.Pointer(s)),
		0, // ppClassInstances
		0, // NumClassInstances
		0, 0,
	)
}

func (c *_ID3D11DeviceContext) VSSetConstantBuffers(b *_ID3D11Buffer) {
	syscall.Syscall6(
		c.vtbl.VSSetConstantBuffers,
		4,
		uintptr(unsafe.Pointer(c)),
		0, // StartSlot
		1, // NumBuffers
		uintptr(unsafe.Pointer(&b)),
		0, 0,
	)
}

func (c *_ID3D11DeviceContext) PSSetConstantBuffers(b *_ID3D11Buffer) {
	syscall.Syscall6(
		c.vtbl.PSSetConstantBuffers,
		4,
		uintptr(unsafe.Pointer(c)),
		0, // StartSlot
		1, // NumBuffers
		uintptr(unsafe.Pointer(&b)),
		0, 0,
	)
}

func (c *_ID3D11DeviceContext) PSSetShaderResources(startSlot uint32, s *_ID3D11ShaderResourceView) {
	syscall.Syscall6(
		c.vtbl.PSSetShaderResources,
		4,
		uintptr(unsafe.Pointer(c)),
		uintptr(startSlot),
		1, // NumViews
		uintptr(unsafe.Pointer(&s)),
		0, 0,
	)
}

func (c *_ID3D11DeviceContext) PSSetSamplers(startSlot uint32, s *_ID3D11SamplerState) {
	syscall.Syscall6(
		c.vtbl.PSSetSamplers,
		4,
		uintptr(unsafe.Pointer(c)),
		uintptr(startSlot),
		1, // NumSamplers
		uintptr(unsafe.Pointer(&s)),
		0, 0,
	)
}

func (c *_ID3D11DeviceContext) PSSetShader(s *_ID3D11PixelShader) {
	syscall.Syscall6(
		c.vtbl.PSSetShader,
		4,
		uintptr(unsafe.Pointer(c)),
		uintptr(unsafe.Pointer(s)),
		0, // ppClassInstances
		0, // NumClassInstances
		0, 0,
	)
}

func (c *_ID3D11DeviceContext) UpdateSubresource(res *_ID3D11Resource, rowPitch, depthPitch uint32, data []byte) {
	syscall.Syscall9(
		c.vtbl.UpdateSubresource,
		7,
		uintptr(unsafe.Pointer(c)),
		uintptr(unsafe.Pointer(res)),
		0, // DstSubresource
		0, // pDstBox
		uintptr(unsafe.Pointer(&data[0])),
		uintptr(rowPitch),
		uintptr(depthPitch),
		0, 0,
	)
}

func (c *_ID3D11DeviceContext) RSSetState(state *_ID3D11RasterizerState) {
	syscall.Syscall(
		c.vtbl.RSSetState,
		2,
		uintptr(unsafe.Pointer(c)),
		uintptr(unsafe.Pointer(state)),
		0,
	)
}

func (c *_ID3D11DeviceContext) IASetInputLayout(layout *_ID3D11InputLayout) {
	syscall.Syscall(
		c.vtbl.IASetInputLayout,
		2,
		uintptr(unsafe.Pointer(c)),
		uintptr(unsafe.Pointer(layout)),
		0,
	)
}

func (c *_ID3D11DeviceContext) IASetIndexBuffer(buf *_ID3D11Buffer, format, offset uint32) {
	syscall.Syscall6(
		c.vtbl.IASetIndexBuffer,
		4,
		uintptr(unsafe.Pointer(c)),
		uintptr(unsafe.Pointer(buf)),
		uintptr(format),
		uintptr(offset),
		0, 0,
	)
}

func (c *_ID3D11DeviceContext) IASetVertexBuffers(buf *_ID3D11Buffer, stride, offset uint32) {
	syscall.Syscall6(
		c.vtbl.IASetVertexBuffers,
		6,
		uintptr(unsafe.Pointer(c)),
		0, // StartSlot
		1, // NumBuffers,
		uintptr(unsafe.Pointer(&buf)),
		uintptr(unsafe.Pointer(&stride)),
		uintptr(unsafe.Pointer(&offset)),
	)
}

func (c *_ID3D11DeviceContext) IASetPrimitiveTopology(mode uint32) {
	syscall.Syscall(
		c.vtbl.IASetPrimitiveTopology,
		2,
		uintptr(unsafe.Pointer(c)),
		uintptr(mode),
		0,
	)
}

func (c *_ID3D11DeviceContext) OMGetRenderTargets() *_ID3D11RenderTargetView {
	var target *_ID3D11RenderTargetView
	syscall.Syscall6(
		c.vtbl.OMGetRenderTargets,
		4,
		uintptr(unsafe.Pointer(c)),
		1, // NumViews
		uintptr(unsafe.Pointer(&target)),
		0, // pDepthStencilView
		0, 0,
	)
	return target
}

func (c *_ID3D11DeviceContext) OMSetRenderTargets(target *_ID3D11RenderTargetView, depthStencil *_ID3D11DepthStencilView) {
	syscall.Syscall6(
		c.vtbl.OMSetRenderTargets,
		4,
		uintptr(unsafe.Pointer(c)),
		1, // NumViews
		uintptr(unsafe.Pointer(&target)),
		uintptr(unsafe.Pointer(depthStencil)),
		0, 0,
	)
}

func (c *_ID3D11DeviceContext) Draw(count, start uint32) {
	syscall.Syscall(
		c.vtbl.Draw,
		3,
		uintptr(unsafe.Pointer(c)),
		uintptr(count),
		uintptr(start),
	)
}

func (c *_ID3D11DeviceContext) DrawIndexed(count, start uint32, base int32) {
	syscall.Syscall6(
		c.vtbl.DrawIndexed,
		4,
		uintptr(unsafe.Pointer(c)),
		uintptr(count),
		uintptr(start),
		uintptr(base),
		0, 0,
	)
}

func (c *_ID3D11DeviceContext) OMSetBlendState(state *_ID3D11BlendState, factor *[4]float32, sampleMask uint32) {
	syscall.Syscall6(
		c.vtbl.OMSetBlendState,
		4,
		uintptr(unsafe.Pointer(c)),
		uintptr(unsafe.Pointer(state)),
		uintptr(unsafe.Pointer(factor)),
		uintptr(sampleMask),
		0, 0,
	)
}

func (c *_ID3D11DeviceContext) OMSetDepthStencilState(state *_ID3D11DepthStencilState, stencilRef uint32) {
	syscall.Syscall(
		c.vtbl.OMSetDepthStencilState,
		3,
		uintptr(unsafe.Pointer(c)),
		uintptr(unsafe.Pointer(state)),
		uintptr(stencilRef),
	)
}

func (b *_ID3DBlob) GetBufferPointer() uintptr {
	ptr, _, _ := syscall.Syscall(
		b.vtbl.GetBufferPointer,
		1,
		uintptr(unsafe.Pointer(b)),
		0,
		0,
	)
	return ptr
}

func (b *_ID3DBlob) GetBufferSize() uintptr {
	sz, _, _ := syscall.Syscall(
		b.vtbl.GetBufferSize,
		1,
		uintptr(unsafe.Pointer(b)),
		0,
		0,
	)
	return sz
}

func (b *_ID3DBlob) data() []byte {
	data := gunsafe.SliceOf(b.GetBufferPointer())
	n := int(b.GetBufferSize())
	return data[:n:n]
}

func (d *_IDXGIObject) GetParent(guid *_GUID) (*_IDXGIObject, error) {
	var parent *_IDXGIObject
	r, _, _ := syscall.Syscall(
		d.vtbl.GetParent,
		3,
		uintptr(unsafe.Pointer(d)),
		uintptr(unsafe.Pointer(guid)),
		uintptr(unsafe.Pointer(&parent)),
	)
	if r != 0 {
		return nil, fmt.Errorf("IDXGIObjectGetParent: %#x", r)
	}
	return parent, nil
}

func (d *_IDXGIFactory) CreateSwapChain(device *_IUnknown, desc *_DXGI_SWAP_CHAIN_DESC) (*_IDXGISwapChain, error) {
	var swchain *_IDXGISwapChain
	r, _, _ := syscall.Syscall6(
		d.vtbl.CreateSwapChain,
		4,
		uintptr(unsafe.Pointer(d)),
		uintptr(unsafe.Pointer(device)),
		uintptr(unsafe.Pointer(desc)),
		uintptr(unsafe.Pointer(&swchain)),
		0, 0,
	)
	if r != 0 {
		return nil, fmt.Errorf("IDXGIFactory: %#x", r)
	}
	return swchain, nil
}

func (d *_IDXGIDevice) GetAdapter() (*_IDXGIAdapter, error) {
	var adapter *_IDXGIAdapter
	r, _, _ := syscall.Syscall(
		d.vtbl.GetAdapter,
		2,
		uintptr(unsafe.Pointer(d)),
		uintptr(unsafe.Pointer(&adapter)),
		0,
	)
	if r != 0 {
		return nil, fmt.Errorf("IDXGIDeviceGetAdapter: %#x", r)
	}
	return adapter, nil
}

func _IUnknownQueryInterface(obj unsafe.Pointer, queryInterfaceMethod uintptr, guid *_GUID) (*_IUnknown, error) {
	var ref *_IUnknown
	r, _, _ := syscall.Syscall(
		queryInterfaceMethod,
		3,
		uintptr(obj),
		uintptr(unsafe.Pointer(guid)),
		uintptr(unsafe.Pointer(&ref)),
	)
	if r != 0 {
		return nil, fmt.Errorf("IUnknownQueryInterface: %#x", r)
	}
	return ref, nil
}

func _IUnknownRelease(obj unsafe.Pointer, releaseMethod uintptr) {
	syscall.Syscall(
		releaseMethod,
		1,
		uintptr(obj),
		0,
		0,
	)
}

func (e ErrorCode) Error() string {
	return fmt.Sprintf("%s: %#x", e.Name, e.Code)
}

A app/internal/window/d3d11_windows.go => app/internal/window/d3d11_windows.go +102 -0
@@ 0,0 1,102 @@
// SPDX-License-Identifier: Unlicense OR MIT

package window

import (
	"gioui.org/app/internal/d3d11"
	"gioui.org/gpu/backend"
)

type d3d11Context struct {
	win     *window
	swchain *d3d11.SwapChain
	fbo     *d3d11.Framebuffer
	backend backend.Device
	*d3d11.Device
	width, height int
}

func init() {
	backends = append(backends, gpuAPI{
		priority: 1,
		initializer: func(w *window) (Context, error) {
			hwnd, _, _ := w.HWND()
			dev, err := d3d11.NewDevice()
			if err != nil {
				return nil, err
			}
			swchain, err := dev.CreateSwapChain(hwnd)
			if err != nil {
				dev.Release()
				return nil, err
			}
			return &d3d11Context{win: w, Device: dev, swchain: swchain}, nil
		},
	})
}

func (c *d3d11Context) Backend() (backend.Device, error) {
	backend, err := d3d11.NewBackend(c.Device)
	if err != nil {
		return nil, err
	}
	c.backend = backend
	c.backend.BindFramebuffer(c.fbo)
	return backend, nil
}

func (c *d3d11Context) Present() error {
	if err := c.swchain.Present(); err != nil {
		if err, ok := err.(d3d11.ErrorCode); ok {
			switch err.Code {
			case d3d11.DXGI_STATUS_OCCLUDED:
				// Ignore
				return nil
			case d3d11.DXGI_ERROR_DEVICE_RESET, d3d11.DXGI_ERROR_DEVICE_REMOVED, d3d11.D3DDDIERR_DEVICEREMOVED:
				return ErrDeviceLost
			}
		}
	}
	return nil
}

func (c *d3d11Context) MakeCurrent() error {
	_, width, height := c.win.HWND()
	if c.fbo != nil && width == c.width && height == c.height {
		c.backend.BindFramebuffer(c.fbo)
		return nil
	}
	if c.fbo != nil {
		c.fbo.Release()
		c.fbo = nil
	}
	if err := c.swchain.Resize(); err != nil {
		return err
	}
	c.width = width
	c.height = height
	fbo, err := c.swchain.Framebuffer(c.Device)
	if err != nil {
		return err
	}
	c.fbo = fbo
	if c.backend != nil {
		c.backend.BindFramebuffer(c.fbo)
	}
	return nil
}

func (c *d3d11Context) Lock() {}

func (c *d3d11Context) Unlock() {}

func (c *d3d11Context) Release() {
	if c.fbo != nil {
		c.fbo.Release()
	}
	c.swchain.Release()
	c.Device.Release()
	c.fbo = nil
	c.swchain = nil
	c.Device = nil
}

M app/internal/window/egl_windows.go => app/internal/window/egl_windows.go +17 -12
@@ 6,28 6,33 @@ import (
	"gioui.org/app/internal/egl"
)

type context struct {
type glContext struct {
	win *window
	*egl.Context
}

func (w *window) NewContext() (Context, error) {
	disp := egl.NativeDisplayType(w.HDC())
	ctx, err := egl.NewContext(disp)
	if err != nil {
		return nil, err
	}
	return &context{win: w, Context: ctx}, nil
func init() {
	backends = append(backends, gpuAPI{
		priority: 2,
		initializer: func(w *window) (Context, error) {
			disp := egl.NativeDisplayType(w.HDC())
			ctx, err := egl.NewContext(disp)
			if err != nil {
				return nil, err
			}
			return &glContext{win: w, Context: ctx}, nil
		},
	})
}

func (c *context) Release() {
func (c *glContext) Release() {
	if c.Context != nil {
		c.Context.Release()
		c.Context = nil
	}
}

func (c *context) MakeCurrent() error {
func (c *glContext) MakeCurrent() error {
	c.Context.ReleaseSurface()
	win, width, height := c.win.HWND()
	eglSurf := egl.NativeWindowType(win)


@@ 41,6 46,6 @@ func (c *context) MakeCurrent() error {
	return nil
}

func (c *context) Lock() {}
func (c *glContext) Lock() {}

func (c *context) Unlock() {}
func (c *glContext) Unlock() {}

M app/internal/window/os_windows.go => app/internal/window/os_windows.go +30 -0
@@ 6,6 6,7 @@ import (
	"errors"
	"image"
	"runtime"
	"sort"
	"sync"
	"time"
	"unicode"


@@ 42,6 43,15 @@ const _WM_REDRAW = windows.WM_USER + 0
var onceMu sync.Mutex
var mainDone = make(chan struct{})

// backends is the list of potential Context
// implementations.
var backends []gpuAPI

type gpuAPI struct {
	priority    int
	initializer func(w *window) (Context, error)
}

func Main() {
	<-mainDone
}


@@ 345,6 355,26 @@ func (w *window) destroy() {
	}
}

func (w *window) NewContext() (Context, error) {
	sort.Slice(backends, func(i, j int) bool {
		return backends[i].priority < backends[j].priority
	})
	var cerr error
	for _, b := range backends {
		ctx, err := b.initializer(w)
		if err == nil {
			return ctx, nil
		}
		if cerr == nil {
			cerr = err
		}
	}
	if cerr != nil {
		return nil, cerr
	}
	return nil, errors.New("NewContext: no available backends")
}

func (w *window) ShowTextInput(show bool) {}

func (w *window) HDC() syscall.Handle {

M gpu/shaders.go => gpu/shaders.go +29 -29
@@ 51,7 51,7 @@ var (
			   }

			*/
			HLSL: []byte(nil),
			HLSL: []byte{0x44, 0x58, 0x42, 0x43, 0xab, 0x4e, 0x66, 0x0, 0x46, 0xb, 0x2a, 0x33, 0xea, 0x6e, 0x32, 0x63, 0x56, 0x8, 0x5c, 0x6d, 0x1, 0x0, 0x0, 0x0, 0x2c, 0x2, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x34, 0x1, 0x0, 0x0, 0x68, 0x1, 0x0, 0x0, 0xb0, 0x1, 0x0, 0x0, 0x52, 0x44, 0x45, 0x46, 0xc4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x44, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x0, 0x1, 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x0, 0xab, 0xab, 0x3c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5c, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x31, 0x32, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x0, 0xab, 0xab, 0x1, 0x0, 0x3, 0x0, 0x1, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x0, 0xab, 0xab, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x0, 0xab, 0xab, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x0, 0xab, 0xab, 0x53, 0x48, 0x44, 0x52, 0x40, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x4, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x3, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0x6, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x1, 0x53, 0x54, 0x41, 0x54, 0x74, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
		},
		{
			Textures:  []backend.TextureBinding{{Name: "tex", Binding: 0}},


@@ 91,7 91,7 @@ var (
			   }

			*/
			HLSL: []byte(nil),
			HLSL: []byte{0x44, 0x58, 0x42, 0x43, 0xb5, 0xf, 0x13, 0xb, 0x63, 0xa9, 0x37, 0xd2, 0x6d, 0x4b, 0xa4, 0x3b, 0x9, 0x5a, 0x1, 0x7f, 0x1, 0x0, 0x0, 0x0, 0x2c, 0x2, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0xdc, 0x0, 0x0, 0x0, 0x10, 0x1, 0x0, 0x0, 0x44, 0x1, 0x0, 0x0, 0xb0, 0x1, 0x0, 0x0, 0x52, 0x44, 0x45, 0x46, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x0, 0x1, 0x0, 0x0, 0x6d, 0x0, 0x0, 0x0, 0x5c, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x69, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x5f, 0x74, 0x65, 0x78, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x0, 0x74, 0x65, 0x78, 0x0, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x0, 0xab, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x0, 0xab, 0xab, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x0, 0xab, 0xab, 0x53, 0x48, 0x44, 0x52, 0x64, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x19, 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x3, 0x0, 0x60, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0x18, 0x0, 0x4, 0x0, 0x70, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55, 0x55, 0x0, 0x0, 0x62, 0x10, 0x0, 0x3, 0x32, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x3, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, 0x0, 0x0, 0x9, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x7e, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x1, 0x53, 0x54, 0x41, 0x54, 0x74, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
		},
	}
	shader_blit_vert = backend.ShaderSources{


@@ 108,9 108,9 @@ var (
		/*
		   cbuffer Block : register(b0)
		   {
		       float4 _24_transform : packoffset(c0);
		       float4 _24_uvTransform : packoffset(c1);
		       float _24_z : packoffset(c2);
		       float4 _41_transform : packoffset(c0);
		       float4 _41_uvTransform : packoffset(c1);
		       float _41_z : packoffset(c2);
		   };




@@ 133,15 133,15 @@ var (

		   float4 toClipSpace(float4 pos_1)
		   {
		       return pos_1;
		       return float4(pos_1.xy, (pos_1.z + pos_1.w) * 0.5f, pos_1.w);
		   }

		   void vert_main()
		   {
		       float2 p = (pos * _24_transform.xy) + _24_transform.zw;
		       float4 param = float4(p, _24_z, 1.0f);
		       float2 p = (pos * _41_transform.xy) + _41_transform.zw;
		       float4 param = float4(p, _41_z, 1.0f);
		       gl_Position = toClipSpace(param);
		       vUV = (uv * _24_uvTransform.xy) + _24_uvTransform.zw;
		       vUV = (uv * _41_uvTransform.xy) + _41_uvTransform.zw;
		   }

		   SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)


@@ 156,7 156,7 @@ var (
		   }

		*/
		HLSL: []byte(nil),
		HLSL: []byte{0x44, 0x58, 0x42, 0x43, 0x54, 0x7c, 0x27, 0xb2, 0x69, 0x6f, 0x7a, 0xf, 0x8f, 0xa3, 0xcb, 0x8c, 0xfa, 0x9d, 0xec, 0x18, 0x1, 0x0, 0x0, 0x0, 0x6c, 0x3, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x5c, 0x1, 0x0, 0x0, 0xac, 0x1, 0x0, 0x0, 0x4, 0x2, 0x0, 0x0, 0xf0, 0x2, 0x0, 0x0, 0x52, 0x44, 0x45, 0x46, 0x20, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x44, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfe, 0xff, 0x0, 0x1, 0x0, 0x0, 0xec, 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x0, 0xab, 0xab, 0x3c, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x5c, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x34, 0x31, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x0, 0xab, 0xab, 0x1, 0x0, 0x3, 0x0, 0x1, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x34, 0x31, 0x5f, 0x75, 0x76, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x0, 0x5f, 0x34, 0x31, 0x5f, 0x7a, 0x0, 0xab, 0xab, 0x0, 0x0, 0x3, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x0, 0xab, 0xab, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x48, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x0, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x0, 0x4f, 0x53, 0x47, 0x4e, 0x50, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xc, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x0, 0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0, 0xab, 0xab, 0xab, 0x53, 0x48, 0x44, 0x52, 0xe4, 0x0, 0x0, 0x0, 0x40, 0x0, 0x1, 0x0, 0x39, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x4, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x3, 0x32, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x3, 0x32, 0x10, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x3, 0x32, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, 0x0, 0x0, 0x4, 0xf2, 0x20, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0xb, 0x32, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x10, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x80, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xe6, 0x8a, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0xb, 0x32, 0x20, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x80, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6, 0x8a, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0xa, 0x42, 0x20, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0xa, 0x80, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x36, 0x0, 0x0, 0x5, 0x82, 0x20, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0x3e, 0x0, 0x0, 0x1, 0x53, 0x54, 0x41, 0x54, 0x74, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
	}
	shader_cover_frag = [...]backend.ShaderSources{
		{


@@ 212,7 212,7 @@ var (
			   }

			*/
			HLSL: []byte(nil),
			HLSL: []byte{0x44, 0x58, 0x42, 0x43, 0xea, 0x61, 0x7c, 0xf7, 0xc6, 0x36, 0x3b, 0xeb, 0x27, 0xde, 0x92, 0x9f, 0x75, 0xbb, 0xc3, 0xe0, 0x1, 0x0, 0x0, 0x0, 0xf8, 0x2, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x54, 0x1, 0x0, 0x0, 0xa0, 0x1, 0x0, 0x0, 0xd4, 0x1, 0x0, 0x0, 0x7c, 0x2, 0x0, 0x0, 0x52, 0x44, 0x45, 0x46, 0x18, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x98, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x0, 0x1, 0x0, 0x0, 0xe4, 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8b, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x0, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x0, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x0, 0xab, 0x91, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x31, 0x32, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x0, 0xab, 0xab, 0x1, 0x0, 0x3, 0x0, 0x1, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x0, 0xab, 0xab, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x44, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x0, 0xab, 0xab, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x0, 0xab, 0xab, 0x53, 0x48, 0x44, 0x52, 0xa0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x28, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x4, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x3, 0x0, 0x60, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x58, 0x18, 0x0, 0x4, 0x0, 0x70, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x55, 0x55, 0x0, 0x0, 0x62, 0x10, 0x0, 0x3, 0x32, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x3, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x2, 0x1, 0x0, 0x0, 0x0, 0x45, 0x0, 0x0, 0x9, 0xf2, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x7e, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x60, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x9, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x10, 0x80, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x1, 0x53, 0x54, 0x41, 0x54, 0x74, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
		},
		{
			Textures:  []backend.TextureBinding{{Name: "tex", Binding: 0}, {Name: "cover", Binding: 1}},


@@ 259,7 259,7 @@ var (
			   }

			*/
			HLSL: []byte(nil),
			HLSL: []byte{0x44, 0x58, 0x42, 0x43, 0xc8, 0x92, 0x66, 0xaf, 0xee, 0x59, 0xb0, 0x91, 0x99, 0x7f, 0xf5, 0x6b, 0x8c, 0x5f, 0xdf, 0xb2, 0x1, 0x0, 0x0, 0x0, 0xc, 0x3, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x30, 0x1, 0x0, 0x0, 0x7c, 0x1, 0x0, 0x0, 0xb0, 0x1, 0x0, 0x0, 0x90, 0x2, 0x0, 0x0, 0x52, 0x44, 0x45, 0x46, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x0, 0x1, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x9c, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xb8, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0xbc, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x5f, 0x74, 0x65, 0x78, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x0, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x0, 0x74, 0x65, 0x78, 0x0, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x0, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x0, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x44, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xc, 0x0, 0x0, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x0, 0xab, 0xab, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x0, 0xab, 0xab, 0x53, 0x48, 0x44, 0x52, 0xd8, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x3, 0x0, 0x60, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x3, 0x0, 0x60, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x58, 0x18, 0x0, 0x4, 0x0, 0x70, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55, 0x55, 0x0, 0x0, 0x58, 0x18, 0x0, 0x4, 0x0, 0x70, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x55, 0x55, 0x0, 0x0, 0x62, 0x10, 0x0, 0x3, 0x32, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x62, 0x10, 0x0, 0x3, 0xc2, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x3, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0x45, 0x0, 0x0, 0x9, 0xf2, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6, 0x1a, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x7e, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, 0x0, 0x0, 0x9, 0xf2, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x7e, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x60, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x8, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0xe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x10, 0x80, 0x81, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x1, 0x53, 0x54, 0x41, 0x54, 0x74, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
		},
	}
	shader_cover_vert = backend.ShaderSources{


@@ 276,10 276,10 @@ var (
		/*
		   cbuffer Block : register(b0)
		   {
		       float4 _66_transform : packoffset(c0);
		       float4 _66_uvCoverTransform : packoffset(c1);
		       float4 _66_uvTransform : packoffset(c2);
		       float _66_z : packoffset(c3);
		       float4 _82_transform : packoffset(c0);
		       float4 _82_uvCoverTransform : packoffset(c1);
		       float4 _82_uvTransform : packoffset(c2);
		       float _82_z : packoffset(c3);
		   };




@@ 304,14 304,14 @@ var (

		   float4 toClipSpace(float4 pos_1)
		   {
		       return pos_1;
		       return float4(pos_1.xy, (pos_1.z + pos_1.w) * 0.5f, pos_1.w);
		   }

		   void fboTextureTransform(out float3 SPIRV_Cross_return_value[2])
		   {
		       float3 t[2];
		       t[0] = float3(1.0f, 0.0f, 0.0f);
		       t[1] = float3(0.0f, 1.0f, 0.0f);
		       t[1] = float3(0.0f, -1.0f, 1.0f);
		       SPIRV_Cross_return_value = t;
		   }



@@ 322,16 322,16 @@ var (

		   void vert_main()
		   {
		       float4 param = float4((pos * _66_transform.xy) + _66_transform.zw, _66_z, 1.0f);
		       float4 param = float4((pos * _82_transform.xy) + _82_transform.zw, _82_z, 1.0f);
		       gl_Position = toClipSpace(param);
		       vUV = (uv * _66_uvTransform.xy) + _66_uvTransform.zw;
		       float3 _101[2];
		       fboTextureTransform(_101);
		       float3 fboTrans[2] = _101;
		       vUV = (uv * _82_uvTransform.xy) + _82_uvTransform.zw;
		       float3 _117[2];
		       fboTextureTransform(_117);
		       float3 fboTrans[2] = _117;
		       float3 param_1[2] = fboTrans;
		       float3 param_2 = float3(uv, 1.0f);
		       float3 uv3 = transform3x2(param_1, param_2);
		       vCoverUV = ((uv3 * float3(_66_uvCoverTransform.xy, 1.0f)) + float3(_66_uvCoverTransform.zw, 0.0f)).xy;
		       vCoverUV = ((uv3 * float3(_82_uvCoverTransform.xy, 1.0f)) + float3(_82_uvCoverTransform.zw, 0.0f)).xy;
		   }

		   SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)


@@ 347,7 347,7 @@ var (
		   }

		*/
		HLSL: []byte(nil),
		HLSL: []byte{0x44, 0x58, 0x42, 0x43, 0x2, 0x2c, 0x11, 0xaa, 0xfa, 0xd0, 0x24, 0xab, 0xaa, 0xc4, 0x81, 0xfe, 0x6e, 0x70, 0xce, 0xac, 0x1, 0x0, 0x0, 0x0, 0x40, 0x4, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x88, 0x1, 0x0, 0x0, 0xd8, 0x1, 0x0, 0x0, 0x48, 0x2, 0x0, 0x0, 0xc4, 0x3, 0x0, 0x0, 0x52, 0x44, 0x45, 0x46, 0x4c, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x44, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfe, 0xff, 0x0, 0x1, 0x0, 0x0, 0x18, 0x1, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x0, 0xab, 0xab, 0x3c, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x5c, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdc, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf1, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x8, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x38, 0x32, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x0, 0xab, 0xab, 0x1, 0x0, 0x3, 0x0, 0x1, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x38, 0x32, 0x5f, 0x75, 0x76, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x0, 0x5f, 0x38, 0x32, 0x5f, 0x75, 0x76, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x0, 0x5f, 0x38, 0x32, 0x5f, 0x7a, 0x0, 0xab, 0x0, 0x0, 0x3, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x0, 0xab, 0xab, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x48, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x0, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x0, 0x4f, 0x53, 0x47, 0x4e, 0x68, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xc, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x3, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x0, 0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0, 0xab, 0xab, 0xab, 0x53, 0x48, 0x44, 0x52, 0x74, 0x1, 0x0, 0x0, 0x40, 0x0, 0x1, 0x0, 0x5d, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x4, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x3, 0x32, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x3, 0x32, 0x10, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x3, 0x32, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x3, 0xc2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, 0x0, 0x0, 0x4, 0xf2, 0x20, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x2, 0x1, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0x5, 0x22, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0x36, 0x0, 0x0, 0x5, 0x52, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56, 0x14, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0xa, 0x82, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, 0x0, 0x80, 0xbf, 0x0, 0x0, 0x80, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0xb, 0x32, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6, 0xa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x80, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xe6, 0x8a, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0xb, 0xc2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x14, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x6, 0x84, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xa6, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0xb, 0x32, 0x20, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x80, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6, 0x8a, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0xa, 0x42, 0x20, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0xa, 0x80, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x36, 0x0, 0x0, 0x5, 0x82, 0x20, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0x3e, 0x0, 0x0, 0x1, 0x53, 0x54, 0x41, 0x54, 0x74, 0x0, 0x0, 0x0, 0x9, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
	}
	shader_intersect_frag = backend.ShaderSources{
		Textures:  []backend.TextureBinding{{Name: "cover", Binding: 0}},


@@ 388,7 388,7 @@ var (
		   }

		*/
		HLSL: []byte(nil),
		HLSL: []byte{0x44, 0x58, 0x42, 0x43, 0xf, 0x9, 0x75, 0xa6, 0x10, 0x91, 0x5e, 0x18, 0xcd, 0xeb, 0xa8, 0xce, 0x93, 0xa, 0x29, 0x5e, 0x1, 0x0, 0x0, 0x0, 0x70, 0x2, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x14, 0x1, 0x0, 0x0, 0x48, 0x1, 0x0, 0x0, 0xf4, 0x1, 0x0, 0x0, 0x52, 0x44, 0x45, 0x46, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x0, 0x1, 0x0, 0x0, 0x71, 0x0, 0x0, 0x0, 0x5c, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x6b, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x0, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x0, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x0, 0xab, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x0, 0xab, 0xab, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x0, 0xab, 0xab, 0x53, 0x48, 0x44, 0x52, 0xa4, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x29, 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x3, 0x0, 0x60, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0x18, 0x0, 0x4, 0x0, 0x70, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55, 0x55, 0x0, 0x0, 0x62, 0x10, 0x0, 0x3, 0x32, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x3, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x2, 0x1, 0x0, 0x0, 0x0, 0x45, 0x0, 0x0, 0x9, 0xf2, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x7e, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0x6, 0x12, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x80, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0x8, 0xe2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x1, 0x53, 0x54, 0x41, 0x54, 0x74, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
	}
	shader_intersect_vert = backend.ShaderSources{
		Inputs: []backend.InputLocation{{Name: "pos", Location: 0, Semantic: "POSITION", SemanticIndex: 0, Type: 0x0, Size: 2}, {Name: "uv", Location: 1, Semantic: "NORMAL", SemanticIndex: 0, Type: 0x0, Size: 2}},


@@ 445,7 445,7 @@ var (
		   }

		*/
		HLSL: []byte(nil),
		HLSL: []byte{0x44, 0x58, 0x42, 0x43, 0xca, 0x16, 0x0, 0xff, 0x5e, 0x5d, 0xe3, 0xf1, 0xd5, 0x17, 0xc0, 0xf6, 0xea, 0xb3, 0x35, 0x61, 0x1, 0x0, 0x0, 0x0, 0xf4, 0x2, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x4, 0x1, 0x0, 0x0, 0x54, 0x1, 0x0, 0x0, 0xac, 0x1, 0x0, 0x0, 0x78, 0x2, 0x0, 0x0, 0x52, 0x44, 0x45, 0x46, 0xc8, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x44, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfe, 0xff, 0x0, 0x1, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x0, 0xab, 0xab, 0x3c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5c, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x34, 0x30, 0x5f, 0x75, 0x76, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x0, 0x1, 0x0, 0x3, 0x0, 0x1, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x0, 0xab, 0xab, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x48, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x0, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x0, 0x4f, 0x53, 0x47, 0x4e, 0x50, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xc, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x0, 0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0, 0xab, 0xab, 0xab, 0x53, 0x48, 0x44, 0x52, 0xc4, 0x0, 0x0, 0x0, 0x40, 0x0, 0x1, 0x0, 0x31, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x4, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x3, 0x32, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x3, 0x32, 0x10, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x3, 0x32, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, 0x0, 0x0, 0x4, 0xf2, 0x20, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0xb, 0x32, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x10, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x80, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6, 0x8a, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0xa, 0x32, 0x20, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0x0, 0x0, 0x80, 0xbf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0x8, 0xc2, 0x20, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0x3e, 0x0, 0x0, 0x1, 0x53, 0x54, 0x41, 0x54, 0x74, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
	}
	shader_stencil_frag = backend.ShaderSources{
		GLSL100ES: "precision mediump float;\nprecision highp int;\n\nvarying vec2 vTo;\nvarying vec2 vFrom;\nvarying vec2 vCtrl;\n\nvoid main()\n{\n    float dx = vTo.x - vFrom.x;\n    bool increasing = vTo.x >= vFrom.x;\n    bvec2 _35 = bvec2(increasing);\n    vec2 left = vec2(_35.x ? vFrom.x : vTo.x, _35.y ? vFrom.y : vTo.y);\n    bvec2 _41 = bvec2(increasing);\n    vec2 right = vec2(_41.x ? vTo.x : vFrom.x, _41.y ? vTo.y : vFrom.y);\n    vec2 extent = clamp(vec2(vFrom.x, vTo.x), vec2(-0.5), vec2(0.5));\n    float midx = mix(extent.x, extent.y, 0.5);\n    float x0 = midx - left.x;\n    vec2 p1 = vCtrl - left;\n    vec2 v = right - vCtrl;\n    float t = x0 / (p1.x + sqrt((p1.x * p1.x) + ((v.x - p1.x) * x0)));\n    float y = mix(mix(left.y, vCtrl.y, t), mix(vCtrl.y, right.y, t), t);\n    vec2 d_half = mix(p1, v, vec2(t));\n    float dy = d_half.y / d_half.x;\n    float width = extent.y - extent.x;\n    dy = abs(dy * width);\n    vec4 sides = vec4((dy * 0.5) + y, (dy * (-0.5)) + y, (0.5 - y) / dy, ((-0.5) - y) / dy);\n    sides = clamp(sides + vec4(0.5), vec4(0.0), vec4(1.0));\n    float area = 0.5 * ((((sides.z - (sides.z * sides.y)) + 1.0) - sides.x) + (sides.x * sides.w));\n    area *= width;\n    if (width == 0.0)\n    {\n        area = 0.0;\n    }\n    gl_FragData[0].x = area;\n}\n\n",


@@ 512,7 512,7 @@ var (
		   }

		*/
		HLSL: []byte(nil),
		HLSL: []byte{0x44, 0x58, 0x42, 0x43, 0xc1, 0x4c, 0xe3, 0x57, 0xa2, 0x17, 0xfa, 0xa6, 0xec, 0xbb, 0xc6, 0x56, 0x50, 0x86, 0xd3, 0x40, 0x1, 0x0, 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x0, 0x24, 0x1, 0x0, 0x0, 0x84, 0x6, 0x0, 0x0, 0x52, 0x44, 0x45, 0x46, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x0, 0x1, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x0, 0xab, 0xab, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x5c, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xc, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x0, 0xab, 0xab, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x0, 0xab, 0xab, 0x53, 0x48, 0x44, 0x52, 0x58, 0x5, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x56, 0x1, 0x0, 0x0, 0x62, 0x10, 0x0, 0x3, 0x32, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x62, 0x10, 0x0, 0x3, 0xc2, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x62, 0x10, 0x0, 0x3, 0x32, 0x10, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x3, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x2, 0x3, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0x5, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0x5, 0x22, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x10, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0xa, 0x32, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x0, 0x0, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0xa, 0x32, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x0, 0x0, 0x0, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x22, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x80, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0x9, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x7, 0x32, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x6, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x80, 0x41, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x7, 0x32, 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x6, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x7, 0x42, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x10, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0xa, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x0, 0x0, 0x9, 0x42, 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x10, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1a, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x0, 0x0, 0x9, 0x42, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x10, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x72, 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x46, 0x2, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0xa6, 0x1b, 0x10, 0x80, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xc2, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56, 0x9, 0x10, 0x80, 0x41, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xa6, 0x1e, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xb2, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0xa6, 0xe, 0x10, 0x80, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x8, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x7, 0x12, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0x9, 0x12, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x4b, 0x0, 0x0, 0x5, 0x12, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x12, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x7, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0x9, 0x12, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0x9, 0xc2, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56, 0xd, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0xa6, 0xe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x7, 0x42, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x7, 0x42, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0x9, 0x82, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x3a, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x82, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x80, 0x41, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x3a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0x9, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x32, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x6, 0x0, 0x10, 0x80, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x0, 0x0, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0xd, 0x32, 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0xa6, 0xa, 0x10, 0x80, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x0, 0x0, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x8, 0xc2, 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x6, 0x4, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0xa6, 0xa, 0x10, 0x80, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0xa, 0xf2, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0xe, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x0, 0x0, 0x0, 0x3f, 0x0, 0x0, 0x0, 0x3f, 0x0, 0x0, 0x0, 0x3f, 0x32, 0x0, 0x0, 0xa, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x10, 0x80, 0x41, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1a, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0x0, 0x0, 0x0, 0x8, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x80, 0x41, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0x9, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x3a, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x7, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x0, 0x0, 0x7, 0x22, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x7, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x37, 0x0, 0x0, 0x9, 0x12, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0x8, 0xe2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x1, 0x53, 0x54, 0x41, 0x54, 0x74, 0x0, 0x0, 0x0, 0x29, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
	}
	shader_stencil_vert = backend.ShaderSources{
		Inputs: []backend.InputLocation{{Name: "corner", Location: 0, Semantic: "POSITION", SemanticIndex: 0, Type: 0x0, Size: 1}, {Name: "maxy", Location: 1, Semantic: "NORMAL", SemanticIndex: 0, Type: 0x0, Size: 1}, {Name: "from", Location: 2, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}, {Name: "ctrl", Location: 3, Semantic: "TEXCOORD", SemanticIndex: 1, Type: 0x0, Size: 2}, {Name: "to", Location: 4, Semantic: "TEXCOORD", SemanticIndex: 2, Type: 0x0, Size: 2}},


@@ 609,6 609,6 @@ var (
		   }

		*/
		HLSL: []byte(nil),
		HLSL: []byte{0x44, 0x58, 0x42, 0x43, 0xfa, 0x30, 0x91, 0x6f, 0x92, 0xd1, 0x46, 0xd3, 0x69, 0x25, 0x74, 0x3a, 0x6c, 0x11, 0xa3, 0xd0, 0x1, 0x0, 0x0, 0x0, 0xc, 0x6, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x3c, 0x1, 0x0, 0x0, 0xe0, 0x1, 0x0, 0x0, 0x68, 0x2, 0x0, 0x0, 0x90, 0x5, 0x0, 0x0, 0x52, 0x44, 0x45, 0x46, 0x0, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x44, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfe, 0xff, 0x0, 0x1, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x0, 0xab, 0xab, 0x3c, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x5c, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x9c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xbc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x31, 0x36, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x0, 0xab, 0xab, 0x1, 0x0, 0x3, 0x0, 0x1, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x31, 0x36, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x0, 0xab, 0x1, 0x0, 0x3, 0x0, 0x1, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x0, 0xab, 0xab, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x9c, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x0, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x0, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x0, 0xab, 0xab, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x80, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xc, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x3, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x3, 0xc, 0x0, 0x0, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x0, 0x53, 0x56, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0, 0xab, 0xab, 0xab, 0x53, 0x48, 0x44, 0x52, 0x20, 0x3, 0x0, 0x0, 0x40, 0x0, 0x1, 0x0, 0xc8, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x4, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x3, 0x12, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x3, 0x12, 0x10, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x3, 0x32, 0x10, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x3, 0x32, 0x10, 0x10, 0x0, 0x3, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x3, 0x32, 0x10, 0x10, 0x0, 0x4, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x3, 0x32, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x3, 0xc2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x3, 0x32, 0x20, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x67, 0x0, 0x0, 0x4, 0xf2, 0x20, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x2, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x10, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1a, 0x80, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x42, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0x1d, 0x0, 0x0, 0x7, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x0, 0x0, 0x0, 0x7, 0x22, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x36, 0x0, 0x0, 0x5, 0x42, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0xa, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x32, 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x46, 0x10, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x46, 0x80, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xc2, 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x6, 0x14, 0x10, 0x0, 0x3, 0x0, 0x0, 0x0, 0x6, 0x84, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x7, 0x32, 0x0, 0x10, 0x0, 0x3, 0x0, 0x0, 0x0, 0xb6, 0xf, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x16, 0x5, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xc2, 0x0, 0x10, 0x0, 0x3, 0x0, 0x0, 0x0, 0x6, 0x14, 0x10, 0x0, 0x4, 0x0, 0x0, 0x0, 0x6, 0x84, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x7, 0x32, 0x0, 0x10, 0x0, 0x3, 0x0, 0x0, 0x0, 0xb6, 0xf, 0x10, 0x0, 0x3, 0x0, 0x0, 0x0, 0x46, 0x0, 0x10, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x32, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x0, 0x10, 0x0, 0x3, 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, 0x0, 0x80, 0xbf, 0x0, 0x0, 0x80, 0xbf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x0, 0x0, 0x9, 0x62, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56, 0x6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa6, 0x8, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x7, 0x22, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3e, 0x34, 0x0, 0x0, 0x7, 0x82, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x7, 0x82, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x10, 0x0, 0x3, 0x0, 0x0, 0x0, 0x3a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x82, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0x37, 0x0, 0x0, 0x9, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x86, 0x8, 0x10, 0x80, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0xe, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x32, 0x20, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x86, 0x0, 0x10, 0x80, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6, 0xa, 0x10, 0x0, 0x3, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0xb, 0x32, 0x20, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x86, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x80, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6, 0x8a, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0x8, 0xc2, 0x20, 0x10, 0x0, 0x2, 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0x0, 0x0, 0x80, 0x3f, 0x3e, 0x0, 0x0, 0x1, 0x53, 0x54, 0x41, 0x54, 0x74, 0x0, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
	}
)

M gpu/shaders/common.inc => gpu/shaders/common.inc +10 -0
@@ 7,15 7,25 @@
// to be [0, 0, 1].
vec3[2] fboTextureTransform() {
	vec3[2] t;
#ifdef HLSL
	t[0] = vec3(1.0, 0.0, 0.0);
	t[1] = vec3(0.0, -1.0, 1.0);
#else
	t[0] = vec3(1.0, 0.0, 0.0);
	t[1] = vec3(0.0, 1.0, 0.0);
#endif
	return t;
}

// toClipSpace converts an OpenGL gl_Position value to a
// native GPU position.
vec4 toClipSpace(vec4 pos) {
#ifdef HLSL
	// Map depths to the Direct3D [0; 1] range.
	return vec4(pos.xy, (pos.z + pos.w)*.5, pos.w);
#else
	return pos;
#endif
}

vec3 transform3x2(vec3[2] t, vec3 v) {