1// Copyright (c) 2016 Google Inc. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15// This program demonstrates basic SPIR-V module processing using 16// SPIRV-Tools C++ API: 17// * Assembling 18// * Validating 19// * Optimizing 20// * Disassembling 21 22#include <iostream> 23#include <string> 24#include <vector> 25 26#include "spirv-tools/libspirv.hpp" 27#include "spirv-tools/optimizer.hpp" 28 29int main() { 30 const std::string source = 31 " OpCapability Linkage " 32 " OpCapability Shader " 33 " OpMemoryModel Logical GLSL450 " 34 " OpSource GLSL 450 " 35 " OpDecorate %spec SpecId 1 " 36 " %int = OpTypeInt 32 1 " 37 " %spec = OpSpecConstant %int 0 " 38 "%const = OpConstant %int 42"; 39 40 spvtools::SpirvTools core(SPV_ENV_UNIVERSAL_1_3); 41 spvtools::Optimizer opt(SPV_ENV_UNIVERSAL_1_3); 42 43 auto print_msg_to_stderr = [](spv_message_level_t, const char*, 44 const spv_position_t&, const char* m) { 45 std::cerr << "error: " << m << std::endl; 46 }; 47 core.SetMessageConsumer(print_msg_to_stderr); 48 opt.SetMessageConsumer(print_msg_to_stderr); 49 50 std::vector<uint32_t> spirv; 51 if (!core.Assemble(source, &spirv)) return 1; 52 if (!core.Validate(spirv)) return 1; 53 54 opt.RegisterPass(spvtools::CreateSetSpecConstantDefaultValuePass({{1, "42"}})) 55 .RegisterPass(spvtools::CreateFreezeSpecConstantValuePass()) 56 .RegisterPass(spvtools::CreateUnifyConstantPass()) 57 .RegisterPass(spvtools::CreateStripDebugInfoPass()); 58 if (!opt.Run(spirv.data(), spirv.size(), &spirv)) return 1; 59 60 std::string disassembly; 61 if (!core.Disassemble(spirv, &disassembly)) return 1; 62 std::cout << disassembly << "\n"; 63 64 return 0; 65} 66