diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-06-15 21:38:05 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-06-15 21:38:05 +0000 |
commit | 09b502c77dbb2b0dc8903311afa3c62f2c8ac4f6 (patch) | |
tree | bdf409c89e96d95b1a90258eb449dfaf7c450239 | |
parent | cd57a729bb00686cc3901faf61a43f5e883d591d (diff) | |
parent | 0706e0aded758a72a088051fecabdd0412d1e454 (diff) | |
download | amber-aml_tz3_314012010.tar.gz |
Snap for 8730993 from 0706e0aded758a72a088051fecabdd0412d1e454 to mainline-tzdata3-releaseaml_tz3_314012070aml_tz3_314012050aml_tz3_314012010aml_tz3_313110000aml_tz3_312511020aml_tz3_312511010aml_tz3_312410020aml_tz3_312410010android12-mainline-tzdata3-releaseaml_tz3_314012010
Change-Id: I389fd025881f12c85a2da057ebc20f8f8e734e3a
85 files changed, 424 insertions, 3050 deletions
@@ -17,7 +17,6 @@ third_party/swiftshader third_party/vulkan-headers third_party/vulkan-loader third_party/vulkan-validationlayers/ -third_party/robin-hood-hashing .vs *.pyc @@ -26,5 +25,5 @@ third_party/robin-hood-hashing [._]*.s[a-w][a-z] # C-Lion -.idea/ -cmake-build-*/ +.idea +cmake-build-debug diff --git a/CMakeLists.txt b/CMakeLists.txt index c064649..9f65d5f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -202,6 +202,7 @@ endif() function(amber_default_compile_options TARGET) if (${COMPILER_IS_LIKE_GNU}) target_compile_options(${TARGET} PRIVATE + -std=c++11 -fno-exceptions -fvisibility=hidden -Wall @@ -229,6 +230,7 @@ function(amber_default_compile_options TARGET) endif() if (MSVC) + # Specify /EHs for exception handling. target_compile_options(${TARGET} PRIVATE /bigobj /EHsc @@ -264,6 +266,6 @@ endfunction() add_subdirectory(third_party) add_subdirectory(src) -if (${AMBER_ENABLE_SAMPLES}) +if (${AMBER_ENABLE_SAMPLES} AND NOT ANDROID) add_subdirectory(samples) endif() @@ -8,25 +8,23 @@ vars = { 'microsoft_git': 'https://github.com/Microsoft', 'nlohmann_git': 'https://github.com/nlohmann', 'swiftshader_git': 'https://swiftshader.googlesource.com', - 'martinus_git': 'https://github.com/martinus', - 'clspv_llvm_revision': 'b70366c9c430e1eadd59d5a1dfbb9c4d84f83de5', - 'clspv_revision': 'f99809bdab1710846633b4ec24f5448263e75da7', - 'cppdap_revision': '88e89520148b2f95e17ca9348587a28215ffc921', + 'clspv_llvm_revision': '7e30989dabce9ddbca0cbad7a8f25fb4e756d334', + 'clspv_revision': 'e0406e7053d1bb46b4bbeb57f0f2bbfca32f5612', + 'cppdap_revision': '1fd23dda91e01550be1a421de307e6fedb2035a9', 'cpplint_revision': '26470f9ccb354ff2f6d098f831271a1833701b28', - 'dxc_revision': 'c45db48d565a9edc14b025e43b90e62264d06eea', - 'glslang_revision': '81cc10a498b25a90147cccd6e8939493c1e9e20e', - 'googletest_revision': '16f637fbf4ffc3f7a01fa4eceb7906634565242f', - 'json_revision': '4f8fba14066156b73f1189a2b8bd568bde5284c5', - 'lodepng_revision': '5601b8272a6850b7c5d693dd0c0e16da50be8d8d', - 'shaderc_revision': 'e72186b66bb90ed06aaf15cbdc9a053581a0616b', - 'spirv_headers_revision': 'b42ba6d92faf6b4938e6f22ddd186dbdacc98d78', - 'spirv_tools_revision': 'a73e724359a274d7cf4f4248eba5be1e7764fbfd', - 'swiftshader_revision': 'bca23447ad4667a7b79973569ab5d8d905d211ac', - 'vulkan_headers_revision': '1dace16d8044758d32736eb59802d171970e9448', - 'vulkan_loader_revision': '8aad559a09388ceb5b968af64a2b965d3886e5a0', - 'vulkan_validationlayers_revision': 'a6c1ddca49331d8addde052554487180ee8aec13', - 'robin_hood_hashing_revision': '24b3f50f9532153edc23b29ae277dcccfd75a462', + 'dxc_revision': '489c2e4d32417cd6693db5673ab071d82e1f5974', + 'glslang_revision': '7f6559d2802d0653541060f0909e33d137b9c8ba', + 'googletest_revision': '0555b0eacbc56df1fd762c6aa87bb84be9e4ce7e', + 'json_revision': '350ff4f7ced7c4117eae2fb93df02823c8021fcb', + 'lodepng_revision': '7fdcc96a5e5864eee72911c3ca79b1d9f0d12292', + 'shaderc_revision': '88f9156d7f6a2a30baed1ace196faa3bc5eccc05', + 'spirv_headers_revision': '5ab5c96198f30804a6a29961b8905f292a8ae600', + 'spirv_tools_revision': '1f2fcddd3963b9c29bf360daf7656c5977c2aadd', + 'swiftshader_revision': '04515da400d5fbc22d852af1369c4d46bd54991e', + 'vulkan_headers_revision': '11c6670b4a4f766ed4f1e777d1b3c3dc082dfa5f', + 'vulkan_loader_revision': 'be6ccb9ecaf77dfef59246a1e8502e99c8e1a511', + 'vulkan_validationlayers_revision': '0cb8cc8cfcb2b86a767c9516ac2d62edb4e38ebe', } deps = { @@ -77,7 +75,4 @@ deps = { 'third_party/vulkan-loader': Var('khronos_git') + '/Vulkan-Loader.git@' + Var('vulkan_loader_revision'), - - 'third_party/robin-hood-hashing': Var('martinus_git') + '/robin-hood-hashing.git@' + - Var('robin_hood_hashing_revision'), } diff --git a/android_gradle/app/build.gradle b/android_gradle/app/build.gradle index b756f6b..40c4c54 100644 --- a/android_gradle/app/build.gradle +++ b/android_gradle/app/build.gradle @@ -1,49 +1,34 @@ -plugins { - id 'com.android.application' -} +apply plugin: 'com.android.application' android { - compileSdk 30 - buildToolsVersion "30.0.2" - ndkVersion "21.4.7075529" + compileSdkVersion 29 + buildToolsVersion "29.0.2" defaultConfig { applicationId "com.google.amber" minSdkVersion 24 - targetSdkVersion 30 + targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - - externalNativeBuild { - cmake { - arguments "-DAMBER_USE_LOCAL_VULKAN=1" - targets "amber_ndk" - } - } - } - - externalNativeBuild { - cmake { - path "../../CMakeLists.txt" - } } sourceSets { androidTest.manifest.srcFile "src/androidTest/AndroidManifest.xml" } + dependencies { + androidTestImplementation 'androidx.test:runner:1.1.0' + androidTestImplementation 'androidx.test:rules:1.1.0' + } + buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt') } } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } sourceSets { main { @@ -56,10 +41,9 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'androidx.appcompat:appcompat:1.3.1' - implementation 'com.google.android.material:material:1.4.0' - implementation 'androidx.constraintlayout:constraintlayout:2.1.1' - testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test.ext:junit:1.1.3' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' } diff --git a/android_gradle/app/src/androidTest/java/com/google/amber/AmberLauncher.java b/android_gradle/app/src/androidTest/java/com/google/amber/AmberLauncher.java index ad92154..4864843 100644 --- a/android_gradle/app/src/androidTest/java/com/google/amber/AmberLauncher.java +++ b/android_gradle/app/src/androidTest/java/com/google/amber/AmberLauncher.java @@ -54,7 +54,7 @@ public class AmberLauncher { String stdout_file = args.getString("stdout", new File(outputDir, "amber_stdout.txt").toString()); String stderr_file = args.getString("stderr", new File(outputDir, "amber_stderr.txt").toString()); - int res = Amber.androidHelper(args_list.toArray(new String[0]), stdout_file, stderr_file); + int res = Amber.androidMain(args_list.toArray(new String[0]), stdout_file, stderr_file); // If the process crashes during the above call or we call System.exit below, the output // from `adb shell am instrument ...` will be: diff --git a/android_gradle/app/src/main/AndroidManifest.xml b/android_gradle/app/src/main/AndroidManifest.xml index c74c390..0ab9856 100644 --- a/android_gradle/app/src/main/AndroidManifest.xml +++ b/android_gradle/app/src/main/AndroidManifest.xml @@ -4,7 +4,6 @@ <application android:allowBackup="true" - android:fullBackupOnly="true" android:label="Amber" android:supportsRtl="true"> <meta-data diff --git a/android_gradle/app/src/main/java/com/google/amber/Amber.java b/android_gradle/app/src/main/java/com/google/amber/Amber.java index 008c528..8319ccf 100644 --- a/android_gradle/app/src/main/java/com/google/amber/Amber.java +++ b/android_gradle/app/src/main/java/com/google/amber/Amber.java @@ -19,5 +19,5 @@ public class Amber { System.loadLibrary("amber_ndk"); } - public static native int androidHelper(String[] args, String stdout_file, String stderr_file); + public static native int androidMain(String[] args, String stdout_file, String stderr_file); } diff --git a/android_gradle/build.gradle b/android_gradle/build.gradle index d340082..82c93bf 100644 --- a/android_gradle/build.gradle +++ b/android_gradle/build.gradle @@ -4,16 +4,25 @@ buildscript { repositories { google() - mavenCentral() + jcenter() + maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' } } dependencies { - classpath 'com.android.tools.build:gradle:7.0.2' + classpath 'com.android.tools.build:gradle:4.0.0-alpha04' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } +allprojects { + repositories { + google() + jcenter() + maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' } + } +} + task clean(type: Delete) { delete rootProject.buildDir } diff --git a/android_gradle/gradle.properties b/android_gradle/gradle.properties index 4941ecd..199d16e 100644 --- a/android_gradle/gradle.properties +++ b/android_gradle/gradle.properties @@ -6,7 +6,7 @@ # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx1536m # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects diff --git a/android_gradle/gradle/wrapper/gradle-wrapper.jar b/android_gradle/gradle/wrapper/gradle-wrapper.jar Binary files differindex e708b1c..f6b961f 100644 --- a/android_gradle/gradle/wrapper/gradle-wrapper.jar +++ b/android_gradle/gradle/wrapper/gradle-wrapper.jar diff --git a/android_gradle/gradle/wrapper/gradle-wrapper.properties b/android_gradle/gradle/wrapper/gradle-wrapper.properties index e81b594..421d5b6 100644 --- a/android_gradle/gradle/wrapper/gradle-wrapper.properties +++ b/android_gradle/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Sep 25 16:43:12 BST 2021 +#Mon Dec 09 14:37:37 GMT 2019 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip distributionPath=wrapper/dists -zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.0-rc-1-all.zip diff --git a/android_gradle/settings.gradle b/android_gradle/settings.gradle index 2c4357f..9a979bb 100644 --- a/android_gradle/settings.gradle +++ b/android_gradle/settings.gradle @@ -1,9 +1,2 @@ -dependencyResolutionManagement { - repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) - repositories { - google() - mavenCentral() - } -} rootProject.name='Amber' include ':app' diff --git a/docs/amber_script.md b/docs/amber_script.md index 7c78d82..57e0632 100644 --- a/docs/amber_script.md +++ b/docs/amber_script.md @@ -48,20 +48,6 @@ with: * `Storage16BitFeatures.storageInputOutput16` * `SubgroupSizeControl.subgroupSizeControl` * `SubgroupSizeControl.computeFullSubgroups` - * `SubgroupSupportedOperations.basic` - * `SubgroupSupportedOperations.vote` - * `SubgroupSupportedOperations.arithmetic` - * `SubgroupSupportedOperations.ballot` - * `SubgroupSupportedOperations.shuffle` - * `SubgroupSupportedOperations.shuffleRelative` - * `SubgroupSupportedOperations.clustered` - * `SubgroupSupportedOperations.quad` - * `SubgroupSupportedStages.vertex` - * `SubgroupSupportedStages.tessellationControl` - * `SubgroupSupportedStages.tessellationEvaluation` - * `SubgroupSupportedStages.geometry` - * `SubgroupSupportedStages.fragment` - * `SubgroupSupportedStages.compute` Extensions can be enabled with the `DEVICE_EXTENSION` and `INSTANCE_EXTENSION` @@ -441,11 +427,6 @@ The following commands are all specified within the `PIPELINE` command. POLYGON_MODE {mode} ``` -```groovy - # Set the number of patch control points used by tessellation. The default value is 3. - PATCH_CONTROL_POINTS {control_points} -``` - #### Compare operations * `never` * `less` @@ -497,96 +478,6 @@ The following commands are all specified within the `PIPELINE` command. END ``` -#### Blend factors -* `zero` -* `one` -* `src_color` -* `one_minus_src_color` -* `dst_color` -* `one_minus_dst_color` -* `src_alpha` -* `one_minus_src_alpha` -* `dst_alpha` -* `one_minus_dst_alpha` -* `constant_color` -* `one_minus_constant_color` -* `constant_alpha` -* `one_minus_constant_alpha` -* `src_alpha_saturate` -* `src1_color` -* `one_minus_src1_color` -* `src1_alpha` -* `one_minus_src1_alpha` - -#### Blend operations -* `add` -* `substract` -* `reverse_substract` -* `min` -* `max` - -The following operations also require VK_EXT_blend_operation_advanced -when using a Vulkan backend. -* `zero` -* `src` -* `dst` -* `src_over` -* `dst_over` -* `src_in` -* `dst_in` -* `src_out` -* `dst_out` -* `src_atop` -* `dst_atop` -* `xor` -* `multiply` -* `screen` -* `overlay` -* `darken` -* `lighten` -* `color_dodge` -* `color_burn` -* `hard_light` -* `soft_light` -* `difference` -* `exclusion` -* `invert` -* `invert_rgb` -* `linear_dodge` -* `linear_burn` -* `vivid_light` -* `linear_light` -* `pin_light` -* `hard_mix` -* `hsl_hue` -* `hsl_saturation` -* `hsl_color` -* `hsl_luminosity` -* `plus` -* `plus_clamped` -* `plus_clamped_alpha` -* `plus_darker` -* `minus` -* `minus_clamped` -* `contrast` -* `invert_org` -* `red` -* `green` -* `blue` - -```groovy - # Enable alpha blending and set blend factors and operations. Available - # blend factors and operations are listed above. - BLEND - SRC_COLOR_FACTOR {src_color_factor} - DST_COLOR_FACTOR {dst_color_factor} - COLOR_OP {color_op} - SRC_ALPHA_FACTOR {src_alpha_factor} - DST_ALPHA_FACTOR {dst_alpha_factor} - ALPHA_OP {alpha_op} - END -``` - ```groovy # Set the size of the render buffers. |width| and |height| are integers and # default to 250x250. @@ -594,12 +485,6 @@ when using a Vulkan backend. ``` ```groovy - # Set the viewport size. If no viewport is provided then it defaults to the - # whole framebuffer size. Depth range defaults to 0 to 1. - VIEWPORT {x} {y} SIZE {width} {height} [MIN_DEPTH {mind}] [MAX_DEPTH {maxd}] -``` - -```groovy # Set subgroup size control setting. Require that subgroups must be launched # with all invocations active for given shader. Allow SubgroupSize to vary # for given shader. Require a specific SubgroupSize the for given shader. @@ -609,7 +494,7 @@ when using a Vulkan backend. # and be less than or equal to maxSubgroupSize # - MIN to set the required subgroup size to the minSubgroupSize # - MAX to set the required subgroup size to the maxSubgroupSize - SUBGROUP {name_of_shader} + SUBROUP {name_of_shader} FULLY_POPULATED {fully_populated_enable} VARYING_SIZE {varying_size_enable} REQUIRED_SIZE {subgroup_size} @@ -645,11 +530,6 @@ contain image attachment content, depth/stencil content, uniform buffers, etc. # pipelines. BIND BUFFER {buffer_name} AS depth_stencil - # Attach |buffer_name| as a multisample resolve target. The order of resolve - # target images match with the order of color attachments that have more than - # one sample. - BIND BUFFER {buffer_name} AS resolve - # Attach |buffer_name| as the push_constant buffer. There can be only one # push constant buffer attached to a pipeline. BIND BUFFER {buffer_name} AS push_constant @@ -679,18 +559,13 @@ All BIND BUFFER and BIND SAMPLER commands below define a descriptor set and bind These commands can be replaced with BIND BUFFER_ARRAY and BIND SAMPLER_ARRAY commands. In these cases multiple buffer or sampler names need to be provided, separated by spaces. This creates a descriptor array of buffers or samplers bound to the same descriptor set -and binding ID. An array of dynamic offsets should be provided via `OFFSET offset1 offset2 ...` -when using dynamic buffers with BUFFER_ARRAY. Optional descriptor binding offset(s) and range(s) -can be defined via `DESCRIPTOR_OFFSET offset1 offset2 ...` and -`DESCRIPTOR_RANGE range1 range2 ...` when using uniform or storage buffers. Offsets and -ranges can be used also with dynamic buffers. +and binding ID. An array of offsets should be provided via `OFFSET offset1 offset2 ...` +when using dynamic buffers with BUFFER_ARRAY. ```groovy # Bind the buffer of the given |buffer_type| at the given descriptor set - # and binding. The buffer will use a byte offset |descriptor_offset| - # with range |range|. + # and binding. The buffer will use a start index of 0. BIND {BUFFER | BUFFER_ARRAY} {buffer_name} AS {buffer_type} DESCRIPTOR_SET _id_ \ - BINDING _id_ [ DESCRIPTOR_OFFSET _descriptor_offset_ (default 0) ] \ - [ DESCRIPTOR_RANGE _range_ (default -1 == VK_WHOLE_SIZE) ] + BINDING _id_ # Attach |buffer_name| as a storage image. The MIP level will have a base # value of |level|. @@ -711,12 +586,9 @@ ranges can be used also with dynamic buffers. BIND {SAMPLER | SAMPLER_ARRAY} {sampler_name} DESCRIPTOR_SET _id_ BINDING _id_ # Bind |buffer_name| as dynamic uniform/storage buffer at the given descriptor set - # and binding. The buffer will use a byte offset |offset| + |descriptor_offset| - # with range |range|. + # and binding. The buffer will use a start index of |offset|. BIND {BUFFER | BUFFER_ARRAY} {buffer_name} AS {uniform_dynamic | storage_dynamic} \ - DESCRIPTOR_SET _id_ BINDING _id_ OFFSET _offset_ \ - [ DESCRIPTOR_OFFSET _descriptor_offset_ (default 0) ] \ - [ DESCRIPTOR_RANGE _range_ (default -1 == VK_WHOLE_SIZE) ] + DESCRIPTOR_SET _id_ BINDING _id_ OFFSET _offset_ ``` ```groovy diff --git a/docs/debugger.md b/docs/debugger.md index dc887d0..6c3208b 100644 --- a/docs/debugger.md +++ b/docs/debugger.md @@ -3,7 +3,9 @@ This document describes Amber's shader debugger testing framework, which allows developers to write tests for Vulkan drivers that expose shader debugging functionality via the [Debug Adapter Protocol](https://microsoft.github.io/debug-adapter-protocol/). --- -**Caveats** +**Work In Progress** + +Note that shader debugging is very much work-in-progress: * Vulkan shader debugging currently does not have a formalized specification. A shader debugger implementation is being developed in [SwiftShader](https://swiftshader.googlesource.com/SwiftShader/), which one day may become a reference implementation for a formal specifiction. * Currently SwiftShader is the only Vulkan driver to implement a [DAP based shader debugger](https://swiftshader.googlesource.com/SwiftShader/+/refs/heads/master/docs/VulkanShaderDebugging.md). This implementation is also work-in-progress, and may significantly change. @@ -187,4 +189,4 @@ The `amber::Engine::Debugger` interface can be obtained from the `amber::Engine` * If the `amber::Command` holds a `amber::debug::Script`, then this script is executed on the `amber::Engine::Debugger` using the `amber::debug::Script::Run(amber::debug::Events *)` method, before the Vulkan command is executed. * The command is then executed with `amber::Executor::ExecuteCommand()` * Once the command has completed, all debugger threads are synchronized and debugger test results are collected with a call to `amber::Engine::Debugger::Flush()`. -* This process is repeated for all commands in the script. +* This process is repeated for all commands in the script.
\ No newline at end of file diff --git a/samples/CMakeLists.txt b/samples/CMakeLists.txt index 1e91c4d..3fa1882 100644 --- a/samples/CMakeLists.txt +++ b/samples/CMakeLists.txt @@ -74,11 +74,3 @@ target_include_directories(image_diff PRIVATE "${CMAKE_BINARY_DIR}") target_link_libraries(image_diff libamber "lodepng") amber_default_compile_options(image_diff) set_target_properties(image_diff PROPERTIES OUTPUT_NAME "image_diff") - -if (ANDROID) - add_library(amber_ndk SHARED android_helper.cc ${AMBER_SOURCES}) - target_include_directories(amber_ndk PRIVATE "${CMAKE_BINARY_DIR}") - target_link_libraries(amber_ndk libamber ${AMBER_EXTRA_LIBS}) - amber_default_compile_options(amber_ndk) - target_compile_definitions(amber_ndk PRIVATE AMBER_ANDROID_MAIN=1) -endif() diff --git a/samples/amber.cc b/samples/amber.cc index 5973dba..d037ba4 100644 --- a/samples/amber.cc +++ b/samples/amber.cc @@ -447,15 +447,7 @@ std::string disassemble(const std::string& env, } // namespace -#ifdef AMBER_ANDROID_MAIN -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wmissing-prototypes" -#pragma ide diagnostic ignored "OCUnusedGlobalDeclarationInspection" -int android_main(int argc, const char** argv) { -#pragma clang diagnostic pop -#else int main(int argc, const char** argv) { -#endif std::vector<std::string> args(argv, argv + argc); Options options; SampleDelegate delegate; diff --git a/samples/android_helper.cc b/samples/android_main.cc index 7da69ad..b24a9bb 100644 --- a/samples/android_helper.cc +++ b/samples/android_main.cc @@ -18,20 +18,16 @@ #include <string> #include <vector> -extern int android_main(int argc, const char** argv); +extern int main(int argc, const char** argv); -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wmissing-prototypes" -#pragma ide diagnostic ignored "OCUnusedGlobalDeclarationInspection" - -extern "C" JNIEXPORT JNICALL int Java_com_google_amber_Amber_androidHelper( +extern "C" JNIEXPORT JNICALL int Java_com_google_amber_Amber_androidMain( JNIEnv* env, jobject, jobjectArray args, jstring stdoutFile, jstring stderrFile) { - const char* stdout_file_cstr = env->GetStringUTFChars(stdoutFile, nullptr); - const char* stderr_file_cstr = env->GetStringUTFChars(stderrFile, nullptr); + const char* stdout_file_cstr = env->GetStringUTFChars(stdoutFile, NULL); + const char* stderr_file_cstr = env->GetStringUTFChars(stderrFile, NULL); // Redirect std output to a file freopen(stdout_file_cstr, "w", stdout); @@ -47,7 +43,7 @@ extern "C" JNIEXPORT JNICALL int Java_com_google_amber_Amber_androidHelper( for (jsize i = 0; i < arg_count; i++) { jstring js = static_cast<jstring>(env->GetObjectArrayElement(args, i)); - const char* arg_cstr = env->GetStringUTFChars(js, nullptr); + const char* arg_cstr = env->GetStringUTFChars(js, NULL); argv_string.push_back(arg_cstr); env->ReleaseStringUTFChars(js, arg_cstr); } @@ -57,7 +53,5 @@ extern "C" JNIEXPORT JNICALL int Java_com_google_amber_Amber_androidHelper( for (const std::string& arg : argv_string) argv.push_back(arg.c_str()); - return android_main(static_cast<int>(argv.size()), argv.data()); + return main(argv.size(), argv.data()); } - -#pragma clang diagnostic pop diff --git a/samples/config_helper_vulkan.cc b/samples/config_helper_vulkan.cc index 6a82a4a..68114ab 100644 --- a/samples/config_helper_vulkan.cc +++ b/samples/config_helper_vulkan.cc @@ -758,60 +758,25 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( const VkPhysicalDevice physical_device, const std::vector<std::string>& required_features, const std::vector<std::string>& required_extensions) { - available_device_extensions_ = GetAvailableDeviceExtensions(physical_device); - if (!AreAllExtensionsSupported(available_device_extensions_, - required_extensions)) { - return amber::Result("Device does not support all required extensions"); - } - for (const auto& ext : available_device_extensions_) { - if (ext == "VK_KHR_shader_float16_int8") - supports_shader_float16_int8_ = true; - else if (ext == "VK_KHR_8bit_storage") - supports_shader_8bit_storage_ = true; - else if (ext == "VK_KHR_16bit_storage") - supports_shader_16bit_storage_ = true; - else if (ext == "VK_EXT_subgroup_size_control") - supports_subgroup_size_control_ = true; - } - VkPhysicalDeviceFeatures required_vulkan_features = VkPhysicalDeviceFeatures(); if (supports_get_physical_device_properties2_) { - VkPhysicalDeviceSubgroupSizeControlFeaturesEXT - subgroup_size_control_features = {}; - VkPhysicalDeviceVariablePointerFeaturesKHR variable_pointers_features = {}; - VkPhysicalDeviceFloat16Int8FeaturesKHR float16_int8_features = {}; - VkPhysicalDevice8BitStorageFeaturesKHR storage_8bit_features = {}; - VkPhysicalDevice16BitStorageFeaturesKHR storage_16bit_features = {}; - - subgroup_size_control_features.sType = + VkPhysicalDeviceSubgroupSizeControlFeaturesEXT size_control = + VkPhysicalDeviceSubgroupSizeControlFeaturesEXT(); + size_control.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT; - subgroup_size_control_features.pNext = nullptr; + size_control.pNext = nullptr; - // Add subgroup size control struct into the chain only if - // VK_EXT_subgroup_size_control is supported. - variable_pointers_features.sType = + VkPhysicalDeviceVariablePointerFeaturesKHR var_ptrs = + VkPhysicalDeviceVariablePointerFeaturesKHR(); + var_ptrs.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR; - variable_pointers_features.pNext = supports_subgroup_size_control_ - ? &subgroup_size_control_features - : nullptr; - - float16_int8_features.sType = - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR; - float16_int8_features.pNext = &variable_pointers_features; - - storage_8bit_features.sType = - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR; - storage_8bit_features.pNext = &float16_int8_features; - - storage_16bit_features.sType = - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR; - storage_16bit_features.pNext = &storage_8bit_features; + var_ptrs.pNext = &size_control; VkPhysicalDeviceFeatures2KHR features2 = VkPhysicalDeviceFeatures2KHR(); features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR; - features2.pNext = &storage_16bit_features; + features2.pNext = &var_ptrs; auto vkGetPhysicalDeviceFeatures2KHR = reinterpret_cast<PFN_vkGetPhysicalDeviceFeatures2KHR>( @@ -829,34 +794,13 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( } if ((feature == kVariablePointers && - variable_pointers_features.variablePointers == VK_FALSE) || + var_ptrs.variablePointers == VK_FALSE) || (feature == kVariablePointersStorageBuffer && - variable_pointers_features.variablePointersStorageBuffer == - VK_FALSE) || + var_ptrs.variablePointersStorageBuffer == VK_FALSE) || (feature == kSubgroupSizeControl && - subgroup_size_control_features.subgroupSizeControl == VK_FALSE) || + size_control.subgroupSizeControl == VK_FALSE) || (feature == kComputeFullSubgroups && - subgroup_size_control_features.computeFullSubgroups == VK_FALSE) || - (feature == kFloat16Int8_Float16 && - float16_int8_features.shaderFloat16 == VK_FALSE) || - (feature == kFloat16Int8_Int8 && - float16_int8_features.shaderInt8 == VK_FALSE) || - (feature == k8BitStorage_Storage && - storage_8bit_features.storageBuffer8BitAccess == VK_FALSE) || - (feature == k8BitStorage_UniformAndStorage && - storage_8bit_features.uniformAndStorageBuffer8BitAccess == - VK_FALSE) || - (feature == k8BitStorage_PushConstant && - storage_8bit_features.storagePushConstant8 == VK_FALSE) || - (feature == k16BitStorage_Storage && - storage_16bit_features.storageBuffer16BitAccess == VK_FALSE) || - (feature == k16BitStorage_InputOutput && - storage_16bit_features.storageInputOutput16 == VK_FALSE) || - (feature == k16BitStorage_PushConstant && - storage_16bit_features.storagePushConstant16 == VK_FALSE) || - (feature == k16BitStorage_UniformAndStorage && - storage_16bit_features.uniformAndStorageBuffer16BitAccess == - VK_FALSE)) { + size_control.computeFullSubgroups == VK_FALSE)) { return amber::Result("Device does not support all required features"); } } @@ -879,6 +823,22 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements( return amber::Result("Device does not support all required features"); } + available_device_extensions_ = GetAvailableDeviceExtensions(physical_device); + if (!AreAllExtensionsSupported(available_device_extensions_, + required_extensions)) { + return amber::Result("Device does not support all required extensions"); + } + for (const auto& ext : available_device_extensions_) { + if (ext == "VK_KHR_shader_float16_int8") + supports_shader_float16_int8_ = true; + else if (ext == "VK_KHR_8bit_storage") + supports_shader_8bit_storage_ = true; + else if (ext == "VK_KHR_16bit_storage") + supports_shader_16bit_storage_ = true; + else if (ext == "VK_EXT_subgroup_size_control") + supports_subgroup_size_control_ = true; + } + vulkan_queue_family_index_ = ChooseQueueFamilyIndex(physical_device); if (vulkan_queue_family_index_ == std::numeric_limits<uint32_t>::max()) { return amber::Result("Device does not support required queue flags"); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e51d1b0..00e3e54 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -124,10 +124,6 @@ endif() if (${Vulkan_FOUND}) target_link_libraries(libamber libamberenginevulkan) target_include_directories(libamber PRIVATE "${VulkanHeaders_INCLUDE_DIR}") - - if (${VULKAN_CTS_HEADER} AND DEFINED AMBER_CTS_INL_DIR) - target_include_directories(libamber PRIVATE "${AMBER_CTS_INL_DIR}") - endif() endif() if (${Dawn_FOUND}) target_link_libraries(libamber libamberenginedawn) @@ -160,11 +156,9 @@ if (${AMBER_ENABLE_TESTS}) amberscript/parser_shader_opt_test.cc amberscript/parser_shader_test.cc amberscript/parser_stencil_test.cc - amberscript/parser_blend_test.cc amberscript/parser_struct_test.cc amberscript/parser_subgroup_size_control_test.cc amberscript/parser_test.cc - amberscript/parser_viewport_test.cc buffer_test.cc command_data_test.cc descriptor_set_and_binding_parser_test.cc diff --git a/src/amberscript/parser.cc b/src/amberscript/parser.cc index d3e0eb6..50760f0 100644 --- a/src/amberscript/parser.cc +++ b/src/amberscript/parser.cc @@ -602,8 +602,6 @@ Result Parser::ParsePipelineBody(const std::string& cmd_name, r = ParsePipelineShaderOptimizations(pipeline.get()); } else if (tok == "FRAMEBUFFER_SIZE") { r = ParsePipelineFramebufferSize(pipeline.get()); - } else if (tok == "VIEWPORT") { - r = ParsePipelineViewport(pipeline.get()); } else if (tok == "BIND") { r = ParsePipelineBind(pipeline.get()); } else if (tok == "VERTEX_DATA") { @@ -622,10 +620,6 @@ Result Parser::ParsePipelineBody(const std::string& cmd_name, r = ParsePipelineStencil(pipeline.get()); } else if (tok == "SUBGROUP") { r = ParsePipelineSubgroup(pipeline.get()); - } else if (tok == "PATCH_CONTROL_POINTS") { - r = ParsePipelinePatchControlPoints(pipeline.get()); - } else if (tok == "BLEND") { - r = ParsePipelineBlend(pipeline.get()); } else { r = Result("unknown token in pipeline block: " + tok); } @@ -935,20 +929,6 @@ Result Parser::ParsePipelineSubgroup(Pipeline* pipeline) { return ValidateEndOfStatement("SUBGROUP command"); } -Result Parser::ParsePipelinePatchControlPoints(Pipeline* pipeline) { - auto token = tokenizer_->NextToken(); - if (token->IsEOL() || token->IsEOS()) - return Result( - "missing number of control points in PATCH_CONTROL_POINTS command"); - - if (!token->IsInteger()) - return Result("expecting integer for the number of control points"); - - pipeline->GetPipelineData()->SetPatchControlPoints(token->AsUint32()); - - return ValidateEndOfStatement("PATCH_CONTROL_POINTS command"); -} - Result Parser::ParsePipelineFramebufferSize(Pipeline* pipeline) { auto token = tokenizer_->NextToken(); if (token->IsEOL() || token->IsEOS()) @@ -969,75 +949,6 @@ Result Parser::ParsePipelineFramebufferSize(Pipeline* pipeline) { return ValidateEndOfStatement("FRAMEBUFFER_SIZE command"); } -Result Parser::ParsePipelineViewport(Pipeline* pipeline) { - Viewport vp; - vp.mind = 0.0f; - vp.maxd = 1.0f; - - float val[2]; - for (int i = 0; i < 2; i++) { - auto token = tokenizer_->NextToken(); - if (token->IsEOL() || token->IsEOS()) - return Result("missing offset for VIEWPORT command"); - Result r = token->ConvertToDouble(); - if (!r.IsSuccess()) - return Result("invalid offset for VIEWPORT command"); - - val[i] = token->AsFloat(); - } - vp.x = val[0]; - vp.y = val[1]; - - auto token = tokenizer_->NextToken(); - if (!token->IsIdentifier() || token->AsString() != "SIZE") - return Result("missing SIZE for VIEWPORT command"); - - for (int i = 0; i < 2; i++) { - token = tokenizer_->NextToken(); - if (token->IsEOL() || token->IsEOS()) - return Result("missing size for VIEWPORT command"); - Result r = token->ConvertToDouble(); - if (!r.IsSuccess()) - return Result("invalid size for VIEWPORT command"); - - val[i] = token->AsFloat(); - } - vp.w = val[0]; - vp.h = val[1]; - - token = tokenizer_->PeekNextToken(); - while (token->IsIdentifier()) { - if (token->AsString() == "MIN_DEPTH") { - tokenizer_->NextToken(); - token = tokenizer_->NextToken(); - if (token->IsEOL() || token->IsEOS()) - return Result("missing min_depth for VIEWPORT command"); - Result r = token->ConvertToDouble(); - if (!r.IsSuccess()) - return Result("invalid min_depth for VIEWPORT command"); - - vp.mind = token->AsFloat(); - } - if (token->AsString() == "MAX_DEPTH") { - tokenizer_->NextToken(); - token = tokenizer_->NextToken(); - if (token->IsEOL() || token->IsEOS()) - return Result("missing max_depth for VIEWPORT command"); - Result r = token->ConvertToDouble(); - if (!r.IsSuccess()) - return Result("invalid max_depth for VIEWPORT command"); - - vp.maxd = token->AsFloat(); - } - - token = tokenizer_->PeekNextToken(); - } - - pipeline->GetPipelineData()->SetViewport(vp); - - return ValidateEndOfStatement("VIEWPORT command"); -} - Result Parser::ToBufferType(const std::string& name, BufferType* type) { assert(type); if (name == "color") @@ -1064,8 +975,6 @@ Result Parser::ToBufferType(const std::string& name, BufferType* type) { *type = BufferType::kUniformTexelBuffer; else if (name == "storage_texel_buffer") *type = BufferType::kStorageTexelBuffer; - else if (name == "resolve") - *type = BufferType::kResolve; else return Result("unknown buffer_type: " + name); @@ -1180,8 +1089,6 @@ Result Parser::ParsePipelineBind(Pipeline* pipeline) { for (auto& buf : buffers) buf->SetSampler(sampler); - } else if (buffer_type == BufferType::kResolve) { - r = pipeline->AddResolveTarget(buffer); } } @@ -1265,60 +1172,10 @@ Result Parser::ParsePipelineBind(Pipeline* pipeline) { } } - // Set default descriptor buffer offsets to 0 and descriptor buffer - // ranges to VK_WHOLE_SIZE (~0ULL). - std::vector<uint64_t> descriptor_offsets(buffers.size(), 0); - std::vector<uint64_t> descriptor_ranges(buffers.size(), ~0ULL); - if (buffer_type == BufferType::kUniformDynamic || - buffer_type == BufferType::kStorageDynamic || - buffer_type == BufferType::kStorage || - buffer_type == BufferType::kUniform) { - token = tokenizer_->PeekNextToken(); - if (token->IsIdentifier() && - token->AsString() == "DESCRIPTOR_OFFSET") { - token = tokenizer_->NextToken(); - for (size_t i = 0; i < buffers.size(); i++) { - token = tokenizer_->NextToken(); - if (!token->IsInteger()) { - if (i > 0) { - return Result( - "expecting a DESCRIPTOR_OFFSET value for each buffer in " - "the array"); - } else { - return Result( - "expecting an integer value for DESCRIPTOR_OFFSET"); - } - } - descriptor_offsets[i] = token->AsUint64(); - } - } - - token = tokenizer_->PeekNextToken(); - if (token->IsIdentifier() && - token->AsString() == "DESCRIPTOR_RANGE") { - token = tokenizer_->NextToken(); - for (size_t i = 0; i < buffers.size(); i++) { - token = tokenizer_->NextToken(); - if (!token->IsInteger()) { - if (i > 0) { - return Result( - "expecting a DESCRIPTOR_RANGE value for each buffer in " - "the array"); - } else { - return Result( - "expecting an integer value for DESCRIPTOR_RANGE"); - } - } - descriptor_ranges[i] = token->AsUint64(); - } - } - } - pipeline->ClearBuffers(descriptor_set, binding); for (size_t i = 0; i < buffers.size(); i++) { pipeline->AddBuffer(buffers[i], buffer_type, descriptor_set, binding, - base_mip_level, dynamic_offsets[i], - descriptor_offsets[i], descriptor_ranges[i]); + base_mip_level, dynamic_offsets[i]); } } else if (token->IsIdentifier() && token->AsString() == "KERNEL") { token = tokenizer_->NextToken(); @@ -1865,98 +1722,6 @@ Result Parser::ParsePipelineStencil(Pipeline* pipeline) { return ValidateEndOfStatement("STENCIL command"); } -Result Parser::ParsePipelineBlend(Pipeline* pipeline) { - pipeline->GetPipelineData()->SetEnableBlend(true); - - while (true) { - auto token = tokenizer_->NextToken(); - if (token->IsEOL()) - continue; - if (token->IsEOS()) - return Result("BLEND missing END command"); - if (!token->IsIdentifier()) - return Result("BLEND options must be identifiers"); - if (token->AsString() == "END") - break; - - if (token->AsString() == "SRC_COLOR_FACTOR") { - token = tokenizer_->NextToken(); - - if (!token->IsIdentifier()) - return Result("BLEND invalid value for SRC_COLOR_FACTOR"); - - const auto factor = NameToBlendFactor(token->AsString()); - if (factor == BlendFactor::kUnknown) - return Result("BLEND invalid value for SRC_COLOR_FACTOR: " + - token->AsString()); - pipeline->GetPipelineData()->SetSrcColorBlendFactor( - NameToBlendFactor(token->AsString())); - } else if (token->AsString() == "DST_COLOR_FACTOR") { - token = tokenizer_->NextToken(); - - if (!token->IsIdentifier()) - return Result("BLEND invalid value for DST_COLOR_FACTOR"); - - const auto factor = NameToBlendFactor(token->AsString()); - if (factor == BlendFactor::kUnknown) - return Result("BLEND invalid value for DST_COLOR_FACTOR: " + - token->AsString()); - pipeline->GetPipelineData()->SetDstColorBlendFactor( - NameToBlendFactor(token->AsString())); - } else if (token->AsString() == "SRC_ALPHA_FACTOR") { - token = tokenizer_->NextToken(); - - if (!token->IsIdentifier()) - return Result("BLEND invalid value for SRC_ALPHA_FACTOR"); - - const auto factor = NameToBlendFactor(token->AsString()); - if (factor == BlendFactor::kUnknown) - return Result("BLEND invalid value for SRC_ALPHA_FACTOR: " + - token->AsString()); - pipeline->GetPipelineData()->SetSrcAlphaBlendFactor( - NameToBlendFactor(token->AsString())); - } else if (token->AsString() == "DST_ALPHA_FACTOR") { - token = tokenizer_->NextToken(); - - if (!token->IsIdentifier()) - return Result("BLEND invalid value for DST_ALPHA_FACTOR"); - - const auto factor = NameToBlendFactor(token->AsString()); - if (factor == BlendFactor::kUnknown) - return Result("BLEND invalid value for DST_ALPHA_FACTOR: " + - token->AsString()); - pipeline->GetPipelineData()->SetDstAlphaBlendFactor( - NameToBlendFactor(token->AsString())); - } else if (token->AsString() == "COLOR_OP") { - token = tokenizer_->NextToken(); - - if (!token->IsIdentifier()) - return Result("BLEND invalid value for COLOR_OP"); - - const auto op = NameToBlendOp(token->AsString()); - if (op == BlendOp::kUnknown) - return Result("BLEND invalid value for COLOR_OP: " + token->AsString()); - pipeline->GetPipelineData()->SetColorBlendOp( - NameToBlendOp(token->AsString())); - } else if (token->AsString() == "ALPHA_OP") { - token = tokenizer_->NextToken(); - - if (!token->IsIdentifier()) - return Result("BLEND invalid value for ALPHA_OP"); - - const auto op = NameToBlendOp(token->AsString()); - if (op == BlendOp::kUnknown) - return Result("BLEND invalid value for ALPHA_OP: " + token->AsString()); - pipeline->GetPipelineData()->SetAlphaBlendOp( - NameToBlendOp(token->AsString())); - } else { - return Result("BLEND invalid value for BLEND: " + token->AsString()); - } - } - - return ValidateEndOfStatement("BLEND command"); -} - Result Parser::ParseStruct() { auto token = tokenizer_->NextToken(); if (!token->IsIdentifier()) diff --git a/src/amberscript/parser.h b/src/amberscript/parser.h index 25d3493..e8cb835 100644 --- a/src/amberscript/parser.h +++ b/src/amberscript/parser.h @@ -64,9 +64,7 @@ class Parser : public amber::Parser { Result ParsePipelineShaderOptimizations(Pipeline*); Result ParsePipelineShaderCompileOptions(Pipeline*); Result ParsePipelineSubgroup(Pipeline* pipeline); - Result ParsePipelinePatchControlPoints(Pipeline* pipeline); Result ParsePipelineFramebufferSize(Pipeline*); - Result ParsePipelineViewport(Pipeline*); Result ParsePipelineBind(Pipeline*); Result ParsePipelineVertexData(Pipeline*); Result ParsePipelineIndexData(Pipeline*); @@ -74,7 +72,6 @@ class Parser : public amber::Parser { Result ParsePipelinePolygonMode(Pipeline*); Result ParsePipelineDepth(Pipeline* pipeline); Result ParsePipelineStencil(Pipeline* pipeline); - Result ParsePipelineBlend(Pipeline* pipeline); Result ParseRun(); Result ParseDebug(); Result ParseDebugThread(debug::Events*, Pipeline* pipeline); diff --git a/src/amberscript/parser_bind_test.cc b/src/amberscript/parser_bind_test.cc index 8aac5e5..64f3948 100644 --- a/src/amberscript/parser_bind_test.cc +++ b/src/amberscript/parser_bind_test.cc @@ -1393,53 +1393,11 @@ END EXPECT_EQ(BufferType::kUniform, bufs[0].type); EXPECT_EQ(1U, bufs[0].descriptor_set); EXPECT_EQ(2U, bufs[0].binding); - EXPECT_EQ(0U, bufs[0].descriptor_offset); - EXPECT_EQ(~0ULL, bufs[0].descriptor_range); EXPECT_EQ(static_cast<uint32_t>(0), bufs[0].location); EXPECT_EQ(FormatType::kR32G32B32A32_SFLOAT, bufs[0].buffer->GetFormat()->GetFormatType()); } -TEST_F(AmberScriptParserTest, BindBufferDescriptorOffsetAndRange) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -BUFFER my_buf FORMAT R32G32B32A32_SFLOAT - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_fragment - - BIND BUFFER my_buf AS uniform DESCRIPTOR_SET 1 BINDING 2 DESCRIPTOR_OFFSET 256 DESCRIPTOR_RANGE 512 - BIND BUFFER my_buf AS uniform DESCRIPTOR_SET 1 BINDING 3 DESCRIPTOR_OFFSET 256 DESCRIPTOR_RANGE -1 -END -)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_TRUE(r.IsSuccess()) << r.Error(); - - auto script = parser.GetScript(); - const auto& pipelines = script->GetPipelines(); - ASSERT_EQ(1U, pipelines.size()); - - const auto* pipeline = pipelines[0].get(); - const auto& bufs = pipeline->GetBuffers(); - ASSERT_EQ(2U, bufs.size()); - EXPECT_EQ(BufferType::kUniform, bufs[0].type); - EXPECT_EQ(1U, bufs[0].descriptor_set); - EXPECT_EQ(2U, bufs[0].binding); - EXPECT_EQ(256U, bufs[0].descriptor_offset); - EXPECT_EQ(512U, bufs[0].descriptor_range); - EXPECT_EQ(static_cast<uint32_t>(0), bufs[0].location); - EXPECT_EQ(FormatType::kR32G32B32A32_SFLOAT, - bufs[0].buffer->GetFormat()->GetFormatType()); - // Verify the descriptor range from the second buffer. - EXPECT_EQ(~0ULL, bufs[1].descriptor_range); -} - TEST_F(AmberScriptParserTest, BindBufferMissingBindingValue) { std::string in = R"( SHADER vertex my_shader PASSTHROUGH @@ -2901,33 +2859,6 @@ END)"; EXPECT_EQ("13: missing BINDING for BIND command", r.Error()); } -TEST_F(AmberScriptParserTest, BindDescriptorOffsetWithUnsupportedBufferType) { - std::string unsupported_buffer_types[] = {"uniform_texel_buffer", - "storage_texel_buffer", - "sampled_image", "storage_image"}; - - for (const auto& buffer_type : unsupported_buffer_types) { - std::ostringstream in; - in << R"( -SHADER compute compute_shader GLSL -# GLSL Shader -END - -BUFFER texture FORMAT R8G8B8A8_UNORM - -PIPELINE compute pipeline - ATTACH compute_shader - BIND BUFFER texture AS )" - << buffer_type << R"( DESCRIPTOR_SET 0 BINDING 0 DESCRIPTOR_OFFSET 0 -END)"; - Parser parser; - Result r = parser.Parse(in.str()); - ASSERT_FALSE(r.IsSuccess()); - EXPECT_EQ("10: extra parameters after BIND command: DESCRIPTOR_OFFSET", - r.Error()); - } -} - TEST_F(AmberScriptParserTest, BindBufferArray) { std::string in = R"( SHADER vertex my_shader PASSTHROUGH @@ -2960,200 +2891,12 @@ END EXPECT_EQ(BufferType::kUniform, bufs[i].type); EXPECT_EQ(1U, bufs[i].descriptor_set); EXPECT_EQ(2U, bufs[i].binding); - EXPECT_EQ(0U, bufs[i].descriptor_offset); - EXPECT_EQ(~0ULL, bufs[i].descriptor_range); EXPECT_EQ(static_cast<uint32_t>(0), bufs[i].location); EXPECT_EQ(FormatType::kR32G32B32A32_SFLOAT, bufs[i].buffer->GetFormat()->GetFormatType()); } } -TEST_F(AmberScriptParserTest, BindBufferArrayWithDescriptorOffsetAndRange) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -BUFFER my_buf1 FORMAT R32G32B32A32_SFLOAT - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_fragment - - BIND BUFFER_ARRAY my_buf1 my_buf1 AS uniform DESCRIPTOR_SET 1 BINDING 2 DESCRIPTOR_OFFSET 256 512 DESCRIPTOR_RANGE 1024 2048 -END -)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_TRUE(r.IsSuccess()) << r.Error(); - - auto script = parser.GetScript(); - const auto& pipelines = script->GetPipelines(); - ASSERT_EQ(1U, pipelines.size()); - - const auto* pipeline = pipelines[0].get(); - const auto& bufs = pipeline->GetBuffers(); - ASSERT_EQ(2U, bufs.size()); - for (size_t i = 0; i < 2; i++) { - EXPECT_EQ(BufferType::kUniform, bufs[i].type); - EXPECT_EQ(1U, bufs[i].descriptor_set); - EXPECT_EQ(2U, bufs[i].binding); - EXPECT_EQ(256U * (i + 1), bufs[i].descriptor_offset); - EXPECT_EQ(1024U * (i + 1), bufs[i].descriptor_range); - EXPECT_EQ(static_cast<uint32_t>(0), bufs[i].location); - EXPECT_EQ(FormatType::kR32G32B32A32_SFLOAT, - bufs[i].buffer->GetFormat()->GetFormatType()); - } -} - -TEST_F(AmberScriptParserTest, - BindDynamicBufferArrayWithDescriptorOffsetAndRange) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -BUFFER my_buf1 FORMAT R32G32B32A32_SFLOAT - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_fragment - - BIND BUFFER_ARRAY my_buf1 my_buf1 AS uniform_dynamic DESCRIPTOR_SET 1 BINDING 2 OFFSET 16 32 DESCRIPTOR_OFFSET 256 512 DESCRIPTOR_RANGE 1024 2048 -END -)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_TRUE(r.IsSuccess()) << r.Error(); - - auto script = parser.GetScript(); - const auto& pipelines = script->GetPipelines(); - ASSERT_EQ(1U, pipelines.size()); - - const auto* pipeline = pipelines[0].get(); - const auto& bufs = pipeline->GetBuffers(); - ASSERT_EQ(2U, bufs.size()); - for (size_t i = 0; i < 2; i++) { - EXPECT_EQ(BufferType::kUniformDynamic, bufs[i].type); - EXPECT_EQ(1U, bufs[i].descriptor_set); - EXPECT_EQ(2U, bufs[i].binding); - EXPECT_EQ(16U * (i + 1), bufs[i].dynamic_offset); - EXPECT_EQ(256U * (i + 1), bufs[i].descriptor_offset); - EXPECT_EQ(1024U * (i + 1), bufs[i].descriptor_range); - EXPECT_EQ(static_cast<uint32_t>(0), bufs[i].location); - EXPECT_EQ(FormatType::kR32G32B32A32_SFLOAT, - bufs[i].buffer->GetFormat()->GetFormatType()); - } -} - -TEST_F(AmberScriptParserTest, BindBufferArrayOnlyOneDescriptorOffset) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -BUFFER my_buf FORMAT R32G32B32A32_SFLOAT - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_fragment - - BIND BUFFER_ARRAY my_buf my_buf AS uniform DESCRIPTOR_SET 1 BINDING 2 DESCRIPTOR_OFFSET 256 -END -)"; - - Parser parser; - Result r = parser.Parse(in); - - ASSERT_FALSE(r.IsSuccess()); - EXPECT_EQ( - "13: expecting a DESCRIPTOR_OFFSET value for each buffer in the array", - r.Error()); -} - -TEST_F(AmberScriptParserTest, BindBufferArrayOnlyOneDescriptorRange) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -BUFFER my_buf FORMAT R32G32B32A32_SFLOAT - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_fragment - - BIND BUFFER_ARRAY my_buf my_buf AS uniform DESCRIPTOR_SET 1 BINDING 2 DESCRIPTOR_RANGE 256 -END -)"; - - Parser parser; - Result r = parser.Parse(in); - - ASSERT_FALSE(r.IsSuccess()); - EXPECT_EQ( - "13: expecting a DESCRIPTOR_RANGE value for each buffer in the array", - r.Error()); -} - -TEST_F(AmberScriptParserTest, BindUniformBufferEmptyDescriptorOffset) { - std::string in = R"( -BUFFER my_buf FORMAT R32G32B32A32_SFLOAT -PIPELINE graphics my_pipeline - BIND BUFFER my_buf AS uniform DESCRIPTOR_SET 1 BINDING 2 DESCRIPTOR_OFFSET -END -)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_FALSE(r.IsSuccess()); - EXPECT_EQ("5: expecting an integer value for DESCRIPTOR_OFFSET", r.Error()); -} - -TEST_F(AmberScriptParserTest, BindUniformBufferInvalidDescriptorOffset) { - std::string in = R"( -BUFFER my_buf FORMAT R32G32B32A32_SFLOAT -PIPELINE graphics my_pipeline - BIND BUFFER my_buf AS uniform DESCRIPTOR_SET 1 BINDING 2 DESCRIPTOR_OFFSET foo -END -)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_FALSE(r.IsSuccess()); - EXPECT_EQ("4: expecting an integer value for DESCRIPTOR_OFFSET", r.Error()); -} - -TEST_F(AmberScriptParserTest, BindUniformBufferEmptyDescriptorRange) { - std::string in = R"( -BUFFER my_buf FORMAT R32G32B32A32_SFLOAT -PIPELINE graphics my_pipeline - BIND BUFFER my_buf AS uniform DESCRIPTOR_SET 1 BINDING 2 DESCRIPTOR_RANGE -END -)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_FALSE(r.IsSuccess()); - EXPECT_EQ("5: expecting an integer value for DESCRIPTOR_RANGE", r.Error()); -} - -TEST_F(AmberScriptParserTest, BindUniformBufferInvalidDescriptorRange) { - std::string in = R"( -BUFFER my_buf FORMAT R32G32B32A32_SFLOAT -PIPELINE graphics my_pipeline - BIND BUFFER my_buf AS uniform DESCRIPTOR_SET 1 BINDING 2 DESCRIPTOR_RANGE foo -END -)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_FALSE(r.IsSuccess()); - EXPECT_EQ("4: expecting an integer value for DESCRIPTOR_RANGE", r.Error()); -} - TEST_F(AmberScriptParserTest, BindBufferArrayOnlyOneBuffer) { std::string in = R"( SHADER vertex my_shader PASSTHROUGH @@ -3508,132 +3251,5 @@ END r.Error()); } -TEST_F(AmberScriptParserTest, BindResolveTarget) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -IMAGE my_fb_ms DIM_2D WIDTH 64 HEIGHT 64 FORMAT R32G32B32A32_SFLOAT SAMPLES 4 -IMAGE my_fb DIM_2D WIDTH 64 HEIGHT 64 FORMAT R32G32B32A32_SFLOAT - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_fragment - - FRAMEBUFFER_SIZE 64 64 - BIND BUFFER my_fb_ms AS color LOCATION 0 - BIND BUFFER my_fb AS resolve -END)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_TRUE(r.IsSuccess()) << r.Error(); - - auto script = parser.GetScript(); - const auto& pipelines = script->GetPipelines(); - ASSERT_EQ(1U, pipelines.size()); - - const auto* pipeline = pipelines[0].get(); - const auto& resolve_targets = pipeline->GetResolveTargets(); - ASSERT_EQ(1U, resolve_targets.size()); - - const auto& buf_info = resolve_targets[0]; - ASSERT_TRUE(buf_info.buffer != nullptr); - EXPECT_EQ(64u * 64u, buf_info.buffer->ElementCount()); - EXPECT_EQ(64u * 64u * 4u, buf_info.buffer->ValueCount()); - EXPECT_EQ(64u * 64u * 4u * sizeof(float), buf_info.buffer->GetSizeInBytes()); -} - -TEST_F(AmberScriptParserTest, BindResolveTargetMissingBuffer) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -BUFFER my_fb FORMAT R32G32B32A32_SFLOAT - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_fragment - - BIND BUFFER AS resolve -END)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_FALSE(r.IsSuccess()); - EXPECT_EQ("12: unknown buffer: AS", r.Error()); -} - -TEST_F(AmberScriptParserTest, BindResolveTargetNonDeclaredBuffer) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -IMAGE my_fb_ms DIM_2D WIDTH 64 HEIGHT 64 FORMAT R32G32B32A32_SFLOAT SAMPLES 4 - -PIPELINE graphics my_pipeline -ATTACH my_shader -ATTACH my_fragment - -FRAMEBUFFER_SIZE 64 64 -BIND BUFFER my_fb_ms AS color LOCATION 0 -BIND BUFFER my_fb AS resolve -END)"; - Parser parser; - Result r = parser.Parse(in); - ASSERT_FALSE(r.IsSuccess()); - EXPECT_EQ("14: unknown buffer: my_fb", r.Error()); -} - -TEST_F(AmberScriptParserTest, BindMultipleResolveTargets) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -IMAGE my_fb_ms0 DIM_2D WIDTH 64 HEIGHT 64 FORMAT R32G32B32A32_SFLOAT SAMPLES 4 -IMAGE my_fb_ms1 DIM_2D WIDTH 64 HEIGHT 64 FORMAT R32G32B32A32_SFLOAT SAMPLES 4 -IMAGE my_fb_ms2 DIM_2D WIDTH 64 HEIGHT 64 FORMAT R32G32B32A32_SFLOAT SAMPLES 4 -IMAGE my_fb0 DIM_2D WIDTH 64 HEIGHT 64 FORMAT R32G32B32A32_SFLOAT -IMAGE my_fb1 DIM_2D WIDTH 64 HEIGHT 64 FORMAT R32G32B32A32_SFLOAT -IMAGE my_fb2 DIM_2D WIDTH 64 HEIGHT 64 FORMAT R32G32B32A32_SFLOAT - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_fragment - - FRAMEBUFFER_SIZE 64 64 - BIND BUFFER my_fb_ms0 AS color LOCATION 0 - BIND BUFFER my_fb_ms1 AS color LOCATION 1 - BIND BUFFER my_fb_ms2 AS color LOCATION 2 - BIND BUFFER my_fb0 AS resolve - BIND BUFFER my_fb1 AS resolve - BIND BUFFER my_fb2 AS resolve -END)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_TRUE(r.IsSuccess()) << r.Error(); - - auto script = parser.GetScript(); - const auto& pipelines = script->GetPipelines(); - ASSERT_EQ(1U, pipelines.size()); - - const auto* pipeline = pipelines[0].get(); - const auto& resolve_targets = pipeline->GetResolveTargets(); - ASSERT_EQ(3U, resolve_targets.size()); - - for (const auto& buf_info : resolve_targets) { - ASSERT_TRUE(buf_info.buffer != nullptr); - EXPECT_EQ(64u * 64u, buf_info.buffer->ElementCount()); - EXPECT_EQ(64u * 64u * 4u, buf_info.buffer->ValueCount()); - EXPECT_EQ(64u * 64u * 4u * sizeof(float), - buf_info.buffer->GetSizeInBytes()); - } -} - } // namespace amberscript } // namespace amber diff --git a/src/amberscript/parser_blend_test.cc b/src/amberscript/parser_blend_test.cc deleted file mode 100644 index 013ccbd..0000000 --- a/src/amberscript/parser_blend_test.cc +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2021 The Amber 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 -// -// http://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 parseried. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "gtest/gtest.h" -#include "src/amberscript/parser.h" - -namespace amber { -namespace amberscript { - -using AmberScriptParserTest = testing::Test; - -TEST_F(AmberScriptParserTest, BlendAllValues) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -BUFFER my_fb FORMAT R32G32B32A32_SFLOAT - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_fragment - BIND BUFFER my_fb AS color LOCATION 0 - - BLEND - SRC_COLOR_FACTOR src_alpha - DST_COLOR_FACTOR one_minus_src_alpha - COLOR_OP add - SRC_ALPHA_FACTOR one - DST_ALPHA_FACTOR zero - ALPHA_OP max - END -END)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_TRUE(r.IsSuccess()) << r.Error(); - - auto script = parser.GetScript(); - const auto& pipelines = script->GetPipelines(); - ASSERT_EQ(1U, pipelines.size()); - - auto* pipeline = pipelines[0].get(); - - ASSERT_TRUE(pipeline->GetPipelineData()->GetEnableBlend()); - ASSERT_EQ(BlendFactor::kSrcAlpha, - pipeline->GetPipelineData()->GetSrcColorBlendFactor()); - ASSERT_EQ(BlendFactor::kOneMinusSrcAlpha, - pipeline->GetPipelineData()->GetDstColorBlendFactor()); - ASSERT_EQ(BlendOp::kAdd, - pipeline->GetPipelineData()->GetColorBlendOp()); - - ASSERT_EQ(BlendFactor::kOne, - pipeline->GetPipelineData()->GetSrcAlphaBlendFactor()); - ASSERT_EQ(BlendFactor::kZero, - pipeline->GetPipelineData()->GetDstAlphaBlendFactor()); - ASSERT_EQ(BlendOp::kMax, - pipeline->GetPipelineData()->GetAlphaBlendOp()); -} - -TEST_F(AmberScriptParserTest, BlendDefaultValues) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -BUFFER my_fb FORMAT R32G32B32A32_SFLOAT - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_fragment - BIND BUFFER my_fb AS color LOCATION 0 - - BLEND - END -END)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_TRUE(r.IsSuccess()) << r.Error(); - - auto script = parser.GetScript(); - const auto& pipelines = script->GetPipelines(); - ASSERT_EQ(1U, pipelines.size()); - - auto* pipeline = pipelines[0].get(); - - ASSERT_TRUE(pipeline->GetPipelineData()->GetEnableBlend()); - ASSERT_EQ(BlendFactor::kOne, - pipeline->GetPipelineData()->GetSrcColorBlendFactor()); - ASSERT_EQ(BlendFactor::kZero, - pipeline->GetPipelineData()->GetDstColorBlendFactor()); - ASSERT_EQ(BlendOp::kAdd, - pipeline->GetPipelineData()->GetColorBlendOp()); - - ASSERT_EQ(BlendFactor::kOne, - pipeline->GetPipelineData()->GetSrcAlphaBlendFactor()); - ASSERT_EQ(BlendFactor::kZero, - pipeline->GetPipelineData()->GetDstAlphaBlendFactor()); - ASSERT_EQ(BlendOp::kAdd, - pipeline->GetPipelineData()->GetAlphaBlendOp()); -} - -TEST_F(AmberScriptParserTest, BlendInvalidColorFactor) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -BUFFER my_fb FORMAT R32G32B32A32_SFLOAT - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_fragment - BIND BUFFER my_fb AS color LOCATION 0 - - BLEND - SRC_COLOR_FACTOR foo - END -END)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_FALSE(r.IsSuccess()) << r.Error(); - EXPECT_EQ("14: BLEND invalid value for SRC_COLOR_FACTOR: foo", r.Error()); -} - -} // namespace amberscript -} // namespace amber diff --git a/src/amberscript/parser_pipeline_test.cc b/src/amberscript/parser_pipeline_test.cc index 4707dd9..2b56e2e 100644 --- a/src/amberscript/parser_pipeline_test.cc +++ b/src/amberscript/parser_pipeline_test.cc @@ -61,8 +61,6 @@ END EXPECT_EQ(kShaderTypeFragment, shaders[1].GetShader()->GetType()); EXPECT_EQ(static_cast<uint32_t>(0), shaders[1].GetShaderOptimizations().size()); - - EXPECT_EQ(pipelines[0]->GetPipelineData()->GetPatchControlPoints(), 3u); } TEST_F(AmberScriptParserTest, PipelineMissingEnd) { @@ -543,85 +541,5 @@ END EXPECT_EQ(4u, s2[0].GetSpecialization().at(3)); } -TEST_F(AmberScriptParserTest, PipelinePatchControlPoints) { - std::string in = R"( -DEVICE_FEATURE tessellationShader - -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END - -SHADER tessellation_control my_tesc GLSL -# GLSL Shader -END - -SHADER tessellation_evaluation my_tese GLSL -# GLSL Shader -END - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_tesc - ATTACH my_tese - ATTACH my_fragment - - PATCH_CONTROL_POINTS 4 -END -)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_TRUE(r.IsSuccess()) << r.Error(); - - auto script = parser.GetScript(); - const auto& pipelines = script->GetPipelines(); - ASSERT_EQ(1U, pipelines.size()); - - EXPECT_EQ(pipelines[0]->GetPipelineData()->GetPatchControlPoints(), 4u); -} - -TEST_F(AmberScriptParserTest, PipelineDerivePatchControlPoints) { - std::string in = R"( -DEVICE_FEATURE tessellationShader - -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END - -SHADER tessellation_control my_tesc GLSL -# GLSL Shader -END - -SHADER tessellation_evaluation my_tese GLSL -# GLSL Shader -END - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_tesc - ATTACH my_tese - ATTACH my_fragment - - PATCH_CONTROL_POINTS 4 -END - -DERIVE_PIPELINE child_pipeline FROM my_pipeline -END -)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_TRUE(r.IsSuccess()) << r.Error(); - - auto script = parser.GetScript(); - const auto& pipelines = script->GetPipelines(); - ASSERT_EQ(2U, pipelines.size()); - - EXPECT_EQ(pipelines[0]->GetPipelineData()->GetPatchControlPoints(), 4u); - EXPECT_EQ(pipelines[1]->GetPipelineData()->GetPatchControlPoints(), 4u); -} - } // namespace amberscript } // namespace amber diff --git a/src/amberscript/parser_viewport_test.cc b/src/amberscript/parser_viewport_test.cc deleted file mode 100644 index ec19fb2..0000000 --- a/src/amberscript/parser_viewport_test.cc +++ /dev/null @@ -1,388 +0,0 @@ -// Copyright 2021 The Amber 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 -// -// http://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 parseried. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "gtest/gtest.h" -#include "src/amberscript/parser.h" - -namespace amber { -namespace amberscript { - -using AmberScriptParserTest = testing::Test; - -TEST_F(AmberScriptParserTest, NoViewport) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -BUFFER my_fb FORMAT R32G32B32A32_SFLOAT -BUFFER my_ds FORMAT D32_SFLOAT_S8_UINT - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_fragment - BIND BUFFER my_fb AS color LOCATION 0 - BIND BUFFER my_ds AS depth_stencil -END)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_TRUE(r.IsSuccess()) << r.Error(); - - auto script = parser.GetScript(); - const auto& pipelines = script->GetPipelines(); - ASSERT_EQ(1U, pipelines.size()); - - auto* pipeline = pipelines[0].get(); - ASSERT_FALSE(pipeline->GetPipelineData()->HasViewportData()); -} - -TEST_F(AmberScriptParserTest, ViewportNoDepth) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -BUFFER my_fb FORMAT R32G32B32A32_SFLOAT -BUFFER my_ds FORMAT D32_SFLOAT_S8_UINT - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_fragment - BIND BUFFER my_fb AS color LOCATION 0 - BIND BUFFER my_ds AS depth_stencil - - VIEWPORT 5.0 7.0 SIZE 10.0 12.0 -END)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_TRUE(r.IsSuccess()) << r.Error(); - - auto script = parser.GetScript(); - const auto& pipelines = script->GetPipelines(); - ASSERT_EQ(1U, pipelines.size()); - - auto* pipeline = pipelines[0].get(); - ASSERT_TRUE(pipeline->GetPipelineData()->HasViewportData()); - ASSERT_FLOAT_EQ(5.0f, pipeline->GetPipelineData()->GetViewport().x); - ASSERT_FLOAT_EQ(7.0f, pipeline->GetPipelineData()->GetViewport().y); - ASSERT_FLOAT_EQ(10.0f, pipeline->GetPipelineData()->GetViewport().w); - ASSERT_FLOAT_EQ(12.0f, pipeline->GetPipelineData()->GetViewport().h); - ASSERT_FLOAT_EQ(0.0f, pipeline->GetPipelineData()->GetViewport().mind); - ASSERT_FLOAT_EQ(1.0f, pipeline->GetPipelineData()->GetViewport().maxd); -} - -TEST_F(AmberScriptParserTest, ViewportMinDepth) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -BUFFER my_fb FORMAT R32G32B32A32_SFLOAT -BUFFER my_ds FORMAT D32_SFLOAT_S8_UINT - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_fragment - BIND BUFFER my_fb AS color LOCATION 0 - BIND BUFFER my_ds AS depth_stencil - - VIEWPORT 12.2 9.7 SIZE 0.5 106.1 MIN_DEPTH 0.3 -END)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_TRUE(r.IsSuccess()) << r.Error(); - - auto script = parser.GetScript(); - const auto& pipelines = script->GetPipelines(); - ASSERT_EQ(1U, pipelines.size()); - - auto* pipeline = pipelines[0].get(); - ASSERT_TRUE(pipeline->GetPipelineData()->HasViewportData()); - ASSERT_FLOAT_EQ(12.2f, pipeline->GetPipelineData()->GetViewport().x); - ASSERT_FLOAT_EQ(9.7f, pipeline->GetPipelineData()->GetViewport().y); - ASSERT_FLOAT_EQ(0.5f, pipeline->GetPipelineData()->GetViewport().w); - ASSERT_FLOAT_EQ(106.1f, pipeline->GetPipelineData()->GetViewport().h); - ASSERT_FLOAT_EQ(0.3f, pipeline->GetPipelineData()->GetViewport().mind); - ASSERT_FLOAT_EQ(1.0f, pipeline->GetPipelineData()->GetViewport().maxd); -} - -TEST_F(AmberScriptParserTest, ViewportMaxDepth) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -BUFFER my_fb FORMAT R32G32B32A32_SFLOAT -BUFFER my_ds FORMAT D32_SFLOAT_S8_UINT - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_fragment - BIND BUFFER my_fb AS color LOCATION 0 - BIND BUFFER my_ds AS depth_stencil - - VIEWPORT 12.2 9.7 SIZE 0.5 106.1 MAX_DEPTH 0.456 -END)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_TRUE(r.IsSuccess()) << r.Error(); - - auto script = parser.GetScript(); - const auto& pipelines = script->GetPipelines(); - ASSERT_EQ(1U, pipelines.size()); - - auto* pipeline = pipelines[0].get(); - ASSERT_TRUE(pipeline->GetPipelineData()->HasViewportData()); - ASSERT_FLOAT_EQ(12.2f, pipeline->GetPipelineData()->GetViewport().x); - ASSERT_FLOAT_EQ(9.7f, pipeline->GetPipelineData()->GetViewport().y); - ASSERT_FLOAT_EQ(0.5f, pipeline->GetPipelineData()->GetViewport().w); - ASSERT_FLOAT_EQ(106.1f, pipeline->GetPipelineData()->GetViewport().h); - ASSERT_FLOAT_EQ(0.0f, pipeline->GetPipelineData()->GetViewport().mind); - ASSERT_FLOAT_EQ(0.456f, pipeline->GetPipelineData()->GetViewport().maxd); -} - -TEST_F(AmberScriptParserTest, ViewportAllValues) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -BUFFER my_fb FORMAT R32G32B32A32_SFLOAT -BUFFER my_ds FORMAT D32_SFLOAT_S8_UINT - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_fragment - BIND BUFFER my_fb AS color LOCATION 0 - BIND BUFFER my_ds AS depth_stencil - - VIEWPORT -0.6 5.2 SIZE 13.8 9.4 MIN_DEPTH 0.5 MAX_DEPTH 0.6 -END)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_TRUE(r.IsSuccess()) << r.Error(); - - auto script = parser.GetScript(); - const auto& pipelines = script->GetPipelines(); - ASSERT_EQ(1U, pipelines.size()); - - auto* pipeline = pipelines[0].get(); - ASSERT_TRUE(pipeline->GetPipelineData()->HasViewportData()); - ASSERT_FLOAT_EQ(-0.6f, pipeline->GetPipelineData()->GetViewport().x); - ASSERT_FLOAT_EQ(5.2f, pipeline->GetPipelineData()->GetViewport().y); - ASSERT_FLOAT_EQ(13.8f, pipeline->GetPipelineData()->GetViewport().w); - ASSERT_FLOAT_EQ(9.4f, pipeline->GetPipelineData()->GetViewport().h); - ASSERT_FLOAT_EQ(0.5f, pipeline->GetPipelineData()->GetViewport().mind); - ASSERT_FLOAT_EQ(0.6f, pipeline->GetPipelineData()->GetViewport().maxd); -} - -TEST_F(AmberScriptParserTest, ViewportIntegers) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -BUFFER my_fb FORMAT R32G32B32A32_SFLOAT -BUFFER my_ds FORMAT D32_SFLOAT_S8_UINT - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_fragment - BIND BUFFER my_fb AS color LOCATION 0 - BIND BUFFER my_ds AS depth_stencil - - VIEWPORT -2 7 SIZE 15 20 MIN_DEPTH 1 MAX_DEPTH 2 -END)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_TRUE(r.IsSuccess()) << r.Error(); - - auto script = parser.GetScript(); - const auto& pipelines = script->GetPipelines(); - ASSERT_EQ(1U, pipelines.size()); - - auto* pipeline = pipelines[0].get(); - ASSERT_TRUE(pipeline->GetPipelineData()->HasViewportData()); - ASSERT_FLOAT_EQ(-2.0f, pipeline->GetPipelineData()->GetViewport().x); - ASSERT_FLOAT_EQ(7.0f, pipeline->GetPipelineData()->GetViewport().y); - ASSERT_FLOAT_EQ(15.0f, pipeline->GetPipelineData()->GetViewport().w); - ASSERT_FLOAT_EQ(20.0f, pipeline->GetPipelineData()->GetViewport().h); - ASSERT_FLOAT_EQ(1.0f, pipeline->GetPipelineData()->GetViewport().mind); - ASSERT_FLOAT_EQ(2.0f, pipeline->GetPipelineData()->GetViewport().maxd); -} - -TEST_F(AmberScriptParserTest, ViewportMixedIntegers) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -BUFFER my_fb FORMAT R32G32B32A32_SFLOAT -BUFFER my_ds FORMAT D32_SFLOAT_S8_UINT - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_fragment - BIND BUFFER my_fb AS color LOCATION 0 - BIND BUFFER my_ds AS depth_stencil - - VIEWPORT -2 13.1 SIZE 15.9 20 -END)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_TRUE(r.IsSuccess()) << r.Error(); - - auto script = parser.GetScript(); - const auto& pipelines = script->GetPipelines(); - ASSERT_EQ(1U, pipelines.size()); - - auto* pipeline = pipelines[0].get(); - ASSERT_TRUE(pipeline->GetPipelineData()->HasViewportData()); - ASSERT_FLOAT_EQ(-2.0f, pipeline->GetPipelineData()->GetViewport().x); - ASSERT_FLOAT_EQ(13.1f, pipeline->GetPipelineData()->GetViewport().y); - ASSERT_FLOAT_EQ(15.9f, pipeline->GetPipelineData()->GetViewport().w); - ASSERT_FLOAT_EQ(20.0f, pipeline->GetPipelineData()->GetViewport().h); - ASSERT_FLOAT_EQ(0.0f, pipeline->GetPipelineData()->GetViewport().mind); - ASSERT_FLOAT_EQ(1.0f, pipeline->GetPipelineData()->GetViewport().maxd); -} - -TEST_F(AmberScriptParserTest, ViewportInvalidMissingSize) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -BUFFER my_fb FORMAT R32G32B32A32_SFLOAT -BUFFER my_ds FORMAT D32_SFLOAT_S8_UINT - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_fragment - BIND BUFFER my_fb AS color LOCATION 0 - BIND BUFFER my_ds AS depth_stencil - - VIEWPORT 0.0 2.0 12.0 24.0 -END)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_FALSE(r.IsSuccess()) << r.Error(); - EXPECT_EQ("15: missing SIZE for VIEWPORT command", r.Error()); -} - -TEST_F(AmberScriptParserTest, ViewportInvalidSizeNotOptional) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -BUFFER my_fb FORMAT R32G32B32A32_SFLOAT -BUFFER my_ds FORMAT D32_SFLOAT_S8_UINT - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_fragment - BIND BUFFER my_fb AS color LOCATION 0 - BIND BUFFER my_ds AS depth_stencil - - VIEWPORT 0.0 2.0 -END)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_FALSE(r.IsSuccess()) << r.Error(); - EXPECT_EQ("16: missing SIZE for VIEWPORT command", r.Error()); -} - -TEST_F(AmberScriptParserTest, ViewportInvalidMissingOffset) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -BUFFER my_fb FORMAT R32G32B32A32_SFLOAT -BUFFER my_ds FORMAT D32_SFLOAT_S8_UINT - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_fragment - BIND BUFFER my_fb AS color LOCATION 0 - BIND BUFFER my_ds AS depth_stencil - - VIEWPORT 0.0 SIZE 12.0 24.0 -END)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_FALSE(r.IsSuccess()) << r.Error(); - EXPECT_EQ("15: invalid offset for VIEWPORT command", r.Error()); -} - -TEST_F(AmberScriptParserTest, ViewportInvalidMissingSizeValue) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -BUFFER my_fb FORMAT R32G32B32A32_SFLOAT -BUFFER my_ds FORMAT D32_SFLOAT_S8_UINT - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_fragment - BIND BUFFER my_fb AS color LOCATION 0 - BIND BUFFER my_ds AS depth_stencil - - VIEWPORT 0.0 2.0 SIZE 12.0 -END)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_FALSE(r.IsSuccess()) << r.Error(); - EXPECT_EQ("16: missing size for VIEWPORT command", r.Error()); -} - -TEST_F(AmberScriptParserTest, ViewportInvalidMissingDepthValue) { - std::string in = R"( -SHADER vertex my_shader PASSTHROUGH -SHADER fragment my_fragment GLSL -# GLSL Shader -END -BUFFER my_fb FORMAT R32G32B32A32_SFLOAT -BUFFER my_ds FORMAT D32_SFLOAT_S8_UINT - -PIPELINE graphics my_pipeline - ATTACH my_shader - ATTACH my_fragment - BIND BUFFER my_fb AS color LOCATION 0 - BIND BUFFER my_ds AS depth_stencil - - VIEWPORT 0.0 2.0 SIZE 12.0 24.0 MIN_DEPTH MAX_DEPTH 1.0 -END)"; - - Parser parser; - Result r = parser.Parse(in); - ASSERT_FALSE(r.IsSuccess()) << r.Error(); - EXPECT_EQ("15: invalid min_depth for VIEWPORT command", r.Error()); -} - -} // namespace amberscript -} // namespace amber diff --git a/src/buffer.h b/src/buffer.h index 90f3b01..18f7fed 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -62,9 +62,7 @@ enum class BufferType : int8_t { /// A uniform texel buffer. kUniformTexelBuffer, /// A storage texel buffer. - kStorageTexelBuffer, - /// A resolve target. - kResolve + kStorageTexelBuffer }; enum class InputRate : int8_t { diff --git a/src/command.h b/src/command.h index 26b9dc2..207c336 100644 --- a/src/command.h +++ b/src/command.h @@ -546,16 +546,6 @@ class BufferCommand : public BindableResourceCommand { } uint32_t GetDynamicOffset() const { return dynamic_offset_; } - void SetDescriptorOffset(uint64_t descriptor_offset) { - descriptor_offset_ = descriptor_offset; - } - uint64_t GetDescriptorOffset() const { return descriptor_offset_; } - - void SetDescriptorRange(uint64_t descriptor_range) { - descriptor_range_ = descriptor_range; - } - uint64_t GetDescriptorRange() const { return descriptor_range_; } - void SetValues(std::vector<Value>&& values) { values_ = std::move(values); } const std::vector<Value>& GetValues() const { return values_; } @@ -575,8 +565,6 @@ class BufferCommand : public BindableResourceCommand { uint32_t offset_ = 0; uint32_t base_mip_level_ = 0; uint32_t dynamic_offset_ = 0; - uint64_t descriptor_offset_ = 0; - uint64_t descriptor_range_ = ~0ULL; std::vector<Value> values_; }; diff --git a/src/command_data.cc b/src/command_data.cc index c0b7612..80083e1 100644 --- a/src/command_data.cc +++ b/src/command_data.cc @@ -54,154 +54,4 @@ Topology NameToTopology(const std::string& name) { return Topology::kUnknown; } -BlendFactor NameToBlendFactor(const std::string& name) { - if (name == "zero") - return BlendFactor::kZero; - else if (name == "one") - return BlendFactor::kOne; - else if (name == "src_color") - return BlendFactor::kSrcColor; - else if (name == "one_minus_src_color") - return BlendFactor::kOneMinusSrcColor; - else if (name == "dst_color") - return BlendFactor::kDstColor; - else if (name == "one_minus_dst_color") - return BlendFactor::kOneMinusDstColor; - else if (name == "src_alpha") - return BlendFactor::kSrcAlpha; - else if (name == "one_minus_src_alpha") - return BlendFactor::kOneMinusSrcAlpha; - else if (name == "dst_alpha") - return BlendFactor::kDstAlpha; - else if (name == "one_minus_dst_alpha") - return BlendFactor::kOneMinusDstAlpha; - else if (name == "constant_color") - return BlendFactor::kConstantColor; - else if (name == "one_minus_constant_color") - return BlendFactor::kOneMinusConstantColor; - else if (name == "costant_alpha") - return BlendFactor::kConstantAlpha; - else if (name == "one_minus_constant_alpha") - return BlendFactor::kOneMinusConstantAlpha; - else if (name == "src_alpha_saturate") - return BlendFactor::kSrcAlphaSaturate; - else if (name == "src1_color") - return BlendFactor::kSrc1Color; - else if (name == "one_minus_src1_color") - return BlendFactor::kOneMinusSrc1Color; - else if (name == "src1_alpha") - return BlendFactor::kSrc1Alpha; - else if (name == "one_minus_src1_alpha") - return BlendFactor::kOneMinusSrc1Alpha; - else - return BlendFactor::kUnknown; -} - -BlendOp NameToBlendOp(const std::string& name) { - if (name == "add") - return BlendOp::kAdd; - else if (name == "substract") - return BlendOp::kSubtract; - else if (name == "reverse_substract") - return BlendOp::kReverseSubtract; - else if (name == "min") - return BlendOp::kMin; - else if (name == "max") - return BlendOp::kMax; - else if (name == "zero") - return BlendOp::kZero; - else if (name == "src") - return BlendOp::kSrc; - else if (name == "dst") - return BlendOp::kDst; - else if (name == "src_over") - return BlendOp::kSrcOver; - else if (name == "dst_over") - return BlendOp::kDstOver; - else if (name == "src_in") - return BlendOp::kSrcIn; - else if (name == "dst_in") - return BlendOp::kDstIn; - else if (name == "src_out") - return BlendOp::kSrcOut; - else if (name == "dst_out") - return BlendOp::kDstOut; - else if (name == "src_atop") - return BlendOp::kSrcAtop; - else if (name == "dst_atop") - return BlendOp::kDstAtop; - else if (name == "xor") - return BlendOp::kXor; - else if (name == "multiply") - return BlendOp::kMultiply; - else if (name == "screen") - return BlendOp::kScreen; - else if (name == "overlay") - return BlendOp::kOverlay; - else if (name == "darken") - return BlendOp::kDarken; - else if (name == "lighten") - return BlendOp::kLighten; - else if (name == "color_dodge") - return BlendOp::kColorDodge; - else if (name == "color_burn") - return BlendOp::kColorBurn; - else if (name == "hard_light") - return BlendOp::kHardLight; - else if (name == "soft_light") - return BlendOp::kSoftLight; - else if (name == "difference") - return BlendOp::kDifference; - else if (name == "exclusion") - return BlendOp::kExclusion; - else if (name == "invert") - return BlendOp::kInvert; - else if (name == "invert_rgb") - return BlendOp::kInvertRGB; - else if (name == "linear_dodge") - return BlendOp::kLinearDodge; - else if (name == "linear_burn") - return BlendOp::kLinearBurn; - else if (name == "vivid_light") - return BlendOp::kVividLight; - else if (name == "linear_light") - return BlendOp::kLinearLight; - else if (name == "pin_light") - return BlendOp::kPinLight; - else if (name == "hard_mix") - return BlendOp::kHardMix; - else if (name == "hsl_hue") - return BlendOp::kHslHue; - else if (name == "hsl_saturation") - return BlendOp::kHslSaturation; - else if (name == "hsl_color") - return BlendOp::kHslColor; - else if (name == "hsl_luminosity") - return BlendOp::kHslLuminosity; - else if (name == "plus") - return BlendOp::kPlus; - else if (name == "plus_clamped") - return BlendOp::kPlusClamped; - else if (name == "plus_clamped_alpha") - return BlendOp::kPlusClampedAlpha; - else if (name == "plus_darker") - return BlendOp::kPlusDarker; - else if (name == "minus") - return BlendOp::kMinus; - else if (name == "minus_clamped") - return BlendOp::kMinusClamped; - else if (name == "contrast") - return BlendOp::kContrast; - else if (name == "invert_ovg") - return BlendOp::kInvertOvg; - else if (name == "red") - return BlendOp::kRed; - else if (name == "green") - return BlendOp::kGreen; - else if (name == "blue") - return BlendOp::kBlue; - else - return BlendOp::kUnknown; -} - } // namespace amber diff --git a/src/command_data.h b/src/command_data.h index f7e82a2..98ec405 100644 --- a/src/command_data.h +++ b/src/command_data.h @@ -104,8 +104,7 @@ enum class LogicOp : uint8_t { }; enum class BlendOp : uint8_t { - kUnknown = 0, - kAdd, + kAdd = 0, kSubtract, kReverseSubtract, kMin, @@ -159,8 +158,7 @@ enum class BlendOp : uint8_t { }; enum class BlendFactor : uint8_t { - kUnknown = 0, - kZero, + kZero = 0, kOne, kSrcColor, kOneMinusSrcColor, @@ -182,8 +180,6 @@ enum class BlendFactor : uint8_t { }; Topology NameToTopology(const std::string& name); -BlendFactor NameToBlendFactor(const std::string& name); -BlendOp NameToBlendOp(const std::string& name); } // namespace amber diff --git a/src/float16_helper.cc b/src/float16_helper.cc index 5cb35e7..617bd72 100644 --- a/src/float16_helper.cc +++ b/src/float16_helper.cc @@ -15,7 +15,6 @@ #include "src/float16_helper.h" #include <cassert> -#include <cstring> // Float10 // | 9 8 7 6 5 | 4 3 2 1 0 | @@ -76,11 +75,8 @@ float HexFloat16ToFloat(const uint8_t* value) { } uint32_t hex = sign | exponent | mantissa; - float hex_float; - static_assert((sizeof(uint32_t) == sizeof(float)), - "sizeof(uint32_t) != sizeof(float)"); - memcpy(&hex_float, &hex, sizeof(float)); - return hex_float; + float* hex_float = reinterpret_cast<float*>(&hex); + return *hex_float; } // Convert float |value| whose size is 11 bits to 32 bits float @@ -93,11 +89,8 @@ float HexFloat11ToFloat(const uint8_t* value) { uint32_t mantissa = (static_cast<uint32_t>(value[0]) & 0x3f) << 17U; uint32_t hex = exponent | mantissa; - float hex_float; - static_assert((sizeof(uint32_t) == sizeof(float)), - "sizeof(uint32_t) != sizeof(float)"); - memcpy(&hex_float, &hex, sizeof(float)); - return hex_float; + float* hex_float = reinterpret_cast<float*>(&hex); + return *hex_float; } // Convert float |value| whose size is 10 bits to 32 bits float @@ -110,11 +103,8 @@ float HexFloat10ToFloat(const uint8_t* value) { uint32_t mantissa = (static_cast<uint32_t>(value[0]) & 0x1f) << 18U; uint32_t hex = exponent | mantissa; - float hex_float; - static_assert((sizeof(uint32_t) == sizeof(float)), - "sizeof(uint32_t) != sizeof(float)"); - memcpy(&hex_float, &hex, sizeof(float)); - return hex_float; + float* hex_float = reinterpret_cast<float*>(&hex); + return *hex_float; } } // namespace diff --git a/src/pipeline.cc b/src/pipeline.cc index ae3bf0a..55c6bae 100644 --- a/src/pipeline.cc +++ b/src/pipeline.cc @@ -389,18 +389,6 @@ Result Pipeline::AddColorAttachment(Buffer* buf, return {}; } -Result Pipeline::AddResolveTarget(Buffer* buf) { - resolve_targets_.push_back(BufferInfo{buf}); - - auto& info = resolve_targets_.back(); - info.type = BufferType::kResolve; - buf->SetWidth(fb_width_); - buf->SetHeight(fb_height_); - buf->SetElementCount(fb_width_ * fb_height_); - - return {}; -} - Result Pipeline::GetLocationForColorAttachment(Buffer* buf, uint32_t* loc) const { for (const auto& info : color_attachments_) { @@ -528,9 +516,7 @@ void Pipeline::AddBuffer(Buffer* buf, uint32_t descriptor_set, uint32_t binding, uint32_t base_mip_level, - uint32_t dynamic_offset, - uint64_t descriptor_offset, - uint64_t descriptor_range) { + uint32_t dynamic_offset) { buffers_.push_back(BufferInfo{buf}); auto& info = buffers_.back(); @@ -540,8 +526,6 @@ void Pipeline::AddBuffer(Buffer* buf, info.base_mip_level = base_mip_level; info.dynamic_offset = dynamic_offset; info.sampler = buf->GetSampler(); - info.descriptor_offset = descriptor_offset; - info.descriptor_range = descriptor_range; } void Pipeline::AddBuffer(Buffer* buf, @@ -878,7 +862,7 @@ Result Pipeline::GenerateOpenCLPodBuffers() { opencl_pod_buffer_map_.insert( buf_iter, std::make_pair(std::make_pair(descriptor_set, binding), buffer)); - AddBuffer(buffer, buffer_type, descriptor_set, binding, 0, 0, 0, ~0ULL); + AddBuffer(buffer, buffer_type, descriptor_set, binding, 0, 0); } else { buffer = buf_iter->second; } diff --git a/src/pipeline.h b/src/pipeline.h index 9010c59..ec38a3a 100644 --- a/src/pipeline.h +++ b/src/pipeline.h @@ -203,8 +203,6 @@ class Pipeline { uint32_t offset = 0; uint32_t stride = 0; Sampler* sampler = nullptr; - uint64_t descriptor_offset = 0; - uint64_t descriptor_range = ~0ULL; // ~0ULL == VK_WHOLE_SIZE }; /// Information on a sampler attached to the pipeline. @@ -303,14 +301,6 @@ class Pipeline { /// something goes wrong. Result GetLocationForColorAttachment(Buffer* buf, uint32_t* loc) const; - /// Returns a list of all resolve targets in this pipeline. - const std::vector<BufferInfo>& GetResolveTargets() const { - return resolve_targets_; - } - - /// Adds |buf| as a multisample resolve target in the pipeline. - Result AddResolveTarget(Buffer* buf); - /// Sets |buf| as the depth/stencil buffer for this pipeline. Result SetDepthStencilBuffer(Buffer* buf); /// Returns information on the depth/stencil buffer bound to the pipeline. If @@ -345,16 +335,13 @@ class Pipeline { Buffer* GetIndexBuffer() const { return index_buffer_; } /// Adds |buf| of |type| to the pipeline at the given |descriptor_set|, - /// |binding|, |base_mip_level|, |descriptor_offset|, |descriptor_range| and - /// |dynamic_offset|. + /// |binding|, |base_mip_level|, and |dynamic_offset|. void AddBuffer(Buffer* buf, BufferType type, uint32_t descriptor_set, uint32_t binding, uint32_t base_mip_level, - uint32_t dynamic_offset, - uint64_t descriptor_offset, - uint64_t descriptor_range); + uint32_t dynamic_offset); /// Adds |buf| to the pipeline at the given |arg_name|. void AddBuffer(Buffer* buf, BufferType type, const std::string& arg_name); /// Adds |buf| to the pipeline at the given |arg_no|. @@ -444,7 +431,6 @@ class Pipeline { std::string name_; std::vector<ShaderInfo> shaders_; std::vector<BufferInfo> color_attachments_; - std::vector<BufferInfo> resolve_targets_; std::vector<BufferInfo> vertex_buffers_; std::vector<BufferInfo> buffers_; std::vector<std::unique_ptr<type::Type>> types_; diff --git a/src/pipeline_data.h b/src/pipeline_data.h index c763f37..dc67c03 100644 --- a/src/pipeline_data.h +++ b/src/pipeline_data.h @@ -21,15 +21,6 @@ namespace amber { -struct Viewport { - float x; - float y; - float w; - float h; - float mind; - float maxd; -}; - /// Stores information used to configure a pipeline. class PipelineData { public: @@ -170,19 +161,6 @@ class PipelineData { void SetAlphaBlendOp(BlendOp op) { alpha_blend_op_ = op; } BlendOp GetAlphaBlendOp() const { return alpha_blend_op_; } - void SetViewport(const Viewport& v) { - has_viewport_data = true; - vp = v; - } - - bool HasViewportData() const { return has_viewport_data; } - const Viewport& GetViewport() const { return vp; } - - void SetPatchControlPoints(uint32_t control_points) { - patch_control_points_ = control_points; - } - uint32_t GetPatchControlPoints() const { return patch_control_points_; } - private: StencilOp front_fail_op_ = StencilOp::kKeep; StencilOp front_pass_op_ = StencilOp::kKeep; @@ -235,11 +213,6 @@ class PipelineData { float depth_bias_slope_factor_ = 0.0f; float min_depth_bounds_ = 0.0f; float max_depth_bounds_ = 0.0f; - - bool has_viewport_data = false; - Viewport vp; - - uint32_t patch_control_points_ = 3u; }; } // namespace amber diff --git a/src/pipeline_test.cc b/src/pipeline_test.cc index c0d2f67..e16313c 100644 --- a/src/pipeline_test.cc +++ b/src/pipeline_test.cc @@ -262,7 +262,7 @@ TEST_F(PipelineTest, PipelineBufferWithoutFormat) { auto buf = MakeUnique<Buffer>(); buf->SetName("MyBuffer"); - p.AddBuffer(buf.get(), BufferType::kStorage, 0, 0, 0, 0, 0, 0); + p.AddBuffer(buf.get(), BufferType::kStorage, 0, 0, 0, 0); Result r = p.Validate(); EXPECT_FALSE(r.IsSuccess()) << r.Error(); @@ -365,11 +365,11 @@ TEST_F(PipelineTest, Clone) { auto buf1 = MakeUnique<Buffer>(); buf1->SetName("buf1"); - p.AddBuffer(buf1.get(), BufferType::kStorage, 1, 1, 0, 0, 0, 0); + p.AddBuffer(buf1.get(), BufferType::kStorage, 1, 1, 0, 0); auto buf2 = MakeUnique<Buffer>(); buf2->SetName("buf2"); - p.AddBuffer(buf2.get(), BufferType::kStorage, 1, 2, 0, 16, 256, 512); + p.AddBuffer(buf2.get(), BufferType::kStorage, 1, 2, 0, 16); auto clone = p.Clone(); EXPECT_EQ("", clone->GetName()); @@ -400,15 +400,11 @@ TEST_F(PipelineTest, Clone) { EXPECT_EQ(1U, bufs[0].descriptor_set); EXPECT_EQ(1U, bufs[0].binding); EXPECT_EQ(0U, bufs[0].dynamic_offset); - EXPECT_EQ(0U, bufs[0].descriptor_offset); - EXPECT_EQ(0U, bufs[0].descriptor_range); EXPECT_EQ("buf2", bufs[1].buffer->GetName()); EXPECT_EQ(1U, bufs[1].descriptor_set); EXPECT_EQ(2U, bufs[1].binding); EXPECT_EQ(16U, bufs[1].dynamic_offset); - EXPECT_EQ(256U, bufs[1].descriptor_offset); - EXPECT_EQ(512U, bufs[1].descriptor_range); } TEST_F(PipelineTest, OpenCLUpdateBindings) { diff --git a/src/script.cc b/src/script.cc index 8da8f11..7d7483f 100644 --- a/src/script.cc +++ b/src/script.cc @@ -114,21 +114,7 @@ bool Script::IsKnownFeature(const std::string& name) const { name == "Storage16BitFeatures.storagePushConstant16" || name == "Storage16BitFeatures.storageInputOutput16" || name == "SubgroupSizeControl.subgroupSizeControl" || - name == "SubgroupSizeControl.computeFullSubgroups" || - name == "SubgroupSupportedOperations.basic" || - name == "SubgroupSupportedOperations.vote" || - name == "SubgroupSupportedOperations.arithmetic" || - name == "SubgroupSupportedOperations.ballot" || - name == "SubgroupSupportedOperations.shuffle" || - name == "SubgroupSupportedOperations.shuffleRelative" || - name == "SubgroupSupportedOperations.clustered" || - name == "SubgroupSupportedOperations.quad" || - name == "SubgroupSupportedStages.vertex" || - name == "SubgroupSupportedStages.tessellationControl" || - name == "SubgroupSupportedStages.tessellationEvaluation" || - name == "SubgroupSupportedStages.geometry" || - name == "SubgroupSupportedStages.fragment" || - name == "SubgroupSupportedStages.compute"; + name == "SubgroupSizeControl.computeFullSubgroups"; } type::Type* Script::ParseType(const std::string& str) { diff --git a/src/vkscript/command_parser.cc b/src/vkscript/command_parser.cc index 610c7e6..0953344 100644 --- a/src/vkscript/command_parser.cc +++ b/src/vkscript/command_parser.cc @@ -577,8 +577,7 @@ Result CommandParser::ProcessSSBO() { buffer = b.get(); script_->AddBuffer(std::move(b)); pipeline_->ClearBuffers(set, binding); - pipeline_->AddBuffer(buffer, BufferType::kStorage, set, binding, 0, 0, 0, - ~0ULL); + pipeline_->AddBuffer(buffer, BufferType::kStorage, set, binding, 0, 0); } cmd->SetBuffer(buffer); } @@ -730,8 +729,7 @@ Result CommandParser::ProcessUniform() { buffer = b.get(); script_->AddBuffer(std::move(b)); pipeline_->ClearBuffers(set, binding); - pipeline_->AddBuffer(buffer, BufferType::kUniform, set, binding, 0, 0, 0, - ~0ULL); + pipeline_->AddBuffer(buffer, BufferType::kUniform, set, binding, 0, 0); } cmd->SetBuffer(buffer); diff --git a/src/vulkan/CMakeLists.txt b/src/vulkan/CMakeLists.txt index 37bdd1f..b633c71 100644 --- a/src/vulkan/CMakeLists.txt +++ b/src/vulkan/CMakeLists.txt @@ -43,13 +43,6 @@ target_include_directories(libamberenginevulkan PRIVATE "${CMAKE_BINARY_DIR}") # Add the Vulkan include directory to the list of include paths. target_include_directories(libamberenginevulkan PRIVATE "${VulkanHeaders_INCLUDE_DIR}") -# When building with dEQP Vulkan CTS the inl files needs to be included and a dependency -# must be added to the target `deqp-vk-inl` that generates the inl files. -if (${VULKAN_CTS_HEADER} AND DEFINED AMBER_CTS_INL_DIR) - target_include_directories(libamberenginevulkan PRIVATE "${AMBER_CTS_INL_DIR}") - add_dependencies(libamberenginevulkan deqp-vk-inl) -endif() - set_target_properties(libamberenginevulkan PROPERTIES OUTPUT_NAME "amberenginevulkan" ) @@ -59,7 +52,7 @@ endif() if(${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") # vulkan/vulkan.h defines VK_NULL_HANDLE as 0u and that also serves as a null pointer. - # Disable Clang's warning that will always fire on that. This is required to build + # Disable Clang's warning that will alwaays fire on that. This is required to build # with XCode 10. target_compile_options(libamberenginevulkan PRIVATE -Wno-zero-as-null-pointer-constant) endif() diff --git a/src/vulkan/buffer_backed_descriptor.cc b/src/vulkan/buffer_backed_descriptor.cc index a2e874d..2f7aa98 100644 --- a/src/vulkan/buffer_backed_descriptor.cc +++ b/src/vulkan/buffer_backed_descriptor.cc @@ -26,64 +26,92 @@ BufferBackedDescriptor::BufferBackedDescriptor(Buffer* buffer, DescriptorType type, Device* device, uint32_t desc_set, - uint32_t binding, - Pipeline* pipeline) - : Descriptor(type, device, desc_set, binding), pipeline_(pipeline) { + uint32_t binding) + : Descriptor(type, device, desc_set, binding) { AddAmberBuffer(buffer); } BufferBackedDescriptor::~BufferBackedDescriptor() = default; -Result BufferBackedDescriptor::RecordCopyBufferDataToTransferResourceIfNeeded( - CommandBuffer* command_buffer, - Buffer* buffer, - Resource* transfer_resource) { - transfer_resource->UpdateMemoryWithRawData(*buffer->ValuePtr()); - // If the resource is read-only, keep the buffer data; Amber won't copy - // read-only resources back into the host buffers, so it makes sense to - // leave the buffer intact. - if (!transfer_resource->IsReadOnly()) - buffer->ValuePtr()->clear(); - - transfer_resource->CopyToDevice(command_buffer); +Result BufferBackedDescriptor::RecordCopyDataToResourceIfNeeded( + CommandBuffer* command) { + auto resources = GetResources(); + auto buffers = GetAmberBuffers(); + if (resources.size() != buffers.size()) + return Result( + "Vulkan: BufferBackedDescriptor::RecordCopyDataToResourceIfNeeded() " + "resource and buffer vector sizes are not matching"); + + for (size_t i = 0; i < resources.size(); i++) { + if (!buffers[i]->ValuePtr()->empty()) { + resources[i]->UpdateMemoryWithRawData(*buffers[i]->ValuePtr()); + // If the resource is read-only, keep the buffer data; Amber won't copy + // read-only resources back into the host buffers, so it makes sense to + // leave the buffer intact. + if (!IsReadOnly()) + buffers[i]->ValuePtr()->clear(); + } + + resources[i]->CopyToDevice(command); + } + return {}; } -Result BufferBackedDescriptor::RecordCopyTransferResourceToHost( - CommandBuffer* command_buffer, - Resource* transfer_resource) { - if (!transfer_resource->IsReadOnly()) { - transfer_resource->CopyToHost(command_buffer); +Result BufferBackedDescriptor::RecordCopyDataToHost(CommandBuffer* command) { + if (!IsReadOnly()) { + if (GetResources().empty()) { + return Result( + "Vulkan: BufferBackedDescriptor::RecordCopyDataToHost() no transfer " + "resources"); + } + + for (const auto& r : GetResources()) + r->CopyToHost(command); } return {}; } -Result BufferBackedDescriptor::MoveTransferResourceToBufferOutput( - Resource* transfer_resource, - Buffer* buffer) { - // No need to move read only resources to an output buffer. - if (transfer_resource->IsReadOnly()) { +Result BufferBackedDescriptor::MoveResourceToBufferOutput() { + // No need to copy results of read only resources. + if (IsReadOnly()) return {}; - } - void* resource_memory_ptr = transfer_resource->HostAccessibleMemoryPtr(); - if (!resource_memory_ptr) { + auto resources = GetResources(); + auto buffers = GetAmberBuffers(); + if (resources.size() != buffers.size()) return Result( - "Vulkan: BufferBackedDescriptor::MoveTransferResourceToBufferOutput() " - "no host accessible memory pointer"); - } + "Vulkan: BufferBackedDescriptor::MoveResourceToBufferOutput() resource " + "and buffer vector sizes are not matching"); - if (!buffer->ValuePtr()->empty()) { + if (resources.empty()) { return Result( - "Vulkan: BufferBackedDescriptor::MoveTransferResourceToBufferOutput() " - "output buffer is not empty"); + "Vulkan: BufferBackedDescriptor::MoveResourceToBufferOutput() no " + "transfer resource"); } - auto size_in_bytes = transfer_resource->GetSizeInBytes(); - buffer->SetElementCount(size_in_bytes / buffer->GetFormat()->SizeInBytes()); - buffer->ValuePtr()->resize(size_in_bytes); - std::memcpy(buffer->ValuePtr()->data(), resource_memory_ptr, size_in_bytes); + for (size_t i = 0; i < resources.size(); i++) { + void* resource_memory_ptr = resources[i]->HostAccessibleMemoryPtr(); + if (!resource_memory_ptr) { + return Result( + "Vulkan: BufferBackedDescriptor::MoveResourceToBufferOutput() " + "no host accessible memory pointer"); + } + + if (!buffers[i]->ValuePtr()->empty()) { + return Result( + "Vulkan: BufferBackedDescriptor::MoveResourceToBufferOutput() " + "output buffer is not empty"); + } + + auto size_in_bytes = resources[i]->GetSizeInBytes(); + buffers[i]->SetElementCount(size_in_bytes / + buffers[i]->GetFormat()->SizeInBytes()); + buffers[i]->ValuePtr()->resize(size_in_bytes); + std::memcpy(buffers[i]->ValuePtr()->data(), resource_memory_ptr, + size_in_bytes); + } return {}; } diff --git a/src/vulkan/buffer_backed_descriptor.h b/src/vulkan/buffer_backed_descriptor.h index 8a2d0a5..c626dd8 100644 --- a/src/vulkan/buffer_backed_descriptor.h +++ b/src/vulkan/buffer_backed_descriptor.h @@ -16,7 +16,6 @@ #define SRC_VULKAN_BUFFER_BACKED_DESCRIPTOR_H_ #include <memory> -#include <utility> #include <vector> #include "amber/result.h" @@ -25,7 +24,6 @@ #include "src/buffer.h" #include "src/engine.h" #include "src/vulkan/descriptor.h" -#include "src/vulkan/pipeline.h" #include "src/vulkan/resource.h" namespace amber { @@ -37,19 +35,13 @@ class BufferBackedDescriptor : public Descriptor { DescriptorType type, Device* device, uint32_t desc_set, - uint32_t binding, - Pipeline* pipeline); + uint32_t binding); ~BufferBackedDescriptor() override; Result CreateResourceIfNeeded() override { return {}; } - static Result RecordCopyBufferDataToTransferResourceIfNeeded( - CommandBuffer* command_buffer, - Buffer* buffer, - Resource* transfer_resource); - static Result RecordCopyTransferResourceToHost(CommandBuffer* command_buffer, - Resource* transfer_resource); - static Result MoveTransferResourceToBufferOutput(Resource* transfer_resource, - Buffer* buffer); + Result RecordCopyDataToResourceIfNeeded(CommandBuffer* command) override; + Result RecordCopyDataToHost(CommandBuffer* command) override; + Result MoveResourceToBufferOutput() override; uint32_t GetDescriptorCount() override { return static_cast<uint32_t>(amber_buffers_.size()); } @@ -59,8 +51,7 @@ class BufferBackedDescriptor : public Descriptor { bool IsReadOnly() const; protected: - // Pipeline where this descriptor is attached to. - Pipeline* pipeline_; + virtual std::vector<Resource*> GetResources() = 0; private: std::vector<Buffer*> amber_buffers_; diff --git a/src/vulkan/buffer_descriptor.cc b/src/vulkan/buffer_descriptor.cc index d60ce08..510565d 100644 --- a/src/vulkan/buffer_descriptor.cc +++ b/src/vulkan/buffer_descriptor.cc @@ -14,8 +14,6 @@ #include "src/vulkan/buffer_descriptor.h" -#include <algorithm> -#include <utility> #include <vector> #include "src/make_unique.h" @@ -29,63 +27,58 @@ BufferDescriptor::BufferDescriptor(Buffer* buffer, DescriptorType type, Device* device, uint32_t desc_set, - uint32_t binding, - Pipeline* pipeline) - : BufferBackedDescriptor(buffer, - type, - device, - desc_set, - binding, - pipeline) {} + uint32_t binding) + : BufferBackedDescriptor(buffer, type, device, desc_set, binding) {} BufferDescriptor::~BufferDescriptor() = default; Result BufferDescriptor::CreateResourceIfNeeded() { - auto& transfer_resources = pipeline_->GetDescriptorTransferResources(); - - VkBufferUsageFlags flags = - VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; - if (IsUniformBuffer() || IsUniformBufferDynamic()) { - flags |= VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT; - } else if (IsStorageBuffer() || IsStorageBufferDynamic()) { - flags |= VK_BUFFER_USAGE_STORAGE_BUFFER_BIT; - } else if (IsUniformTexelBuffer()) { - flags |= VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT; - } else if (IsStorageTexelBuffer()) { - flags |= VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT; - } else { - return Result("Unexpected buffer type when deciding usage flags"); + if (!transfer_buffers_.empty()) { + return Result( + "Vulkan: BufferDescriptor::CreateResourceIfNeeded() must be called " + "only when |transfer_buffers| is empty"); } + transfer_buffers_.reserve(GetAmberBuffers().size()); + for (const auto& amber_buffer : GetAmberBuffers()) { - // Create (but don't initialize) the transfer buffer if not already created. - if (transfer_resources.count(amber_buffer) == 0) { - auto size_in_bytes = - static_cast<uint32_t>(amber_buffer->ValuePtr()->size()); - auto transfer_buffer = MakeUnique<TransferBuffer>( - device_, size_in_bytes, amber_buffer->GetFormat()); - transfer_buffer->SetReadOnly(IsReadOnly()); - transfer_resources[amber_buffer] = std::move(transfer_buffer); + if (amber_buffer->ValuePtr()->empty()) + continue; + + uint32_t size_in_bytes = + amber_buffer ? static_cast<uint32_t>(amber_buffer->ValuePtr()->size()) + : 0; + transfer_buffers_.emplace_back(MakeUnique<TransferBuffer>( + device_, size_in_bytes, amber_buffer->GetFormat())); + VkBufferUsageFlags flags = + VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; + if (IsUniformBuffer() || IsUniformBufferDynamic()) { + flags |= VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT; + } else if (IsStorageBuffer() || IsStorageBufferDynamic()) { + flags |= VK_BUFFER_USAGE_STORAGE_BUFFER_BIT; + } else if (IsUniformTexelBuffer()) { + flags |= VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT; + } else if (IsStorageTexelBuffer()) { + flags |= VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT; } else { - // Unset transfer buffer's read only property if needed. - if (!IsReadOnly()) { - transfer_resources[amber_buffer]->SetReadOnly(false); - } + return Result("Unexpected buffer type when deciding usage flags"); } - // Update the buffer create flags. - Result r = - transfer_resources[amber_buffer]->AsTransferBuffer()->AddUsageFlags( - flags); + Result r = transfer_buffers_.back()->Initialize(flags); if (!r.IsSuccess()) return r; } + is_descriptor_set_update_needed_ = true; + return {}; +} - descriptor_offsets_.reserve(GetAmberBuffers().size()); - descriptor_ranges_.reserve(GetAmberBuffers().size()); +Result BufferDescriptor::MoveResourceToBufferOutput() { + Result r = BufferBackedDescriptor::MoveResourceToBufferOutput(); - return {}; + transfer_buffers_.clear(); + + return r; } void BufferDescriptor::UpdateDescriptorSetIfNeeded( @@ -96,35 +89,12 @@ void BufferDescriptor::UpdateDescriptorSetIfNeeded( std::vector<VkDescriptorBufferInfo> buffer_infos; std::vector<VkBufferView> buffer_views; - // Create VkDescriptorBufferInfo for every descriptor buffer. - for (uint32_t i = 0; i < GetAmberBuffers().size(); i++) { - const auto& buffer = - pipeline_->GetDescriptorTransferResources()[GetAmberBuffers()[i]] - ->AsTransferBuffer(); - assert(buffer->GetVkBuffer() && "Unexpected descriptor type"); - // Add buffer infos for uniform and storage buffers. - if (IsUniformBuffer() || IsUniformBufferDynamic() || IsStorageBuffer() || - IsStorageBufferDynamic()) { - uint64_t range = descriptor_ranges_[i]; - // If dynamic offset is used, we must change range with VK_WHOLE_SIZE to - // an actual range. - // From vulkan spec: For each dynamic uniform or storage buffer binding in - // pDescriptorSets, the sum of the effective offset, as defined above, and - // the range of the binding must be less than or equal to the size of the - // buffer. - if ((IsUniformBufferDynamic() || IsStorageBufferDynamic()) && - descriptor_ranges_[i] == VK_WHOLE_SIZE) { - range = buffer->GetSizeInBytes() - dynamic_offsets_[i] - - descriptor_offsets_[i]; - } - - VkDescriptorBufferInfo buffer_info; - buffer_info.buffer = buffer->GetVkBuffer(); - buffer_info.offset = descriptor_offsets_[i]; - buffer_info.range = range; - - buffer_infos.push_back(buffer_info); - } + for (const auto& buffer : transfer_buffers_) { + VkDescriptorBufferInfo buffer_info; + buffer_info.buffer = buffer->GetVkBuffer(); + buffer_info.offset = 0; + buffer_info.range = VK_WHOLE_SIZE; + buffer_infos.push_back(buffer_info); if (IsUniformTexelBuffer() || IsStorageTexelBuffer()) { buffer_views.push_back(*buffer->GetVkBufferView()); @@ -136,7 +106,7 @@ void BufferDescriptor::UpdateDescriptorSetIfNeeded( write.dstSet = descriptor_set; write.dstBinding = binding_; write.dstArrayElement = 0; - write.descriptorCount = static_cast<uint32_t>(GetAmberBuffers().size()); + write.descriptorCount = static_cast<uint32_t>(buffer_infos.size()); write.descriptorType = GetVkDescriptorType(); write.pBufferInfo = buffer_infos.data(); write.pTexelBufferView = buffer_views.data(); @@ -146,5 +116,13 @@ void BufferDescriptor::UpdateDescriptorSetIfNeeded( is_descriptor_set_update_needed_ = false; } +std::vector<Resource*> BufferDescriptor::GetResources() { + std::vector<Resource*> ret; + for (auto& b : transfer_buffers_) { + ret.push_back(b.get()); + } + return ret; +} + } // namespace vulkan } // namespace amber diff --git a/src/vulkan/buffer_descriptor.h b/src/vulkan/buffer_descriptor.h index 439afa5..d481ae5 100644 --- a/src/vulkan/buffer_descriptor.h +++ b/src/vulkan/buffer_descriptor.h @@ -16,8 +16,6 @@ #define SRC_VULKAN_BUFFER_DESCRIPTOR_H_ #include <memory> -#include <unordered_map> -#include <utility> #include <vector> #include "amber/result.h" @@ -26,7 +24,6 @@ #include "src/buffer.h" #include "src/engine.h" #include "src/vulkan/buffer_backed_descriptor.h" -#include "src/vulkan/pipeline.h" #include "src/vulkan/transfer_buffer.h" namespace amber { @@ -43,35 +40,24 @@ class BufferDescriptor : public BufferBackedDescriptor { DescriptorType type, Device* device, uint32_t desc_set, - uint32_t binding, - vulkan::Pipeline* pipeline); + uint32_t binding); ~BufferDescriptor() override; void UpdateDescriptorSetIfNeeded(VkDescriptorSet descriptor_set) override; Result CreateResourceIfNeeded() override; + Result MoveResourceToBufferOutput() override; std::vector<uint32_t> GetDynamicOffsets() override { return dynamic_offsets_; } void AddDynamicOffset(uint32_t offset) { dynamic_offsets_.push_back(offset); } - std::vector<uint64_t> GetDescriptorOffsets() override { - return descriptor_offsets_; - } - void AddDescriptorOffset(uint64_t descriptor_offset) { - descriptor_offsets_.push_back(descriptor_offset); - } - std::vector<uint64_t> GetDescriptorRanges() override { - return descriptor_ranges_; - } - void AddDescriptorRange(uint64_t descriptor_range) { - descriptor_ranges_.push_back(descriptor_range); - } - BufferDescriptor* AsBufferDescriptor() override { return this; } + protected: + std::vector<Resource*> GetResources() override; + private: + std::vector<std::unique_ptr<TransferBuffer>> transfer_buffers_; std::vector<uint32_t> dynamic_offsets_; - std::vector<VkDeviceSize> descriptor_offsets_; - std::vector<VkDeviceSize> descriptor_ranges_; }; } // namespace vulkan diff --git a/src/vulkan/command_buffer.cc b/src/vulkan/command_buffer.cc index 765ef94..2843667 100644 --- a/src/vulkan/command_buffer.cc +++ b/src/vulkan/command_buffer.cc @@ -108,6 +108,7 @@ Result CommandBuffer::SubmitAndReset(uint32_t timeout_ms) { void CommandBuffer::Reset() { if (guarded_) { + device_->GetPtrs()->vkEndCommandBuffer(command_); device_->GetPtrs()->vkResetCommandBuffer(command_, 0); guarded_ = false; } diff --git a/src/vulkan/descriptor.h b/src/vulkan/descriptor.h index 88f6813..ba702ff 100644 --- a/src/vulkan/descriptor.h +++ b/src/vulkan/descriptor.h @@ -31,7 +31,6 @@ namespace vulkan { class CommandBuffer; class Device; class BufferDescriptor; -class ImageDescriptor; class BufferBackedDescriptor; class SamplerDescriptor; @@ -58,12 +57,14 @@ class Descriptor { virtual void UpdateDescriptorSetIfNeeded(VkDescriptorSet descriptor_set) = 0; virtual Result CreateResourceIfNeeded() = 0; + virtual Result RecordCopyDataToResourceIfNeeded(CommandBuffer*) { return {}; } + virtual Result RecordCopyDataToHost(CommandBuffer*) { return {}; } + virtual Result MoveResourceToBufferOutput() { return {}; } + virtual Result SetSizeInElements(uint32_t) { return {}; } + virtual Result AddToBuffer(const std::vector<Value>&, uint32_t) { return {}; } virtual uint32_t GetDescriptorCount() { return 1; } virtual std::vector<uint32_t> GetDynamicOffsets() { return {}; } - virtual std::vector<VkDeviceSize> GetDescriptorOffsets() { return {}; } - virtual std::vector<VkDeviceSize> GetDescriptorRanges() { return {}; } virtual BufferDescriptor* AsBufferDescriptor() { return nullptr; } - virtual ImageDescriptor* AsImageDescriptor() { return nullptr; } virtual BufferBackedDescriptor* AsBufferBackedDescriptor() { return nullptr; } virtual SamplerDescriptor* AsSamplerDescriptor() { return nullptr; } uint32_t GetDescriptorSet() const { return descriptor_set_; } diff --git a/src/vulkan/device.cc b/src/vulkan/device.cc index d951f49..22cd77a 100644 --- a/src/vulkan/device.cc +++ b/src/vulkan/device.cc @@ -53,36 +53,6 @@ const char k16BitStorage_InputOutput[] = const char kSubgroupSizeControl[] = "SubgroupSizeControl.subgroupSizeControl"; const char kComputeFullSubgroups[] = "SubgroupSizeControl.computeFullSubgroups"; -const char kSubgroupSupportedOperations[] = "SubgroupSupportedOperations"; -const char kSubgroupSupportedOperationsBasic[] = - "SubgroupSupportedOperations.basic"; -const char kSubgroupSupportedOperationsVote[] = - "SubgroupSupportedOperations.vote"; -const char kSubgroupSupportedOperationsArithmetic[] = - "SubgroupSupportedOperations.arithmetic"; -const char kSubgroupSupportedOperationsBallot[] = - "SubgroupSupportedOperations.ballot"; -const char kSubgroupSupportedOperationsShuffle[] = - "SubgroupSupportedOperations.shuffle"; -const char kSubgroupSupportedOperationsShuffleRelative[] = - "SubgroupSupportedOperations.shuffleRelative"; -const char kSubgroupSupportedOperationsClustered[] = - "SubgroupSupportedOperations.clustered"; -const char kSubgroupSupportedOperationsQuad[] = - "SubgroupSupportedOperations.quad"; -const char kSubgroupSupportedStages[] = "SubgroupSupportedStages"; -const char kSubgroupSupportedStagesVertex[] = "SubgroupSupportedStages.vertex"; -const char kSubgroupSupportedStagesTessellationControl[] = - "SubgroupSupportedStages.tessellationControl"; -const char kSubgroupSupportedStagesTessellationEvaluation[] = - "SubgroupSupportedStages.tessellationEvaluation"; -const char kSubgroupSupportedStagesGeometry[] = - "SubgroupSupportedStages.geometry"; -const char kSubgroupSupportedStagesFragment[] = - "SubgroupSupportedStages.fragment"; -const char kSubgroupSupportedStagesCompute[] = - "SubgroupSupportedStages.compute"; - struct BaseOutStructure { VkStructureType sType; void* pNext; @@ -467,7 +437,6 @@ Result Device::Initialize( VkPhysicalDevice16BitStorageFeaturesKHR* storage16_ptrs = nullptr; VkPhysicalDeviceVulkan11Features* vulkan11_ptrs = nullptr; VkPhysicalDeviceVulkan12Features* vulkan12_ptrs = nullptr; - VkPhysicalDeviceVulkan13Features* vulkan13_ptrs = nullptr; VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* subgroup_size_control_features = nullptr; void* ptr = available_features2.pNext; @@ -500,9 +469,6 @@ Result Device::Initialize( case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: vulkan12_ptrs = static_cast<VkPhysicalDeviceVulkan12Features*>(ptr); break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES: - vulkan13_ptrs = static_cast<VkPhysicalDeviceVulkan13Features*>(ptr); - break; default: break; } @@ -547,7 +513,7 @@ Result Device::Initialize( "Shader 8-bit storage requested but feature not returned"); } if ((feature == kSubgroupSizeControl || feature == kComputeFullSubgroups) && - subgroup_size_control_features == nullptr && vulkan13_ptrs == nullptr) { + subgroup_size_control_features == nullptr) { return amber::Result("Missing subgroup size control features"); } @@ -656,25 +622,13 @@ Result Device::Initialize( } } - // If Vulkan 1.3 structure exists the features are set there. - if (vulkan13_ptrs) { - if (feature == kSubgroupSizeControl && - vulkan13_ptrs->subgroupSizeControl != VK_TRUE) { - return amber::Result("Missing subgroup size control feature"); - } - if (feature == kComputeFullSubgroups && - vulkan13_ptrs->computeFullSubgroups != VK_TRUE) { - return amber::Result("Missing compute full subgroups feature"); - } - } else { - if (feature == kSubgroupSizeControl && - subgroup_size_control_features->subgroupSizeControl != VK_TRUE) { - return amber::Result("Missing subgroup size control feature"); - } - if (feature == kComputeFullSubgroups && - subgroup_size_control_features->computeFullSubgroups != VK_TRUE) { - return amber::Result("Missing compute full subgroups feature"); - } + if (feature == kSubgroupSizeControl && + subgroup_size_control_features->subgroupSizeControl != VK_TRUE) { + return amber::Result("Missing subgroup size control feature"); + } + if (feature == kComputeFullSubgroups && + subgroup_size_control_features->computeFullSubgroups != VK_TRUE) { + return amber::Result("Missing compute full subgroups feature"); } } @@ -693,153 +647,19 @@ Result Device::Initialize( std::find(required_features.begin(), required_features.end(), kSubgroupSizeControl) != required_features.end(); - bool needs_subgroup_supported_operations = false; - bool needs_subgroup_supported_stages = false; - - // Search for subgroup supported operations requirements. - for (const auto& feature : required_features) - if (feature.find(kSubgroupSupportedOperations) != std::string::npos) - needs_subgroup_supported_operations = true; - - // Search for subgroup supported stages requirements. - for (const auto& feature : required_features) - if (feature.find(kSubgroupSupportedStages) != std::string::npos) - needs_subgroup_supported_stages = true; - - const bool needs_subgroup_properties = - needs_subgroup_supported_operations || needs_subgroup_supported_stages; - - if (needs_subgroup_size_control || needs_subgroup_properties) { - // Always chain all physical device properties structs in case at least one - // of them is needed. + if (needs_subgroup_size_control) { VkPhysicalDeviceProperties2 properties2 = {}; - VkPhysicalDeviceSubgroupProperties subgroup_properties = {}; - VkPhysicalDeviceVulkan11Properties vulkan11_properties = {}; - VkSubgroupFeatureFlags subgroup_supported_operations; - VkShaderStageFlags subgroup_supported_stages; properties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2; properties2.pNext = &subgroup_size_control_properties_; subgroup_size_control_properties_.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT; - if (SupportsApiVersion(1, 2, 0)) { - subgroup_size_control_properties_.pNext = &vulkan11_properties; - vulkan11_properties.sType = - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES; - } else { - subgroup_size_control_properties_.pNext = &subgroup_properties; - subgroup_properties.sType = - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES; - } - if (needs_subgroup_size_control && !SupportsApiVersion(1, 1, 0)) { + if (!SupportsApiVersion(1, 1, 0)) { return Result( "Vulkan: Device::Initialize subgroup size control feature also " "requires an API version of 1.1 or higher"); } - if (needs_subgroup_properties && !SupportsApiVersion(1, 1, 0)) { - return Result( - "Vulkan: Device::Initialize subgroup properties also " - "requires an API version of 1.1 or higher"); - } ptrs_.vkGetPhysicalDeviceProperties2(physical_device_, &properties2); - - if (needs_subgroup_supported_operations) { - // Read supported subgroup operations from the correct struct depending on - // the device API - if (SupportsApiVersion(1, 2, 0)) { - subgroup_supported_operations = - vulkan11_properties.subgroupSupportedOperations; - } else { - subgroup_supported_operations = subgroup_properties.supportedOperations; - } - - for (const auto& feature : required_features) { - if (feature == kSubgroupSupportedOperationsBasic && - !(subgroup_supported_operations & VK_SUBGROUP_FEATURE_BASIC_BIT)) { - return amber::Result("Missing subgroup operation basic feature"); - } - if (feature == kSubgroupSupportedOperationsVote && - !(subgroup_supported_operations & VK_SUBGROUP_FEATURE_VOTE_BIT)) { - return amber::Result("Missing subgroup operation vote feature"); - } - if (feature == kSubgroupSupportedOperationsArithmetic && - !(subgroup_supported_operations & - VK_SUBGROUP_FEATURE_ARITHMETIC_BIT)) { - return amber::Result("Missing subgroup operation arithmetic feature"); - } - if (feature == kSubgroupSupportedOperationsBallot && - !(subgroup_supported_operations & VK_SUBGROUP_FEATURE_BALLOT_BIT)) { - return amber::Result("Missing subgroup operation ballot feature"); - } - if (feature == kSubgroupSupportedOperationsShuffle && - !(subgroup_supported_operations & - VK_SUBGROUP_FEATURE_SHUFFLE_BIT)) { - return amber::Result("Missing subgroup operation shuffle feature"); - } - if (feature == kSubgroupSupportedOperationsShuffleRelative && - !(subgroup_supported_operations & - VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT)) { - return amber::Result( - "Missing subgroup operation shuffle relative feature"); - } - if (feature == kSubgroupSupportedOperationsClustered && - !(subgroup_supported_operations & - VK_SUBGROUP_FEATURE_CLUSTERED_BIT)) { - return amber::Result("Missing subgroup operation clustered feature"); - } - if (feature == kSubgroupSupportedOperationsQuad && - !(subgroup_supported_operations & VK_SUBGROUP_FEATURE_QUAD_BIT)) { - return amber::Result("Missing subgroup operation quad feature"); - } - } - } - - if (needs_subgroup_supported_stages) { - // Read supported subgroup stages from the correct struct depending on the - // device API - if (SupportsApiVersion(1, 2, 0)) { - subgroup_supported_stages = vulkan11_properties.subgroupSupportedStages; - } else { - subgroup_supported_stages = subgroup_properties.supportedStages; - } - - for (const auto& feature : required_features) { - if (feature == kSubgroupSupportedStagesVertex && - !(subgroup_supported_stages & VK_SHADER_STAGE_VERTEX_BIT)) { - return amber::Result( - "Subgroup operations not supported for vertex shader stage"); - } - if (feature == kSubgroupSupportedStagesTessellationControl && - !(subgroup_supported_stages & - VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT)) { - return amber::Result( - "Subgroup operations not supported for tessellation control " - "shader stage"); - } - if (feature == kSubgroupSupportedStagesTessellationEvaluation && - !(subgroup_supported_stages & - VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT)) { - return amber::Result( - "Subgroup operations not supported for tessellation evaluation " - "shader stage"); - } - if (feature == kSubgroupSupportedStagesGeometry && - !(subgroup_supported_stages & VK_SHADER_STAGE_GEOMETRY_BIT)) { - return amber::Result( - "Subgroup operations not supported for geometry shader stage"); - } - if (feature == kSubgroupSupportedStagesFragment && - !(subgroup_supported_stages & VK_SHADER_STAGE_FRAGMENT_BIT)) { - return amber::Result( - "Subgroup operations not supported for fragment shader stage"); - } - if (feature == kSubgroupSupportedStagesCompute && - !(subgroup_supported_stages & VK_SHADER_STAGE_COMPUTE_BIT)) { - return amber::Result( - "Subgroup operations not supported for compute shader stage"); - } - } - } } return {}; @@ -856,7 +676,6 @@ bool Device::IsFormatSupportedByPhysicalDevice(const Format& format, bool is_buffer_type_image = false; switch (type) { case BufferType::kColor: - case BufferType::kResolve: case BufferType::kStorageImage: flag = VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT; is_buffer_type_image = true; diff --git a/src/vulkan/engine_vulkan.cc b/src/vulkan/engine_vulkan.cc index 1ed60f4..536993f 100644 --- a/src/vulkan/engine_vulkan.cc +++ b/src/vulkan/engine_vulkan.cc @@ -177,11 +177,8 @@ Result EngineVulkan::CreatePipeline(amber::Pipeline* pipeline) { } else { vk_pipeline = MakeUnique<GraphicsPipeline>( device_.get(), pipeline->GetColorAttachments(), - pipeline->GetDepthStencilBuffer(), pipeline->GetResolveTargets(), - engine_data.fence_timeout_ms, stage_create_info); - - vk_pipeline->AsGraphics()->SetPatchControlPoints( - pipeline->GetPipelineData()->GetPatchControlPoints()); + pipeline->GetDepthStencilBuffer(), engine_data.fence_timeout_ms, + stage_create_info); r = vk_pipeline->AsGraphics()->Initialize(pipeline->GetFramebufferWidth(), pipeline->GetFramebufferHeight(), @@ -257,8 +254,6 @@ Result EngineVulkan::CreatePipeline(amber::Pipeline* pipeline) { cmd->SetBinding(buf_info.binding); cmd->SetBaseMipLevel(buf_info.base_mip_level); cmd->SetDynamicOffset(buf_info.dynamic_offset); - cmd->SetDescriptorOffset(buf_info.descriptor_offset); - cmd->SetDescriptorRange(buf_info.descriptor_range); cmd->SetBuffer(buf_info.buffer); cmd->SetSampler(buf_info.sampler); diff --git a/src/vulkan/frame_buffer.cc b/src/vulkan/frame_buffer.cc index b6ad13a..47eb82d 100644 --- a/src/vulkan/frame_buffer.cc +++ b/src/vulkan/frame_buffer.cc @@ -30,12 +30,10 @@ FrameBuffer::FrameBuffer( Device* device, const std::vector<const amber::Pipeline::BufferInfo*>& color_attachments, amber::Pipeline::BufferInfo depth_stencil_attachment, - const std::vector<const amber::Pipeline::BufferInfo*>& resolve_targets, uint32_t width, uint32_t height) : device_(device), color_attachments_(color_attachments), - resolve_targets_(resolve_targets), depth_stencil_attachment_(depth_stencil_attachment), width_(width), height_(height) {} @@ -64,16 +62,15 @@ Result FrameBuffer::Initialize(VkRenderPass render_pass) { attachments.resize(color_attachments_.size()); for (auto* info : color_attachments_) { - const VkImageUsageFlags usage_flags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | - VK_IMAGE_USAGE_TRANSFER_DST_BIT | - VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; color_images_.push_back(MakeUnique<TransferImage>( device_, *info->buffer->GetFormat(), VK_IMAGE_ASPECT_COLOR_BIT, - VK_IMAGE_TYPE_2D, usage_flags, width_ << info->base_mip_level, + VK_IMAGE_TYPE_2D, width_ << info->base_mip_level, height_ << info->base_mip_level, depth_, info->buffer->GetMipLevels(), - info->base_mip_level, 1u, info->buffer->GetSamples())); + info->base_mip_level, 1u, 1u)); - Result r = color_images_.back()->Initialize(); + Result r = color_images_.back()->Initialize( + VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | + VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); if (!r.IsSuccess()) return r; @@ -90,37 +87,19 @@ Result FrameBuffer::Initialize(VkRenderPass render_pass) { aspect |= VK_IMAGE_ASPECT_STENCIL_BIT; assert(aspect != 0); - const VkImageUsageFlags usage_flags = - VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | - VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; - depth_stencil_image_ = MakeUnique<TransferImage>( device_, *depth_stencil_attachment_.buffer->GetFormat(), aspect, - VK_IMAGE_TYPE_2D, usage_flags, width_, height_, depth_, 1u, 0u, 1u, 1u); + VK_IMAGE_TYPE_2D, width_, height_, depth_, 1u, 0u, 1u, 1u); - Result r = depth_stencil_image_->Initialize(); + Result r = depth_stencil_image_->Initialize( + VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | + VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT); if (!r.IsSuccess()) return r; attachments.push_back(depth_stencil_image_->GetVkImageView()); } - for (auto* info : resolve_targets_) { - const VkImageUsageFlags usage_flags = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | - VK_IMAGE_USAGE_TRANSFER_DST_BIT | - VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; - resolve_images_.push_back(MakeUnique<TransferImage>( - device_, *info->buffer->GetFormat(), VK_IMAGE_ASPECT_COLOR_BIT, - VK_IMAGE_TYPE_2D, usage_flags, width_, height_, depth_, 1u, 0u, 1u, - 1u)); - - Result r = resolve_images_.back()->Initialize(); - if (!r.IsSuccess()) - return r; - - attachments.push_back(resolve_images_.back()->GetVkImageView()); - } - VkFramebufferCreateInfo frame_buffer_info = VkFramebufferCreateInfo(); frame_buffer_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; frame_buffer_info.renderPass = render_pass; @@ -147,9 +126,6 @@ void FrameBuffer::ChangeFrameLayout(CommandBuffer* command, for (auto& img : color_images_) img->ImageBarrier(command, color_layout, color_stage); - for (auto& img : resolve_images_) - img->ImageBarrier(command, color_layout, color_stage); - if (depth_stencil_image_) depth_stencil_image_->ImageBarrier(command, depth_layout, depth_stage); } @@ -186,9 +162,6 @@ void FrameBuffer::TransferImagesToHost(CommandBuffer* command) { for (auto& img : color_images_) img->CopyToHost(command); - for (auto& img : resolve_images_) - img->CopyToHost(command); - if (depth_stencil_image_) depth_stencil_image_->CopyToHost(command); } @@ -203,15 +176,6 @@ void FrameBuffer::CopyImagesToBuffers() { info->buffer->GetSizeInBytes()); } - for (size_t i = 0; i < resolve_images_.size(); ++i) { - auto& img = resolve_images_[i]; - auto* info = resolve_targets_[i]; - auto* values = info->buffer->ValuePtr(); - values->resize(info->buffer->GetSizeInBytes()); - std::memcpy(values->data(), img->HostAccessibleMemoryPtr(), - info->buffer->GetSizeInBytes()); - } - if (depth_stencil_image_) { auto* values = depth_stencil_attachment_.buffer->ValuePtr(); values->resize(depth_stencil_attachment_.buffer->GetSizeInBytes()); @@ -241,18 +205,6 @@ void FrameBuffer::CopyBuffersToImages() { info->buffer->GetSizeInBytes()); } - for (size_t i = 0; i < resolve_images_.size(); ++i) { - auto& img = resolve_images_[i]; - auto* info = resolve_targets_[i]; - auto* values = info->buffer->ValuePtr(); - // Nothing to do if our local buffer is empty - if (values->empty()) - continue; - - std::memcpy(img->HostAccessibleMemoryPtr(), values->data(), - info->buffer->GetSizeInBytes()); - } - if (depth_stencil_image_) { auto* values = depth_stencil_attachment_.buffer->ValuePtr(); // Nothing to do if our local buffer is empty diff --git a/src/vulkan/frame_buffer.h b/src/vulkan/frame_buffer.h index 5774289..064b6d3 100644 --- a/src/vulkan/frame_buffer.h +++ b/src/vulkan/frame_buffer.h @@ -34,7 +34,6 @@ class FrameBuffer { Device* device, const std::vector<const amber::Pipeline::BufferInfo*>& color_attachments, amber::Pipeline::BufferInfo depth_stencil_attachment, - const std::vector<const amber::Pipeline::BufferInfo*>& resolve_targets, uint32_t width, uint32_t height); ~FrameBuffer(); @@ -71,11 +70,9 @@ class FrameBuffer { Device* device_ = nullptr; std::vector<const amber::Pipeline::BufferInfo*> color_attachments_; - std::vector<const amber::Pipeline::BufferInfo*> resolve_targets_; amber::Pipeline::BufferInfo depth_stencil_attachment_; VkFramebuffer frame_ = VK_NULL_HANDLE; std::vector<std::unique_ptr<TransferImage>> color_images_; - std::vector<std::unique_ptr<TransferImage>> resolve_images_; std::unique_ptr<TransferImage> depth_stencil_image_; uint32_t width_ = 0; uint32_t height_ = 0; diff --git a/src/vulkan/graphics_pipeline.cc b/src/vulkan/graphics_pipeline.cc index 138f32c..b83bea1 100644 --- a/src/vulkan/graphics_pipeline.cc +++ b/src/vulkan/graphics_pipeline.cc @@ -234,8 +234,6 @@ VkBlendFactor ToVkBlendFactor(BlendFactor factor) { return VK_BLEND_FACTOR_SRC1_ALPHA; case BlendFactor::kOneMinusSrc1Alpha: return VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA; - case BlendFactor::kUnknown: - break; } assert(false && "Vulkan::Unknown BlendFactor"); return VK_BLEND_FACTOR_ZERO; @@ -345,8 +343,6 @@ VkBlendOp ToVkBlendOp(BlendOp op) { return VK_BLEND_OP_GREEN_EXT; case BlendOp::kBlue: return VK_BLEND_OP_BLUE_EXT; - case BlendOp::kUnknown: - break; } assert(false && "Vulkan::Unknown BlendOp"); return VK_BLEND_OP_ADD; @@ -390,7 +386,6 @@ GraphicsPipeline::GraphicsPipeline( Device* device, const std::vector<amber::Pipeline::BufferInfo>& color_buffers, amber::Pipeline::BufferInfo depth_stencil_buffer, - const std::vector<amber::Pipeline::BufferInfo>& resolve_targets, uint32_t fence_timeout_ms, const std::vector<VkPipelineShaderStageCreateInfo>& shader_stage_info) : Pipeline(PipelineType::kGraphics, @@ -400,8 +395,6 @@ GraphicsPipeline::GraphicsPipeline( depth_stencil_buffer_(depth_stencil_buffer) { for (const auto& info : color_buffers) color_buffers_.push_back(&info); - for (const auto& info : resolve_targets) - resolve_targets_.push_back(&info); } GraphicsPipeline::~GraphicsPipeline() { @@ -419,7 +412,6 @@ Result GraphicsPipeline::CreateRenderPass() { std::vector<VkAttachmentReference> color_refer; VkAttachmentReference depth_refer = VkAttachmentReference(); - std::vector<VkAttachmentReference> resolve_refer; for (const auto* info : color_buffers_) { attachment_desc.push_back(kDefaultAttachmentDesc); @@ -429,8 +421,6 @@ Result GraphicsPipeline::CreateRenderPass() { VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; attachment_desc.back().finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - attachment_desc.back().samples = - static_cast<VkSampleCountFlagBits>(info->buffer->GetSamples()); VkAttachmentReference ref = VkAttachmentReference(); ref.attachment = static_cast<uint32_t>(attachment_desc.size() - 1); @@ -456,23 +446,6 @@ Result GraphicsPipeline::CreateRenderPass() { subpass_desc.pDepthStencilAttachment = &depth_refer; } - for (const auto* info : resolve_targets_) { - attachment_desc.push_back(kDefaultAttachmentDesc); - attachment_desc.back().format = - device_->GetVkFormat(*info->buffer->GetFormat()); - attachment_desc.back().initialLayout = - VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - attachment_desc.back().finalLayout = - VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - - VkAttachmentReference ref = VkAttachmentReference(); - ref.attachment = static_cast<uint32_t>(attachment_desc.size() - 1); - ref.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - resolve_refer.push_back(ref); - } - - subpass_desc.pResolveAttachments = resolve_refer.data(); - VkRenderPassCreateInfo render_pass_info = VkRenderPassCreateInfo(); render_pass_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; render_pass_info.attachmentCount = @@ -606,16 +579,6 @@ Result GraphicsPipeline::CreateVkGraphicsPipeline( 0, 0, static_cast<float>(frame_width_), static_cast<float>(frame_height_), 0, 1}; - if (pipeline_data->HasViewportData()) { - Viewport vp = pipeline_data->GetViewport(); - viewport.x = vp.x; - viewport.y = vp.y; - viewport.width = vp.w; - viewport.height = vp.h; - viewport.minDepth = vp.mind; - viewport.maxDepth = vp.maxd; - } - VkRect2D scissor = {{0, 0}, {frame_width_, frame_height_}}; VkPipelineViewportStateCreateInfo viewport_info = @@ -648,16 +611,6 @@ Result GraphicsPipeline::CreateVkGraphicsPipeline( VK_FALSE, /* alphaToOneEnable */ }; - // Search for multisampled color buffers and adjust the rasterization samples - // to match. - for (const auto& cb : color_buffers_) { - uint32_t samples = cb->buffer->GetSamples(); - assert(static_cast<VkSampleCountFlagBits>(samples) >= - multisampleInfo.rasterizationSamples); - multisampleInfo.rasterizationSamples = - static_cast<VkSampleCountFlagBits>(samples); - } - VkGraphicsPipelineCreateInfo pipeline_info = VkGraphicsPipelineCreateInfo(); pipeline_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; pipeline_info.stageCount = static_cast<uint32_t>(shader_stage_info.size()); @@ -741,9 +694,8 @@ Result GraphicsPipeline::Initialize(uint32_t width, if (!r.IsSuccess()) return r; - frame_ = - MakeUnique<FrameBuffer>(device_, color_buffers_, depth_stencil_buffer_, - resolve_targets_, width, height); + frame_ = MakeUnique<FrameBuffer>(device_, color_buffers_, + depth_stencil_buffer_, width, height); r = frame_->Initialize(render_pass_); if (!r.IsSuccess()) return r; diff --git a/src/vulkan/graphics_pipeline.h b/src/vulkan/graphics_pipeline.h index cd55aad..7076231 100644 --- a/src/vulkan/graphics_pipeline.h +++ b/src/vulkan/graphics_pipeline.h @@ -43,7 +43,6 @@ class GraphicsPipeline : public Pipeline { Device* device, const std::vector<amber::Pipeline::BufferInfo>& color_buffers, amber::Pipeline::BufferInfo depth_stencil_buffer, - const std::vector<amber::Pipeline::BufferInfo>& resolve_targets, uint32_t fence_timeout_ms, const std::vector<VkPipelineShaderStageCreateInfo>&); ~GraphicsPipeline() override; @@ -87,9 +86,8 @@ class GraphicsPipeline : public Pipeline { VkRenderPass render_pass_ = VK_NULL_HANDLE; std::unique_ptr<FrameBuffer> frame_; - // color buffers and resolve targets are owned by the amber::Pipeline. + // color buffers are owned by the amber::Pipeline. std::vector<const amber::Pipeline::BufferInfo*> color_buffers_; - std::vector<const amber::Pipeline::BufferInfo*> resolve_targets_; amber::Pipeline::BufferInfo depth_stencil_buffer_; std::unique_ptr<IndexBuffer> index_buffer_; diff --git a/src/vulkan/image_descriptor.cc b/src/vulkan/image_descriptor.cc index 1d20244..550ce0b 100644 --- a/src/vulkan/image_descriptor.cc +++ b/src/vulkan/image_descriptor.cc @@ -14,10 +14,6 @@ #include "src/vulkan/image_descriptor.h" -#include <algorithm> -#include <unordered_map> -#include <utility> - #include "src/vulkan/device.h" #include "src/vulkan/resource.h" @@ -29,26 +25,46 @@ ImageDescriptor::ImageDescriptor(Buffer* buffer, Device* device, uint32_t base_mip_level, uint32_t desc_set, - uint32_t binding, - Pipeline* pipeline) - : BufferBackedDescriptor(buffer, type, device, desc_set, binding, pipeline), + uint32_t binding) + : BufferBackedDescriptor(buffer, type, device, desc_set, binding), base_mip_level_(base_mip_level), vulkan_sampler_(device) {} ImageDescriptor::~ImageDescriptor() = default; +Result ImageDescriptor::RecordCopyDataToResourceIfNeeded( + CommandBuffer* command) { + for (auto& image : transfer_images_) { + image->ImageBarrier(command, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_PIPELINE_STAGE_TRANSFER_BIT); + } + + Result r = BufferBackedDescriptor::RecordCopyDataToResourceIfNeeded(command); + if (!r.IsSuccess()) + return r; + + // Just do this as early as possible. + for (auto& image : transfer_images_) { + image->ImageBarrier(command, VK_IMAGE_LAYOUT_GENERAL, + VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT); + } + + return {}; +} + Result ImageDescriptor::CreateResourceIfNeeded() { - auto& transfer_resources = pipeline_->GetDescriptorTransferResources(); + if (!transfer_images_.empty()) { + return Result( + "Vulkan: ImageDescriptor::CreateResourceIfNeeded() must be called " + "only when |transfer_images| is empty"); + } + + transfer_images_.reserve(GetAmberBuffers().size()); for (const auto& amber_buffer : GetAmberBuffers()) { if (amber_buffer->ValuePtr()->empty()) continue; - // Check if the transfer image is already created. - if (transfer_resources.count(amber_buffer) > 0) { - continue; - } - // Default to 2D image. VkImageType image_type = VK_IMAGE_TYPE_2D; switch (amber_buffer->GetImageDimension()) { @@ -77,8 +93,14 @@ Result ImageDescriptor::CreateResourceIfNeeded() { aspect = VK_IMAGE_ASPECT_COLOR_BIT; } + transfer_images_.emplace_back(MakeUnique<TransferImage>( + device_, *fmt, aspect, image_type, amber_buffer->GetWidth(), + amber_buffer->GetHeight(), amber_buffer->GetDepth(), + amber_buffer->GetMipLevels(), base_mip_level_, VK_REMAINING_MIP_LEVELS, + amber_buffer->GetSamples())); VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT; + if (type_ == DescriptorType::kStorageImage) { usage |= VK_IMAGE_USAGE_STORAGE_BIT; } else { @@ -87,14 +109,10 @@ Result ImageDescriptor::CreateResourceIfNeeded() { usage |= VK_IMAGE_USAGE_SAMPLED_BIT; } - auto transfer_image = MakeUnique<TransferImage>( - device_, *fmt, aspect, image_type, usage, amber_buffer->GetWidth(), - amber_buffer->GetHeight(), amber_buffer->GetDepth(), - amber_buffer->GetMipLevels(), base_mip_level_, VK_REMAINING_MIP_LEVELS, - amber_buffer->GetSamples()); + Result r = transfer_images_.back()->Initialize(usage); - // Store the transfer image to the pipeline's map of transfer images. - transfer_resources[amber_buffer] = std::move(transfer_image); + if (!r.IsSuccess()) + return r; } if (amber_sampler_) { @@ -107,6 +125,27 @@ Result ImageDescriptor::CreateResourceIfNeeded() { return {}; } +Result ImageDescriptor::RecordCopyDataToHost(CommandBuffer* command) { + if (!IsReadOnly()) { + for (auto& image : transfer_images_) { + image->ImageBarrier(command, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, + VK_PIPELINE_STAGE_TRANSFER_BIT); + } + + BufferBackedDescriptor::RecordCopyDataToHost(command); + } + + return {}; +} + +Result ImageDescriptor::MoveResourceToBufferOutput() { + Result r = BufferBackedDescriptor::MoveResourceToBufferOutput(); + + transfer_images_.clear(); + + return r; +} + void ImageDescriptor::UpdateDescriptorSetIfNeeded( VkDescriptorSet descriptor_set) { if (!is_descriptor_set_update_needed_) @@ -117,11 +156,7 @@ void ImageDescriptor::UpdateDescriptorSetIfNeeded( std::vector<VkDescriptorImageInfo> image_infos; - // Create VkDescriptorImageInfo for every descriptor image. - for (const auto& amber_buffer : GetAmberBuffers()) { - const auto& image = - pipeline_->GetDescriptorTransferResources()[amber_buffer] - ->AsTransferImage(); + for (const auto& image : transfer_images_) { VkDescriptorImageInfo image_info = {vulkan_sampler_.GetVkSampler(), image->GetVkImageView(), layout}; image_infos.push_back(image_info); @@ -142,5 +177,13 @@ void ImageDescriptor::UpdateDescriptorSetIfNeeded( is_descriptor_set_update_needed_ = false; } +std::vector<Resource*> ImageDescriptor::GetResources() { + std::vector<Resource*> ret; + for (auto& i : transfer_images_) { + ret.push_back(i.get()); + } + return ret; +} + } // namespace vulkan } // namespace amber diff --git a/src/vulkan/image_descriptor.h b/src/vulkan/image_descriptor.h index 3046436..5f8dd0e 100644 --- a/src/vulkan/image_descriptor.h +++ b/src/vulkan/image_descriptor.h @@ -16,12 +16,9 @@ #define SRC_VULKAN_IMAGE_DESCRIPTOR_H_ #include <memory> -#include <unordered_map> -#include <utility> #include <vector> #include "src/vulkan/buffer_backed_descriptor.h" -#include "src/vulkan/pipeline.h" #include "src/vulkan/sampler.h" #include "src/vulkan/transfer_image.h" @@ -35,18 +32,22 @@ class ImageDescriptor : public BufferBackedDescriptor { Device* device, uint32_t base_mip_level, uint32_t desc_set, - uint32_t binding, - Pipeline* pipeline); + uint32_t binding); ~ImageDescriptor() override; void UpdateDescriptorSetIfNeeded(VkDescriptorSet descriptor_set) override; + Result RecordCopyDataToResourceIfNeeded(CommandBuffer* command) override; Result CreateResourceIfNeeded() override; + Result RecordCopyDataToHost(CommandBuffer* command) override; + Result MoveResourceToBufferOutput() override; void SetAmberSampler(amber::Sampler* sampler) { amber_sampler_ = sampler; } - ImageDescriptor* AsImageDescriptor() override { return this; } + protected: + std::vector<Resource*> GetResources() override; private: uint32_t base_mip_level_ = 0; + std::vector<std::unique_ptr<TransferImage>> transfer_images_; amber::Sampler* amber_sampler_ = nullptr; amber::vulkan::Sampler vulkan_sampler_; }; diff --git a/src/vulkan/index_buffer.cc b/src/vulkan/index_buffer.cc index b651427..73a9083 100644 --- a/src/vulkan/index_buffer.cc +++ b/src/vulkan/index_buffer.cc @@ -38,12 +38,8 @@ Result IndexBuffer::SendIndexData(CommandBuffer* command, Buffer* buffer) { transfer_buffer_ = MakeUnique<TransferBuffer>(device_, buffer->GetSizeInBytes(), nullptr); - Result r = transfer_buffer_->AddUsageFlags(VK_BUFFER_USAGE_INDEX_BUFFER_BIT | - VK_BUFFER_USAGE_TRANSFER_DST_BIT); - if (!r.IsSuccess()) - return r; - - r = transfer_buffer_->Initialize(); + Result r = transfer_buffer_->Initialize(VK_BUFFER_USAGE_INDEX_BUFFER_BIT | + VK_BUFFER_USAGE_TRANSFER_DST_BIT); if (!r.IsSuccess()) return r; diff --git a/src/vulkan/pipeline.cc b/src/vulkan/pipeline.cc index df301e4..e0b875c 100644 --- a/src/vulkan/pipeline.cc +++ b/src/vulkan/pipeline.cc @@ -273,18 +273,6 @@ Result Pipeline::GetDescriptorSlot(uint32_t desc_set, return {}; } -Result Pipeline::AddDescriptorBuffer(Buffer* amber_buffer) { - // Don't add the buffer if it's already added. - const auto& buffer = std::find_if( - descriptor_buffers_.begin(), descriptor_buffers_.end(), - [&](const Buffer* buf) { return buf == amber_buffer; }); - if (buffer != descriptor_buffers_.end()) { - return {}; - } - descriptor_buffers_.push_back(amber_buffer); - return {}; -} - Result Pipeline::AddBufferDescriptor(const BufferCommand* cmd) { if (cmd == nullptr) return Result("Pipeline::AddBufferDescriptor BufferCommand is nullptr"); @@ -331,18 +319,16 @@ Result Pipeline::AddBufferDescriptor(const BufferCommand* cmd) { if (is_image) { auto image_desc = MakeUnique<ImageDescriptor>( cmd->GetBuffer(), desc_type, device_, cmd->GetBaseMipLevel(), - cmd->GetDescriptorSet(), cmd->GetBinding(), this); + cmd->GetDescriptorSet(), cmd->GetBinding()); if (cmd->IsCombinedImageSampler()) image_desc->SetAmberSampler(cmd->GetSampler()); - descriptors.push_back(std::move(image_desc)); } else { auto buffer_desc = MakeUnique<BufferDescriptor>( cmd->GetBuffer(), desc_type, device_, cmd->GetDescriptorSet(), - cmd->GetBinding(), this); + cmd->GetBinding()); descriptors.push_back(std::move(buffer_desc)); } - AddDescriptorBuffer(cmd->GetBuffer()); desc = descriptors.back().get(); } else { if (desc->GetDescriptorType() != desc_type) { @@ -350,19 +336,18 @@ Result Pipeline::AddBufferDescriptor(const BufferCommand* cmd) { "Descriptors bound to the same binding needs to have matching " "descriptor types"); } + // Check that the buffer is not added already. + const auto& buffers = desc->AsBufferBackedDescriptor()->GetAmberBuffers(); + if (std::find(buffers.begin(), buffers.end(), cmd->GetBuffer()) != + buffers.end()) { + return Result("Buffer has been added already"); + } desc->AsBufferBackedDescriptor()->AddAmberBuffer(cmd->GetBuffer()); - AddDescriptorBuffer(cmd->GetBuffer()); } if (cmd->IsUniformDynamic() || cmd->IsSSBODynamic()) desc->AsBufferDescriptor()->AddDynamicOffset(cmd->GetDynamicOffset()); - if (cmd->IsUniform() || cmd->IsUniformDynamic() || cmd->IsSSBO() || - cmd->IsSSBODynamic()) { - desc->AsBufferDescriptor()->AddDescriptorOffset(cmd->GetDescriptorOffset()); - desc->AsBufferDescriptor()->AddDescriptorRange(cmd->GetDescriptorRange()); - } - if (cmd->IsSSBO() && !desc->IsStorageBuffer()) { return Result( "Vulkan::AddBufferDescriptor BufferCommand for SSBO uses wrong " @@ -423,16 +408,6 @@ Result Pipeline::SendDescriptorDataToDeviceIfNeeded() { } } - // Initialize transfer buffers / images. - for (auto buffer : descriptor_buffers_) { - if (descriptor_transfer_resources_.count(buffer) == 0) { - return Result( - "Vulkan: Pipeline::SendDescriptorDataToDeviceIfNeeded() " - "descriptor's transfer resource is not found"); - } - descriptor_transfer_resources_[buffer]->Initialize(); - } - // Note that if a buffer for a descriptor is host accessible and // does not need to record a command to copy data to device, it // directly writes data to the buffer. The direct write must be @@ -448,27 +423,11 @@ Result Pipeline::SendDescriptorDataToDeviceIfNeeded() { if (!guard.IsRecording()) return guard.GetResult(); - // Copy descriptor data to transfer resources. - for (auto& buffer : descriptor_buffers_) { - if (auto transfer_buffer = - descriptor_transfer_resources_[buffer]->AsTransferBuffer()) { - BufferBackedDescriptor::RecordCopyBufferDataToTransferResourceIfNeeded( - GetCommandBuffer(), buffer, transfer_buffer); - } else if (auto transfer_image = - descriptor_transfer_resources_[buffer]->AsTransferImage()) { - transfer_image->ImageBarrier(GetCommandBuffer(), - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_PIPELINE_STAGE_TRANSFER_BIT); - - BufferBackedDescriptor::RecordCopyBufferDataToTransferResourceIfNeeded( - GetCommandBuffer(), buffer, transfer_image); - - transfer_image->ImageBarrier(GetCommandBuffer(), VK_IMAGE_LAYOUT_GENERAL, - VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT); - } else { - return Result( - "Vulkan: Pipeline::SendDescriptorDataToDeviceIfNeeded() " - "this should be unreachable"); + for (auto& info : descriptor_set_info_) { + for (auto& desc : info.descriptors) { + Result r = desc->RecordCopyDataToResourceIfNeeded(command_.get()); + if (!r.IsSuccess()) + return r; } } return guard.Submit(GetFenceTimeout()); @@ -512,38 +471,14 @@ void Pipeline::BindVkDescriptorSets(const VkPipelineLayout& pipeline_layout) { } Result Pipeline::ReadbackDescriptorsToHostDataQueue() { - // Record required commands to copy the data to a host visible buffer. { CommandBufferGuard guard(GetCommandBuffer()); if (!guard.IsRecording()) return guard.GetResult(); - for (auto& buffer : descriptor_buffers_) { - if (descriptor_transfer_resources_.count(buffer) == 0) { - return Result( - "Vulkan: Pipeline::ReadbackDescriptorsToHostDataQueue() " - "descriptor's transfer resource is not found"); - } - if (auto transfer_buffer = - descriptor_transfer_resources_[buffer]->AsTransferBuffer()) { - Result r = BufferBackedDescriptor::RecordCopyTransferResourceToHost( - GetCommandBuffer(), transfer_buffer); - if (!r.IsSuccess()) - return r; - } else if (auto transfer_image = descriptor_transfer_resources_[buffer] - ->AsTransferImage()) { - transfer_image->ImageBarrier(GetCommandBuffer(), - VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - VK_PIPELINE_STAGE_TRANSFER_BIT); - Result r = BufferBackedDescriptor::RecordCopyTransferResourceToHost( - GetCommandBuffer(), transfer_image); - if (!r.IsSuccess()) - return r; - } else { - return Result( - "Vulkan: Pipeline::ReadbackDescriptorsToHostDataQueue() " - "this should be unreachable"); - } + for (auto& desc_set : descriptor_set_info_) { + for (auto& desc : desc_set.descriptors) + desc->RecordCopyDataToHost(command_.get()); } Result r = guard.Submit(GetFenceTimeout()); @@ -551,15 +486,14 @@ Result Pipeline::ReadbackDescriptorsToHostDataQueue() { return r; } - // Move data from transfer buffers to output buffers. - for (auto& buffer : descriptor_buffers_) { - auto& transfer_resource = descriptor_transfer_resources_[buffer]; - Result r = BufferBackedDescriptor::MoveTransferResourceToBufferOutput( - transfer_resource.get(), buffer); - if (!r.IsSuccess()) - return r; + for (auto& desc_set : descriptor_set_info_) { + for (auto& desc : desc_set.descriptors) { + Result r = desc->MoveResourceToBufferOutput(); + if (!r.IsSuccess()) + return r; + } } - descriptor_transfer_resources_.clear(); + return {}; } diff --git a/src/vulkan/pipeline.h b/src/vulkan/pipeline.h index 1f85cb6..98b0c2a 100644 --- a/src/vulkan/pipeline.h +++ b/src/vulkan/pipeline.h @@ -27,7 +27,6 @@ #include "src/vulkan/buffer_backed_descriptor.h" #include "src/vulkan/command_buffer.h" #include "src/vulkan/push_constant.h" -#include "src/vulkan/resource.h" namespace amber { @@ -60,11 +59,6 @@ class Pipeline { /// buffer data object and put it into buffer data queue in host. Result ReadbackDescriptorsToHostDataQueue(); - std::unordered_map<Buffer*, std::unique_ptr<Resource>>& - GetDescriptorTransferResources() { - return descriptor_transfer_resources_; - } - void SetEntryPointName(VkShaderStageFlagBits stage, const std::string& entry) { entry_points_[stage] = entry; @@ -121,17 +115,10 @@ class Pipeline { Result CreateDescriptorSetLayouts(); Result CreateDescriptorPools(); Result CreateDescriptorSets(); - /// Adds a buffer used by a descriptor. The added buffers are be stored in - /// |descriptor_buffers_| vector in the order they are added. - Result AddDescriptorBuffer(Buffer* amber_buffer); PipelineType pipeline_type_; std::vector<DescriptorSetInfo> descriptor_set_info_; std::vector<VkPipelineShaderStageCreateInfo> shader_stage_info_; - std::unordered_map<Buffer*, std::unique_ptr<Resource>> - descriptor_transfer_resources_; - /// Buffers used by descriptors (buffer descriptors and image descriptors). - std::vector<Buffer*> descriptor_buffers_; uint32_t fence_timeout_ms_ = 1000; bool descriptor_related_objects_already_created_ = false; diff --git a/src/vulkan/pipeline_test.cc b/src/vulkan/pipeline_test.cc index 9f60174..53eca44 100644 --- a/src/vulkan/pipeline_test.cc +++ b/src/vulkan/pipeline_test.cc @@ -44,9 +44,9 @@ TEST_F(VulkanPipelineTest, AddBufferDescriptorAddBufferTwice) { &amber_pipeline); Result r = pipeline.AddBufferDescriptor(cmd.get()); ASSERT_TRUE(r.IsSuccess()) << r.Error(); - // Adding same buffer again shouldn't fail. + // Adding same buffer again should fail. r = pipeline.AddBufferDescriptor(cmd.get()); - ASSERT_TRUE(r.IsSuccess()); + ASSERT_FALSE(r.IsSuccess()); } } // namespace vulkan diff --git a/src/vulkan/resource.h b/src/vulkan/resource.h index d3cc0de..1ed447a 100644 --- a/src/vulkan/resource.h +++ b/src/vulkan/resource.h @@ -27,10 +27,9 @@ namespace vulkan { class CommandBuffer; class Device; -class TransferBuffer; -class TransferImage; -// Class for Vulkan resources. Its children are Vulkan Buffer and Vulkan Image. +// Class for Vulkan resources. Its children are Vulkan Buffer, Vulkan Image, +// and a class for push constant. class Resource { public: virtual ~Resource(); @@ -47,12 +46,6 @@ class Resource { uint32_t GetSizeInBytes() const { return size_in_bytes_; } void UpdateMemoryWithRawData(const std::vector<uint8_t>& raw_data); - bool IsReadOnly() const { return is_read_only_; } - void SetReadOnly(bool read_only) { is_read_only_ = read_only; } - virtual Result Initialize() = 0; - virtual TransferBuffer* AsTransferBuffer() { return nullptr; } - virtual TransferImage* AsTransferImage() { return nullptr; } - protected: Resource(Device* device, uint32_t size); Result CreateVkBuffer(VkBuffer* buffer, VkBufferUsageFlags usage); @@ -89,7 +82,6 @@ class Resource { private: uint32_t size_in_bytes_ = 0; void* memory_ptr_ = nullptr; - bool is_read_only_ = false; }; } // namespace vulkan diff --git a/src/vulkan/transfer_buffer.cc b/src/vulkan/transfer_buffer.cc index 512fb7b..a13b22e 100644 --- a/src/vulkan/transfer_buffer.cc +++ b/src/vulkan/transfer_buffer.cc @@ -44,14 +44,8 @@ TransferBuffer::~TransferBuffer() { } } -Result TransferBuffer::Initialize() { - if (buffer_) { - return Result( - "Vulkan: TransferBuffer::Initialize() transfer buffer already " - "initialized."); - } - - Result r = CreateVkBuffer(&buffer_, usage_flags_); +Result TransferBuffer::Initialize(const VkBufferUsageFlags usage) { + Result r = CreateVkBuffer(&buffer_, usage); if (!r.IsSuccess()) return r; @@ -64,8 +58,8 @@ Result TransferBuffer::Initialize() { return r; // Create buffer view - if (usage_flags_ & (VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | - VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT)) { + if (usage & (VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | + VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT)) { VkBufferViewCreateInfo buffer_view_info = VkBufferViewCreateInfo(); buffer_view_info.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO; buffer_view_info.buffer = buffer_; diff --git a/src/vulkan/transfer_buffer.h b/src/vulkan/transfer_buffer.h index 7d96bec..2c0a51d 100644 --- a/src/vulkan/transfer_buffer.h +++ b/src/vulkan/transfer_buffer.h @@ -34,17 +34,7 @@ class TransferBuffer : public Resource { TransferBuffer(Device* device, uint32_t size_in_bytes, Format* format); ~TransferBuffer() override; - TransferBuffer* AsTransferBuffer() override { return this; } - Result AddUsageFlags(VkBufferUsageFlags flags) { - if (buffer_ != VK_NULL_HANDLE) { - return Result( - "Vulkan: TransferBuffer::AddUsageFlags Usage flags can't be changed " - "after initializing the buffer."); - } - usage_flags_ |= flags; - return {}; - } - Result Initialize() override; + Result Initialize(const VkBufferUsageFlags usage); const VkBufferView* GetVkBufferView() const { return &view_; } VkBuffer GetVkBuffer() const { return buffer_; } @@ -57,7 +47,6 @@ class TransferBuffer : public Resource { void CopyToHost(CommandBuffer* command_buffer) override; private: - VkBufferUsageFlags usage_flags_ = 0; VkBuffer buffer_ = VK_NULL_HANDLE; VkDeviceMemory memory_ = VK_NULL_HANDLE; VkBufferView view_ = VK_NULL_HANDLE; diff --git a/src/vulkan/transfer_image.cc b/src/vulkan/transfer_image.cc index adfae62..545549d 100644 --- a/src/vulkan/transfer_image.cc +++ b/src/vulkan/transfer_image.cc @@ -70,7 +70,6 @@ TransferImage::TransferImage(Device* device, const Format& format, VkImageAspectFlags aspect, VkImageType image_type, - VkImageUsageFlags image_usage_flags, uint32_t x, uint32_t y, uint32_t z, @@ -97,7 +96,6 @@ TransferImage::TransferImage(Device* device, image_info_.extent = {x, y, z}; image_info_.mipLevels = mip_levels; image_info_.samples = GetVkSampleCount(samples); - image_info_.usage = image_usage_flags; } TransferImage::~TransferImage() { @@ -124,10 +122,12 @@ TransferImage::~TransferImage() { } } -Result TransferImage::Initialize() { +Result TransferImage::Initialize(VkImageUsageFlags usage) { if (image_ != VK_NULL_HANDLE) return Result("Vulkan::TransferImage was already initialized"); + image_info_.usage = usage; + if (device_->GetPtrs()->vkCreateImage(device_->GetVkDevice(), &image_info_, nullptr, &image_) != VK_SUCCESS) { return Result("Vulkan::Calling vkCreateImage Fail"); @@ -141,7 +141,7 @@ Result TransferImage::Initialize() { return r; if (aspect_ & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT) && - !(image_info_.usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)) { + !(usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)) { // Combined depth/stencil image used as a descriptor. Only one aspect can be // used for the image view. r = CreateVkImageView(VK_IMAGE_ASPECT_DEPTH_BIT); diff --git a/src/vulkan/transfer_image.h b/src/vulkan/transfer_image.h index 3af71d2..741ee3c 100644 --- a/src/vulkan/transfer_image.h +++ b/src/vulkan/transfer_image.h @@ -33,7 +33,6 @@ class TransferImage : public Resource { const Format& format, VkImageAspectFlags aspect, VkImageType image_type, - VkImageUsageFlags image_usage_flags, uint32_t x, uint32_t y, uint32_t z, @@ -43,8 +42,7 @@ class TransferImage : public Resource { uint32_t samples); ~TransferImage() override; - TransferImage* AsTransferImage() override { return this; } - Result Initialize() override; + Result Initialize(VkImageUsageFlags usage); VkImageView GetVkImageView() const { return view_; } void ImageBarrier(CommandBuffer* command_buffer, diff --git a/src/vulkan/vertex_buffer.cc b/src/vulkan/vertex_buffer.cc index 557b0a3..7503681 100644 --- a/src/vulkan/vertex_buffer.cc +++ b/src/vulkan/vertex_buffer.cc @@ -85,11 +85,8 @@ Result VertexBuffer::SendVertexData(CommandBuffer* command) { uint32_t bytes = buf->GetSizeInBytes(); transfer_buffers_.push_back( MakeUnique<TransferBuffer>(device_, bytes, nullptr)); - Result r = transfer_buffers_.back()->AddUsageFlags( + Result r = transfer_buffers_.back()->Initialize( VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT); - if (!r.IsSuccess()) - return r; - r = transfer_buffers_.back()->Initialize(); std::memcpy(transfer_buffers_.back()->HostAccessibleMemoryPtr(), buf->GetValues<void>(), bytes); diff --git a/tests/cases/compute_descriptor_array_ssbo.amber b/tests/cases/compute_descriptor_array_ssbo.amber index 0eb6b7d..bd4c773 100644 --- a/tests/cases/compute_descriptor_array_ssbo.amber +++ b/tests/cases/compute_descriptor_array_ssbo.amber @@ -20,19 +20,12 @@ layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; layout(binding = 0) buffer block0 { int data; -} ssbo_array_0[2]; - -layout(binding = 1) buffer block1 -{ - int data; -} ssbo_array_1[2]; +} ssbo_array[2]; void main() { - ssbo_array_0[0].data = 1; - ssbo_array_0[1].data = 2; - ssbo_array_1[0].data = 3; - ssbo_array_1[1].data = 4; + ssbo_array[0].data = 1; + ssbo_array[1].data = 2; } END @@ -44,21 +37,13 @@ BUFFER buf1 DATA_TYPE int32 DATA 0 END -# The Vulkan spec lists the maximum value of minStorageBufferOffsetAlignment -# (i.e. the maximum possible alignment requirement) as 256 bytes, so we will use -# buffer with size of 65 int32 values = 260 bytes. -BUFFER buf2 DATA_TYPE int32 SIZE 65 FILL 0 - PIPELINE compute pipeline ATTACH compute_shader BIND BUFFER_ARRAY buf0 buf1 AS storage DESCRIPTOR_SET 0 BINDING 0 - BIND BUFFER_ARRAY buf2 buf2 AS storage DESCRIPTOR_SET 0 BINDING 1 DESCRIPTOR_OFFSET 0 256 DESCRIPTOR_RANGE 256 4 END RUN pipeline 1 1 1 EXPECT buf0 IDX 0 EQ 1 EXPECT buf1 IDX 0 EQ 2 -EXPECT buf2 IDX 0 EQ 3 -EXPECT buf2 IDX 256 EQ 4 diff --git a/tests/cases/compute_descriptor_array_storagetexelbuffer.amber b/tests/cases/compute_descriptor_array_storagetexelbuffer.amber index 3ddae3c..d4a1994 100644 --- a/tests/cases/compute_descriptor_array_storagetexelbuffer.amber +++ b/tests/cases/compute_descriptor_array_storagetexelbuffer.amber @@ -17,20 +17,13 @@ SHADER compute compute_shader GLSL #version 430 layout(local_size_x=4,local_size_y=1) in; uniform layout(set=0, binding=0) samplerBuffer texelsIn; -uniform layout(set=0, binding=1, rgba32f) imageBuffer texelsOut_0[2]; -uniform layout(set=0, binding=2, rgba32f) imageBuffer texelsOut_1[2]; +uniform layout(set=0, binding=1, rgba32f) imageBuffer texelsOut[2]; void main () { vec4 color = texelFetch(texelsIn, int(gl_GlobalInvocationID)); - imageStore(texelsOut_0[0], int(gl_GlobalInvocationID), color); - imageStore(texelsOut_0[1], int(gl_GlobalInvocationID), color * 2.0); - if (int(gl_GlobalInvocationID) < 2) { - imageStore(texelsOut_1[0], int(gl_GlobalInvocationID), color * 3.0); - } - else { - imageStore(texelsOut_1[1], int(gl_GlobalInvocationID), color * 4.0); - } + imageStore(texelsOut[0], int(gl_GlobalInvocationID), color); + imageStore(texelsOut[1], int(gl_GlobalInvocationID), color * 2.0); } END @@ -43,7 +36,6 @@ END BUFFER texel_buffer_out0 DATA_TYPE R32G32B32A32_SFLOAT SIZE 4 FILL 0 BUFFER texel_buffer_out1 DATA_TYPE R32G32B32A32_SFLOAT SIZE 4 FILL 0 -BUFFER texel_buffer_out2 DATA_TYPE R32G32B32A32_SFLOAT SIZE 4 FILL 0 BUFFER ref0 DATA_TYPE R32G32B32A32_SFLOAT DATA 1.0 0.0 0.0 1.0 @@ -59,22 +51,13 @@ BUFFER ref1 DATA_TYPE R32G32B32A32_SFLOAT DATA 0.0 2.0 2.0 2.0 END -BUFFER ref2 DATA_TYPE R32G32B32A32_SFLOAT DATA -3.0 0.0 0.0 3.0 -0.0 3.0 0.0 3.0 -0.0 0.0 4.0 4.0 -0.0 4.0 4.0 4.0 -END - PIPELINE compute pipeline ATTACH compute_shader BIND BUFFER texel_buffer_in AS uniform_texel_buffer DESCRIPTOR_SET 0 BINDING 0 BIND BUFFER_ARRAY texel_buffer_out0 texel_buffer_out1 AS storage_texel_buffer DESCRIPTOR_SET 0 BINDING 1 - BIND BUFFER_ARRAY texel_buffer_out2 texel_buffer_out2 AS storage_texel_buffer DESCRIPTOR_SET 0 BINDING 2 END RUN pipeline 1 1 1 EXPECT texel_buffer_out0 EQ_BUFFER ref0 EXPECT texel_buffer_out1 EQ_BUFFER ref1 -EXPECT texel_buffer_out2 EQ_BUFFER ref2 diff --git a/tests/cases/compute_dynamic_buffers.amber b/tests/cases/compute_dynamic_buffers.amber index 9dd4149..9412e30 100644 --- a/tests/cases/compute_dynamic_buffers.amber +++ b/tests/cases/compute_dynamic_buffers.amber @@ -25,16 +25,11 @@ layout(set = 0, binding = 1) buffer block1 { vec4 data1; }; -layout(set = 0, binding = 2) buffer block2 -{ - vec4 data2; -}; void main() { data0 = vec4(1, 2, 3, 4); data1 = vec4(5, 6, 7, 8); - data2 = vec4(9, 10, 11, 12); } END @@ -44,7 +39,6 @@ END # after the alignment (256 / 16 + 1). BUFFER buf0 DATA_TYPE vec4<float> SIZE 17 FILL 0.0 BUFFER buf1 DATA_TYPE vec4<float> SIZE 17 FILL 0.0 -BUFFER buf2 DATA_TYPE vec4<float> SIZE 33 FILL 0.0 PIPELINE compute pipeline ATTACH compute_shader @@ -52,12 +46,9 @@ PIPELINE compute pipeline BIND BUFFER buf0 AS storage_dynamic DESCRIPTOR_SET 0 BINDING 0 OFFSET 0 # Using the maximum possible required offset alignment of 256 bytes to support all implementations. BIND BUFFER buf1 AS storage_dynamic DESCRIPTOR_SET 0 BINDING 1 OFFSET 256 - # Same as above, but with buffer offset of 256 bytes (total offset of 512). - BIND BUFFER buf2 AS storage_dynamic DESCRIPTOR_SET 0 BINDING 2 OFFSET 256 DESCRIPTOR_OFFSET 256 END RUN pipeline 1 1 1 EXPECT buf0 IDX 0 EQ 1.0 2.0 3.0 4.0 EXPECT buf1 IDX 256 EQ 5.0 6.0 7.0 8.0 -EXPECT buf2 IDX 512 EQ 9.0 10.0 11.0 12.0 diff --git a/tests/cases/compute_dynamic_buffers_descriptor_array.amber b/tests/cases/compute_dynamic_buffers_descriptor_array.amber index ccc4c42..fe07b6c 100644 --- a/tests/cases/compute_dynamic_buffers_descriptor_array.amber +++ b/tests/cases/compute_dynamic_buffers_descriptor_array.amber @@ -19,18 +19,12 @@ SHADER compute compute_shader GLSL layout(set = 0, binding = 0) buffer block0 { vec4 data; -} ssbo_array_0[2]; -layout(set = 0, binding = 1) buffer block1 -{ - int data; -} ssbo_array_1[2]; +} ssbo_array[2]; void main() { - ssbo_array_0[0].data = vec4(1, 2, 3, 4); - ssbo_array_0[1].data = vec4(5, 6, 7, 8); - ssbo_array_1[0].data = 9; - ssbo_array_1[1].data = 10; + ssbo_array[0].data = vec4(1, 2, 3, 4); + ssbo_array[1].data = vec4(5, 6, 7, 8); } END @@ -40,20 +34,15 @@ END # after the alignment (256 / 16 + 1). BUFFER buf0 DATA_TYPE vec4<float> SIZE 17 FILL 0.0 BUFFER buf1 DATA_TYPE vec4<float> SIZE 17 FILL 0.0 -# Same as above, but with int32 and double size: 512 / 4 + 1 -BUFFER buf2 DATA_TYPE int32 SIZE 129 FILL 0 PIPELINE compute pipeline ATTACH compute_shader # Using the maximum possible required offset alignment of 256 bytes to support all implementations. BIND BUFFER_ARRAY buf0 buf1 AS storage_dynamic DESCRIPTOR_SET 0 BINDING 0 OFFSET 0 256 - BIND BUFFER_ARRAY buf2 buf2 AS storage_dynamic DESCRIPTOR_SET 0 BINDING 1 OFFSET 0 256 DESCRIPTOR_OFFSET 0 256 END RUN pipeline 1 1 1 EXPECT buf0 IDX 0 EQ 1.0 2.0 3.0 4.0 EXPECT buf1 IDX 256 EQ 5.0 6.0 7.0 8.0 -EXPECT buf2 IDX 0 EQ 9 -EXPECT buf2 IDX 512 EQ 10 diff --git a/tests/cases/compute_one_buffer_in_multiple_bindings.amber b/tests/cases/compute_one_buffer_in_multiple_bindings.amber deleted file mode 100644 index d16bda5..0000000 --- a/tests/cases/compute_one_buffer_in_multiple_bindings.amber +++ /dev/null @@ -1,94 +0,0 @@ -#!amber -# Copyright 2021 The Amber 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. - -SHADER compute compute_shader GLSL -#version 430 - -layout(set = 0, binding = 0) uniform uniform_0 { - vec4 uniform_data_0; -}; -layout(set = 0, binding = 1) buffer block_0 { - vec4 storage_data_0; -}; - -layout(set = 1, binding = 0) uniform uniform_1 { - vec4 uniform_data_1; -}; -layout(set = 1, binding = 1) buffer block_1 { - vec4 storage_data_1; -}; - -uniform layout(set = 2, binding = 0, rgba32f) imageBuffer texelBuffer; -uniform layout(set = 2, binding = 1) samplerBuffer texelsIn; - -void main() { - // Verify that the uniform and storage buffers have the same contents and multiply by 2 if true) - if (uniform_data_0 == storage_data_0) { - storage_data_0 = storage_data_0 * 2; - } - if (uniform_data_1 == storage_data_1) { - storage_data_1 = storage_data_1 * 2; - } - - // Load values from index 1 using storage texel buffer. - vec4 texel = imageLoad(texelBuffer, 1); - - // Load values from index 2 using uniform texel buffer. - vec4 color = texelFetch(texelsIn, 2); - - // Store values to index 3. - imageStore(texelBuffer, 3, texel + color); -} -END - -# The Vulkan spec lists the maximum value of minStorageBufferOffsetAlignment -# (i.e. the maximum possible alignment requirement) as 256 bytes. -# Meaningful data is placed at this offset. -BUFFER buf0 DATA_TYPE R32G32B32A32_SFLOAT DATA -1.0 2.0 3.0 4.0 -0.1 0.2 0.3 0.4 -0.5 0.6 0.7 0.8 -0.0 0.0 0.0 0.0 -0.0 0.0 0.0 0.0 -0.0 0.0 0.0 0.0 -0.0 0.0 0.0 0.0 -0.0 0.0 0.0 0.0 -0.0 0.0 0.0 0.0 -0.0 0.0 0.0 0.0 -0.0 0.0 0.0 0.0 -0.0 0.0 0.0 0.0 -0.0 0.0 0.0 0.0 -0.0 0.0 0.0 0.0 -0.0 0.0 0.0 0.0 -0.0 0.0 0.0 0.0 -5.0 6.0 7.0 8.0 -END - -PIPELINE compute pipeline - ATTACH compute_shader - - BIND BUFFER buf0 AS uniform DESCRIPTOR_SET 0 BINDING 0 - BIND BUFFER buf0 AS storage DESCRIPTOR_SET 0 BINDING 1 - BIND BUFFER buf0 AS uniform DESCRIPTOR_SET 1 BINDING 0 DESCRIPTOR_OFFSET 256 - BIND BUFFER buf0 AS storage DESCRIPTOR_SET 1 BINDING 1 DESCRIPTOR_OFFSET 256 - BIND BUFFER buf0 AS storage_texel_buffer DESCRIPTOR_SET 2 BINDING 0 - BIND BUFFER buf0 AS uniform_texel_buffer DESCRIPTOR_SET 2 BINDING 1 -END - -RUN pipeline 1 1 1 - -EXPECT buf0 IDX 0 EQ 2.0 4.0 6.0 8.0 # Values written to the first storage buffer binding -EXPECT buf0 IDX 48 EQ 0.6 0.8 1.0 1.2 # Values written to the storage texel buffer binding -EXPECT buf0 IDX 256 EQ 10.0 12.0 14.0 16.0 # Values written to the second storage buffer binding diff --git a/tests/cases/debugger_hlsl_basic_compute.amber b/tests/cases/debugger_hlsl_basic_compute.amber index f1572b3..84db5df 100644 --- a/tests/cases/debugger_hlsl_basic_compute.amber +++ b/tests/cases/debugger_hlsl_basic_compute.amber @@ -18,7 +18,7 @@ SET ENGINE_DATA fence_timeout_ms 1000000 VIRTUAL_FILE "compute.hlsl" [[vk::binding(0)]] -RWStructuredBuffer<int> data; +StructuredBuffer<int> data; [numthreads(1,1,1)] void main() { diff --git a/tests/cases/debugger_hlsl_basic_vertex.amber b/tests/cases/debugger_hlsl_basic_vertex.amber index 79ea512..86d0381 100644 --- a/tests/cases/debugger_hlsl_basic_vertex.amber +++ b/tests/cases/debugger_hlsl_basic_vertex.amber @@ -106,12 +106,6 @@ CLEAR pipeline DEBUG pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 6 THREAD VERTEX_INDEX 0 - EXPECT LOCATION "vs.hlsl" 6 "VS_OUTPUT main(float4 pos : POSITION," - STEP_IN - EXPECT LOCATION "vs.hlsl" 7 " float4 color : COLOR) {" - STEP_IN - EXPECT LOCATION "vs.hlsl" 8 " VS_OUTPUT vout;" - STEP_IN EXPECT LOCATION "vs.hlsl" 9 " vout.pos = pos;" EXPECT LOCAL "pos.x" EQ -1.000000 EXPECT LOCAL "pos.y" EQ -1.000000 diff --git a/tests/cases/debugger_hlsl_function_call.amber b/tests/cases/debugger_hlsl_function_call.amber index 3542b15..9504b03 100644 --- a/tests/cases/debugger_hlsl_function_call.amber +++ b/tests/cases/debugger_hlsl_function_call.amber @@ -18,7 +18,7 @@ SET ENGINE_DATA fence_timeout_ms 1000000 VIRTUAL_FILE "compute.hlsl" [[vk::binding(0)]] -RWStructuredBuffer<int> data; +StructuredBuffer<int> data; int C(int x) { diff --git a/tests/cases/debugger_hlsl_shadowed_vars.amber b/tests/cases/debugger_hlsl_shadowed_vars.amber index d1f75a5..bf8a790 100644 --- a/tests/cases/debugger_hlsl_shadowed_vars.amber +++ b/tests/cases/debugger_hlsl_shadowed_vars.amber @@ -99,8 +99,7 @@ BUFFER framebuffer FORMAT B8G8R8A8_UNORM PIPELINE graphics pipeline ATTACH vtex_shader SHADER_OPTIMIZATION vtex_shader - --inline-entry-points-exhaustive - --eliminate-dead-functions + --legalize-hlsl END ATTACH frag_shader @@ -118,10 +117,6 @@ CLEAR pipeline DEBUG pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 6 THREAD VERTEX_INDEX 0 - EXPECT LOCATION "vs.hlsl" 5 "VS_OUTPUT main(float4 pos : POSITION," - STEP_IN - EXPECT LOCATION "vs.hlsl" 6 " float4 color : COLOR) {" - STEP_IN EXPECT LOCATION "vs.hlsl" 7 " float a = 1.0;" STEP_IN EXPECT LOCATION "vs.hlsl" 8 " float b = 2.0;" diff --git a/tests/cases/debugger_spirv_line_stepping.amber b/tests/cases/debugger_spirv_line_stepping.amber index 478e4fd..1d3e33b 100644 --- a/tests/cases/debugger_spirv_line_stepping.amber +++ b/tests/cases/debugger_spirv_line_stepping.amber @@ -94,16 +94,10 @@ DEBUG pipeline 1 1 1 END EXPECT LOCATION "ComputeShader0.spvasm" 20 "%5 = OpVariable %11 Uniform" STEP_IN - EXPECT LOCATION "ComputeShader0.spvasm" 21 "%12 = OpConstant %9 0" - STEP_IN - EXPECT LOCATION "ComputeShader0.spvasm" 22 "%13 = OpConstant %10 0" - STEP_IN EXPECT LOCATION "ComputeShader0.spvasm" 25 "%2 = OpVariable %15 Input" STEP_IN EXPECT LOCATION "ComputeShader0.spvasm" 27 "%6 = OpVariable %11 Uniform" STEP_IN - EXPECT LOCATION "ComputeShader0.spvasm" 29 "%1 = OpFunction %7 None %8" - STEP_IN EXPECT LOCATION "ComputeShader0.spvasm" 31 "%19 = OpAccessChain %16 %2 %13" STEP_IN EXPECT LOCATION "ComputeShader0.spvasm" 32 "%20 = OpLoad %10 %19" diff --git a/tests/cases/draw_rect_blend.amber b/tests/cases/draw_rect_blend.amber deleted file mode 100644 index c47b93f..0000000 --- a/tests/cases/draw_rect_blend.amber +++ /dev/null @@ -1,46 +0,0 @@ -#!amber -# Copyright 2021 The Amber 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. - -SHADER vertex vert_shader PASSTHROUGH -SHADER fragment frag_shader GLSL -#version 430 -layout(location = 0) out vec4 color_out; -void main() -{ - color_out = vec4(1.0, 0.0, 0.0, 0.5); -} -END - -BUFFER framebuffer FORMAT B8G8R8A8_UNORM - -PIPELINE graphics pipeline - ATTACH vert_shader - ATTACH frag_shader - BIND BUFFER framebuffer AS color LOCATION 0 - - BLEND - SRC_COLOR_FACTOR src_alpha - DST_COLOR_FACTOR one_minus_src_alpha - COLOR_OP add - SRC_ALPHA_FACTOR one - DST_ALPHA_FACTOR one - ALPHA_OP max - END -END - -CLEAR_COLOR pipeline 0 255 0 255 -CLEAR pipeline -RUN pipeline DRAW_RECT POS 0 0 SIZE 250 250 -EXPECT framebuffer IDX 0 0 SIZE 250 250 EQ_RGBA 128 128 0 255 TOLERANCE 5% diff --git a/tests/cases/float16.amber b/tests/cases/float16.amber index 0a8fd04..88baf13 100644 --- a/tests/cases/float16.amber +++ b/tests/cases/float16.amber @@ -13,11 +13,9 @@ # See the License for the specific language governing permissions and # limitations under the License. +INSTANCE_EXTENSION VK_KHR_get_physical_device_properties2 DEVICE_EXTENSION VK_KHR_shader_float16_int8 -DEVICE_EXTENSION VK_KHR_16bit_storage -DEVICE_EXTENSION VK_KHR_storage_buffer_storage_class DEVICE_FEATURE Float16Int8Features.shaderFloat16 -DEVICE_FEATURE Storage16BitFeatures.storageBuffer16BitAccess SHADER compute f16 GLSL #version 450 diff --git a/tests/cases/graphics_descriptor_array_combined_image_sampler.amber b/tests/cases/graphics_descriptor_array_combined_image_sampler.amber index e80ca1e..d7fe3c0 100644 --- a/tests/cases/graphics_descriptor_array_combined_image_sampler.amber +++ b/tests/cases/graphics_descriptor_array_combined_image_sampler.amber @@ -40,16 +40,10 @@ SHADER fragment frag_shader_tex GLSL #version 430 layout(location = 0) in vec2 texcoords_in; layout(location = 0) out vec4 color_out; -uniform layout(set=0, binding=0) sampler2D tex_sampler_0[2]; -uniform layout(set=0, binding=1) sampler2D tex_sampler_1[2]; +uniform layout(set=0, binding=0) sampler2D tex_sampler[2]; void main() { - vec4 tex_0_color = texture(tex_sampler_0[0], texcoords_in); - color_out = tex_0_color + texture(tex_sampler_0[1], texcoords_in); - // tex_sampler_1[0] and tex_sampler_1[1] should be equal to tex_sampler_0[0] - if (tex_0_color != texture(tex_sampler_1[0], texcoords_in) || - tex_0_color != texture(tex_sampler_1[1], texcoords_in)) { - color_out = vec4(1.0); - } + color_out = texture(tex_sampler[0], texcoords_in); + color_out = color_out + texture(tex_sampler[1], texcoords_in); } END @@ -81,7 +75,6 @@ PIPELINE graphics pipeline ATTACH vert_shader_tex ATTACH frag_shader_tex BIND BUFFER_ARRAY texture0 texture1 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 0 - BIND BUFFER_ARRAY texture0 texture0 AS combined_image_sampler SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1 VERTEX_DATA position LOCATION 0 VERTEX_DATA texcoords LOCATION 1 BIND BUFFER framebuffer AS color LOCATION 0 diff --git a/tests/cases/graphics_descriptor_array_sampled_image.amber b/tests/cases/graphics_descriptor_array_sampled_image.amber index 3342054..497f6da 100644 --- a/tests/cases/graphics_descriptor_array_sampled_image.amber +++ b/tests/cases/graphics_descriptor_array_sampled_image.amber @@ -40,18 +40,11 @@ SHADER fragment frag_shader_tex GLSL #version 430 layout(location = 0) in vec2 texcoords_in; layout(location = 0) out vec4 color_out; -uniform layout(set=0, binding=0) texture2D tex_0[2]; +uniform layout(set=0, binding=0) texture2D tex[2]; uniform layout(set=0, binding=1) sampler tex_sampler; -uniform layout(set=0, binding=2) texture2D tex_1[2]; void main() { - vec4 tex_0_color = texture(sampler2D(tex_0[0], tex_sampler), texcoords_in); - color_out = tex_0_color; - color_out += texture(sampler2D(tex_0[1], tex_sampler), texcoords_in); - // tex_1[0] and tex_1[1] should be equal to tex_0[0]. - if (tex_0_color != texture(sampler2D(tex_1[0], tex_sampler), texcoords_in) || - tex_0_color != texture(sampler2D(tex_1[1], tex_sampler), texcoords_in)) { - color_out = vec4(1.0); - } + color_out = texture(sampler2D(tex[0], tex_sampler), texcoords_in); + color_out += texture(sampler2D(tex[1], tex_sampler), texcoords_in); } END @@ -84,7 +77,6 @@ PIPELINE graphics pipeline ATTACH frag_shader_tex BIND BUFFER_ARRAY texture0 texture1 AS sampled_image DESCRIPTOR_SET 0 BINDING 0 BIND SAMPLER sampler DESCRIPTOR_SET 0 BINDING 1 - BIND BUFFER_ARRAY texture0 texture0 AS sampled_image DESCRIPTOR_SET 0 BINDING 2 VERTEX_DATA position LOCATION 0 VERTEX_DATA texcoords LOCATION 1 BIND BUFFER framebuffer AS color LOCATION 0 diff --git a/tests/cases/multisample_resolve.amber b/tests/cases/multisample_resolve.amber deleted file mode 100644 index 594f9bb..0000000 --- a/tests/cases/multisample_resolve.amber +++ /dev/null @@ -1,50 +0,0 @@ -#!amber -# Copyright 2021 The Amber 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. - -DEVICE_FEATURE sampleRateShading - -SHADER vertex vert_shader PASSTHROUGH - -SHADER fragment frag_shader GLSL -#version 440 -layout(location = 0) out vec4 color; - -void main (void) -{ - if (gl_SampleID == 0) - color = vec4(1, 0, 0, 1); - else if (gl_SampleID == 1) - color = vec4(0, 1, 0, 1); - else if (gl_SampleID == 2) - color = vec4(0, 0, 1, 1); - else - color = vec4(1, 1, 1, 1); -} -END - -IMAGE framebuffer_ms FORMAT R8G8B8A8_UNORM DIM_2D WIDTH 64 HEIGHT 64 SAMPLES 4 -IMAGE framebuffer FORMAT R8G8B8A8_UNORM DIM_2D WIDTH 64 HEIGHT 64 - -PIPELINE graphics pipeline - ATTACH vert_shader - ATTACH frag_shader - FRAMEBUFFER_SIZE 64 64 - BIND BUFFER framebuffer_ms AS color LOCATION 0 - BIND BUFFER framebuffer AS resolve -END - -RUN pipeline DRAW_RECT POS 0 0 SIZE 64 64 - -EXPECT framebuffer IDX 0 0 SIZE 64 64 EQ_RGBA 128 128 128 255 TOLERANCE 5% diff --git a/tests/cases/non_default_entry_point.amber b/tests/cases/non_default_entry_point.amber index 3a0892f..36b2135 100644 --- a/tests/cases/non_default_entry_point.amber +++ b/tests/cases/non_default_entry_point.amber @@ -13,8 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -DEVICE_EXTENSION VK_KHR_storage_buffer_storage_class - SHADER compute my_shader SPIRV-ASM OpCapability Shader OpExtension "SPV_KHR_storage_buffer_storage_class" diff --git a/tests/cases/shader_specialization.amber b/tests/cases/shader_specialization.amber index 4514b6f..1db2a4f 100644 --- a/tests/cases/shader_specialization.amber +++ b/tests/cases/shader_specialization.amber @@ -13,8 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -DEVICE_EXTENSION VK_KHR_storage_buffer_storage_class - SHADER compute my_compute SPIRV-ASM OpCapability Shader OpExtension "SPV_KHR_storage_buffer_storage_class" diff --git a/tests/cases/storage16.amber b/tests/cases/storage16.amber index 36a62dc..5cf8113 100644 --- a/tests/cases/storage16.amber +++ b/tests/cases/storage16.amber @@ -19,7 +19,6 @@ DEVICE_EXTENSION VK_KHR_16bit_storage DEVICE_FEATURE shaderInt16 DEVICE_FEATURE Storage16BitFeatures.uniformAndStorageBuffer16BitAccess DEVICE_FEATURE Storage16BitFeatures.storagePushConstant16 -DEVICE_FEATURE Storage16BitFeatures.storageBuffer16BitAccess SHADER compute comp_shader GLSL #version 450 diff --git a/tests/cases/tessellation_isolines.amber b/tests/cases/tessellation_isolines.amber deleted file mode 100644 index dd3f298..0000000 --- a/tests/cases/tessellation_isolines.amber +++ /dev/null @@ -1,130 +0,0 @@ -#!amber -# Copyright 2021 The Amber 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. - -DEVICE_FEATURE tessellationShader - -SHADER vertex vert GLSL -#version 450 - -layout (location = 0) in vec3 inPosition; - -void main(void) -{ - gl_Position = vec4(inPosition, 1.0); -} -END - -SHADER tessellation_control tesc GLSL -#version 450 - -layout (vertices = 4) out; - -void main(void) -{ - gl_TessLevelOuter[0] = 6.0; - gl_TessLevelOuter[1] = 2.0; - - gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position; -} -END - -SHADER tessellation_evaluation tese GLSL -#version 450 - -layout (isolines, equal_spacing, cw) in; - -void main(void) -{ - vec4 p1 = mix(gl_in[0].gl_Position, - gl_in[1].gl_Position, - gl_TessCoord.x); - - vec4 p2 = mix(gl_in[2].gl_Position, - gl_in[3].gl_Position, - gl_TessCoord.x); - - gl_Position = mix(p1, p2, gl_TessCoord.y); -} -END - -SHADER fragment frag GLSL -#version 450 - -layout (location = 0) out vec4 outColor; - -void main(void) -{ - outColor = vec4(1, 0, 0, 1); -} -END - -SHADER compute comp_shader GLSL -#version 450 -layout(local_size_x=10,local_size_y=10) in; -uniform layout(set=0, binding=0, rgba8) image2D resultImage; - -layout(set = 0, binding = 1) buffer block0 -{ - int counter; -}; - -void main() -{ - ivec2 uv = ivec2(gl_GlobalInvocationID.xy); - vec4 color = imageLoad(resultImage, uv); - if(color.r > 0.0) atomicAdd(counter, 1); -} -END - -BUFFER vertexPosition DATA_TYPE vec3<float> DATA --1.0 -1.0 0.0 - 1.0 -1.0 0.0 --1.0 1.0 0.0 - 1.0 1.0 0.0 -END - -BUFFER counter DATA_TYPE int32 DATA 0 END - -BUFFER framebuffer FORMAT B8G8R8A8_UNORM - -PIPELINE graphics pipeline - ATTACH vert - ATTACH tesc - ATTACH tese - ATTACH frag - - PATCH_CONTROL_POINTS 4 - - FRAMEBUFFER_SIZE 100 100 - VERTEX_DATA vertexPosition LOCATION 0 - BIND BUFFER framebuffer AS color LOCATION 0 -END - -CLEAR_COLOR pipeline 0 0 0 255 -CLEAR pipeline - -RUN pipeline DRAW_ARRAY AS PATCH_LIST START_IDX 0 COUNT 4 - -PIPELINE compute verify_pipeline - ATTACH comp_shader - BIND BUFFER framebuffer AS storage_image DESCRIPTOR_SET 0 BINDING 0 - BIND BUFFER counter AS storage DESCRIPTOR_SET 0 BINDING 1 - FRAMEBUFFER_SIZE 100 100 -END - -# Count the number of red pixels as the line position might differ between implementations. -RUN verify_pipeline 10 10 1 - -EXPECT counter IDX 0 TOLERANCE 50 EQ 500 diff --git a/tests/cases/viewport.amber b/tests/cases/viewport.amber deleted file mode 100644 index ca9b0a5..0000000 --- a/tests/cases/viewport.amber +++ /dev/null @@ -1,59 +0,0 @@ -#!amber -# -# Copyright 2021 The Amber 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. - -SHADER vertex vert_shader GLSL -#version 430 - -layout(location = 0) in vec4 position; - -void main() { - gl_Position = vec4(position.xy, 0.5, 1.0); -} -END - -SHADER fragment frag_shader GLSL -#version 430 - -layout(location = 0) out vec4 final_color; - -void main() { - final_color = vec4(0, 1, 0, 1); -} -END - -BUFFER framebuffer FORMAT B8G8R8A8_UNORM - -PIPELINE graphics pipeline1 - ATTACH vert_shader - ATTACH frag_shader - - FRAMEBUFFER_SIZE 256 256 - VIEWPORT 10.0 10.0 SIZE 100.0 100.0 - - BIND BUFFER framebuffer AS color LOCATION 0 -END - -CLEAR_COLOR pipeline1 255 255 255 255 -CLEAR pipeline1 -RUN pipeline1 DRAW_RECT POS 0 0 SIZE 256 256 - -# Check within the viewport -EXPECT framebuffer IDX 10 10 SIZE 100 100 EQ_RGBA 0 255 0 255 -# Check the borders were untouched -EXPECT framebuffer IDX 0 0 SIZE 10 256 EQ_RGBA 255 255 255 255 -EXPECT framebuffer IDX 110 0 SIZE 146 256 EQ_RGBA 255 255 255 255 -EXPECT framebuffer IDX 10 0 SIZE 100 10 EQ_RGBA 255 255 255 255 -EXPECT framebuffer IDX 10 110 SIZE 100 146 EQ_RGBA 255 255 255 255 diff --git a/tests/cases/viewport_depth.amber b/tests/cases/viewport_depth.amber deleted file mode 100644 index 2bf7a9e..0000000 --- a/tests/cases/viewport_depth.amber +++ /dev/null @@ -1,61 +0,0 @@ -#!amber -# -# Copyright 2021 The Amber 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. - -SHADER vertex vert_shader GLSL -#version 430 - -layout(location = 0) in vec4 position; - -void main() { - gl_Position = vec4(position.xy, 0.5, 1.0); -} -END - -SHADER fragment frag_shader GLSL -#version 430 - -layout(location = 0) out vec4 final_color; - -void main() { - final_color = vec4(0, 1, 0, 1); -} -END - -BUFFER framebuffer FORMAT B8G8R8A8_UNORM -BUFFER depth FORMAT D32_SFLOAT - -PIPELINE graphics pipeline1 - ATTACH vert_shader - ATTACH frag_shader - - DEPTH - TEST on - WRITE on - END - - FRAMEBUFFER_SIZE 256 256 - VIEWPORT 0.0 0.0 SIZE 256.0 256.0 MIN_DEPTH 0.3 MAX_DEPTH 0.9 - - BIND BUFFER framebuffer AS color LOCATION 0 - BIND BUFFER depth AS depth_stencil -END - -CLEAR_DEPTH pipeline1 1.0 -CLEAR_COLOR pipeline1 255 255 255 255 -CLEAR pipeline1 -RUN pipeline1 DRAW_RECT POS 0 0 SIZE 256 256 - -EXPECT depth IDX 0 TOLERANCE 1.0e-6 EQ 0.6 diff --git a/tests/run_tests.py b/tests/run_tests.py index 6cd8fc3..1fb7eb6 100755 --- a/tests/run_tests.py +++ b/tests/run_tests.py @@ -96,8 +96,6 @@ SUPPRESSIONS_SWIFTSHADER = [ # Unsupported depth/stencil formats "draw_rectangles_depth_test_d24s8.amber", "draw_rectangles_depth_test_x8d24.amber", - # Tessellation not supported - "tessellation_isolines.amber", ] OPENCL_CASES = [ diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt index 4668223..4319556 100644 --- a/third_party/CMakeLists.txt +++ b/third_party/CMakeLists.txt @@ -52,30 +52,19 @@ endif() if (${AMBER_USE_LOCAL_VULKAN}) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/vulkan-headers) - # Skip adding the validation layers and the Vulkan loader on Android. - if (NOT ANDROID) - - set(BUILD_TESTS FALSE) - - # The vulkan-loader CMake file assumes that directory exists if - # Wayland support is to be built. - if(NOT EXISTS ${WAYLAND_CLIENT_INCLUDE_DIR}) - message(STATUS "Amber: Disabling Wayland support in Vulkan-Loader") - set(BUILD_WSI_WAYLAND_SUPPORT OFF CACHE BOOL "" FORCE) - endif() - message(STATUS "Amber: Disabling X11 support in Vulkan-Loader") - set(BUILD_WSI_XLIB_SUPPORT OFF CACHE BOOL "" FORCE) - - set(ROBIN_HOOD_HASHING_INSTALL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/robin-hood-hashing" CACHE STRING "" FORCE) - add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/robin-hood-hashing) - set(SPIRV_HEADERS_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/spirv-headers/include" CACHE STRING "" FORCE) - - add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/vulkan-loader) - if (MSVC) - option(BUILD_WERROR "Treat compiler warnings as errors" OFF) - endif() - add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/vulkan-validationlayers) + set(BUILD_TESTS FALSE) + + # The vulkan-loader CMake file assumes that directory exists if + # Wayland support is to be built. + if(NOT EXISTS ${WAYLAND_CLIENT_INCLUDE_DIR}) + message(STATUS "Amber: Disabling Wayland support in Vulkan-Loader") + set(BUILD_WSI_WAYLAND_SUPPORT OFF CACHE BOOL "" FORCE) endif() + message(STATUS "Amber: Disabling X11 support in Vulkan-Loader") + set(BUILD_WSI_XLIB_SUPPORT OFF CACHE BOOL "" FORCE) + + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/vulkan-loader) + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/vulkan-validationlayers) endif() if (${AMBER_ENABLE_VK_DEBUGGING}) @@ -163,8 +152,6 @@ if (${AMBER_ENABLE_CLSPV}) set(AMBER_CLSPV_LLVM_DIR "${CMAKE_CURRENT_SOURCE_DIR}/clspv-llvm") endif() - list(APPEND CMAKE_MODULE_PATH ${AMBER_CLSPV_LLVM_DIR}/llvm/cmake/modules/) - set(CLSPV_LLVM_SOURCE_DIR "${AMBER_CLSPV_LLVM_DIR}/llvm" CACHE STRING "") set(CLSPV_CLANG_SOURCE_DIR "${AMBER_CLSPV_LLVM_DIR}/clang" CACHE STRING "") set(SPIRV_HEADERS_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/spirv-headers" CACHE STRING "") @@ -181,8 +168,4 @@ if (${AMBER_ENABLE_CLSPV}) set(LLVM_INCLUDE_UTILS OFF CACHE BOOL "") add_subdirectory(${AMBER_CLSPV_DIR} ${CMAKE_CURRENT_BINARY_DIR}/clspv) - - # TODO(asuonpaa): Using the latest LLVM gives multiple warnings of using deprecated - # arguments. Remove this when CLSPV doesn't use them. - add_compile_options(clspv, NO_DEPRECATED_FLAGS) endif() diff --git a/tools/roll-all b/tools/roll-all index 48557e8..97f00c3 100755 --- a/tools/roll-all +++ b/tools/roll-all @@ -15,6 +15,7 @@ # Defined to use origin/master instead of origin/main clspv=1 +clspv_llvm=1 cpplint=1 dxc=1 glslang=1 @@ -24,6 +25,7 @@ lodepng=1 spirv_headers=1 spirv_tools=1 swiftshader=1 +vulkan_headers=1 vulkan_loader=1 vulkan_validationlayers=1 |