blob: f57989f0ccdeb12d47da0cbc662c1676fd51a31a [file] [log] [blame]
// 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 <memory>
#include <string>
#include <utility>
#include <vector>
#include "amber/result.h"
#include "src/command.h"
#include "src/pipeline.h"
#include "src/pipeline_data.h"
#include "src/script.h"
namespace amber {
class Tokenizer;
class Token;
namespace vkscript {
/// Parses the contents of the [test] section of a VkScript file into individual
/// commands.
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> command) {
commands_.push_back(std::move(command));
}
const std::vector<std::unique_ptr<Command>>& Commands() const {
return commands_;
}
std::vector<std::unique_ptr<Command>>&& 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<Probe::Tolerance>& 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,
Format* fmt,
std::vector<Value>* values);
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> tokenizer_;
std::vector<std::unique_ptr<Command>> commands_;
std::vector<Probe::Tolerance> current_tolerances_;
};
} // namespace vkscript
} // namespace amber
#endif // SRC_VKSCRIPT_COMMAND_PARSER_H_