// Copyright 2020 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. #include "src/debug.h" #include #include #include #include #include "src/make_unique.h" namespace amber { namespace debug { namespace { class ScriptImpl : public Script { public: void Run(Events* e) const override { for (auto f : sequence_) { f(e); } } void BreakOnComputeGlobalInvocation( uint32_t x, uint32_t y, uint32_t z, const std::shared_ptr& thread) override { sequence_.emplace_back([=](Events* events) { events->BreakOnComputeGlobalInvocation(x, y, z, thread); }); } void BreakOnVertexIndex( uint32_t index, const std::shared_ptr& thread) override { sequence_.emplace_back( [=](Events* events) { events->BreakOnVertexIndex(index, thread); }); } void BreakOnFragmentWindowSpacePosition( uint32_t x, uint32_t y, const std::shared_ptr& thread) override { sequence_.emplace_back([=](Events* events) { events->BreakOnFragmentWindowSpacePosition(x, y, thread); }); } private: using Event = std::function; std::vector sequence_; }; class ThreadScriptImpl : public ThreadScript { public: void Run(Thread* thread) const override { for (auto f : sequence_) { f(thread); } } // Thread compliance void StepOver() override { sequence_.emplace_back([](Thread* t) { t->StepOver(); }); } void StepIn() override { sequence_.emplace_back([](Thread* t) { t->StepIn(); }); } void StepOut() override { sequence_.emplace_back([](Thread* t) { t->StepOut(); }); } void Continue() override { sequence_.emplace_back([](Thread* t) { t->Continue(); }); } void ExpectLocation(const Location& location, const std::string& line) override { sequence_.emplace_back( [=](Thread* t) { t->ExpectLocation(location, line); }); } void ExpectCallstack(const std::vector& callstack) override { sequence_.emplace_back([=](Thread* t) { t->ExpectCallstack(callstack); }); } void ExpectLocal(const std::string& name, int64_t value) override { sequence_.emplace_back([=](Thread* t) { t->ExpectLocal(name, value); }); } void ExpectLocal(const std::string& name, double value) override { sequence_.emplace_back([=](Thread* t) { t->ExpectLocal(name, value); }); } void ExpectLocal(const std::string& name, const std::string& value) override { sequence_.emplace_back([=](Thread* t) { t->ExpectLocal(name, value); }); } private: using Event = std::function; std::vector sequence_; }; } // namespace Thread::~Thread() = default; Events::~Events() = default; ThreadScript::~ThreadScript() = default; Script::~Script() = default; std::shared_ptr ThreadScript::Create() { return std::make_shared(); } std::unique_ptr