diff --git a/README.md b/README.md index a435e42..f02d249 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ - vulcandraw - vulcancube +Using CGO then requare C/C++ compiler on path. + ## Supported platforms - Windows (GLFW) @@ -18,18 +20,18 @@ ### GLFW v3.3 A standard `go run main.go` / `go build` in each of the glfw demo folders should work out of the box for most platforms. +Optionally make file can help. -For macOS / iOS the MoltenVK.framework needs to be installed in the /Library/Frameworks folder for the build to find it. It can be downloaded as part of he Vulkan SDK: https://vulkan.lunarg.com/sdk/home +For macOS / iOS the [MoltenVK](https://github.com/KhronosGroup/MoltenVK) dylib needs to be installed. +On macOS you can use [Homebrew](https://docs.brew.sh/Installation) and install `molten-vk` package like `brew install molten-vk`. ### Manual configuration -For **OS X / macOS** you'll need to install the latest GLFW 3.3 from master https://github.com/glfw/glfw +For **OS X / macOS** you'll need to install. the latest GLFW 3.3 from master https://github.com/glfw/glfw and prepare MoltenVK https://moltengl.com/moltenvk/ SDK beforehand so CMake could find it. There is a Makefile https://github.com/vulkan-go/demos/blob/master/vulkancube/vulkancube_desktop/Makefile to show how to properly invoke `go install` specifying the path to GLFW. -For **Windows** you don't need to compile MoltenVK and can use GLFW 3.2.1 distro from the site http://www.glfw.org then just specify paths in Makefile or run commands by hand, specifying paths to GLFW distro folders. - Make sure your graphics card and driver are supported: - https://developer.nvidia.com/vulkan-driver @@ -39,6 +41,21 @@ In all cases you will run `XXX_desktop` demos. ## How to run on Android +Prerequisites are +- installed [Android SDK](https://developer.android.com/studio/releases/platform-tools) +- installed [Android NDK](https://developer.android.com/ndk/downloads) +- installed application "make" +- set system variable [ANDROID_HOME](https://developer.android.com/studio/command-line/variables) +- set system variable [NDK](https://developer.android.com/ndk/guides/other_build_systems) +- set system variable [HOST_TAG](https://developer.android.com/ndk/guides/other_build_systems) + +Recommended: +- installed [Android Studio](https://developer.android.com/studio) +- [validation layers binaries](https://github.com/KhronosGroup/Vulkan-ValidationLayers/releases) + +In the "android" folder is "make" file which run as `make all` will clean, build and make application APK file in ./android/app/build/outputs/apk/debug. +Using Android Studio is very easy to deploy APK file into physical device or emulator. + Refer to [xlab/android-go/examples/minimal](https://github.com/xlab/android-go/tree/master/examples/minimal) ## License diff --git a/vulkandraw/vulkandraw.go b/vulkandraw/vulkandraw.go index 9fe1e42..d889fdf 100644 --- a/vulkandraw/vulkandraw.go +++ b/vulkandraw/vulkandraw.go @@ -132,8 +132,7 @@ func VulkanInit(v *VulkanDeviceInfo, s *VulkanSwapchainInfo, check(ret, "vk.CreateSemaphore") } -func VulkanDrawFrame(v VulkanDeviceInfo, - s VulkanSwapchainInfo, r VulkanRenderInfo) bool { +func DrawFrame(v VulkanDeviceInfo, s VulkanSwapchainInfo, r VulkanRenderInfo) bool { var nextIdx uint32 // Phase 1: vk.AcquireNextImage @@ -158,6 +157,9 @@ func VulkanDrawFrame(v VulkanDeviceInfo, SType: vk.StructureTypeSubmitInfo, WaitSemaphoreCount: 1, PWaitSemaphores: r.semaphores, + PWaitDstStageMask: []vk.PipelineStageFlags{ + vk.PipelineStageFlags(vk.PipelineStageColorAttachmentOutputBit), + }, CommandBufferCount: 1, PCommandBuffers: r.cmdBuffers[nextIdx:], }} @@ -218,8 +220,8 @@ func CreateRenderer(device vk.Device, displayFormat vk.Format) (VulkanRenderInfo StoreOp: vk.AttachmentStoreOpStore, StencilLoadOp: vk.AttachmentLoadOpDontCare, StencilStoreOp: vk.AttachmentStoreOpDontCare, - InitialLayout: vk.ImageLayoutColorAttachmentOptimal, - FinalLayout: vk.ImageLayoutColorAttachmentOptimal, + InitialLayout: vk.ImageLayoutUndefined, + FinalLayout: vk.ImageLayoutPresentSrc, }} colorAttachments := []vk.AttachmentReference{{ Attachment: 0, @@ -257,30 +259,21 @@ func CreateRenderer(device vk.Device, displayFormat vk.Format) (VulkanRenderInfo return r, nil } -func NewVulkanDevice(appInfo *vk.ApplicationInfo, window uintptr, instanceExtensions []string, createSurfaceFunc func(interface{}) uintptr) (VulkanDeviceInfo, error) { +func NewVulkanDevice(appInfo *vk.ApplicationInfo, instanceExtensions []string, createSurfaceFunc func(vk.Instance) vk.Surface) (VulkanDeviceInfo, error) { // Phase 1: vk.CreateInstance with vk.InstanceCreateInfo existingExtensions := getInstanceExtensions() log.Println("[INFO] Instance extensions:", existingExtensions) - // instanceExtensions := vk.GetRequiredInstanceExtensions() + //TODO deprecated extension, use VK_EXT_debug_utils instead - https://developer.android.com/ndk/guides/graphics/validation-layer if enableDebug { - instanceExtensions = append(instanceExtensions, - "VK_EXT_debug_report\x00") + instanceExtensions = append(instanceExtensions, "VK_EXT_debug_report\x00") } - // ANDROID: - // these layers must be included in APK, - // see Android.mk and ValidationLayers.mk - instanceLayers := []string{ - // "VK_LAYER_GOOGLE_threading\x00", - // "VK_LAYER_LUNARG_parameter_validation\x00", - // "VK_LAYER_LUNARG_object_tracker\x00", - // "VK_LAYER_LUNARG_core_validation\x00", - // "VK_LAYER_LUNARG_api_dump\x00", - // "VK_LAYER_LUNARG_image\x00", - // "VK_LAYER_LUNARG_swapchain\x00", - // "VK_LAYER_GOOGLE_unique_objects\x00", + // ANDROID: these layers must be included in APK + var instanceLayers []string + if enableDebug { + instanceLayers = append(instanceLayers, "VK_LAYER_KHRONOS_validation\x00") } instanceCreateInfo := vk.InstanceCreateInfo{ @@ -302,13 +295,8 @@ func NewVulkanDevice(appInfo *vk.ApplicationInfo, window uintptr, instanceExtens // Phase 2: vk.CreateAndroidSurface with vk.AndroidSurfaceCreateInfo - v.Surface = vk.SurfaceFromPointer(createSurfaceFunc(v.Instance)) - // err = vk.Error(vk.CreateWindowSurface(v.Instance, window, nil, &v.Surface)) - if err != nil { - vk.DestroyInstance(v.Instance, nil) - err = fmt.Errorf("vkCreateWindowSurface failed with %s", err) - return v, err - } + v.Surface = createSurfaceFunc(v.Instance) + if v.gpuDevices, err = getPhysicalDevices(v.Instance); err != nil { v.gpuDevices = nil vk.DestroySurface(v.Instance, v.Surface, nil) @@ -321,19 +309,8 @@ func NewVulkanDevice(appInfo *vk.ApplicationInfo, window uintptr, instanceExtens // Phase 3: vk.CreateDevice with vk.DeviceCreateInfo (a logical device) - // ANDROID: - // these layers must be included in APK, - // see Android.mk and ValidationLayers.mk - deviceLayers := []string{ - // "VK_LAYER_GOOGLE_threading\x00", - // "VK_LAYER_LUNARG_parameter_validation\x00", - // "VK_LAYER_LUNARG_object_tracker\x00", - // "VK_LAYER_LUNARG_core_validation\x00", - // "VK_LAYER_LUNARG_api_dump\x00", - // "VK_LAYER_LUNARG_image\x00", - // "VK_LAYER_LUNARG_swapchain\x00", - // "VK_LAYER_GOOGLE_unique_objects\x00", - } + //TODO Device layers are deprecated + //deviceLayers := []string{} queueCreateInfos := []vk.DeviceQueueCreateInfo{{ SType: vk.StructureTypeDeviceQueueCreateInfo, @@ -349,8 +326,8 @@ func NewVulkanDevice(appInfo *vk.ApplicationInfo, window uintptr, instanceExtens PQueueCreateInfos: queueCreateInfos, EnabledExtensionCount: uint32(len(deviceExtensions)), PpEnabledExtensionNames: deviceExtensions, - EnabledLayerCount: uint32(len(deviceLayers)), - PpEnabledLayerNames: deviceLayers, + //EnabledLayerCount: uint32(len(deviceLayers)), + //PpEnabledLayerNames: deviceLayers, } var device vk.Device // we choose the first GPU available for this device err = vk.Error(vk.CreateDevice(v.gpuDevices[0], &deviceCreateInfo, nil, &device)) @@ -511,6 +488,7 @@ func (v *VulkanDeviceInfo) CreateSwapchain() (VulkanSwapchainInfo, error) { PresentMode: vk.PresentModeFifo, OldSwapchain: vk.NullSwapchain, Clipped: vk.False, + CompositeAlpha: vk.CompositeAlphaInheritBit, } s.Swapchains = make([]vk.Swapchain, 1) err = vk.Error(vk.CreateSwapchain(v.Device, &swapchainCreateInfo, nil, &(s.Swapchains[0]))) @@ -585,7 +563,7 @@ func (s *VulkanSwapchainInfo) CreateFramebuffers(renderPass vk.RenderPass, depth SType: vk.StructureTypeFramebufferCreateInfo, RenderPass: renderPass, Layers: 1, - AttachmentCount: 1, // 2 if has depthView + AttachmentCount: 1, // 2 if it has depthView PAttachments: attachments, Width: s.DisplaySize.Width, Height: s.DisplaySize.Height, @@ -823,7 +801,7 @@ func CreateGraphicsPipeline(device vk.Device, inputAssemblyState := vk.PipelineInputAssemblyStateCreateInfo{ SType: vk.StructureTypePipelineInputAssemblyStateCreateInfo, Topology: vk.PrimitiveTopologyTriangleList, - PrimitiveRestartEnable: vk.True, + PrimitiveRestartEnable: vk.False, } vertexInputBindings := []vk.VertexInputBindingDescription{{ Binding: 0, diff --git a/vulkandraw/vulkandraw_android/.gitignore b/vulkandraw/vulkandraw_android/.gitignore deleted file mode 100644 index e01d8fd..0000000 --- a/vulkandraw/vulkandraw_android/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -.DS_Store -android/bin/ -android/build.xml -android/jni/lib/ -android/libs/ -android/local.properties -android/obj/ -android/proguard-project.txt -android/project.properties -toolchain/ diff --git a/vulkandraw/vulkandraw_android/Makefile b/vulkandraw/vulkandraw_android/Makefile index 8b76c5b..5be1b7c 100644 --- a/vulkandraw/vulkandraw_android/Makefile +++ b/vulkandraw/vulkandraw_android/Makefile @@ -1,26 +1,48 @@ -OS=linux -ANDROID_API ?= 23 -ANDROID_TOOLCHAIN_DIR ?= $(ANDROID_NDK_HOME)/toolchains/llvm/prebuilt/$(OS)-x86_64/bin +HOST_TAG ?= linux-x86_64 +API_LEVEL ?= 26 +TOOLCHAIN ?= $(NDK)/toolchains/llvm/prebuilt/$(HOST_TAG)/bin -all: build apk +all: clean build apk + echo "WORK DONE" -build: - mkdir -p android/jni/lib - CC="$(ANDROID_TOOLCHAIN_DIR)/aarch64-linux-android$(ANDROID_API)-clang" \ - CXX="$(ANDROID_TOOLCHAIN_DIR)/aarch64-linux-android$(ANDROID_API)-clang++" \ +build: build32 build64 build-amd64 + echo "builded all" + +build32: + echo "compile for old phones with arm (32bit)" + CC="$(TOOLCHAIN)/armv7a-linux-androideabi$(API_LEVEL)-clang" \ + CXX="$(TOOLCHAIN)/armv7a-linux-androideabi$(API_LEVEL)-clang++" \ + GOOS=android \ + GOARCH=arm \ + CGO_ENABLED=1 \ + go build -buildmode=c-shared -o android/app/src/main/jniLibs/armeabi-v7a/libvulkandraw.so + +build64: + echo "compile for arm64 (64bit)" + CC="$(TOOLCHAIN)/aarch64-linux-android$(API_LEVEL)-clang" \ + CXX="$(TOOLCHAIN)/aarch64-linux-android$(API_LEVEL)-clang++" \ GOOS=android \ GOARCH=arm64 \ CGO_ENABLED=1 \ - go build -buildmode=c-shared -o android/jni/lib/libvulkandraw.so - -apk: - cd android && make + go build -buildmode=c-shared -o android/app/src/main/jniLibs/arm64-v8a/libvulkandraw.so + +build-amd64: + echo "compile for emulator" + CC="$(TOOLCHAIN)/x86_64-linux-android$(API_LEVEL)-clang" \ + CXX="$(TOOLCHAIN)/x86_64-linux-android$(API_LEVEL)-clang++" \ + GOOS=android \ + GOARCH=amd64 \ + CGO_ENABLED=1 \ + go build -buildmode=c-shared -o android/app/src/main/jniLibs/x86_64/libvulkandraw.so clean: - cd android && make clean + echo "delete generated files" + rm -rf android/app/build + rm -rf android/app/build-native -install: - cd android && make install +apk: + echo "run gradle" + cd android; ./gradlew -q clean assembleDebug > /dev/null 2>&1 listen: adb logcat -c diff --git a/vulkandraw/vulkandraw_android/android/.gitattributes b/vulkandraw/vulkandraw_android/android/.gitattributes new file mode 100644 index 0000000..61793db --- /dev/null +++ b/vulkandraw/vulkandraw_android/android/.gitattributes @@ -0,0 +1,6 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# These are explicitly windows files and should use crlf +*.bat text eol=crlf + diff --git a/vulkandraw/vulkandraw_android/android/.gitignore b/vulkandraw/vulkandraw_android/android/.gitignore new file mode 100644 index 0000000..6f67361 --- /dev/null +++ b/vulkandraw/vulkandraw_android/android/.gitignore @@ -0,0 +1,7 @@ +# Ignore Gradle project-specific cache directory +.gradle + +# Ignore Gradle build output directory +build +build-native +local.properties diff --git a/vulkandraw/vulkandraw_android/android/AndroidManifest.xml b/vulkandraw/vulkandraw_android/android/AndroidManifest.xml deleted file mode 100644 index 81dd8d8..0000000 --- a/vulkandraw/vulkandraw_android/android/AndroidManifest.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/vulkandraw/vulkandraw_android/android/Makefile b/vulkandraw/vulkandraw_android/android/Makefile deleted file mode 100644 index accf698..0000000 --- a/vulkandraw/vulkandraw_android/android/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -all: project build - -build: - ant debug - -install: - ant debug install - -project: - # command "android-project" require installation: - # go get github.com/xlab/treeprint - # go get github.com/jawher/mow.cli - # go install github.com/xlab/android-go/cmd/android-project - - android-project update --target android-23 --name VulkanDraw --path . - -project-n: - android-project update --target android-N --name VulkanDraw --path . - -clean: - rm -rf libs obj bin gen jni/lib - rm -f proguard-project.txt project.properties - rm -f local.properties build.xml diff --git a/vulkandraw/vulkandraw_android/android/app/CMakeLists.txt b/vulkandraw/vulkandraw_android/android/app/CMakeLists.txt new file mode 100644 index 0000000..15dafc9 --- /dev/null +++ b/vulkandraw/vulkandraw_android/android/app/CMakeLists.txt @@ -0,0 +1,13 @@ + +# Mention the cmake version name. +cmake_minimum_required(VERSION 3.4.1) + +project( VulkanDraw ) + +# Application +add_library(vulkandraw SHARED IMPORTED) + +set_target_properties( vulkandraw + PROPERTIES IMPORTED_LOCATION + ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libvulkandraw.so +) diff --git a/vulkandraw/vulkandraw_android/android/app/build.gradle b/vulkandraw/vulkandraw_android/android/app/build.gradle new file mode 100644 index 0000000..a074751 --- /dev/null +++ b/vulkandraw/vulkandraw_android/android/app/build.gradle @@ -0,0 +1,57 @@ +plugins { + id 'com.android.application' +} + +android { + namespace 'org.golang.android.vulkan.draw' + compileSdk 26 + buildToolsVersion '33.0.0' + ndkVersion '25.1.8937393' + + defaultConfig { + applicationId "org.golang.android.vulkan.draw" + minSdk 26 + //noinspection ExpiredTargetSdkVersion + targetSdk 26 + versionCode 1 + versionName "1.0" + + externalNativeBuild { + cmake { + abiFilters.addAll('armeabi-v7a', 'arm64-v8a', 'x86_64') + } + } + } + + buildTypes { + debug { + debuggable true + jniDebuggable true + minifyEnabled false + } + + release { + debuggable false + jniDebuggable false + minifyEnabled false + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + sourceSets { + main.assets.srcDirs = ['assets'] + main { + res.srcDirs += [ '../../../app/android/res' ] + } + } + externalNativeBuild { + cmake { + path 'CMakeLists.txt' + buildStagingDirectory 'build-native' + } + } +} diff --git a/vulkandraw/vulkandraw_android/android/app/src/main/AndroidManifest.xml b/vulkandraw/vulkandraw_android/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..d09fb03 --- /dev/null +++ b/vulkandraw/vulkandraw_android/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + diff --git a/vulkandraw/vulkandraw_android/android/app/src/main/res/drawable-hdpi/icon.png b/vulkandraw/vulkandraw_android/android/app/src/main/res/drawable-hdpi/icon.png new file mode 100644 index 0000000..bd90f0a Binary files /dev/null and b/vulkandraw/vulkandraw_android/android/app/src/main/res/drawable-hdpi/icon.png differ diff --git a/vulkandraw/vulkandraw_android/android/app/src/main/res/drawable-mdpi/icon.png b/vulkandraw/vulkandraw_android/android/app/src/main/res/drawable-mdpi/icon.png new file mode 100644 index 0000000..e3ce50a Binary files /dev/null and b/vulkandraw/vulkandraw_android/android/app/src/main/res/drawable-mdpi/icon.png differ diff --git a/vulkandraw/vulkandraw_android/android/app/src/main/res/drawable-xhdpi/icon.png b/vulkandraw/vulkandraw_android/android/app/src/main/res/drawable-xhdpi/icon.png new file mode 100644 index 0000000..d73e1c3 Binary files /dev/null and b/vulkandraw/vulkandraw_android/android/app/src/main/res/drawable-xhdpi/icon.png differ diff --git a/vulkandraw/vulkandraw_android/android/app/src/main/res/drawable-xxhdpi/icon.png b/vulkandraw/vulkandraw_android/android/app/src/main/res/drawable-xxhdpi/icon.png new file mode 100644 index 0000000..3dbd600 Binary files /dev/null and b/vulkandraw/vulkandraw_android/android/app/src/main/res/drawable-xxhdpi/icon.png differ diff --git a/vulkandraw/vulkandraw_android/android/app/src/main/res/values/strings.xml b/vulkandraw/vulkandraw_android/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..5bede67 --- /dev/null +++ b/vulkandraw/vulkandraw_android/android/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + + Vulkan Draw + diff --git a/vulkandraw/vulkandraw_android/android/build.gradle b/vulkandraw/vulkandraw_android/android/build.gradle new file mode 100644 index 0000000..596498c --- /dev/null +++ b/vulkandraw/vulkandraw_android/android/build.gradle @@ -0,0 +1,5 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +plugins { + id 'com.android.application' version '7.3.1' apply false + id 'com.android.library' version '7.3.1' apply false +} diff --git a/vulkandraw/vulkandraw_android/android/gradle.properties b/vulkandraw/vulkandraw_android/android/gradle.properties new file mode 100644 index 0000000..c68b058 --- /dev/null +++ b/vulkandraw/vulkandraw_android/android/gradle.properties @@ -0,0 +1,4 @@ +android.useAndroidX=true +android.enableJetifier=true +org.gradle.parallel=true +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 diff --git a/vulkandraw/vulkandraw_android/android/gradle/wrapper/gradle-wrapper.jar b/vulkandraw/vulkandraw_android/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..41d9927 Binary files /dev/null and b/vulkandraw/vulkandraw_android/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/vulkandraw/vulkandraw_android/android/gradle/wrapper/gradle-wrapper.properties b/vulkandraw/vulkandraw_android/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..41dfb87 --- /dev/null +++ b/vulkandraw/vulkandraw_android/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/vulkandraw/vulkandraw_android/android/gradlew b/vulkandraw/vulkandraw_android/android/gradlew new file mode 100644 index 0000000..1b6c787 --- /dev/null +++ b/vulkandraw/vulkandraw_android/android/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/vulkandraw/vulkandraw_android/android/gradlew.bat b/vulkandraw/vulkandraw_android/android/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/vulkandraw/vulkandraw_android/android/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/vulkandraw/vulkandraw_android/android/jni/Android.mk b/vulkandraw/vulkandraw_android/android/jni/Android.mk deleted file mode 100644 index 63ea646..0000000 --- a/vulkandraw/vulkandraw_android/android/jni/Android.mk +++ /dev/null @@ -1,15 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_MODULE := vulkandraw -LOCAL_SRC_FILES := lib/libvulkandraw.so -LOCAL_LDLIBS := -llog -landroid - -include $(PREBUILT_SHARED_LIBRARY) - -# Enable Vulkan validation layers, you can obtain them at -# https://github.com/LunarG/VulkanTools -# mirror: https://github.com/vulkan-go/VulkanTools - -# include $(LOCAL_PATH)/ValidationLayers.mk diff --git a/vulkandraw/vulkandraw_android/android/jni/Application.mk b/vulkandraw/vulkandraw_android/android/jni/Application.mk deleted file mode 100644 index 5598db3..0000000 --- a/vulkandraw/vulkandraw_android/android/jni/Application.mk +++ /dev/null @@ -1,2 +0,0 @@ -APP_PLATFORM := android-23 -APP_ABI := arm64-v8a diff --git a/vulkandraw/vulkandraw_android/android/jni/ValidationLayers.mk b/vulkandraw/vulkandraw_android/android/jni/ValidationLayers.mk deleted file mode 100644 index a3c370e..0000000 --- a/vulkandraw/vulkandraw_android/android/jni/ValidationLayers.mk +++ /dev/null @@ -1,64 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_MODULE := VK_LAYER_LUNARG_api_dump -LOCAL_SRC_FILES := lib/libVkLayer_api_dump.so - -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) - -LOCAL_MODULE := VK_LAYER_LUNARG_core_validation -LOCAL_SRC_FILES := lib/libVkLayer_core_validation.so - -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) - -LOCAL_MODULE := VK_LAYER_LUNARG_image -LOCAL_SRC_FILES := lib/libVkLayer_image.so - -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) - -LOCAL_MODULE := VK_LAYER_LUNARG_object_tracker -LOCAL_SRC_FILES := lib/libVkLayer_object_tracker.so - -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) - -LOCAL_MODULE := VK_LAYER_LUNARG_parameter_validation -LOCAL_SRC_FILES := lib/libVkLayer_parameter_validation.so - -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) - -LOCAL_MODULE := VK_LAYER_LUNARG_screenshot -LOCAL_SRC_FILES := lib/libVkLayer_screenshot.so - -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) - -LOCAL_MODULE := VK_LAYER_LUNARG_swapchain -LOCAL_SRC_FILES := lib/libVkLayer_swapchain.so - -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) - -LOCAL_MODULE := VK_LAYER_GOOGLE_threading -LOCAL_SRC_FILES := lib/libVkLayer_threading.so - -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) - -LOCAL_MODULE := VK_LAYER_GOOGLE_unique_objects -LOCAL_SRC_FILES := lib/libVkLayer_unique_objects.so - -include $(PREBUILT_SHARED_LIBRARY) diff --git a/vulkandraw/vulkandraw_android/android/settings.gradle b/vulkandraw/vulkandraw_android/android/settings.gradle new file mode 100644 index 0000000..c3182f1 --- /dev/null +++ b/vulkandraw/vulkandraw_android/android/settings.gradle @@ -0,0 +1,16 @@ +pluginManagement { + repositories { + gradlePluginPortal() + google() + mavenCentral() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} +rootProject.name = 'VulkanDraw' +include('app') diff --git a/vulkandraw/vulkandraw_android/main.go b/vulkandraw/vulkandraw_android/main.go index bc2ffaa..ceef620 100644 --- a/vulkandraw/vulkandraw_android/main.go +++ b/vulkandraw/vulkandraw_android/main.go @@ -1,13 +1,16 @@ +//go:build android +// +build android + package main import ( "log" - "vulkandraw" vk "github.com/vulkan-go/vulkan" "github.com/xlab/android-go/android" "github.com/xlab/android-go/app" "github.com/xlab/catcher" + "github.com/vulkan-go/demos/vulkandraw" ) func init() { @@ -16,10 +19,10 @@ func init() { var appInfo = &vk.ApplicationInfo{ SType: vk.StructureTypeApplicationInfo, - ApiVersion: vk.MakeVersion(1, 0, 0), ApplicationVersion: vk.MakeVersion(1, 0, 0), PApplicationName: "VulkanDraw\x00", PEngineName: "vulkango.com\x00", + ApiVersion: vk.ApiVersion10, } func main() { @@ -34,13 +37,12 @@ func main() { catcher.RecvDie(-1), ) var ( - v vulkandraw.VulkanDeviceInfo - s vulkandraw.VulkanSwapchainInfo - r vulkandraw.VulkanRenderInfo - b vulkandraw.VulkanBufferInfo - gfx vulkandraw.VulkanGfxPipelineInfo - - vkActive bool + v vulkandraw.VulkanDeviceInfo + s vulkandraw.VulkanSwapchainInfo + r vulkandraw.VulkanRenderInfo + b vulkandraw.VulkanBufferInfo + gfx vulkandraw.VulkanGfxPipelineInfo + vkActive = false ) a.HandleNativeWindowEvents(nativeWindowEvents) @@ -65,9 +67,27 @@ func main() { case event := <-nativeWindowEvents: switch event.Kind { case app.NativeWindowCreated: - err := vk.Init() + err := vk.SetDefaultGetInstanceProcAddr() + orPanic(err) + err = vk.Init() orPanic(err) - v, err = vulkandraw.NewVulkanDevice(appInfo, event.Window.Ptr()) + + // differs between Android, iOS and GLFW + createSurface := func(instance vk.Instance) vk.Surface { + var surface vk.Surface + result := vk.CreateWindowSurface(instance, event.Window.Ptr(), nil, &surface) + if result == vk.Success { + //fmt.Println("CreateWindowSurface - Success") + } + if err := vk.Error(result); err != nil { + vk.DestroyInstance(instance, nil) + //fmt.Printf("vkCreateWindowSurface failed with %s\n", err) + panic(err) + } + return surface + } + + v, err = vulkandraw.NewVulkanDevice(appInfo, vk.GetRequiredInstanceExtensions(), createSurface) orPanic(err) s, err = v.CreateSwapchain() orPanic(err) @@ -91,7 +111,7 @@ func main() { vulkandraw.DestroyInOrder(&v, &s, &r, &b, &gfx) case app.NativeWindowRedrawNeeded: if vkActive { - vulkandraw.VulkanDrawFrame(v, s, r) + vulkandraw.DrawFrame(v, s, r) } a.NativeWindowRedrawDone() } diff --git a/vulkandraw/vulkandraw_glfw/Makefile b/vulkandraw/vulkandraw_glfw/Makefile index c6f851c..85bc3be 100644 --- a/vulkandraw/vulkandraw_glfw/Makefile +++ b/vulkandraw/vulkandraw_glfw/Makefile @@ -1,14 +1,28 @@ -GLFW_INCLUDE_DIR = "?" -GLFW_LIB_DIR = "?" -install: - CGO_CFLAGS="-I$(GLFW_INCLUDE_DIR)" CGO_LDFLAGS="-L$(GLFW_LIB_DIR)" go install +all: windows linux darwin darwin-arm -install-pkg: - CGO_CFLAGS="$(shell pkg-config --cflags glfw3)" CGO_LDFLAGS="$(shell pkg-config --libs glfw3)" go install +windows: + GOOS=windows \ + GOARCH=amd64 \ + CGO_ENABLED=1 \ + go build -ldflags="-H windowsgui" -build: - CGO_CFLAGS="-I$(GLFW_INCLUDE_DIR)" CGO_LDFLAGS="-L$(GLFW_LIB_DIR)" go build +linux: + GOOS=linux \ + GOARCH=amd64 \ + CGO_ENABLED=1 \ + go build -build-pkg: - CGO_CFLAGS="$(shell pkg-config --cflags glfw3)" CGO_LDFLAGS="$(shell pkg-config --libs glfw3)" go build +darwin: + GOOS=darwin \ + GOARCH=amd64 \ + CGO_ENABLED=1 \ + CGO_LDFLAGS="-L/usr/local/lib" \ + go build + +darwin-arm: + GOOS=darwin \ + GOARCH=arm64 \ + CGO_ENABLED=1 \ + CGO_LDFLAGS="-L/opt/homebrew/lib" \ + go build diff --git a/vulkandraw/vulkandraw_glfw/main.go b/vulkandraw/vulkandraw_glfw/main.go index 4eba16c..f1ffa3f 100644 --- a/vulkandraw/vulkandraw_glfw/main.go +++ b/vulkandraw/vulkandraw_glfw/main.go @@ -5,18 +5,18 @@ import ( "runtime" "time" - "github.com/vulkan-go/demos/vulkandraw" "github.com/go-gl/glfw/v3.3/glfw" + "github.com/vulkan-go/demos/vulkandraw" vk "github.com/vulkan-go/vulkan" "github.com/xlab/closer" ) var appInfo = &vk.ApplicationInfo{ SType: vk.StructureTypeApplicationInfo, - ApiVersion: vk.MakeVersion(1, 0, 0), ApplicationVersion: vk.MakeVersion(1, 0, 0), PApplicationName: "VulkanDraw\x00", PEngineName: "vulkango.com\x00", + ApiVersion: vk.ApiVersion10, } func init() { @@ -44,17 +44,17 @@ func main() { glfw.WindowHint(glfw.ClientAPI, glfw.NoAPI) glfw.WindowHint(glfw.Resizable, glfw.False) - window, err := glfw.CreateWindow(640, 480, "Vulkan Info", nil, nil) + window, err := glfw.CreateWindow(640, 480, "Vulkan Draw", nil, nil) orPanic(err) - createSurface := func(instance interface{}) uintptr { + // differs between Android, iOS and GLFW + createSurface := func(instance vk.Instance) vk.Surface { surface, err := window.CreateWindowSurface(instance, nil) orPanic(err) - return surface + return vk.SurfaceFromPointer(surface) } v, err = vulkandraw.NewVulkanDevice(appInfo, - uintptr(window.Handle()), window.GetRequiredInstanceExtensions(), createSurface) orPanic(err) @@ -98,7 +98,7 @@ func main() { } glfw.PollEvents() if window.GetAttrib(glfw.Iconified) != 1 { - vulkandraw.VulkanDrawFrame(v, s, r) + vulkandraw.DrawFrame(v, s, r) } } } diff --git a/vulkandraw/vulkandraw_ios/main.go b/vulkandraw/vulkandraw_ios/main.go index f41b196..e4a26e6 100644 --- a/vulkandraw/vulkandraw_ios/main.go +++ b/vulkandraw/vulkandraw_ios/main.go @@ -11,10 +11,10 @@ import ( var appInfo = &vk.ApplicationInfo{ SType: vk.StructureTypeApplicationInfo, - ApiVersion: vk.MakeVersion(1, 0, 0), ApplicationVersion: vk.MakeVersion(1, 0, 0), PApplicationName: "VulkanDraw\x00", PEngineName: "vulkango.com\x00", + ApiVersion: vk.ApiVersion10, } func main() { @@ -24,13 +24,12 @@ func main() { catcher.RecvDie(-1), ) var ( - v vulkandraw.VulkanDeviceInfo - s vulkandraw.VulkanSwapchainInfo - r vulkandraw.VulkanRenderInfo - b vulkandraw.VulkanBufferInfo - gfx vulkandraw.VulkanGfxPipelineInfo - - vkActive bool + v vulkandraw.VulkanDeviceInfo + s vulkandraw.VulkanSwapchainInfo + r vulkandraw.VulkanRenderInfo + b vulkandraw.VulkanBufferInfo + gfx vulkandraw.VulkanGfxPipelineInfo + vkActive = false ) a.InitDone() @@ -39,9 +38,27 @@ func main() { case event := <-a.LifecycleEvents(): switch event.Kind { case app.ViewDidLoad: - err := vk.Init() + err := vk.SetDefaultGetInstanceProcAddr() + orPanic(err) + err = vk.Init() orPanic(err) - v, err = vulkandraw.NewVulkanDevice(appInfo, event.View) + + // differs between Android, iOS and GLFW + createSurface := func(instance vk.Instance) vk.Surface { + var surface vk.Surface + result := vk.CreateWindowSurface(instance, event.View, nil, &surface) + if result == vk.Success { + //fmt.Println("CreateWindowSurface - Success") + } + if err := vk.Error(result); err != nil { + vk.DestroyInstance(instance, nil) + //fmt.Printf("vkCreateWindowSurface failed with %s\n", err) + panic(err) + } + return surface + } + + v, err = vulkandraw.NewVulkanDevice(appInfo, vk.GetRequiredInstanceExtensions(), createSurface) orPanic(err) s, err = v.CreateSwapchain() orPanic(err) @@ -68,7 +85,7 @@ func main() { } case <-a.VSync(): if vkActive { - vulkandraw.VulkanDrawFrame(v, s, r) + vulkandraw.DrawFrame(v, s, r) } } } diff --git a/vulkaninfo/vulkaninfo_android/android/app/build.gradle b/vulkaninfo/vulkaninfo_android/android/app/build.gradle index 709a8af..249bb30 100644 --- a/vulkaninfo/vulkaninfo_android/android/app/build.gradle +++ b/vulkaninfo/vulkaninfo_android/android/app/build.gradle @@ -11,6 +11,7 @@ android { defaultConfig { applicationId "org.golang.android.vulkan.info" minSdk 26 + //noinspection ExpiredTargetSdkVersion targetSdk 26 versionCode 1 versionName "1.0" diff --git a/vulkaninfo/vulkaninfo_android/main.go b/vulkaninfo/vulkaninfo_android/main.go index 8611034..3ca1152 100644 --- a/vulkaninfo/vulkaninfo_android/main.go +++ b/vulkaninfo/vulkaninfo_android/main.go @@ -13,10 +13,10 @@ func init() { var appInfo = &vk.ApplicationInfo{ SType: vk.StructureTypeApplicationInfo, - ApiVersion: vk.MakeVersion(1, 0, 0), ApplicationVersion: vk.MakeVersion(1, 0, 0), PApplicationName: "VulkanInfo\x00", PEngineName: "vulkango.com\x00", + ApiVersion: vk.ApiVersion10, } func main() {