From 18df716784c2faf487d437fece087b85aa09cfb9 Mon Sep 17 00:00:00 2001 From: empathicqubit Date: Fri, 15 Apr 2022 18:09:46 +0200 Subject: [PATCH] Initial commit --- .gitignore | 11 + .vscode/launch.json | 33 + .vscode/settings.json | 12 + .vscode/tasks.json | 21 + Makefile | 178 ++++ README.md | 49 ++ android/AndroidManifest.xml | 25 + .../java/gl/entan/giouibind/GodObject.java | 108 +++ .../java/gl/entan/giouibind/MainActivity.java | 65 ++ .../java/gl/entan/giouibind/MyBleManager.java | 114 +++ android/java/org/gioui/Gio.java | 71 ++ android/java/org/gioui/GioView.java | 752 +++++++++++++++++ android/res/drawable/icon.png | Bin 0 -> 9800 bytes android/res/layout/main.xml | 11 + android/res/values-de/strings.xml | 5 + android/res/values/strings.xml | 5 + app_state.go | 21 + desktop/god.go | 51 ++ desktop/main.go | 39 + desktop/my_delegate.go | 163 ++++ gio/cpu/abi.h | 91 ++ gio/cpu/driver_nosupport.go | 61 ++ gio/cpu/embed.go | 11 + gio/cpu/go.mod | 3 + gio/cpu/runtime.h | 45 + gio/shader/LICENSE | 63 ++ gio/shader/README.md | 18 + gio/shader/cmd/convertshaders/glslvalidate.go | 64 ++ gio/shader/cmd/convertshaders/hlsl.go | 146 ++++ gio/shader/cmd/convertshaders/main.go | 547 ++++++++++++ gio/shader/cmd/convertshaders/msl.go | 108 +++ gio/shader/cmd/convertshaders/spirvcross.go | 259 ++++++ gio/shader/cmd/convertshaders/workdir.go | 35 + gio/shader/gio/blit.frag | 15 + gio/shader/gio/blit.vert | 27 + gio/shader/gio/common.h | 35 + gio/shader/gio/copy.frag | 24 + gio/shader/gio/copy.vert | 26 + gio/shader/gio/cover.frag | 20 + gio/shader/gio/cover.vert | 31 + gio/shader/gio/gen.go | 5 + gio/shader/gio/input.vert | 15 + gio/shader/gio/intersect.frag | 15 + gio/shader/gio/intersect.vert | 26 + gio/shader/gio/material.frag | 32 + gio/shader/gio/material.vert | 25 + gio/shader/gio/shaders.go | 796 ++++++++++++++++++ gio/shader/gio/simple.frag | 11 + gio/shader/gio/stencil.frag | 81 ++ gio/shader/gio/stencil.vert | 57 ++ gio/shader/gio/zblit.frag.0.dxbc | Bin 0 -> 628 bytes gio/shader/gio/zblit.frag.0.glsl100es | 18 + gio/shader/gio/zblit.frag.0.glsl150 | 17 + gio/shader/gio/zblit.frag.0.metallibios | Bin 0 -> 2679 bytes .../gio/zblit.frag.0.metallibiossimulator | Bin 0 -> 3057 bytes gio/shader/gio/zblit.frag.0.metallibmacos | Bin 0 -> 2695 bytes gio/shader/gio/zblit.frag.0.spirv | Bin 0 -> 624 bytes gio/shader/gio/zblit.frag.1.dxbc | Bin 0 -> 848 bytes gio/shader/gio/zblit.frag.1.glsl100es | 19 + gio/shader/gio/zblit.frag.1.glsl150 | 18 + gio/shader/gio/zblit.frag.1.metallibios | Bin 0 -> 2935 bytes .../gio/zblit.frag.1.metallibiossimulator | Bin 0 -> 3361 bytes gio/shader/gio/zblit.frag.1.metallibmacos | Bin 0 -> 2951 bytes gio/shader/gio/zblit.frag.1.spirv | Bin 0 -> 964 bytes gio/shader/gio/zblit.frag.2.dxbc | Bin 0 -> 660 bytes gio/shader/gio/zblit.frag.2.glsl100es | 13 + gio/shader/gio/zblit.frag.2.glsl150 | 12 + gio/shader/gio/zblit.frag.2.metallibios | Bin 0 -> 2711 bytes .../gio/zblit.frag.2.metallibiossimulator | Bin 0 -> 3121 bytes gio/shader/gio/zblit.frag.2.metallibmacos | Bin 0 -> 2775 bytes gio/shader/gio/zblit.frag.2.spirv | Bin 0 -> 596 bytes gio/shader/gio/zblit.vert.0.dxbc | Bin 0 -> 1184 bytes gio/shader/gio/zblit.vert.0.glsl100es | 37 + gio/shader/gio/zblit.vert.0.glsl150 | 37 + gio/shader/gio/zblit.vert.0.metallibios | Bin 0 -> 3044 bytes .../gio/zblit.vert.0.metallibiossimulator | Bin 0 -> 3438 bytes gio/shader/gio/zblit.vert.0.metallibmacos | Bin 0 -> 3092 bytes gio/shader/gio/zblit.vert.0.spirv | Bin 0 -> 1600 bytes gio/shader/gio/zcopy.frag.0.dxbc | Bin 0 -> 1256 bytes gio/shader/gio/zcopy.frag.0.glsl100es | 27 + gio/shader/gio/zcopy.frag.0.glsl150 | 26 + gio/shader/gio/zcopy.frag.0.metallibios | Bin 0 -> 2951 bytes .../gio/zcopy.frag.0.metallibiossimulator | Bin 0 -> 3361 bytes gio/shader/gio/zcopy.frag.0.metallibmacos | Bin 0 -> 2999 bytes gio/shader/gio/zcopy.frag.0.spirv | Bin 0 -> 1252 bytes gio/shader/gio/zcopy.vert.0.dxbc | Bin 0 -> 1056 bytes gio/shader/gio/zcopy.vert.0.glsl100es | 35 + gio/shader/gio/zcopy.vert.0.glsl150 | 35 + gio/shader/gio/zcopy.vert.0.metallibios | Bin 0 -> 3028 bytes .../gio/zcopy.vert.0.metallibiossimulator | Bin 0 -> 3438 bytes gio/shader/gio/zcopy.vert.0.metallibmacos | Bin 0 -> 3060 bytes gio/shader/gio/zcopy.vert.0.spirv | Bin 0 -> 1304 bytes gio/shader/gio/zcover.frag.0.dxbc | Bin 0 -> 932 bytes gio/shader/gio/zcover.frag.0.glsl100es | 23 + gio/shader/gio/zcover.frag.0.glsl150 | 22 + gio/shader/gio/zcover.frag.0.metallibios | Bin 0 -> 3191 bytes .../gio/zcover.frag.0.metallibiossimulator | Bin 0 -> 3665 bytes gio/shader/gio/zcover.frag.0.metallibmacos | Bin 0 -> 3207 bytes gio/shader/gio/zcover.frag.0.spirv | Bin 0 -> 1092 bytes gio/shader/gio/zcover.frag.1.dxbc | Bin 0 -> 1152 bytes gio/shader/gio/zcover.frag.1.glsl100es | 24 + gio/shader/gio/zcover.frag.1.glsl150 | 23 + gio/shader/gio/zcover.frag.1.metallibios | Bin 0 -> 3367 bytes .../gio/zcover.frag.1.metallibiossimulator | Bin 0 -> 3921 bytes gio/shader/gio/zcover.frag.1.metallibmacos | Bin 0 -> 3367 bytes gio/shader/gio/zcover.frag.1.spirv | Bin 0 -> 1416 bytes gio/shader/gio/zcover.frag.2.dxbc | Bin 0 -> 984 bytes gio/shader/gio/zcover.frag.2.glsl100es | 17 + gio/shader/gio/zcover.frag.2.glsl150 | 16 + gio/shader/gio/zcover.frag.2.metallibios | Bin 0 -> 2967 bytes .../gio/zcover.frag.2.metallibiossimulator | Bin 0 -> 3441 bytes gio/shader/gio/zcover.frag.2.metallibmacos | Bin 0 -> 3015 bytes gio/shader/gio/zcover.frag.2.spirv | Bin 0 -> 1000 bytes gio/shader/gio/zcover.vert.0.dxbc | Bin 0 -> 1332 bytes gio/shader/gio/zcover.vert.0.glsl100es | 41 + gio/shader/gio/zcover.vert.0.glsl150 | 41 + gio/shader/gio/zcover.vert.0.metallibios | Bin 0 -> 3156 bytes .../gio/zcover.vert.0.metallibiossimulator | Bin 0 -> 3598 bytes gio/shader/gio/zcover.vert.0.metallibmacos | Bin 0 -> 3204 bytes gio/shader/gio/zcover.vert.0.spirv | Bin 0 -> 1972 bytes gio/shader/gio/zinput.vert.0.dxbc | Bin 0 -> 588 bytes gio/shader/gio/zinput.vert.0.glsl100es | 22 + gio/shader/gio/zinput.vert.0.glsl150 | 22 + gio/shader/gio/zinput.vert.0.metallibios | Bin 0 -> 2579 bytes .../gio/zinput.vert.0.metallibiossimulator | Bin 0 -> 2989 bytes gio/shader/gio/zinput.vert.0.metallibmacos | Bin 0 -> 2627 bytes gio/shader/gio/zinput.vert.0.spirv | Bin 0 -> 800 bytes gio/shader/gio/zintersect.frag.0.dxbc | Bin 0 -> 776 bytes gio/shader/gio/zintersect.frag.0.glsl100es | 13 + gio/shader/gio/zintersect.frag.0.glsl150 | 12 + gio/shader/gio/zintersect.frag.0.metallibios | Bin 0 -> 2791 bytes .../zintersect.frag.0.metallibiossimulator | Bin 0 -> 3233 bytes .../gio/zintersect.frag.0.metallibmacos | Bin 0 -> 2823 bytes gio/shader/gio/zintersect.frag.0.spirv | Bin 0 -> 736 bytes gio/shader/gio/zintersect.vert.0.dxbc | Bin 0 -> 1048 bytes gio/shader/gio/zintersect.vert.0.glsl100es | 35 + gio/shader/gio/zintersect.vert.0.glsl150 | 35 + gio/shader/gio/zintersect.vert.0.metallibios | Bin 0 -> 2964 bytes .../zintersect.vert.0.metallibiossimulator | Bin 0 -> 3358 bytes .../gio/zintersect.vert.0.metallibmacos | Bin 0 -> 3012 bytes gio/shader/gio/zintersect.vert.0.spirv | Bin 0 -> 1368 bytes gio/shader/gio/zmaterial.frag.0.dxbc | Bin 0 -> 1476 bytes gio/shader/gio/zmaterial.frag.0.glsl100es | 37 + gio/shader/gio/zmaterial.frag.0.glsl150 | 36 + gio/shader/gio/zmaterial.frag.0.metallibios | Bin 0 -> 3367 bytes .../gio/zmaterial.frag.0.metallibiossimulator | Bin 0 -> 3761 bytes gio/shader/gio/zmaterial.frag.0.metallibmacos | Bin 0 -> 3383 bytes gio/shader/gio/zmaterial.frag.0.spirv | Bin 0 -> 1624 bytes gio/shader/gio/zmaterial.vert.0.dxbc | Bin 0 -> 1000 bytes gio/shader/gio/zmaterial.vert.0.glsl100es | 34 + gio/shader/gio/zmaterial.vert.0.glsl150 | 34 + gio/shader/gio/zmaterial.vert.0.metallibios | Bin 0 -> 2996 bytes .../gio/zmaterial.vert.0.metallibiossimulator | Bin 0 -> 3406 bytes gio/shader/gio/zmaterial.vert.0.metallibmacos | Bin 0 -> 3028 bytes gio/shader/gio/zmaterial.vert.0.spirv | Bin 0 -> 1188 bytes gio/shader/gio/zsimple.frag.0.dxbc | Bin 0 -> 476 bytes gio/shader/gio/zsimple.frag.0.glsl100es | 9 + gio/shader/gio/zsimple.frag.0.glsl150 | 9 + gio/shader/gio/zsimple.frag.0.metallibios | Bin 0 -> 2359 bytes .../gio/zsimple.frag.0.metallibiossimulator | Bin 0 -> 2721 bytes gio/shader/gio/zsimple.frag.0.metallibmacos | Bin 0 -> 2391 bytes gio/shader/gio/zsimple.frag.0.spirv | Bin 0 -> 396 bytes gio/shader/gio/zstencil.frag.0.dxbc | Bin 0 -> 2652 bytes gio/shader/gio/zstencil.frag.0.glsl100es | 38 + gio/shader/gio/zstencil.frag.0.glsl150 | 37 + gio/shader/gio/zstencil.frag.0.metallibios | Bin 0 -> 3159 bytes .../gio/zstencil.frag.0.metallibiossimulator | Bin 0 -> 3713 bytes gio/shader/gio/zstencil.frag.0.metallibmacos | Bin 0 -> 3175 bytes gio/shader/gio/zstencil.frag.0.spirv | Bin 0 -> 2868 bytes gio/shader/gio/zstencil.vert.0.dxbc | Bin 0 -> 2120 bytes gio/shader/gio/zstencil.vert.0.glsl100es | 64 ++ gio/shader/gio/zstencil.vert.0.glsl150 | 64 ++ gio/shader/gio/zstencil.vert.0.metallibios | Bin 0 -> 3535 bytes .../gio/zstencil.vert.0.metallibiossimulator | Bin 0 -> 4041 bytes gio/shader/gio/zstencil.vert.0.metallibmacos | Bin 0 -> 3567 bytes gio/shader/gio/zstencil.vert.0.spirv | Bin 0 -> 2724 bytes gio/shader/go.mod | 3 + gio/shader/go.sum | 0 gio/shader/piet/abi.h | 91 ++ gio/shader/piet/annotated.h | 225 +++++ gio/shader/piet/backdrop_abi.h | 17 + gio/shader/piet/backdrop_abi_nosupport.go | 19 + gio/shader/piet/binning_abi.h | 17 + gio/shader/piet/binning_abi_nosupport.go | 19 + gio/shader/piet/bins.h | 31 + gio/shader/piet/coarse_abi.h | 17 + gio/shader/piet/coarse_abi_nosupport.go | 19 + gio/shader/piet/elements_abi.h | 19 + gio/shader/piet/elements_abi_nosupport.go | 27 + gio/shader/piet/kernel4_abi.h | 19 + gio/shader/piet/kernel4_abi_nosupport.go | 27 + gio/shader/piet/mem.h | 147 ++++ gio/shader/piet/path_coarse_abi.h | 17 + gio/shader/piet/path_coarse_abi_nosupport.go | 19 + gio/shader/piet/pathseg.h | 100 +++ gio/shader/piet/ptcl.h | 278 ++++++ gio/shader/piet/runtime.h | 45 + gio/shader/piet/scene.h | 313 +++++++ gio/shader/piet/setup.h | 51 ++ gio/shader/piet/shaders.go | 231 +++++ gio/shader/piet/state.h | 73 ++ gio/shader/piet/tile.h | 150 ++++ gio/shader/piet/tile_alloc_abi.h | 17 + gio/shader/piet/tile_alloc_abi_nosupport.go | 19 + gio/shader/shader.go | 65 ++ giouibind.go | 99 +++ go.mod | 30 + go.sum | 471 +++++++++++ ios/.gitignore | 66 ++ ios/export-options.plist | 12 + .../giouibind.xcodeproj/project.pbxproj | 648 ++++++++++++++ ios/giouibind/giouibind/AppDelegate.swift | 37 + .../giouibind/Base.lproj/Main.storyboard | 32 + ios/giouibind/giouibind/GodObject.swift | 203 +++++ ios/giouibind/giouibind/Info.plist | 8 + ios/giouibind/giouibind/ViewController.swift | 11 + .../giouibind/giouibind-Bridging-Header.h | 8 + .../giouibindTests/dumbcontrolTests.swift | 36 + .../giouibindUITests/dumbcontrolUITests.swift | 42 + .../dumbcontrolUITestsLaunchTests.swift | 32 + mobile/gio/main.go | 4 + mobile/mobile.go | 58 ++ native/native.go | 13 + tools.go | 8 + 224 files changed, 9321 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 Makefile create mode 100644 README.md create mode 100644 android/AndroidManifest.xml create mode 100644 android/java/gl/entan/giouibind/GodObject.java create mode 100644 android/java/gl/entan/giouibind/MainActivity.java create mode 100644 android/java/gl/entan/giouibind/MyBleManager.java create mode 100644 android/java/org/gioui/Gio.java create mode 100644 android/java/org/gioui/GioView.java create mode 100644 android/res/drawable/icon.png create mode 100644 android/res/layout/main.xml create mode 100644 android/res/values-de/strings.xml create mode 100644 android/res/values/strings.xml create mode 100644 app_state.go create mode 100644 desktop/god.go create mode 100644 desktop/main.go create mode 100644 desktop/my_delegate.go create mode 100644 gio/cpu/abi.h create mode 100644 gio/cpu/driver_nosupport.go create mode 100644 gio/cpu/embed.go create mode 100644 gio/cpu/go.mod create mode 100644 gio/cpu/runtime.h create mode 100644 gio/shader/LICENSE create mode 100644 gio/shader/README.md create mode 100644 gio/shader/cmd/convertshaders/glslvalidate.go create mode 100644 gio/shader/cmd/convertshaders/hlsl.go create mode 100644 gio/shader/cmd/convertshaders/main.go create mode 100644 gio/shader/cmd/convertshaders/msl.go create mode 100644 gio/shader/cmd/convertshaders/spirvcross.go create mode 100644 gio/shader/cmd/convertshaders/workdir.go create mode 100644 gio/shader/gio/blit.frag create mode 100644 gio/shader/gio/blit.vert create mode 100644 gio/shader/gio/common.h create mode 100644 gio/shader/gio/copy.frag create mode 100644 gio/shader/gio/copy.vert create mode 100644 gio/shader/gio/cover.frag create mode 100644 gio/shader/gio/cover.vert create mode 100644 gio/shader/gio/gen.go create mode 100644 gio/shader/gio/input.vert create mode 100644 gio/shader/gio/intersect.frag create mode 100644 gio/shader/gio/intersect.vert create mode 100644 gio/shader/gio/material.frag create mode 100644 gio/shader/gio/material.vert create mode 100644 gio/shader/gio/shaders.go create mode 100644 gio/shader/gio/simple.frag create mode 100644 gio/shader/gio/stencil.frag create mode 100644 gio/shader/gio/stencil.vert create mode 100644 gio/shader/gio/zblit.frag.0.dxbc create mode 100644 gio/shader/gio/zblit.frag.0.glsl100es create mode 100644 gio/shader/gio/zblit.frag.0.glsl150 create mode 100644 gio/shader/gio/zblit.frag.0.metallibios create mode 100644 gio/shader/gio/zblit.frag.0.metallibiossimulator create mode 100644 gio/shader/gio/zblit.frag.0.metallibmacos create mode 100644 gio/shader/gio/zblit.frag.0.spirv create mode 100644 gio/shader/gio/zblit.frag.1.dxbc create mode 100644 gio/shader/gio/zblit.frag.1.glsl100es create mode 100644 gio/shader/gio/zblit.frag.1.glsl150 create mode 100644 gio/shader/gio/zblit.frag.1.metallibios create mode 100644 gio/shader/gio/zblit.frag.1.metallibiossimulator create mode 100644 gio/shader/gio/zblit.frag.1.metallibmacos create mode 100644 gio/shader/gio/zblit.frag.1.spirv create mode 100644 gio/shader/gio/zblit.frag.2.dxbc create mode 100644 gio/shader/gio/zblit.frag.2.glsl100es create mode 100644 gio/shader/gio/zblit.frag.2.glsl150 create mode 100644 gio/shader/gio/zblit.frag.2.metallibios create mode 100644 gio/shader/gio/zblit.frag.2.metallibiossimulator create mode 100644 gio/shader/gio/zblit.frag.2.metallibmacos create mode 100644 gio/shader/gio/zblit.frag.2.spirv create mode 100644 gio/shader/gio/zblit.vert.0.dxbc create mode 100644 gio/shader/gio/zblit.vert.0.glsl100es create mode 100644 gio/shader/gio/zblit.vert.0.glsl150 create mode 100644 gio/shader/gio/zblit.vert.0.metallibios create mode 100644 gio/shader/gio/zblit.vert.0.metallibiossimulator create mode 100644 gio/shader/gio/zblit.vert.0.metallibmacos create mode 100644 gio/shader/gio/zblit.vert.0.spirv create mode 100644 gio/shader/gio/zcopy.frag.0.dxbc create mode 100644 gio/shader/gio/zcopy.frag.0.glsl100es create mode 100644 gio/shader/gio/zcopy.frag.0.glsl150 create mode 100644 gio/shader/gio/zcopy.frag.0.metallibios create mode 100644 gio/shader/gio/zcopy.frag.0.metallibiossimulator create mode 100644 gio/shader/gio/zcopy.frag.0.metallibmacos create mode 100644 gio/shader/gio/zcopy.frag.0.spirv create mode 100644 gio/shader/gio/zcopy.vert.0.dxbc create mode 100644 gio/shader/gio/zcopy.vert.0.glsl100es create mode 100644 gio/shader/gio/zcopy.vert.0.glsl150 create mode 100644 gio/shader/gio/zcopy.vert.0.metallibios create mode 100644 gio/shader/gio/zcopy.vert.0.metallibiossimulator create mode 100644 gio/shader/gio/zcopy.vert.0.metallibmacos create mode 100644 gio/shader/gio/zcopy.vert.0.spirv create mode 100644 gio/shader/gio/zcover.frag.0.dxbc create mode 100644 gio/shader/gio/zcover.frag.0.glsl100es create mode 100644 gio/shader/gio/zcover.frag.0.glsl150 create mode 100644 gio/shader/gio/zcover.frag.0.metallibios create mode 100644 gio/shader/gio/zcover.frag.0.metallibiossimulator create mode 100644 gio/shader/gio/zcover.frag.0.metallibmacos create mode 100644 gio/shader/gio/zcover.frag.0.spirv create mode 100644 gio/shader/gio/zcover.frag.1.dxbc create mode 100644 gio/shader/gio/zcover.frag.1.glsl100es create mode 100644 gio/shader/gio/zcover.frag.1.glsl150 create mode 100644 gio/shader/gio/zcover.frag.1.metallibios create mode 100644 gio/shader/gio/zcover.frag.1.metallibiossimulator create mode 100644 gio/shader/gio/zcover.frag.1.metallibmacos create mode 100644 gio/shader/gio/zcover.frag.1.spirv create mode 100644 gio/shader/gio/zcover.frag.2.dxbc create mode 100644 gio/shader/gio/zcover.frag.2.glsl100es create mode 100644 gio/shader/gio/zcover.frag.2.glsl150 create mode 100644 gio/shader/gio/zcover.frag.2.metallibios create mode 100644 gio/shader/gio/zcover.frag.2.metallibiossimulator create mode 100644 gio/shader/gio/zcover.frag.2.metallibmacos create mode 100644 gio/shader/gio/zcover.frag.2.spirv create mode 100644 gio/shader/gio/zcover.vert.0.dxbc create mode 100644 gio/shader/gio/zcover.vert.0.glsl100es create mode 100644 gio/shader/gio/zcover.vert.0.glsl150 create mode 100644 gio/shader/gio/zcover.vert.0.metallibios create mode 100644 gio/shader/gio/zcover.vert.0.metallibiossimulator create mode 100644 gio/shader/gio/zcover.vert.0.metallibmacos create mode 100644 gio/shader/gio/zcover.vert.0.spirv create mode 100644 gio/shader/gio/zinput.vert.0.dxbc create mode 100644 gio/shader/gio/zinput.vert.0.glsl100es create mode 100644 gio/shader/gio/zinput.vert.0.glsl150 create mode 100644 gio/shader/gio/zinput.vert.0.metallibios create mode 100644 gio/shader/gio/zinput.vert.0.metallibiossimulator create mode 100644 gio/shader/gio/zinput.vert.0.metallibmacos create mode 100644 gio/shader/gio/zinput.vert.0.spirv create mode 100644 gio/shader/gio/zintersect.frag.0.dxbc create mode 100644 gio/shader/gio/zintersect.frag.0.glsl100es create mode 100644 gio/shader/gio/zintersect.frag.0.glsl150 create mode 100644 gio/shader/gio/zintersect.frag.0.metallibios create mode 100644 gio/shader/gio/zintersect.frag.0.metallibiossimulator create mode 100644 gio/shader/gio/zintersect.frag.0.metallibmacos create mode 100644 gio/shader/gio/zintersect.frag.0.spirv create mode 100644 gio/shader/gio/zintersect.vert.0.dxbc create mode 100644 gio/shader/gio/zintersect.vert.0.glsl100es create mode 100644 gio/shader/gio/zintersect.vert.0.glsl150 create mode 100644 gio/shader/gio/zintersect.vert.0.metallibios create mode 100644 gio/shader/gio/zintersect.vert.0.metallibiossimulator create mode 100644 gio/shader/gio/zintersect.vert.0.metallibmacos create mode 100644 gio/shader/gio/zintersect.vert.0.spirv create mode 100644 gio/shader/gio/zmaterial.frag.0.dxbc create mode 100644 gio/shader/gio/zmaterial.frag.0.glsl100es create mode 100644 gio/shader/gio/zmaterial.frag.0.glsl150 create mode 100644 gio/shader/gio/zmaterial.frag.0.metallibios create mode 100644 gio/shader/gio/zmaterial.frag.0.metallibiossimulator create mode 100644 gio/shader/gio/zmaterial.frag.0.metallibmacos create mode 100644 gio/shader/gio/zmaterial.frag.0.spirv create mode 100644 gio/shader/gio/zmaterial.vert.0.dxbc create mode 100644 gio/shader/gio/zmaterial.vert.0.glsl100es create mode 100644 gio/shader/gio/zmaterial.vert.0.glsl150 create mode 100644 gio/shader/gio/zmaterial.vert.0.metallibios create mode 100644 gio/shader/gio/zmaterial.vert.0.metallibiossimulator create mode 100644 gio/shader/gio/zmaterial.vert.0.metallibmacos create mode 100644 gio/shader/gio/zmaterial.vert.0.spirv create mode 100644 gio/shader/gio/zsimple.frag.0.dxbc create mode 100644 gio/shader/gio/zsimple.frag.0.glsl100es create mode 100644 gio/shader/gio/zsimple.frag.0.glsl150 create mode 100644 gio/shader/gio/zsimple.frag.0.metallibios create mode 100644 gio/shader/gio/zsimple.frag.0.metallibiossimulator create mode 100644 gio/shader/gio/zsimple.frag.0.metallibmacos create mode 100644 gio/shader/gio/zsimple.frag.0.spirv create mode 100644 gio/shader/gio/zstencil.frag.0.dxbc create mode 100644 gio/shader/gio/zstencil.frag.0.glsl100es create mode 100644 gio/shader/gio/zstencil.frag.0.glsl150 create mode 100644 gio/shader/gio/zstencil.frag.0.metallibios create mode 100644 gio/shader/gio/zstencil.frag.0.metallibiossimulator create mode 100644 gio/shader/gio/zstencil.frag.0.metallibmacos create mode 100644 gio/shader/gio/zstencil.frag.0.spirv create mode 100644 gio/shader/gio/zstencil.vert.0.dxbc create mode 100644 gio/shader/gio/zstencil.vert.0.glsl100es create mode 100644 gio/shader/gio/zstencil.vert.0.glsl150 create mode 100644 gio/shader/gio/zstencil.vert.0.metallibios create mode 100644 gio/shader/gio/zstencil.vert.0.metallibiossimulator create mode 100644 gio/shader/gio/zstencil.vert.0.metallibmacos create mode 100644 gio/shader/gio/zstencil.vert.0.spirv create mode 100644 gio/shader/go.mod create mode 100644 gio/shader/go.sum create mode 100644 gio/shader/piet/abi.h create mode 100644 gio/shader/piet/annotated.h create mode 100644 gio/shader/piet/backdrop_abi.h create mode 100644 gio/shader/piet/backdrop_abi_nosupport.go create mode 100644 gio/shader/piet/binning_abi.h create mode 100644 gio/shader/piet/binning_abi_nosupport.go create mode 100644 gio/shader/piet/bins.h create mode 100644 gio/shader/piet/coarse_abi.h create mode 100644 gio/shader/piet/coarse_abi_nosupport.go create mode 100644 gio/shader/piet/elements_abi.h create mode 100644 gio/shader/piet/elements_abi_nosupport.go create mode 100644 gio/shader/piet/kernel4_abi.h create mode 100644 gio/shader/piet/kernel4_abi_nosupport.go create mode 100644 gio/shader/piet/mem.h create mode 100644 gio/shader/piet/path_coarse_abi.h create mode 100644 gio/shader/piet/path_coarse_abi_nosupport.go create mode 100644 gio/shader/piet/pathseg.h create mode 100644 gio/shader/piet/ptcl.h create mode 100644 gio/shader/piet/runtime.h create mode 100644 gio/shader/piet/scene.h create mode 100644 gio/shader/piet/setup.h create mode 100644 gio/shader/piet/shaders.go create mode 100644 gio/shader/piet/state.h create mode 100644 gio/shader/piet/tile.h create mode 100644 gio/shader/piet/tile_alloc_abi.h create mode 100644 gio/shader/piet/tile_alloc_abi_nosupport.go create mode 100644 gio/shader/shader.go create mode 100644 giouibind.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 ios/.gitignore create mode 100644 ios/export-options.plist create mode 100644 ios/giouibind/giouibind.xcodeproj/project.pbxproj create mode 100644 ios/giouibind/giouibind/AppDelegate.swift create mode 100644 ios/giouibind/giouibind/Base.lproj/Main.storyboard create mode 100644 ios/giouibind/giouibind/GodObject.swift create mode 100644 ios/giouibind/giouibind/Info.plist create mode 100644 ios/giouibind/giouibind/ViewController.swift create mode 100644 ios/giouibind/giouibind/giouibind-Bridging-Header.h create mode 100644 ios/giouibind/giouibindTests/dumbcontrolTests.swift create mode 100644 ios/giouibind/giouibindUITests/dumbcontrolUITests.swift create mode 100644 ios/giouibind/giouibindUITests/dumbcontrolUITestsLaunchTests.swift create mode 100644 mobile/gio/main.go create mode 100644 mobile/mobile.go create mode 100644 native/native.go create mode 100644 tools.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..15c2342 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +/keys.store +/build +debug +__debug_bin +R.java +*.env +.DS_Store +*.jar +*.aar +*.[xX]cframework +*.[fF]ramework diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..f4b80e8 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,33 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "In integrated terminal. Breaks bluetooth", + "type": "go", + "request": "launch", + "cwd": "${workspaceFolder}", + "program": "./desktop" + }, + { + "name": "In separate Mac OS Terminal with command: dlv dap --listen :6868", + "type": "go", + "request": "launch", + "cwd": "${workspaceFolder}", + "envFile": "${workspaceFolder}/.env", + "program": "${workspaceFolder}/desktop", + "port": 6868 + }, + { + "name": "Remote device", + "type": "go", + "request": "attach", + "mode": "remote", + "remotePath": "${workspaceFolder}", + "port": 4334, + "host": "127.0.0.1", + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..443e2bf --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,12 @@ +{ + "java.project.referencedLibraries": { + + "include": [ + "build/jars/**/*.jar", + ] + }, + "java.jdt.ls.vmargs": "-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx8G -Xms100m", + "java.project.sourcePaths": [ + "android/java" + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..59bc5c4 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,21 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "makeDebug", + "type": "shell", + "command": "make debug", + }, + { + "label": "build", + "type": "shell", + "group": { + "kind": "build", + "isDefault": true + }, + "command": "go build -o debug github.com/empathicqubit/giouibind/desktop" + } + ] +} \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..cbb9ad1 --- /dev/null +++ b/Makefile @@ -0,0 +1,178 @@ +# FIXME Explain wth we're doing +MIN_SDK_VERSION ?= 21 +ANDROID_SDK_VERSION ?= 30.0.3 +ANDROID_HOME ?= $(HOME)/Android/Sdk +ANDROID_NDK_HOME ?= $(ANDROID_HOME)/ndk/24.0.8215888 +MAX_SDK_VERSION ?= 32 + +GDB_PORT ?= 4334 + +# Target package name. +ANDROID_PACKAGE ?= gl.entan.giouibind + +# Settings for keystore which is used to sign APK. +KEYS_DN=DC=gl,CN=entan +KEYS_PASS=123456 +KEYS_VALIDITY=365 +KEYS_ALGORITHM=RSA +KEYS_SIZE=2048 + +# Target build dir. Resulting APK file will be available here. +BUILD_DIR=build + +_BUILD_TOOLS=$(ANDROID_HOME)/build-tools/$(ANDROID_SDK_VERSION) +_ANDROID_JAR_PATH=$(ANDROID_HOME)/platforms/android-$(MAX_SDK_VERSION)/android.jar +_SWIFT_SRC=$(shell find ios -iname '*.swift') +_JAVA_SRC=$(shell find android/java -iname '*.java') +_GO_SRC=$(shell find . -iname '*.go') +_JAVA_ROOT_PATH=android/java/$(subst .,/,$(ANDROID_PACKAGE)) +_ADB_PATH=$(ANDROID_HOME)/platform-tools/adb +_JARS=build/jars/ble/classes.jar build/jars/go-android/classes.jar + + +build: build-ios build-android + +install-ios: build/ios-app.ipa + ideviceinstaller -i build/ios-app.ipa/giouibind.ipa + +ios: build-ios +build-ios: build/ios-app.ipa + +android: build-android +build-android: build/android-app.apk + +run-android: install-android + $(_ADB_PATH) shell am start -n $(ANDROID_PACKAGE)/.MainActivity + $(_ADB_PATH) shell 'while ! dumpsys window windows | grep -o "$(ANDROID_PACKAGE)" 2>&1 > /dev/null ; do sleep 1 ; done' + +debug-android: run-android +#FIXME Delve + $(_ADB_PATH) push $(ANDROID_NDK_HOME)/prebuilt/android-arm64/gdbserver/gdbserver /data/local/tmp + $(_ADB_PATH) shell "chmod 777 /data/local/tmp/gdbserver" + $(_ADB_PATH) forward tcp:$(GDB_PORT) tcp:$(GDB_PORT) + $(_ADB_PATH) shell 'su -c killall gdbserver || exit 0' + $(_ADB_PATH) shell 'su -c set enforce 0' + $(_ADB_PATH) shell 'su -c /data/local/tmp/gdbserver :$(GDB_PORT) --attach $$(ps -A -o NAME,PID | grep "$(ANDROID_PACKAGE)" | cut -F 2)' + +install-android: build-android + $(_ADB_PATH) install build/android-app.apk + +# Initialize keystore to sign APK. +keys.store: + keytool -genkeypair \ + -validity $(KEYS_VALIDITY) \ + -keystore $@ \ + -keyalg $(KEYS_ALGORITHM) \ + -keysize $(KEYS_SIZE) \ + -storepass $(KEYS_PASS) \ + -keypass $(KEYS_PASS) \ + -dname $(KEYS_DN) \ + -deststoretype pkcs12 + +build/Mobile.xcframework: $(_GO_SRC) + CGO_ENABLED=1 GO386=softfloat gomobile bind \ + -target ios \ + -o "$@" \ + github.com/empathicqubit/giouibind/mobile + +build/ios-app.ipa: build/ios.xcarchive + xcodebuild -allowProvisioningUpdates -exportArchive -archivePath build/ios.xcarchive -exportOptionsPlist ios/export-options.plist -exportPath "$@" + +build/ios.xcarchive: $(_SWIFT_SRC) build/Mobile.xcframework + xcodebuild -project ios/giouibind/giouibind.xcodeproj -scheme giouibind -sdk iphoneos -configuration AppStoreDistribution archive -archivePath "$@" + +build/jars/ble/classes.jar: + @mkdir -p build/jars/ble + + curl -L -o "build/ble.aar" https://repo1.maven.org/maven2/no/nordicsemi/android/ble/2.4.0/ble-2.4.0.aar + cd build/jars/ble && unzip -o ../../ble.aar + touch "$@" + +build/jars/go-android/classes.jar: $(_GO_SRC) $(ANDROID_NDK_HOME) + @mkdir -p build/jars/go-android + + CGO_ENABLED=1 ANDROID_NDK_HOME=$(ANDROID_NDK_HOME) GO386=softfloat gomobile bind \ + -target android \ + -javapkg $(ANDROID_PACKAGE) \ + -o "build/go-android.aar" \ + github.com/empathicqubit/giouibind/mobile + + # Unpack resulting AAR library to link it to APK during further stages. + @unzip -o -qq "build/go-android.aar" -d build/jars/go-android + @ln -sf jars/go-android/jni build/lib + touch "$@" + +# Collect resources and generate R.java. +$(_JAVA_ROOT_PATH)/R.java: $(wildcard android/res/*/*.*) android/AndroidManifest.xml $(_ANDROID_JAR_PATH) + $(_BUILD_TOOLS)/aapt package \ + -f \ + -m \ + -J android/java \ + -M android/AndroidManifest.xml \ + -S android/res \ + -I $(_ANDROID_JAR_PATH) + +# Generate a JAR suitable for code completion (less java.* classes) +build/jars/android-meta.jar: $(_ANDROID_JAR_PATH) + @mkdir -p build/jars + + cp "$(_ANDROID_JAR_PATH)" "$@" + zip -d "$@" 'java/*' + +build/obj.jar: build/jars/android-meta.jar $(_JARS) $(_JAVA_SRC) $(_JAVA_ROOT_PATH)/R.java + @mkdir -p build/obj + + javac \ + -source 8 \ + -target 8 \ + -d build/obj \ + -classpath $(_ANDROID_JAR_PATH):android/java:$(subst $() $(),:,$(_JARS)) \ + $(_JAVA_SRC) + + jar cvf "$@" -C build/obj/ . + +# Convert compiled Java code into DEX file (required by Android). +build/classes.dex: build/d8.jar + $(_BUILD_TOOLS)/dx \ + --dex \ + --min-sdk-version $(MIN_SDK_VERSION) \ + --output build/classes.dex \ + build/d8.jar + +build/d8.jar: build/obj.jar + $(_BUILD_TOOLS)/d8 \ + --output build/d8.jar \ + --classpath $(_ANDROID_JAR_PATH) \ + $(_JARS) \ + build/obj.jar + +# Package everything into unaligned APK file. +build/app.apk.unaligned: build/classes.dex + $(_BUILD_TOOLS)/aapt package \ + -f \ + -m \ + -F build/app.apk.unaligned \ + -M android/AndroidManifest.xml \ + -S android/res \ + -I $(_ANDROID_JAR_PATH) + + cd build && $(_BUILD_TOOLS)/aapt add \ + app.apk.unaligned \ + classes.dex \ + lib/*/* + +# Align unaligned APK file and sign it using keystore. +build/android-app.apk: keys.store build/app.apk.unaligned + $(_BUILD_TOOLS)/zipalign \ + -f 4 \ + build/app.apk.unaligned \ + "$@" + + $(_BUILD_TOOLS)/apksigner sign \ + --ks keys.store \ + --ks-pass pass:$(KEYS_PASS) \ + "$@" + +clean: + @rm -rf build + @rm -rf $(_JAVA_ROOT_PATH)/R.java diff --git a/README.md b/README.md new file mode 100644 index 0000000..20fef6b --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +# Minimal Gio-Powered Android/iOS/desktop app + +This project serves as an example how to build minimal working Gio-powered +Android/iOS/desktop application **without** Android Studio or Gradle. The example +was intended to connect to a BLE device with a specific service identifier. +Please search for FIXME in the project and replace information as appropriate. +Alternatively you can remove this stuff and replace it with your own. + +The interface INativeBridge in native/native.go contains the methods which +bridge go to either Java on Android, ObjC/Swift on iOS, or more Go classes +on desktop. + +Makefile targets: +* **build**: Build for both iOS and Android. Only works on Mac OS because of iOS +* **build-ios**, **build-android**: Build for single platform +* **install-ios**, **install-android**: Install to a real device. Your signing +team ID in /ios/export-options.plist must be correct. +* **run-android**: Tells the application to start on Android +* **debug-android**: Doesn't work yet. + +## Requirements + +To be able to build, following dependencies are +required: + +* Android SDK version 32, be sure to set ANDROID\_HOME environment variable +* Android NDK version 24.0.8215888 +* Android build-tools version 30.0.3 +* Java on your PATH +* gomobile `go install "golang.org/x/mobile/cmd/gomobile"` + +## Description of different project files +* **build**: All the build stuff goes here +* **android**: All the Android-specific files here. If you want to include +images in your application, it's probably better to do that in Go +with //go:embed, instead of including images in the res folder. GodObject +is the main class which implements the bridge with Go. The Gio classes are +overridden to work around some issues with using Gio with `gomobile bind` +* **ios**: XCode project which contains iOS specific INativeBridge implementation. +* **mobile**: The entrypoint for `gomobile bind` +* **mobile/gio**: A stub entrypoint for Gio. You shouldn't need to change this. +* **desktop**: Entrypoint for the desktop application. The example only works +on Mac OS because the cbgo library is made for Mac OS bluetooth only, but you +can replace it with whatever you want and that should work on MacOS/Linux/Windows. +* **gio**: Stubs for Gio packages which fail to build on Linux when targeting Android. + +## Credits + +Thanks to [seletskiy/ebiten-android-minimal](https://github.com/seletskiy/ebiten-android-minimal) and [GioUI](https://gioui.org/) diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml new file mode 100644 index 0000000..352be93 --- /dev/null +++ b/android/AndroidManifest.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/android/java/gl/entan/giouibind/GodObject.java b/android/java/gl/entan/giouibind/GodObject.java new file mode 100644 index 0000000..3d788fe --- /dev/null +++ b/android/java/gl/entan/giouibind/GodObject.java @@ -0,0 +1,108 @@ +package gl.entan.giouibind; + +import java.util.ArrayList; +import java.util.List; + +import android.Manifest.permission; +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothProfile; +import android.bluetooth.BluetoothSocket; +import android.content.Context; +import android.content.pm.PackageManager; +import android.util.Log; +import gl.entan.giouibind.mobile.IGodObject; +import gl.entan.giouibind.mobile.Mobile; + +public class GodObject implements IGodObject { + private static GodObject instance = null; + + private BluetoothSocket socket = null; + private Context context = null; + private List managers; + + private GodObject(Context context) { + this.context = context; + this.managers = new ArrayList<>(); + } + + public static GodObject getGodObject(Context context) { + if(GodObject.instance == null) { + GodObject.instance = new GodObject(context); + } + + return GodObject.instance; + } + + public void disconnectFromDevice() { + if(this.socket != null) { + try { + this.socket.close(); + } + catch (Exception e) { + Log.e("bananas", "Couldn't close socket", e); + } + } + } + + public void connectToDevice() { + GodObject self = this; + + this.disconnectFromDevice(); + + BluetoothAdapter.getDefaultAdapter().getProfileProxy(this.context, new BluetoothProfile.ServiceListener() { + @Override + public void onServiceDisconnected(int arg0) { + } + + @Override + public void onServiceConnected(int profile, BluetoothProfile proxy) { + Log.i("bananas", "Called service connected"); + + for (BluetoothDevice device : proxy.getConnectedDevices()) { + MyBleManager manager = new MyBleManager(context); + + manager + .connect(device) + .retry(20) + .timeout(5000) + .useAutoConnect(true) + .enqueue(); + + self.managers.add(manager); + } + + BluetoothAdapter.getDefaultAdapter().closeProfileProxy(profile, proxy); + } + }, BluetoothProfile.HEADSET); + } + + @Override + public boolean enableBluetooth() { + Context context = this.context; + + if(context.checkSelfPermission(permission.BLUETOOTH) == PackageManager.PERMISSION_DENIED) { + ((Activity)context).requestPermissions(new String[] { permission.BLUETOOTH }, 0); + return false; + } + + if(context.checkSelfPermission(permission.ACCESS_BACKGROUND_LOCATION) == PackageManager.PERMISSION_DENIED) { + ((Activity)context).requestPermissions(new String[] { permission.ACCESS_BACKGROUND_LOCATION }, 0); + return false; + } + + return true; + } + + @Override + public boolean writeChar(byte[] data) { + for(MyBleManager manager: this.managers) { + if(manager.isReady()) { + manager.writeChar(data); + break; + } + } + return false; + } +} diff --git a/android/java/gl/entan/giouibind/MainActivity.java b/android/java/gl/entan/giouibind/MainActivity.java new file mode 100644 index 0000000..04184d9 --- /dev/null +++ b/android/java/gl/entan/giouibind/MainActivity.java @@ -0,0 +1,65 @@ +package gl.entan.giouibind; + +import org.gioui.GioView; + +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Context; +import android.content.res.Configuration; +import android.graphics.BitmapFactory; +import android.os.Build; +import android.os.Bundle; +import android.util.Log; +import go.Seq; +import gl.entan.giouibind.mobile.Mobile; + +public class MainActivity extends Activity { + private GioView view; + + @Override public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.main); + Context context = getApplicationContext(); + Seq.setContext(context); + + this.view = findViewById(R.id.gioview); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + this.setTaskDescription( + new ActivityManager.TaskDescription( + null, // Leave the default title. + BitmapFactory.decodeResource(getResources(), R.drawable.icon) + )); + } + } + + @Override public void onDestroy() { + view.destroy(); + super.onDestroy(); + } + + @Override public void onStart() { + super.onStart(); + view.start(); + } + + @Override public void onStop() { + view.stop(); + super.onStop(); + } + + @Override public void onConfigurationChanged(Configuration c) { + super.onConfigurationChanged(c); + view.configurationChanged(); + } + + @Override public void onLowMemory() { + super.onLowMemory(); + GioView.onLowMemory(); + } + + @Override public void onBackPressed() { + if (!view.backPressed()) + super.onBackPressed(); + } +} diff --git a/android/java/gl/entan/giouibind/MyBleManager.java b/android/java/gl/entan/giouibind/MyBleManager.java new file mode 100644 index 0000000..d575e71 --- /dev/null +++ b/android/java/gl/entan/giouibind/MyBleManager.java @@ -0,0 +1,114 @@ +package gl.entan.giouibind; + +import java.util.List; +import java.util.UUID; + +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCallback; +import android.bluetooth.BluetoothGattCharacteristic; +import android.bluetooth.BluetoothGattService; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.os.Handler; +import android.util.Log; +import gl.entan.giouibind.mobile.Mobile; +import no.nordicsemi.android.ble.BleManager; + +public class MyBleManager extends BleManager { + public static UUID shortServiceUuid = UUID.fromString("FIXME"); + public static UUID longServiceUuid = UUID.fromString("FIXME"); + + public static UUID writeUuid = UUID.fromString("FIXME"); + public static UUID readUuid = UUID.fromString("FIXME"); + + private BluetoothGattService service; + private BluetoothGattCharacteristic writeChr; + private BluetoothGattCharacteristic readChr; + + public MyBleManager(Context context) { + super(context); + } + + public MyBleManager(Context context, Handler handler) { + super(context, handler); + } + + public void readChar() { + readCharacteristic(readChr) + .with((d, data) -> { + Mobile.bluetoothGotData(data.getValue()); + }) + .enqueue(); + } + + public boolean writeChar(byte[] data) { + writeCharacteristic(writeChr, data, BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT).enqueue(); + return true; + } + + @Override + protected BleManagerGattCallback getGattCallback() { + return new MyGattCallbackImpl(); + } + + @Override + public int getMinLogPriority() { + return Log.WARN; + } + + @Override + public void log(int priority, String message) { + Log.println(priority, "bananas", message); + } + + private class MyGattCallbackImpl extends BleManagerGattCallback { + @Override + protected void onCharacteristicNotified(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { + Mobile.bluetoothGotData(characteristic.getValue()); + super.onCharacteristicNotified(gatt, characteristic); + } + + @Override + protected boolean isRequiredServiceSupported(BluetoothGatt gatt) { + BluetoothGattService s = gatt.getService(shortServiceUuid); + if(s == null) { + s = gatt.getService(longServiceUuid); + } + if(s == null) { + Log.i("bananas", "Could not find GATT service"); + Mobile.finishedConnect(false, ""); + return false; + } + + service = s; + writeChr = s.getCharacteristic(writeUuid); + readChr = s.getCharacteristic(readUuid); + + return service != null + && writeChr != null + && readChr != null; + } + + @Override + protected void initialize() { + requestMtu(165) + .done(d -> { + enableNotifications(readChr).enqueue(); + + writeCharacteristic(writeChr, new byte[] { 0x04, (byte)0x95, 0x06, 0x03 }, BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT) + .done(g -> { + Mobile.finishedConnect(true, g.getName()); + }) + .enqueue(); + }) + .enqueue(); + } + + @Override + protected void onServicesInvalidated() { + readChr = writeChr = null; + } + } + +} \ No newline at end of file diff --git a/android/java/org/gioui/Gio.java b/android/java/org/gioui/Gio.java new file mode 100644 index 0000000..d79556c --- /dev/null +++ b/android/java/org/gioui/Gio.java @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: Unlicense OR MIT + +package org.gioui; + +import android.content.ClipboardManager; +import android.content.ClipData; +import android.content.Context; +import android.os.Handler; +import android.os.Looper; +import gl.entan.giouibind.GodObject; +import gl.entan.giouibind.mobile.Mobile; + +import java.io.UnsupportedEncodingException; + +public final class Gio { + private static final Object initLock = new Object(); + private static boolean jniLoaded; + private static final Handler handler = new Handler(Looper.getMainLooper()); + + /** + * init loads and initializes the Go native library and runs + * the Go main function. + * + * It is exported for use by Android apps that need to run Go code + * outside the lifecycle of the Gio activity. + */ + public static synchronized void init(Context appCtx) { + synchronized (initLock) { + if (jniLoaded) { + return; + } + String dataDir = appCtx.getFilesDir().getAbsolutePath(); + byte[] dataDirUTF8; + try { + dataDirUTF8 = dataDir.getBytes("UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + System.loadLibrary("gojni"); + Mobile.inventGod(GodObject.getGodObject(appCtx)); + runGoMain(dataDirUTF8, appCtx); + jniLoaded = true; + } + } + + static private native void runGoMain(byte[] dataDir, Context context); + + static void writeClipboard(Context ctx, String s) { + ClipboardManager m = (ClipboardManager)ctx.getSystemService(Context.CLIPBOARD_SERVICE); + m.setPrimaryClip(ClipData.newPlainText(null, s)); + } + + static String readClipboard(Context ctx) { + ClipboardManager m = (ClipboardManager)ctx.getSystemService(Context.CLIPBOARD_SERVICE); + ClipData c = m.getPrimaryClip(); + if (c == null || c.getItemCount() < 1) { + return null; + } + return c.getItemAt(0).coerceToText(ctx).toString(); + } + + static void wakeupMainThread() { + handler.post(new Runnable() { + @Override public void run() { + scheduleMainFuncs(); + } + }); + } + + static private native void scheduleMainFuncs(); +} \ No newline at end of file diff --git a/android/java/org/gioui/GioView.java b/android/java/org/gioui/GioView.java new file mode 100644 index 0000000..a03d725 --- /dev/null +++ b/android/java/org/gioui/GioView.java @@ -0,0 +1,752 @@ +// SPDX-License-Identifier: Unlicense OR MIT + +package org.gioui; + +import android.app.Activity; +import android.content.Context; +import android.graphics.Color; +import android.graphics.Matrix; +import android.graphics.Rect; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.SystemClock; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.Choreographer; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.PointerIcon; +import android.view.Surface; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import android.view.View; +import android.view.ViewConfiguration; +import android.view.Window; +import android.view.WindowInsetsController; +import android.view.WindowManager; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityManager; +import android.view.accessibility.AccessibilityNodeInfo; +import android.view.accessibility.AccessibilityNodeProvider; +import android.view.inputmethod.CompletionInfo; +import android.view.inputmethod.CorrectionInfo; +import android.view.inputmethod.CursorAnchorInfo; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.ExtractedText; +import android.view.inputmethod.ExtractedTextRequest; +import android.view.inputmethod.InputConnection; +import android.view.inputmethod.InputContentInfo; +import android.view.inputmethod.InputMethodManager; +import gl.entan.giouibind.GodObject; +import gl.entan.giouibind.mobile.Mobile; + +public final class GioView extends SurfaceView implements Choreographer.FrameCallback { + private static boolean jniLoaded; + + private final SurfaceHolder.Callback surfCallbacks; + private final View.OnFocusChangeListener focusCallback; + private final InputMethodManager imm; + private final float scrollXScale; + private final float scrollYScale; + private int keyboardHint; + private AccessibilityManager accessManager; + + private long nhandle; + + public GioView(Context context) { + this(context, null); + } + + public GioView(Context context, AttributeSet attrs) { + super(context, attrs); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); + } + setLayoutParams(new WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT)); + + // Late initialization of the Go runtime to wait for a valid context. + Gio.init(context); + + // Set background color to transparent to avoid a flickering + // issue on ChromeOS. + setBackgroundColor(Color.argb(0, 0, 0, 0)); + + ViewConfiguration conf = ViewConfiguration.get(context); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + scrollXScale = conf.getScaledHorizontalScrollFactor(); + scrollYScale = conf.getScaledVerticalScrollFactor(); + + // The platform focus highlight is not aware of Gio's widgets. + setDefaultFocusHighlightEnabled(false); + } else { + float listItemHeight = 48; // dp + float px = TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, + listItemHeight, + getResources().getDisplayMetrics() + ); + scrollXScale = px; + scrollYScale = px; + } + + accessManager = (AccessibilityManager)context.getSystemService(Context.ACCESSIBILITY_SERVICE); + imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); + nhandle = onCreateView(this); + setFocusable(true); + setFocusableInTouchMode(true); + focusCallback = new View.OnFocusChangeListener() { + @Override public void onFocusChange(View v, boolean focus) { + GioView.this.onFocusChange(nhandle, focus); + } + }; + setOnFocusChangeListener(focusCallback); + surfCallbacks = new SurfaceHolder.Callback() { + @Override public void surfaceCreated(SurfaceHolder holder) { + // Ignore; surfaceChanged is guaranteed to be called immediately after this. + } + @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + onSurfaceChanged(nhandle, getHolder().getSurface()); + } + @Override public void surfaceDestroyed(SurfaceHolder holder) { + onSurfaceDestroyed(nhandle); + } + }; + getHolder().addCallback(surfCallbacks); + } + + @Override public boolean onKeyDown(int keyCode, KeyEvent event) { + if (nhandle != 0) { + onKeyEvent(nhandle, keyCode, event.getUnicodeChar(), true, event.getEventTime()); + } + return false; + } + + @Override public boolean onKeyUp(int keyCode, KeyEvent event) { + if (nhandle != 0) { + onKeyEvent(nhandle, keyCode, event.getUnicodeChar(), false, event.getEventTime()); + } + return false; + } + + @Override public boolean onGenericMotionEvent(MotionEvent event) { + dispatchMotionEvent(event); + return true; + } + + @Override public boolean onTouchEvent(MotionEvent event) { + // Ask for unbuffered events. Flutter and Chrome do it + // so assume it's good for us as well. + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + requestUnbufferedDispatch(event); + } + + dispatchMotionEvent(event); + return true; + } + + private void setCursor(int id) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { + return; + } + PointerIcon pointerIcon = PointerIcon.getSystemIcon(getContext(), id); + setPointerIcon(pointerIcon); + } + + private void setOrientation(int id, int fallback) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) { + id = fallback; + } + ((Activity) this.getContext()).setRequestedOrientation(id); + } + + private void setFullscreen(boolean enabled) { + int flags = this.getSystemUiVisibility(); + if (enabled) { + flags |= SYSTEM_UI_FLAG_IMMERSIVE_STICKY; + flags |= SYSTEM_UI_FLAG_HIDE_NAVIGATION; + flags |= SYSTEM_UI_FLAG_FULLSCREEN; + flags |= SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; + } else { + flags &= ~SYSTEM_UI_FLAG_IMMERSIVE_STICKY; + flags &= ~SYSTEM_UI_FLAG_HIDE_NAVIGATION; + flags &= ~SYSTEM_UI_FLAG_FULLSCREEN; + flags &= ~SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; + } + this.setSystemUiVisibility(flags); + } + + private enum Bar { + NAVIGATION, + STATUS, + } + + private void setBarColor(Bar t, int color, int luminance) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + return; + } + + Window window = ((Activity) this.getContext()).getWindow(); + + int insetsMask; + int viewMask; + + switch (t) { + case STATUS: + insetsMask = WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS; + viewMask = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; + window.setStatusBarColor(color); + break; + case NAVIGATION: + insetsMask = WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS; + viewMask = View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR; + window.setNavigationBarColor(color); + break; + default: + throw new RuntimeException("invalid bar type"); + } + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + return; + } + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { + int flags = this.getSystemUiVisibility(); + if (luminance > 128) { + flags |= viewMask; + } else { + flags &= ~viewMask; + } + this.setSystemUiVisibility(flags); + return; + } + + WindowInsetsController insetsController = window.getInsetsController(); + if (insetsController == null) { + return; + } + if (luminance > 128) { + insetsController.setSystemBarsAppearance(insetsMask, insetsMask); + } else { + insetsController.setSystemBarsAppearance(0, insetsMask); + } + } + + private void setStatusColor(int color, int luminance) { + this.setBarColor(Bar.STATUS, color, luminance); + } + + private void setNavigationColor(int color, int luminance) { + this.setBarColor(Bar.NAVIGATION, color, luminance); + } + + @Override protected boolean dispatchHoverEvent(MotionEvent event) { + if (!accessManager.isTouchExplorationEnabled()) { + return super.dispatchHoverEvent(event); + } + switch (event.getAction()) { + case MotionEvent.ACTION_HOVER_ENTER: + // Fall through. + case MotionEvent.ACTION_HOVER_MOVE: + onTouchExploration(nhandle, event.getX(), event.getY()); + break; + case MotionEvent.ACTION_HOVER_EXIT: + onExitTouchExploration(nhandle); + break; + } + return true; + } + + void sendA11yEvent(int eventType, int viewId) { + if (!accessManager.isEnabled()) { + return; + } + AccessibilityEvent event = obtainA11yEvent(eventType, viewId); + getParent().requestSendAccessibilityEvent(this, event); + } + + AccessibilityEvent obtainA11yEvent(int eventType, int viewId) { + AccessibilityEvent event = AccessibilityEvent.obtain(eventType); + event.setPackageName(getContext().getPackageName()); + event.setSource(this, viewId); + return event; + } + + boolean isA11yActive() { + return accessManager.isEnabled(); + } + + void sendA11yChange(int viewId) { + if (!accessManager.isEnabled()) { + return; + } + AccessibilityEvent event = obtainA11yEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED, viewId); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + event.setContentChangeTypes(AccessibilityEvent.CONTENT_CHANGE_TYPE_SUBTREE); + } + getParent().requestSendAccessibilityEvent(this, event); + } + + private void dispatchMotionEvent(MotionEvent event) { + if (nhandle == 0) { + return; + } + for (int j = 0; j < event.getHistorySize(); j++) { + long time = event.getHistoricalEventTime(j); + for (int i = 0; i < event.getPointerCount(); i++) { + onTouchEvent( + nhandle, + event.ACTION_MOVE, + event.getPointerId(i), + event.getToolType(i), + event.getHistoricalX(i, j), + event.getHistoricalY(i, j), + scrollXScale*event.getHistoricalAxisValue(MotionEvent.AXIS_HSCROLL, i, j), + scrollYScale*event.getHistoricalAxisValue(MotionEvent.AXIS_VSCROLL, i, j), + event.getButtonState(), + time); + } + } + int act = event.getActionMasked(); + int idx = event.getActionIndex(); + for (int i = 0; i < event.getPointerCount(); i++) { + int pact = event.ACTION_MOVE; + if (i == idx) { + pact = act; + } + onTouchEvent( + nhandle, + pact, + event.getPointerId(i), + event.getToolType(i), + event.getX(i), event.getY(i), + scrollXScale*event.getAxisValue(MotionEvent.AXIS_HSCROLL, i), + scrollYScale*event.getAxisValue(MotionEvent.AXIS_VSCROLL, i), + event.getButtonState(), + event.getEventTime()); + } + } + + @Override public InputConnection onCreateInputConnection(EditorInfo editor) { + Snippet snip = getSnippet(); + editor.inputType = this.keyboardHint; + editor.imeOptions = EditorInfo.IME_FLAG_NO_FULLSCREEN | EditorInfo.IME_FLAG_NO_EXTRACT_UI; + editor.initialSelStart = imeToUTF16(nhandle, imeSelectionStart(nhandle)); + editor.initialSelEnd = imeToUTF16(nhandle, imeSelectionEnd(nhandle)); + int selStart = editor.initialSelStart - snip.offset; + editor.initialCapsMode = TextUtils.getCapsMode(snip.snippet, selStart, this.keyboardHint); + imeSetComposingRegion(nhandle, -1, -1); + return new GioInputConnection(); + } + + void setInputHint(int hint) { + if (hint == this.keyboardHint) { + return; + } + this.keyboardHint = hint; + restartInput(); + } + + void showTextInput() { + GioView.this.requestFocus(); + imm.showSoftInput(GioView.this, 0); + } + + void hideTextInput() { + imm.hideSoftInputFromWindow(getWindowToken(), 0); + } + + @Override protected boolean fitSystemWindows(Rect insets) { + if (nhandle != 0) { + onWindowInsets(nhandle, insets.top, insets.right, insets.bottom, insets.left); + } + return true; + } + + void postFrameCallback() { + Choreographer.getInstance().removeFrameCallback(this); + Choreographer.getInstance().postFrameCallback(this); + } + + @Override public void doFrame(long nanos) { + if (nhandle != 0) { + onFrameCallback(nhandle); + } + } + + int getDensity() { + return getResources().getDisplayMetrics().densityDpi; + } + + float getFontScale() { + return getResources().getConfiguration().fontScale; + } + + public void start() { + if (nhandle != 0) { + onStartView(nhandle); + } + } + + public void stop() { + if (nhandle != 0) { + onStopView(nhandle); + } + } + + public void destroy() { + if (nhandle != 0) { + onDestroyView(nhandle); + } + } + + protected void unregister() { + setOnFocusChangeListener(null); + getHolder().removeCallback(surfCallbacks); + nhandle = 0; + } + + public void configurationChanged() { + if (nhandle != 0) { + onConfigurationChanged(nhandle); + } + } + + public boolean backPressed() { + if (nhandle == 0) { + return false; + } + return onBack(nhandle); + } + + void restartInput() { + imm.restartInput(this); + } + + void updateSelection() { + int selStart = imeToUTF16(nhandle, imeSelectionStart(nhandle)); + int selEnd = imeToUTF16(nhandle, imeSelectionEnd(nhandle)); + int compStart = imeToUTF16(nhandle, imeComposingStart(nhandle)); + int compEnd = imeToUTF16(nhandle, imeComposingEnd(nhandle)); + imm.updateSelection(this, selStart, selEnd, compStart, compEnd); + } + + void updateCaret(float m00, float m01, float m02, float m10, float m11, float m12, float caretX, float caretTop, float caretBase, float caretBottom) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + return; + } + Matrix m = new Matrix(); + m.setValues(new float[]{m00, m01, m02, m10, m11, m12, 0.0f, 0.0f, 1.0f}); + m.setConcat(getMatrix(), m); + int selStart = imeSelectionStart(nhandle); + int selEnd = imeSelectionEnd(nhandle); + int compStart = imeComposingStart(nhandle); + int compEnd = imeComposingEnd(nhandle); + Snippet snip = getSnippet(); + String composing = ""; + if (compStart != -1) { + composing = snip.substringRunes(compStart, compEnd); + } + CursorAnchorInfo inf = new CursorAnchorInfo.Builder() + .setMatrix(m) + .setComposingText(imeToUTF16(nhandle, compStart), composing) + .setSelectionRange(imeToUTF16(nhandle, selStart), imeToUTF16(nhandle, selEnd)) + .setInsertionMarkerLocation(caretX, caretTop, caretBase, caretBottom, 0) + .build(); + imm.updateCursorAnchorInfo(this, inf); + } + + static private native long onCreateView(GioView view); + static private native void onDestroyView(long handle); + static private native void onStartView(long handle); + static private native void onStopView(long handle); + static private native void onSurfaceDestroyed(long handle); + static private native void onSurfaceChanged(long handle, Surface surface); + static private native void onConfigurationChanged(long handle); + static private native void onWindowInsets(long handle, int top, int right, int bottom, int left); + static public native void onLowMemory(); + static private native void onTouchEvent(long handle, int action, int pointerID, int tool, float x, float y, float scrollX, float scrollY, int buttons, long time); + static private native void onKeyEvent(long handle, int code, int character, boolean pressed, long time); + static private native void onFrameCallback(long handle); + static private native boolean onBack(long handle); + static private native void onFocusChange(long handle, boolean focus); + static private native AccessibilityNodeInfo initializeAccessibilityNodeInfo(long handle, int viewId, int screenX, int screenY, AccessibilityNodeInfo info); + static private native void onTouchExploration(long handle, float x, float y); + static private native void onExitTouchExploration(long handle); + static private native void onA11yFocus(long handle, int viewId); + static private native void onClearA11yFocus(long handle, int viewId); + static private native void imeSetSnippet(long handle, int start, int end); + static private native String imeSnippet(long handle); + static private native int imeSnippetStart(long handle); + static private native int imeSelectionStart(long handle); + static private native int imeSelectionEnd(long handle); + static private native int imeComposingStart(long handle); + static private native int imeComposingEnd(long handle); + static private native int imeReplace(long handle, int start, int end, String text); + static private native int imeSetSelection(long handle, int start, int end); + static private native int imeSetComposingRegion(long handle, int start, int end); + // imeToRunes converts the Java character index into runes (Java code points). + static private native int imeToRunes(long handle, int chars); + // imeToUTF16 converts the rune index into Java characters. + static private native int imeToUTF16(long handle, int runes); + + private class GioInputConnection implements InputConnection { + private int batchDepth; + + @Override public boolean beginBatchEdit() { + batchDepth++; + return true; + } + + @Override public boolean endBatchEdit() { + batchDepth--; + return batchDepth > 0; + } + + @Override public boolean clearMetaKeyStates(int states) { + return false; + } + + @Override public boolean commitCompletion(CompletionInfo text) { + return false; + } + + @Override public boolean commitCorrection(CorrectionInfo info) { + return false; + } + + @Override public boolean commitText(CharSequence text, int cursor) { + setComposingText(text, cursor); + return finishComposingText(); + } + + @Override public boolean deleteSurroundingText(int beforeChars, int afterChars) { + // translate before and after to runes. + int selStart = imeSelectionStart(nhandle); + int selEnd = imeSelectionEnd(nhandle); + int before = selStart - imeToRunes(nhandle, imeToUTF16(nhandle, selStart) - beforeChars); + int after = selEnd - imeToRunes(nhandle, imeToUTF16(nhandle, selEnd) - afterChars); + return deleteSurroundingTextInCodePoints(before, after); + } + + @Override public boolean finishComposingText() { + imeSetComposingRegion(nhandle, -1, -1); + return true; + } + + @Override public int getCursorCapsMode(int reqModes) { + Snippet snip = getSnippet(); + int selStart = imeSelectionStart(nhandle); + return TextUtils.getCapsMode(snip.snippet, imeToUTF16(nhandle, selStart), reqModes); + } + + @Override public ExtractedText getExtractedText(ExtractedTextRequest request, int flags) { + return null; + } + + @Override public CharSequence getSelectedText(int flags) { + Snippet snip = getSnippet(); + int selStart = imeSelectionStart(nhandle); + int selEnd = imeSelectionEnd(nhandle); + String sub = snip.substringRunes(selStart, selEnd); + return sub; + } + + @Override public CharSequence getTextAfterCursor(int n, int flags) { + Snippet snip = getSnippet(); + int selStart = imeSelectionStart(nhandle); + int selEnd = imeSelectionEnd(nhandle); + // n are in Java characters, but in worst case we'll just ask for more runes + // than wanted. + imeSetSnippet(nhandle, selStart - n, selEnd + n); + int start = selEnd; + int end = imeToRunes(nhandle, imeToUTF16(nhandle, selEnd) + n); + String ret = snip.substringRunes(start, end); + return ret; + } + + @Override public CharSequence getTextBeforeCursor(int n, int flags) { + Snippet snip = getSnippet(); + int selStart = imeSelectionStart(nhandle); + int selEnd = imeSelectionEnd(nhandle); + // n are in Java characters, but in worst case we'll just ask for more runes + // than wanted. + imeSetSnippet(nhandle, selStart - n, selEnd + n); + int start = imeToRunes(nhandle, imeToUTF16(nhandle, selStart) - n); + int end = selStart; + String ret = snip.substringRunes(start, end); + return ret; + } + + @Override public boolean performContextMenuAction(int id) { + return false; + } + + @Override public boolean performEditorAction(int editorAction) { + long eventTime = SystemClock.uptimeMillis(); + // Translate to enter key. + onKeyEvent(nhandle, KeyEvent.KEYCODE_ENTER, '\n', true, eventTime); + onKeyEvent(nhandle, KeyEvent.KEYCODE_ENTER, '\n', false, eventTime); + return true; + } + + @Override public boolean performPrivateCommand(String action, Bundle data) { + return false; + } + + @Override public boolean reportFullscreenMode(boolean enabled) { + return false; + } + + @Override public boolean sendKeyEvent(KeyEvent event) { + boolean pressed = event.getAction() == KeyEvent.ACTION_DOWN; + onKeyEvent(nhandle, event.getKeyCode(), event.getUnicodeChar(), pressed, event.getEventTime()); + return true; + } + + @Override public boolean setComposingRegion(int startChars, int endChars) { + int compStart = imeToRunes(nhandle, startChars); + int compEnd = imeToRunes(nhandle, endChars); + imeSetComposingRegion(nhandle, compStart, compEnd); + return true; + } + + @Override public boolean setComposingText(CharSequence text, int relCursor) { + int start = imeComposingStart(nhandle); + int end = imeComposingEnd(nhandle); + if (start == -1 || end == -1) { + start = imeSelectionStart(nhandle); + end = imeSelectionEnd(nhandle); + } + String str = text.toString(); + imeReplace(nhandle, start, end, str); + int cursor = start; + int runes = str.codePointCount(0, str.length()); + if (relCursor > 0) { + cursor += runes; + relCursor--; + } + imeSetComposingRegion(nhandle, start, start + runes); + + // Move cursor. + Snippet snip = getSnippet(); + cursor = imeToRunes(nhandle, imeToUTF16(nhandle, cursor) + relCursor); + imeSetSelection(nhandle, cursor, cursor); + return true; + } + + @Override public boolean setSelection(int startChars, int endChars) { + int start = imeToRunes(nhandle, startChars); + int end = imeToRunes(nhandle, endChars); + imeSetSelection(nhandle, start, end); + return true; + } + + /*@Override*/ public boolean requestCursorUpdates(int cursorUpdateMode) { + // We always provide cursor updates. + return true; + } + + /*@Override*/ public void closeConnection() { + } + + /*@Override*/ public Handler getHandler() { + return null; + } + + /*@Override*/ public boolean commitContent(InputContentInfo info, int flags, Bundle opts) { + return false; + } + + /*@Override*/ public boolean deleteSurroundingTextInCodePoints(int before, int after) { + if (after > 0) { + int selEnd = imeSelectionEnd(nhandle); + imeReplace(nhandle, selEnd, selEnd + after, ""); + } + if (before > 0) { + int selStart = imeSelectionStart(nhandle); + imeReplace(nhandle, selStart - before, selStart, ""); + } + return true; + } + } + + private Snippet getSnippet() { + Snippet snip = new Snippet(); + snip.snippet = imeSnippet(nhandle); + snip.offset = imeSnippetStart(nhandle); + return snip; + } + + // Snippet is like android.view.inputmethod.SurroundingText but available for Android < 31. + private static class Snippet { + String snippet; + // offset of snippet into the entire editor content. It is in runes because we won't require + // Gio editors to keep track of UTF-16 offsets. The distinction won't matter in practice because IMEs only + // ever see snippets. + int offset; + + // substringRunes returns the substring from start to end in runes. The resuls is + // truncated to the snippet. + String substringRunes(int start, int end) { + start -= this.offset; + end -= this.offset; + int runes = snippet.codePointCount(0, snippet.length()); + if (start < 0) { + start = 0; + } + if (end < 0) { + end = 0; + } + if (start > runes) { + start = runes; + } + if (end > runes) { + end = runes; + } + return snippet.substring( + snippet.offsetByCodePoints(0, start), + snippet.offsetByCodePoints(0, end) + ); + } + } + + @Override public AccessibilityNodeProvider getAccessibilityNodeProvider() { + return new AccessibilityNodeProvider() { + private final int[] screenOff = new int[2]; + + @Override public AccessibilityNodeInfo createAccessibilityNodeInfo(int viewId) { + AccessibilityNodeInfo info = null; + if (viewId == View.NO_ID) { + info = AccessibilityNodeInfo.obtain(GioView.this); + GioView.this.onInitializeAccessibilityNodeInfo(info); + } else { + info = AccessibilityNodeInfo.obtain(GioView.this, viewId); + info.setPackageName(getContext().getPackageName()); + info.setVisibleToUser(true); + } + GioView.this.getLocationOnScreen(screenOff); + info = GioView.this.initializeAccessibilityNodeInfo(nhandle, viewId, screenOff[0], screenOff[1], info); + return info; + } + + @Override public boolean performAction(int viewId, int action, Bundle arguments) { + if (viewId == View.NO_ID) { + return GioView.this.performAccessibilityAction(action, arguments); + } + switch (action) { + case AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS: + GioView.this.onA11yFocus(nhandle, viewId); + GioView.this.sendA11yEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED, viewId); + return true; + case AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS: + GioView.this.onClearA11yFocus(nhandle, viewId); + GioView.this.sendA11yEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED, viewId); + return true; + } + return false; + } + }; + } +} diff --git a/android/res/drawable/icon.png b/android/res/drawable/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8635cb2dab19e2fd15f7fa4517421aec3178c1ac GIT binary patch literal 9800 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 + + diff --git a/android/res/values-de/strings.xml b/android/res/values-de/strings.xml new file mode 100644 index 0000000..b18c886 --- /dev/null +++ b/android/res/values-de/strings.xml @@ -0,0 +1,5 @@ + + + Benachrichtigungen + Wunder + \ No newline at end of file diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml new file mode 100644 index 0000000..27c4254 --- /dev/null +++ b/android/res/values/strings.xml @@ -0,0 +1,5 @@ + + + Notifications + Wow + \ No newline at end of file diff --git a/app_state.go b/app_state.go new file mode 100644 index 0000000..d59c2a8 --- /dev/null +++ b/app_state.go @@ -0,0 +1,21 @@ +package giouibind + +import ( + "gioui.org/app" + "github.com/empathicqubit/giouibind/native" +) + +type AppSettings struct { +} + +type AppState struct { + settings *AppSettings + window *app.Window + bluetoothEnabled bool + loaded bool + connected bool + connecting bool + initted bool + deviceName string + nativeBridge native.INativeBridge +} diff --git a/desktop/god.go b/desktop/god.go new file mode 100644 index 0000000..14e1966 --- /dev/null +++ b/desktop/god.go @@ -0,0 +1,51 @@ +package main + +import ( + "strconv" + "strings" + + "github.com/JuulLabs-OSS/cbgo" + "github.com/empathicqubit/giouibind/native" +) + +var _ native.INativeBridge = (*NativeBridge)(nil) + +type NativeBridge struct { + fd int + central *cbgo.CentralManager + delegate *MyDelegate +} + +// str2ba converts MAC address string representation to little-endian byte array +func str2ba(addr string) [6]byte { + a := strings.Split(addr, ":") + var b [6]byte + for i, tmp := range a { + u, _ := strconv.ParseUint(tmp, 16, 8) + b[len(b)-1-i] = byte(u) + } + return b +} + +func (god *NativeBridge) EnableBluetooth() bool { + central := cbgo.NewCentralManager(&cbgo.ManagerOpts{}) + god.central = ¢ral + delegate := &MyDelegate{} + god.delegate = delegate + god.central.SetDelegate(delegate) + + return true +} + +var localName string = "" + +func (god *NativeBridge) WriteChar(data []byte) bool { + if data == nil { + return false + } + + return god.delegate.writeChar(data) +} + +func (god *NativeBridge) ConnectToDevice() { +} diff --git a/desktop/main.go b/desktop/main.go new file mode 100644 index 0000000..63b71bf --- /dev/null +++ b/desktop/main.go @@ -0,0 +1,39 @@ +package main + +import ( + "log" + "os" + + "gioui.org/app" + "gioui.org/unit" + "github.com/empathicqubit/giouibind" + "github.com/empathicqubit/giouibind/native" +) + +var nativeBridge *NativeBridge = &NativeBridge{} +var dumbApp *giouibind.AppState = &giouibind.AppState{} + +func main() { + var igod native.INativeBridge = nativeBridge + log.Println("Called main") + err := dumbApp.Load() + if err != nil { + panic(err) + } + err = dumbApp.InventGod(igod) + if err != nil { + panic(err) + } + + go func() { + w := app.NewWindow( + app.Size(unit.Dp(450), unit.Dp(800)), + ) + err := dumbApp.RunApp(w) + if err != nil { + log.Fatal(err) + } + os.Exit(0) + }() + app.Main() +} diff --git a/desktop/my_delegate.go b/desktop/my_delegate.go new file mode 100644 index 0000000..b170c0f --- /dev/null +++ b/desktop/my_delegate.go @@ -0,0 +1,163 @@ +package main + +import ( + "log" + + "github.com/JuulLabs-OSS/cbgo" +) + +type MyDelegate struct { + cbgo.CentralManagerDelegateBase + cbgo.PeripheralDelegateBase + connectedPeripheral *cbgo.Peripheral + service *cbgo.Service + readChr cbgo.Characteristic + writeChr cbgo.Characteristic + encryptedChr cbgo.Characteristic + pairingChr cbgo.Characteristic + peripheral *cbgo.Peripheral + finishedConnect bool +} + +var shortServiceUuid, _ = cbgo.ParseUUID16("FIXME") +var longServiceUuid, _ = cbgo.ParseUUID("FIXME") + +var writeUuid, _ = cbgo.ParseUUID("FIXME") +var readUuid, _ = cbgo.ParseUUID("FIXME") + +func (d *MyDelegate) writeChar(data []byte) bool { + if d.connectedPeripheral == nil { + return false + } + + d.connectedPeripheral.WriteCharacteristic(data, d.writeChr, true) + + return true +} + +func (d *MyDelegate) readChar() []byte { + if d.connectedPeripheral == nil { + return []byte{} + } + + d.connectedPeripheral.ReadCharacteristic(d.readChr) + + return d.readChr.Value() +} + +func (d *MyDelegate) CentralManagerDidUpdateState(cmgr cbgo.CentralManager) { + if cmgr.State() == cbgo.ManagerStatePoweredOn { + log.Println("Start scanning") + go func() { + nativeBridge.central.Scan([]cbgo.UUID{shortServiceUuid, longServiceUuid}, &cbgo.CentralManagerScanOpts{ + AllowDuplicates: false, + SolicitedServiceUUIDs: []cbgo.UUID{longServiceUuid, shortServiceUuid}, + }) + }() + } +} + +func (d *MyDelegate) DidDiscoverPeripheral(cm cbgo.CentralManager, prph cbgo.Peripheral, + advFields cbgo.AdvFields, rssi int) { + log.Println("Found peripheral", prph.Name()) + nativeBridge.central.Connect(prph, nil) +} + +func (d *MyDelegate) DidConnectPeripheral(cm cbgo.CentralManager, prph cbgo.Peripheral) { + if d.connectedPeripheral == nil { + prph.SetDelegate(d) + prph.DiscoverServices([]cbgo.UUID{longServiceUuid, shortServiceUuid}) + } +} + +func (d *MyDelegate) DidFailToConnectPeripheral(cm cbgo.CentralManager, prph cbgo.Peripheral, err error) { + log.Printf("failed to connect: %v", err) +} + +func (d *MyDelegate) DidDisconnectPeripheral(cm cbgo.CentralManager, prph cbgo.Peripheral, err error) { + log.Printf("peripheral disconnected: %v", err) +} + +func (d *MyDelegate) DidDiscoverServices(prph cbgo.Peripheral, err error) { + if err != nil || len(prph.Services()) == 0 { + log.Println("Error discovering services", err) + dumbApp.FinishedConnect(false, "") + return + } + + d.service = &prph.Services()[0] + prph.DiscoverCharacteristics([]cbgo.UUID{writeUuid, readUuid, encryptedUuid, pairingUuid}, *d.service) +} + +func (d *MyDelegate) DidDiscoverCharacteristics(prph cbgo.Peripheral, svc cbgo.Service, err error) { + if svc.UUID().String() != d.service.UUID().String() { + return + } + + if err != nil || len(svc.Characteristics()) == 0 { + log.Println("No characteristics") + dumbApp.FinishedConnect(false, "") + return + } + + foundCount := 0 + for _, chr := range d.service.Characteristics() { + log.Println("Found char", chr.UUID().String()) + + uuid := chr.UUID().String() + if uuid == writeUuid.String() { + d.writeChr = chr + foundCount += 1 + } else if uuid == readUuid.String() { + d.readChr = chr + foundCount += 1 + } + } + + if foundCount < 2 || d.service == nil { + log.Println("Couldn't find matching service or characteristics") + dumbApp.FinishedConnect(false, "") + return + } + + nativeBridge.central.StopScan() + d.connectedPeripheral = &prph + + log.Println("Finished connect. Writing test command") + + d.connectedPeripheral.SetNotify(true, d.readChr) +} + +func (d *MyDelegate) DidDiscoverDescriptors(prph cbgo.Peripheral, chr cbgo.Characteristic, err error) { +} + +func (d *MyDelegate) DidUpdateValueForCharacteristic(prph cbgo.Peripheral, chr cbgo.Characteristic, err error) { + if err != nil { + log.Printf("Error getting descriptor value: %s", chr.UUID().String()) + return + } + + if chr.Value() == nil { + return + } + data := chr.Value() + + if chr.UUID().String() != d.readChr.UUID().String() { + return + } + + dumbApp.BluetoothGotData(data) + + if !d.finishedConnect { + d.finishedConnect = true + dumbApp.FinishedConnect(true, d.connectedPeripheral.Name()) + } +} + +func (d *MyDelegate) DidUpdateValueForDescriptor(prph cbgo.Peripheral, dsc cbgo.Descriptor, err error) { + if dsc.Characteristic().Service().UUID().String() != d.service.UUID().String() { + return + } + + d.DidUpdateValueForCharacteristic(prph, dsc.Characteristic(), err) +} diff --git a/gio/cpu/abi.h b/gio/cpu/abi.h new file mode 100644 index 0000000..365d936 --- /dev/null +++ b/gio/cpu/abi.h @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: Unlicense OR MIT + +#define ALIGN(bytes, type) type __attribute__((aligned(bytes))) + +typedef ALIGN(8, uint8_t) byte8[8]; +typedef ALIGN(8, uint16_t) word4[4]; +typedef ALIGN(4, uint32_t) dword; +typedef ALIGN(16, uint32_t) dword4[4]; +typedef ALIGN(8, uint64_t) qword; +typedef ALIGN(16, uint64_t) qword2[2]; +typedef ALIGN(16, unsigned int) uint4[4]; +typedef ALIGN(8, uint32_t) dword2[2]; +typedef ALIGN(8, unsigned short) ushort4[4]; +typedef ALIGN(16, float) float4[4]; +typedef ALIGN(16, int) int4[4]; + +typedef unsigned short half; + +typedef unsigned char bool; + +enum { + MAX_BOUND_DESCRIPTOR_SETS = 4, + MAX_DESCRIPTOR_SET_UNIFORM_BUFFERS_DYNAMIC = 8, + MAX_DESCRIPTOR_SET_STORAGE_BUFFERS_DYNAMIC = 4, + MAX_DESCRIPTOR_SET_COMBINED_BUFFERS_DYNAMIC = + MAX_DESCRIPTOR_SET_UNIFORM_BUFFERS_DYNAMIC + + MAX_DESCRIPTOR_SET_STORAGE_BUFFERS_DYNAMIC, + MAX_PUSH_CONSTANT_SIZE = 128, + + MIN_STORAGE_BUFFER_OFFSET_ALIGNMENT = 256, + + REQUIRED_MEMORY_ALIGNMENT = 16, + + SIMD_WIDTH = 4, +}; + +struct image_descriptor { + ALIGN(16, void *ptr); + int width; + int height; + int depth; + int row_pitch_bytes; + int slice_pitch_bytes; + int sample_pitch_bytes; + int sample_count; + int size_in_bytes; + + void *stencil_ptr; + int stencil_row_pitch_bytes; + int stencil_slice_pitch_bytes; + int stencil_sample_pitch_bytes; + + // TODO: unused? + void *memoryOwner; +}; + +struct buffer_descriptor { + ALIGN(16, void *ptr); + int size_in_bytes; + int robustness_size; +}; + +struct program_data { + uint8_t *descriptor_sets[MAX_BOUND_DESCRIPTOR_SETS]; + uint32_t descriptor_dynamic_offsets[MAX_DESCRIPTOR_SET_COMBINED_BUFFERS_DYNAMIC]; + uint4 num_workgroups; + uint4 workgroup_size; + uint32_t invocations_per_subgroup; + uint32_t subgroups_per_workgroup; + uint32_t invocations_per_workgroup; + unsigned char push_constants[MAX_PUSH_CONSTANT_SIZE]; + // Unused. + void *constants; +}; + +typedef int32_t yield_result; + +typedef void * coroutine; + +typedef coroutine (*routine_begin)(struct program_data *data, + int32_t workgroupX, + int32_t workgroupY, + int32_t workgroupZ, + void *workgroupMemory, + int32_t firstSubgroup, + int32_t subgroupCount); + +typedef bool (*routine_await)(coroutine r, yield_result *res); + +typedef void (*routine_destroy)(coroutine r); + diff --git a/gio/cpu/driver_nosupport.go b/gio/cpu/driver_nosupport.go new file mode 100644 index 0000000..59e5178 --- /dev/null +++ b/gio/cpu/driver_nosupport.go @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: Unlicense OR MIT + +package cpu + +import "unsafe" + +type ( + BufferDescriptor struct{} + ImageDescriptor struct{} + SamplerDescriptor struct{} + + DispatchContext struct{} + ThreadContext struct{} + ProgramInfo struct{} +) + +const Supported = false + +func NewBuffer(size int) BufferDescriptor { + panic("unsupported") +} + +func (d *BufferDescriptor) Data() []byte { + panic("unsupported") +} + +func (d *BufferDescriptor) Free() { +} + +func NewImageRGBA(width, height int) ImageDescriptor { + panic("unsupported") +} + +func (d *ImageDescriptor) Data() []byte { + panic("unsupported") +} + +func (d *ImageDescriptor) Free() { +} + +func NewDispatchContext() *DispatchContext { + panic("unsupported") +} + +func (c *DispatchContext) Free() { +} + +func (c *DispatchContext) Prepare(numThreads int, prog *ProgramInfo, descSet unsafe.Pointer, x, y, z int) { + panic("unsupported") +} + +func (c *DispatchContext) Dispatch(threadIdx int, ctx *ThreadContext) { + panic("unsupported") +} + +func NewThreadContext() *ThreadContext { + panic("unsupported") +} + +func (c *ThreadContext) Free() { +} diff --git a/gio/cpu/embed.go b/gio/cpu/embed.go new file mode 100644 index 0000000..9d3b944 --- /dev/null +++ b/gio/cpu/embed.go @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: Unlicense OR MIT + +package cpu + +import _ "embed" + +//go:embed abi.h +var ABIH []byte + +//go:embed runtime.h +var RuntimeH []byte diff --git a/gio/cpu/go.mod b/gio/cpu/go.mod new file mode 100644 index 0000000..af5af9c --- /dev/null +++ b/gio/cpu/go.mod @@ -0,0 +1,3 @@ +module github.com/empathicqubit/giouibind/gio/cpu + +go 1.17 diff --git a/gio/cpu/runtime.h b/gio/cpu/runtime.h new file mode 100644 index 0000000..cfae912 --- /dev/null +++ b/gio/cpu/runtime.h @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: Unlicense OR MIT + +#define ATTR_HIDDEN __attribute__ ((visibility ("hidden"))) + +// program_info contains constant parameters for a program. +struct program_info { + // MinMemorySize is the minimum size of memory passed to dispatch. + size_t min_memory_size; + // has_cbarriers is 1 when the program contains control barriers. + bool has_cbarriers; + // desc_set_size is the size of the first descriptor set for the program. + size_t desc_set_size; + int workgroup_size_x; + int workgroup_size_y; + int workgroup_size_z; + // Program entrypoints. + routine_begin begin; + routine_await await; + routine_destroy destroy; +}; + +// dispatch_context contains the information a program dispatch. +struct dispatch_context; + +// thread_context contains the working memory of a batch. It may be +// reused, but not concurrently. +struct thread_context; + +extern struct buffer_descriptor alloc_buffer(size_t size) ATTR_HIDDEN; +extern struct image_descriptor alloc_image_rgba(int width, int height) ATTR_HIDDEN; + +extern struct dispatch_context *alloc_dispatch_context(void) ATTR_HIDDEN; + +extern void free_dispatch_context(struct dispatch_context *c) ATTR_HIDDEN; + +extern struct thread_context *alloc_thread_context(void) ATTR_HIDDEN; + +extern void free_thread_context(struct thread_context *c) ATTR_HIDDEN; + +// prepare_dispatch initializes ctx to run a dispatch of a program distributed +// among nthreads threads. +extern void prepare_dispatch(struct dispatch_context *ctx, int nthreads, struct program_info *info, uint8_t *desc_set, int ngroupx, int ngroupy, int ngroupz) ATTR_HIDDEN; + +// dispatch_batch executes a dispatch batch. +extern void dispatch_thread(struct dispatch_context *ctx, int thread_idx, struct thread_context *thread) ATTR_HIDDEN; diff --git a/gio/shader/LICENSE b/gio/shader/LICENSE new file mode 100644 index 0000000..81f4733 --- /dev/null +++ b/gio/shader/LICENSE @@ -0,0 +1,63 @@ +This project is provided under the terms of the UNLICENSE or +the MIT license denoted by the following SPDX identifier: + +SPDX-License-Identifier: Unlicense OR MIT + +You may use the project under the terms of either license. + +Both licenses are reproduced below. + +---- +The MIT License (MIT) + +Copyright (c) 2019 The Gio authors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +--- + + + +--- +The UNLICENSE + +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to +--- diff --git a/gio/shader/README.md b/gio/shader/README.md new file mode 100644 index 0000000..4ea4867 --- /dev/null +++ b/gio/shader/README.md @@ -0,0 +1,18 @@ +# GPU programs for the Gio project + +This repository contains the source code for the [Gio](https://gioui.org) +project. It also contains the generators and dereived versions for use with the +GPU APIs supported by Gio. + +# Generating CPU fallbacks + +The `piet/gencpu.sh` script updates the piet-gpu binaries: + +``` +$ cd piet +$ ./gencpu.sh +``` + +## Issues and contributions + +See the [Gio contribution guide](https://gioui.org/doc/contribute). diff --git a/gio/shader/cmd/convertshaders/glslvalidate.go b/gio/shader/cmd/convertshaders/glslvalidate.go new file mode 100644 index 0000000..b17150f --- /dev/null +++ b/gio/shader/cmd/convertshaders/glslvalidate.go @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: Unlicense OR MIT + +package main + +import ( + "bytes" + "fmt" + "io/ioutil" + "os/exec" + "path/filepath" + "strings" +) + +// GLSLValidator is OpenGL reference compiler. +type GLSLValidator struct { + Bin string + WorkDir WorkDir +} + +func NewGLSLValidator() *GLSLValidator { return &GLSLValidator{Bin: "glslangValidator"} } + +// Convert converts a glsl shader to spirv. +func (glsl *GLSLValidator) Convert(path, variant string, lang string, input []byte) ([]byte, error) { + base := glsl.WorkDir.Path(filepath.Base(path), variant) + pathout := base + ".out" + + cmd := exec.Command(glsl.Bin, + "--stdin", + "-DLANG_"+strings.ToUpper(lang), + "-I"+filepath.Dir(path), + "-V", // OpenGL ES 3.1. + "-w", // Suppress warnings. + "-S", filepath.Ext(path)[1:], + "-o", pathout, + ) + cmd.Stdin = bytes.NewBuffer(input) + + out, err := cmd.Output() + if err != nil { + return nil, fmt.Errorf("%s\nfailed to run %v: %w", out, cmd.Args, err) + } + + compiled, err := ioutil.ReadFile(pathout) + if err != nil { + return nil, fmt.Errorf("unable to read output %q: %w", pathout, err) + } + + return compiled, nil +} + +func spirvOpt(spirv []byte) ([]byte, error) { + cmd := exec.Command("spirv-opt", + "-O", + "-", + "-o", "-", + ) + cmd.Stdin = bytes.NewBuffer(spirv) + + out, err := cmd.Output() + if err != nil { + return nil, fmt.Errorf("%s\nfailed to run %v: %w", out, cmd.Args, err) + } + return out, nil +} diff --git a/gio/shader/cmd/convertshaders/hlsl.go b/gio/shader/cmd/convertshaders/hlsl.go new file mode 100644 index 0000000..def3e3e --- /dev/null +++ b/gio/shader/cmd/convertshaders/hlsl.go @@ -0,0 +1,146 @@ +// SPDX-License-Identifier: Unlicense OR MIT + +package main + +import ( + "bytes" + "fmt" + "io" + "io/ioutil" + "os/exec" + "path/filepath" + "runtime" + "strings" +) + +// FXC is hlsl compiler that targets ShaderModel 5.x and lower. +type FXC struct { + Bin string + WorkDir WorkDir +} + +func NewFXC() *FXC { return &FXC{Bin: "fxc.exe"} } + +// Compile compiles the input shader. +func (fxc *FXC) Compile(path, variant string, input []byte, entryPoint string, profileVersion string) ([]byte, error) { + base := fxc.WorkDir.Path(filepath.Base(path), variant, profileVersion) + pathin := base + ".in" + pathout := base + ".out" + result := pathout + + if err := fxc.WorkDir.WriteFile(pathin, input); err != nil { + return nil, fmt.Errorf("unable to write shader to disk: %w", err) + } + + cmd := exec.Command(fxc.Bin) + if runtime.GOOS != "windows" { + cmd = exec.Command("wine", fxc.Bin) + if err := winepath(&pathin, &pathout); err != nil { + return nil, err + } + } + + var profile string + switch filepath.Ext(path) { + case ".frag": + profile = "ps_" + profileVersion + case ".vert": + profile = "vs_" + profileVersion + case ".comp": + profile = "cs_" + profileVersion + default: + return nil, fmt.Errorf("unrecognized shader type %s", path) + } + + cmd.Args = append(cmd.Args, + "/Fo", pathout, + "/T", profile, + "/E", entryPoint, + pathin, + ) + + output, err := cmd.CombinedOutput() + if err != nil { + info := "" + if runtime.GOOS != "windows" { + info = "If the fxc tool cannot be found, set WINEPATH to the Windows path for the Windows SDK.\n" + } + return nil, fmt.Errorf("%s\n%sfailed to run %v: %w", output, info, cmd.Args, err) + } + + compiled, err := ioutil.ReadFile(result) + if err != nil { + return nil, fmt.Errorf("unable to read output %q: %w", pathout, err) + } + + return compiled, nil +} + +// DXC is hlsl compiler that targets ShaderModel 6.0 and newer. +type DXC struct { + Bin string + WorkDir WorkDir +} + +func NewDXC() *DXC { return &DXC{Bin: "dxc"} } + +// Compile compiles the input shader. +func (dxc *DXC) Compile(path, variant string, input []byte, entryPoint string, profile string) (string, error) { + base := dxc.WorkDir.Path(filepath.Base(path), variant, profile) + pathin := base + ".in" + pathout := base + ".out" + result := pathout + + if err := dxc.WorkDir.WriteFile(pathin, input); err != nil { + return "", fmt.Errorf("unable to write shader to disk: %w", err) + } + + cmd := exec.Command(dxc.Bin) + + cmd.Args = append(cmd.Args, + "-Fo", pathout, + "-T", profile, + "-E", entryPoint, + "-Qstrip_reflect", + pathin, + ) + + output, err := cmd.CombinedOutput() + if err != nil { + return "", fmt.Errorf("%s\nfailed to run %v: %w", output, cmd.Args, err) + } + + compiled, err := ioutil.ReadFile(result) + if err != nil { + return "", fmt.Errorf("unable to read output %q: %w", pathout, err) + } + + return string(compiled), nil +} + +// winepath uses the winepath tool to convert a paths to Windows format. +// The returned path can be used as arguments for Windows command line tools. +func winepath(paths ...*string) error { + winepath := exec.Command("winepath", "--windows") + for _, path := range paths { + winepath.Args = append(winepath.Args, *path) + } + // Use a pipe instead of Output, because winepath may have left wineserver + // running for several seconds as a grandchild. + out, err := winepath.StdoutPipe() + if err != nil { + return fmt.Errorf("unable to start winepath: %w", err) + } + if err := winepath.Start(); err != nil { + return fmt.Errorf("unable to start winepath: %w", err) + } + var buf bytes.Buffer + if _, err := io.Copy(&buf, out); err != nil { + return fmt.Errorf("unable to run winepath: %w", err) + } + winPaths := strings.Split(strings.TrimSpace(buf.String()), "\n") + for i, path := range paths { + *path = winPaths[i] + } + return nil +} diff --git a/gio/shader/cmd/convertshaders/main.go b/gio/shader/cmd/convertshaders/main.go new file mode 100644 index 0000000..22baa95 --- /dev/null +++ b/gio/shader/cmd/convertshaders/main.go @@ -0,0 +1,547 @@ +// SPDX-License-Identifier: Unlicense OR MIT + +package main + +import ( + "bytes" + "errors" + "flag" + "fmt" + "io" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "sort" + "strconv" + "strings" + "sync" + "text/template" +) + +type shaderSources struct { + Name string + SPIRV []byte + GLSL100ES []byte + GLSL150 []byte + DXBC []byte + MetalLibs MetalLibs + Reflect Metadata +} + +func main() { + packageName := flag.String("package", "", "specify Go package name") + workdir := flag.String("work", "", "temporary working directory (default TEMP)") + shadersDir := flag.String("dir", "shaders", "shaders directory") + + flag.Parse() + + var work WorkDir + cleanup := func() {} + if *workdir == "" { + tempdir, err := ioutil.TempDir("", "shader-convert") + if err != nil { + fmt.Fprintf(os.Stderr, "failed to create tempdir: %v\n", err) + os.Exit(1) + } + cleanup = func() { os.RemoveAll(tempdir) } + defer cleanup() + + work = WorkDir(tempdir) + } else { + if abs, err := filepath.Abs(*workdir); err == nil { + *workdir = abs + } + work = WorkDir(*workdir) + } + + var out bytes.Buffer + conv := NewConverter(work, *packageName, *shadersDir) + if err := conv.Run(&out); err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + cleanup() + os.Exit(1) + } + + if err := ioutil.WriteFile("shaders.go", out.Bytes(), 0644); err != nil { + fmt.Fprintf(os.Stderr, "failed to create shaders: %v\n", err) + cleanup() + os.Exit(1) + } + + cmd := exec.Command("gofmt", "-s", "-w", "shaders.go") + cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + if err := cmd.Run(); err != nil { + fmt.Fprintf(os.Stderr, "formatting shaders.go failed: %v\n", err) + cleanup() + os.Exit(1) + } +} + +type Converter struct { + workDir WorkDir + shadersDir string + + packageName string + + glslvalidator *GLSLValidator + spirv *SPIRVCross + fxc *FXC + msl *MSL +} + +func NewConverter(workDir WorkDir, packageName, shadersDir string) *Converter { + if abs, err := filepath.Abs(shadersDir); err == nil { + shadersDir = abs + } + + conv := &Converter{} + conv.workDir = workDir + conv.shadersDir = shadersDir + + conv.packageName = packageName + + conv.glslvalidator = NewGLSLValidator() + conv.spirv = NewSPIRVCross() + conv.fxc = NewFXC() + conv.msl = &MSL{ + WorkDir: workDir.Dir("msl"), + } + + verifyBinaryPath(&conv.glslvalidator.Bin) + verifyBinaryPath(&conv.spirv.Bin) + // We cannot check fxc nor msl since they may depend on wine. + + conv.glslvalidator.WorkDir = workDir.Dir("glslvalidator") + conv.fxc.WorkDir = workDir.Dir("fxc") + conv.spirv.WorkDir = workDir.Dir("spirv") + + return conv +} + +func verifyBinaryPath(bin *string) { + new, err := exec.LookPath(*bin) + if err != nil { + fmt.Fprintf(os.Stderr, "unable to find %q: %v\n", *bin, err) + } else { + *bin = new + } +} + +func (conv *Converter) Run(out io.Writer) error { + shaders, err := filepath.Glob(filepath.Join(conv.shadersDir, "*")) + if err != nil { + return fmt.Errorf("failed to list shaders in %q: %w", conv.shadersDir, err) + } + + sort.Strings(shaders) + + var workers Workers + + type ShaderResult struct { + Path string + Shaders []shaderSources + Error error + } + shaderResults := make([]ShaderResult, len(shaders)) + + for i, shaderPath := range shaders { + i, shaderPath := i, shaderPath + + switch filepath.Ext(shaderPath) { + case ".vert", ".frag": + workers.Go(func() { + shaders, err := conv.Shader(shaderPath) + shaderResults[i] = ShaderResult{ + Path: shaderPath, + Shaders: shaders, + Error: err, + } + }) + case ".comp": + workers.Go(func() { + shaders, err := conv.ComputeShader(shaderPath) + shaderResults[i] = ShaderResult{ + Path: shaderPath, + Shaders: shaders, + Error: err, + } + }) + default: + continue + } + } + + workers.Wait() + + var allErrors string + for _, r := range shaderResults { + if r.Error != nil { + if len(allErrors) > 0 { + allErrors += "\n\n" + } + allErrors += "--- " + r.Path + " --- \n\n" + r.Error.Error() + "\n" + } + } + if len(allErrors) > 0 { + return errors.New(allErrors) + } + + fmt.Fprintf(out, "// Code generated by build.go. DO NOT EDIT.\n\n") + fmt.Fprintf(out, "package %s\n\n", conv.packageName) + fmt.Fprintf(out, "import (\n") + fmt.Fprintf(out, "\t%q\n", "runtime") + fmt.Fprintf(out, "\t_ %q\n", "embed") + fmt.Fprintln(out) + fmt.Fprintf(out, "\t%q\n", "gioui.org/shader") + fmt.Fprintf(out, ")\n\n") + + fmt.Fprintf(out, "var (\n") + + var genErr error + for _, r := range shaderResults { + if len(r.Shaders) == 0 { + continue + } + + name := filepath.Base(r.Path) + name = strings.ReplaceAll(name, ".", "_") + fmt.Fprintf(out, "\tShader_%s = ", name) + + multiVariant := len(r.Shaders) > 1 + if multiVariant { + fmt.Fprintf(out, "[...]shader.Sources{\n") + } + + writeGenerated := func(src []byte, prefix, path string, idx int) { + if len(src) == 0 || genErr != nil { + return + } + base := fmt.Sprintf("z%s.%d.%s", filepath.Base(path), idx, strings.ToLower(prefix)) + p := filepath.Join(filepath.Dir(path), base) + genErr = os.WriteFile(p, src, 0o644) + } + for i, src := range r.Shaders { + fmt.Fprintf(out, "shader.Sources{\n") + fmt.Fprintf(out, "Name: %#v,\n", src.Name) + if inp := src.Reflect.Inputs; len(inp) > 0 { + fmt.Fprintf(out, "Inputs: %#v,\n", inp) + } + if u := src.Reflect.Uniforms; u.Size > 0 { + fmt.Fprintf(out, "Uniforms: shader.UniformsReflection{\n") + fmt.Fprintf(out, "Locations: %#v,\n", u.Locations) + fmt.Fprintf(out, "Size: %d,\n", u.Size) + fmt.Fprintf(out, "},\n") + } + if tex := src.Reflect.Textures; len(tex) > 0 { + fmt.Fprintf(out, "Textures: %#v,\n", tex) + } + if imgs := src.Reflect.Images; len(imgs) > 0 { + fmt.Fprintf(out, "Images: %#v,\n", imgs) + } + if bufs := src.Reflect.StorageBuffers; len(bufs) > 0 { + fmt.Fprintf(out, "StorageBuffers: %#v,\n", bufs) + } + if wg := src.Reflect.WorkgroupSize; wg != [3]int{} { + fmt.Fprintf(out, "WorkgroupSize: %#v,\n", wg) + } + writeGenerated(src.SPIRV, "SPIRV", r.Path, i) + writeGenerated(src.GLSL100ES, "GLSL100ES", r.Path, i) + writeGenerated(src.GLSL150, "GLSL150", r.Path, i) + writeGenerated(src.DXBC, "DXBC", r.Path, i) + writeGenerated(src.MetalLibs.MacOS, "MetalLibMacOS", r.Path, i) + writeGenerated(src.MetalLibs.IOS, "MetalLibIOS", r.Path, i) + writeGenerated(src.MetalLibs.IOSSimulator, "MetalLibIOSSimulator", r.Path, i) + fmt.Fprintf(out, "}") + if multiVariant { + fmt.Fprintf(out, ",") + } + fmt.Fprintf(out, "\n") + } + if multiVariant { + fmt.Fprintf(out, "}\n") + } + writeEmbedded := func(src []byte, prefix, path string, idx int) { + base := fmt.Sprintf("z%s.%d.%s", filepath.Base(path), idx, strings.ToLower(prefix)) + if _, err := os.Stat(base); err != nil { + return + } + field := strings.ReplaceAll(base, ".", "_") + fmt.Fprintf(out, "//go:embed %s\n", base) + fmt.Fprintf(out, "%s string\n", field) + } + for i, src := range r.Shaders { + writeEmbedded(src.SPIRV, "SPIRV", r.Path, i) + writeEmbedded(src.GLSL100ES, "GLSL100ES", r.Path, i) + writeEmbedded(src.GLSL150, "GLSL150", r.Path, i) + writeEmbedded(src.DXBC, "DXBC", r.Path, i) + writeEmbedded(src.MetalLibs.MacOS, "MetalLibMacOS", r.Path, i) + writeEmbedded(src.MetalLibs.IOS, "MetalLibIOS", r.Path, i) + writeEmbedded(src.MetalLibs.IOSSimulator, "MetalLibIOSSimulator", r.Path, i) + } + } + fmt.Fprintf(out, ")\n") + writeInit := func(src []byte, prefix, field, path string, idx int, variants bool) { + name := filepath.Base(path) + name = strings.ReplaceAll(name, ".", "_") + base := fmt.Sprintf("z%s.%d.%s", filepath.Base(path), idx, strings.ToLower(prefix)) + if _, err := os.Stat(base); err != nil { + return + } + variable := strings.ReplaceAll(base, ".", "_") + index := "" + if variants { + index = fmt.Sprintf("[%d]", idx) + } + fmt.Fprintf(out, "\t\tShader_%s%s.%s = %s\n", name, index, field, variable) + } + fmt.Fprintf(out, "func init() {\n") + fmt.Fprintf(out, "\tconst (\n") + fmt.Fprintf(out, "\t\topengles = %s\n", geeseExpr("linux", "freebsd", "openbsd", "windows", "js", "android", "darwin", "ios")) + fmt.Fprintf(out, "\t\topengl = %s\n", geeseExpr("darwin")) + fmt.Fprintf(out, "\t\td3d11 = %s\n", geeseExpr("windows")) + fmt.Fprintf(out, "\t\tvulkan = %s\n", geeseExpr("linux", "android")) + fmt.Fprintf(out, "\t)\n") + for _, r := range shaderResults { + variants := len(r.Shaders) > 1 + for i, src := range r.Shaders { + fmt.Fprintf(out, "\tif vulkan {\n") + writeInit(src.SPIRV, "SPIRV", "SPIRV", r.Path, i, variants) + fmt.Fprintf(out, "\t}\n") + fmt.Fprintf(out, "\tif opengles {\n") + writeInit(src.GLSL100ES, "GLSL100ES", "GLSL100ES", r.Path, i, variants) + fmt.Fprintf(out, "\t}\n") + fmt.Fprintf(out, "\tif opengl {\n") + writeInit(src.GLSL150, "GLSL150", "GLSL150", r.Path, i, variants) + fmt.Fprintf(out, "\t}\n") + fmt.Fprintf(out, "\tif d3d11 {\n") + writeInit(src.DXBC, "DXBC", "DXBC", r.Path, i, variants) + fmt.Fprintf(out, "\t}\n") + fmt.Fprintf(out, "\tif runtime.GOOS == \"darwin\" {\n") + writeInit(src.MetalLibs.MacOS, "MetalLibMacOS", "MetalLib", r.Path, i, variants) + fmt.Fprintf(out, "\t}\n") + fmt.Fprintf(out, "\tif runtime.GOOS == \"ios\" {\n") + fmt.Fprintf(out, "if runtime.GOARCH == \"amd64\" {\n") + writeInit(src.MetalLibs.IOSSimulator, "MetalLibIOSSimulator", "MetalLib", r.Path, i, variants) + fmt.Fprintf(out, "\t\t} else {\n") + writeInit(src.MetalLibs.IOS, "MetalLibIOS", "MetalLib", r.Path, i, variants) + fmt.Fprintf(out, "\t\t}\n") + fmt.Fprintf(out, "\t}\n") + } + } + fmt.Fprintf(out, "}\n") + + return genErr +} + +func geeseExpr(geese ...string) string { + var checks []string + for _, goos := range geese { + checks = append(checks, fmt.Sprintf("runtime.GOOS == %q", goos)) + } + return strings.Join(checks, " || ") +} + +func (conv *Converter) Shader(shaderPath string) ([]shaderSources, error) { + type Variant struct { + FetchColorExpr string + Header string + } + variantArgs := [...]Variant{ + { + FetchColorExpr: `_color.color`, + Header: `layout(push_constant) uniform Color { layout(offset=112) vec4 color; } _color;`, + }, + { + FetchColorExpr: `mix(_gradient.color1, _gradient.color2, clamp(vUV.x, 0.0, 1.0))`, + Header: `layout(push_constant) uniform Gradient { layout(offset=96) vec4 color1; vec4 color2; } _gradient;`, + }, + { + FetchColorExpr: `texture(tex, vUV)`, + Header: `layout(binding=0) uniform sampler2D tex;`, + }, + } + + shaderTemplate, err := template.ParseFiles(shaderPath) + if err != nil { + return nil, fmt.Errorf("failed to parse template %q: %w", shaderPath, err) + } + + var variants []shaderSources + for i, variantArg := range variantArgs { + variantName := strconv.Itoa(i) + var buf bytes.Buffer + err := shaderTemplate.Execute(&buf, variantArg) + if err != nil { + return nil, fmt.Errorf("failed to execute template %q with %#v: %w", shaderPath, variantArg, err) + } + + var sources shaderSources + sources.Name = filepath.Base(shaderPath) + + src := buf.Bytes() + sources.SPIRV, err = conv.glslvalidator.Convert(shaderPath, variantName, "vulkan", src) + if err != nil { + return nil, fmt.Errorf("failed to generate SPIR-V for %q: %w", shaderPath, err) + } + + sources.SPIRV, err = spirvOpt(sources.SPIRV) + if err != nil { + return nil, fmt.Errorf("failed to optimize SPIR-V for %q: %w", shaderPath, err) + } + + var reflect Metadata + sources.GLSL100ES, reflect, err = conv.ShaderVariant(shaderPath, variantName, src, "es", "100") + if err != nil { + return nil, fmt.Errorf("failed to convert GLSL100ES:\n%w", err) + } + + metal, _, err := conv.ShaderVariant(shaderPath, variantName, src, "msl", "10000") + if err != nil { + return nil, fmt.Errorf("failed to convert to Metal:\n%w", err) + } + + metalIOS, _, err := conv.ShaderVariant(shaderPath, variantName, src, "mslios", "10000") + if err != nil { + return nil, fmt.Errorf("failed to convert to Metal:\n%w", err) + } + + sources.MetalLibs, err = conv.msl.Compile(shaderPath, variantName, metal, metalIOS) + if err != nil { + if !errors.Is(err, exec.ErrNotFound) { + return nil, fmt.Errorf("failed to build .metallib library:\n%w", err) + } + } + + hlsl, _, err := conv.ShaderVariant(shaderPath, variantName, src, "hlsl", "40") + if err != nil { + return nil, fmt.Errorf("failed to convert HLSL:\n%w", err) + } + + sources.DXBC, err = conv.fxc.Compile(shaderPath, variantName, []byte(hlsl), "main", "4_0_level_9_1") + if err != nil { + // Attempt shader model 4.0. Only the gpu/headless + // test shaders use features not supported by level + // 9.1. + sources.DXBC, err = conv.fxc.Compile(shaderPath, variantName, []byte(hlsl), "main", "4_0") + if err != nil { + if !errors.Is(err, exec.ErrNotFound) { + return nil, fmt.Errorf("failed to compile HLSL: %w", err) + } + } + } + + sources.GLSL150, _, err = conv.ShaderVariant(shaderPath, variantName, src, "glsl", "150") + if err != nil { + return nil, fmt.Errorf("failed to convert GLSL150:\n%w", err) + } + + sources.Reflect = reflect + + variants = append(variants, sources) + } + + // If the shader don't use the variant arguments, output only a single version. + if bytes.Equal(variants[0].GLSL100ES, variants[1].GLSL100ES) { + variants = variants[:1] + } + + return variants, nil +} + +func (conv *Converter) ShaderVariant(shaderPath, variant string, src []byte, lang, profile string) ([]byte, Metadata, error) { + spirv, err := conv.glslvalidator.Convert(shaderPath, variant, lang, src) + if err != nil { + return nil, Metadata{}, fmt.Errorf("failed to generate SPIR-V for %q: %w", shaderPath, err) + } + + dst, err := conv.spirv.Convert(shaderPath, variant, spirv, lang, profile) + if err != nil { + return nil, Metadata{}, fmt.Errorf("failed to convert shader %q: %w", shaderPath, err) + } + + meta, err := conv.spirv.Metadata(shaderPath, variant, spirv) + if err != nil { + return nil, Metadata{}, fmt.Errorf("failed to extract metadata for shader %q: %w", shaderPath, err) + } + + return dst, meta, nil +} + +func (conv *Converter) ComputeShader(shaderPath string) ([]shaderSources, error) { + sh, err := ioutil.ReadFile(shaderPath) + if err != nil { + return nil, fmt.Errorf("failed to load shader %q: %w", shaderPath, err) + } + + sources := shaderSources{ + Name: filepath.Base(shaderPath), + } + spirv, err := conv.glslvalidator.Convert(shaderPath, "", "glsl", sh) + if err != nil { + return nil, fmt.Errorf("failed to convert compute shader %q: %w", shaderPath, err) + } + + sources.SPIRV, err = spirvOpt(spirv) + if err != nil { + return nil, fmt.Errorf("failed to optimize SPIR-V for %q: %w", shaderPath, err) + } + + meta, err := conv.spirv.Metadata(shaderPath, "", spirv) + if err != nil { + return nil, fmt.Errorf("failed to extract metadata for shader %q: %w", shaderPath, err) + } + sources.Reflect = meta + + metal, err := conv.spirv.Convert(shaderPath, "", spirv, "msl", "10000") + if err != nil { + return nil, fmt.Errorf("failed to convert GLSL130:\n%w", err) + } + + metalIOS, err := conv.spirv.Convert(shaderPath, "", spirv, "mslios", "10000") + if err != nil { + return nil, fmt.Errorf("failed to convert GLSL130:\n%w", err) + } + + sources.MetalLibs, err = conv.msl.Compile(shaderPath, "", metal, metalIOS) + if err != nil { + if !errors.Is(err, exec.ErrNotFound) { + return nil, fmt.Errorf("failed to build .metallib library:\n%w", err) + } + } + + hlslSource, err := conv.spirv.Convert(shaderPath, "", spirv, "hlsl", "50") + if err != nil { + return nil, fmt.Errorf("failed to convert hlsl compute shader %q: %w", shaderPath, err) + } + + sources.DXBC, err = conv.fxc.Compile(shaderPath, "0", []byte(hlslSource), "main", "5_0") + if err != nil { + if !errors.Is(err, exec.ErrNotFound) { + return nil, fmt.Errorf("failed to compile hlsl compute shader %q: %w", shaderPath, err) + } + } + + return []shaderSources{sources}, nil +} + +// Workers implements wait group with synchronous logging. +type Workers struct { + running sync.WaitGroup +} + +func (lg *Workers) Go(fn func()) { + lg.running.Add(1) + go func() { + defer lg.running.Done() + fn() + }() +} + +func (lg *Workers) Wait() { + lg.running.Wait() +} + +func unixLineEnding(s []byte) []byte { + return bytes.ReplaceAll(s, []byte("\r\n"), []byte("\n")) +} diff --git a/gio/shader/cmd/convertshaders/msl.go b/gio/shader/cmd/convertshaders/msl.go new file mode 100644 index 0000000..c97dba3 --- /dev/null +++ b/gio/shader/cmd/convertshaders/msl.go @@ -0,0 +1,108 @@ +// SPDX-License-Identifier: Unlicense OR MIT + +package main + +import ( + "fmt" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "runtime" +) + +// MSL is hlsl compiler that targets the Metal shading language +type MSL struct { + WorkDir WorkDir +} + +// MetalLibs contains compiled .metallib programs for all supported platforms. +type MetalLibs struct { + MacOS []byte + IOS []byte + IOSSimulator []byte +} + +// Compile compiles the input .metal program and converts it into .metallib libraries. +func (msl *MSL) Compile(path, variant string, src, srcIOS []byte) (MetalLibs, error) { + base := msl.WorkDir.Path(filepath.Base(path), variant) + pathinMacOS := base + ".macos.metal" + pathinIOS := base + ".ios.metal" + + var libs MetalLibs + if err := msl.WorkDir.WriteFile(pathinMacOS, []byte(src)); err != nil { + return libs, fmt.Errorf("unable to write shader to disk: %w", err) + } + if err := msl.WorkDir.WriteFile(pathinIOS, []byte(srcIOS)); err != nil { + return libs, fmt.Errorf("unable to write shader to disk: %w", err) + } + + var err error + libs.MacOS, err = msl.compileFor("macosx", "-mmacosx-version-min=10.11", pathinMacOS) + if err != nil { + return libs, err + } + libs.IOS, err = msl.compileFor("iphoneos", "-mios-version-min=10.0", pathinIOS) + if err != nil { + return libs, err + } + libs.IOSSimulator, err = msl.compileFor("iphonesimulator", "-miphonesimulator-version-min=8.0", pathinIOS) + if err != nil { + return libs, err + } + + return libs, nil +} + +// compileFor compiles the input .metal program and converts it into a +// .metallib library for a particular SDK. +func (msl *MSL) compileFor(sdk, minVer, path string) ([]byte, error) { + var metal *exec.Cmd + + pathout := path + ".metallib" + result := pathout + + if runtime.GOOS == "darwin" { + metal = exec.Command("xcrun", "--sdk", sdk, "metal") + } else { + sdkDir := os.Getenv("METAL_SDK_ROOT") + if sdkDir == "" { + return nil, exec.ErrNotFound + } + switch sdk { + case "macosx": + sdkDir = filepath.Join(sdkDir, "macos") + case "iphoneos", "iphonesimulator": + sdkDir = filepath.Join(sdkDir, "ios") + default: + panic("unknown sdk") + } + bin := filepath.Join(sdkDir, "bin", "metal.exe") + if runtime.GOOS == "windows" { + metal = exec.Command(bin) + } else { + if err := winepath(&path, &pathout); err != nil { + return nil, err + } + metal = exec.Command("wine", bin) + } + } + + metal.Args = append(metal.Args, + minVer, + "-o", pathout, + path, + ) + + output, err := metal.CombinedOutput() + if err != nil { + return nil, fmt.Errorf("%s\nfailed to run %v: %w", output, metal.Args, err) + } + + compiled, err := ioutil.ReadFile(result) + if err != nil { + return nil, fmt.Errorf("unable to read output %q: %w", pathout, err) + } + + return compiled, nil +} diff --git a/gio/shader/cmd/convertshaders/spirvcross.go b/gio/shader/cmd/convertshaders/spirvcross.go new file mode 100644 index 0000000..a55e05e --- /dev/null +++ b/gio/shader/cmd/convertshaders/spirvcross.go @@ -0,0 +1,259 @@ +// SPDX-License-Identifier: Unlicense OR MIT + +package main + +import ( + "encoding/json" + "fmt" + "math" + "os/exec" + "path/filepath" + "sort" + + "gioui.org/shader" +) + +// Metadata contains reflection data about a shader. +type Metadata struct { + Uniforms shader.UniformsReflection + Inputs []shader.InputLocation + Textures []shader.TextureBinding + Images []shader.ImageBinding + StorageBuffers []shader.BufferBinding + WorkgroupSize [3]int +} + +// SPIRVCross cross-compiles spirv shaders to es, hlsl and others. +type SPIRVCross struct { + Bin string + WorkDir WorkDir +} + +func NewSPIRVCross() *SPIRVCross { return &SPIRVCross{Bin: "spirv-cross"} } + +// Convert converts compute shader from spirv format to a target format. +func (spirv *SPIRVCross) Convert(path, variant string, shader []byte, target, version string) ([]byte, error) { + base := spirv.WorkDir.Path(filepath.Base(path), variant) + + if err := spirv.WorkDir.WriteFile(base, shader); err != nil { + return nil, fmt.Errorf("unable to write shader to disk: %w", err) + } + + var cmd *exec.Cmd + switch target { + case "glsl": + cmd = exec.Command(spirv.Bin, + "--no-es", + "--version", version, + ) + case "es": + cmd = exec.Command(spirv.Bin, + "--es", + "--version", version, + ) + case "hlsl": + cmd = exec.Command(spirv.Bin, + "--hlsl", + "--shader-model", version, + ) + case "msl", "mslios": + cmd = exec.Command(spirv.Bin, + "--msl", + "--msl-decoration-binding", + "--msl-version", version, + ) + if target == "mslios" { + cmd.Args = append(cmd.Args, "--msl-ios") + } + default: + return nil, fmt.Errorf("unknown target %q", target) + } + cmd.Args = append(cmd.Args, "--no-420pack-extension", base) + + out, err := cmd.CombinedOutput() + if err != nil { + return nil, fmt.Errorf("%s\nfailed to run %v: %w", out, cmd.Args, err) + } + if target != "hlsl" { + // Strip Windows \r in line endings. + out = unixLineEnding(out) + } + + return out, nil +} + +// Metadata extracts metadata for a SPIR-V shader. +func (spirv *SPIRVCross) Metadata(path, variant string, shader []byte) (Metadata, error) { + base := spirv.WorkDir.Path(filepath.Base(path), variant) + + if err := spirv.WorkDir.WriteFile(base, shader); err != nil { + return Metadata{}, fmt.Errorf("unable to write shader to disk: %w", err) + } + + cmd := exec.Command(spirv.Bin, + base, + "--reflect", + ) + + out, err := cmd.Output() + if err != nil { + return Metadata{}, fmt.Errorf("failed to run %v: %w", cmd.Args, err) + } + + meta, err := parseMetadata(out) + if err != nil { + return Metadata{}, fmt.Errorf("%s\nfailed to parse metadata: %w", out, err) + } + + return meta, nil +} + +func parseMetadata(data []byte) (Metadata, error) { + var reflect struct { + Types map[string]struct { + Name string `json:"name"` + Members []struct { + Name string `json:"name"` + Type string `json:"type"` + Offset int `json:"offset"` + } `json:"members"` + } `json:"types"` + Inputs []struct { + Name string `json:"name"` + Type string `json:"type"` + Location int `json:"location"` + } `json:"inputs"` + Textures []struct { + Name string `json:"name"` + Type string `json:"type"` + Set int `json:"set"` + Binding int `json:"binding"` + } `json:"textures"` + UBOs []struct { + Name string `json:"name"` + Type string `json:"type"` + BlockSize int `json:"block_size"` + Set int `json:"set"` + Binding int `json:"binding"` + } `json:"ubos"` + PushConstants []struct { + Name string `json:"name"` + Type string `json:"type"` + PushConstant bool `json:"push_constant"` + } `json:"push_constants"` + EntryPoints []struct { + Name string `json:"name"` + Mode string `json:"mode"` + WorkgroupSize [3]int `json:"workgroup_size"` + } `json:"entryPoints"` + StorageBuffers []struct { + Name string `json:"name"` + Type string `json:"type"` + Binding int `json:"binding"` + } `json:"ssbos"` + Images []struct { + Name string `json:"name"` + Type string `json:"type"` + Binding int `json:"binding"` + } `json:"images"` + } + if err := json.Unmarshal(data, &reflect); err != nil { + return Metadata{}, fmt.Errorf("failed to parse reflection data: %w", err) + } + + var m Metadata + + for _, input := range reflect.Inputs { + dataType, dataSize, err := parseDataType(input.Type) + if err != nil { + return Metadata{}, fmt.Errorf("parseReflection: %v", err) + } + m.Inputs = append(m.Inputs, shader.InputLocation{ + Name: input.Name, + Location: input.Location, + Semantic: "TEXCOORD", + SemanticIndex: input.Location, + Type: dataType, + Size: dataSize, + }) + } + + sort.Slice(m.Inputs, func(i, j int) bool { + return m.Inputs[i].Location < m.Inputs[j].Location + }) + + blockSize := 0 + minOffset := math.MaxInt + for _, block := range reflect.PushConstants { + t := reflect.Types[block.Type] + for _, member := range t.Members { + dataType, size, err := parseDataType(member.Type) + if err != nil { + return Metadata{}, fmt.Errorf("failed to parse reflection data: %v", err) + } + blockSize += size * 4 + if member.Offset < minOffset { + minOffset = member.Offset + } + m.Uniforms.Locations = append(m.Uniforms.Locations, shader.UniformLocation{ + Name: fmt.Sprintf("%s.%s", block.Name, member.Name), + Type: dataType, + Size: size, + Offset: member.Offset, + }) + } + } + m.Uniforms.Size = blockSize + + for _, texture := range reflect.Textures { + m.Textures = append(m.Textures, shader.TextureBinding{ + Name: texture.Name, + Binding: texture.Binding, + }) + } + + for _, img := range reflect.Images { + m.Images = append(m.Images, shader.ImageBinding{ + Name: img.Name, + Binding: img.Binding, + }) + } + + for _, sb := range reflect.StorageBuffers { + m.StorageBuffers = append(m.StorageBuffers, shader.BufferBinding{ + Name: sb.Name, + Binding: sb.Binding, + }) + } + + for _, e := range reflect.EntryPoints { + if e.Name == "main" && e.Mode == "comp" { + m.WorkgroupSize = e.WorkgroupSize + } + } + + return m, nil +} + +func parseDataType(t string) (shader.DataType, int, error) { + switch t { + case "float": + return shader.DataTypeFloat, 1, nil + case "vec2": + return shader.DataTypeFloat, 2, nil + case "vec3": + return shader.DataTypeFloat, 3, nil + case "vec4": + return shader.DataTypeFloat, 4, nil + case "int": + return shader.DataTypeInt, 1, nil + case "int2": + return shader.DataTypeInt, 2, nil + case "int3": + return shader.DataTypeInt, 3, nil + case "int4": + return shader.DataTypeInt, 4, nil + default: + return 0, 0, fmt.Errorf("unsupported input data type: %s", t) + } +} diff --git a/gio/shader/cmd/convertshaders/workdir.go b/gio/shader/cmd/convertshaders/workdir.go new file mode 100644 index 0000000..4c1c092 --- /dev/null +++ b/gio/shader/cmd/convertshaders/workdir.go @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: Unlicense OR MIT + +package main + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" +) + +type WorkDir string + +func (wd WorkDir) Dir(path string) WorkDir { + dirname := filepath.Join(string(wd), path) + if err := os.Mkdir(dirname, 0755); err != nil { + if !os.IsExist(err) { + fmt.Fprintf(os.Stderr, "failed to create %q: %v\n", dirname, err) + } + } + return WorkDir(dirname) +} + +func (wd WorkDir) Path(path ...string) (fullpath string) { + return filepath.Join(string(wd), strings.Join(path, ".")) +} + +func (wd WorkDir) WriteFile(path string, data []byte) error { + err := ioutil.WriteFile(path, data, 0644) + if err != nil { + return fmt.Errorf("unable to create %v: %w", path, err) + } + return nil +} diff --git a/gio/shader/gio/blit.frag b/gio/shader/gio/blit.frag new file mode 100644 index 0000000..a88f4dc --- /dev/null +++ b/gio/shader/gio/blit.frag @@ -0,0 +1,15 @@ +#version 310 es + +// SPDX-License-Identifier: Unlicense OR MIT + +precision mediump float; + +layout(location=0) in highp vec2 vUV; + +{{.Header}} + +layout(location = 0) out vec4 fragColor; + +void main() { + fragColor = {{.FetchColorExpr}}; +} diff --git a/gio/shader/gio/blit.vert b/gio/shader/gio/blit.vert new file mode 100644 index 0000000..83d041f --- /dev/null +++ b/gio/shader/gio/blit.vert @@ -0,0 +1,27 @@ +#version 310 es + +// SPDX-License-Identifier: Unlicense OR MIT + +#extension GL_GOOGLE_include_directive : enable + +precision highp float; + +#include "common.h" + +layout(push_constant) uniform Block { + vec4 transform; + vec4 uvTransformR1; + vec4 uvTransformR2; +} _block; + +layout(location = 0) in vec2 pos; + +layout(location = 1) in vec2 uv; + +layout(location = 0) out vec2 vUV; + +void main() { + vec2 p = pos*_block.transform.xy + _block.transform.zw; + gl_Position = vec4(transform3x2(windowTransform, vec3(p, 0)), 1); + vUV = transform3x2(m3x2(_block.uvTransformR1.xyz, _block.uvTransformR2.xyz), vec3(uv,1)).xy; +} diff --git a/gio/shader/gio/common.h b/gio/shader/gio/common.h new file mode 100644 index 0000000..9b6dc59 --- /dev/null +++ b/gio/shader/gio/common.h @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: Unlicense OR MIT + +struct m3x2 { + vec3 r0; + vec3 r1; +}; + +// fboTransform is the transformation that cancels the implied transformation +// between the clip space and the framebuffer. Only two rows are returned. The +// last is implied to be [0, 0, 1]. +const m3x2 fboTransform = m3x2( +#if defined(LANG_HLSL) || defined(LANG_MSL) || defined(LANG_MSLIOS) + vec3(1.0, 0.0, 0.0), + vec3(0.0, -1.0, 0.0) +#else + vec3(1.0, 0.0, 0.0), + vec3(0.0, 1.0, 0.0) +#endif +); + +// windowTransform is the transformation that cancels the implied transformation +// between framebuffer space and window system coordinates. +const m3x2 windowTransform = m3x2( +#if defined(LANG_VULKAN) + vec3(1.0, 0.0, 0.0), + vec3(0.0, 1.0, 0.0) +#else + vec3(1.0, 0.0, 0.0), + vec3(0.0, -1.0, 0.0) +#endif +); + +vec3 transform3x2(m3x2 t, vec3 v) { + return vec3(dot(t.r0, v), dot(t.r1, v), dot(vec3(0.0, 0.0, 1.0), v)); +} diff --git a/gio/shader/gio/copy.frag b/gio/shader/gio/copy.frag new file mode 100644 index 0000000..048d9e7 --- /dev/null +++ b/gio/shader/gio/copy.frag @@ -0,0 +1,24 @@ +#version 310 es + +// SPDX-License-Identifier: Unlicense OR MIT + +precision mediump float; + +layout(binding = 0) uniform sampler2D tex; + +layout(location = 0) in highp vec2 vUV; + +layout(location = 0) out vec4 fragColor; + +vec3 sRGBtoRGB(vec3 rgb) { + bvec3 cutoff = greaterThanEqual(rgb, vec3(0.04045)); + vec3 below = rgb/vec3(12.92); + vec3 above = pow((rgb + vec3(0.055))/vec3(1.055), vec3(2.4)); + return mix(below, above, cutoff); +} + +void main() { + vec4 texel = texture(tex, vUV); + texel.rgb = sRGBtoRGB(texel.rgb); + fragColor = texel; +} diff --git a/gio/shader/gio/copy.vert b/gio/shader/gio/copy.vert new file mode 100644 index 0000000..c079b96 --- /dev/null +++ b/gio/shader/gio/copy.vert @@ -0,0 +1,26 @@ +#version 310 es + +// SPDX-License-Identifier: Unlicense OR MIT + +#extension GL_GOOGLE_include_directive : enable + +precision highp float; + +#include "common.h" + +layout(push_constant) uniform Block { + vec2 scale; + vec2 pos; + vec2 uvScale; +} _block; + +layout(location = 0) in vec2 pos; +layout(location = 1) in vec2 uv; + +layout(location = 0) out vec2 vUV; + +void main() { + vUV = vec2(uv*_block.uvScale); + vec2 p = vec2(pos*_block.scale + _block.pos); + gl_Position = vec4(transform3x2(windowTransform, vec3(p, 0)), 1); +} diff --git a/gio/shader/gio/cover.frag b/gio/shader/gio/cover.frag new file mode 100644 index 0000000..34c5e4c --- /dev/null +++ b/gio/shader/gio/cover.frag @@ -0,0 +1,20 @@ +#version 310 es + +// SPDX-License-Identifier: Unlicense OR MIT + +precision mediump float; + +{{.Header}} + +layout(location = 0) in highp vec2 vCoverUV; +layout(location = 1) in highp vec2 vUV; + +layout(binding = 1) uniform sampler2D cover; + +layout(location = 0) out vec4 fragColor; + +void main() { + fragColor = {{.FetchColorExpr}}; + float c = min(abs(texture(cover, vCoverUV).r), 1.0); + fragColor *= c; +} diff --git a/gio/shader/gio/cover.vert b/gio/shader/gio/cover.vert new file mode 100644 index 0000000..02fae50 --- /dev/null +++ b/gio/shader/gio/cover.vert @@ -0,0 +1,31 @@ +#version 310 es + +// SPDX-License-Identifier: Unlicense OR MIT + +#extension GL_GOOGLE_include_directive : enable + +precision highp float; + +#include "common.h" + +layout(push_constant) uniform Block { + vec4 transform; + vec4 uvCoverTransform; + vec4 uvTransformR1; + vec4 uvTransformR2; +} _block; + +layout(location = 0) in vec2 pos; + +layout(location = 0) out vec2 vCoverUV; + +layout(location = 1) in vec2 uv; +layout(location = 1) out vec2 vUV; + +void main() { + vec2 p = vec2(pos*_block.transform.xy + _block.transform.zw); + gl_Position = vec4(transform3x2(windowTransform, vec3(p, 0)), 1); + vUV = transform3x2(m3x2(_block.uvTransformR1.xyz, _block.uvTransformR2.xyz), vec3(uv,1)).xy; + vec3 uv3 = vec3(uv, 1.0); + vCoverUV = (uv3*vec3(_block.uvCoverTransform.xy, 1.0)+vec3(_block.uvCoverTransform.zw, 0.0)).xy; +} diff --git a/gio/shader/gio/gen.go b/gio/shader/gio/gen.go new file mode 100644 index 0000000..f26056a --- /dev/null +++ b/gio/shader/gio/gen.go @@ -0,0 +1,5 @@ +// SPDX-License-Identifier: Unlicense OR MIT + +package gio + +//go:generate go run ../cmd/convertshaders -package gio -dir . diff --git a/gio/shader/gio/input.vert b/gio/shader/gio/input.vert new file mode 100644 index 0000000..3d0cd50 --- /dev/null +++ b/gio/shader/gio/input.vert @@ -0,0 +1,15 @@ +#version 310 es + +// SPDX-License-Identifier: Unlicense OR MIT + +#extension GL_GOOGLE_include_directive : enable + +precision highp float; + +#include "common.h" + +layout(location=0) in vec4 position; + +void main() { + gl_Position = vec4(transform3x2(windowTransform, position.xyz), position.w); +} diff --git a/gio/shader/gio/intersect.frag b/gio/shader/gio/intersect.frag new file mode 100644 index 0000000..21a126f --- /dev/null +++ b/gio/shader/gio/intersect.frag @@ -0,0 +1,15 @@ +#version 310 es + +// SPDX-License-Identifier: Unlicense OR MIT + +precision mediump float; + +layout(location = 0) in highp vec2 vUV; + +layout(binding = 0) uniform sampler2D cover; + +layout(location = 0) out vec4 fragColor; + +void main() { + fragColor.r = abs(texture(cover, vUV).r); +} diff --git a/gio/shader/gio/intersect.vert b/gio/shader/gio/intersect.vert new file mode 100644 index 0000000..e7ee2fe --- /dev/null +++ b/gio/shader/gio/intersect.vert @@ -0,0 +1,26 @@ +#version 310 es + +// SPDX-License-Identifier: Unlicense OR MIT + +#extension GL_GOOGLE_include_directive : enable + +precision highp float; + +#include "common.h" + +layout(location = 0) in vec2 pos; +layout(location = 1) in vec2 uv; + +layout(push_constant) uniform Block { + vec4 uvTransform; + vec4 subUVTransform; +} _block; + +layout(location = 0) out vec2 vUV; + +void main() { + vec3 p = transform3x2(fboTransform, vec3(pos, 1.0)); + gl_Position = vec4(p, 1); + vUV = uv.xy*_block.subUVTransform.xy + _block.subUVTransform.zw; + vUV = vUV*_block.uvTransform.xy + _block.uvTransform.zw; +} diff --git a/gio/shader/gio/material.frag b/gio/shader/gio/material.frag new file mode 100644 index 0000000..489461e --- /dev/null +++ b/gio/shader/gio/material.frag @@ -0,0 +1,32 @@ +#version 310 es + +// SPDX-License-Identifier: Unlicense OR MIT + +precision mediump float; + +layout(binding = 0) uniform sampler2D tex; + +layout(location = 0) in highp vec2 vUV; + +layout(location = 0) out vec4 fragColor; + +layout(push_constant) uniform Color { + // If emulateSRGB is set (!= 0), the input texels are sRGB encoded. We save the + // conversion step below, at the cost of texture filtering in sRGB space. + layout(offset=16) float emulateSRGB; +} _color; + +vec3 RGBtosRGB(vec3 rgb) { + bvec3 cutoff = greaterThanEqual(rgb, vec3(0.0031308)); + vec3 below = vec3(12.92)*rgb; + vec3 above = vec3(1.055)*pow(rgb, vec3(0.41666)) - vec3(0.055); + return mix(below, above, cutoff); +} + +void main() { + vec4 texel = texture(tex, vUV); + if (_color.emulateSRGB == 0.0) { + texel.rgb = RGBtosRGB(texel.rgb); + } + fragColor = texel; +} diff --git a/gio/shader/gio/material.vert b/gio/shader/gio/material.vert new file mode 100644 index 0000000..22c41a0 --- /dev/null +++ b/gio/shader/gio/material.vert @@ -0,0 +1,25 @@ +#version 310 es + +// SPDX-License-Identifier: Unlicense OR MIT + +#extension GL_GOOGLE_include_directive : enable + +precision highp float; + +#include "common.h" + +layout(push_constant) uniform Block { + vec2 scale; + vec2 pos; +} _block; + +layout(location = 0) in vec2 pos; +layout(location = 1) in vec2 uv; + +layout(location = 0) out vec2 vUV; + +void main() { + vUV = uv; + vec2 p = vec2(pos*_block.scale + _block.pos); + gl_Position = vec4(transform3x2(fboTransform, vec3(p, 0)), 1); +} diff --git a/gio/shader/gio/shaders.go b/gio/shader/gio/shaders.go new file mode 100644 index 0000000..1166c1c --- /dev/null +++ b/gio/shader/gio/shaders.go @@ -0,0 +1,796 @@ +// Code generated by build.go. DO NOT EDIT. + +package gio + +import ( + _ "embed" + "runtime" + + "gioui.org/shader" +) + +var ( + Shader_blit_frag = [...]shader.Sources{ + { + Name: "blit.frag", + Inputs: []shader.InputLocation{{Name: "vUV", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}}, + Uniforms: shader.UniformsReflection{ + Locations: []shader.UniformLocation{{Name: "_color.color", Type: 0x0, Size: 4, Offset: 112}}, + Size: 16, + }, + }, + { + Name: "blit.frag", + Inputs: []shader.InputLocation{{Name: "vUV", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}}, + Uniforms: shader.UniformsReflection{ + Locations: []shader.UniformLocation{{Name: "_gradient.color1", Type: 0x0, Size: 4, Offset: 96}, {Name: "_gradient.color2", Type: 0x0, Size: 4, Offset: 112}}, + Size: 32, + }, + }, + { + Name: "blit.frag", + Inputs: []shader.InputLocation{{Name: "vUV", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}}, + Textures: []shader.TextureBinding{{Name: "tex", Binding: 0}}, + }, + } + //go:embed zblit.frag.0.spirv + zblit_frag_0_spirv string + //go:embed zblit.frag.0.glsl100es + zblit_frag_0_glsl100es string + //go:embed zblit.frag.0.glsl150 + zblit_frag_0_glsl150 string + //go:embed zblit.frag.0.dxbc + zblit_frag_0_dxbc string + //go:embed zblit.frag.0.metallibmacos + zblit_frag_0_metallibmacos string + //go:embed zblit.frag.0.metallibios + zblit_frag_0_metallibios string + //go:embed zblit.frag.0.metallibiossimulator + zblit_frag_0_metallibiossimulator string + //go:embed zblit.frag.1.spirv + zblit_frag_1_spirv string + //go:embed zblit.frag.1.glsl100es + zblit_frag_1_glsl100es string + //go:embed zblit.frag.1.glsl150 + zblit_frag_1_glsl150 string + //go:embed zblit.frag.1.dxbc + zblit_frag_1_dxbc string + //go:embed zblit.frag.1.metallibmacos + zblit_frag_1_metallibmacos string + //go:embed zblit.frag.1.metallibios + zblit_frag_1_metallibios string + //go:embed zblit.frag.1.metallibiossimulator + zblit_frag_1_metallibiossimulator string + //go:embed zblit.frag.2.spirv + zblit_frag_2_spirv string + //go:embed zblit.frag.2.glsl100es + zblit_frag_2_glsl100es string + //go:embed zblit.frag.2.glsl150 + zblit_frag_2_glsl150 string + //go:embed zblit.frag.2.dxbc + zblit_frag_2_dxbc string + //go:embed zblit.frag.2.metallibmacos + zblit_frag_2_metallibmacos string + //go:embed zblit.frag.2.metallibios + zblit_frag_2_metallibios string + //go:embed zblit.frag.2.metallibiossimulator + zblit_frag_2_metallibiossimulator string + Shader_blit_vert = shader.Sources{ + Name: "blit.vert", + Inputs: []shader.InputLocation{{Name: "pos", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}, {Name: "uv", Location: 1, Semantic: "TEXCOORD", SemanticIndex: 1, Type: 0x0, Size: 2}}, + Uniforms: shader.UniformsReflection{ + Locations: []shader.UniformLocation{{Name: "_block.transform", Type: 0x0, Size: 4, Offset: 0}, {Name: "_block.uvTransformR1", Type: 0x0, Size: 4, Offset: 16}, {Name: "_block.uvTransformR2", Type: 0x0, Size: 4, Offset: 32}}, + Size: 48, + }, + } + //go:embed zblit.vert.0.spirv + zblit_vert_0_spirv string + //go:embed zblit.vert.0.glsl100es + zblit_vert_0_glsl100es string + //go:embed zblit.vert.0.glsl150 + zblit_vert_0_glsl150 string + //go:embed zblit.vert.0.dxbc + zblit_vert_0_dxbc string + //go:embed zblit.vert.0.metallibmacos + zblit_vert_0_metallibmacos string + //go:embed zblit.vert.0.metallibios + zblit_vert_0_metallibios string + //go:embed zblit.vert.0.metallibiossimulator + zblit_vert_0_metallibiossimulator string + Shader_copy_frag = shader.Sources{ + Name: "copy.frag", + Inputs: []shader.InputLocation{{Name: "vUV", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}}, + Textures: []shader.TextureBinding{{Name: "tex", Binding: 0}}, + } + //go:embed zcopy.frag.0.spirv + zcopy_frag_0_spirv string + //go:embed zcopy.frag.0.glsl100es + zcopy_frag_0_glsl100es string + //go:embed zcopy.frag.0.glsl150 + zcopy_frag_0_glsl150 string + //go:embed zcopy.frag.0.dxbc + zcopy_frag_0_dxbc string + //go:embed zcopy.frag.0.metallibmacos + zcopy_frag_0_metallibmacos string + //go:embed zcopy.frag.0.metallibios + zcopy_frag_0_metallibios string + //go:embed zcopy.frag.0.metallibiossimulator + zcopy_frag_0_metallibiossimulator string + Shader_copy_vert = shader.Sources{ + Name: "copy.vert", + Inputs: []shader.InputLocation{{Name: "pos", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}, {Name: "uv", Location: 1, Semantic: "TEXCOORD", SemanticIndex: 1, Type: 0x0, Size: 2}}, + Uniforms: shader.UniformsReflection{ + Locations: []shader.UniformLocation{{Name: "_block.scale", Type: 0x0, Size: 2, Offset: 0}, {Name: "_block.pos", Type: 0x0, Size: 2, Offset: 8}, {Name: "_block.uvScale", Type: 0x0, Size: 2, Offset: 16}}, + Size: 24, + }, + } + //go:embed zcopy.vert.0.spirv + zcopy_vert_0_spirv string + //go:embed zcopy.vert.0.glsl100es + zcopy_vert_0_glsl100es string + //go:embed zcopy.vert.0.glsl150 + zcopy_vert_0_glsl150 string + //go:embed zcopy.vert.0.dxbc + zcopy_vert_0_dxbc string + //go:embed zcopy.vert.0.metallibmacos + zcopy_vert_0_metallibmacos string + //go:embed zcopy.vert.0.metallibios + zcopy_vert_0_metallibios string + //go:embed zcopy.vert.0.metallibiossimulator + zcopy_vert_0_metallibiossimulator string + Shader_cover_frag = [...]shader.Sources{ + { + Name: "cover.frag", + Inputs: []shader.InputLocation{{Name: "vCoverUV", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}, {Name: "vUV", Location: 1, Semantic: "TEXCOORD", SemanticIndex: 1, Type: 0x0, Size: 2}}, + Uniforms: shader.UniformsReflection{ + Locations: []shader.UniformLocation{{Name: "_color.color", Type: 0x0, Size: 4, Offset: 112}}, + Size: 16, + }, + Textures: []shader.TextureBinding{{Name: "cover", Binding: 1}}, + }, + { + Name: "cover.frag", + Inputs: []shader.InputLocation{{Name: "vCoverUV", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}, {Name: "vUV", Location: 1, Semantic: "TEXCOORD", SemanticIndex: 1, Type: 0x0, Size: 2}}, + Uniforms: shader.UniformsReflection{ + Locations: []shader.UniformLocation{{Name: "_gradient.color1", Type: 0x0, Size: 4, Offset: 96}, {Name: "_gradient.color2", Type: 0x0, Size: 4, Offset: 112}}, + Size: 32, + }, + Textures: []shader.TextureBinding{{Name: "cover", Binding: 1}}, + }, + { + Name: "cover.frag", + Inputs: []shader.InputLocation{{Name: "vCoverUV", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}, {Name: "vUV", Location: 1, Semantic: "TEXCOORD", SemanticIndex: 1, Type: 0x0, Size: 2}}, + Textures: []shader.TextureBinding{{Name: "tex", Binding: 0}, {Name: "cover", Binding: 1}}, + }, + } + //go:embed zcover.frag.0.spirv + zcover_frag_0_spirv string + //go:embed zcover.frag.0.glsl100es + zcover_frag_0_glsl100es string + //go:embed zcover.frag.0.glsl150 + zcover_frag_0_glsl150 string + //go:embed zcover.frag.0.dxbc + zcover_frag_0_dxbc string + //go:embed zcover.frag.0.metallibmacos + zcover_frag_0_metallibmacos string + //go:embed zcover.frag.0.metallibios + zcover_frag_0_metallibios string + //go:embed zcover.frag.0.metallibiossimulator + zcover_frag_0_metallibiossimulator string + //go:embed zcover.frag.1.spirv + zcover_frag_1_spirv string + //go:embed zcover.frag.1.glsl100es + zcover_frag_1_glsl100es string + //go:embed zcover.frag.1.glsl150 + zcover_frag_1_glsl150 string + //go:embed zcover.frag.1.dxbc + zcover_frag_1_dxbc string + //go:embed zcover.frag.1.metallibmacos + zcover_frag_1_metallibmacos string + //go:embed zcover.frag.1.metallibios + zcover_frag_1_metallibios string + //go:embed zcover.frag.1.metallibiossimulator + zcover_frag_1_metallibiossimulator string + //go:embed zcover.frag.2.spirv + zcover_frag_2_spirv string + //go:embed zcover.frag.2.glsl100es + zcover_frag_2_glsl100es string + //go:embed zcover.frag.2.glsl150 + zcover_frag_2_glsl150 string + //go:embed zcover.frag.2.dxbc + zcover_frag_2_dxbc string + //go:embed zcover.frag.2.metallibmacos + zcover_frag_2_metallibmacos string + //go:embed zcover.frag.2.metallibios + zcover_frag_2_metallibios string + //go:embed zcover.frag.2.metallibiossimulator + zcover_frag_2_metallibiossimulator string + Shader_cover_vert = shader.Sources{ + Name: "cover.vert", + Inputs: []shader.InputLocation{{Name: "pos", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}, {Name: "uv", Location: 1, Semantic: "TEXCOORD", SemanticIndex: 1, Type: 0x0, Size: 2}}, + Uniforms: shader.UniformsReflection{ + Locations: []shader.UniformLocation{{Name: "_block.transform", Type: 0x0, Size: 4, Offset: 0}, {Name: "_block.uvCoverTransform", Type: 0x0, Size: 4, Offset: 16}, {Name: "_block.uvTransformR1", Type: 0x0, Size: 4, Offset: 32}, {Name: "_block.uvTransformR2", Type: 0x0, Size: 4, Offset: 48}}, + Size: 64, + }, + } + //go:embed zcover.vert.0.spirv + zcover_vert_0_spirv string + //go:embed zcover.vert.0.glsl100es + zcover_vert_0_glsl100es string + //go:embed zcover.vert.0.glsl150 + zcover_vert_0_glsl150 string + //go:embed zcover.vert.0.dxbc + zcover_vert_0_dxbc string + //go:embed zcover.vert.0.metallibmacos + zcover_vert_0_metallibmacos string + //go:embed zcover.vert.0.metallibios + zcover_vert_0_metallibios string + //go:embed zcover.vert.0.metallibiossimulator + zcover_vert_0_metallibiossimulator string + Shader_input_vert = shader.Sources{ + Name: "input.vert", + Inputs: []shader.InputLocation{{Name: "position", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 4}}, + } + //go:embed zinput.vert.0.spirv + zinput_vert_0_spirv string + //go:embed zinput.vert.0.glsl100es + zinput_vert_0_glsl100es string + //go:embed zinput.vert.0.glsl150 + zinput_vert_0_glsl150 string + //go:embed zinput.vert.0.dxbc + zinput_vert_0_dxbc string + //go:embed zinput.vert.0.metallibmacos + zinput_vert_0_metallibmacos string + //go:embed zinput.vert.0.metallibios + zinput_vert_0_metallibios string + //go:embed zinput.vert.0.metallibiossimulator + zinput_vert_0_metallibiossimulator string + Shader_intersect_frag = shader.Sources{ + Name: "intersect.frag", + Inputs: []shader.InputLocation{{Name: "vUV", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}}, + Textures: []shader.TextureBinding{{Name: "cover", Binding: 0}}, + } + //go:embed zintersect.frag.0.spirv + zintersect_frag_0_spirv string + //go:embed zintersect.frag.0.glsl100es + zintersect_frag_0_glsl100es string + //go:embed zintersect.frag.0.glsl150 + zintersect_frag_0_glsl150 string + //go:embed zintersect.frag.0.dxbc + zintersect_frag_0_dxbc string + //go:embed zintersect.frag.0.metallibmacos + zintersect_frag_0_metallibmacos string + //go:embed zintersect.frag.0.metallibios + zintersect_frag_0_metallibios string + //go:embed zintersect.frag.0.metallibiossimulator + zintersect_frag_0_metallibiossimulator string + Shader_intersect_vert = shader.Sources{ + Name: "intersect.vert", + Inputs: []shader.InputLocation{{Name: "pos", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}, {Name: "uv", Location: 1, Semantic: "TEXCOORD", SemanticIndex: 1, Type: 0x0, Size: 2}}, + Uniforms: shader.UniformsReflection{ + Locations: []shader.UniformLocation{{Name: "_block.uvTransform", Type: 0x0, Size: 4, Offset: 0}, {Name: "_block.subUVTransform", Type: 0x0, Size: 4, Offset: 16}}, + Size: 32, + }, + } + //go:embed zintersect.vert.0.spirv + zintersect_vert_0_spirv string + //go:embed zintersect.vert.0.glsl100es + zintersect_vert_0_glsl100es string + //go:embed zintersect.vert.0.glsl150 + zintersect_vert_0_glsl150 string + //go:embed zintersect.vert.0.dxbc + zintersect_vert_0_dxbc string + //go:embed zintersect.vert.0.metallibmacos + zintersect_vert_0_metallibmacos string + //go:embed zintersect.vert.0.metallibios + zintersect_vert_0_metallibios string + //go:embed zintersect.vert.0.metallibiossimulator + zintersect_vert_0_metallibiossimulator string + Shader_material_frag = shader.Sources{ + Name: "material.frag", + Inputs: []shader.InputLocation{{Name: "vUV", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}}, + Uniforms: shader.UniformsReflection{ + Locations: []shader.UniformLocation{{Name: "_color.emulateSRGB", Type: 0x0, Size: 1, Offset: 16}}, + Size: 4, + }, + Textures: []shader.TextureBinding{{Name: "tex", Binding: 0}}, + } + //go:embed zmaterial.frag.0.spirv + zmaterial_frag_0_spirv string + //go:embed zmaterial.frag.0.glsl100es + zmaterial_frag_0_glsl100es string + //go:embed zmaterial.frag.0.glsl150 + zmaterial_frag_0_glsl150 string + //go:embed zmaterial.frag.0.dxbc + zmaterial_frag_0_dxbc string + //go:embed zmaterial.frag.0.metallibmacos + zmaterial_frag_0_metallibmacos string + //go:embed zmaterial.frag.0.metallibios + zmaterial_frag_0_metallibios string + //go:embed zmaterial.frag.0.metallibiossimulator + zmaterial_frag_0_metallibiossimulator string + Shader_material_vert = shader.Sources{ + Name: "material.vert", + Inputs: []shader.InputLocation{{Name: "pos", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}, {Name: "uv", Location: 1, Semantic: "TEXCOORD", SemanticIndex: 1, Type: 0x0, Size: 2}}, + Uniforms: shader.UniformsReflection{ + Locations: []shader.UniformLocation{{Name: "_block.scale", Type: 0x0, Size: 2, Offset: 0}, {Name: "_block.pos", Type: 0x0, Size: 2, Offset: 8}}, + Size: 16, + }, + } + //go:embed zmaterial.vert.0.spirv + zmaterial_vert_0_spirv string + //go:embed zmaterial.vert.0.glsl100es + zmaterial_vert_0_glsl100es string + //go:embed zmaterial.vert.0.glsl150 + zmaterial_vert_0_glsl150 string + //go:embed zmaterial.vert.0.dxbc + zmaterial_vert_0_dxbc string + //go:embed zmaterial.vert.0.metallibmacos + zmaterial_vert_0_metallibmacos string + //go:embed zmaterial.vert.0.metallibios + zmaterial_vert_0_metallibios string + //go:embed zmaterial.vert.0.metallibiossimulator + zmaterial_vert_0_metallibiossimulator string + Shader_simple_frag = shader.Sources{ + Name: "simple.frag", + } + //go:embed zsimple.frag.0.spirv + zsimple_frag_0_spirv string + //go:embed zsimple.frag.0.glsl100es + zsimple_frag_0_glsl100es string + //go:embed zsimple.frag.0.glsl150 + zsimple_frag_0_glsl150 string + //go:embed zsimple.frag.0.dxbc + zsimple_frag_0_dxbc string + //go:embed zsimple.frag.0.metallibmacos + zsimple_frag_0_metallibmacos string + //go:embed zsimple.frag.0.metallibios + zsimple_frag_0_metallibios string + //go:embed zsimple.frag.0.metallibiossimulator + zsimple_frag_0_metallibiossimulator string + Shader_stencil_frag = shader.Sources{ + Name: "stencil.frag", + Inputs: []shader.InputLocation{{Name: "vFrom", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 2}, {Name: "vCtrl", Location: 1, Semantic: "TEXCOORD", SemanticIndex: 1, Type: 0x0, Size: 2}, {Name: "vTo", Location: 2, Semantic: "TEXCOORD", SemanticIndex: 2, Type: 0x0, Size: 2}}, + } + //go:embed zstencil.frag.0.spirv + zstencil_frag_0_spirv string + //go:embed zstencil.frag.0.glsl100es + zstencil_frag_0_glsl100es string + //go:embed zstencil.frag.0.glsl150 + zstencil_frag_0_glsl150 string + //go:embed zstencil.frag.0.dxbc + zstencil_frag_0_dxbc string + //go:embed zstencil.frag.0.metallibmacos + zstencil_frag_0_metallibmacos string + //go:embed zstencil.frag.0.metallibios + zstencil_frag_0_metallibios string + //go:embed zstencil.frag.0.metallibiossimulator + zstencil_frag_0_metallibiossimulator string + Shader_stencil_vert = shader.Sources{ + Name: "stencil.vert", + Inputs: []shader.InputLocation{{Name: "corner", Location: 0, Semantic: "TEXCOORD", SemanticIndex: 0, Type: 0x0, Size: 1}, {Name: "maxy", Location: 1, Semantic: "TEXCOORD", SemanticIndex: 1, Type: 0x0, Size: 1}, {Name: "from", Location: 2, Semantic: "TEXCOORD", SemanticIndex: 2, Type: 0x0, Size: 2}, {Name: "ctrl", Location: 3, Semantic: "TEXCOORD", SemanticIndex: 3, Type: 0x0, Size: 2}, {Name: "to", Location: 4, Semantic: "TEXCOORD", SemanticIndex: 4, Type: 0x0, Size: 2}}, + Uniforms: shader.UniformsReflection{ + Locations: []shader.UniformLocation{{Name: "_block.transform", Type: 0x0, Size: 4, Offset: 0}, {Name: "_block.pathOffset", Type: 0x0, Size: 2, Offset: 16}}, + Size: 24, + }, + } + //go:embed zstencil.vert.0.spirv + zstencil_vert_0_spirv string + //go:embed zstencil.vert.0.glsl100es + zstencil_vert_0_glsl100es string + //go:embed zstencil.vert.0.glsl150 + zstencil_vert_0_glsl150 string + //go:embed zstencil.vert.0.dxbc + zstencil_vert_0_dxbc string + //go:embed zstencil.vert.0.metallibmacos + zstencil_vert_0_metallibmacos string + //go:embed zstencil.vert.0.metallibios + zstencil_vert_0_metallibios string + //go:embed zstencil.vert.0.metallibiossimulator + zstencil_vert_0_metallibiossimulator string +) + +func init() { + const ( + opengles = runtime.GOOS == "linux" || runtime.GOOS == "freebsd" || runtime.GOOS == "openbsd" || runtime.GOOS == "windows" || runtime.GOOS == "js" || runtime.GOOS == "android" || runtime.GOOS == "darwin" || runtime.GOOS == "ios" + opengl = runtime.GOOS == "darwin" + d3d11 = runtime.GOOS == "windows" + vulkan = runtime.GOOS == "linux" || runtime.GOOS == "android" + ) + if vulkan { + Shader_blit_frag[0].SPIRV = zblit_frag_0_spirv + } + if opengles { + Shader_blit_frag[0].GLSL100ES = zblit_frag_0_glsl100es + } + if opengl { + Shader_blit_frag[0].GLSL150 = zblit_frag_0_glsl150 + } + if d3d11 { + Shader_blit_frag[0].DXBC = zblit_frag_0_dxbc + } + if runtime.GOOS == "darwin" { + Shader_blit_frag[0].MetalLib = zblit_frag_0_metallibmacos + } + if runtime.GOOS == "ios" { + if runtime.GOARCH == "amd64" { + Shader_blit_frag[0].MetalLib = zblit_frag_0_metallibiossimulator + } else { + Shader_blit_frag[0].MetalLib = zblit_frag_0_metallibios + } + } + if vulkan { + Shader_blit_frag[1].SPIRV = zblit_frag_1_spirv + } + if opengles { + Shader_blit_frag[1].GLSL100ES = zblit_frag_1_glsl100es + } + if opengl { + Shader_blit_frag[1].GLSL150 = zblit_frag_1_glsl150 + } + if d3d11 { + Shader_blit_frag[1].DXBC = zblit_frag_1_dxbc + } + if runtime.GOOS == "darwin" { + Shader_blit_frag[1].MetalLib = zblit_frag_1_metallibmacos + } + if runtime.GOOS == "ios" { + if runtime.GOARCH == "amd64" { + Shader_blit_frag[1].MetalLib = zblit_frag_1_metallibiossimulator + } else { + Shader_blit_frag[1].MetalLib = zblit_frag_1_metallibios + } + } + if vulkan { + Shader_blit_frag[2].SPIRV = zblit_frag_2_spirv + } + if opengles { + Shader_blit_frag[2].GLSL100ES = zblit_frag_2_glsl100es + } + if opengl { + Shader_blit_frag[2].GLSL150 = zblit_frag_2_glsl150 + } + if d3d11 { + Shader_blit_frag[2].DXBC = zblit_frag_2_dxbc + } + if runtime.GOOS == "darwin" { + Shader_blit_frag[2].MetalLib = zblit_frag_2_metallibmacos + } + if runtime.GOOS == "ios" { + if runtime.GOARCH == "amd64" { + Shader_blit_frag[2].MetalLib = zblit_frag_2_metallibiossimulator + } else { + Shader_blit_frag[2].MetalLib = zblit_frag_2_metallibios + } + } + if vulkan { + Shader_blit_vert.SPIRV = zblit_vert_0_spirv + } + if opengles { + Shader_blit_vert.GLSL100ES = zblit_vert_0_glsl100es + } + if opengl { + Shader_blit_vert.GLSL150 = zblit_vert_0_glsl150 + } + if d3d11 { + Shader_blit_vert.DXBC = zblit_vert_0_dxbc + } + if runtime.GOOS == "darwin" { + Shader_blit_vert.MetalLib = zblit_vert_0_metallibmacos + } + if runtime.GOOS == "ios" { + if runtime.GOARCH == "amd64" { + Shader_blit_vert.MetalLib = zblit_vert_0_metallibiossimulator + } else { + Shader_blit_vert.MetalLib = zblit_vert_0_metallibios + } + } + if vulkan { + Shader_copy_frag.SPIRV = zcopy_frag_0_spirv + } + if opengles { + Shader_copy_frag.GLSL100ES = zcopy_frag_0_glsl100es + } + if opengl { + Shader_copy_frag.GLSL150 = zcopy_frag_0_glsl150 + } + if d3d11 { + Shader_copy_frag.DXBC = zcopy_frag_0_dxbc + } + if runtime.GOOS == "darwin" { + Shader_copy_frag.MetalLib = zcopy_frag_0_metallibmacos + } + if runtime.GOOS == "ios" { + if runtime.GOARCH == "amd64" { + Shader_copy_frag.MetalLib = zcopy_frag_0_metallibiossimulator + } else { + Shader_copy_frag.MetalLib = zcopy_frag_0_metallibios + } + } + if vulkan { + Shader_copy_vert.SPIRV = zcopy_vert_0_spirv + } + if opengles { + Shader_copy_vert.GLSL100ES = zcopy_vert_0_glsl100es + } + if opengl { + Shader_copy_vert.GLSL150 = zcopy_vert_0_glsl150 + } + if d3d11 { + Shader_copy_vert.DXBC = zcopy_vert_0_dxbc + } + if runtime.GOOS == "darwin" { + Shader_copy_vert.MetalLib = zcopy_vert_0_metallibmacos + } + if runtime.GOOS == "ios" { + if runtime.GOARCH == "amd64" { + Shader_copy_vert.MetalLib = zcopy_vert_0_metallibiossimulator + } else { + Shader_copy_vert.MetalLib = zcopy_vert_0_metallibios + } + } + if vulkan { + Shader_cover_frag[0].SPIRV = zcover_frag_0_spirv + } + if opengles { + Shader_cover_frag[0].GLSL100ES = zcover_frag_0_glsl100es + } + if opengl { + Shader_cover_frag[0].GLSL150 = zcover_frag_0_glsl150 + } + if d3d11 { + Shader_cover_frag[0].DXBC = zcover_frag_0_dxbc + } + if runtime.GOOS == "darwin" { + Shader_cover_frag[0].MetalLib = zcover_frag_0_metallibmacos + } + if runtime.GOOS == "ios" { + if runtime.GOARCH == "amd64" { + Shader_cover_frag[0].MetalLib = zcover_frag_0_metallibiossimulator + } else { + Shader_cover_frag[0].MetalLib = zcover_frag_0_metallibios + } + } + if vulkan { + Shader_cover_frag[1].SPIRV = zcover_frag_1_spirv + } + if opengles { + Shader_cover_frag[1].GLSL100ES = zcover_frag_1_glsl100es + } + if opengl { + Shader_cover_frag[1].GLSL150 = zcover_frag_1_glsl150 + } + if d3d11 { + Shader_cover_frag[1].DXBC = zcover_frag_1_dxbc + } + if runtime.GOOS == "darwin" { + Shader_cover_frag[1].MetalLib = zcover_frag_1_metallibmacos + } + if runtime.GOOS == "ios" { + if runtime.GOARCH == "amd64" { + Shader_cover_frag[1].MetalLib = zcover_frag_1_metallibiossimulator + } else { + Shader_cover_frag[1].MetalLib = zcover_frag_1_metallibios + } + } + if vulkan { + Shader_cover_frag[2].SPIRV = zcover_frag_2_spirv + } + if opengles { + Shader_cover_frag[2].GLSL100ES = zcover_frag_2_glsl100es + } + if opengl { + Shader_cover_frag[2].GLSL150 = zcover_frag_2_glsl150 + } + if d3d11 { + Shader_cover_frag[2].DXBC = zcover_frag_2_dxbc + } + if runtime.GOOS == "darwin" { + Shader_cover_frag[2].MetalLib = zcover_frag_2_metallibmacos + } + if runtime.GOOS == "ios" { + if runtime.GOARCH == "amd64" { + Shader_cover_frag[2].MetalLib = zcover_frag_2_metallibiossimulator + } else { + Shader_cover_frag[2].MetalLib = zcover_frag_2_metallibios + } + } + if vulkan { + Shader_cover_vert.SPIRV = zcover_vert_0_spirv + } + if opengles { + Shader_cover_vert.GLSL100ES = zcover_vert_0_glsl100es + } + if opengl { + Shader_cover_vert.GLSL150 = zcover_vert_0_glsl150 + } + if d3d11 { + Shader_cover_vert.DXBC = zcover_vert_0_dxbc + } + if runtime.GOOS == "darwin" { + Shader_cover_vert.MetalLib = zcover_vert_0_metallibmacos + } + if runtime.GOOS == "ios" { + if runtime.GOARCH == "amd64" { + Shader_cover_vert.MetalLib = zcover_vert_0_metallibiossimulator + } else { + Shader_cover_vert.MetalLib = zcover_vert_0_metallibios + } + } + if vulkan { + Shader_input_vert.SPIRV = zinput_vert_0_spirv + } + if opengles { + Shader_input_vert.GLSL100ES = zinput_vert_0_glsl100es + } + if opengl { + Shader_input_vert.GLSL150 = zinput_vert_0_glsl150 + } + if d3d11 { + Shader_input_vert.DXBC = zinput_vert_0_dxbc + } + if runtime.GOOS == "darwin" { + Shader_input_vert.MetalLib = zinput_vert_0_metallibmacos + } + if runtime.GOOS == "ios" { + if runtime.GOARCH == "amd64" { + Shader_input_vert.MetalLib = zinput_vert_0_metallibiossimulator + } else { + Shader_input_vert.MetalLib = zinput_vert_0_metallibios + } + } + if vulkan { + Shader_intersect_frag.SPIRV = zintersect_frag_0_spirv + } + if opengles { + Shader_intersect_frag.GLSL100ES = zintersect_frag_0_glsl100es + } + if opengl { + Shader_intersect_frag.GLSL150 = zintersect_frag_0_glsl150 + } + if d3d11 { + Shader_intersect_frag.DXBC = zintersect_frag_0_dxbc + } + if runtime.GOOS == "darwin" { + Shader_intersect_frag.MetalLib = zintersect_frag_0_metallibmacos + } + if runtime.GOOS == "ios" { + if runtime.GOARCH == "amd64" { + Shader_intersect_frag.MetalLib = zintersect_frag_0_metallibiossimulator + } else { + Shader_intersect_frag.MetalLib = zintersect_frag_0_metallibios + } + } + if vulkan { + Shader_intersect_vert.SPIRV = zintersect_vert_0_spirv + } + if opengles { + Shader_intersect_vert.GLSL100ES = zintersect_vert_0_glsl100es + } + if opengl { + Shader_intersect_vert.GLSL150 = zintersect_vert_0_glsl150 + } + if d3d11 { + Shader_intersect_vert.DXBC = zintersect_vert_0_dxbc + } + if runtime.GOOS == "darwin" { + Shader_intersect_vert.MetalLib = zintersect_vert_0_metallibmacos + } + if runtime.GOOS == "ios" { + if runtime.GOARCH == "amd64" { + Shader_intersect_vert.MetalLib = zintersect_vert_0_metallibiossimulator + } else { + Shader_intersect_vert.MetalLib = zintersect_vert_0_metallibios + } + } + if vulkan { + Shader_material_frag.SPIRV = zmaterial_frag_0_spirv + } + if opengles { + Shader_material_frag.GLSL100ES = zmaterial_frag_0_glsl100es + } + if opengl { + Shader_material_frag.GLSL150 = zmaterial_frag_0_glsl150 + } + if d3d11 { + Shader_material_frag.DXBC = zmaterial_frag_0_dxbc + } + if runtime.GOOS == "darwin" { + Shader_material_frag.MetalLib = zmaterial_frag_0_metallibmacos + } + if runtime.GOOS == "ios" { + if runtime.GOARCH == "amd64" { + Shader_material_frag.MetalLib = zmaterial_frag_0_metallibiossimulator + } else { + Shader_material_frag.MetalLib = zmaterial_frag_0_metallibios + } + } + if vulkan { + Shader_material_vert.SPIRV = zmaterial_vert_0_spirv + } + if opengles { + Shader_material_vert.GLSL100ES = zmaterial_vert_0_glsl100es + } + if opengl { + Shader_material_vert.GLSL150 = zmaterial_vert_0_glsl150 + } + if d3d11 { + Shader_material_vert.DXBC = zmaterial_vert_0_dxbc + } + if runtime.GOOS == "darwin" { + Shader_material_vert.MetalLib = zmaterial_vert_0_metallibmacos + } + if runtime.GOOS == "ios" { + if runtime.GOARCH == "amd64" { + Shader_material_vert.MetalLib = zmaterial_vert_0_metallibiossimulator + } else { + Shader_material_vert.MetalLib = zmaterial_vert_0_metallibios + } + } + if vulkan { + Shader_simple_frag.SPIRV = zsimple_frag_0_spirv + } + if opengles { + Shader_simple_frag.GLSL100ES = zsimple_frag_0_glsl100es + } + if opengl { + Shader_simple_frag.GLSL150 = zsimple_frag_0_glsl150 + } + if d3d11 { + Shader_simple_frag.DXBC = zsimple_frag_0_dxbc + } + if runtime.GOOS == "darwin" { + Shader_simple_frag.MetalLib = zsimple_frag_0_metallibmacos + } + if runtime.GOOS == "ios" { + if runtime.GOARCH == "amd64" { + Shader_simple_frag.MetalLib = zsimple_frag_0_metallibiossimulator + } else { + Shader_simple_frag.MetalLib = zsimple_frag_0_metallibios + } + } + if vulkan { + Shader_stencil_frag.SPIRV = zstencil_frag_0_spirv + } + if opengles { + Shader_stencil_frag.GLSL100ES = zstencil_frag_0_glsl100es + } + if opengl { + Shader_stencil_frag.GLSL150 = zstencil_frag_0_glsl150 + } + if d3d11 { + Shader_stencil_frag.DXBC = zstencil_frag_0_dxbc + } + if runtime.GOOS == "darwin" { + Shader_stencil_frag.MetalLib = zstencil_frag_0_metallibmacos + } + if runtime.GOOS == "ios" { + if runtime.GOARCH == "amd64" { + Shader_stencil_frag.MetalLib = zstencil_frag_0_metallibiossimulator + } else { + Shader_stencil_frag.MetalLib = zstencil_frag_0_metallibios + } + } + if vulkan { + Shader_stencil_vert.SPIRV = zstencil_vert_0_spirv + } + if opengles { + Shader_stencil_vert.GLSL100ES = zstencil_vert_0_glsl100es + } + if opengl { + Shader_stencil_vert.GLSL150 = zstencil_vert_0_glsl150 + } + if d3d11 { + Shader_stencil_vert.DXBC = zstencil_vert_0_dxbc + } + if runtime.GOOS == "darwin" { + Shader_stencil_vert.MetalLib = zstencil_vert_0_metallibmacos + } + if runtime.GOOS == "ios" { + if runtime.GOARCH == "amd64" { + Shader_stencil_vert.MetalLib = zstencil_vert_0_metallibiossimulator + } else { + Shader_stencil_vert.MetalLib = zstencil_vert_0_metallibios + } + } +} diff --git a/gio/shader/gio/simple.frag b/gio/shader/gio/simple.frag new file mode 100644 index 0000000..4614f33 --- /dev/null +++ b/gio/shader/gio/simple.frag @@ -0,0 +1,11 @@ +#version 310 es + +// SPDX-License-Identifier: Unlicense OR MIT + +precision mediump float; + +layout(location = 0) out vec4 fragColor; + +void main() { + fragColor = vec4(.25, .55, .75, 1.0); +} diff --git a/gio/shader/gio/stencil.frag b/gio/shader/gio/stencil.frag new file mode 100644 index 0000000..956dae8 --- /dev/null +++ b/gio/shader/gio/stencil.frag @@ -0,0 +1,81 @@ +#version 310 es + +// SPDX-License-Identifier: Unlicense OR MIT + +precision mediump float; + +layout(location=0) in highp vec2 vFrom; +layout(location=1) in highp vec2 vCtrl; +layout(location=2) in highp vec2 vTo; + +layout(location = 0) out vec4 fragCover; + +void main() { + float dx = vTo.x - vFrom.x; + // Sort from and to in increasing order so the root below + // is always the positive square root, if any. + // We need the direction of the curve below, so this can't be + // done from the vertex shader. + bool increasing = vTo.x >= vFrom.x; + vec2 left = increasing ? vFrom : vTo; + vec2 right = increasing ? vTo : vFrom; + + // The signed horizontal extent of the fragment. + vec2 extent = clamp(vec2(vFrom.x, vTo.x), -0.5, 0.5); + // Find the t where the curve crosses the middle of the + // extent, x₀. + // Given the Bézier curve with x coordinates P₀, P₁, P₂ + // where P₀ is at the origin, its x coordinate in t + // is given by: + // + // x(t) = 2(1-t)tP₁ + t²P₂ + // + // Rearranging: + // + // x(t) = (P₂ - 2P₁)t² + 2P₁t + // + // Setting x(t) = x₀ and using Muller's quadratic formula ("Citardauq") + // for robustnesss, + // + // t = 2x₀/(2P₁±√(4P₁²+4(P₂-2P₁)x₀)) + // + // which simplifies to + // + // t = x₀/(P₁±√(P₁²+(P₂-2P₁)x₀)) + // + // Setting v = P₂-P₁, + // + // t = x₀/(P₁±√(P₁²+(v-P₁)x₀)) + // + // t lie in [0; 1]; P₂ ≥ P₁ and P₁ ≥ 0 since we split curves where + // the control point lies before the start point or after the end point. + // It can then be shown that only the positive square root is valid. + float midx = mix(extent.x, extent.y, 0.5); + float x0 = midx - left.x; + vec2 p1 = vCtrl - left; + vec2 v = right - vCtrl; + float t = x0/(p1.x+sqrt(p1.x*p1.x+(v.x-p1.x)*x0)); + // Find y(t) on the curve. + float y = mix(mix(left.y, vCtrl.y, t), mix(vCtrl.y, right.y, t), t); + // And the slope. + vec2 d_half = mix(p1, v, t); + float dy = d_half.y/d_half.x; + // Together, y and dy form a line approximation. + + // Compute the fragment area above the line. + // The area is symmetric around dy = 0. Scale slope with extent width. + float width = extent.y - extent.x; + dy = abs(dy*width); + + vec4 sides = vec4(dy*+0.5 + y, dy*-0.5 + y, (+0.5-y)/dy, (-0.5-y)/dy); + sides = clamp(sides+0.5, 0.0, 1.0); + + float area = 0.5*(sides.z - sides.z*sides.y + 1.0 - sides.x+sides.x*sides.w); + area *= width; + + // Work around issue #13. + if (width == 0.0) + area = 0.0; + + fragCover.r = area; +} diff --git a/gio/shader/gio/stencil.vert b/gio/shader/gio/stencil.vert new file mode 100644 index 0000000..fd6f28b --- /dev/null +++ b/gio/shader/gio/stencil.vert @@ -0,0 +1,57 @@ +#version 310 es + +// SPDX-License-Identifier: Unlicense OR MIT + +#extension GL_GOOGLE_include_directive : enable + +precision highp float; + +#include "common.h" + +layout(push_constant) uniform Block { + vec4 transform; + vec2 pathOffset; +} _block; + +layout(location=0) in float corner; +layout(location=1) in float maxy; +layout(location=2) in vec2 from; +layout(location=3) in vec2 ctrl; +layout(location=4) in vec2 to; + +layout(location=0) out vec2 vFrom; +layout(location=1) out vec2 vCtrl; +layout(location=2) out vec2 vTo; + +void main() { + // Add a one pixel overlap so curve quads cover their + // entire curves. Could use conservative rasterization + // if available. + vec2 from = from + _block.pathOffset; + vec2 ctrl = ctrl + _block.pathOffset; + vec2 to = to + _block.pathOffset; + float maxy = maxy + _block.pathOffset.y; + vec2 pos; + float c = corner; + if (c >= 0.375) { + // North. + c -= 0.5; + pos.y = maxy + 1.0; + } else { + // South. + pos.y = min(min(from.y, ctrl.y), to.y) - 1.0; + } + if (c >= 0.125) { + // East. + pos.x = max(max(from.x, ctrl.x), to.x)+1.0; + } else { + // West. + pos.x = min(min(from.x, ctrl.x), to.x)-1.0; + } + vFrom = from-pos; + vCtrl = ctrl-pos; + vTo = to-pos; + pos = pos*_block.transform.xy + _block.transform.zw; + gl_Position = vec4(transform3x2(fboTransform, vec3(pos, 0)), 1); +} + diff --git a/gio/shader/gio/zblit.frag.0.dxbc b/gio/shader/gio/zblit.frag.0.dxbc new file mode 100644 index 0000000000000000000000000000000000000000..45e8355fe0e3e9b4012265f39006ef1e56946cdd GIT binary patch literal 628 zcma)&Jxjw-6oyYeupNXtbW`LGf(k|2MHEC@lhz2;LK38cP)dzjsNNDYIuz{e*KNXTzu7tDAI{$ z;5Wb+yZ{G&srCNDQ_o}Iuswap1HdcFn&5xjQyv(w_Y36sFHU1-}?RV{Z;|c%Z zetr}73xG`A5WyYf7RP^>+F{9o3@MJek8{Uh1eEdJhJas!?>Gi*ogNQPz8H@+GB9sW ziumsLd!f9Nr;%83SB2B`n!-Epo&=$=E(+tyic5k9Lzh4dF&{YY zBqaJ`O`T}9#*dCke&KYoWJt>kV37ue#}uw@9x5^1GL;v+djr@ByA>XIZ0c(X$#B^Zig3hbkTAOvm4x29@e42dhw8p zmtiWAt^B&%#29!Vc2C+v`I@l3NfdaHV0^jfo=EGW-)CE04BTL zNduG_#XwmniL%JiablzwPe}0*fI^bElo)kMqDsj~7d|W{Mp#{#<73*4xHdb(#KEJj zg|ysB+o~{I7j5>_@XlHA=vGL`Q(*iE$zs#3L?A9DG;c zPx|m!5Kp8GJp-fV$lC#Ycvw5Q|I&#(_vi@(6O_k^n2TXDJWhmMFFcYjSD|ISX|>A5 zP7b63dJ}Sj`FUh}6zCv1lasO~ymWHseopq1a~>ETd4m3&ERENf;qhohB}FLA<7nN1 zrHZW9!$&^yW)+-mU-+6T?MqT6%~ASVN$p|8pWrEUBB`j7F@dswZ>qu^-Rw06H{(7e z1DuGRc6iw(rqn%b%6mM>oq`lpU>#b_lA0L(0!T_b+=JYIII)h@%{P=l zt#CKVkbf}_a;HU@gTy*WY!4`>Mo=?XGrqhSL9Lp3tK+4SK|`2X!GN1cCO$Ju*`)`*UOzUng7bD?MT7qSVZ2*?6&_+uKj&J$U%n`uT@Gl3kc*Vv*@ zgoYCJk@(2i&~UUq7Me)j7zrf@Z$w8!{ln2J?#pjBnRP~e{Gd+Oap|!w;p|?-zWNRbZQb zyzt(ZNWW&qWJ~hhZ#NuXzxC9aLt8&MS$7gY+r7GU(Zw}IpUP&uU(ZlzY1^T*G`F=j zG`H^5+t7v(RW{Szn{0LGSWE7;BNx_w*sRN z7HyZ*Ke%6i>NmL;z|0A%=hKzf%CBC!Kz(+(=t?Ts3)O8cZRXWCBJtsPqJX!aQdWD? zJ7pSCPGe_RPBw=VAPXZLWoZF#{v};+XN#I_5mUy83cmP?k>|}+UX)UD{N`uUgO^%( zgIf0`UBj|{+V1?naGQ55{_}%wY%@FhNiVv1?6>M}Zr*_vnZt^uuJpJ2BTe@whNdgG z+}twJ7+GkQ7w04Q&s$oo#ud$QV3wLrDwzeLYy4F~@rmgPdA`WKITaUO>#jYzUHS&A z-rNrHsp(vm%mF>w^gZs0$d>6JxNk7(#d^{$ques)6*$FRMg}rX4yl&PIi@8S@tk=7 zINp@Qs_?2yJYk>8i8<_0t#|V$knmfP;F(iU#8*i|eZ-w0-bBqysk!rF?1}+(g^yhk zv-_aB@8w~RDyY*~hly>q(#(}lnCi0P1M1% z>+Z5ab?Iex`E_@>hg}w%%CTy(y#}n<03`}5cG4y&*jmgAjpfIA0Bdv74Lo|cIMvMp zuH{ds1W(5VKlBPFDR$!kQ>14~H9o4tqqEI~d(W>f9Z;7BQsdQd$uV__mtA%&yb_H5 z)LHfwyR19Rzu8Qiw$f&k+hSk}qy?H}7oB^jM)(v7|5+_a_yvy?!f{eC30{ze#AqM1 zT*;6WhYmS9hC|1A!jd$JHA%{Hm+;D|Z I{D0Sf01ytSfB*mh literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zblit.frag.0.metallibiossimulator b/gio/shader/gio/zblit.frag.0.metallibiossimulator new file mode 100644 index 0000000000000000000000000000000000000000..d8d2589dc60a9b11b1dbfe00a2cfe647d3302e81 GIT binary patch literal 3057 zcmZuze^67&9p4bhdrC-x(i6+e^9AtCoq{2;2p5=1h#;s~s9fuLcE|&QiAR3$@&pol zZ9?!~wAAK2|HxduX)@<^=yYy|)|=DoIUPvUQW`C#PKQ#;z=({s=y2Eb#?IWd{q75R zaP1~CQ6r2veWI+75ellf2Ac?+JAk8mPpc!<&EhU zlX&i7b7QRxIa!BGhgx1~s+Ax~z4=HzgI?UG_??d)-laMC<3~d~o~txJxx^m}pMN}@ zed`B#28I2bb#*QIXXsp%jFcby zcjJNR$GLYc{DT|yHR1Y5 z9%HEszlXN!Ycd-Yk=()?P3Gp{;C$%*xlB!+tQi~*fzE=|_NN$!Bp@|qyx2y~n(2i& zbt_0uX|_$9=-D_u6Qst2)O3KF9Hl3rAJ19T&L&%>DwO979xIFzBUB=&UW`+yUp>y!i}9Q}Gd<2ylPnE7QxY0fjY)JM zEcmoUz$5h9rQV3(v13(zeFE8l`4K)QIC5&iGofri#M8Gk1B1lh2VuWu9``+6plt%@=g6P!}fcbSm+b8(I3(#g4 zJTZbt56tvKSOF0R^b-<#4gk+n)9Y1*ePBIbI0cSJgx;9IfS&+lDFwlcrbfl;E<}qfRbdUH54r}ZE~G|^Jn2r z&;Qi>+>V-zn@o)+&pha2tmlz@kuIvVl^d)=96CnEVISKKwO5sqY zM_K`Yd&pNW^b8R_fD>Gv@)X>kkS)iE9uwiW61>=PMikvKq7VKPvcCrizxc;YE8&Md zixJQP(#sHj9l^y2=m5D+gLVC=^(&*wb*ijN&a_6ARk=>HRmlT@XV|RD^@fx_5fukA zDgtV!RoTs8@L$#wvd>k7k0JaFaSDXR8pOCJ?8}!mh&AC^{xvn$h6v7tm3tVxK55c9 zr@$sa8(x9jL?lbf*XCVeP>I6%7>dqRkhl~@J$`7Pf*F#kUQe$d4ug6N9wiA1C zt|0aX1P|m5$T?b~=V=zG?F|U6q|lu&a8bb*4eolptav=9crv0`(n;IK;uK^&2p_0t zSZZ8D-3UU0lKnYisT{LZM#cJCvf`qpA}lptOzsAwU-TRAN{z!w`EMP9=cvGWLXeT* zF!T8W9}~9TIih@wl%F;!79xs!CgnV%SOPB?t$JpZPMGOQ4Fx%BW{z5zS3i`{o%zib z!0rpLy49c~w6DAVc6 zN)38FqZJ1_Z6&L$%937(tHa&veW4LgVI5p)yW8n;blFNfY%VwF^tN_5ylh*SZS7De z>*ZUWEN^eMx&CL2W1Y6PQ=OeQuC>#~x387qY_1Mq^DK7)tbr})wDLZWtd&do#Cw0k@_~_Ti>aG2yZS7ZH^Eyr!{i1!Rx2!$e_>+R|PY<)0*-*68`)mbyu(adict(c7Lq@=%WwzUTw}OyY|Aa#yhs9 z_j5{r^#0O6a?Y1Ny6tpbWaVQq`S}e8-}08dm2G@Y)Oi#hML&mpgC9-V8#yh+G2uVz ziCU^59EUBH6UqKX>Q+1lU!?dBRHx$u{ZWOG4CWB2s>>ncB?ww+bu3f`0USx<`;BD~ z+6L|BO!F=f74N)a145tZ5W-omaQ|4OdE)?BM(7WK!R>T8JZ|3R;u*YWM;uOksx3Qr zGA%V`Grljg{-U}z`Ubpc=5osA-73P3K9;df+OYnwx=fQyQijAg+^cUeVNfTQZYKTa z(<@Yk1L$w7Z(?MFcb^(0Hc2l&z=9ZW7JN8A?^~gppv48Zc-)Q&C<^$nU%22oC1NjK zVY$_U$8fu{dx MVtF^0RTP52q4^njY2IbGbSiBw1Od_goJA+ zA<>1C+7-nMcit3w(zDaM({t>MPSt^cT#S(-b9d#^G!0`wWH@A$Qad_rzYTcGb!Yc| z@9lf<_x-+azj?nct0>Lq*rJdqWaXmQt=P)daoei>>#7y3+JAg!{9tw57qimgfMNIU zR+Sam~2Vox$QdUsDUx2)DUAViTf~EPY4GwOMWl<8~=>m%X zg)3h@7?cVTL<_OUwo{Q5#KSylPdTOX@Jjfi%$#nHQtri|>h36rG8RMaDgtGUp3K{>j}hQ9~s+rcJ#(w?&ZIE?KbF>Pj0 zO9tK4hqid=Y=$;pK+P0wr08slZoWh}LtpQ(bfA_#I$MUe>K!ct)T%@W3Ade`=_inO zVnQcztBA>d!f%tfrQ~G)`cWw{39}p-ZP3z|4AiEjjV{`v=e9DmQA{_x0F!I7(Ew#c ze6Uz2@p7oZ6zLx%!cxKyP>3WbB?ESeS0(ZH5tCBV&*?)g7ic5GH@C7(ECRYEgU+_m z=3>;`M;jSBI|FSgrd#w}b1Q1rb79sXLv04ytamgUP?Kv7f14!S|H7$~oa-k;{p)9? z#E6~r>LiFsfVKchM8Nto&;|ob9tdaaX+s~{jLfPea}c|m4EC>|k&HN@8w^ z@bwenh@&NNnu~N;fsX(+LHMtHkrxroK{8?S6zQ|GOeUvDxBX>A+2VX;t1=oXfm&c| zVuMqObW$sIn7LUHLmfWG+pzh(6Po+ZekLKlw4*E5=`0n=vyfo{PwQ}{DB~MXp89=9 zeEM%qiLd2H-JP>fnGao^B8*s!4p*y^F1T4~E5 zEw^!Zb~xk)u6)vvJUz}|gaTBeRxR2b=`=7Hlw>R1+LR_edg!!-!nwX@pq%;IaHw760E3X~RKgRI4yfxx%iwD?*_xFy2M2x~+rv<+Ik ziDJpWY{&V_BGf{mRto(EERM9W%&1{wdD+4;4ZF+wO3R`ls8Pv+8z?qEE5n8m#<~DB z$bihLLg4UWFHaPFSoYM*l(Y{Rq5eqi zw!^iJM~w}pgNN%)x|$=kYG;_*csBh(=JHqkcSrZl)Ffu_`q!6Sz6N`4K)3=t5rIjws-}%AE zpLBKhR!@FCp8U7>1ETc$GgMReYxZt^2UA?(o(NZu%=vuY@KYyXcYN8~3)puD9`@{E zk#%j!u^+zGW_tFfDP_xWN<2ie`6r1*MXv*R?aAGrHg+wX*oJ>Pzvb@T`CpHS_q&MS zT+DWDzbea2JaqKPQKLE|O~X4@e7T@pFraAN4kwR|)G?Vvv}5em+F1GCD}ad-G>>A;_cKI^dyKl#|EiHVM0 zAJ?5Ju1P)2xQ5z=JG!%q$F!=Vg84ygc^qpT#~vxMe-2{PA^yxDHf6w`$kGHw8LP7l z7S>=3O1!*XHxiFMr0_;9K270I80=99E03z-eJ}D7HiobV8XUGyFUBrwu*Wj|;Ucym zOOq9qPBGZy5dZ!n_6>qR1V@Xpj}Uw*g78FEt4yflZCF9Z9*eLC14AI` zk_jmR3LFR#ph$BZNu79){F3^Oa}I@1le!v+mIkqHb?qr#VsJJClAlSuI$~Bz28YOB zaX@1UpOjqG@hgrw6`{%U*q7gh3Ha zYoMS~h9*>?hZ{k}fb+^*!noSFAM z?|ht7tB&dsm1ssI2JvUTsKP|FA}wM*yPl0dJ|D)D<0BRAs1-srov6nKQGcC3zj?8V z@8Vr_@(duW6}_euC9v!I1jd@j<^1V#@v>Nwt7#HfIE4{w_iLIh@LfqH%y914&28l5 z_SABEnGXvTaaHy%A^5-d2=X1b-g(tB?-4b7Ib+qUk3!7>dVj@yk1Qo-_&$2yFZRtD zXM?C#{aRNs?io|Q)6**sJn`;4$?uV zE(-nyaq(w#a4gP3JohDWC=Pnb;hlHhz30AMUaGX7Jb!!47f!D3&oZ<6*Yn-2L_}LM zQ2^@_@D8*g4uB6IQ50thv$=c;ok2d^-o-KxNHpa#-g!JgD02e2lc>O^LnJ@J5_|%j z1eYib-tR(`nM>5a0J?r6e0*lJCUQh=P~>-Pn@G#0)GiUN0Wn|)HJNJ#j3@}~MMxfx zM8w{J|EJ>c8t%XsT2yFcoE$CW=0Og9LPIZtS0^E=o!NNaqtF&O&-Dwq9+|P9I#I>* zT*ZhqJ)yV3@k3$|e8~M7UU0wv#9#B(R5~+&G3V#pHOh_rm>|Sg&=ubQ5?+t2RXwO1 z%{KLVJ5CwR)zT2$00wpvQZ?4tjY|DlaY?|?umu{Dl>A_K z5)yoAP22d>HA*`R6?fgXv!&Fk*w)DpOEG3xWI8PZrLacJI@DozU8ghK?(TUJx7vNV zxj*lo`HoQ{bUVI^TBo|l$|sz3*Os- z;(y?&R)uE7T!gy8_Owni>4Hp{$J}{`l_RXpY+PD#gyH3`UdG80u@2R{vNohtA4#k3 z!=+i}9Kn|5((OKVAd6IO^qodI(&~ho7dX6XNUPlD_Ro24yv!=v$leAfbOC1W$m(xt zos59%WdUUiV2(nntp{r#p=1Hdb_TPNl$oStBxUWVtk5@l96rp^L&+qV-RNoOU`_=V zA|h_#&0Yd^661PNL`h8a5|b`bL@b=>O&=B$6EMq=P$nJaD8yVk${eH|My5SLnFW+J z2$)QZivlP!ii5CT6l0LnbHd3Gkq{G;0EI*|V&Sw~6jO>Odx#0KaFWr3InGdK#J1UK zCJqkOUP#GYlueDkuyL!!2>i6CiG1%%npRhe+*SG0`0?kAsC*R6VCS% z!*0JH z6Xl0eYLqKoL+pm7FhI-EW{3^?v&-}U`Uz#vJ|3^+pfv9talLF+1h(G0RQKGGWTSF~(km5LIAK z9cE2-S^_)>T04|6_Fr9?Gg;`DI?RbLqiGsxf=)Ga!G8%dM@p&n!3#W4qoIZ5mV5Kh)0 zX4cZS{7{3KmR{w2pr+9fW>(PPCX)8gyiae~;Jqu!gdPmt@|cVfDBvO9M~!{uuHSNwi1=P7!kd(WOL zORqFfU)gsu_uAB#waX9vPI^%yYt=WIiyNMAF*P+CiuW5@pEtKy>h?ET^!3e#L}WZs zJ3KQvJ3bMsjYn?IUz&`}k6nsQM}{V1YW9OG8_oI_L;VYljRtdFqruu>tTVLI5PljW z5t|-~B`(cJ5~HzsLD%WagWk(;zIgRU`1KbDyFPsVs-&SK?bIo8=5GqV&M2_mz46HB zJBNof#S6{zuY9xh)$O}azH#V8?ZlqFCvv~sbuzbBC_H{~P+F07?tDpEFzY8t8irP@ z!F+&LHXBRaoQ)07k1xcG!S_Gux_a5v|IWZ$834X&=d+DF3qE~p?bgu^?~cab)!crr zc>)NaAP$?hpouqQ`!xPM(m_TYd-x}8S1Sj{gqSnI3~lcBDuwek7<;ju`< ze&ECKfpFL1tAdV(j-!WqOYRQeEqE+i2;i$Vw-*i-^Z&Szgx>}5TY}TqviFH%DM<=|XeNT(v31(zhaCw*w~6}O<7<4ae*FP6v%O5kH0DZFwJ@nre+p>?Ak z#ZzbJR(Sr*Esk?X72G4-bf`00Ja;zl$kEm>KJz)zYzV!{7%!S(D|z#}sDj<5#a5;GV|h_SLp-|)e6md$x-9j*C~y ztrkVX!qHx$QL-#4=E;pSt435+er8qN?uTsD!NDAA$SauB#B8@yCX&jDuiz~Ncykhd ztAu}jk+-PjmEuFf8OV-eVMH%#l)NPW*drfPRh(s3e(b6AGUf5btacsNVZ_ReaAaa- zF3JQ6Mu)XSBK&q4z}j3?9fxWYB(rbOz4rDZ@AfS3pCR6YgjqjACzX4tg_zb8v8Ck4 z{ydQwTwiS|k50x{z zgMSQ@0U3RImVgX*iy>+hY%A|qt$)KKk8AUn z4AD`LyzRklnmYkL?E%rRL@_-vFBZ;(g}-J%&L-kw;i8^h)8#3TN9FyhDsaemk;;Th z?t@{}|EJ}YBS_hR4_s3UF>}yedmZO3gm^c!ynjgY!sANFui20kXMliqPkEoG@`AhK zGmjj$rY|bL5PjkePvys|s!+5NwUG#=!k)9W5;Q*c$QV*5N=I(&vbRkYkPLMq+qLfd zNQ&gOx@j3gdXQZMvY9O9S{&MC@Xz0bIDX_`;UYPId9*7BWt1ZHHwi*Kn4{0j-=3G9 zUw5JGB7AEBI5{hRwxg-V)NCMCYu1o8)kTJ^uxhO${9Y literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zblit.frag.1.metallibiossimulator b/gio/shader/gio/zblit.frag.1.metallibiossimulator new file mode 100644 index 0000000000000000000000000000000000000000..ef5ac8670e845cefc14a57cf01acb208287eef9d GIT binary patch literal 3361 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 Vg2Frdy9qn>cvui%E{G32{{wAWG93T_ literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zblit.frag.1.spirv b/gio/shader/gio/zblit.frag.1.spirv new file mode 100644 index 0000000000000000000000000000000000000000..88128fce32f978574e5c6e997bbf72ee72d836c7 GIT binary patch literal 964 zcmYk3OD}9e6ot2LjqClm-min9q=UF35kw5yz(68Q>3Bs#lO}iUXPZcT->I%p$vS)Q zwO5_Js;XL9>y7A&{^*OxJOjw8<-c~=RD=Dkufe$IzTJE{etCLnlgsrJ8|~)p<6Y~W6gP=8zfrgO z!|A2uw$k1~>Z^yJ%{Auh>Ho!LG{~LjYT(3tsjMPSsGXbF$*-Afkk=qLFqQy1;s;9wv9We}t&k|Kmv={bBG z`K*~BSL3;|#y68!qo;Y`IrOSVUkgBfkXNx@26|ry_VlgSGp45ZNE&q+?zOi9+*=3w RbAAC1IF7hk{{sU;NWIK zw=Q+^SGYPj_ZPT2#Pga21gUu8ynF7sUyrNQvbopog%{_|c{+@L9X(dxKSBWR!@xBC zI`K?M6mN+X^#+kKuQpoL1rT=KO}eDu<5#dGLRj)+I@T=mC3Aqt(C2rECHh$kK!W;c zh}fvlHDT%^c3c=1Lrk*IG-WI$~eQFJ|CsQ@PuB5RTt8?5`3J)Q^R0WbLZ z!i|>;W^Dl>P0#2y=ZcR8_LB=u+-H*gm7CNP=&F)0JOlx~*gG%cD6hc59nxch$NFVr zuRxm+eN#k~aA|bo+zfr)Hm>WvW~X~;SRluK`_wXf=9w)g)n&O@(n_*+(QFx(oHIM! zHp}Gn>Pi}e!C+6@JxKYpV)QZ*Sn#I^iJq_J%4Jm%J>`G&BsfH?*7c@!ZrE)42F!3& ASO5S3 literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zblit.frag.2.glsl100es b/gio/shader/gio/zblit.frag.2.glsl100es new file mode 100644 index 0000000..5c2d832 --- /dev/null +++ b/gio/shader/gio/zblit.frag.2.glsl100es @@ -0,0 +1,13 @@ +#version 100 +precision mediump float; +precision highp int; + +uniform mediump sampler2D tex; + +varying highp vec2 vUV; + +void main() +{ + gl_FragData[0] = texture2D(tex, vUV); +} + diff --git a/gio/shader/gio/zblit.frag.2.glsl150 b/gio/shader/gio/zblit.frag.2.glsl150 new file mode 100644 index 0000000..f5df869 --- /dev/null +++ b/gio/shader/gio/zblit.frag.2.glsl150 @@ -0,0 +1,12 @@ +#version 150 + +uniform sampler2D tex; + +out vec4 fragColor; +in vec2 vUV; + +void main() +{ + fragColor = texture(tex, vUV); +} + diff --git a/gio/shader/gio/zblit.frag.2.metallibios b/gio/shader/gio/zblit.frag.2.metallibios new file mode 100644 index 0000000000000000000000000000000000000000..c4eb922a32ea0669aa0fd823aae7b19ad4f4a4c1 GIT binary patch literal 2711 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 literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zblit.vert.0.dxbc b/gio/shader/gio/zblit.vert.0.dxbc new file mode 100644 index 0000000000000000000000000000000000000000..5ad9601ff05e52b311afe25c7e871d05c6bb7447 GIT binary patch literal 1184 zcma)6OKTHh6g@LZYt%x5xGDt)>B4R#2_hB5=G7RXHZ>EaLLt=J+F+ZJB)T4Try$+B z3+O`VA8=WGfGct7!a^58+~}gD2jLoaHsk_!6|kdA_>Gdd~CP|F-P)ug!motCvNY3C#JSAc1(2Hr|bH@xf2O| zzb3+7-3^1Bfge=x6j5^59}=)WvITsjuef3(TTz_s^m>3@DpV#(W?*0zz)cnwpIJm+ zA!;<~M8fk!%ycY^w|xE%Yj%mnOIJBV_B_v@hM!YpkC4j+oRMJ??}iz%6G5-yBTJ;0 zTQvPz#ZMoK^AHH*oD+M)xcZwJE(gS&N(0CD??d6DYxT3fKKX;$Ygn_?YZM7L8)WG$ z+N1bm@b`6z+qA3MYMb0qs$vrUC!Tr^myi$re_7T4k5mfNMLoCbU!cm4sW7_Nle0^B zQT_l?t|YhSEZxQCrtM%X6?d55CT9)cYqvD0)^08~S}RU- zog+65PBix2RFHH3K{d>(q%eR?<7$1W>9m}cwsod5VU=d=8OvT>yuIAC^3M9b`With zc{ar%SM1BPx*P4C?~eDb(|DruN+JaM284GaURZo}dOlw+R|?v1nZ4%7|Fzc$zZ=Yv Xcs&9er|tK$Z`9_TR=r(!8tVHSAaIX> literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zblit.vert.0.glsl100es b/gio/shader/gio/zblit.vert.0.glsl100es new file mode 100644 index 0000000..61dee04 --- /dev/null +++ b/gio/shader/gio/zblit.vert.0.glsl100es @@ -0,0 +1,37 @@ +#version 100 + +struct m3x2 +{ + vec3 r0; + vec3 r1; +}; + +struct Block +{ + vec4 transform; + vec4 uvTransformR1; + vec4 uvTransformR2; +}; + +uniform Block _block; + +attribute vec2 pos; +varying vec2 vUV; +attribute vec2 uv; + +vec3 transform3x2(m3x2 t, vec3 v) +{ + return vec3(dot(t.r0, v), dot(t.r1, v), dot(vec3(0.0, 0.0, 1.0), v)); +} + +void main() +{ + vec2 p = (pos * _block.transform.xy) + _block.transform.zw; + m3x2 param = m3x2(vec3(1.0, 0.0, 0.0), vec3(0.0, -1.0, 0.0)); + vec3 param_1 = vec3(p, 0.0); + gl_Position = vec4(transform3x2(param, param_1), 1.0); + m3x2 param_2 = m3x2(_block.uvTransformR1.xyz, _block.uvTransformR2.xyz); + vec3 param_3 = vec3(uv, 1.0); + vUV = transform3x2(param_2, param_3).xy; +} + diff --git a/gio/shader/gio/zblit.vert.0.glsl150 b/gio/shader/gio/zblit.vert.0.glsl150 new file mode 100644 index 0000000..eba9f1a --- /dev/null +++ b/gio/shader/gio/zblit.vert.0.glsl150 @@ -0,0 +1,37 @@ +#version 150 + +struct m3x2 +{ + vec3 r0; + vec3 r1; +}; + +struct Block +{ + vec4 transform; + vec4 uvTransformR1; + vec4 uvTransformR2; +}; + +uniform Block _block; + +in vec2 pos; +out vec2 vUV; +in vec2 uv; + +vec3 transform3x2(m3x2 t, vec3 v) +{ + return vec3(dot(t.r0, v), dot(t.r1, v), dot(vec3(0.0, 0.0, 1.0), v)); +} + +void main() +{ + vec2 p = (pos * _block.transform.xy) + _block.transform.zw; + m3x2 param = m3x2(vec3(1.0, 0.0, 0.0), vec3(0.0, -1.0, 0.0)); + vec3 param_1 = vec3(p, 0.0); + gl_Position = vec4(transform3x2(param, param_1), 1.0); + m3x2 param_2 = m3x2(_block.uvTransformR1.xyz, _block.uvTransformR2.xyz); + vec3 param_3 = vec3(uv, 1.0); + vUV = transform3x2(param_2, param_3).xy; +} + diff --git a/gio/shader/gio/zblit.vert.0.metallibios b/gio/shader/gio/zblit.vert.0.metallibios new file mode 100644 index 0000000000000000000000000000000000000000..2450ec9455392171d0fc3cd4457f84b6f069b002 GIT binary patch literal 3044 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 PT%BDVyx-%+s}cG?OVVH# literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zblit.vert.0.metallibmacos b/gio/shader/gio/zblit.vert.0.metallibmacos new file mode 100644 index 0000000000000000000000000000000000000000..d902b3670bf127c752f62ae937a6fab521ad53dd GIT binary patch literal 3092 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 literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zblit.vert.0.spirv b/gio/shader/gio/zblit.vert.0.spirv new file mode 100644 index 0000000000000000000000000000000000000000..4f762bb753de992453071dddac2c8917efb0dbfa GIT binary patch literal 1600 zcmZ9MU2hUm5Qa~oK(&e580&?GV4C<<#gDYu#I!~e-Kwk5(&B{|n+mJhNEfm!M7`1r z|A9Z&8x!B>uw#frhBNcd_nZUe(nig>C3n`XxS5;Nnkxx$Zq-%&8HC-iImrjjt?m1G zoO5OGh|hU<#>>n4K0QfNlpEq5@hfpxT-FEQmcEu%DF~yW-44R%QGYy+Ci&N491W8+ zjs{5<_w!^Hmz` zlB=%faeAB1j?8lSV8K@U&-PF{`S0kAKFkYLl&K~C(=h79Suf7=_={9u7aYPink0EL zN_|~$>Uum$^KSA@Qd7FmsHi+5MP$R9-!B; zUy@F*4KeYXg}x>kGJRdL*~xVUqX;|tRj+-2LVjiiqjp33b)Ce5KQ46k35NeIo%r*< z>cwusjLESnotMw<$brtA0KlvNB z<8M28E14N>ChlQL+|mr-%mWegTS!Icu26E`6tjb;Lg~FJW*+vA4}IJdgST~K#PDYT z21C^Psd#MshRBJJ`EN-!fBK=1ABF$6WMc3+5XPQ%#o&-(dy>JZ)lnbx^+JpsHXFc7z~D}P5+joEtwqb-*R*$gIkUR z$zU*KIc)z&!niM+^H?$%WLQr!*nD>Wy_|a|#upoN|0;HuN~Uk@hGmlJ1FWMB6F(K> Yi;Z}@tM`(z!4NgsA8!uZA0a#9zpXiY9RL6T literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zcopy.frag.0.dxbc b/gio/shader/gio/zcopy.frag.0.dxbc new file mode 100644 index 0000000000000000000000000000000000000000..a521803fc18eecbe654cc18e85459f93c8d7b670 GIT binary patch literal 1256 zcma)5J!n%=7(MU3)J8><(SqU|6e5&r9sI*++WfRaO)xJ{f)vtdV;e9gyk>BchdSt{ z;GhojHX(u1!NtK{aBy^W2qL(35vS+*^6ssvq~L{+*72{r?3;dISdl4W5V!xML*&uxvO}Lyyt6=Ne^|wVR{VZiR#B$Tke8D zwB}AfH>d)fh|~|o>r?Ol^}C8o&z|IXw;1cV1e7<*MP65F4CZ?y8o4J3$@hetoCWg( zKMVn9F;{-cUgxWztLNsdSfWx*y+OT0^|Lhw#zwA@5T|a_89Nk($#bHJkIClc!?h)xAb%a)l4WsmxWntZ|T# z`N|UQwc**>cB|8*%$_|n wGmCz|f6ZAaPODmR?lz&9zLP~#$yc+bQaLA{(tmjPKZkR(R;hbyjV?`p0BWGFQvd(} literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zcopy.frag.0.glsl100es b/gio/shader/gio/zcopy.frag.0.glsl100es new file mode 100644 index 0000000..b2dd95a --- /dev/null +++ b/gio/shader/gio/zcopy.frag.0.glsl100es @@ -0,0 +1,27 @@ +#version 100 +precision mediump float; +precision highp int; + +uniform mediump sampler2D tex; + +varying highp vec2 vUV; + +vec3 sRGBtoRGB(vec3 rgb) +{ + bvec3 cutoff = greaterThanEqual(rgb, vec3(0.040449999272823333740234375)); + vec3 below = rgb / vec3(12.9200000762939453125); + vec3 above = pow((rgb + vec3(0.054999999701976776123046875)) / vec3(1.05499994754791259765625), vec3(2.400000095367431640625)); + return vec3(cutoff.x ? above.x : below.x, cutoff.y ? above.y : below.y, cutoff.z ? above.z : below.z); +} + +void main() +{ + vec4 texel = texture2D(tex, vUV); + vec3 param = texel.xyz; + vec3 _59 = sRGBtoRGB(param); + texel.x = _59.x; + texel.y = _59.y; + texel.z = _59.z; + gl_FragData[0] = texel; +} + diff --git a/gio/shader/gio/zcopy.frag.0.glsl150 b/gio/shader/gio/zcopy.frag.0.glsl150 new file mode 100644 index 0000000..799add1 --- /dev/null +++ b/gio/shader/gio/zcopy.frag.0.glsl150 @@ -0,0 +1,26 @@ +#version 150 + +uniform sampler2D tex; + +in vec2 vUV; +out vec4 fragColor; + +vec3 sRGBtoRGB(vec3 rgb) +{ + bvec3 cutoff = greaterThanEqual(rgb, vec3(0.040449999272823333740234375)); + vec3 below = rgb / vec3(12.9200000762939453125); + vec3 above = pow((rgb + vec3(0.054999999701976776123046875)) / vec3(1.05499994754791259765625), vec3(2.400000095367431640625)); + return vec3(cutoff.x ? above.x : below.x, cutoff.y ? above.y : below.y, cutoff.z ? above.z : below.z); +} + +void main() +{ + vec4 texel = texture(tex, vUV); + vec3 param = texel.xyz; + vec3 _59 = sRGBtoRGB(param); + texel.x = _59.x; + texel.y = _59.y; + texel.z = _59.z; + fragColor = texel; +} + diff --git a/gio/shader/gio/zcopy.frag.0.metallibios b/gio/shader/gio/zcopy.frag.0.metallibios new file mode 100644 index 0000000000000000000000000000000000000000..f143069253db98471633fa545ed9df9be1d0a3cd GIT binary patch literal 2951 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 literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zcopy.frag.0.metallibiossimulator b/gio/shader/gio/zcopy.frag.0.metallibiossimulator new file mode 100644 index 0000000000000000000000000000000000000000..8fe4c742f22b16a55721b79346418595c1166d88 GIT binary patch literal 3361 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 Q3Tc3PM-gx3sxtTbKU8u<_y7O^ literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zcopy.frag.0.spirv b/gio/shader/gio/zcopy.frag.0.spirv new file mode 100644 index 0000000000000000000000000000000000000000..32995522d4a250552bf6cb42ad1b4bf26754afd4 GIT binary patch literal 1252 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 tc|^<)(`1-D&r literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zcopy.vert.0.metallibiossimulator b/gio/shader/gio/zcopy.vert.0.metallibiossimulator new file mode 100644 index 0000000000000000000000000000000000000000..f696caf2daf69944cdfc8ae8d041dabe3ae3879f GIT binary patch literal 3438 zcmZWs0Zd!R89rm<_Y#c#NUg?nMS~*pxsql8u3omSm=ZC}}&{4=}M;W53wO z*v{74nByB|9;)u+uT?qLRmYdZ|6Mm#{cjLcHn@yxj7f+@?Jke(XJp8ML~2(g7-m!m9STs&W>!(!HX-QmVsyA zL8-Bf%svbPG00kFY*CcTp1|W;7*A&*l#`_eI|$tem53FdHcv?QNGW~g3!+|GaW6hkJ*g796GT`i92q2n6GC}H=sr($GlGv1${8UrECitMjEDP( z@Ssr65+P?iND>hfF+wL}>YGC}>Y=Z4nxvVY9-?QWnxs}eJ(N4HrKe$3#0tD!2<9UW*ra9)kzKJ*5M${JpJS5=<_wPB8HIHt=W`gp( zIvvAErsvhk*jxJeWK5>YRgQS5Fc^-BiXK8j3{Vnb%F5BLTmJS=|18OPfKK>{Zg62g7)N?u$6 ze+WD{(DMWixeyVa<_kW%EM103H4zaz5y*5p6LN^%5d1GoKaUcT%pVKwM1&%Og9LPd z^)p0-C47SfbbwuF!M=Xf{)17)I#YIq&vcI|yJDSXyCMJpzQ<-)tY1hG&Y<#v4n;uQ zX;&O!F!;OeW$8B*5oU-8Lv(?1rUf;h75j3x1vM+46}hLy))3({VdFf5_h*IeoRi}v zz#86xyksI<%;Z)VWo;CrC>*f~Dmq?UcLs?V=;6#29h1gho`N$vv?kGO2B`eJ#zg;y z2X>E3EUm>>vX0HNve`|{wR)KGCd3cU)&??4kImB^N>O#6rJ^_0UlS$5A-H`iu}tWlQDTV&nU9W3RX>y{rt{iK9+p zmlHyZ*cBCcxPW#d2#MlOHkj>>3N}(WqRM2af!K~Om*rp1$^SDVUt-0r6Zq1tTs`_a zM^COM2k9pXOXY;6av;-QOjVq3f&ZZuMMZfK-x+bm~PRTxU3H(99$HxOs9M}O! zdV@m#)PBX6Nb$8*zL1dLFe&C4`4V`+=+xIoA%$wLYH7%L*XL-+0JlV%4pmddu;r1L z;#FyD(W)bM0g_v2psDe8LV$Nt=(wE7GZ|VM{e^ z$hS%3f~Bet*i`?A8-?(I&<%LtPU#5WK(3g_0UUka%Q+|3xl~WXs4;sl9`bvwcyUoe@Y<^e7VdizD`Q99Fi0 zi;mD?hsWXL0*-c_%?6`3-p#c+oL+Z30JUuc!(BlvM4JnEC_0uC~Am zR+p#4>u=-Sj;`Q-Oz`;kj^N{1C*a(!!=8-28i4k+trfSZknCrBMr4JgY-i7ivXCTz zQx%eF;2495(ywzyXZBhR6_h)rE52p&H4o3Ru0o+cu$o6q<7oPU-DctUVrJ%SX z{$%p%!c$9=3pcOMUa#M9dG7phS>@(GvhQ4YZ}`Gn5B*91?z?aAdZ($U?Bcc^d#4;r zujiJYdVT4ixzCq=ajDaD)|~rEG2dMifWs4D@QvK>>cqFv zvVA+#Tw^xF`n?bQothgxJ}VbHH7Hk>@l%St$$4oh5K Y|4u_GTgsOBU7cNSF5vay*>}tT0q=WG00000 literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zcopy.vert.0.metallibmacos b/gio/shader/gio/zcopy.vert.0.metallibmacos new file mode 100644 index 0000000000000000000000000000000000000000..d4a5777411662776ba23b276f478525246edd9f5 GIT binary patch literal 3060 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 literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zcopy.vert.0.spirv b/gio/shader/gio/zcopy.vert.0.spirv new file mode 100644 index 0000000000000000000000000000000000000000..7251754c6e78e7663083db9a31044f4d6d9f548e GIT binary patch literal 1304 zcmYk5%Wu;_5XQH8HBbqt5aj@hio&}z<6Q?DP8OXdq7qi* zFynNR{m-e%pD#u(i#{9j!}FpM9NdrmrYZ)qza-&NJUfkNdHhYT&;rLMHpy&mC#le7 zmk*!AZJLkl4@PmbvolU0PVUrkUg2{ud}`lU?$RxDJVqR>UCHAExUMhyjxb&a_L{7g^t$ARIN-&mcBAxHWplj0CfmoUy+u%m zIR0(t{d|2>K6e3wYhC_bX}H1nN}v6K5x*}@Zy(2JpJ1JGm&CkK^H@GFoL$iqpLYP} zXMQ5v&#+m>svPVV4rV@(W@g@QN8f?8$KZP-zb*lX51;n{MtoG-)buqoy!7Ib^G8Ti zdS7T)`k{n79tdT&o`m_C+2?GP_;2McD;7o^0y)&3)ZV+2Fs*S@va93w|t&-F=XNb3FD@HrSHnNdI5#=aYn7V!R{X W4&3bUvxL1eGk3%%|F1giO8x<#^JA|7 literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zcover.frag.0.dxbc b/gio/shader/gio/zcover.frag.0.dxbc new file mode 100644 index 0000000000000000000000000000000000000000..8b77ae473c226fa441e5f5ff13e90c81e8b2aff0 GIT binary patch literal 932 zcmaJQY~ry@nFB^aoL+EOxzU%v9HWo_b7iWKekI&^l zUJw7eva**Nfb%3U#PucdlQ^cBO#qYBU83lGnfpdvfJ6{9xD*HtQ!y)$PljBRf=F{8 z2mOzk#hnl2dNDsnCf8X2SUpF*-$SO~nFxJj+{1rxcP4rL4(lbDBis)Hz*;hES2WHO z&xrRxs`A|+12V)1$^WE>eKZ~+1vlcWtH7F$=$ksc7D4~F;^zLHC?e5>#q0){#prFKHx7vhm< zt~>j-*W7FEx;wUqaEFq!<9O&wuK0R{PpJ4o;u7*Ya`zuXg0+|z{i56LYV2GKyNb@= zY_EIHp0m+5rfN@&r4?(%u(n#CZOHmRh~sC{?R9Q+lYf)^zNXS_Yv)<>V+>@0#_Nw`sSTbPLD~ZV~_h literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zcover.frag.0.glsl100es b/gio/shader/gio/zcover.frag.0.glsl100es new file mode 100644 index 0000000..2399901 --- /dev/null +++ b/gio/shader/gio/zcover.frag.0.glsl100es @@ -0,0 +1,23 @@ +#version 100 +precision mediump float; +precision highp int; + +struct Color +{ + vec4 color; +}; + +uniform Color _color; + +uniform mediump sampler2D cover; + +varying highp vec2 vCoverUV; +varying highp vec2 vUV; + +void main() +{ + gl_FragData[0] = _color.color; + float c = min(abs(texture2D(cover, vCoverUV).x), 1.0); + gl_FragData[0] *= c; +} + diff --git a/gio/shader/gio/zcover.frag.0.glsl150 b/gio/shader/gio/zcover.frag.0.glsl150 new file mode 100644 index 0000000..ce1beaa --- /dev/null +++ b/gio/shader/gio/zcover.frag.0.glsl150 @@ -0,0 +1,22 @@ +#version 150 + +struct Color +{ + vec4 color; +}; + +uniform Color _color; + +uniform sampler2D cover; + +out vec4 fragColor; +in vec2 vCoverUV; +in vec2 vUV; + +void main() +{ + fragColor = _color.color; + float c = min(abs(texture(cover, vCoverUV).x), 1.0); + fragColor *= c; +} + diff --git a/gio/shader/gio/zcover.frag.0.metallibios b/gio/shader/gio/zcover.frag.0.metallibios new file mode 100644 index 0000000000000000000000000000000000000000..22256c8c9e1db5b1e18602c29fc866f0b37e0e7e GIT binary patch literal 3191 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 literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zcover.frag.0.metallibiossimulator b/gio/shader/gio/zcover.frag.0.metallibiossimulator new file mode 100644 index 0000000000000000000000000000000000000000..c8040aded86963464eedfe5e0c7fa234bfe9997e GIT binary patch literal 3665 zcmZu!4Nx1$72cDC?f@YPn&#uzXS1Gkh|MMN5AW{NzR*GU4 zuiaVn@2=Nr5OKTk|6 z*f(y}F8!#!zDbj^^?&-u>K@%s0qoS@-rD^?rqG(}x_z}x2M+A2RijtGl7BUQ?dIbv zUp!)XGwtnkJc9$clg^FYmx&$ZKr03CH{q!lg=dP+BedehWQkWENxe z`vGQJcmGT^GZ$lK1N3Bop7GODab^m}v8*K>vlw7zM(Fui){Kt+l+YqKMRpI00-}Tl z(Myq?7Ex%I`Y6$35w~kZ-U74a2t69mF2!inr=8@OrC8Ryk(uP^DUJb~34#Gr6NDa= zMQib#bmNkqXYaQBr zD)hlWPri2~VjgAtbo8dZ*_-x!`@`(N*Vc`@R5wfOkzxZIubawg99_J*Zlp3Z`kx|JF^cJejM<6FZshl3+aR0iIOk?*3FVWJt;&<7yx^h1?piZ6%~%1@6k(6$_+Dr_nXjrG^~;e?Xz!A`{z zQe9Omzw|3h6g3PS@DF3OO`n!j3+5-JRTHMFerZ*rw;!s|vlI!b!9zLXrQN+E&x*N; zY~^x9xu91$^{UG&$`!M+L_MyZgSw&9j&h7mf288wV8sPf`B`b@yTQtkv?8&R(`_N2 zZ6|l&`bO^Xi#*gisFQ_c_w_U|+v69TDX~){3WK6|FtFv?it^gL@~aW$vR>LU5u>3> z!;y!6mZK+i^mqV@s{C&eQ~89cd@$Lc8!H5aaMOVWzrF~y(kB7aa6 z_#jkKNPLe*^hCwn5BICCA=MXV@+C zti$TzI@oTj;I_M*Y)P?RUtCmTFtCNm37d86ny7qhkKNhk>Tz%0iIhb68;Cue za0tACFBmj?yu7v935#qUF3wZBCQeEO?vTmV;S#XW28_e%^fcR@e3z%oZ50YTT&+(1 z<|HzhuqM@b2%5LHdhFdPgNAOC3pV1wV^}SP>-H$QWtas^oCo#_jJH{Pu|%+PZJ4?} zLRYINh0^Y{xsp5W&^Pm3Tk9IMTVdcgfEV2oa2@tT&ZL)Q9L=|uc&xpiF7Sapa1MB9 zs{%t?WpW?3uqp8mS~2?DYC=jZB*pt-p-@2O6!%r%Q$P&>(H2ly`o3yi0o7#atKM8d zT{4WB<$>IUnkrEo;^pmnY4OQ;ZZxhSicRK(T2n%kc~Rnc;hz;oZ6XpSE|#ezn?F)y z_Rw6j$uZ4->%o z`vW!d5_M06^bM0G3cH2;DO(Uoe<%F>`QM#?KZ{lW0|+h=#Y)hH=D zw|UFn53S3uXB9pF`toO4FBDxp?{E(2l#3SS3+cO0xQkC@Ry>omIghV-^c$$9_#-wm zLnwqAMfwi%gQhAdHN&Rz3uApt^!u?a{9%K?Nwlf6k3Lc(B!@L*qH-u$aS{rWv?>~` zgyIw#!zG?$p*90uFEefdRYXE7ea0g5U!l;|Y$Pc_tumJCyS|f?`^Vvy{~RuZY|z=T zb0X515duUA{RPmu98Np$@<8&kIIs5GaVD^)2OngcYK%s(AL{>DeIx!{TvbElY*(CO zGot7pirxDg)stakNr=@P)SM~HIIfXD^pYC2QpVC23#Fs({g&vAhvT{sd+@q=Iqd`5 zw5~0v2uvOHhi`U_twXu8aqy4p#*@#n>NE@no=!IPU1U(IH-u1pO^mF7e;drNlMe7W zcHC;9;k&GMl{W*$52pD38paGfyP@5m93g}aKD|1|1naFmYtArDe!6W;>Ek`aGEA|Y z0{OkG{2E=85KGR-F8P;2j_7K*xT*rzcrVms{jB1 literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zcover.frag.0.metallibmacos b/gio/shader/gio/zcover.frag.0.metallibmacos new file mode 100644 index 0000000000000000000000000000000000000000..fe25160027b410ec825d8ad974981cac16bb9b79 GIT binary patch literal 3207 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 VS{9%~=cFMx&s+7jzw7dz{s2;LjRODx literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zcover.frag.1.glsl100es b/gio/shader/gio/zcover.frag.1.glsl100es new file mode 100644 index 0000000..01cc88e --- /dev/null +++ b/gio/shader/gio/zcover.frag.1.glsl100es @@ -0,0 +1,24 @@ +#version 100 +precision mediump float; +precision highp int; + +struct Gradient +{ + vec4 color1; + vec4 color2; +}; + +uniform Gradient _gradient; + +uniform mediump sampler2D cover; + +varying highp vec2 vUV; +varying highp vec2 vCoverUV; + +void main() +{ + gl_FragData[0] = mix(_gradient.color1, _gradient.color2, vec4(clamp(vUV.x, 0.0, 1.0))); + float c = min(abs(texture2D(cover, vCoverUV).x), 1.0); + gl_FragData[0] *= c; +} + diff --git a/gio/shader/gio/zcover.frag.1.glsl150 b/gio/shader/gio/zcover.frag.1.glsl150 new file mode 100644 index 0000000..3f832c3 --- /dev/null +++ b/gio/shader/gio/zcover.frag.1.glsl150 @@ -0,0 +1,23 @@ +#version 150 + +struct Gradient +{ + vec4 color1; + vec4 color2; +}; + +uniform Gradient _gradient; + +uniform sampler2D cover; + +out vec4 fragColor; +in vec2 vUV; +in vec2 vCoverUV; + +void main() +{ + fragColor = mix(_gradient.color1, _gradient.color2, vec4(clamp(vUV.x, 0.0, 1.0))); + float c = min(abs(texture(cover, vCoverUV).x), 1.0); + fragColor *= c; +} + diff --git a/gio/shader/gio/zcover.frag.1.metallibios b/gio/shader/gio/zcover.frag.1.metallibios new file mode 100644 index 0000000000000000000000000000000000000000..228996ab8f2cda8640580d154f1e6c6daa406d47 GIT binary patch literal 3367 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 K3wY4KfBhd_;oDLG literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zcover.frag.1.spirv b/gio/shader/gio/zcover.frag.1.spirv new file mode 100644 index 0000000000000000000000000000000000000000..4c48d20067f7c7faed02255f1d46e9b292a382a3 GIT binary patch literal 1416 zcmYk5O-~d-5QdxmK!lY~0RhEXQ4!FM5+o)Djp48yIADx$)Qun^5!NhZ&-?;@FBcM@ zr)S!oN@}|5t+%?Wt9z=Im3tu!h0!n)HbX8`p#l=ZSQw6Ld;i;h>+VH2ZS_`X@-#_VJ0N-3jA7zH_?Y{};%g~;~8fMMVd3yBz z^}X|q?+B}0@sEY?e8raWory73{urxqarye*uh=a91J(>3LN^M399uDef>o~jrT8?q zeEXYawLg28KgViJ+&Z e2XSl3@eFA${wMZxQ`GWb5i=+CDt5;XAJBh5DL@wh literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zcover.frag.2.dxbc b/gio/shader/gio/zcover.frag.2.dxbc new file mode 100644 index 0000000000000000000000000000000000000000..d8c6a80167add1c8e9a1f9976e7af79f4fdee729 GIT binary patch literal 984 zcmbVLO=}ZT6g`u~I!ZO83lS9@unUDCRyQiBZ8M2gs)0-@(M=lL(H2`LOoOe$(A zk^ug!*Zc)winu{MQvZTOw#PYx_DPh`%kuN{d$DSYA3G>scCxzoX3hiZ?YLQfndjmq zPy-I_Aj{SBzWOT%($e1YR{;BX-g6jE{8}}dHKjGaWi-_L<5aFijnt?i<2xNRdykp@ zj%NBdDdo4OTYdKN8>J7R8GhJZt~foD$UjVX`Cn^#wfgqH;S%{7#U;K9H{B$CN9a7G zrZWkjh|#*K$$ueqM%_>P35_nDJwpGL7_FOm)jR#*WoNy+)>{oCbQZ%GL9`pPgfxSD zD~nOM9zN;2=bIPY**SmC^_RO#LF87$wcZM6-N{QACove@@o(Sv@;z;O{YS>kJ&GjC s>l`wZA0G!=wRW}9XnK?yG^nLNN`2CD31eoa%!L1-)9OY~gFc7;0t%peP5=M^ literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zcover.frag.2.glsl100es b/gio/shader/gio/zcover.frag.2.glsl100es new file mode 100644 index 0000000..7cfde4b --- /dev/null +++ b/gio/shader/gio/zcover.frag.2.glsl100es @@ -0,0 +1,17 @@ +#version 100 +precision mediump float; +precision highp int; + +uniform mediump sampler2D tex; +uniform mediump sampler2D cover; + +varying highp vec2 vUV; +varying highp vec2 vCoverUV; + +void main() +{ + gl_FragData[0] = texture2D(tex, vUV); + float c = min(abs(texture2D(cover, vCoverUV).x), 1.0); + gl_FragData[0] *= c; +} + diff --git a/gio/shader/gio/zcover.frag.2.glsl150 b/gio/shader/gio/zcover.frag.2.glsl150 new file mode 100644 index 0000000..939baee --- /dev/null +++ b/gio/shader/gio/zcover.frag.2.glsl150 @@ -0,0 +1,16 @@ +#version 150 + +uniform sampler2D tex; +uniform sampler2D cover; + +out vec4 fragColor; +in vec2 vUV; +in vec2 vCoverUV; + +void main() +{ + fragColor = texture(tex, vUV); + float c = min(abs(texture(cover, vCoverUV).x), 1.0); + fragColor *= c; +} + diff --git a/gio/shader/gio/zcover.frag.2.metallibios b/gio/shader/gio/zcover.frag.2.metallibios new file mode 100644 index 0000000000000000000000000000000000000000..6eba40018f1133e83c021781f7ff82e44bc04c88 GIT binary patch literal 2967 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 literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zcover.frag.2.metallibiossimulator b/gio/shader/gio/zcover.frag.2.metallibiossimulator new file mode 100644 index 0000000000000000000000000000000000000000..09ddb1f8ab5931f005430cf93ed0f84c78c29ebd GIT binary patch literal 3441 zcmZt}4^UI*{R;_s4-HAMbcW;Q^##y|4(TIM1c8ktKyhLls`j+kl@}m1bR>kA5R$m9 z2|*t^Tw`@7x7r=CxMMrFQRl4fI0p%J92YF(+>SAh!9?bq>*3n%?5$h(`x2ul8^)?Mn`G_9$do@ufcn3kX(bGd;u4U5(I}V0WpftKBM1T zEk!nStDQyr51Fb(NK~ueSIZ!S*|y6mmLAL6{+5kx8L7CCnltyGe+MrGcRYIk%D>L! zK3h|>UzO1Hf7a)#pW8=*+ljxuRr_8b(YopCXR7ueIIz1)iQX(`bN>3ttF`ZN*;ikR zm5*Q!4&Y(9FuHX!HjoZ;KREvx41;lW;VB@9fz~KvbNtHW3C!03e)Pr(|aCe z=nRtG^3chwag)A2(6>wV6^J*#0iaplU+Ig0SG#5`Kr! zWfeO^g2Recc|3y4LHM+U*BazG!DS`<;3qvPQq3=^!INbTH5aDl5WS#L&j;v9Jv}!- z&1%$h;ZzWq52wzCsmK_GBI<>3>dcrrX5Q$(FC>8Sgwf6+!R;4{2Ly+baBBrGifO1> za8ks?ZK)$;5JlYK0d*umPm2Z!?+}i?%Oe!`3$7BPOG|*y-vVzvf)}CyZC1fCK)BFt zJ$(l<5O)Li5fQxz4lhx28&&ms!MaN5gup{W*MPvQ2%iUH7k3O1PFCPUaYNH!bQLjo zz#k12gYX}IB5M&1K{By$7fblS6He$N3E$@t&2pr882wh-#Q2kkid9vjyvkpUX=R+~ z$Eio};j$1jq8rj%i3+ibxm1(_Vzmg1)k-+g6KFTo5x&rm9IsUMHX67(l{^Pu$YTsb zSpaoewJA*V5y`2n!5&y{_Jl*}Tk4MYZSEPYQ#Kc(C@JBBY#)Q3-o39X<<5Ob&x&f0EK6l59ao({YaD_b@?16Y&r+hsp2Zci zyEKVa)hN%M8{ws=mHt{M!+jT}A5H7E#{IkMs3p9^;$7CD!%ui{eFk0dbb5oO4si+m ztU+(B;2t8}kRM3(tRwT*v~+cVa90vOj&Q{{wvfDIfbhU?TKX41;fwz;kt2LiD+2^< z0Ch5ik0tm40ycnd(79doWcbTeC`{k*l0-MjeEs|jFN!W z#wj`&?EHguTKZ2V;bjOPLv(_0d<8MygkyQIf|v=P@;$U-ZHVA2v2q84^OHbri*jrN zwBZb-MMBA9Cbc3bX_Ex`p&Tk>AfU zE)AT!3LWqeg9xDM=ze8JT3x6wW&6|DB*x?0Ok_2iWRji--rG=%_(f1i`l<0HswG`i z(Q7Q}iS`-%a1#k4R=_ zm?WSi9MEuAFh?#C-kClxC%chN` zm&D~G!SWt)S!^}k%@K#K#7^ADh@F1H0X+@+p_XvpPX@JJexZRBI#dGRFL?U{c^|II zKU|dmV^n^Z6*o?VDd@&U3=vQzXzpYU( zjH$mZ!mp2*M!jm5?mrSNiABqXjTMlPPb1~a# zyQA`3CizEf_Sg)(gO;|=E~yv50n?$9!C?87KH8m4yy5<|ZF4z(J8l9f`w6wmNJ$6a^S|Bf)l{;(7BhI0&Caalm zaJKp^dWWOU!q_Y>a~tEf@XpqDJ5yM|vIY5tIvt~pGg>S=)=8y1x?1hc?Oo2?z4(Z^ zmCtW#w>etdEcwkAdpmD)HZ-?7&5doAhgmIVr>ntcc3B%N_W$AWW}Bt4v!%ttH?&w> zO%KcP7JD<0U1t7eum-kZ)8O(tEDd%z)Y8^&b``CY;}qWfva!9boyWu$Kx`JftD)8I z=yY{DExfj^y~)nz#ytauB`)TGpdFSbSF1arQ0F$bLn015|M`i6T=#+J@gbMR-0XolT~&-AYY1S+9#OCjU_uV53ONDW!!^bFp`^%@^*mKyKxs46J6`5InaW*o4{Z8ciA z%PTVr^ED~g7k@ZhRC?y^cZ#nRUB39Uoh9#G+WF4A_0pnR@lz$+^Y&hUzb^mog`Z%Z zemO!vf}Vyy8aHp^wa_aF-$6&eu>!9Au(5PH+Py+u3#Z}_3H%M9PTWEC8zn+gI77tB z2ZLp2p)rUn27=|#BtlW#V$BRfj{$r{qR#`-co&v@gOm7|N%Z?P^j6EgYV-HRJDTgp9XRHR)rz$d%-D5qab(eCEn@w+}h}fe_ZMO6%$Spl4 z+uEn13}p9_SG6yNVg)(+;t8epL~`%_4~p|dArb0e65qT!xiYHHq)$ literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zcover.frag.2.metallibmacos b/gio/shader/gio/zcover.frag.2.metallibmacos new file mode 100644 index 0000000000000000000000000000000000000000..3ba910530c52c8d0fb2335e21378494864a5d243 GIT binary patch literal 3015 zcmZWr4NzNE7JiR}+>}BRC{sd7Vp1qWZPiz(Aqb2K0h(&4X<;pG*=>>*gj#3_Sx8dt zBn|XZjhafaVQqJa#SXgbZrbf?@n<(A5owGpW!s7v5hNly*uk|{9i4U03#e`PPIAxv zIqy5)Irrz>iYj#pX^SJ`h{f{G@Lfuz}tO$G$x zmU@R#i%s=d3JL}+)nX$XwGiw!GnT4Q8-*>m@SjtNzWCYbWshir6iwJfeuZG%BbX&A zY|sKpWQ*BqW1}`8PZM^uvXNDeY@(=#_B}EU&WgsS1rd*6*pqY}*iM5lNnt?i75eR> zQL-0V`soPJG@#8!W*ZR3Ew@9>+C_ey;3_z-5KY=eA)R1uS_r-eJ)-cSAfyn{h7@;% zNFT%2PxCQQwEH)$$dX4dh#;7tJUJ+s115Iiq(m_Hi$_|AB+(aFmEp7#D|;ujym&8h zg>{;;#rI43L-elT+L)RQ*9_f6HZluz#3ZegnG8C_X4pea*h4Fxkn=nBC0aF~lSS{X zqhf-%17z-M)iUwk4rbTtzILc)+C8q+6!jC%id5(sehG}{Ruu!DJV#ENqU6|#64_tiTLHe`nNr(=wp&Di3@G8-em(;+i3 zWaEa6Pe)k`y{J_Vdmfo$jYb!zxfhw?H_H0lhODt4J*Y)i9%}7H(131>7+EP~>_yOk z?kxz~TW7Vm&2n#n(sGURo1nDZTadL}6A<`?o0fa4A+9CH$_P3<1a+g9+bpKZ|5}f- zZt##rjI3hxdr*$mpk~z2zWiE)nuh+$dQ(lK5y&W~!Qps9d=|TnQykg^pg{zv_RR!b zc68zU*UOihiMmzd*!CcZBUB2HV8j%5h~W-{R<6j+OHWq2oXfH|4KbD0HB_929lw=X zt4Sa%u&;(dXB9)u>waUyd1~OV0~_BuCmB+zeS0YG;i;+dkbELE=O35PhoZA%lM#8H zUaQsD)a^COHL;0sXy-3OJFksJh9|GhZac#6qJrkm&&&xcD{4);{YuwM=1y!*Xwo$p z@7{Bu(a^BJ_U^s4O$UsPExY$NwCMEvYnAPvi_@OV{w(*#Ro022hiCOGrJKIJva%fC z_|5Ff?4gIHrS6pH6xDw?`R@3xjG9%udY;@ef8bK72mHtK0WSz46Q=htJe^Qk#$a$D%disDET46q)%QpmzV+0=V4r3gpr@~EIlZoHW(9Z=w>>)_ZI_mxsM}s1aDI80bIXy= zk4B&WZBI@272fA-v-iE6{pjo2kNC6eL%+hj-DmLr>D;Q-#lg~w5BFBQA61VtD+DLJ z8w=82&n>z{z7>b%rFed)@@?u)Lk+-KkF zxOCPQ?)dxQ+3xQRz3T!QCB?(hijOOcf=pIdUdJG_LhsYhzxNk)6Z@O2uKdTjU-4G( z)g!5_6&sI{w9OL(Ua9QW+yYUHuFt|hS~vq{qDNHEZ0H%hUi`LFJz@fN57~V- z|Bc*%m!vZ3fMo2nx{jjJy7Eqek$qHq&-s_0AJX3GSeta_UcNrdx3OYBwOWr_y|~rj zXf-2aKWfcE`4oa{qs5KaDyS0O(yU30jgV&CDT$fS(btTDaS&3D8=K5<7pL$t`xgfx zJ+#TN6+X|wyS>=x!WI>sjn>*X=o7HXh4T53y^vW2hVX7P9NI+$yq56-mFZptp>vxI z1CzF1;E+KdBKmyL&zC&5O%R+G)TNTeol04Iz*zz*)r?x)&55%F_e&nvtj?#u#b zLBq-81?k)|E)n{5qB`nm;hT=aQDwn-M$wy&qIO1Mcpb|ZaV;If z*6-p0w#|lj!~M(0MmJ=C`}%7OoNH5@Z+x72ilHB-GrJ%ht0Ou=Xz>Z5V_kJA3x<^i z?pS>xAUm#E5|X|kEDx1_vzh7DwJitBFk@i|65zi1OHIm7;(nF-` z-@7T*3=GEo+$HSMwAYdd9bmxLAyzOI>vWsv=3N*<9~N3fmAHZl8? zkKsPgWQBOu&aqUS?BwSt4I4sx#F#q5tIlM#^XdmX6%uBRHoQTskPh>*o{q&oY literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zcover.frag.2.spirv b/gio/shader/gio/zcover.frag.2.spirv new file mode 100644 index 0000000000000000000000000000000000000000..cd618ce21fc71a6bb8de69a47995e22df272a4f2 GIT binary patch literal 1000 zcmYk4PfJ2k5XC27&rB^fL9?h{TB|@>lmt;NT)1%)QLUvcf=V!vmVJUgZ=0a=yYJn+ z7v{~(nKOUxofqXgD`rbpw1OR2dTN#vVpg)e(}Us7u=_E4?4Fz+!&tY-5#dynw=9jk zjb7dftV(KIo0{|6JD1y# z{Vu8#;D67hTV4F!r%Y*Bi%PWaG8NR+?^ivG~{e% z;=scWYvNPW=QU+>;POu4Y+Ejp*53*2kdp-XqEBR<46kd4IobP~k!@i&WaXt3NmG5< z2|jyB^esrk1wYSx-VLm!7c5G{=MLfV{jMyoRPq&hwtB={uTMuV>b9zX=;JP z$LGDle7=8UALs3eABj(`J&D=ZRZo8jb-5ddJNyWVr7wgs6MJPIe0pw3=yxv`Z@_Nh zfM2QtZvp1>*&*}z{FZFy@%ii#4*0cdG9UZ&`z;Fr^ZygG5-+Pecp~9$hY~p4jb6;w WmN3tEHftxt5@|mx*sm&_N&WzuBPtmH literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zcover.vert.0.dxbc b/gio/shader/gio/zcover.vert.0.dxbc new file mode 100644 index 0000000000000000000000000000000000000000..3b6cf6bbc0bb0a08dd94d44f596772b158a41eb4 GIT binary patch literal 1332 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 literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zcover.vert.0.spirv b/gio/shader/gio/zcover.vert.0.spirv new file mode 100644 index 0000000000000000000000000000000000000000..f9af8ab1b91135d3ff35f547abd8487c5a5a55e2 GIT binary patch literal 1972 zcmYk6$xjqf5XK+Of=Z$iBOWl5F(hsvE&-zw6*OjCMrT;v4jmj?Y?%dndM4^g4kjK< z^xz-s#l-LTx(oVEiucu5%d4vQn!@Pxm~$iUm^zEHMx$1L6twpCf`0O) z9R}^F8wT4^9JZ2ZsGy>1I`oUWt@dC$?@*FQ{@jwz;OxC#-(kBf{Gi=y?P@RUht5jk zt#1E)FYXAJbp|}O4TcYU!!TaYnPngI_EB#?Fs)wqv8jz|42Flc8`3#{R(tR+Euf@K zx25m2gJu|ShH(;pmMS*o!Pt8JD2aMqe=h#i<@uokzSEZlVPAvRlrZaOm{4Z(8pLbgkVqS20AC^Pp z%x-=1_C_S=#HZiAzInX`;^>)0&c9+x+V6_x%!?A{v@Dk1<|OpX-QYu=S0(Tb-6}D> zIXHyH+20k9jqj73_?Z8^u=!IDb?j&U3&OW!$bXT)vmKbbPT<3vY=U zI}&QfZt0(=x)(X|sydoV6MYL)_8)>__bZ|GLV<(r4 zZZ0~wb?{FJ?sacGFC{?*H!tsS&OP_t`)*>?cl5i~$3y<<(_CoG4IhVZHwu7C445Ks z60by><~{LFEV5Q`+FQ5uB@i3?4N^vGto(oyKy}G+ z9%|p^Yl8&96Mvz073SnVSKtP-f#>^xC>vH4KpqO_$xSwlQYk9noc$whqS+_EXC}-` zOA|kqXCc}t*e$mWD56%V^;qF!QAjQ4gz;U6-hZ%V6iddhL1~#M#=cxY>V5m9<8+;~ zo|dszwQ@yNG;wi!+UjV!b9HTBQe-#Qv)B{62Wz}9cbz6QA`JfQAXF8o73;cbS_VAN WGymw3Gol`9an!6jUAt#HZF~XK%1&tj literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zinput.vert.0.glsl100es b/gio/shader/gio/zinput.vert.0.glsl100es new file mode 100644 index 0000000..d1d4c8d --- /dev/null +++ b/gio/shader/gio/zinput.vert.0.glsl100es @@ -0,0 +1,22 @@ +#version 100 + +struct m3x2 +{ + vec3 r0; + vec3 r1; +}; + +attribute vec4 position; + +vec3 transform3x2(m3x2 t, vec3 v) +{ + return vec3(dot(t.r0, v), dot(t.r1, v), dot(vec3(0.0, 0.0, 1.0), v)); +} + +void main() +{ + m3x2 param = m3x2(vec3(1.0, 0.0, 0.0), vec3(0.0, -1.0, 0.0)); + vec3 param_1 = position.xyz; + gl_Position = vec4(transform3x2(param, param_1), position.w); +} + diff --git a/gio/shader/gio/zinput.vert.0.glsl150 b/gio/shader/gio/zinput.vert.0.glsl150 new file mode 100644 index 0000000..ab28308 --- /dev/null +++ b/gio/shader/gio/zinput.vert.0.glsl150 @@ -0,0 +1,22 @@ +#version 150 + +struct m3x2 +{ + vec3 r0; + vec3 r1; +}; + +in vec4 position; + +vec3 transform3x2(m3x2 t, vec3 v) +{ + return vec3(dot(t.r0, v), dot(t.r1, v), dot(vec3(0.0, 0.0, 1.0), v)); +} + +void main() +{ + m3x2 param = m3x2(vec3(1.0, 0.0, 0.0), vec3(0.0, -1.0, 0.0)); + vec3 param_1 = position.xyz; + gl_Position = vec4(transform3x2(param, param_1), position.w); +} + diff --git a/gio/shader/gio/zinput.vert.0.metallibios b/gio/shader/gio/zinput.vert.0.metallibios new file mode 100644 index 0000000000000000000000000000000000000000..6fdc4270f589ac7e27e6cac5b06a6017d676baaf GIT binary patch literal 2579 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 I*RR_D0qpw6$p8QV literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zinput.vert.0.metallibmacos b/gio/shader/gio/zinput.vert.0.metallibmacos new file mode 100644 index 0000000000000000000000000000000000000000..064c5010f56c83ebb85db28f22c59444eabc2eaf GIT binary patch literal 2627 zcmZuz4^R{772mKSUliDl%0Q6a?Z$tT8SS|S2jT^0HUu%YaE(AcP&&6kWZ){egp?4R zX%iA%ykner=iR~8&X5+TPJ2~qomN`yLBe5*(c`FE8YlxJa_As3o@ecN)9YKnQ*OGm z``-6`?|tw6-uu41m%@^QT!kkNi^CQl%gRMwx->ts#Q(9xH!SgIOI*FgamC_*U$MyL zsl4|!bKy=ER%@@RZ6}`#+HT70j;@^wxAJOr@y^bFK_p0~g zuTP@f(0_iApI@R~wDo`J-kn9oYD|I2p8_k)E8eHZp1a=pT3(3^bFaCiBnhPA;f5M# z&EYx>^T1LW4ofOoM}{u*@!r$~*+nvZ8vy>-@Z?&0$90JqmJfMJXki!9vl`^cyZ)p( zqTH?075+|3Wq*nQ_Lf$11&~`W)pw%Ch?E(STxXGsl^m>;$x6;{ z$qD0XpSu;gJEcqxHC6i>)u@?Ay;R6cPX{Tig&MXqAu}}+q+%W>q@zcINdr1+1f&X1 z5(UYvM;<|Pv`g-4yeS|#w34$OY~l?b2~0V#C@9;RK?OTDNymDrDIFC9Qy4R@qsP3= zpqYtvQX@J#rszcOvyuZ-xte4oZne~?mohz)%Zgl`k|Q8x>QSRrYOKaxO~_S^gH+^@ zN0eOEKBtHp+Lz(?FjK+jPI>x%ke&!8&FH9pFFj~yum&}11dy0o_9aT9D1!&Unbnfm ziJaJsnYjoKBI^mN5u5IL#lbWcsyzrkaJ;B8zA5+Ho-fjy5~X7 z3$MH=pk@tf>_jktX#Fo5YY3&L`#@GU91%#=Vn_?Jux!1ZU=zsY zj!5?cDhKFj5YSqItY>BLFX)i!i3Yh@)Xbuvfbs$bHHS@(#cV#cAyXA-e!;kO9uG!=NC^k2XZ{OT$X9yr6>5z_cf(tttq#t=P0{Kxr9VtySp# zPz2m?_HTiFEnc8`?=Rafay{pJwqLoR%U{Rxxg6OtF)=d8#|CFYBmC^()b#N97++N( z2o>d3l@8vvAczj``(|n1-0)ard~Ukvn7WngxB9!Rs+7WmPWvH?rpxNjv#RRsHI7#f z9Ih2>4jp`@@?hOzM{UC!l{F3aibDr2$|*MW{Y{@6p4?V_FtB&JA|-Rzzi*}FOHY0{ zow8|QZ)P69`h9chho`TN>`yOWyT9Y@j`Gs|9i_kMDC-#epe*fQ+E{8?th`;j|DPH~ zS;T+lZ#}(NuAlkr%$1&PE5HA4!-{uJ&whE$xA~bP;m4bQWgmEwlE2HcX-naajRkYF z*S`DF@7k`Vji%llEnoYi*w05b@ilN_8uf7qB~K4ppPVZ=aW3)U=Icr4PMjzL7zv}J zrCM3_^$*j_(wHlMF#O5T!~NM{ICcJf_x7Hx#y@ud-f%H1^Max0{Q2Z{&s%}zY$dPn z`rffTeoMcZQRbf0#kC}DQ)3;0LwWtgtUx}PP(7F@rflS_ji?idSqfX6;<1OwNX%tIee{hWRmH_GsQJ>PcuvHU(}w3n zo7$inA5kN>73wN#7V*X=No1w8=qh41KumIgj=Te)Y($2ppB{(qprb=}riwdmy6iIz zS$15+voHIy{kSPQpWG;*Bh@IY8cGbx@<<{SSOGOcBX}AQW?dfX4X8WXh3?bt-7*Jx znjpUHC1yFiA|e;n#nMWR*{Q*$;;*_LuB3wH6qDxRgf4kYocEk$vw6vtZF*01BZ+Ze{G zTb^d!mghgicmvLF!$IGdxLa(~Cg;v;`lztRxL$QslNaHxvdYg|%{paqQFNPHkrC1G PpC0n9#?oNJOV9rR5qFK; literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zinput.vert.0.spirv b/gio/shader/gio/zinput.vert.0.spirv new file mode 100644 index 0000000000000000000000000000000000000000..eb999e5f3a630ecba15004ac9d97c747d7fee91b GIT binary patch literal 800 zcmYk3-Ae*d5XEomsw7kr)teYr4++wTN+kt8$ojCLA@sV0E^)zD(JiXKyqBQ!+YfPM zoSAdaoSAz!pKFwi*)hAOY=$PWs>um4recb5biIk!T1T^1yK@C&&*WnwoPDEqSwa5( zYD4l1c~hR(4^CHq1x;{0-yMxyZ{SatOMe}G&jWvM!@!@}RWOb0X8^Cf#k1jb{xRDo zIAUziab?XVt+K*7)SfEJLc%e z9hO<6@}V$hVU;9oF!aEPu5{q#;=B;+)Rbd~Lcvet*GV|X%8SD4@*~~uAkEQgrgc?0 zcA~nW2%mST>7Q8{R#$zlnlA+2OKa{0#`&cp+VpTv&0WEmf2~-TW6Y<%k!St4%HbwE z7tBL?hF({1#QoR}qvuzMqxdKkPD{?bXQ62HQ%qrl4N{Cb8P82I^!w^%kG32w_Cp`N kjvRcfZ_T`WIWy2igLC@XyC>&uc;6>&OAY@|H@uVo1HI=&aR2}S literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zintersect.frag.0.dxbc b/gio/shader/gio/zintersect.frag.0.dxbc new file mode 100644 index 0000000000000000000000000000000000000000..f2081ee02cad61d76cd5e2f052a1eb91c4d0c09c GIT binary patch literal 776 zcma)3&npCB7=CtVX()Dca!{ryt0Wx6MfTUAu-O^fq}F2C%`$6jPSSFAaBy^(gIw0Z z|KMNn2S{6v%2|!)n;$je;H_ug=Y8H^-+W)Tn9jVmrR&EH^{V!M{;WTYd_(}q63|IM zL%a}8ieH2sWlW^Zv;`xPvS2!{Qbjx}pQ2N1Uz{jfo1DKr7;$>%qa z<93#4V&Ah+!yw=TliJq~+%1-E&uDC^1FO~(PW#cbi8iFsm_*c5ZN6J$WKA2HND zzP=9ZBp^*Cyx3sfr{eJnXNr5s0bQT)G}W(DFT6OIInAr;^ZUAyXkNOT0P6CauSe&7 zG34feh^D9X2DKO=_6ZZ05w<`NYXSc&_m>vbhkYTNQ}058*gGKN7;lk7PDr;1KEf{( zI|L31(Z`2%|G}Y=y15?u(yn=CSf$hQQN3nZa3ic#cP;bO+;1q!!l<&itSu{ArMzcY zO2#~@S6Qe`PK-~Y)oLwi3#()PJegi00t?P1k?6T%CZ8{4MNj@8J#h}vHcEQgIxre+ F`UbttUs3=7 literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zintersect.frag.0.glsl100es b/gio/shader/gio/zintersect.frag.0.glsl100es new file mode 100644 index 0000000..90fe2f9 --- /dev/null +++ b/gio/shader/gio/zintersect.frag.0.glsl100es @@ -0,0 +1,13 @@ +#version 100 +precision mediump float; +precision highp int; + +uniform mediump sampler2D cover; + +varying highp vec2 vUV; + +void main() +{ + gl_FragData[0].x = abs(texture2D(cover, vUV).x); +} + diff --git a/gio/shader/gio/zintersect.frag.0.glsl150 b/gio/shader/gio/zintersect.frag.0.glsl150 new file mode 100644 index 0000000..f574aae --- /dev/null +++ b/gio/shader/gio/zintersect.frag.0.glsl150 @@ -0,0 +1,12 @@ +#version 150 + +uniform sampler2D cover; + +out vec4 fragColor; +in vec2 vUV; + +void main() +{ + fragColor.x = abs(texture(cover, vUV).x); +} + diff --git a/gio/shader/gio/zintersect.frag.0.metallibios b/gio/shader/gio/zintersect.frag.0.metallibios new file mode 100644 index 0000000000000000000000000000000000000000..f48da4e3e53040dcc95c1f7a45b044d5ce58c71c GIT binary patch literal 2791 zcmZWr4Ny~87QTrL<8^)J_VBg zabYX~d!g?!ZFnREi{LzJS$%`!Bo-12{7Qb+T3r%9*y0JkQf6x^-D8y!j)HtXRd@UA)U2y?K5OiW5i(m*L zNUef2rlMw?Y;llU4ysQjGo7SXit5$YCMK$fvmhYkk17Rz1Rr(rr<8&q5QJR(0UHxFVKxPuCkx5ceX0la^wmM0joy<%{^-@v~!eYU#|My+*TZiI-m074gyr$?V@t?oaiN6;VK3h`^Vwdp>guYZ#9uM$0*K-2#W;f9` z#9eVT!%<@%&+q3WsZYlO7B)W}T=$ zA2lh^mdHS3XEixd1AK=V-J>L-97-6M@Ivfo z({G#GSmPuAL{wDubtz24%6aGTU{VEta{FnmDz6`}Mg`vd!0b zo=m!P_g>|~gCC175t)t3I^F7;JsNFYgKG6IRpTC=rnzcYU9+;fK^5{0hbjlggA>D} z{>p%7DttBQ2@hTMk9mBfektSSm9;vhMpeDHwpOL9s#UersH;?s6oid}2>Hhb{h_O2 zPw1vU%Y0Y{ zp@${!ZK*hU`rwJm(d|1)%>a8_LPT_03beAxNS&}YR+oB7aWt;?s*SX+sXZ|RmuDoF3t@-pW zhm+J+Em1UNz4vEHg6a#OLSY7e&X(& zl+ZGVq>8qsy}ftN^_{(P_@BMU`W(F-AKWO3zWRDYgI=?`4(?w|SrieboUPuLviA6s zsmx@ibqf`u24&;!y~^FHD(FLV-JZs>sPr%w>WQ9=FpdvweewfiJ*B=@#iNN*ts-g( z+|=Eg2xMj?|EMcK2Gh*J{idHM&*}k1uqsnbg{0Nrhz; z)&IBv!nT^pDp(PCupW^{hb8UNEbGw(>xX{U3_+`gMHyDoK%^a0@?oX(SunqnF=Cfw z4@$Bfk@liD>!>8Fi4E6|%GL=d&kq)(rFlPlcsZ;1LUkVG*PJ_go z3lAXDe^dcWXvu{*C0s+@yB5*KX&l&7=bEoxK{t;v!L@i0wH#ys?iB8vHcA6<3M^+_ n=d>wi3paj-4~T6-`aqXh*pBm3%ZV@K^uY#6JV>O}<~{!dIt}ns literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zintersect.frag.0.metallibiossimulator b/gio/shader/gio/zintersect.frag.0.metallibiossimulator new file mode 100644 index 0000000000000000000000000000000000000000..b1a40c491fec5c2fc7df3e3c8768c72bd62c6e5d GIT binary patch literal 3233 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 Ae*gdg literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zintersect.frag.0.metallibmacos b/gio/shader/gio/zintersect.frag.0.metallibmacos new file mode 100644 index 0000000000000000000000000000000000000000..f16d19047c07dd77be680f9cca44f82ba678fc7b GIT binary patch literal 2823 zcmZWr4Nz0r6@DQhH~hVqAOk^?>u85@M+6216AU#}`B_m!F>$uY=nclhbq~v!uzwG{5?}a}VM`mhV z?<%;{w75+4fAzA-X9kXEC!B8LWnP6%aiwy ziz5*PMvp`^;=vR|!+Bs`c0xA9DqwTdvraOaB9lTn@gmmIGD}Q;NZ!eaye@8fOeTk4 z5T34Bt_pXEmw7f@BICt|s)mJZI*;TJ*pMraX z59&$k*E*)zMAhqoAq5z8OoIwEsGv+q+9;C))a#f=3nkG}`VLTo_{4%yt;oy3hs44u zvA|;$dYw_zV!?=2I7SLwRw0~4j2uwgMi~%JZ3<;>qa+q!PNAw*6r>UYn4l>f^wY{y zP66T)jyt1#GLg$ko0gD^McZ+!c{>HuT7!R>= z6#5fu@=p{0y}}}H<|$sTQ6iCv{5-KIg;Mhn{N43jAI~yCG!DlsKb_IG+cGZgr@x^k zm-H%N?qR;Cv*|6s1oxQEBUNpp%>7iRg}JuHmZ@iEj_MQc53}bwK&=#>YfuvusvKx_ z2Qb0kF#Dke)CYg`APMTZptb`*0d|czs3(A-13&?G7g-<|&ysJjzo#y-7rfniE>YqIJyh{9J^5DYKB<`qy_pCHnr@x90OpVr7Oxsv)q( ziHT9Kbj&;L8kNp?C#Ocn{nCmuk}NB&C^tye!3m#t`>Ubtvm^eY@!6@(&72d2N7p>4 zvE!($8-ZYKJeVF_p z{rO$?nZYenWwDa=|G5*Zq@Mp`DmHm=i$u{9{h_Snw`Z@9?no$Ix}*JQduhpz_L7g= zx3&AvY>WQ~e=Kg>SZN!7$Jbo(cK)H?U+Wuc?K{zW?Kig$UHiE8);r-FP8q{aWxwdW zZcBY(i1=mdIql%{Smku;oJePXv-Vzu^$kybw zV5>xVredqoZGXJdzNy)^v-J-558}kP&nKq-C2@r-F~!^41W^vR25#NC)>=g4(>5eT zoZHY~eDQPRvQ+oEXgVKpciC6BDD4*`k6+w$v9Q^Gl{WW5X!)v7qCU9bqrMpZXlJ{h zdp^E%<-eA8#&@nVB(84kJidX>RB1_qU`M;)cwdhs^Uvv7Z|^=(yT_oZ((g0KyQW%P zIK3coMYN4`WRPs(Rr2_Xa>Aps=#F?vg$JD>vBwka$8+eU8kDW(a@SUA7* zvmt|H5qJWEiWo+2i#)T*ZO?W)sa&O_Lz%4v!EG~c_P<<@P<=RL4*d?YzaPQ z?vOm!&dl|h?66EVaDZ7w>0!OnGiyzh9;f1cJaoo^1_%fcy9aTp(G0GKzOzTgLYG!l zK^)G$Y|9>&XMM`dxopd6VrKj1VrogypaW~^0tnVxC_OBOB&baRwcm$Avvn3~7rYbs zl%Wk)U2EDbOw|PXT|YWQFw2JMiYo90sb4Gb&X;a2`>sQtH6+h!3({V9=4p9m3p4w) zdo^_WLu2-BW_FJ|@@gfeFQE*2TaAvsd~5hrO$QZ!LxasC*b_B6=|JyEu>elzI0H`+ z`UhY|6^)1meyhkoLD$Ad3{eHYD6>cY-dS6=PrZC05R$4h0aII1;WGzDXF#+!SOCSs z@d4pM1}wG$pIA7jWfvc^W%}INJ@Q6@G=XicMpM3v3PfpLKD0a+wA)1y|ZBv=}T)cmA zv8CuJ+S0-60aea>&Gb>&ryM$W=Rh|^j!Ao7I)72rFxLnUF|7QJ@V6;uluSi;v&UBp3Dwr z-blYSWwr-@kzx9W8)}leGJ37)-^uZzlnvdW!>^gC;P3-8Gl%zE%J|VI`nED&@aVzJ z4c8OiQ;rmzlMMG#=)d1rO|N*)^e^GdY#jJsF`@FMSbAc=^aJM2T?OwwO2rP?F&g+= larm<9eD_T;aO|8Od5imNY3XICV1M*@r4GPo|D--wtO2##9KZko literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zintersect.vert.0.dxbc b/gio/shader/gio/zintersect.vert.0.dxbc new file mode 100644 index 0000000000000000000000000000000000000000..03005ea59acacb6075a3d4484ba7004284677e2e GIT binary patch literal 1048 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 literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zintersect.vert.0.metallibmacos b/gio/shader/gio/zintersect.vert.0.metallibmacos new file mode 100644 index 0000000000000000000000000000000000000000..a43236d001a1b64798fe67eb9d12aba11971f806 GIT binary patch literal 3012 zcmZuz4Ny~87QP`N_X#11$VgIN(nQqaHnkC4egt;{0gO|0V`cdfc1*%gLs#UHL_)%L z_k{!=D$ZtY)zF_=*s5!1cW2SssczLFiKR4+6qs5gWiwEbrH(q(b*($o>F#*}Ywhft zA`Tsg;?UxAIdM@|EsZ;t$&lH&ZX~NxVM#^s-Cw8&6>QThFX{rlq-Q zf84nhqfI|AEiIQUV*Q`CqU6P$1mYm}&q3RYckUw4Bhw|@i_2M>6@}&HN#GdOVnvAF z*M>MWsH%CO;_=u;EO%B$hf-r+r@;6)@c%D7McSdLQh?A&2uxz9A{L)yn8&X4-xrSX zw(`Z9d51Y3!J2qND(4+E(J3WyMTZlMj*Bx>atX=Sgv{dAx&*H>{ql>nK&rH?#v{7r zrc?c=G{XyQY<7Te9*}7xYaX)pI9~dIgt2?EBZFz}$894_wwJM=!gd8?Q83vG#x}^< zpl^0Nda$FP$yVcbv%8JJP7NL+11{Oz0Es%u38OqvNJa+8Nm?FI$|3_v!%8v&vm7-; z85lN^%mQkUXlCO}XTu zLiuDr8Bxk6IsMpiim@QRy`5#^AegocCYxsLI&AM}EM6u%1GnjzHZ#}Wj_qbH%u;Gh zQ;gm0wo%yXdxAeLpB;E)R3p1JAe$aYnpcvSU9yl-j;sW31CoefZBYzGvE+epwwa;& zu?@`^%5Q=10a|{3^~1w6C%LU;6k6GaXS#s z{V|kD4%UZ_GH`r$Mm9e{4!h)0@LfaR@{{2KayDk@J{T=PJx<_5U@N%)gB^L~(Jcrj zES`~tT`ZHxj4a@K>`}HPfK;0I{F3h=0e*{C(~xUhAurf(afL_Y6GQ&(S0KcG2AQjL z%M|rpyjNEp_ds*QGvG~0E<4bh=s8{{)@7j}5vT6epbFwkNz;K0|$Em z8OIQlOLKF2+_@AtH$tV|9OExQf@-kSfNil(vsVZy+YY}m{#P`1#(u2QfSqF8){mhB zL#qNi)!5RHp##Gw5DZVw8h$h@dIHKIvS@w)We`1qY!KOi!1vq?q9+ZB95GfFSR=;J zHXB5(3YPric8vc(j2#N>RN#HEIM%{4i=Or6aSO}z>|4$sv@9CJ77YtdDcJZd4x6Wi ztO-Da2&g@I2u?2ckpwa{OWk@GtHAKjl>5ZeNve3zMP2P!9xy6 zhAXhBrRs#A+Pr>7$!&17gk5YgNY&CX3kr!c zd_HpIitjVWL#d9D3H$uV5{;O5HDD@udCcb@Cr z-dzR;Uhqv_KUPy!BgG&50RglhDjYApG=% zja=%F&P~iiY`QZN-z#|Gz2bvE^;Dg_xr()6s$9FJviqAObNtFJTh^(zjdtB>R`ssG zbLGynR}TF}@VjVrUrk@Fr<&@O{7XXnU)4VU8_vMU`?5lrMmvd4cv6q z7cm-S*QO7YDe0^(?vYM@gr#Hz|149qH>@;@9 z5FEZtMM755V`K~`{;z$>XW^7%za92Yl10$u$j{;PYVg+s^#YxcP%Y!ADIDRRz1`wwc)j-v*a~envXF zQ*;-J?&*cIUf~UmXhtEt4PGcRWK({)TF57qB-{k1rb(!bw>a`f$&TDX?WQ-~`CakO4)*uU*6@;4F~fFwVNRz-v$b1 zwfQ|T4EBDQ04c-Rfe&17GO)$xs=Xl=-X0R()C>QmPWMj~LS0UUVj2Yk`s&={?t*i! zywBYEurLk3LhyWduqN2Ja1=0Bsqq-zSbSl0}9IE0XT0wmI z^!~ga)hB~el#qpZ!-Pi6`?`e>IBvoCV0Z&BxY491{3m(o{4OzdKn;V!KMAaY(9o3) zJa^7VV!`$HV2O(p-{4hJ>l3s8BghnZ8;j5%zV6=sEH@#f&}#OT^6p9NB`URANq@RW Qn~L5|a;>Nb3y+`w0r_?;Y5)KL literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zintersect.vert.0.spirv b/gio/shader/gio/zintersect.vert.0.spirv new file mode 100644 index 0000000000000000000000000000000000000000..13e7335943be7033c378c0c85421dda681d6f91c GIT binary patch literal 1368 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 literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zmaterial.frag.0.metallibmacos b/gio/shader/gio/zmaterial.frag.0.metallibmacos new file mode 100644 index 0000000000000000000000000000000000000000..911948edf0a90cf884ba4f6cd38a7f2eac0289f3 GIT binary patch literal 3383 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 Z*7x_p+J0Me7O)x4-Mir2Un)&w{{X{WVhsQQ literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zmaterial.vert.0.dxbc b/gio/shader/gio/zmaterial.vert.0.dxbc new file mode 100644 index 0000000000000000000000000000000000000000..a5056cc10b59070c376ba7c1e0eeaf363d65347d GIT binary patch literal 1000 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 G*M9+u%^Cav literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zmaterial.vert.0.metallibiossimulator b/gio/shader/gio/zmaterial.vert.0.metallibiossimulator new file mode 100644 index 0000000000000000000000000000000000000000..c710ca9f6bee109c64e511b322f517ed8064d9d5 GIT binary patch literal 3406 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 literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zmaterial.vert.0.metallibmacos b/gio/shader/gio/zmaterial.vert.0.metallibmacos new file mode 100644 index 0000000000000000000000000000000000000000..cfbdfbc69032a7716dd8df4d028684c76f1485fb GIT binary patch literal 3028 zcmZuze^3*57T>TTn?gteG7w}pmxwr2qg}wpAlOL=C|a~pISIl|lPFBMiiSW5!Ft`8 zz|xw|<=Rq1uilZKbiAoE#hzZ}{4pe<9HxDLG?G9dxMY+5X{N?`^k!@%65s;Nl>$4rOX z5QKWU17T4hs$+wQ&1NPs*clob$xe8k3H*7${{uYb>XC?)haew9U{a4t67k7^am<$Y zJJmRQD@RyV@+Ql{%TMO!h}p*sRAyyT`J1WbCxu0s3a)5tN>RnisuY(rZ*&*M%aNK_ zV&hfmhEoHllw%7_Y<7Zg4xqW?`QJ14ST5>y5p8i{)&jb90P7g1l4ch9xu}Li2?uRdNfPPKL%LNCrD(IroervzWgnZWFzXPy(P(Ev0tv!o z7TwxOTSsUGg>LAzD@>?j+LU{1lCuEGsl>W;SbL(=;^ITPcEUT!`G&%}5-%gvVO>J3 zV*rB=ux%2oi^R+W7<7PrLWAzfQQgl*1y88b3CzmJROtjyXx0hZ0l<&gbb==h39JcJ zW|$+ypl#6!S|tqlpV~>z10iOWU|kaIWtg03VVYUP`0`T=(=^PguE$zN8-kgYjB=BN ziO(Y2GRtR7fHsH#=_oCr^g#BLzoiXQu zvdN&+85)}Qo0XcxKrpcPN73H9q40R*ZhTh{_ZT^ZSgK;ydojRy~zTiRaS-`u7*9B5QKZb`D=S@m_%gU>m~$M(bxS@JF4UC-J~ zKlo)lYt`5ud4)FP9hLUo_dc7h&uv&<-+!#XL0jLiJ<(s+A3k1}^H0%CcHK;aTU7sr zP+uqN9=tL<-FIcGFM8zC^(pW5sn$RLe$88I{o&j;`&NA>7|K{>c~E&At9@`Q>+?OE z{mwgUojZD}!NBwG@E6DHwe>mJh1DNQgCW_(J=tW&+Km38^(EQoKN(*Cx3e2IEN?n+ zNZ-D`VPg97KqMZTgV^*Gq@F8#{#?beXC2xPZmnQ!7;0B-sqOi$FV3mmvgK*n_KEI0 zEi&i2J6G?lx%$Rw-ftsy{q_9~qF?3Y1a8!7-wkKu_0!s%ncQ6P=|*h|2G*pR#j-En zFGTZXUnXGS-5W1RGxHc((j%F;kAZe(WAR^#N}gk4YmbdT7;Bfz?Gw$5feQR>d3sE)cPg=WwM9A~3CG003qBPzSI7pl;_hX@Z45gUFRj&^Ta z&_?*8cwE0t=+rEYN{Dd}4yEP;w!b$Y52?iA5vJ_GxgPNnAFxNcs}n+s@Og;|j~JE* zqS^CsBdKx_hR0(F{ofHaR>}Wvm-1x(HRYKeSj(mav#$Sr~86_+X&~; zzs1~Hin$a%8pWG3S(|#*3WwiWPGQzgs9LSOI3lKZGyt3!#beAexD3#EfoDC zoYkU4Rd?HDcNh3~XZimb;m?z(0fHIxES4-htj7aOMV0fpOI)@L4VQvW_s;73E&&q(@vp@J zJ-)a>zhS{$01rxu1wE&x+pY-uONZ2(ARrHYWifSWFR*^+rzy16OtAW(d4(KkCa=mhx#X8Zu8PAd W1RN-Q^*xea`&u-8l(|qo_WTc$4oPJI literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zmaterial.vert.0.spirv b/gio/shader/gio/zmaterial.vert.0.spirv new file mode 100644 index 0000000000000000000000000000000000000000..18e731f3401bc9bcd5c5c99f08f4a52d0a279a48 GIT binary patch literal 1188 zcmYk5-A@xi6vfAGTdE`~A>xCEVDKwJizqZkKqJPiiK}3Uyl!y2ArqEu(_I?%Ngw#1 zeIeoeW_C=6+|E7co;&x>oh53m&KYyf+%P@!)%dkwT4IcuH(j^K$zjs3>S2F#>jjFN zCUQbFx6F0txAl8=Y)il+*%R5CY*!ZP5A8rdZB>esG~VBjlaFaO9;a3PtH{&BmU%j~ zlRT^KG)LE)(b+O9&WE#tjuf*sJE}q5>GvapPyO?$aXx*FN0t1xc`kpi7-gs0yJEns zDmyMzR-D(+Z^&7fpZ@Sk9VxbjPm1&)pB&|rI{zss*7NwpMwPAYs1!Tr^ql8-Th@p6 zH>F%}%!d`LF8wb%#>-A8Y6A5C=0mIP_p<2VNFt9%wQ0``Y=6;n9P6b2#FB^!VuM?~Qi) z6v1jtR z+k0iu=Z1{lnSao{Z1@XlIPaB=Jou2eDW5#vDdcU*hyUB;4djyx|4ke-*ptDt0{1~a k9P>WV_s=~)%g_?z?Rjr%Gm9@W=0nfi5sdy)C%l$j0U737LjV8( literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zsimple.frag.0.dxbc b/gio/shader/gio/zsimple.frag.0.dxbc new file mode 100644 index 0000000000000000000000000000000000000000..f4f88942da87af0742cffbf144ce2251326b0b71 GIT binary patch literal 476 zcmZ>XaB}|Yb}vmubH(nkSH)Yii-n3985kJu00}lAZ2`m+fcOFs`vApe0PzYScFfPS z3;>FOFay*7|2jZQ1;hrEAQln^$_Fwqure_4FJNG3useH($DV<~0f-yyfkrVgaPT)U zFg#iC|33pmu!lx=ltA)%p4%Y&_K_S!86$1j{|BJi1r8aL17GX3y7}(#4x}NW$**(;IR0R M#G>@n5{A{Q0ngn(n*aa+ literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zsimple.frag.0.glsl100es b/gio/shader/gio/zsimple.frag.0.glsl100es new file mode 100644 index 0000000..0f86af5 --- /dev/null +++ b/gio/shader/gio/zsimple.frag.0.glsl100es @@ -0,0 +1,9 @@ +#version 100 +precision mediump float; +precision highp int; + +void main() +{ + gl_FragData[0] = vec4(0.25, 0.550000011920928955078125, 0.75, 1.0); +} + diff --git a/gio/shader/gio/zsimple.frag.0.glsl150 b/gio/shader/gio/zsimple.frag.0.glsl150 new file mode 100644 index 0000000..db4c060 --- /dev/null +++ b/gio/shader/gio/zsimple.frag.0.glsl150 @@ -0,0 +1,9 @@ +#version 150 + +out vec4 fragColor; + +void main() +{ + fragColor = vec4(0.25, 0.550000011920928955078125, 0.75, 1.0); +} + diff --git a/gio/shader/gio/zsimple.frag.0.metallibios b/gio/shader/gio/zsimple.frag.0.metallibios new file mode 100644 index 0000000000000000000000000000000000000000..05e6329e182316294a9a64c1f538a67a8a18810c GIT binary patch literal 2359 zcmZWr4{RFO8Gi)ABL)NhvlY*G^hlG)QzDl*5y8cljHx}+;1thR)wIqGPVC{$b}U&Y`|f@B`+nc|?tYJsZe1%2ZG+#&acIXz|9r_lUFtt8^}JI5#Uu8YC0k!|V1dm% zdsN-g#zn)%!4Wy?KBjMDA(mF%rKM2C4|+XQ-9LTn7dORUkP|QD;*-f~!%+P%_mZEN zUFgbGJ=@;iEh&NifA?J5_q%wAh4^r7Lmf|dy}&~cLbn}#x|?CKxzA2N#%EBf;W`MD z|AC`bGo6(Q5GsS*`D0YE1XVDPy-&QMj&lxk#SM*bvc?6wxASVGoY(q1;JlbAI zD?GGAiydLw5~LM%*si7RCbq+g9VRx+n&sGIrX41q&5W&~E&M&weB?pU7IHO0E=9@< zGGf+CCX7;KT6>^V~*+}_{jGUh#6J8?S@;I=~ z8l{j0prvI*fkh&Bkaj}_7#eICn?2YGgq4p%^+_T6oRNgY^Et8*A?Cc&Eacuotj-Y0 z2$3%ax(`8{klzh_c-RW*Z(5ND8LdJw!8u1Jy$q97j*NOAW(3QR4#RuEd=gb-2)#-n zR1V{YoxB~?$upd)otMU;xicOKR#)o$0si>7PD~v@F&@X@tMe`hILQjn%*JtrT|4u_cUQ0Ol41!`4~DBeS9{PzI5uWfPP^v<2B9vH^kraWjav1`@f7 ztSsOo#?THMM57c#{$abo{Ys2o6n0bi6gU@KaI@%{TpqUIre~gVZ)zDdge@%$xS3+= zvtbS|37HUp1{IL!YY^HfI6@Sk1De3Bmoy}(sn7)jJNA5Uj-$C!SvP(~!m2AOrwi71 z5PZJF)`=%R+W&$4+HbEN{A0t4T1*fx)@Wa>IWDR7AAc*;lb)=N>jVN_;8q|Y;61}k zOddOSt8`0u^w#mWYybNB-+IbkyWH@hTrpxCwA7z?Y1lkC)L(zHf8-_0u(kK(pw-wn z)Sr(o=6mL{>7~U~q9++$Dcnd$3kx?AndodPq2+FVa=>C7?(aJ_Fwk%59q6~6F!lD2 zFc1L-BA>{_6Zsp3XnsCXkeqq%<7?v|zw`1Z%QF)%Upw>riBIGwPV+BblvVv~&zF^Z z9A7Pe`_t#tHL;L@sZ-^ z2d^|7`tZBn+q?I5%-{TtZlwP1pNF53Pm~=wXEpMzs$cU}d;fi9@43k%r>&Ef`gb-} z<3@I=u$axPToz26n%DvU`_J)JKi+G-I9WM_5VKay)^vd9A!c*LKsBq`uThT20<9kG za)N4&3RaNlu2^{ABRn8zl}2aC`3Nx}-(Ga{)h5}^aZPi8-JEm=K;=&JuuBVih23Vh z-AS7%x+Ym6Tnh?wa?yxfbZ1?-t`{B<&yrbCT^SiQN(bbxs;>J~3!26c*iF}cP2+4; za=qGaz^6_4kO@9%e8@waLAVUq4g&l2c7Szw=w2Q@Dk-XZ$h+^}y71nT@L$uyH95O4 z&WP29WDyx7ktm5O_tT)JF|KJ072B&Z<#~Vwgpnx7$m|UH6Bg_RL{dhs8@b(Qe9B}@ zHKl2Wf_xKg%4<}9Fk^w6Wwa|qJAe;te|6Xr^7h;j3)iNF%X;BIVbhfRGVv<_|#?N4-xB kJ@b86pQxaCV};M&whCW?!F@bN`Cr*(<#1sR^kB>JU(4h%+5i9m literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zsimple.frag.0.metallibiossimulator b/gio/shader/gio/zsimple.frag.0.metallibiossimulator new file mode 100644 index 0000000000000000000000000000000000000000..2c87af9d724fd760b489d533c66c97c7f5d7fd8f GIT binary patch literal 2721 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 JD&ZEc{{h9!M2r9c literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zsimple.frag.0.spirv b/gio/shader/gio/zsimple.frag.0.spirv new file mode 100644 index 0000000000000000000000000000000000000000..2b2aba3be5fd4bf28e0e102c058818a707a2c311 GIT binary patch literal 396 zcmYjN!3u&<5ZpA&)U*id7DmTHI+O%~1|7V3>kEV^f=aMHzz?kd=@K;a%4lKToq6+S z_o-{+rbtaJF~yTlbVUOrVoO8SB;BUL^|lMiB*vAgJ`8`r70S9{z zGtEHa@vt97lDe`8eqz|joo3L}H&&l6{bTT}z8n0BPaWhV#w!JTmzZEL6AymrZi2t$ z`8&|1z@(14c%bw8;5Y6{G6U}3Z`?D7Sb9eyGd^x4W!U$Ki}nQ;-99kclnY$Q%0cE^mm#no~FB^Jh;}%o*_ae0-=?*TLH92HZerd5|AD zxMD2w4)*>m+<5>kmr!4%{5(giIh=)vcpYmoAJ!={?top^W9W0H$`SDjFZq~v&ZEtm?8SjUPw}Z2v zkpp}PRRzAEc{!Pc+;jcDNc(nkZ4*HnBC-MFgPN4)YBlVF{GuRJ4~T3d@7MK!*#S2i zCD-uwrX=Vp>Oi^>wVdk`vlnpQNo#a^S2kQ5C!r$4l_NL$~b*a48_^oQ-F7T1lPsFb9 zZg8Lvd9Cal>tJuR9)I4%SD zyFWs>a{2Qsa;N>(-7Vl57yqWox0p687yL8h^;VDR$H#-7_l<*kVu)YAwYj{yy4IAF flap1%_)Kk#QOC4lT$50=H@;iHzyHJbA)MX= vFrom.x; + bvec2 _35 = bvec2(increasing); + vec2 left = vec2(_35.x ? vFrom.x : vTo.x, _35.y ? vFrom.y : vTo.y); + bvec2 _41 = bvec2(increasing); + vec2 right = vec2(_41.x ? vTo.x : vFrom.x, _41.y ? vTo.y : vFrom.y); + vec2 extent = clamp(vec2(vFrom.x, vTo.x), vec2(-0.5), vec2(0.5)); + float midx = mix(extent.x, extent.y, 0.5); + float x0 = midx - left.x; + vec2 p1 = vCtrl - left; + vec2 v = right - vCtrl; + float t = x0 / (p1.x + sqrt((p1.x * p1.x) + ((v.x - p1.x) * x0))); + float y = mix(mix(left.y, vCtrl.y, t), mix(vCtrl.y, right.y, t), t); + vec2 d_half = mix(p1, v, vec2(t)); + float dy = d_half.y / d_half.x; + float width = extent.y - extent.x; + dy = abs(dy * width); + vec4 sides = vec4((dy * 0.5) + y, (dy * (-0.5)) + y, (0.5 - y) / dy, ((-0.5) - y) / dy); + sides = clamp(sides + vec4(0.5), vec4(0.0), vec4(1.0)); + float area = 0.5 * ((((sides.z - (sides.z * sides.y)) + 1.0) - sides.x) + (sides.x * sides.w)); + area *= width; + if (width == 0.0) + { + area = 0.0; + } + gl_FragData[0].x = area; +} + diff --git a/gio/shader/gio/zstencil.frag.0.glsl150 b/gio/shader/gio/zstencil.frag.0.glsl150 new file mode 100644 index 0000000..8e2abd8 --- /dev/null +++ b/gio/shader/gio/zstencil.frag.0.glsl150 @@ -0,0 +1,37 @@ +#version 150 + +in vec2 vTo; +in vec2 vFrom; +in vec2 vCtrl; +out vec4 fragCover; + +void main() +{ + float dx = vTo.x - vFrom.x; + bool increasing = vTo.x >= vFrom.x; + bvec2 _35 = bvec2(increasing); + vec2 left = vec2(_35.x ? vFrom.x : vTo.x, _35.y ? vFrom.y : vTo.y); + bvec2 _41 = bvec2(increasing); + vec2 right = vec2(_41.x ? vTo.x : vFrom.x, _41.y ? vTo.y : vFrom.y); + vec2 extent = clamp(vec2(vFrom.x, vTo.x), vec2(-0.5), vec2(0.5)); + float midx = mix(extent.x, extent.y, 0.5); + float x0 = midx - left.x; + vec2 p1 = vCtrl - left; + vec2 v = right - vCtrl; + float t = x0 / (p1.x + sqrt((p1.x * p1.x) + ((v.x - p1.x) * x0))); + float y = mix(mix(left.y, vCtrl.y, t), mix(vCtrl.y, right.y, t), t); + vec2 d_half = mix(p1, v, vec2(t)); + float dy = d_half.y / d_half.x; + float width = extent.y - extent.x; + dy = abs(dy * width); + vec4 sides = vec4((dy * 0.5) + y, (dy * (-0.5)) + y, (0.5 - y) / dy, ((-0.5) - y) / dy); + sides = clamp(sides + vec4(0.5), vec4(0.0), vec4(1.0)); + float area = 0.5 * ((((sides.z - (sides.z * sides.y)) + 1.0) - sides.x) + (sides.x * sides.w)); + area *= width; + if (width == 0.0) + { + area = 0.0; + } + fragCover.x = area; +} + diff --git a/gio/shader/gio/zstencil.frag.0.metallibios b/gio/shader/gio/zstencil.frag.0.metallibios new file mode 100644 index 0000000000000000000000000000000000000000..52f668faa1449d812ff4aa117e1ce591153b2ebc GIT binary patch literal 3159 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 literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zstencil.frag.0.metallibmacos b/gio/shader/gio/zstencil.frag.0.metallibmacos new file mode 100644 index 0000000000000000000000000000000000000000..358a02a1dc3453d8a87e0866695e758442ba8fb3 GIT binary patch literal 3175 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 F_y(H$&yoND literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zstencil.vert.0.dxbc b/gio/shader/gio/zstencil.vert.0.dxbc new file mode 100644 index 0000000000000000000000000000000000000000..505672fd515f05b0a94a126647449a61503d2f99 GIT binary patch literal 2120 zcmah~OG{K?7=F*iahj%P5Q~VSgSfDWD2r}Hjyg>SmgP8M5QvqgWKQYq`-*5$5iZ&W zXVoHGM2ogcwP;^Iz+i|VFlf^zoSx^q95td|=9~BSyw~&1nc{Fy@A22)e|~*;=UM*o zqb*Ypmv?v~(w7!Vfgi;g_C;PciFClQw^?Knr@K0RY#Z!6;;%I72s#AOlXiUXx2GLC zWk4V$1pEb&ra*ErvYixBT{sKyFVG%pyTDGOPh=NTpamt8n=`VfyhQeupU8niUW*A8 za?PQ|0G$CZkSnp#L*x=*EAb}lhdu{j44m&tsHhvPujN1*I@Xr}_3H4|t)4}mR_Lv9 z2Dt+5Uk2tg4)rYhD8gS%{DFK!OkMju;3)_4B5n~0LrJk7P8~geP_DmFD##=8M%^!G zZZKXs9r1{%=$sfq%bd^T^q@0m1vwoiw}csxv*RxNL?26mEJOc#7j^InC<9-|PL^>5 zu#h=49{xpvAAMS1b}^Kvaibwp?kf)VW0?i<Ji?eeXpDY~4on}tfVogiwPT1IA$>>w4x%38X@8S5dA2qg4wH`6F^J{d|B5B9WOG5xFfVI3n_qyUf1mm{N=1%{Y`6j( zDP{S^l+mB3O+5GIcCy`Kyn+rniFZZwJ!{(o&OKx-|I^3*j$16mB+l7PPSwSp-1Bku z9ELh)0;PE`NDtC^)vYDWx_NbX?hZYWRsWZa*>$JLM(#()Tkf74ZC@TnWSa2YQ*Efl z*-$^J#rx1=?VOneTblQnSigX;b)>p*!MyTN_fQS?Z8-KW%Ld5!eJ5mRO!WT=+%0SV zj|PjUO1}VN{-WhO7!#1j|di93P&lAU*mvJH-M~|(*jnE%k{S`QE z_)F6E_trjgg$YM$Go#b9%<9x0IyKxoFfdr;yaVV-Ss(X<_gq4ZAq81uU)vMy kSpbM%+Y>Rw-zEU0b#P*GI7#jD#gX&X*~!{ub(($r2Ix%JDF6Tf literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zstencil.vert.0.glsl100es b/gio/shader/gio/zstencil.vert.0.glsl100es new file mode 100644 index 0000000..c8e1261 --- /dev/null +++ b/gio/shader/gio/zstencil.vert.0.glsl100es @@ -0,0 +1,64 @@ +#version 100 + +struct m3x2 +{ + vec3 r0; + vec3 r1; +}; + +struct Block +{ + vec4 transform; + vec2 pathOffset; +}; + +uniform Block _block; + +attribute vec2 from; +attribute vec2 ctrl; +attribute vec2 to; +attribute float maxy; +attribute float corner; +varying vec2 vFrom; +varying vec2 vCtrl; +varying vec2 vTo; + +vec3 transform3x2(m3x2 t, vec3 v) +{ + return vec3(dot(t.r0, v), dot(t.r1, v), dot(vec3(0.0, 0.0, 1.0), v)); +} + +void main() +{ + vec2 from_1 = from + _block.pathOffset; + vec2 ctrl_1 = ctrl + _block.pathOffset; + vec2 to_1 = to + _block.pathOffset; + float maxy_1 = maxy + _block.pathOffset.y; + float c = corner; + vec2 pos; + if (c >= 0.375) + { + c -= 0.5; + pos.y = maxy_1 + 1.0; + } + else + { + pos.y = min(min(from_1.y, ctrl_1.y), to_1.y) - 1.0; + } + if (c >= 0.125) + { + pos.x = max(max(from_1.x, ctrl_1.x), to_1.x) + 1.0; + } + else + { + pos.x = min(min(from_1.x, ctrl_1.x), to_1.x) - 1.0; + } + vFrom = from_1 - pos; + vCtrl = ctrl_1 - pos; + vTo = to_1 - pos; + pos = (pos * _block.transform.xy) + _block.transform.zw; + m3x2 param = m3x2(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0)); + vec3 param_1 = vec3(pos, 0.0); + gl_Position = vec4(transform3x2(param, param_1), 1.0); +} + diff --git a/gio/shader/gio/zstencil.vert.0.glsl150 b/gio/shader/gio/zstencil.vert.0.glsl150 new file mode 100644 index 0000000..9ae6c9b --- /dev/null +++ b/gio/shader/gio/zstencil.vert.0.glsl150 @@ -0,0 +1,64 @@ +#version 150 + +struct m3x2 +{ + vec3 r0; + vec3 r1; +}; + +struct Block +{ + vec4 transform; + vec2 pathOffset; +}; + +uniform Block _block; + +in vec2 from; +in vec2 ctrl; +in vec2 to; +in float maxy; +in float corner; +out vec2 vFrom; +out vec2 vCtrl; +out vec2 vTo; + +vec3 transform3x2(m3x2 t, vec3 v) +{ + return vec3(dot(t.r0, v), dot(t.r1, v), dot(vec3(0.0, 0.0, 1.0), v)); +} + +void main() +{ + vec2 from_1 = from + _block.pathOffset; + vec2 ctrl_1 = ctrl + _block.pathOffset; + vec2 to_1 = to + _block.pathOffset; + float maxy_1 = maxy + _block.pathOffset.y; + float c = corner; + vec2 pos; + if (c >= 0.375) + { + c -= 0.5; + pos.y = maxy_1 + 1.0; + } + else + { + pos.y = min(min(from_1.y, ctrl_1.y), to_1.y) - 1.0; + } + if (c >= 0.125) + { + pos.x = max(max(from_1.x, ctrl_1.x), to_1.x) + 1.0; + } + else + { + pos.x = min(min(from_1.x, ctrl_1.x), to_1.x) - 1.0; + } + vFrom = from_1 - pos; + vCtrl = ctrl_1 - pos; + vTo = to_1 - pos; + pos = (pos * _block.transform.xy) + _block.transform.zw; + m3x2 param = m3x2(vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0)); + vec3 param_1 = vec3(pos, 0.0); + gl_Position = vec4(transform3x2(param, param_1), 1.0); +} + diff --git a/gio/shader/gio/zstencil.vert.0.metallibios b/gio/shader/gio/zstencil.vert.0.metallibios new file mode 100644 index 0000000000000000000000000000000000000000..75ac068cf12698f64bf905d2cfa93572279825b7 GIT binary patch literal 3535 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%0AGy94dX-nmx?Q?(XAWt)`4y zD3j4{G0;WD0vi!GCA_hTe;@F_)AGVj-W@f6T*A8ty^zR6qh8q7h;K@9*oBOa;jk)C zF~n7ZLRGhB#Zh~9K)Wd7h>n5{N0Y0t;Cm;Zj)3?@@t_``l!`)L(W?yDXW#*;Xj+dH z?Xs%^ec9cbl`tR=eK}!Gb_Znp93MqfRu|O>?SZY83^loIC3i61JrD1$miG^NviBwd zdxAt*$V1QoZL#XOJ?DZgYuKI*kLGw^_JzLXN9{S6H7h-RIiOww0NriR8v^-Z{*CbF z#`@ccRt|0sEx{Q1;Y2dyKT-CKSL<&pe`Z-FkcC@-UIKs(&hhNEOEEYL;lthzWQV|) zXV?lRZ^5o5b<_>$8+R|om_sDR+Ah!XHD0Q}CTe^|y!{r9%O4njJ z@>^y*7R|CtRv}34%Uo{zgPQcPcY%u;b&RWE*OKTw{5xTVASB@zaK_RHumPJmkjA!n zqG#c{hnP4!LJl)=PJ|3Haju#BlDyxCYvjZ9FyO1{6Rq~tXt1brvBaW)lHKnl)Ue;9 Pd%vyik}Xki{`K`gs`1vy literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zstencil.vert.0.metallibiossimulator b/gio/shader/gio/zstencil.vert.0.metallibiossimulator new file mode 100644 index 0000000000000000000000000000000000000000..9ba5f58eb8d748536c8b738b589caca0f857238b GIT binary patch literal 4041 zcmZV>4Ny}@dPBl{Pl(CGQVsYLUqpIw{OKdH6beieB513&QK6%E-Xsr5AT3FrNd$t| zYeIq#mAgq>+GDQXTyW@(z3beewl_}ewIo=iT(n4?8%j9_uGI59+p*W)jWgGy_iae5 zwlCTJ_WSnR?`QYhZ+Caq?W~rdEF?oq-}}lXxG#+#PQx$K(3plLlBEWf#>>-qRIxO)$G|zf!RyHU0e75kU|;NHBW4>o-)hUitVS!c2@MVVks;7heSWLTf%`JG7u9>IkKZA+(wa|Msk=*gw)pt7}Ui~@|uK+ znHpfGgPMd^JvFd=RLe|3uY?l?n;6iML7V997XvNQj;QEWiT-|&DfIi%0ZMGsiKRiYeLLA6 z6TMNfR7bXL7u#B-?Hy!$ixheVjtmN7drR0akiPzV>Kg;&1W^#M@nCRiizviMKe}$x+yLJb>e+$i*R<-(arJnJnKrHgYiD^4 zcmdL;waj&i8g)j+PM85~h7{UDkn8}1%f2hBK?B-Hc{Mn`Ft5Hoz>J18v*5dtxe;fQ z1I$87(O00f67_U~JrwB!_wQPfj7K+MGJ$zsoeW`1rsma&(6=6yZtRk*8_udT6$ax( zV>%2_4tfk?BNcNIV?PaXc$7s*4Y8tMyL}nk)Gd2)?O+6|Pa*@+{1rQo_2xzfchXG; zG(u%@y+-shrR^!tT9-FgGMT?SvEVsgq-&uENlts5qUCRWeOh2BVgm)_l~fg3=ByhX$j-$g5ZG_><|Mz;c`J*27d@h zSm;wE4#f^KFeR-1bb`1A5o{zoZKOZda77gm(;e`iApQ{~J5zs5w2_@O*%l+A0jQ59 zJ2}!DBcTE4JrZp9_S(MFtGq{)P3bk>CCa9}N3u=n2LtZdW>em)NEt|3fUw8R@MKl7SA`wFl+bkn%HH@l{Y^kXLIGarNZ^#=&K$*utxm(yB3Y zRj;%v+0hHT{4hmAXb1w?DM;HoM1d6xl6i`oQN=u`baTp2ZYgeA6bAZ&dKR*dR-NEA z4(@2h`EbRAx%>@j<@s=BL|T!&mEUF~54VsHw?OET4+lj7Hm;3qg9LLs8^pE;MJpv9 zRHd?7e`w?9w-lexDgHgIxXDQy#_(oc+Oo_H&y1&&3h|eyxqQrA-k++^jg4tzf(%a~Yjd9U(wr2Lmfu@F^!VpPtviksjC zt5eU!A@yn|wG3p+nK=eB#|??bq1s(GWPapCxFTs;mv+P^LQ?GL-@Wszs1nbB=4s71 z&s^84XXEOhN+1_9Nv--8Pti+EA_Z0fAu!v%8G)Wr}O_jtjb*%=r+-j zSS9t6?n*txN_%4q@3s1zopzHTwAxvh-OsnOZFaBE>2b4$5{@g`Y|!gjU8=)j-;^Ph zZ)$hCn>_8l^}Fy8-s#=k=y3_oR{Q2AyW8V+`K(P&AK%bwzq`x9`}|fH?{Bf%-QVl; z@-BPBA&0~6wL0wn#=CjIAiurC>N(^W4*3uH>|R}~r_s%=$Fg~Ev(+CE>{d67ceHwV zzdl38l(t&9UfdZ{vcAm>_l!HZetlb=2eS(vpVJRMrvz+iZnav{1l*Zc?{tH9jDvC> zGh1N_>>bT^xX$o?dy~#;gNZ*?}iQwv-T zRzG8Hz%@bXdw7v@!7g13Fn*cM62!y0CNmB;7GfF(o zNlOMzg{R_jNr~B#q*VqL`GPLj5I(r&=$SHu>f(#K+%4w3;z|7_h?B%gj&K_ZPqZ)IKp0fd&XLcdoB=M!Ab)0< z9JH(%KFD0ef4A*QNVD(d8q#kh-6-dsxm^4oRt|=8^(*>g$ET)lP9K<_9lJ3#ejquO zxO}a4+1y-yY3bXgzu0m{|L|M8yUNZLZ`^hHz2EP2Z~p9(tIw$TdCra(eSEI3;&-_f z8~%G{!;7!%IP6wv?}WTVMW` z{`~H&JqW!9dk=MhMP( zL?$Z-!xbkW*-5Kn;Yvt+(Gh%n@GL?-0PmA++X$?v0E(;`>0U;EJuPEZJ7^-|lar=A zRS`1L7v3!hmSoW~)7Ps;DI+cW$kU5tCVH_uMZC3I662)C2EwMO{_u_7Q8{|;G=Z6= z!P5lh`zG7=x&*$n3uhSf zh7D|8waEl_MoxW1pGX{u=kJl+Un>7?Eaw#ZSl(Ak!6jvo=M-D;qV|4Aa%T zjgElP^ddo+Z+i?2@il!}*(c?CnJY-HWd8Q(7-FN$9b*{kP>39>7BaB%sAA$k$H*j^9`&c0JxR2?r@m4dv?Cf$$NfS*=Q}@sx z9bqlmcwyi>$S%E=^a^@y1SK+LWQTj|gV4W1+9%+6!et8-eD~Oz#w`HxharBv4q*ho zDky7GEd&A#=oG*3vDTcziH!a(a9v VhRxh&Zj;aHI@HShJ@A4>=>NKM7|j3x literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zstencil.vert.0.metallibmacos b/gio/shader/gio/zstencil.vert.0.metallibmacos new file mode 100644 index 0000000000000000000000000000000000000000..4de454dc1e291d02c9d03b64e5ca39ee9cedc61a GIT binary patch literal 3567 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 literal 0 HcmV?d00001 diff --git a/gio/shader/gio/zstencil.vert.0.spirv b/gio/shader/gio/zstencil.vert.0.spirv new file mode 100644 index 0000000000000000000000000000000000000000..b45803f0a52de2093ce7ca41c0399848190fca5a GIT binary patch literal 2724 zcmZvd+iP4^6o*ebXvYZNb`qUO@rj*)0mBSl1+#>u3PPG;iFX-unF zHE2QV1-!lJqxFCAL4EMW>whC&K=Av{*-H+gJFM)re(Sf^UTf{0liIHFJy|xCU7hXC ze$UD^n(YF~vVGY|vDX)t7bXVz>cj&N-YetUtX2@^T!-ZvM%Gu_UG+PV`;eo^3^I>g zK(>*K$QMYBALA$aHO%Stg+_gGvA%G;(cIW*4DxfGR-@DIwi>JLeyf?cH(T=dR(S1h zvvYQ}O4tpfT8Fl^to3{AY?=05?8iF2<}2(Y{Aj!K{z`YS*6T|Q-1;_F@|PCZ)&{M- zj6VX_c(F`iKKpFu{SF)XYemm_ujI~vt*>mID}BSo9Gbm;x79EG&SdjMS)93?&*og2 z%v{cD^O+ubN3ze*&vY6~t^TQ2KW}Ye7Ilid^z{bqyxr@9?`UF)!^s{+cZIzl zJ^aSrqLZax`#@p6HGMO-vl8>HG3?vfjTL`5*}hFN`G?r$JF|oQcD`crjX%tO6(VlD zwr^2P|J_Ni=J#IAALn^5+VZE9?wR_vXA?J4Ve6TOB+AKJbTG3(Uc-eLPb^c#PP-MS7T&e3i-A>?oJc!v4RdotyF4&52b3G8`vXC`(H-$HwOA=$UF8zU$94Rq&M<)2Qr zd}HNA4=d=Wk!ro)V~by@UhDpYI_&FL#NM2VG4`U*8h=5Yk3MIlFXr7s*YDqo^FG7w za^CvZkOAU+)T6hT(VdSgunxNOam9Sr(e2;2XpEfT_t2e>EBG7e!8cY;+~=$4`m6K# z5nJ5;UEZfXSg&=*S!dCA*83XR&U&}NJm32-`B^ z{7Us&ciiW1==SE!jjQ#bm}f0fhjo38$kpfn%>#&iTxS0U@f&O(&PiMTzf^k^`40!C?9l)K literal 0 HcmV?d00001 diff --git a/gio/shader/go.mod b/gio/shader/go.mod new file mode 100644 index 0000000..dcb1581 --- /dev/null +++ b/gio/shader/go.mod @@ -0,0 +1,3 @@ +module gioui.org/shader + +go 1.16 diff --git a/gio/shader/go.sum b/gio/shader/go.sum new file mode 100644 index 0000000..e69de29 diff --git a/gio/shader/piet/abi.h b/gio/shader/piet/abi.h new file mode 100644 index 0000000..365d936 --- /dev/null +++ b/gio/shader/piet/abi.h @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: Unlicense OR MIT + +#define ALIGN(bytes, type) type __attribute__((aligned(bytes))) + +typedef ALIGN(8, uint8_t) byte8[8]; +typedef ALIGN(8, uint16_t) word4[4]; +typedef ALIGN(4, uint32_t) dword; +typedef ALIGN(16, uint32_t) dword4[4]; +typedef ALIGN(8, uint64_t) qword; +typedef ALIGN(16, uint64_t) qword2[2]; +typedef ALIGN(16, unsigned int) uint4[4]; +typedef ALIGN(8, uint32_t) dword2[2]; +typedef ALIGN(8, unsigned short) ushort4[4]; +typedef ALIGN(16, float) float4[4]; +typedef ALIGN(16, int) int4[4]; + +typedef unsigned short half; + +typedef unsigned char bool; + +enum { + MAX_BOUND_DESCRIPTOR_SETS = 4, + MAX_DESCRIPTOR_SET_UNIFORM_BUFFERS_DYNAMIC = 8, + MAX_DESCRIPTOR_SET_STORAGE_BUFFERS_DYNAMIC = 4, + MAX_DESCRIPTOR_SET_COMBINED_BUFFERS_DYNAMIC = + MAX_DESCRIPTOR_SET_UNIFORM_BUFFERS_DYNAMIC + + MAX_DESCRIPTOR_SET_STORAGE_BUFFERS_DYNAMIC, + MAX_PUSH_CONSTANT_SIZE = 128, + + MIN_STORAGE_BUFFER_OFFSET_ALIGNMENT = 256, + + REQUIRED_MEMORY_ALIGNMENT = 16, + + SIMD_WIDTH = 4, +}; + +struct image_descriptor { + ALIGN(16, void *ptr); + int width; + int height; + int depth; + int row_pitch_bytes; + int slice_pitch_bytes; + int sample_pitch_bytes; + int sample_count; + int size_in_bytes; + + void *stencil_ptr; + int stencil_row_pitch_bytes; + int stencil_slice_pitch_bytes; + int stencil_sample_pitch_bytes; + + // TODO: unused? + void *memoryOwner; +}; + +struct buffer_descriptor { + ALIGN(16, void *ptr); + int size_in_bytes; + int robustness_size; +}; + +struct program_data { + uint8_t *descriptor_sets[MAX_BOUND_DESCRIPTOR_SETS]; + uint32_t descriptor_dynamic_offsets[MAX_DESCRIPTOR_SET_COMBINED_BUFFERS_DYNAMIC]; + uint4 num_workgroups; + uint4 workgroup_size; + uint32_t invocations_per_subgroup; + uint32_t subgroups_per_workgroup; + uint32_t invocations_per_workgroup; + unsigned char push_constants[MAX_PUSH_CONSTANT_SIZE]; + // Unused. + void *constants; +}; + +typedef int32_t yield_result; + +typedef void * coroutine; + +typedef coroutine (*routine_begin)(struct program_data *data, + int32_t workgroupX, + int32_t workgroupY, + int32_t workgroupZ, + void *workgroupMemory, + int32_t firstSubgroup, + int32_t subgroupCount); + +typedef bool (*routine_await)(coroutine r, yield_result *res); + +typedef void (*routine_destroy)(coroutine r); + diff --git a/gio/shader/piet/annotated.h b/gio/shader/piet/annotated.h new file mode 100644 index 0000000..6b18155 --- /dev/null +++ b/gio/shader/piet/annotated.h @@ -0,0 +1,225 @@ +// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense + +// Code auto-generated by piet-gpu-derive + +struct AnnoImageRef { + uint offset; +}; + +struct AnnoColorRef { + uint offset; +}; + +struct AnnoBeginClipRef { + uint offset; +}; + +struct AnnoEndClipRef { + uint offset; +}; + +struct AnnotatedRef { + uint offset; +}; + +struct AnnoImage { + vec4 bbox; + float linewidth; + uint index; + ivec2 offset; +}; + +#define AnnoImage_size 28 + +AnnoImageRef AnnoImage_index(AnnoImageRef ref, uint index) { + return AnnoImageRef(ref.offset + index * AnnoImage_size); +} + +struct AnnoColor { + vec4 bbox; + float linewidth; + uint rgba_color; +}; + +#define AnnoColor_size 24 + +AnnoColorRef AnnoColor_index(AnnoColorRef ref, uint index) { + return AnnoColorRef(ref.offset + index * AnnoColor_size); +} + +struct AnnoBeginClip { + vec4 bbox; + float linewidth; +}; + +#define AnnoBeginClip_size 20 + +AnnoBeginClipRef AnnoBeginClip_index(AnnoBeginClipRef ref, uint index) { + return AnnoBeginClipRef(ref.offset + index * AnnoBeginClip_size); +} + +struct AnnoEndClip { + vec4 bbox; +}; + +#define AnnoEndClip_size 16 + +AnnoEndClipRef AnnoEndClip_index(AnnoEndClipRef ref, uint index) { + return AnnoEndClipRef(ref.offset + index * AnnoEndClip_size); +} + +#define Annotated_Nop 0 +#define Annotated_Color 1 +#define Annotated_Image 2 +#define Annotated_BeginClip 3 +#define Annotated_EndClip 4 +#define Annotated_size 32 + +AnnotatedRef Annotated_index(AnnotatedRef ref, uint index) { + return AnnotatedRef(ref.offset + index * Annotated_size); +} + +struct AnnotatedTag { + uint tag; + uint flags; +}; + +AnnoImage AnnoImage_read(Alloc a, AnnoImageRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = read_mem(a, ix + 0); + uint raw1 = read_mem(a, ix + 1); + uint raw2 = read_mem(a, ix + 2); + uint raw3 = read_mem(a, ix + 3); + uint raw4 = read_mem(a, ix + 4); + uint raw5 = read_mem(a, ix + 5); + uint raw6 = read_mem(a, ix + 6); + AnnoImage s; + s.bbox = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3)); + s.linewidth = uintBitsToFloat(raw4); + s.index = raw5; + s.offset = ivec2(int(raw6 << 16) >> 16, int(raw6) >> 16); + return s; +} + +void AnnoImage_write(Alloc a, AnnoImageRef ref, AnnoImage s) { + uint ix = ref.offset >> 2; + write_mem(a, ix + 0, floatBitsToUint(s.bbox.x)); + write_mem(a, ix + 1, floatBitsToUint(s.bbox.y)); + write_mem(a, ix + 2, floatBitsToUint(s.bbox.z)); + write_mem(a, ix + 3, floatBitsToUint(s.bbox.w)); + write_mem(a, ix + 4, floatBitsToUint(s.linewidth)); + write_mem(a, ix + 5, s.index); + write_mem(a, ix + 6, (uint(s.offset.x) & 0xffff) | (uint(s.offset.y) << 16)); +} + +AnnoColor AnnoColor_read(Alloc a, AnnoColorRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = read_mem(a, ix + 0); + uint raw1 = read_mem(a, ix + 1); + uint raw2 = read_mem(a, ix + 2); + uint raw3 = read_mem(a, ix + 3); + uint raw4 = read_mem(a, ix + 4); + uint raw5 = read_mem(a, ix + 5); + AnnoColor s; + s.bbox = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3)); + s.linewidth = uintBitsToFloat(raw4); + s.rgba_color = raw5; + return s; +} + +void AnnoColor_write(Alloc a, AnnoColorRef ref, AnnoColor s) { + uint ix = ref.offset >> 2; + write_mem(a, ix + 0, floatBitsToUint(s.bbox.x)); + write_mem(a, ix + 1, floatBitsToUint(s.bbox.y)); + write_mem(a, ix + 2, floatBitsToUint(s.bbox.z)); + write_mem(a, ix + 3, floatBitsToUint(s.bbox.w)); + write_mem(a, ix + 4, floatBitsToUint(s.linewidth)); + write_mem(a, ix + 5, s.rgba_color); +} + +AnnoBeginClip AnnoBeginClip_read(Alloc a, AnnoBeginClipRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = read_mem(a, ix + 0); + uint raw1 = read_mem(a, ix + 1); + uint raw2 = read_mem(a, ix + 2); + uint raw3 = read_mem(a, ix + 3); + uint raw4 = read_mem(a, ix + 4); + AnnoBeginClip s; + s.bbox = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3)); + s.linewidth = uintBitsToFloat(raw4); + return s; +} + +void AnnoBeginClip_write(Alloc a, AnnoBeginClipRef ref, AnnoBeginClip s) { + uint ix = ref.offset >> 2; + write_mem(a, ix + 0, floatBitsToUint(s.bbox.x)); + write_mem(a, ix + 1, floatBitsToUint(s.bbox.y)); + write_mem(a, ix + 2, floatBitsToUint(s.bbox.z)); + write_mem(a, ix + 3, floatBitsToUint(s.bbox.w)); + write_mem(a, ix + 4, floatBitsToUint(s.linewidth)); +} + +AnnoEndClip AnnoEndClip_read(Alloc a, AnnoEndClipRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = read_mem(a, ix + 0); + uint raw1 = read_mem(a, ix + 1); + uint raw2 = read_mem(a, ix + 2); + uint raw3 = read_mem(a, ix + 3); + AnnoEndClip s; + s.bbox = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3)); + return s; +} + +void AnnoEndClip_write(Alloc a, AnnoEndClipRef ref, AnnoEndClip s) { + uint ix = ref.offset >> 2; + write_mem(a, ix + 0, floatBitsToUint(s.bbox.x)); + write_mem(a, ix + 1, floatBitsToUint(s.bbox.y)); + write_mem(a, ix + 2, floatBitsToUint(s.bbox.z)); + write_mem(a, ix + 3, floatBitsToUint(s.bbox.w)); +} + +AnnotatedTag Annotated_tag(Alloc a, AnnotatedRef ref) { + uint tag_and_flags = read_mem(a, ref.offset >> 2); + return AnnotatedTag(tag_and_flags & 0xffff, tag_and_flags >> 16); +} + +AnnoColor Annotated_Color_read(Alloc a, AnnotatedRef ref) { + return AnnoColor_read(a, AnnoColorRef(ref.offset + 4)); +} + +AnnoImage Annotated_Image_read(Alloc a, AnnotatedRef ref) { + return AnnoImage_read(a, AnnoImageRef(ref.offset + 4)); +} + +AnnoBeginClip Annotated_BeginClip_read(Alloc a, AnnotatedRef ref) { + return AnnoBeginClip_read(a, AnnoBeginClipRef(ref.offset + 4)); +} + +AnnoEndClip Annotated_EndClip_read(Alloc a, AnnotatedRef ref) { + return AnnoEndClip_read(a, AnnoEndClipRef(ref.offset + 4)); +} + +void Annotated_Nop_write(Alloc a, AnnotatedRef ref) { + write_mem(a, ref.offset >> 2, Annotated_Nop); +} + +void Annotated_Color_write(Alloc a, AnnotatedRef ref, uint flags, AnnoColor s) { + write_mem(a, ref.offset >> 2, (flags << 16) | Annotated_Color); + AnnoColor_write(a, AnnoColorRef(ref.offset + 4), s); +} + +void Annotated_Image_write(Alloc a, AnnotatedRef ref, uint flags, AnnoImage s) { + write_mem(a, ref.offset >> 2, (flags << 16) | Annotated_Image); + AnnoImage_write(a, AnnoImageRef(ref.offset + 4), s); +} + +void Annotated_BeginClip_write(Alloc a, AnnotatedRef ref, uint flags, AnnoBeginClip s) { + write_mem(a, ref.offset >> 2, (flags << 16) | Annotated_BeginClip); + AnnoBeginClip_write(a, AnnoBeginClipRef(ref.offset + 4), s); +} + +void Annotated_EndClip_write(Alloc a, AnnotatedRef ref, AnnoEndClip s) { + write_mem(a, ref.offset >> 2, Annotated_EndClip); + AnnoEndClip_write(a, AnnoEndClipRef(ref.offset + 4), s); +} + diff --git a/gio/shader/piet/backdrop_abi.h b/gio/shader/piet/backdrop_abi.h new file mode 100644 index 0000000..f5c0303 --- /dev/null +++ b/gio/shader/piet/backdrop_abi.h @@ -0,0 +1,17 @@ +// Code generated by gioui.org/cpu/cmd/compile DO NOT EDIT. + +struct backdrop_descriptor_set_layout { + struct buffer_descriptor binding0; + struct buffer_descriptor binding1; +}; + +extern coroutine backdrop_coroutine_begin(struct program_data *data, + int32_t workgroupX, int32_t workgroupY, int32_t workgroupZ, + void *workgroupMemory, + int32_t firstSubgroup, + int32_t subgroupCount) ATTR_HIDDEN; + +extern bool backdrop_coroutine_await(coroutine r, yield_result *res) ATTR_HIDDEN; +extern void backdrop_coroutine_destroy(coroutine r) ATTR_HIDDEN; + +extern const struct program_info backdrop_program_info ATTR_HIDDEN; diff --git a/gio/shader/piet/backdrop_abi_nosupport.go b/gio/shader/piet/backdrop_abi_nosupport.go new file mode 100644 index 0000000..cb0bafd --- /dev/null +++ b/gio/shader/piet/backdrop_abi_nosupport.go @@ -0,0 +1,19 @@ +// Code generated by gioui.org/cpu/cmd/compile DO NOT EDIT. + +package piet + +import "gioui.org/cpu" + +var BackdropProgramInfo *cpu.ProgramInfo + +type BackdropDescriptorSetLayout struct{} + +const BackdropHash = "" + +func (l *BackdropDescriptorSetLayout) Binding0() *cpu.BufferDescriptor { + panic("unsupported") +} + +func (l *BackdropDescriptorSetLayout) Binding1() *cpu.BufferDescriptor { + panic("unsupported") +} diff --git a/gio/shader/piet/binning_abi.h b/gio/shader/piet/binning_abi.h new file mode 100644 index 0000000..0152f34 --- /dev/null +++ b/gio/shader/piet/binning_abi.h @@ -0,0 +1,17 @@ +// Code generated by gioui.org/cpu/cmd/compile DO NOT EDIT. + +struct binning_descriptor_set_layout { + struct buffer_descriptor binding0; + struct buffer_descriptor binding1; +}; + +extern coroutine binning_coroutine_begin(struct program_data *data, + int32_t workgroupX, int32_t workgroupY, int32_t workgroupZ, + void *workgroupMemory, + int32_t firstSubgroup, + int32_t subgroupCount) ATTR_HIDDEN; + +extern bool binning_coroutine_await(coroutine r, yield_result *res) ATTR_HIDDEN; +extern void binning_coroutine_destroy(coroutine r) ATTR_HIDDEN; + +extern const struct program_info binning_program_info ATTR_HIDDEN; diff --git a/gio/shader/piet/binning_abi_nosupport.go b/gio/shader/piet/binning_abi_nosupport.go new file mode 100644 index 0000000..71cbc6b --- /dev/null +++ b/gio/shader/piet/binning_abi_nosupport.go @@ -0,0 +1,19 @@ +// Code generated by gioui.org/cpu/cmd/compile DO NOT EDIT. + +package piet + +import "gioui.org/cpu" + +var BinningProgramInfo *cpu.ProgramInfo + +type BinningDescriptorSetLayout struct{} + +const BinningHash = "" + +func (l *BinningDescriptorSetLayout) Binding0() *cpu.BufferDescriptor { + panic("unsupported") +} + +func (l *BinningDescriptorSetLayout) Binding1() *cpu.BufferDescriptor { + panic("unsupported") +} diff --git a/gio/shader/piet/bins.h b/gio/shader/piet/bins.h new file mode 100644 index 0000000..853adab --- /dev/null +++ b/gio/shader/piet/bins.h @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense + +// Code auto-generated by piet-gpu-derive + +struct BinInstanceRef { + uint offset; +}; + +struct BinInstance { + uint element_ix; +}; + +#define BinInstance_size 4 + +BinInstanceRef BinInstance_index(BinInstanceRef ref, uint index) { + return BinInstanceRef(ref.offset + index * BinInstance_size); +} + +BinInstance BinInstance_read(Alloc a, BinInstanceRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = read_mem(a, ix + 0); + BinInstance s; + s.element_ix = raw0; + return s; +} + +void BinInstance_write(Alloc a, BinInstanceRef ref, BinInstance s) { + uint ix = ref.offset >> 2; + write_mem(a, ix + 0, s.element_ix); +} + diff --git a/gio/shader/piet/coarse_abi.h b/gio/shader/piet/coarse_abi.h new file mode 100644 index 0000000..24d874d --- /dev/null +++ b/gio/shader/piet/coarse_abi.h @@ -0,0 +1,17 @@ +// Code generated by gioui.org/cpu/cmd/compile DO NOT EDIT. + +struct coarse_descriptor_set_layout { + struct buffer_descriptor binding0; + struct buffer_descriptor binding1; +}; + +extern coroutine coarse_coroutine_begin(struct program_data *data, + int32_t workgroupX, int32_t workgroupY, int32_t workgroupZ, + void *workgroupMemory, + int32_t firstSubgroup, + int32_t subgroupCount) ATTR_HIDDEN; + +extern bool coarse_coroutine_await(coroutine r, yield_result *res) ATTR_HIDDEN; +extern void coarse_coroutine_destroy(coroutine r) ATTR_HIDDEN; + +extern const struct program_info coarse_program_info ATTR_HIDDEN; diff --git a/gio/shader/piet/coarse_abi_nosupport.go b/gio/shader/piet/coarse_abi_nosupport.go new file mode 100644 index 0000000..8be6263 --- /dev/null +++ b/gio/shader/piet/coarse_abi_nosupport.go @@ -0,0 +1,19 @@ +// Code generated by gioui.org/cpu/cmd/compile DO NOT EDIT. + +package piet + +import "gioui.org/cpu" + +var CoarseProgramInfo *cpu.ProgramInfo + +type CoarseDescriptorSetLayout struct{} + +const CoarseHash = "" + +func (l *CoarseDescriptorSetLayout) Binding0() *cpu.BufferDescriptor { + panic("unsupported") +} + +func (l *CoarseDescriptorSetLayout) Binding1() *cpu.BufferDescriptor { + panic("unsupported") +} diff --git a/gio/shader/piet/elements_abi.h b/gio/shader/piet/elements_abi.h new file mode 100644 index 0000000..c455224 --- /dev/null +++ b/gio/shader/piet/elements_abi.h @@ -0,0 +1,19 @@ +// Code generated by gioui.org/cpu/cmd/compile DO NOT EDIT. + +struct elements_descriptor_set_layout { + struct buffer_descriptor binding0; + struct buffer_descriptor binding1; + struct buffer_descriptor binding2; + struct buffer_descriptor binding3; +}; + +extern coroutine elements_coroutine_begin(struct program_data *data, + int32_t workgroupX, int32_t workgroupY, int32_t workgroupZ, + void *workgroupMemory, + int32_t firstSubgroup, + int32_t subgroupCount) ATTR_HIDDEN; + +extern bool elements_coroutine_await(coroutine r, yield_result *res) ATTR_HIDDEN; +extern void elements_coroutine_destroy(coroutine r) ATTR_HIDDEN; + +extern const struct program_info elements_program_info ATTR_HIDDEN; diff --git a/gio/shader/piet/elements_abi_nosupport.go b/gio/shader/piet/elements_abi_nosupport.go new file mode 100644 index 0000000..b0ebe95 --- /dev/null +++ b/gio/shader/piet/elements_abi_nosupport.go @@ -0,0 +1,27 @@ +// Code generated by gioui.org/cpu/cmd/compile DO NOT EDIT. + +package piet + +import "gioui.org/cpu" + +var ElementsProgramInfo *cpu.ProgramInfo + +type ElementsDescriptorSetLayout struct{} + +const ElementsHash = "" + +func (l *ElementsDescriptorSetLayout) Binding0() *cpu.BufferDescriptor { + panic("unsupported") +} + +func (l *ElementsDescriptorSetLayout) Binding1() *cpu.BufferDescriptor { + panic("unsupported") +} + +func (l *ElementsDescriptorSetLayout) Binding2() *cpu.BufferDescriptor { + panic("unsupported") +} + +func (l *ElementsDescriptorSetLayout) Binding3() *cpu.BufferDescriptor { + panic("unsupported") +} diff --git a/gio/shader/piet/kernel4_abi.h b/gio/shader/piet/kernel4_abi.h new file mode 100644 index 0000000..0d3b4c9 --- /dev/null +++ b/gio/shader/piet/kernel4_abi.h @@ -0,0 +1,19 @@ +// Code generated by gioui.org/cpu/cmd/compile DO NOT EDIT. + +struct kernel4_descriptor_set_layout { + struct buffer_descriptor binding0; + struct buffer_descriptor binding1; + struct image_descriptor binding2; + struct image_descriptor binding3; +}; + +extern coroutine kernel4_coroutine_begin(struct program_data *data, + int32_t workgroupX, int32_t workgroupY, int32_t workgroupZ, + void *workgroupMemory, + int32_t firstSubgroup, + int32_t subgroupCount) ATTR_HIDDEN; + +extern bool kernel4_coroutine_await(coroutine r, yield_result *res) ATTR_HIDDEN; +extern void kernel4_coroutine_destroy(coroutine r) ATTR_HIDDEN; + +extern const struct program_info kernel4_program_info ATTR_HIDDEN; diff --git a/gio/shader/piet/kernel4_abi_nosupport.go b/gio/shader/piet/kernel4_abi_nosupport.go new file mode 100644 index 0000000..81da2dd --- /dev/null +++ b/gio/shader/piet/kernel4_abi_nosupport.go @@ -0,0 +1,27 @@ +// Code generated by gioui.org/cpu/cmd/compile DO NOT EDIT. + +package piet + +import "gioui.org/cpu" + +var Kernel4ProgramInfo *cpu.ProgramInfo + +type Kernel4DescriptorSetLayout struct{} + +const Kernel4Hash = "" + +func (l *Kernel4DescriptorSetLayout) Binding0() *cpu.BufferDescriptor { + panic("unsupported") +} + +func (l *Kernel4DescriptorSetLayout) Binding1() *cpu.BufferDescriptor { + panic("unsupported") +} + +func (l *Kernel4DescriptorSetLayout) Binding2() *cpu.ImageDescriptor { + panic("unsupported") +} + +func (l *Kernel4DescriptorSetLayout) Binding3() *cpu.ImageDescriptor { + panic("unsupported") +} diff --git a/gio/shader/piet/mem.h b/gio/shader/piet/mem.h new file mode 100644 index 0000000..9e81f04 --- /dev/null +++ b/gio/shader/piet/mem.h @@ -0,0 +1,147 @@ +// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense + +layout(set = 0, binding = 0) buffer Memory { + // offset into memory of the next allocation, initialized by the user. + uint mem_offset; + // mem_error tracks the status of memory accesses, initialized to NO_ERROR + // by the user. ERR_MALLOC_FAILED is reported for insufficient memory. + // If MEM_DEBUG is defined the following errors are reported: + // - ERR_OUT_OF_BOUNDS is reported for out of bounds writes. + // - ERR_UNALIGNED_ACCESS for memory access not aligned to 32-bit words. + uint mem_error; + uint[] memory; +}; + +// Uncomment this line to add the size field to Alloc and enable memory checks. +// Note that the Config struct in setup.h grows size fields as well. +//#define MEM_DEBUG + +#define NO_ERROR 0 +#define ERR_MALLOC_FAILED 1 +#define ERR_OUT_OF_BOUNDS 2 +#define ERR_UNALIGNED_ACCESS 3 + +#ifdef MEM_DEBUG +#define Alloc_size 16 +#else +#define Alloc_size 8 +#endif + +// Alloc represents a memory allocation. +struct Alloc { + // offset in bytes into memory. + uint offset; +#ifdef MEM_DEBUG + // size in bytes of the allocation. + uint size; +#endif +}; + +struct MallocResult { + Alloc alloc; + // failed is true if the allocation overflowed memory. + bool failed; +}; + +// new_alloc synthesizes an Alloc from an offset and size. +Alloc new_alloc(uint offset, uint size, bool mem_ok) { + Alloc a; + a.offset = offset; +#ifdef MEM_DEBUG + if (mem_ok) { + a.size = size; + } else { + a.size = 0; + } +#endif + return a; +} + +// malloc allocates size bytes of memory. +MallocResult malloc(uint size) { + MallocResult r; + uint offset = atomicAdd(mem_offset, size); + r.failed = offset + size > memory.length() * 4; + r.alloc = new_alloc(offset, size, !r.failed); + if (r.failed) { + atomicMax(mem_error, ERR_MALLOC_FAILED); + return r; + } +#ifdef MEM_DEBUG + if ((size & 3) != 0) { + r.failed = true; + atomicMax(mem_error, ERR_UNALIGNED_ACCESS); + return r; + } +#endif + return r; +} + +// touch_mem checks whether access to the memory word at offset is valid. +// If MEM_DEBUG is defined, touch_mem returns false if offset is out of bounds. +// Offset is in words. +bool touch_mem(Alloc alloc, uint offset) { +#ifdef MEM_DEBUG + if (offset < alloc.offset/4 || offset >= (alloc.offset + alloc.size)/4) { + atomicMax(mem_error, ERR_OUT_OF_BOUNDS); + return false; + } +#endif + return true; +} + +// write_mem writes val to memory at offset. +// Offset is in words. +void write_mem(Alloc alloc, uint offset, uint val) { + if (!touch_mem(alloc, offset)) { + return; + } + memory[offset] = val; +} + +// read_mem reads the value from memory at offset. +// Offset is in words. +uint read_mem(Alloc alloc, uint offset) { + if (!touch_mem(alloc, offset)) { + return 0; + } + uint v = memory[offset]; + return v; +} + +// slice_mem returns a sub-allocation inside another. Offset and size are in +// bytes, relative to a.offset. +Alloc slice_mem(Alloc a, uint offset, uint size) { +#ifdef MEM_DEBUG + if ((offset & 3) != 0 || (size & 3) != 0) { + atomicMax(mem_error, ERR_UNALIGNED_ACCESS); + return Alloc(0, 0); + } + if (offset + size > a.size) { + // slice_mem is sometimes used for slices outside bounds, + // but never written. + return Alloc(0, 0); + } + return Alloc(a.offset + offset, size); +#else + return Alloc(a.offset + offset); +#endif +} + +// alloc_write writes alloc to memory at offset bytes. +void alloc_write(Alloc a, uint offset, Alloc alloc) { + write_mem(a, offset >> 2, alloc.offset); +#ifdef MEM_DEBUG + write_mem(a, (offset >> 2) + 1, alloc.size); +#endif +} + +// alloc_read reads an Alloc from memory at offset bytes. +Alloc alloc_read(Alloc a, uint offset) { + Alloc alloc; + alloc.offset = read_mem(a, offset >> 2); +#ifdef MEM_DEBUG + alloc.size = read_mem(a, (offset >> 2) + 1); +#endif + return alloc; +} diff --git a/gio/shader/piet/path_coarse_abi.h b/gio/shader/piet/path_coarse_abi.h new file mode 100644 index 0000000..9e43e8e --- /dev/null +++ b/gio/shader/piet/path_coarse_abi.h @@ -0,0 +1,17 @@ +// Code generated by gioui.org/cpu/cmd/compile DO NOT EDIT. + +struct path_coarse_descriptor_set_layout { + struct buffer_descriptor binding0; + struct buffer_descriptor binding1; +}; + +extern coroutine path_coarse_coroutine_begin(struct program_data *data, + int32_t workgroupX, int32_t workgroupY, int32_t workgroupZ, + void *workgroupMemory, + int32_t firstSubgroup, + int32_t subgroupCount) ATTR_HIDDEN; + +extern bool path_coarse_coroutine_await(coroutine r, yield_result *res) ATTR_HIDDEN; +extern void path_coarse_coroutine_destroy(coroutine r) ATTR_HIDDEN; + +extern const struct program_info path_coarse_program_info ATTR_HIDDEN; diff --git a/gio/shader/piet/path_coarse_abi_nosupport.go b/gio/shader/piet/path_coarse_abi_nosupport.go new file mode 100644 index 0000000..ba72c74 --- /dev/null +++ b/gio/shader/piet/path_coarse_abi_nosupport.go @@ -0,0 +1,19 @@ +// Code generated by gioui.org/cpu/cmd/compile DO NOT EDIT. + +package piet + +import "gioui.org/cpu" + +var Path_coarseProgramInfo *cpu.ProgramInfo + +type Path_coarseDescriptorSetLayout struct{} + +const Path_coarseHash = "" + +func (l *Path_coarseDescriptorSetLayout) Binding0() *cpu.BufferDescriptor { + panic("unsupported") +} + +func (l *Path_coarseDescriptorSetLayout) Binding1() *cpu.BufferDescriptor { + panic("unsupported") +} diff --git a/gio/shader/piet/pathseg.h b/gio/shader/piet/pathseg.h new file mode 100644 index 0000000..749771e --- /dev/null +++ b/gio/shader/piet/pathseg.h @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense + +// Code auto-generated by piet-gpu-derive + +struct PathCubicRef { + uint offset; +}; + +struct PathSegRef { + uint offset; +}; + +struct PathCubic { + vec2 p0; + vec2 p1; + vec2 p2; + vec2 p3; + uint path_ix; + uint trans_ix; + vec2 stroke; +}; + +#define PathCubic_size 48 + +PathCubicRef PathCubic_index(PathCubicRef ref, uint index) { + return PathCubicRef(ref.offset + index * PathCubic_size); +} + +#define PathSeg_Nop 0 +#define PathSeg_Cubic 1 +#define PathSeg_size 52 + +PathSegRef PathSeg_index(PathSegRef ref, uint index) { + return PathSegRef(ref.offset + index * PathSeg_size); +} + +struct PathSegTag { + uint tag; + uint flags; +}; + +PathCubic PathCubic_read(Alloc a, PathCubicRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = read_mem(a, ix + 0); + uint raw1 = read_mem(a, ix + 1); + uint raw2 = read_mem(a, ix + 2); + uint raw3 = read_mem(a, ix + 3); + uint raw4 = read_mem(a, ix + 4); + uint raw5 = read_mem(a, ix + 5); + uint raw6 = read_mem(a, ix + 6); + uint raw7 = read_mem(a, ix + 7); + uint raw8 = read_mem(a, ix + 8); + uint raw9 = read_mem(a, ix + 9); + uint raw10 = read_mem(a, ix + 10); + uint raw11 = read_mem(a, ix + 11); + PathCubic s; + s.p0 = vec2(uintBitsToFloat(raw0), uintBitsToFloat(raw1)); + s.p1 = vec2(uintBitsToFloat(raw2), uintBitsToFloat(raw3)); + s.p2 = vec2(uintBitsToFloat(raw4), uintBitsToFloat(raw5)); + s.p3 = vec2(uintBitsToFloat(raw6), uintBitsToFloat(raw7)); + s.path_ix = raw8; + s.trans_ix = raw9; + s.stroke = vec2(uintBitsToFloat(raw10), uintBitsToFloat(raw11)); + return s; +} + +void PathCubic_write(Alloc a, PathCubicRef ref, PathCubic s) { + uint ix = ref.offset >> 2; + write_mem(a, ix + 0, floatBitsToUint(s.p0.x)); + write_mem(a, ix + 1, floatBitsToUint(s.p0.y)); + write_mem(a, ix + 2, floatBitsToUint(s.p1.x)); + write_mem(a, ix + 3, floatBitsToUint(s.p1.y)); + write_mem(a, ix + 4, floatBitsToUint(s.p2.x)); + write_mem(a, ix + 5, floatBitsToUint(s.p2.y)); + write_mem(a, ix + 6, floatBitsToUint(s.p3.x)); + write_mem(a, ix + 7, floatBitsToUint(s.p3.y)); + write_mem(a, ix + 8, s.path_ix); + write_mem(a, ix + 9, s.trans_ix); + write_mem(a, ix + 10, floatBitsToUint(s.stroke.x)); + write_mem(a, ix + 11, floatBitsToUint(s.stroke.y)); +} + +PathSegTag PathSeg_tag(Alloc a, PathSegRef ref) { + uint tag_and_flags = read_mem(a, ref.offset >> 2); + return PathSegTag(tag_and_flags & 0xffff, tag_and_flags >> 16); +} + +PathCubic PathSeg_Cubic_read(Alloc a, PathSegRef ref) { + return PathCubic_read(a, PathCubicRef(ref.offset + 4)); +} + +void PathSeg_Nop_write(Alloc a, PathSegRef ref) { + write_mem(a, ref.offset >> 2, PathSeg_Nop); +} + +void PathSeg_Cubic_write(Alloc a, PathSegRef ref, uint flags, PathCubic s) { + write_mem(a, ref.offset >> 2, (flags << 16) | PathSeg_Cubic); + PathCubic_write(a, PathCubicRef(ref.offset + 4), s); +} + diff --git a/gio/shader/piet/ptcl.h b/gio/shader/piet/ptcl.h new file mode 100644 index 0000000..6267fc5 --- /dev/null +++ b/gio/shader/piet/ptcl.h @@ -0,0 +1,278 @@ +// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense + +// Code auto-generated by piet-gpu-derive + +struct CmdStrokeRef { + uint offset; +}; + +struct CmdFillRef { + uint offset; +}; + +struct CmdColorRef { + uint offset; +}; + +struct CmdImageRef { + uint offset; +}; + +struct CmdAlphaRef { + uint offset; +}; + +struct CmdJumpRef { + uint offset; +}; + +struct CmdRef { + uint offset; +}; + +struct CmdStroke { + uint tile_ref; + float half_width; +}; + +#define CmdStroke_size 8 + +CmdStrokeRef CmdStroke_index(CmdStrokeRef ref, uint index) { + return CmdStrokeRef(ref.offset + index * CmdStroke_size); +} + +struct CmdFill { + uint tile_ref; + int backdrop; +}; + +#define CmdFill_size 8 + +CmdFillRef CmdFill_index(CmdFillRef ref, uint index) { + return CmdFillRef(ref.offset + index * CmdFill_size); +} + +struct CmdColor { + uint rgba_color; +}; + +#define CmdColor_size 4 + +CmdColorRef CmdColor_index(CmdColorRef ref, uint index) { + return CmdColorRef(ref.offset + index * CmdColor_size); +} + +struct CmdImage { + uint index; + ivec2 offset; +}; + +#define CmdImage_size 8 + +CmdImageRef CmdImage_index(CmdImageRef ref, uint index) { + return CmdImageRef(ref.offset + index * CmdImage_size); +} + +struct CmdAlpha { + float alpha; +}; + +#define CmdAlpha_size 4 + +CmdAlphaRef CmdAlpha_index(CmdAlphaRef ref, uint index) { + return CmdAlphaRef(ref.offset + index * CmdAlpha_size); +} + +struct CmdJump { + uint new_ref; +}; + +#define CmdJump_size 4 + +CmdJumpRef CmdJump_index(CmdJumpRef ref, uint index) { + return CmdJumpRef(ref.offset + index * CmdJump_size); +} + +#define Cmd_End 0 +#define Cmd_Fill 1 +#define Cmd_Stroke 2 +#define Cmd_Solid 3 +#define Cmd_Alpha 4 +#define Cmd_Color 5 +#define Cmd_Image 6 +#define Cmd_BeginClip 7 +#define Cmd_EndClip 8 +#define Cmd_Jump 9 +#define Cmd_size 12 + +CmdRef Cmd_index(CmdRef ref, uint index) { + return CmdRef(ref.offset + index * Cmd_size); +} + +struct CmdTag { + uint tag; + uint flags; +}; + +CmdStroke CmdStroke_read(Alloc a, CmdStrokeRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = read_mem(a, ix + 0); + uint raw1 = read_mem(a, ix + 1); + CmdStroke s; + s.tile_ref = raw0; + s.half_width = uintBitsToFloat(raw1); + return s; +} + +void CmdStroke_write(Alloc a, CmdStrokeRef ref, CmdStroke s) { + uint ix = ref.offset >> 2; + write_mem(a, ix + 0, s.tile_ref); + write_mem(a, ix + 1, floatBitsToUint(s.half_width)); +} + +CmdFill CmdFill_read(Alloc a, CmdFillRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = read_mem(a, ix + 0); + uint raw1 = read_mem(a, ix + 1); + CmdFill s; + s.tile_ref = raw0; + s.backdrop = int(raw1); + return s; +} + +void CmdFill_write(Alloc a, CmdFillRef ref, CmdFill s) { + uint ix = ref.offset >> 2; + write_mem(a, ix + 0, s.tile_ref); + write_mem(a, ix + 1, uint(s.backdrop)); +} + +CmdColor CmdColor_read(Alloc a, CmdColorRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = read_mem(a, ix + 0); + CmdColor s; + s.rgba_color = raw0; + return s; +} + +void CmdColor_write(Alloc a, CmdColorRef ref, CmdColor s) { + uint ix = ref.offset >> 2; + write_mem(a, ix + 0, s.rgba_color); +} + +CmdImage CmdImage_read(Alloc a, CmdImageRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = read_mem(a, ix + 0); + uint raw1 = read_mem(a, ix + 1); + CmdImage s; + s.index = raw0; + s.offset = ivec2(int(raw1 << 16) >> 16, int(raw1) >> 16); + return s; +} + +void CmdImage_write(Alloc a, CmdImageRef ref, CmdImage s) { + uint ix = ref.offset >> 2; + write_mem(a, ix + 0, s.index); + write_mem(a, ix + 1, (uint(s.offset.x) & 0xffff) | (uint(s.offset.y) << 16)); +} + +CmdAlpha CmdAlpha_read(Alloc a, CmdAlphaRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = read_mem(a, ix + 0); + CmdAlpha s; + s.alpha = uintBitsToFloat(raw0); + return s; +} + +void CmdAlpha_write(Alloc a, CmdAlphaRef ref, CmdAlpha s) { + uint ix = ref.offset >> 2; + write_mem(a, ix + 0, floatBitsToUint(s.alpha)); +} + +CmdJump CmdJump_read(Alloc a, CmdJumpRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = read_mem(a, ix + 0); + CmdJump s; + s.new_ref = raw0; + return s; +} + +void CmdJump_write(Alloc a, CmdJumpRef ref, CmdJump s) { + uint ix = ref.offset >> 2; + write_mem(a, ix + 0, s.new_ref); +} + +CmdTag Cmd_tag(Alloc a, CmdRef ref) { + uint tag_and_flags = read_mem(a, ref.offset >> 2); + return CmdTag(tag_and_flags & 0xffff, tag_and_flags >> 16); +} + +CmdFill Cmd_Fill_read(Alloc a, CmdRef ref) { + return CmdFill_read(a, CmdFillRef(ref.offset + 4)); +} + +CmdStroke Cmd_Stroke_read(Alloc a, CmdRef ref) { + return CmdStroke_read(a, CmdStrokeRef(ref.offset + 4)); +} + +CmdAlpha Cmd_Alpha_read(Alloc a, CmdRef ref) { + return CmdAlpha_read(a, CmdAlphaRef(ref.offset + 4)); +} + +CmdColor Cmd_Color_read(Alloc a, CmdRef ref) { + return CmdColor_read(a, CmdColorRef(ref.offset + 4)); +} + +CmdImage Cmd_Image_read(Alloc a, CmdRef ref) { + return CmdImage_read(a, CmdImageRef(ref.offset + 4)); +} + +CmdJump Cmd_Jump_read(Alloc a, CmdRef ref) { + return CmdJump_read(a, CmdJumpRef(ref.offset + 4)); +} + +void Cmd_End_write(Alloc a, CmdRef ref) { + write_mem(a, ref.offset >> 2, Cmd_End); +} + +void Cmd_Fill_write(Alloc a, CmdRef ref, CmdFill s) { + write_mem(a, ref.offset >> 2, Cmd_Fill); + CmdFill_write(a, CmdFillRef(ref.offset + 4), s); +} + +void Cmd_Stroke_write(Alloc a, CmdRef ref, CmdStroke s) { + write_mem(a, ref.offset >> 2, Cmd_Stroke); + CmdStroke_write(a, CmdStrokeRef(ref.offset + 4), s); +} + +void Cmd_Solid_write(Alloc a, CmdRef ref) { + write_mem(a, ref.offset >> 2, Cmd_Solid); +} + +void Cmd_Alpha_write(Alloc a, CmdRef ref, CmdAlpha s) { + write_mem(a, ref.offset >> 2, Cmd_Alpha); + CmdAlpha_write(a, CmdAlphaRef(ref.offset + 4), s); +} + +void Cmd_Color_write(Alloc a, CmdRef ref, CmdColor s) { + write_mem(a, ref.offset >> 2, Cmd_Color); + CmdColor_write(a, CmdColorRef(ref.offset + 4), s); +} + +void Cmd_Image_write(Alloc a, CmdRef ref, CmdImage s) { + write_mem(a, ref.offset >> 2, Cmd_Image); + CmdImage_write(a, CmdImageRef(ref.offset + 4), s); +} + +void Cmd_BeginClip_write(Alloc a, CmdRef ref) { + write_mem(a, ref.offset >> 2, Cmd_BeginClip); +} + +void Cmd_EndClip_write(Alloc a, CmdRef ref) { + write_mem(a, ref.offset >> 2, Cmd_EndClip); +} + +void Cmd_Jump_write(Alloc a, CmdRef ref, CmdJump s) { + write_mem(a, ref.offset >> 2, Cmd_Jump); + CmdJump_write(a, CmdJumpRef(ref.offset + 4), s); +} + diff --git a/gio/shader/piet/runtime.h b/gio/shader/piet/runtime.h new file mode 100644 index 0000000..cfae912 --- /dev/null +++ b/gio/shader/piet/runtime.h @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: Unlicense OR MIT + +#define ATTR_HIDDEN __attribute__ ((visibility ("hidden"))) + +// program_info contains constant parameters for a program. +struct program_info { + // MinMemorySize is the minimum size of memory passed to dispatch. + size_t min_memory_size; + // has_cbarriers is 1 when the program contains control barriers. + bool has_cbarriers; + // desc_set_size is the size of the first descriptor set for the program. + size_t desc_set_size; + int workgroup_size_x; + int workgroup_size_y; + int workgroup_size_z; + // Program entrypoints. + routine_begin begin; + routine_await await; + routine_destroy destroy; +}; + +// dispatch_context contains the information a program dispatch. +struct dispatch_context; + +// thread_context contains the working memory of a batch. It may be +// reused, but not concurrently. +struct thread_context; + +extern struct buffer_descriptor alloc_buffer(size_t size) ATTR_HIDDEN; +extern struct image_descriptor alloc_image_rgba(int width, int height) ATTR_HIDDEN; + +extern struct dispatch_context *alloc_dispatch_context(void) ATTR_HIDDEN; + +extern void free_dispatch_context(struct dispatch_context *c) ATTR_HIDDEN; + +extern struct thread_context *alloc_thread_context(void) ATTR_HIDDEN; + +extern void free_thread_context(struct thread_context *c) ATTR_HIDDEN; + +// prepare_dispatch initializes ctx to run a dispatch of a program distributed +// among nthreads threads. +extern void prepare_dispatch(struct dispatch_context *ctx, int nthreads, struct program_info *info, uint8_t *desc_set, int ngroupx, int ngroupy, int ngroupz) ATTR_HIDDEN; + +// dispatch_batch executes a dispatch batch. +extern void dispatch_thread(struct dispatch_context *ctx, int thread_idx, struct thread_context *thread) ATTR_HIDDEN; diff --git a/gio/shader/piet/scene.h b/gio/shader/piet/scene.h new file mode 100644 index 0000000..38c2549 --- /dev/null +++ b/gio/shader/piet/scene.h @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense + +// Code auto-generated by piet-gpu-derive + +struct LineSegRef { + uint offset; +}; + +struct QuadSegRef { + uint offset; +}; + +struct CubicSegRef { + uint offset; +}; + +struct FillColorRef { + uint offset; +}; + +struct FillImageRef { + uint offset; +}; + +struct SetLineWidthRef { + uint offset; +}; + +struct TransformRef { + uint offset; +}; + +struct ClipRef { + uint offset; +}; + +struct SetFillModeRef { + uint offset; +}; + +struct ElementRef { + uint offset; +}; + +struct LineSeg { + vec2 p0; + vec2 p1; +}; + +#define LineSeg_size 16 + +LineSegRef LineSeg_index(LineSegRef ref, uint index) { + return LineSegRef(ref.offset + index * LineSeg_size); +} + +struct QuadSeg { + vec2 p0; + vec2 p1; + vec2 p2; +}; + +#define QuadSeg_size 24 + +QuadSegRef QuadSeg_index(QuadSegRef ref, uint index) { + return QuadSegRef(ref.offset + index * QuadSeg_size); +} + +struct CubicSeg { + vec2 p0; + vec2 p1; + vec2 p2; + vec2 p3; +}; + +#define CubicSeg_size 32 + +CubicSegRef CubicSeg_index(CubicSegRef ref, uint index) { + return CubicSegRef(ref.offset + index * CubicSeg_size); +} + +struct FillColor { + uint rgba_color; +}; + +#define FillColor_size 4 + +FillColorRef FillColor_index(FillColorRef ref, uint index) { + return FillColorRef(ref.offset + index * FillColor_size); +} + +struct FillImage { + uint index; + ivec2 offset; +}; + +#define FillImage_size 8 + +FillImageRef FillImage_index(FillImageRef ref, uint index) { + return FillImageRef(ref.offset + index * FillImage_size); +} + +struct SetLineWidth { + float width; +}; + +#define SetLineWidth_size 4 + +SetLineWidthRef SetLineWidth_index(SetLineWidthRef ref, uint index) { + return SetLineWidthRef(ref.offset + index * SetLineWidth_size); +} + +struct Transform { + vec4 mat; + vec2 translate; +}; + +#define Transform_size 24 + +TransformRef Transform_index(TransformRef ref, uint index) { + return TransformRef(ref.offset + index * Transform_size); +} + +struct Clip { + vec4 bbox; +}; + +#define Clip_size 16 + +ClipRef Clip_index(ClipRef ref, uint index) { + return ClipRef(ref.offset + index * Clip_size); +} + +struct SetFillMode { + uint fill_mode; +}; + +#define SetFillMode_size 4 + +SetFillModeRef SetFillMode_index(SetFillModeRef ref, uint index) { + return SetFillModeRef(ref.offset + index * SetFillMode_size); +} + +#define Element_Nop 0 +#define Element_Line 1 +#define Element_Quad 2 +#define Element_Cubic 3 +#define Element_FillColor 4 +#define Element_SetLineWidth 5 +#define Element_Transform 6 +#define Element_BeginClip 7 +#define Element_EndClip 8 +#define Element_FillImage 9 +#define Element_SetFillMode 10 +#define Element_size 36 + +ElementRef Element_index(ElementRef ref, uint index) { + return ElementRef(ref.offset + index * Element_size); +} + +struct ElementTag { + uint tag; + uint flags; +}; + +LineSeg LineSeg_read(LineSegRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = scene[ix + 0]; + uint raw1 = scene[ix + 1]; + uint raw2 = scene[ix + 2]; + uint raw3 = scene[ix + 3]; + LineSeg s; + s.p0 = vec2(uintBitsToFloat(raw0), uintBitsToFloat(raw1)); + s.p1 = vec2(uintBitsToFloat(raw2), uintBitsToFloat(raw3)); + return s; +} + +QuadSeg QuadSeg_read(QuadSegRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = scene[ix + 0]; + uint raw1 = scene[ix + 1]; + uint raw2 = scene[ix + 2]; + uint raw3 = scene[ix + 3]; + uint raw4 = scene[ix + 4]; + uint raw5 = scene[ix + 5]; + QuadSeg s; + s.p0 = vec2(uintBitsToFloat(raw0), uintBitsToFloat(raw1)); + s.p1 = vec2(uintBitsToFloat(raw2), uintBitsToFloat(raw3)); + s.p2 = vec2(uintBitsToFloat(raw4), uintBitsToFloat(raw5)); + return s; +} + +CubicSeg CubicSeg_read(CubicSegRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = scene[ix + 0]; + uint raw1 = scene[ix + 1]; + uint raw2 = scene[ix + 2]; + uint raw3 = scene[ix + 3]; + uint raw4 = scene[ix + 4]; + uint raw5 = scene[ix + 5]; + uint raw6 = scene[ix + 6]; + uint raw7 = scene[ix + 7]; + CubicSeg s; + s.p0 = vec2(uintBitsToFloat(raw0), uintBitsToFloat(raw1)); + s.p1 = vec2(uintBitsToFloat(raw2), uintBitsToFloat(raw3)); + s.p2 = vec2(uintBitsToFloat(raw4), uintBitsToFloat(raw5)); + s.p3 = vec2(uintBitsToFloat(raw6), uintBitsToFloat(raw7)); + return s; +} + +FillColor FillColor_read(FillColorRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = scene[ix + 0]; + FillColor s; + s.rgba_color = raw0; + return s; +} + +FillImage FillImage_read(FillImageRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = scene[ix + 0]; + uint raw1 = scene[ix + 1]; + FillImage s; + s.index = raw0; + s.offset = ivec2(int(raw1 << 16) >> 16, int(raw1) >> 16); + return s; +} + +SetLineWidth SetLineWidth_read(SetLineWidthRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = scene[ix + 0]; + SetLineWidth s; + s.width = uintBitsToFloat(raw0); + return s; +} + +Transform Transform_read(TransformRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = scene[ix + 0]; + uint raw1 = scene[ix + 1]; + uint raw2 = scene[ix + 2]; + uint raw3 = scene[ix + 3]; + uint raw4 = scene[ix + 4]; + uint raw5 = scene[ix + 5]; + Transform s; + s.mat = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3)); + s.translate = vec2(uintBitsToFloat(raw4), uintBitsToFloat(raw5)); + return s; +} + +Clip Clip_read(ClipRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = scene[ix + 0]; + uint raw1 = scene[ix + 1]; + uint raw2 = scene[ix + 2]; + uint raw3 = scene[ix + 3]; + Clip s; + s.bbox = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3)); + return s; +} + +SetFillMode SetFillMode_read(SetFillModeRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = scene[ix + 0]; + SetFillMode s; + s.fill_mode = raw0; + return s; +} + +ElementTag Element_tag(ElementRef ref) { + uint tag_and_flags = scene[ref.offset >> 2]; + return ElementTag(tag_and_flags & 0xffff, tag_and_flags >> 16); +} + +LineSeg Element_Line_read(ElementRef ref) { + return LineSeg_read(LineSegRef(ref.offset + 4)); +} + +QuadSeg Element_Quad_read(ElementRef ref) { + return QuadSeg_read(QuadSegRef(ref.offset + 4)); +} + +CubicSeg Element_Cubic_read(ElementRef ref) { + return CubicSeg_read(CubicSegRef(ref.offset + 4)); +} + +FillColor Element_FillColor_read(ElementRef ref) { + return FillColor_read(FillColorRef(ref.offset + 4)); +} + +SetLineWidth Element_SetLineWidth_read(ElementRef ref) { + return SetLineWidth_read(SetLineWidthRef(ref.offset + 4)); +} + +Transform Element_Transform_read(ElementRef ref) { + return Transform_read(TransformRef(ref.offset + 4)); +} + +Clip Element_BeginClip_read(ElementRef ref) { + return Clip_read(ClipRef(ref.offset + 4)); +} + +Clip Element_EndClip_read(ElementRef ref) { + return Clip_read(ClipRef(ref.offset + 4)); +} + +FillImage Element_FillImage_read(ElementRef ref) { + return FillImage_read(FillImageRef(ref.offset + 4)); +} + +SetFillMode Element_SetFillMode_read(ElementRef ref) { + return SetFillMode_read(SetFillModeRef(ref.offset + 4)); +} + diff --git a/gio/shader/piet/setup.h b/gio/shader/piet/setup.h new file mode 100644 index 0000000..83b6d1d --- /dev/null +++ b/gio/shader/piet/setup.h @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense + +// Various constants for the sizes of groups and tiles. + +// Much of this will be made dynamic in various ways, but for now it's easiest +// to hardcode and keep all in one place. + +// A LG_WG_FACTOR of n scales workgroup sizes by 2^n. Use 0 for a +// maximum workgroup size of 128, or 1 for a maximum size of 256. +#define LG_WG_FACTOR 0 +#define WG_FACTOR (1<> 2; + uint raw0 = state[ix + 0]; + uint raw1 = state[ix + 1]; + uint raw2 = state[ix + 2]; + uint raw3 = state[ix + 3]; + uint raw4 = state[ix + 4]; + uint raw5 = state[ix + 5]; + uint raw6 = state[ix + 6]; + uint raw7 = state[ix + 7]; + uint raw8 = state[ix + 8]; + uint raw9 = state[ix + 9]; + uint raw10 = state[ix + 10]; + uint raw11 = state[ix + 11]; + uint raw12 = state[ix + 12]; + uint raw13 = state[ix + 13]; + uint raw14 = state[ix + 14]; + State s; + s.mat = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3)); + s.translate = vec2(uintBitsToFloat(raw4), uintBitsToFloat(raw5)); + s.bbox = vec4(uintBitsToFloat(raw6), uintBitsToFloat(raw7), uintBitsToFloat(raw8), uintBitsToFloat(raw9)); + s.linewidth = uintBitsToFloat(raw10); + s.flags = raw11; + s.path_count = raw12; + s.pathseg_count = raw13; + s.trans_count = raw14; + return s; +} + +void State_write(StateRef ref, State s) { + uint ix = ref.offset >> 2; + state[ix + 0] = floatBitsToUint(s.mat.x); + state[ix + 1] = floatBitsToUint(s.mat.y); + state[ix + 2] = floatBitsToUint(s.mat.z); + state[ix + 3] = floatBitsToUint(s.mat.w); + state[ix + 4] = floatBitsToUint(s.translate.x); + state[ix + 5] = floatBitsToUint(s.translate.y); + state[ix + 6] = floatBitsToUint(s.bbox.x); + state[ix + 7] = floatBitsToUint(s.bbox.y); + state[ix + 8] = floatBitsToUint(s.bbox.z); + state[ix + 9] = floatBitsToUint(s.bbox.w); + state[ix + 10] = floatBitsToUint(s.linewidth); + state[ix + 11] = s.flags; + state[ix + 12] = s.path_count; + state[ix + 13] = s.pathseg_count; + state[ix + 14] = s.trans_count; +} + diff --git a/gio/shader/piet/tile.h b/gio/shader/piet/tile.h new file mode 100644 index 0000000..e11329c --- /dev/null +++ b/gio/shader/piet/tile.h @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense + +// Code auto-generated by piet-gpu-derive + +struct PathRef { + uint offset; +}; + +struct TileRef { + uint offset; +}; + +struct TileSegRef { + uint offset; +}; + +struct TransformSegRef { + uint offset; +}; + +struct Path { + uvec4 bbox; + TileRef tiles; +}; + +#define Path_size 12 + +PathRef Path_index(PathRef ref, uint index) { + return PathRef(ref.offset + index * Path_size); +} + +struct Tile { + TileSegRef tile; + int backdrop; +}; + +#define Tile_size 8 + +TileRef Tile_index(TileRef ref, uint index) { + return TileRef(ref.offset + index * Tile_size); +} + +struct TileSeg { + vec2 origin; + vec2 vector; + float y_edge; + TileSegRef next; +}; + +#define TileSeg_size 24 + +TileSegRef TileSeg_index(TileSegRef ref, uint index) { + return TileSegRef(ref.offset + index * TileSeg_size); +} + +struct TransformSeg { + vec4 mat; + vec2 translate; +}; + +#define TransformSeg_size 24 + +TransformSegRef TransformSeg_index(TransformSegRef ref, uint index) { + return TransformSegRef(ref.offset + index * TransformSeg_size); +} + +Path Path_read(Alloc a, PathRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = read_mem(a, ix + 0); + uint raw1 = read_mem(a, ix + 1); + uint raw2 = read_mem(a, ix + 2); + Path s; + s.bbox = uvec4(raw0 & 0xffff, raw0 >> 16, raw1 & 0xffff, raw1 >> 16); + s.tiles = TileRef(raw2); + return s; +} + +void Path_write(Alloc a, PathRef ref, Path s) { + uint ix = ref.offset >> 2; + write_mem(a, ix + 0, s.bbox.x | (s.bbox.y << 16)); + write_mem(a, ix + 1, s.bbox.z | (s.bbox.w << 16)); + write_mem(a, ix + 2, s.tiles.offset); +} + +Tile Tile_read(Alloc a, TileRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = read_mem(a, ix + 0); + uint raw1 = read_mem(a, ix + 1); + Tile s; + s.tile = TileSegRef(raw0); + s.backdrop = int(raw1); + return s; +} + +void Tile_write(Alloc a, TileRef ref, Tile s) { + uint ix = ref.offset >> 2; + write_mem(a, ix + 0, s.tile.offset); + write_mem(a, ix + 1, uint(s.backdrop)); +} + +TileSeg TileSeg_read(Alloc a, TileSegRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = read_mem(a, ix + 0); + uint raw1 = read_mem(a, ix + 1); + uint raw2 = read_mem(a, ix + 2); + uint raw3 = read_mem(a, ix + 3); + uint raw4 = read_mem(a, ix + 4); + uint raw5 = read_mem(a, ix + 5); + TileSeg s; + s.origin = vec2(uintBitsToFloat(raw0), uintBitsToFloat(raw1)); + s.vector = vec2(uintBitsToFloat(raw2), uintBitsToFloat(raw3)); + s.y_edge = uintBitsToFloat(raw4); + s.next = TileSegRef(raw5); + return s; +} + +void TileSeg_write(Alloc a, TileSegRef ref, TileSeg s) { + uint ix = ref.offset >> 2; + write_mem(a, ix + 0, floatBitsToUint(s.origin.x)); + write_mem(a, ix + 1, floatBitsToUint(s.origin.y)); + write_mem(a, ix + 2, floatBitsToUint(s.vector.x)); + write_mem(a, ix + 3, floatBitsToUint(s.vector.y)); + write_mem(a, ix + 4, floatBitsToUint(s.y_edge)); + write_mem(a, ix + 5, s.next.offset); +} + +TransformSeg TransformSeg_read(Alloc a, TransformSegRef ref) { + uint ix = ref.offset >> 2; + uint raw0 = read_mem(a, ix + 0); + uint raw1 = read_mem(a, ix + 1); + uint raw2 = read_mem(a, ix + 2); + uint raw3 = read_mem(a, ix + 3); + uint raw4 = read_mem(a, ix + 4); + uint raw5 = read_mem(a, ix + 5); + TransformSeg s; + s.mat = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3)); + s.translate = vec2(uintBitsToFloat(raw4), uintBitsToFloat(raw5)); + return s; +} + +void TransformSeg_write(Alloc a, TransformSegRef ref, TransformSeg s) { + uint ix = ref.offset >> 2; + write_mem(a, ix + 0, floatBitsToUint(s.mat.x)); + write_mem(a, ix + 1, floatBitsToUint(s.mat.y)); + write_mem(a, ix + 2, floatBitsToUint(s.mat.z)); + write_mem(a, ix + 3, floatBitsToUint(s.mat.w)); + write_mem(a, ix + 4, floatBitsToUint(s.translate.x)); + write_mem(a, ix + 5, floatBitsToUint(s.translate.y)); +} + diff --git a/gio/shader/piet/tile_alloc_abi.h b/gio/shader/piet/tile_alloc_abi.h new file mode 100644 index 0000000..aac2706 --- /dev/null +++ b/gio/shader/piet/tile_alloc_abi.h @@ -0,0 +1,17 @@ +// Code generated by gioui.org/cpu/cmd/compile DO NOT EDIT. + +struct tile_alloc_descriptor_set_layout { + struct buffer_descriptor binding0; + struct buffer_descriptor binding1; +}; + +extern coroutine tile_alloc_coroutine_begin(struct program_data *data, + int32_t workgroupX, int32_t workgroupY, int32_t workgroupZ, + void *workgroupMemory, + int32_t firstSubgroup, + int32_t subgroupCount) ATTR_HIDDEN; + +extern bool tile_alloc_coroutine_await(coroutine r, yield_result *res) ATTR_HIDDEN; +extern void tile_alloc_coroutine_destroy(coroutine r) ATTR_HIDDEN; + +extern const struct program_info tile_alloc_program_info ATTR_HIDDEN; diff --git a/gio/shader/piet/tile_alloc_abi_nosupport.go b/gio/shader/piet/tile_alloc_abi_nosupport.go new file mode 100644 index 0000000..b781c21 --- /dev/null +++ b/gio/shader/piet/tile_alloc_abi_nosupport.go @@ -0,0 +1,19 @@ +// Code generated by gioui.org/cpu/cmd/compile DO NOT EDIT. + +package piet + +import "gioui.org/cpu" + +var Tile_allocProgramInfo *cpu.ProgramInfo + +type Tile_allocDescriptorSetLayout struct{} + +const Tile_allocHash = "" + +func (l *Tile_allocDescriptorSetLayout) Binding0() *cpu.BufferDescriptor { + panic("unsupported") +} + +func (l *Tile_allocDescriptorSetLayout) Binding1() *cpu.BufferDescriptor { + panic("unsupported") +} diff --git a/gio/shader/shader.go b/gio/shader/shader.go new file mode 100644 index 0000000..e1263c1 --- /dev/null +++ b/gio/shader/shader.go @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: Unlicense OR MIT + +package shader + +type Sources struct { + Name string + SPIRV string + GLSL100ES string + GLSL150 string + DXBC string + MetalLib string + Uniforms UniformsReflection + Inputs []InputLocation + Textures []TextureBinding + StorageBuffers []BufferBinding + Images []ImageBinding + WorkgroupSize [3]int +} + +type UniformsReflection struct { + Locations []UniformLocation + Size int +} + +type ImageBinding struct { + Name string + Binding int +} + +type BufferBinding struct { + Name string + Binding int +} + +type TextureBinding struct { + Name string + Binding int +} + +type UniformLocation struct { + Name string + Type DataType + Size int + Offset int +} + +type InputLocation struct { + // For GLSL. + Name string + Location int + // For HLSL. + Semantic string + SemanticIndex int + + Type DataType + Size int +} + +type DataType uint8 + +const ( + DataTypeFloat DataType = iota + DataTypeInt + DataTypeShort +) diff --git a/giouibind.go b/giouibind.go new file mode 100644 index 0000000..698cb01 --- /dev/null +++ b/giouibind.go @@ -0,0 +1,99 @@ +package giouibind + +import ( + "fmt" + "image/color" + + "gioui.org/app" + "gioui.org/font/gofont" + "gioui.org/io/system" + "gioui.org/layout" + "gioui.org/op" + "gioui.org/text" + "gioui.org/unit" + "gioui.org/widget/material" + "github.com/empathicqubit/giouibind/native" + + "log" +) + +const ( + screenW = 320 + screenH = 320 +) + +func (a *AppState) FinishedConnect(success bool, name string) { + a.connected = success + a.connecting = false + a.deviceName = name + log.Printf("Device %s connected: %t\n", name, success) + a.window.Invalidate() +} + +func (a *AppState) FinishedDisconnect() { +} + +func (app *AppState) BluetoothGotData(data []byte) { + log.Printf("Received: %v\n", data) +} + +func (app *AppState) Update() error { + if !app.connected && !app.connecting { + app.connecting = true + app.nativeBridge.ConnectToDevice() + return nil + } + + if !app.connected { + return nil + } + + return nil +} + +func (app *AppState) Load() error { + app.loaded = true + + return nil +} + +func (app *AppState) InventGod(god native.INativeBridge) error { + log.Println("God has been invented") + app.nativeBridge = god + + if !app.bluetoothEnabled { + app.nativeBridge.EnableBluetooth() + app.bluetoothEnabled = true + } + + return nil +} + +func (app *AppState) RunApp(w *app.Window) error { + app.window = w + th := material.NewTheme(gofont.Collection()) + th.TextSize = unit.Sp(8) + var ops op.Ops + for { + go app.Update() + e := <-w.Events() + switch e := e.(type) { + case system.DestroyEvent: + return e.Err + case system.FrameEvent: + gtx := layout.NewContext(&ops, e) + + titleText := "Not connected" + if app.connected { + titleText = fmt.Sprintf("Connected to %s", app.deviceName) + } + title := material.H1(th, titleText) + maroon := color.NRGBA{R: 127, G: 0, B: 0, A: 255} + title.Color = maroon + title.Alignment = text.Middle + title.Layout(gtx) + + e.Frame(gtx.Ops) + } + } +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..27f7cde --- /dev/null +++ b/go.mod @@ -0,0 +1,30 @@ +module github.com/empathicqubit/giouibind + +go 1.17 + +replace gioui.org/cpu => ./gio/cpu + +replace gioui.org/shader => ./gio/shader + +require ( + gioui.org/cpu v0.0.0-20210817075930-8d6a761490d2 // indirect + gioui.org/shader v1.0.6 // indirect + github.com/benoitkugler/textlayout v0.0.10 // indirect + github.com/gioui/uax v0.2.1-0.20220325163150-e3d987515a12 // indirect + github.com/go-text/typesetting v0.0.0-20220411150340-35994bc27a7b // indirect + github.com/stretchr/testify v1.7.0 // indirect + golang.org/x/text v0.3.7 // indirect +) + +require ( + gioui.org v0.0.0-20220412162123-38ff78df5dbe + github.com/JuulLabs-OSS/cbgo v0.0.2 + github.com/sirupsen/logrus v1.8.1 // indirect + golang.org/x/exp v0.0.0-20210722180016-6781d3edade3 // indirect + golang.org/x/image v0.0.0-20220321031419-a8550c1d254a // indirect + golang.org/x/mobile v0.0.0-20220104184238-4a8be17bd2e3 + golang.org/x/mod v0.4.2 // indirect + golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886 // indirect + golang.org/x/tools v0.1.8-0.20211022200916-316ba0b74098 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..ba013e3 --- /dev/null +++ b/go.sum @@ -0,0 +1,471 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +eliasnaur.com/font v0.0.0-20220124212145-832bb8fc08c3 h1:djFprmHZgrSepsHAIRMp5UJn3PzsoTg9drI+BDmif5Q= +eliasnaur.com/font v0.0.0-20220124212145-832bb8fc08c3/go.mod h1:OYVuxibdk9OSLX8vAqydtRPP87PyTFcT9uH3MlEGBQA= +gioui.org v0.0.0-20220412162123-38ff78df5dbe h1:rCZdcdRmpZStw7LoHsjQc1G3Bf0/c1zhw7So/XMyQm8= +gioui.org v0.0.0-20220412162123-38ff78df5dbe/go.mod h1:A0rb8LTFy1Hhi6/2zppz6CRiGJLAk0akcD1p+77l+fg= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/JuulLabs-OSS/cbgo v0.0.2 h1:gCDyT0+EPuI8GOFyvAksFcVD2vF4CXBAVwT6uVnD9oo= +github.com/JuulLabs-OSS/cbgo v0.0.2/go.mod h1:L4YtGP+gnyD84w7+jN66ncspFRfOYB5aj9QSXaFHmBA= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/benoitkugler/pstokenizer v1.0.0/go.mod h1:l1G2Voirz0q/jj0TQfabNxVsa8HZXh/VMxFSRALWTiE= +github.com/benoitkugler/textlayout v0.0.5/go.mod h1:puH4v13Uz7uIhIH0XMk5jgc8U3MXcn5r3VlV9K8n0D8= +github.com/benoitkugler/textlayout v0.0.10 h1:uIaQgH4pBFw1LQ0tPkfjgxo94WYcckzzQaB41L2X84w= +github.com/benoitkugler/textlayout v0.0.10/go.mod h1:puH4v13Uz7uIhIH0XMk5jgc8U3MXcn5r3VlV9K8n0D8= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudfoundry/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21/go.mod h1:po7NpZ/QiTKzBKyrsEAxwnTamCoh8uDk/egRpQ7siIc= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gioui/uax v0.2.1-0.20220325163150-e3d987515a12 h1:1bjaB/5IIicfKpP4k0s30T2WEw//Kh00zULa8DQ0cxA= +github.com/gioui/uax v0.2.1-0.20220325163150-e3d987515a12/go.mod h1:kDhBRTA/i3H46PVdhqcw26TdGSIj42TOKNWKY+Kipnw= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-text/typesetting v0.0.0-20220411150340-35994bc27a7b h1:WINlj3ANt+CVrO2B4NGDHRlPvEWZPxjhb7z+JKypwXI= +github.com/go-text/typesetting v0.0.0-20220411150340-35994bc27a7b/go.mod h1:ZNYu5saGoMOqtkVH5T8onTwhzenDUVszI+5WFHJRaxQ= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.21.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= +go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= +golang.org/x/exp v0.0.0-20210722180016-6781d3edade3 h1:IlrJD2AM5p8JhN/wVny9jt6gJ9hut2VALhSeZ3SYluk= +golang.org/x/exp v0.0.0-20210722180016-6781d3edade3/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210504121937-7319ad40d33e/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220321031419-a8550c1d254a h1:LnH9RNcpPv5Kzi15lXg42lYMPUf0x8CuPv1YnvBWZAg= +golang.org/x/image v0.0.0-20220321031419-a8550c1d254a/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= +golang.org/x/mobile v0.0.0-20220104184238-4a8be17bd2e3 h1:A6xMk9ozH8+K90r7CpnP00jZ92Io02pQ/XLd55pZuf0= +golang.org/x/mobile v0.0.0-20220104184238-4a8be17bd2e3/go.mod h1:pe2sM7Uk+2Su1y7u/6Z8KJ24D7lepUjFZbhFOrmDfuQ= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886 h1:eJv7u3ksNXoLbGSKuv2s/SIO4tJVxc/A+MTpzxDgz/Q= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.8-0.20211022200916-316ba0b74098 h1:YuekqPskqwCCPM79F1X5Dhv4ezTCj+Ki1oNwiafxkA0= +golang.org/x/tools v0.1.8-0.20211022200916-316ba0b74098/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 0000000..f4b4526 --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,66 @@ +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## Build generated +build/ +DerivedData/ + +## Various settings +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata/ + +## Other +*.moved-aside +*.xccheckout +*.xcscmblueprint + +## Obj-C/Swift specific +*.hmap +*.ipa +*.dSYM.zip +*.dSYM + +# CocoaPods +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# +# Pods/ +# +# Add this line if you want to avoid checking in source code from the Xcode workspace +*.xcworkspace + +# Carthage +# +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots/**/*.png +fastlane/test_output + +# Code Injection +# +# After new code Injection tools there's a generated folder /iOSInjectionProject +# https://github.com/johnno1962/injectionforxcode + +iOSInjectionProject/ diff --git a/ios/export-options.plist b/ios/export-options.plist new file mode 100644 index 0000000..84bab3e --- /dev/null +++ b/ios/export-options.plist @@ -0,0 +1,12 @@ + + + + + teamID + FIXME + method + development + uploadSymbols + + + diff --git a/ios/giouibind/giouibind.xcodeproj/project.pbxproj b/ios/giouibind/giouibind.xcodeproj/project.pbxproj new file mode 100644 index 0000000..18d2a28 --- /dev/null +++ b/ios/giouibind/giouibind.xcodeproj/project.pbxproj @@ -0,0 +1,648 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 55; + objects = { + +/* Begin PBXBuildFile section */ + 2422052D280388F30075E3DF /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2422052C280388F30075E3DF /* AppDelegate.swift */; }; + 24220531280388F30075E3DF /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24220530280388F30075E3DF /* ViewController.swift */; }; + 24220544280388F50075E3DF /* giouibindTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24220543280388F50075E3DF /* giouibindTests.swift */; }; + 2422054E280388F50075E3DF /* giouibindUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2422054D280388F50075E3DF /* giouibindUITests.swift */; }; + 24220550280388F50075E3DF /* giouibindUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2422054F280388F50075E3DF /* giouibindUITestsLaunchTests.swift */; }; + 2422055E280389530075E3DF /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2422055D280389530075E3DF /* GameController.framework */; }; + 24220560280389580075E3DF /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2422055F280389580075E3DF /* AudioToolbox.framework */; }; + 242205622803895E0075E3DF /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 242205612803895E0075E3DF /* OpenGLES.framework */; }; + 24220564280389670075E3DF /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24220563280389670075E3DF /* AVFoundation.framework */; }; + 242205662803896D0075E3DF /* GLKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 242205652803896D0075E3DF /* GLKit.framework */; }; + 2422056D28039C680075E3DF /* GodObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2422056C28039C680075E3DF /* GodObject.swift */; }; + 24A5E8E42804545E007CBEF9 /* ExternalAccessory.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24A5E8E32804545E007CBEF9 /* ExternalAccessory.framework */; }; + 24D0447E2806A14B00C93659 /* Mobile.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24D0447D2806A14B00C93659 /* Mobile.xcframework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 24220540280388F50075E3DF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 24220521280388F30075E3DF /* Project object */; + proxyType = 1; + remoteGlobalIDString = 24220528280388F30075E3DF; + remoteInfo = giouibind; + }; + 2422054A280388F50075E3DF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 24220521280388F30075E3DF /* Project object */; + proxyType = 1; + remoteGlobalIDString = 24220528280388F30075E3DF; + remoteInfo = giouibind; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 2422056A280389800075E3DF /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 24220529280388F30075E3DF /* giouibind.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = giouibind.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 2422052C280388F30075E3DF /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 24220530280388F30075E3DF /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 2422053A280388F50075E3DF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2422053F280388F50075E3DF /* giouibindTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = giouibindTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 24220543280388F50075E3DF /* giouibindTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = giouibindTests.swift; sourceTree = ""; }; + 24220549280388F50075E3DF /* giouibindUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = giouibindUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 2422054D280388F50075E3DF /* giouibindUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = giouibindUITests.swift; sourceTree = ""; }; + 2422054F280388F50075E3DF /* giouibindUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = giouibindUITestsLaunchTests.swift; sourceTree = ""; }; + 2422055D280389530075E3DF /* GameController.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameController.framework; path = System/Library/Frameworks/GameController.framework; sourceTree = SDKROOT; }; + 2422055F280389580075E3DF /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; + 242205612803895E0075E3DF /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; + 24220563280389670075E3DF /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; + 242205652803896D0075E3DF /* GLKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLKit.framework; path = System/Library/Frameworks/GLKit.framework; sourceTree = SDKROOT; }; + 2422056C28039C680075E3DF /* GodObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GodObject.swift; sourceTree = ""; }; + 24A5E8E32804545E007CBEF9 /* ExternalAccessory.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ExternalAccessory.framework; path = System/Library/Frameworks/ExternalAccessory.framework; sourceTree = SDKROOT; }; + 24D044752806938A00C93659 /* giouibind-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "giouibind-Bridging-Header.h"; sourceTree = ""; }; + 24D0447D2806A14B00C93659 /* Mobile.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Mobile.xcframework; path = ../../build/Mobile.xcframework; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 24220526280388F30075E3DF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 24A5E8E42804545E007CBEF9 /* ExternalAccessory.framework in Frameworks */, + 24220564280389670075E3DF /* AVFoundation.framework in Frameworks */, + 24D0447E2806A14B00C93659 /* Mobile.xcframework in Frameworks */, + 2422055E280389530075E3DF /* GameController.framework in Frameworks */, + 24220560280389580075E3DF /* AudioToolbox.framework in Frameworks */, + 242205662803896D0075E3DF /* GLKit.framework in Frameworks */, + 242205622803895E0075E3DF /* OpenGLES.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2422053C280388F50075E3DF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 24220546280388F50075E3DF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 24220520280388F30075E3DF = { + isa = PBXGroup; + children = ( + 2422052B280388F30075E3DF /* giouibind */, + 24220542280388F50075E3DF /* giouibindTests */, + 2422054C280388F50075E3DF /* giouibindUITests */, + 2422052A280388F30075E3DF /* Products */, + 2422055C280389530075E3DF /* Frameworks */, + ); + sourceTree = ""; + }; + 2422052A280388F30075E3DF /* Products */ = { + isa = PBXGroup; + children = ( + 24220529280388F30075E3DF /* giouibind.app */, + 2422053F280388F50075E3DF /* giouibindTests.xctest */, + 24220549280388F50075E3DF /* giouibindUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 2422052B280388F30075E3DF /* giouibind */ = { + isa = PBXGroup; + children = ( + 2422052C280388F30075E3DF /* AppDelegate.swift */, + 24220530280388F30075E3DF /* ViewController.swift */, + 2422053A280388F50075E3DF /* Info.plist */, + 2422056C28039C680075E3DF /* GodObject.swift */, + 24D044752806938A00C93659 /* giouibind-Bridging-Header.h */, + ); + path = giouibind; + sourceTree = ""; + }; + 24220542280388F50075E3DF /* giouibindTests */ = { + isa = PBXGroup; + children = ( + 24220543280388F50075E3DF /* giouibindTests.swift */, + ); + path = giouibindTests; + sourceTree = ""; + }; + 2422054C280388F50075E3DF /* giouibindUITests */ = { + isa = PBXGroup; + children = ( + 2422054D280388F50075E3DF /* giouibindUITests.swift */, + 2422054F280388F50075E3DF /* giouibindUITestsLaunchTests.swift */, + ); + path = giouibindUITests; + sourceTree = ""; + }; + 2422055C280389530075E3DF /* Frameworks */ = { + isa = PBXGroup; + children = ( + 24D0447D2806A14B00C93659 /* Mobile.xcframework */, + 24A5E8E32804545E007CBEF9 /* ExternalAccessory.framework */, + 242205652803896D0075E3DF /* GLKit.framework */, + 24220563280389670075E3DF /* AVFoundation.framework */, + 242205612803895E0075E3DF /* OpenGLES.framework */, + 2422055F280389580075E3DF /* AudioToolbox.framework */, + 2422055D280389530075E3DF /* GameController.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 24220528280388F30075E3DF /* giouibind */ = { + isa = PBXNativeTarget; + buildConfigurationList = 24220553280388F50075E3DF /* Build configuration list for PBXNativeTarget "giouibind" */; + buildPhases = ( + 24220525280388F30075E3DF /* Sources */, + 24220526280388F30075E3DF /* Frameworks */, + 24220527280388F30075E3DF /* Resources */, + 2422056A280389800075E3DF /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = giouibind; + productName = giouibind; + productReference = 24220529280388F30075E3DF /* giouibind.app */; + productType = "com.apple.product-type.application"; + }; + 2422053E280388F50075E3DF /* giouibindTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 24220556280388F50075E3DF /* Build configuration list for PBXNativeTarget "giouibindTests" */; + buildPhases = ( + 2422053B280388F50075E3DF /* Sources */, + 2422053C280388F50075E3DF /* Frameworks */, + 2422053D280388F50075E3DF /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 24220541280388F50075E3DF /* PBXTargetDependency */, + ); + name = giouibindTests; + productName = giouibindTests; + productReference = 2422053F280388F50075E3DF /* giouibindTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 24220548280388F50075E3DF /* giouibindUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 24220559280388F50075E3DF /* Build configuration list for PBXNativeTarget "giouibindUITests" */; + buildPhases = ( + 24220545280388F50075E3DF /* Sources */, + 24220546280388F50075E3DF /* Frameworks */, + 24220547280388F50075E3DF /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 2422054B280388F50075E3DF /* PBXTargetDependency */, + ); + name = giouibindUITests; + productName = giouibindUITests; + productReference = 24220549280388F50075E3DF /* giouibindUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 24220521280388F30075E3DF /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1320; + LastUpgradeCheck = 1320; + TargetAttributes = { + 24220528280388F30075E3DF = { + CreatedOnToolsVersion = 13.2.1; + LastSwiftMigration = 1330; + }; + 2422053E280388F50075E3DF = { + CreatedOnToolsVersion = 13.2.1; + TestTargetID = 24220528280388F30075E3DF; + }; + 24220548280388F50075E3DF = { + CreatedOnToolsVersion = 13.2.1; + TestTargetID = 24220528280388F30075E3DF; + }; + }; + }; + buildConfigurationList = 24220524280388F30075E3DF /* Build configuration list for PBXProject "giouibind" */; + compatibilityVersion = "Xcode 13.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 24220520280388F30075E3DF; + productRefGroup = 2422052A280388F30075E3DF /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 24220528280388F30075E3DF /* giouibind */, + 2422053E280388F50075E3DF /* giouibindTests */, + 24220548280388F50075E3DF /* giouibindUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 24220527280388F30075E3DF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2422053D280388F50075E3DF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 24220547280388F50075E3DF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 24220525280388F30075E3DF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 24220531280388F30075E3DF /* ViewController.swift in Sources */, + 2422052D280388F30075E3DF /* AppDelegate.swift in Sources */, + 2422056D28039C680075E3DF /* GodObject.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2422053B280388F50075E3DF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 24220544280388F50075E3DF /* giouibindTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 24220545280388F50075E3DF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 24220550280388F50075E3DF /* giouibindUITestsLaunchTests.swift in Sources */, + 2422054E280388F50075E3DF /* giouibindUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 24220541280388F50075E3DF /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 24220528280388F30075E3DF /* giouibind */; + targetProxy = 24220540280388F50075E3DF /* PBXContainerItemProxy */; + }; + 2422054B280388F50075E3DF /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 24220528280388F30075E3DF /* giouibind */; + targetProxy = 2422054A280388F50075E3DF /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 24220551280388F50075E3DF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 5FL95D4X28; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.2; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CODE_SIGN_FLAGS = "--deep"; + SDKROOT = iphoneos; + STRIP_BITCODE_FROM_COPIED_FILES = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 24220552280388F50075E3DF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 5FL95D4X28; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.2; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + OTHER_CODE_SIGN_FLAGS = "--deep"; + SDKROOT = iphoneos; + STRIP_BITCODE_FROM_COPIED_FILES = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 24220554280388F50075E3DF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 5FL95D4X28; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = giouibind/Info.plist; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_CODE_SIGN_FLAGS = "--deep"; + PRODUCT_BUNDLE_IDENTIFIER = gl.entan.giouibind; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + STRIP_BITCODE_FROM_COPIED_FILES = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "giouibind/giouibind-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 24220555280388F50075E3DF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 5FL95D4X28; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = giouibind/Info.plist; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_CODE_SIGN_FLAGS = "--deep"; + PRODUCT_BUNDLE_IDENTIFIER = gl.entan.giouibind; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + STRIP_BITCODE_FROM_COPIED_FILES = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "giouibind/giouibind-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 24220557280388F50075E3DF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 5FL95D4X28; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.2; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = gl.entan.giouibindTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/giouibind.app/giouibind"; + }; + name = Debug; + }; + 24220558280388F50075E3DF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 5FL95D4X28; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.2; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = gl.entan.giouibindTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/giouibind.app/giouibind"; + }; + name = Release; + }; + 2422055A280388F50075E3DF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 5FL95D4X28; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = gl.entan.giouibindUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = giouibind; + }; + name = Debug; + }; + 2422055B280388F50075E3DF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 5FL95D4X28; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = gl.entan.giouibindUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = giouibind; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 24220524280388F30075E3DF /* Build configuration list for PBXProject "giouibind" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 24220551280388F50075E3DF /* Debug */, + 24220552280388F50075E3DF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 24220553280388F50075E3DF /* Build configuration list for PBXNativeTarget "giouibind" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 24220554280388F50075E3DF /* Debug */, + 24220555280388F50075E3DF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 24220556280388F50075E3DF /* Build configuration list for PBXNativeTarget "giouibindTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 24220557280388F50075E3DF /* Debug */, + 24220558280388F50075E3DF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 24220559280388F50075E3DF /* Build configuration list for PBXNativeTarget "giouibindUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2422055A280388F50075E3DF /* Debug */, + 2422055B280388F50075E3DF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 24220521280388F30075E3DF /* Project object */; +} diff --git a/ios/giouibind/giouibind/AppDelegate.swift b/ios/giouibind/giouibind/AppDelegate.swift new file mode 100644 index 0000000..926b9b1 --- /dev/null +++ b/ios/giouibind/giouibind/AppDelegate.swift @@ -0,0 +1,37 @@ +// +// AppDelegate.swift +// giouibind +// +// Created by Jessica Fleming on 10.04.22. +// + +import UIKit +import Mobile + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window:UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + + self.window = UIWindow(frame: CGRect( + x: UIScreen.main.bounds.minX, + y: UIScreen.main.bounds.minY + 40, + width: UIScreen.main.bounds.width, + height: UIScreen.main.bounds.height - 40 + )) + window?.rootViewController = ViewController() + window?.makeKeyAndVisible() + MobileInventGod(GodObject()) + + return true + } + + var gioView : ViewController { + get { + return self.window!.rootViewController! as! ViewController + } + } +} + diff --git a/ios/giouibind/giouibind/Base.lproj/Main.storyboard b/ios/giouibind/giouibind/Base.lproj/Main.storyboard new file mode 100644 index 0000000..a3a8013 --- /dev/null +++ b/ios/giouibind/giouibind/Base.lproj/Main.storyboard @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/giouibind/giouibind/GodObject.swift b/ios/giouibind/giouibind/GodObject.swift new file mode 100644 index 0000000..3ae506d --- /dev/null +++ b/ios/giouibind/giouibind/GodObject.swift @@ -0,0 +1,203 @@ +// +// GodObject.swift +// giouibind +// +// Created by Jessica Fleming on 11.04.22. +// + +import Foundation +import Mobile +import ExternalAccessory +import os +import CoreBluetooth + +// FIXME This should come from gocode +let shortServiceUuid = CBUUID(string: "FIXME") +let longServiceUuid = CBUUID(string: "FIXME") + +let writeUuid = CBUUID(string: "FIXME") +let readUuid = CBUUID(string: "FIXME") + +class MyDelegate : NSObject, CBCentralManagerDelegate, CBPeripheralDelegate { + var service : CBService? + var writeChr : CBCharacteristic? + var readChr : CBCharacteristic? + var connectedPeripheral : CBPeripheral? + var finishedConnect = false + + override init() { + super.init() + } + + func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: + Error?) { + if error != nil || (peripheral.services?.isEmpty ?? true) { + os_log("Error discovering services", log: .default, type: .info) + MobileFinishedConnect(false, "") + return + } + + service = peripheral.services![0] + peripheral.discoverCharacteristics([readUuid, writeUuid], for: service!) + + } + func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor descriptor: CBDescriptor, error: Error?) { + if descriptor.characteristic == nil || descriptor.characteristic?.service?.uuid.uuidString != service?.uuid.uuidString { + return + } + + self.peripheral(peripheral, didUpdateValueFor: descriptor.characteristic!, error: error) + } + + func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) { + + if error != nil { + os_log("Error getting descriptor value: %s", log: .default, type: .info, characteristic.uuid.uuidString) + return + } + + if characteristic.value == nil { + return + } + let data = characteristic.value! + + if characteristic.uuid.uuidString != readChr?.uuid.uuidString { + return + } + + MobileBluetoothGotData(data) + } + + func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) { + if connectedPeripheral == nil { + peripheral.discoverServices([longServiceUuid, shortServiceUuid]) + return + } + } + + func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) { + connectedPeripheral = nil + } + + func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor s: CBService, error: Error?) { + if s.uuid.uuidString != service?.uuid.uuidString { + return + } + + if(error != nil || (service?.characteristics?.isEmpty ?? true)) { + os_log("No chars", log: .default, type: .info) + MobileFinishedConnect(false, "") + return + } + + var foundCount = 0 + for chr in service!.characteristics! { + os_log("Found char: %s", log: .default, type: .info, chr.uuid.uuidString) + + let uuid = chr.uuid.uuidString + if uuid == writeUuid.uuidString { + writeChr = chr + foundCount += 1 + } else if uuid == readUuid.uuidString { + readChr = chr + foundCount += 1 + } + } + + if foundCount < 2 || service == nil { + os_log("Couldn't find matching service or characteristics", log: .default, type: .info) + MobileFinishedConnect(false, "") + return + } + + connectedPeripheral = peripheral + + os_log("Finished connect. Writing test command", log: .default, type: .info) + + peripheral.setNotifyValue(true, for: readChr!) + + if !finishedConnect { + finishedConnect = true + MobileFinishedConnect(true, peripheral.name) + } + } + + func writeChar(_ d: Data) -> Bool { + if connectedPeripheral == nil { + return false + } + + connectedPeripheral!.writeValue(d, for: writeChr! , type: CBCharacteristicWriteType.withResponse) + + return true + } + + func readChar() -> Data { + if connectedPeripheral == nil { + return Data() + } + + let ret = readChr!.value ?? Data() + + return ret + } + + func centralManagerDidUpdateState(_ central: CBCentralManager){ + os_log("Central Manager intialized", log: .default, type: .info) + + switch central.state{ + case CBManagerState.unauthorized: + os_log("Central Manager unauthorized", log: .default, type: .info) + case CBManagerState.poweredOff: + os_log("Central Manager powered off", log: .default, type: .info) + case CBManagerState.poweredOn: + os_log("Central Manager powered on", log: .default, type: .info) + default:break + } + } +} + +class GodObject : NSObject, MobileIGodObjectProtocol { + func readChar() -> Data? { + return delegate.readChar() + } + + func writeChar(_ data: Data?) -> Bool { + if data == nil { + return false + } + + return delegate.writeChar(data!) + } + + let delegate : MyDelegate + let manager : CBCentralManager + var peris : [CBPeripheral] = [] + + override init() { + delegate = MyDelegate() + manager = CBCentralManager(delegate: delegate, queue: DispatchQueue(label: "BT_queue")) + super.init() + } + + func connectToDevice() { + let peris = manager.retrieveConnectedPeripherals(withServices: [shortServiceUuid, longServiceUuid]) + + if(peris.isEmpty) { + os_log("No connected devices", log: .default, type: .info) + MobileFinishedConnect(false, "") + return + } + + self.peris = peris + for peri in peris { + os_log("Found device: %s", log: .default, type: .info, peri.name!) + peri.delegate = delegate + manager.connect(peri) + } + } + + func enableBluetooth() -> Bool { + return true + } +} diff --git a/ios/giouibind/giouibind/Info.plist b/ios/giouibind/giouibind/Info.plist new file mode 100644 index 0000000..f675fa8 --- /dev/null +++ b/ios/giouibind/giouibind/Info.plist @@ -0,0 +1,8 @@ + + + + + NSBluetoothAlwaysUsageDescription + Poop + + diff --git a/ios/giouibind/giouibind/ViewController.swift b/ios/giouibind/giouibind/ViewController.swift new file mode 100644 index 0000000..7cccc81 --- /dev/null +++ b/ios/giouibind/giouibind/ViewController.swift @@ -0,0 +1,11 @@ +// +// ViewController.swift +// giouibind +// +// Created by Jessica Fleming on 10.04.22. +// + +import UIKit + +class ViewController : GioViewController { +} diff --git a/ios/giouibind/giouibind/giouibind-Bridging-Header.h b/ios/giouibind/giouibind/giouibind-Bridging-Header.h new file mode 100644 index 0000000..ffe92bb --- /dev/null +++ b/ios/giouibind/giouibind/giouibind-Bridging-Header.h @@ -0,0 +1,8 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + +#include + +@interface GioViewController : UIViewController +@end diff --git a/ios/giouibind/giouibindTests/dumbcontrolTests.swift b/ios/giouibind/giouibindTests/dumbcontrolTests.swift new file mode 100644 index 0000000..7ef8fcb --- /dev/null +++ b/ios/giouibind/giouibindTests/dumbcontrolTests.swift @@ -0,0 +1,36 @@ +// +// giouibindTests.swift +// giouibindTests +// +// Created by Jessica Fleming on 10.04.22. +// + +import XCTest +@testable import giouibind + +class giouibindTests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + // Any test you write for XCTest can be annotated as throws and async. + // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error. + // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards. + } + + func testPerformanceExample() throws { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/ios/giouibind/giouibindUITests/dumbcontrolUITests.swift b/ios/giouibind/giouibindUITests/dumbcontrolUITests.swift new file mode 100644 index 0000000..fbc53bc --- /dev/null +++ b/ios/giouibind/giouibindUITests/dumbcontrolUITests.swift @@ -0,0 +1,42 @@ +// +// giouibindUITests.swift +// giouibindUITests +// +// Created by Jessica Fleming on 10.04.22. +// + +import XCTest + +class giouibindUITests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + // UI tests must launch the application that they test. + let app = XCUIApplication() + app.launch() + + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testLaunchPerformance() throws { + if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) { + // This measures how long it takes to launch your application. + measure(metrics: [XCTApplicationLaunchMetric()]) { + XCUIApplication().launch() + } + } + } +} diff --git a/ios/giouibind/giouibindUITests/dumbcontrolUITestsLaunchTests.swift b/ios/giouibind/giouibindUITests/dumbcontrolUITestsLaunchTests.swift new file mode 100644 index 0000000..cf5d124 --- /dev/null +++ b/ios/giouibind/giouibindUITests/dumbcontrolUITestsLaunchTests.swift @@ -0,0 +1,32 @@ +// +// giouibindUITestsLaunchTests.swift +// giouibindUITests +// +// Created by Jessica Fleming on 10.04.22. +// + +import XCTest + +class giouibindUITestsLaunchTests: XCTestCase { + + override class var runsForEachTargetApplicationUIConfiguration: Bool { + true + } + + override func setUpWithError() throws { + continueAfterFailure = false + } + + func testLaunch() throws { + let app = XCUIApplication() + app.launch() + + // Insert steps here to perform after app launch but before taking a screenshot, + // such as logging into a test account or navigating somewhere in the app + + let attachment = XCTAttachment(screenshot: app.screenshot()) + attachment.name = "Launch Screen" + attachment.lifetime = .keepAlways + add(attachment) + } +} diff --git a/mobile/gio/main.go b/mobile/gio/main.go new file mode 100644 index 0000000..da29a2c --- /dev/null +++ b/mobile/gio/main.go @@ -0,0 +1,4 @@ +package main + +func main() { +} diff --git a/mobile/mobile.go b/mobile/mobile.go new file mode 100644 index 0000000..c06786d --- /dev/null +++ b/mobile/mobile.go @@ -0,0 +1,58 @@ +package mobile + +import ( + "log" + "os" + + "gioui.org/app" + "github.com/empathicqubit/giouibind" + "github.com/empathicqubit/giouibind/native" +) + +type IGodObject interface { + native.INativeBridge +} + +var dumbApp *giouibind.AppState = &giouibind.AppState{} + +func init() { + log.Println("Called gomobile entrypoint") + Main() +} + +func Main() { + log.Println("Called main") + err := dumbApp.Load() + if err != nil { + panic(err) + } + + go func() { + w := app.NewWindow() + err := dumbApp.RunApp(w) + if err != nil { + log.Fatal(err) + } + os.Exit(0) + }() + app.Main() +} + +func FinishedConnect(success bool, name string) { + dumbApp.FinishedConnect(success, name) +} + +func BluetoothGotData(data []byte) { + dumbApp.BluetoothGotData(data) +} + +func InventGod(god IGodObject) { + log.Println("Inventing God...") + dumb, ok := god.(native.INativeBridge) + if !ok { + log.Println("God is not okay!") + } else { + log.Println("God is fine and dandy!") + } + dumbApp.InventGod(dumb) +} diff --git a/native/native.go b/native/native.go new file mode 100644 index 0000000..0a92508 --- /dev/null +++ b/native/native.go @@ -0,0 +1,13 @@ +// Interfaces for the binding bridge. This should only contain a bare minimum +// of functions to communicate with the host and should avoid storing anything +package native + +type INativeBluetooth interface { + WriteChar([]byte) bool + ConnectToDevice() + EnableBluetooth() bool +} + +type INativeBridge interface { + INativeBluetooth +} diff --git a/tools.go b/tools.go new file mode 100644 index 0000000..3cd1243 --- /dev/null +++ b/tools.go @@ -0,0 +1,8 @@ +//go:build tools +// +build tools + +package main + +import ( + _ "golang.org/x/mobile/cmd/gomobile" +)