| // Copyright (c) 2018 Google LLC | |
| // | |
| // 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. | |
| // MARK-V is a compression format for SPIR-V binaries. It strips away | |
| // non-essential information (such as result ids which can be regenerated) and | |
| // uses various bit reduction techiniques to reduce the size of the binary and | |
| // make it more similar to other compressed SPIR-V files to further improve | |
| // compression of the dataset. | |
| #ifndef SOURCE_COMP_MARKV_H_ | |
| #define SOURCE_COMP_MARKV_H_ | |
| #include "spirv-tools/libspirv.hpp" | |
| namespace spvtools { | |
| namespace comp { | |
| class MarkvModel; | |
| struct MarkvCodecOptions { | |
| bool validate_spirv_binary = false; | |
| }; | |
| // Debug callback. Called once per instruction. | |
| // |words| is instruction SPIR-V words. | |
| // |bits| is a textual representation of the MARK-V bit sequence used to encode | |
| // the instruction (char '0' for 0, char '1' for 1). | |
| // |comment| contains all logs generated while processing the instruction. | |
| using MarkvDebugConsumer = | |
| std::function<bool(const std::vector<uint32_t>& words, | |
| const std::string& bits, const std::string& comment)>; | |
| // Logging callback. Called often (if decoder reads a single bit, the log | |
| // consumer will receive 1 character string with that bit). | |
| // This callback is more suitable for continous output than MarkvDebugConsumer, | |
| // for example if the codec crashes it would allow to pinpoint on which operand | |
| // or bit the crash happened. | |
| // |snippet| could be any atomic fragment of text logged by the codec. It can | |
| // contain a paragraph of text with newlines, or can be just one character. | |
| using MarkvLogConsumer = std::function<void(const std::string& snippet)>; | |
| // Encodes the given SPIR-V binary to MARK-V binary. | |
| // |log_consumer| is optional (pass MarkvLogConsumer() to disable). | |
| // |debug_consumer| is optional (pass MarkvDebugConsumer() to disable). | |
| spv_result_t SpirvToMarkv( | |
| spv_const_context context, const std::vector<uint32_t>& spirv, | |
| const MarkvCodecOptions& options, const MarkvModel& markv_model, | |
| MessageConsumer message_consumer, MarkvLogConsumer log_consumer, | |
| MarkvDebugConsumer debug_consumer, std::vector<uint8_t>* markv); | |
| // Decodes a SPIR-V binary from the given MARK-V binary. | |
| // |log_consumer| is optional (pass MarkvLogConsumer() to disable). | |
| // |debug_consumer| is optional (pass MarkvDebugConsumer() to disable). | |
| spv_result_t MarkvToSpirv( | |
| spv_const_context context, const std::vector<uint8_t>& markv, | |
| const MarkvCodecOptions& options, const MarkvModel& markv_model, | |
| MessageConsumer message_consumer, MarkvLogConsumer log_consumer, | |
| MarkvDebugConsumer debug_consumer, std::vector<uint32_t>* spirv); | |
| } // namespace comp | |
| } // namespace spvtools | |
| #endif // SOURCE_COMP_MARKV_H_ |