// Copyright 2018 The Amber Authors. // // 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 SRC_VKSCRIPT_COMMAND_PARSER_H_ #define SRC_VKSCRIPT_COMMAND_PARSER_H_ #include #include #include #include #include "amber/result.h" #include "src/command.h" #include "src/datum_type.h" #include "src/pipeline.h" #include "src/pipeline_data.h" #include "src/script.h" namespace amber { class Tokenizer; class Token; namespace vkscript { class CommandParser { public: CommandParser(Script* script, Pipeline* pipeline, size_t current_line, const std::string& data); ~CommandParser(); Result Parse(); void AddCommand(std::unique_ptr command) { commands_.push_back(std::move(command)); } const std::vector>& Commands() const { return commands_; } std::vector>&& TakeCommands() { return std::move(commands_); } const PipelineData* PipelineDataForTesting() const { return &pipeline_data_; } Result ParseBooleanForTesting(const std::string& str, bool* result) { return ParseBoolean(str, result); } Result ParseBlendFactorNameForTesting(const std::string& name, BlendFactor* factor) { return ParseBlendFactorName(name, factor); } Result ParseBlendOpNameForTesting(const std::string& name, BlendOp* op) { return ParseBlendOpName(name, op); } Result ParseCompareOpNameForTesting(const std::string& name, CompareOp* op) { return ParseCompareOpName(name, op); } Result ParseStencilOpNameForTesting(const std::string& name, StencilOp* op) { return ParseStencilOpName(name, op); } Result ParseComparatorForTesting(const std::string& name, ProbeSSBOCommand::Comparator* op) { return ParseComparator(name, op); } const std::vector& TolerancesForTesting() const { return current_tolerances_; } private: std::string make_error(const std::string& err); Result TokenToFloat(Token* token, float* val) const; Result TokenToDouble(Token* token, double* val) const; Result ParseBoolean(const std::string& str, bool* result); Result ParseValues(const std::string& name, const DatumType& type, std::vector* values, bool use_std430_layout); Result ProcessDrawRect(); Result ProcessDrawArrays(); Result ProcessCompute(); Result ProcessClear(); Result ProcessPatch(); Result ProcessSSBO(); Result ProcessUniform(); Result ProcessTolerance(); Result ProcessEntryPoint(const std::string& name); Result ProcessProbe(bool relative); Result ProcessProbeSSBO(); Result ProcessTopology(); Result ProcessPolygonMode(); Result ProcessLogicOp(); Result ProcessCullMode(); Result ProcessFrontFace(); Result ProcessFloatPipelineData(const std::string& name, float* value); Result ProcessDepthBiasConstantFactor(); Result ProcessDepthBiasClamp(); Result ProcessDepthBiasSlopeFactor(); Result ProcessLineWidth(); Result ProcessMinDepthBounds(); Result ProcessMaxDepthBounds(); Result ProcessBooleanPipelineData(const std::string& name, bool* value); Result ProcessPrimitiveRestartEnable(); Result ProcessDepthClampEnable(); Result ProcessRasterizerDiscardEnable(); Result ProcessDepthBiasEnable(); Result ProcessLogicOpEnable(); Result ProcessBlendEnable(); Result ProcessDepthTestEnable(); Result ProcessDepthWriteEnable(); Result ProcessDepthBoundsTestEnable(); Result ProcessStencilTestEnable(); Result ParseBlendFactor(const std::string& name, BlendFactor* factor); Result ParseBlendFactorName(const std::string& name, BlendFactor* factor); Result ProcessSrcAlphaBlendFactor(); Result ProcessDstAlphaBlendFactor(); Result ProcessSrcColorBlendFactor(); Result ProcessDstColorBlendFactor(); Result ParseBlendOp(const std::string& name, BlendOp* op); Result ParseBlendOpName(const std::string& name, BlendOp* op); Result ProcessColorBlendOp(); Result ProcessAlphaBlendOp(); Result ParseCompareOp(const std::string& name, CompareOp* op); Result ParseCompareOpName(const std::string& name, CompareOp* op); Result ProcessDepthCompareOp(); Result ProcessFrontCompareOp(); Result ProcessBackCompareOp(); Result ParseStencilOp(const std::string& name, StencilOp* op); Result ParseStencilOpName(const std::string& name, StencilOp* op); Result ProcessFrontFailOp(); Result ProcessFrontPassOp(); Result ProcessFrontDepthFailOp(); Result ProcessBackFailOp(); Result ProcessBackPassOp(); Result ProcessBackDepthFailOp(); Result ProcessFrontCompareMask(); Result ProcessFrontWriteMask(); Result ProcessBackCompareMask(); Result ProcessBackWriteMask(); Result ProcessFrontReference(); Result ProcessBackReference(); Result ProcessColorWriteMask(); Result ParseComparator(const std::string& name, ProbeSSBOCommand::Comparator* op); Script* script_; Pipeline* pipeline_; PipelineData pipeline_data_; std::unique_ptr tokenizer_; std::vector> commands_; std::vector current_tolerances_; }; } // namespace vkscript } // namespace amber #endif // SRC_VKSCRIPT_COMMAND_PARSER_H_