diff options
author | Lei Zhang <antiagainst@google.com> | 2016-09-19 16:47:22 -0400 |
---|---|---|
committer | Lei Zhang <antiagainst@google.com> | 2016-09-23 15:05:39 -0400 |
commit | 90a0748905e2394e536be1c60dd13eaebafe89cf (patch) | |
tree | e1a6a121c4c3e7ef4f1e9e1b689000129d1f58b8 | |
parent | 9d742dfb2056b04c513135a8a13adf3128014c21 (diff) | |
download | shaderc-90a0748905e2394e536be1c60dd13eaebafe89cf.tar.gz |
Add glslc support for -O.
-rw-r--r-- | glslc/README.asciidoc | 32 | ||||
-rw-r--r-- | glslc/src/main.cc | 13 | ||||
-rw-r--r-- | glslc/test/option_dash_cap_O.py | 118 |
3 files changed, 158 insertions, 5 deletions
diff --git a/glslc/README.asciidoc b/glslc/README.asciidoc index 9709227..1922ed8 100644 --- a/glslc/README.asciidoc +++ b/glslc/README.asciidoc @@ -11,14 +11,16 @@ ---- glslc [-c|-S|-E] - [-Dmacroname[=value]...] - [-Idirectory...] - [-std=standard] [-x glsl] + [-x glsl] [-std=standard] [-fshader-stage=...] [--target-env=...] [-g] + [-O0|-Os] + [-Idirectory...] + [-Dmacroname[=value]...] [-w] [-Werror] - [-o outfile] shader... + [-o outfile] + shader... ---- == Description @@ -238,7 +240,7 @@ empty value. ==== `-I` -`-Idirectory' or `-I directory` adds the specified directory to the search path +`-Idirectory` or `-I directory` adds the specified directory to the search path for include files. The directory may be an absolute path or a relative path to the current working directory. @@ -249,9 +251,29 @@ the current working directory. Requests that the compiler place source-level debug information into the object code, such as identifier names and line numbers. +This option restrains `-O` from turning on the strip-debug-info optimization +pass. + NOTE: Currently this option has no effect. Full functionality depends on glslang support for generating debug info. +==== `-O0`, `-Os` + +`-O` specifies which optimization level to use: + +* `-O0` means "no optimization". This level compiles the fastest and generates + the most debuggable code. +* `-Os` enables optimizations to reduce code size. This level runs the + following optimization passes one by one: + - strip-debug-info: removes all debug instructions. (This pass will be turned + off if `-g` is specified.) + - unify-constant: unifies constants of identical type and bit pattern. + +For detailed explanation and implementation status of the passes mentioned +in the above, please refer to the +https://github.com/KhronosGroup/SPIRV-Tools/blob/master/include/spirv-tools/optimizer.hpp[SPIRV-Tools] project. + + ==== `-mfmt=<format>` `-mfmt=<format>` selects output format for compilation output in SPIR-V binary diff --git a/glslc/src/main.cc b/glslc/src/main.cc index 900b8f2..782e3ce 100644 --- a/glslc/src/main.cc +++ b/glslc/src/main.cc @@ -297,6 +297,19 @@ int main(int argc, char** argv) { } } else if (arg == "-g") { compiler.options().SetGenerateDebugInfo(); + } else if (arg.starts_with("-O")) { + if (arg == "-Os") { + compiler.options().SetOptimizationLevel( + shaderc_optimization_level_size); + } else if (arg == "-O0") { + compiler.options().SetOptimizationLevel( + shaderc_optimization_level_zero); + } else { + std::cerr << "glslc: error: invalid value '" + << arg.substr(std::strlen("-O")) << "' in '" << arg << "'" + << std::endl; + return 1; + } } else if (arg == "-w") { compiler.options().SetSuppressWarnings(); } else if (arg == "-Werror") { diff --git a/glslc/test/option_dash_cap_O.py b/glslc/test/option_dash_cap_O.py new file mode 100644 index 0000000..8a7f234 --- /dev/null +++ b/glslc/test/option_dash_cap_O.py @@ -0,0 +1,118 @@ +# Copyright 2016 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. + +import expect +from environment import File, Directory +from glslc_test_framework import inside_glslc_testsuite +from placeholder import FileShader + +MINIMAL_SHADER = '#version 310 es\nvoid main() {}' +EMPTY_SHADER_IN_CWD = Directory('.', [File('shader.vert', MINIMAL_SHADER)]) + +ASSEMBLY_WITH_DEBUG = [ + '; SPIR-V\n', + '; Version: 1.0\n', + '; Generator: Khronos Glslang Reference Front End; 1\n', + '; Bound: 6\n', + '; Schema: 0\n', + ' OpCapability Shader\n', + ' %1 = OpExtInstImport "GLSL.std.450"\n', + ' OpMemoryModel Logical GLSL450\n', + ' OpEntryPoint Vertex %main "main"\n', + ' OpSource ESSL 310\n', + ' OpSourceExtension "GL_GOOGLE_cpp_style_line_directive"\n', + ' OpSourceExtension "GL_GOOGLE_include_directive"\n', + ' OpName %main "main"\n', + ' %void = OpTypeVoid\n', + ' %3 = OpTypeFunction %void\n', + ' %main = OpFunction %void None %3\n', + ' %5 = OpLabel\n', + ' OpReturn\n', + ' OpFunctionEnd\n'] + +ASSEMBLY_WITHOUT_DEBUG = [ + '; SPIR-V\n', + '; Version: 1.0\n', + '; Generator: Khronos Glslang Reference Front End; 1\n', + '; Bound: 6\n', + '; Schema: 0\n', + ' OpCapability Shader\n', + ' %1 = OpExtInstImport "GLSL.std.450"\n', + ' OpMemoryModel Logical GLSL450\n', + ' OpEntryPoint Vertex %4 "main"\n', + ' %void = OpTypeVoid\n', + ' %3 = OpTypeFunction %void\n', + ' %4 = OpFunction %void None %3\n', # %4 vs. %main + ' %5 = OpLabel\n', + ' OpReturn\n', + ' OpFunctionEnd\n'] + + +@inside_glslc_testsuite('OptionDashCapO') +class TestDashCapO0(expect.ValidFileContents): + """Tests that -O0 works.""" + + environment = EMPTY_SHADER_IN_CWD + glslc_args = ['-S', '-O0', 'shader.vert'] + target_filename = 'shader.vert.spvasm' + expected_file_contents = ASSEMBLY_WITH_DEBUG + + +@inside_glslc_testsuite('OptionDashCapO') +class TestDashCapOs(expect.ValidFileContents): + """Tests that -Os works.""" + + environment = EMPTY_SHADER_IN_CWD + glslc_args = ['-S', '-Os', 'shader.vert'] + target_filename = 'shader.vert.spvasm' + expected_file_contents = ASSEMBLY_WITHOUT_DEBUG + + +@inside_glslc_testsuite('OptionDashCapO') +class TestDashCapOOverriding(expect.ValidFileContents): + """Tests that if there are multiple -O's, only the last one takes effect.""" + + environment = EMPTY_SHADER_IN_CWD + glslc_args = ['-S', '-Os', '-O0', '-Os', '-O0', 'shader.vert'] + target_filename = 'shader.vert.spvasm' + expected_file_contents = ASSEMBLY_WITH_DEBUG + + +@inside_glslc_testsuite('OptionDashCapO') +class TestDashCapOWithDashG(expect.ValidFileContents): + """Tests that -g restrains -O from turning on strip debug info.""" + + environment = EMPTY_SHADER_IN_CWD + glslc_args = ['-S', '-Os', '-g', 'shader.vert'] + target_filename = 'shader.vert.spvasm' + expected_file_contents = ASSEMBLY_WITH_DEBUG + + +@inside_glslc_testsuite('OptionDashCapO') +class TestDashGWithDashCapO(expect.ValidFileContents): + """Tests that -g restrains -O from turning on strip debug info.""" + + environment = EMPTY_SHADER_IN_CWD + glslc_args = ['-S', '-g', '-Os', 'shader.vert'] + target_filename = 'shader.vert.spvasm' + expected_file_contents = ASSEMBLY_WITH_DEBUG + + +@inside_glslc_testsuite('OptionDashCapO') +class TestWrongOptLevel(expect.NoGeneratedFiles, expect.ErrorMessage): + """Tests erroring out with wrong optimization level.""" + + shader = FileShader(MINIMAL_SHADER, '.vert') + glslc_args = ['-c', '-O2', shader] + expected_error = "glslc: error: invalid value '2' in '-O2'\n" |