diff options
author | Dan Albert <danalbert@google.com> | 2017-10-02 18:37:56 -0700 |
---|---|---|
committer | Dan Albert <danalbert@google.com> | 2017-10-02 18:37:56 -0700 |
commit | 2399a8078d2ad8d298b876fbdb79b67a9ea3b406 (patch) | |
tree | ed37badb2fc2e09e5c086c680af1f0aaf929824c | |
parent | 8cf02164e6deb73bbccd7484a3bdad76b4be3411 (diff) | |
parent | 48feee09e007b52120cfbbcf968ead1e5152c262 (diff) | |
download | shaderc-ndk-release-r16.tar.gz |
Merge remote-tracking branch 'aosp/master-ndk' into r16-shadercndk-r16-beta2ndk-r16ndk-release-r16
Change-Id: Ieb3a49115d3b741eb664e491cddb452e3e411dcd
-rw-r--r-- | .appveyor.yml | 5 | ||||
-rw-r--r-- | CHANGES | 1 | ||||
-rw-r--r-- | cmake/utils.cmake | 5 | ||||
-rw-r--r-- | glslc/test/assembly.py | 6 | ||||
-rw-r--r-- | glslc/test/option_std.py | 24 | ||||
-rw-r--r-- | libshaderc_util/CMakeLists.txt | 5 | ||||
-rw-r--r-- | libshaderc_util/include/libshaderc_util/version_profile.h | 29 | ||||
-rw-r--r-- | libshaderc_util/src/version_profile_test.cc | 133 | ||||
-rw-r--r-- | third_party/Android.mk | 6 |
9 files changed, 206 insertions, 8 deletions
diff --git a/.appveyor.yml b/.appveyor.yml index ebf7bc5..2b903bb 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -4,6 +4,11 @@ # version format version: "{build}" +image: + - Visual Studio 2013 + - Visual Studio 2015 + - Visual Studio 2017 + platform: - x64 @@ -1,6 +1,7 @@ Revision history for Shaderc v2017.2-dev 2017-03-10 + - Support GLSL 4.6 and ESSL 3.2 - Add options for automatically set bindings for (uniform) resources that don't have bindings set in shader source. - Add option for using HLSL IO mappings as expressed in source. diff --git a/cmake/utils.cmake b/cmake/utils.cmake index d095486..95b4993 100644 --- a/cmake/utils.cmake +++ b/cmake/utils.cmake @@ -59,7 +59,10 @@ function(shaderc_add_asciidoc TARGET FILE) ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}.asciidoc DEPENDS ${FILE}.asciidoc ${ARGN} OUTPUT ${DEST}) - add_custom_target(${TARGET} ALL DEPENDS ${DEST}) + # Create the target, but the default build target does not depend on it. + # Some Asciidoctor installations are mysteriously broken, and it's hard + # to detect those cases. Generating HTML is not critical by default. + add_custom_target(${TARGET} DEPENDS ${DEST}) endif(ASCIIDOCTOR_EXE) endfunction() diff --git a/glslc/test/assembly.py b/glslc/test/assembly.py index a537044..aad9e6d 100644 --- a/glslc/test/assembly.py +++ b/glslc/test/assembly.py @@ -126,8 +126,10 @@ class TestShaderStageWithAssemblyFile(expect.ErrorMessage): expected_error = [ shader, ": error: #version: Desktop shaders for Vulkan SPIR-V require " "version 140 or higher\n", - shader, ":2: error: '' : syntax error, unexpected SEMICOLON\n", - '2 errors generated.\n'] + shader, ":2: error: 'extraneous semicolon' :", + " not supported for this version or the enabled extensions\n", + shader, ":2: error: '' : syntax error, unexpected IDENTIFIER\n", + '3 errors generated.\n'] @inside_glslc_testsuite('SpirvAssembly') diff --git a/glslc/test/option_std.py b/glslc/test/option_std.py index 52609af..ff65a4b 100644 --- a/glslc/test/option_std.py +++ b/glslc/test/option_std.py @@ -77,6 +77,30 @@ class TestMissingVersionButHavingStd(expect.ValidObjectFile): @inside_glslc_testsuite('OptionStd') +class TestGLSL460(expect.ValidObjectFile): + """Tests that GLSL version 4.6 is supported.""" + + shader = FileShader(core_frag_shader_without_version(), '.frag') + glslc_args = ['-c', '-std=460', shader] + + +@inside_glslc_testsuite('OptionStd') +class TestGLSL460Core(expect.ValidObjectFile): + """Tests that GLSL version 4.6 core profile is supported.""" + + shader = FileShader(core_frag_shader_without_version(), '.frag') + glslc_args = ['-c', '-std=460core', shader] + + +@inside_glslc_testsuite('OptionStd') +class TestESSL320(expect.ValidObjectFile): + """Tests that ESSL version 3.2 is supported.""" + + shader = FileShader(core_frag_shader_without_version(), '.frag') + glslc_args = ['-c', '-std=320es', shader] + + +@inside_glslc_testsuite('OptionStd') class TestStdIgnoredInHlsl(expect.ValidObjectFile): """Tests HLSL compilation ignores -std.""" diff --git a/libshaderc_util/CMakeLists.txt b/libshaderc_util/CMakeLists.txt index e636452..873540a 100644 --- a/libshaderc_util/CMakeLists.txt +++ b/libshaderc_util/CMakeLists.txt @@ -47,11 +47,14 @@ shaderc_add_tests( file_finder io message - mutex) + mutex + version_profile) if(${SHADERC_ENABLE_TESTS}) target_include_directories(shaderc_util_counting_includer_test PRIVATE ${glslang_SOURCE_DIR}) + target_include_directories(shaderc_util_version_profile_test + PRIVATE ${glslang_SOURCE_DIR}) endif() shaderc_add_tests( diff --git a/libshaderc_util/include/libshaderc_util/version_profile.h b/libshaderc_util/include/libshaderc_util/version_profile.h index 78196b2..f536b30 100644 --- a/libshaderc_util/include/libshaderc_util/version_profile.h +++ b/libshaderc_util/include/libshaderc_util/version_profile.h @@ -23,15 +23,36 @@ namespace shaderc_util { // Returns true if the given version is an accepted GLSL (ES) version. inline bool IsKnownVersion(int version) { - return version == 100 || version == 110 || version == 120 || version == 130 || - version == 140 || version == 150 || version == 300 || version == 330 || - version == 310 || version == 400 || version == 410 || version == 420 || - version == 430 || version == 440 || version == 450; + switch (version) { + case 100: + case 110: + case 120: + case 130: + case 140: + case 150: + case 300: + case 310: + case 320: + case 330: + case 400: + case 410: + case 420: + case 430: + case 440: + case 450: + case 460: + return true; + default: + break; + } + return false; } // Given a string version_profile containing both version and profile, decodes // it and puts the decoded version in version, decoded profile in profile. // Returns true if decoding is successful and version and profile are accepted. +// This does not validate the version number against the profile. For example, +// "460es" doesn't make sense (yet), but is still accepted. bool ParseVersionProfile(const std::string& version_profile, int* version, EProfile* profile); diff --git a/libshaderc_util/src/version_profile_test.cc b/libshaderc_util/src/version_profile_test.cc new file mode 100644 index 0000000..1cbedfd --- /dev/null +++ b/libshaderc_util/src/version_profile_test.cc @@ -0,0 +1,133 @@ +// Copyright 2017 The Shaderc Authors. All rights reserved. +// +// 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 implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "libshaderc_util/version_profile.h" + +#include "gmock/gmock.h" + +namespace { + +using shaderc_util::IsKnownVersion; +using shaderc_util::ParseVersionProfile; +using ::testing::Eq; +using ::testing::ValuesIn; + + +TEST(IsKnownVersionTest, Samples) { + EXPECT_TRUE(IsKnownVersion(100)); + EXPECT_TRUE(IsKnownVersion(110)); + EXPECT_TRUE(IsKnownVersion(120)); + EXPECT_TRUE(IsKnownVersion(130)); + EXPECT_TRUE(IsKnownVersion(140)); + EXPECT_TRUE(IsKnownVersion(150)); + EXPECT_TRUE(IsKnownVersion(300)); + EXPECT_TRUE(IsKnownVersion(330)); + EXPECT_TRUE(IsKnownVersion(310)); + EXPECT_TRUE(IsKnownVersion(400)); + EXPECT_TRUE(IsKnownVersion(410)); + EXPECT_TRUE(IsKnownVersion(420)); + EXPECT_TRUE(IsKnownVersion(430)); + EXPECT_TRUE(IsKnownVersion(440)); + EXPECT_TRUE(IsKnownVersion(450)); + EXPECT_TRUE(IsKnownVersion(460)); + EXPECT_FALSE(IsKnownVersion(101)); + EXPECT_FALSE(IsKnownVersion(470)); +} + + +struct ParseVersionProfileCase { + std::string input; + bool success; + // The following are only used when success is true. + int expected_version; + EProfile expected_profile; +}; + +using ParseVersionProfileTest = ::testing::TestWithParam<ParseVersionProfileCase>; + +TEST_P(ParseVersionProfileTest, Sample) { + int version = 0; + EProfile profile = EBadProfile; + const bool result = ParseVersionProfile(GetParam().input, &version, &profile); + EXPECT_THAT(result, GetParam().success); + if (result) { + EXPECT_THAT(version, GetParam().expected_version); + EXPECT_THAT(profile, GetParam().expected_profile); + } +} + + +// For OpenGL ES GLSL (ESSL) versions, see +// https://www.khronos.org/registry/OpenGL/index_e.php + +INSTANTIATE_TEST_CASE_P(OpenGLESCases, ParseVersionProfileTest, + ValuesIn(std::vector<ParseVersionProfileCase>{ + {"100es", true, 100, EEsProfile}, + {"300es", true, 300, EEsProfile}, + {"310es", true, 310, EEsProfile}, + {"320es", true, 320, EEsProfile}, + {"99es", false, 0, EBadProfile}, + {"500es", false, 0, EBadProfile}, + }), ); + +// For OpenGL GLSL versions, see +// https://www.khronos.org/registry/OpenGL/index_gl.php + +INSTANTIATE_TEST_CASE_P(OpenGLBlankCases, ParseVersionProfileTest, + ValuesIn(std::vector<ParseVersionProfileCase>{ + {"110", true, 110, ENoProfile}, + {"120", true, 120, ENoProfile}, + {"130", true, 130, ENoProfile}, + {"140", true, 140, ENoProfile}, + {"150", true, 150, ENoProfile}, + {"330", true, 330, ENoProfile}, + {"400", true, 400, ENoProfile}, + {"410", true, 410, ENoProfile}, + {"420", true, 420, ENoProfile}, + {"430", true, 430, ENoProfile}, + {"440", true, 440, ENoProfile}, + {"450", true, 450, ENoProfile}, + {"460", true, 460, ENoProfile}, + {"99", false, 0, EBadProfile}, + {"500", false, 0, EBadProfile}, + }), ); + +INSTANTIATE_TEST_CASE_P(OpenGLCoreCases, ParseVersionProfileTest, + ValuesIn(std::vector<ParseVersionProfileCase>{ + {"320core", true, 320, ECoreProfile}, + {"330core", true, 330, ECoreProfile}, + {"400core", true, 400, ECoreProfile}, + {"410core", true, 410, ECoreProfile}, + {"420core", true, 420, ECoreProfile}, + {"430core", true, 430, ECoreProfile}, + {"440core", true, 440, ECoreProfile}, + {"450core", true, 450, ECoreProfile}, + {"460core", true, 460, ECoreProfile}, + }), ); + +INSTANTIATE_TEST_CASE_P( + OpenGLCompatibilityCases, ParseVersionProfileTest, + ValuesIn(std::vector<ParseVersionProfileCase>{ + {"320compatibility", true, 320, ECompatibilityProfile}, + {"330compatibility", true, 330, ECompatibilityProfile}, + {"400compatibility", true, 400, ECompatibilityProfile}, + {"410compatibility", true, 410, ECompatibilityProfile}, + {"420compatibility", true, 420, ECompatibilityProfile}, + {"430compatibility", true, 430, ECompatibilityProfile}, + {"440compatibility", true, 440, ECompatibilityProfile}, + {"450compatibility", true, 450, ECompatibilityProfile}, + {"460compatibility", true, 460, ECompatibilityProfile}, + }), ); + +} // anonymous namespace diff --git a/third_party/Android.mk b/third_party/Android.mk index 6b9e451..582955f 100644 --- a/third_party/Android.mk +++ b/third_party/Android.mk @@ -118,6 +118,7 @@ SPVTOOLS_SRC_FILES := \ source/ext_inst.cpp \ source/enum_string_mapping.cpp \ source/extensions.cpp \ + source/id_descriptor.cpp \ source/libspirv.cpp \ source/name_mapper.cpp \ source/opcode.cpp \ @@ -155,6 +156,7 @@ SPVTOOLS_OPT_SRC_FILES := \ source/opt/block_merge_pass.cpp \ source/opt/build_module.cpp \ source/opt/compact_ids_pass.cpp \ + source/opt/common_uniform_elim_pass.cpp \ source/opt/dead_branch_elim_pass.cpp \ source/opt/def_use_manager.cpp \ source/opt/eliminate_dead_constant_pass.cpp \ @@ -163,6 +165,8 @@ SPVTOOLS_OPT_SRC_FILES := \ source/opt/freeze_spec_constant_value_pass.cpp \ source/opt/function.cpp \ source/opt/inline_pass.cpp \ + source/opt/inline_exhaustive_pass.cpp \ + source/opt/inline_opaque_pass.cpp \ source/opt/insert_extract_elim.cpp \ source/opt/instruction.cpp \ source/opt/ir_loader.cpp \ @@ -170,8 +174,10 @@ SPVTOOLS_OPT_SRC_FILES := \ source/opt/local_single_block_elim_pass.cpp \ source/opt/local_single_store_elim_pass.cpp \ source/opt/local_ssa_elim_pass.cpp \ + source/opt/mem_pass.cpp \ source/opt/module.cpp \ source/opt/optimizer.cpp \ + source/opt/pass.cpp \ source/opt/pass_manager.cpp \ source/opt/set_spec_constant_default_value_pass.cpp \ source/opt/strip_debug_info_pass.cpp \ |