From 689df65966e733726cb3b455e33bfe67bc26c653 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Wed, 28 Sep 2016 10:50:43 -0400 Subject: [PATCH] Add examples to demo C++ library APIs. --- CMakeLists.txt | 1 + README.md | 1 + examples/CMakeLists.txt | 15 +++++++ examples/cpp-interface/CMakeLists.txt | 17 +++++++ examples/cpp-interface/main.cpp | 64 +++++++++++++++++++++++++++ 5 files changed, 98 insertions(+) create mode 100644 examples/CMakeLists.txt create mode 100644 examples/cpp-interface/CMakeLists.txt create mode 100644 examples/cpp-interface/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 647097368..0f0d5ea3e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -152,6 +152,7 @@ add_subdirectory(source) add_subdirectory(tools) add_subdirectory(test) +add_subdirectory(examples) install( FILES diff --git a/README.md b/README.md index 0c5d0499f..a429f5295 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,7 @@ We intend to maintain a linear history on the GitHub `master` branch. ### Source code organization +* `example`: demo code of using SPIRV-Tools APIs * `external/googletest`: Intended location for the [googletest][googletest] sources, not provided * `include/`: API clients should add this directory to the include search path diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt new file mode 100644 index 000000000..1dfaf8758 --- /dev/null +++ b/examples/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (c) 2016 Google Inc. +# +# 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. + +add_subdirectory(cpp-interface) diff --git a/examples/cpp-interface/CMakeLists.txt b/examples/cpp-interface/CMakeLists.txt new file mode 100644 index 000000000..4e98deded --- /dev/null +++ b/examples/cpp-interface/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (c) 2016 Google Inc. +# +# 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. + +add_executable(spirv-tools-cpp-example main.cpp) +spvtools_default_compile_options(spirv-tools-cpp-example) +target_link_libraries(spirv-tools-cpp-example PRIVATE SPIRV-Tools-opt) diff --git a/examples/cpp-interface/main.cpp b/examples/cpp-interface/main.cpp new file mode 100644 index 000000000..c5354b8bd --- /dev/null +++ b/examples/cpp-interface/main.cpp @@ -0,0 +1,64 @@ +// Copyright (c) 2016 Google Inc. +// +// 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. + +// This program demonstrates basic SPIR-V module processing using +// SPIRV-Tools C++ API: +// * Assembling +// * Validating +// * Optimizing +// * Disassembling + +#include +#include +#include + +#include "spirv-tools/libspirv.hpp" +#include "spirv-tools/optimizer.hpp" + +int main() { + const std::string source = + " OpCapability Shader " + " OpMemoryModel Logical GLSL450 " + " OpSource GLSL 450 " + " OpDecorate %spec SpecId 1 " + " %int = OpTypeInt 32 1 " + " %spec = OpSpecConstant %int 0 " + "%const = OpConstant %int 42"; + + spvtools::SpirvTools core(SPV_ENV_VULKAN_1_0); + spvtools::Optimizer opt(SPV_ENV_VULKAN_1_0); + + auto print_msg_to_stderr = [](spv_message_level_t, const char*, + const spv_position_t&, const char* m) { + std::cerr << "error: " << m << std::endl; + }; + core.SetMessageConsumer(print_msg_to_stderr); + opt.SetMessageConsumer(print_msg_to_stderr); + + std::vector spirv; + if (!core.Assemble(source, &spirv)) return 1; + if (!core.Validate(spirv)) return 1; + + opt.RegisterPass(spvtools::CreateSetSpecConstantDefaultValuePass({{1, "42"}})) + .RegisterPass(spvtools::CreateFreezeSpecConstantValuePass()) + .RegisterPass(spvtools::CreateUnifyConstantPass()) + .RegisterPass(spvtools::CreateStripDebugInfoPass()); + if (!opt.Run(spirv.data(), spirv.size(), &spirv)) return 1; + + std::string disassembly; + if (!core.Disassemble(spirv, &disassembly)) return 1; + std::cout << disassembly << "\n"; + + return 0; +}