// Copyright (c) 2018 The Khronos Group Inc. // Copyright (c) 2018 Valve Corporation // Copyright (c) 2018 LunarG 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. #ifndef LIBSPIRV_OPT_INSTRUMENT_PASS_H_ #define LIBSPIRV_OPT_INSTRUMENT_PASS_H_ #include <list> #include <memory> #include <vector> #include "source/opt/ir_builder.h" #include "source/opt/pass.h" #include "spirv-tools/instrument.hpp" // This is a base class to assist in the creation of passes which instrument // shader modules. More specifically, passes which replace instructions with a // larger and more capable set of instructions. Commonly, these new // instructions will add testing of operands and execute different // instructions depending on the outcome, including outputting of debug // information into a buffer created especially for that purpose. // // This class contains helper functions to create an InstProcessFunction, // which is the heart of any derived class implementing a specific // instrumentation pass. It takes an instruction as an argument, decides // if it should be instrumented, and generates code to replace it. This class // also supplies function InstProcessEntryPointCallTree which applies the // InstProcessFunction to every reachable instruction in a module and replaces // the instruction with new instructions if generated. // // Chief among the helper functions are output code generation functions, // used to generate code in the shader which writes data to output buffers // associated with that validation. Currently one such function, // GenDebugStreamWrite, exists. Other such functions may be added in the // future. Each is accompanied by documentation describing the format of // its output buffer. // // A validation pass may read or write multiple buffers. All such buffers // are located in a single debug descriptor set whose index is passed at the // creation of the instrumentation pass. The bindings of the buffers used by // a validation pass are permanently assigned and fixed and documented by // the kDebugOutput* static consts. namespace spvtools { namespace opt { class InstrumentPass : public Pass { … }; } // namespace opt } // namespace spvtools #endif // LIBSPIRV_OPT_INSTRUMENT_PASS_H_