From be035bf2683837c30c56b2a0e78a0c86b2d3ebc8 Mon Sep 17 00:00:00 2001 From: robotchaoX <43107451+robotchaoX@users.noreply.github.com> Date: Fri, 3 Nov 2023 01:46:13 +0800 Subject: [PATCH] Add example variablerateshading for Android (#1084) [Why] Example variablerateshading was not compiled for Android. [How] Generate Android version example variablerateshading from android/examples/_template. --- .../variablerateshading/CMakeLists.txt | 35 ++++++++++ .../examples/variablerateshading/build.gradle | 65 +++++++++++++++++++ .../src/main/AndroidManifest.xml | 24 +++++++ .../vulkanSample/VulkanActivity.java | 58 +++++++++++++++++ 4 files changed, 182 insertions(+) create mode 100644 android/examples/variablerateshading/CMakeLists.txt create mode 100644 android/examples/variablerateshading/build.gradle create mode 100644 android/examples/variablerateshading/src/main/AndroidManifest.xml create mode 100644 android/examples/variablerateshading/src/main/java/de/saschawillems/vulkanSample/VulkanActivity.java diff --git a/android/examples/variablerateshading/CMakeLists.txt b/android/examples/variablerateshading/CMakeLists.txt new file mode 100644 index 000000000..3960661dd --- /dev/null +++ b/android/examples/variablerateshading/CMakeLists.txt @@ -0,0 +1,35 @@ +cmake_minimum_required(VERSION 3.4.1 FATAL_ERROR) + +set(NAME variablerateshading) + +set(SRC_DIR ../../../examples/${NAME}) +set(BASE_DIR ../../../base) +set(EXTERNAL_DIR ../../../external) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -DVK_USE_PLATFORM_ANDROID_KHR -DVK_NO_PROTOTYPES") + +file(GLOB EXAMPLE_SRC "${SRC_DIR}/*.cpp") + +add_library(native-lib SHARED ${EXAMPLE_SRC}) + +add_library(native-app-glue STATIC ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c) + +add_subdirectory(../base ${CMAKE_SOURCE_DIR}/../base) + +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -u ANativeActivity_onCreate") + +include_directories(${BASE_DIR}) +include_directories(${EXTERNAL_DIR}) +include_directories(${EXTERNAL_DIR}/glm) +include_directories(${EXTERNAL_DIR}/imgui) +include_directories(${EXTERNAL_DIR}/tinygltf) +include_directories(${ANDROID_NDK}/sources/android/native_app_glue) + +target_link_libraries( + native-lib + native-app-glue + libbase + android + log + z +) diff --git a/android/examples/variablerateshading/build.gradle b/android/examples/variablerateshading/build.gradle new file mode 100644 index 000000000..5422e6d69 --- /dev/null +++ b/android/examples/variablerateshading/build.gradle @@ -0,0 +1,65 @@ +apply plugin: 'com.android.application' +apply from: '../gradle/outputfilename.gradle' + +android { + compileSdkVersion rootProject.ext.compileSdkVersion + defaultConfig { + applicationId "de.saschawillems.vulkanVariablerateshading" + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode 1 + versionName "1.0" + ndk { + abiFilters rootProject.ext.abiFilters + } + externalNativeBuild { + cmake { + cppFlags "-std=c++14" + arguments "-DANDROID_STL=c++_shared", '-DANDROID_TOOLCHAIN=clang' + } + } + } + sourceSets { + main.assets.srcDirs = ['assets'] + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + externalNativeBuild { + cmake { + path "CMakeLists.txt" + } + } +} + +task copyTask { + copy { + from '../../common/res/drawable' + into "src/main/res/drawable" + include 'icon.png' + } + + copy { + from rootProject.ext.shaderPath + 'glsl/base' + into 'assets/shaders/glsl/base' + include '*.spv' + } + + copy { + from rootProject.ext.shaderPath + 'glsl/variablerateshading' + into 'assets/shaders/glsl/variablerateshading' + include '*.*' + } + + copy { + from rootProject.ext.assetPath + 'models/sponza' + into 'assets/models/sponza' + include '*.*' + } + +} + +preBuild.dependsOn copyTask diff --git a/android/examples/variablerateshading/src/main/AndroidManifest.xml b/android/examples/variablerateshading/src/main/AndroidManifest.xml new file mode 100644 index 000000000..aa90d20ff --- /dev/null +++ b/android/examples/variablerateshading/src/main/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + diff --git a/android/examples/variablerateshading/src/main/java/de/saschawillems/vulkanSample/VulkanActivity.java b/android/examples/variablerateshading/src/main/java/de/saschawillems/vulkanSample/VulkanActivity.java new file mode 100644 index 000000000..12e14fc6d --- /dev/null +++ b/android/examples/variablerateshading/src/main/java/de/saschawillems/vulkanSample/VulkanActivity.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2018 by Sascha Willems - www.saschawillems.de + * + * This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT) + */ +package de.saschawillems.vulkanSample; + +import android.app.AlertDialog; +import android.app.NativeActivity; +import android.content.DialogInterface; +import android.content.pm.ApplicationInfo; +import android.os.Bundle; + +import java.util.concurrent.Semaphore; + +public class VulkanActivity extends NativeActivity { + + static { + // Load native library + System.loadLibrary("native-lib"); + } + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + // Use a semaphore to create a modal dialog + + private final Semaphore semaphore = new Semaphore(0, true); + + public void showAlert(final String message) + { + final VulkanActivity activity = this; + + ApplicationInfo applicationInfo = activity.getApplicationInfo(); + final String applicationName = applicationInfo.nonLocalizedLabel.toString(); + + this.runOnUiThread(new Runnable() { + public void run() { + AlertDialog.Builder builder = new AlertDialog.Builder(activity, android.R.style.Theme_Material_Dialog_Alert); + builder.setTitle(applicationName); + builder.setMessage(message); + builder.setPositiveButton("Close", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + semaphore.release(); + } + }); + builder.setCancelable(false); + AlertDialog dialog = builder.create(); + dialog.show(); + } + }); + try { + semaphore.acquire(); + } + catch (InterruptedException e) { } + } +}