// 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_