Add examples to demo C++ library APIs.
authorLei Zhang <antiagainst@google.com>
Wed, 28 Sep 2016 14:50:43 +0000 (10:50 -0400)
committerLei Zhang <antiagainst@google.com>
Wed, 28 Sep 2016 19:24:00 +0000 (15:24 -0400)
CMakeLists.txt
README.md
examples/CMakeLists.txt [new file with mode: 0644]
examples/cpp-interface/CMakeLists.txt [new file with mode: 0644]
examples/cpp-interface/main.cpp [new file with mode: 0644]

index 6470973..0f0d5ea 100644 (file)
@@ -152,6 +152,7 @@ add_subdirectory(source)
 add_subdirectory(tools)
 
 add_subdirectory(test)
+add_subdirectory(examples)
 
 install(
   FILES
index 0c5d049..a429f52 100644 (file)
--- 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 (file)
index 0000000..1dfaf87
--- /dev/null
@@ -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 (file)
index 0000000..4e98ded
--- /dev/null
@@ -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 (file)
index 0000000..c5354b8
--- /dev/null
@@ -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 <iostream>
+#include <string>
+#include <vector>
+
+#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<uint32_t> 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;
+}