summaryrefslogtreecommitdiffstats
path: root/src/video_core/debug_utils
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2020-01-03 03:09:31 +0100
committerReinUsesLisp <reinuseslisp@airmail.cc>2020-01-03 03:09:44 +0100
commit0d6d8129c46f96b2e9f05c592e0d9a6bc3769619 (patch)
tree387e5129419845948ddfc3884be8acd69626f324 /src/video_core/debug_utils
parentMerge pull request #3243 from ReinUsesLisp/topologies (diff)
downloadyuzu-0d6d8129c46f96b2e9f05c592e0d9a6bc3769619.tar
yuzu-0d6d8129c46f96b2e9f05c592e0d9a6bc3769619.tar.gz
yuzu-0d6d8129c46f96b2e9f05c592e0d9a6bc3769619.tar.bz2
yuzu-0d6d8129c46f96b2e9f05c592e0d9a6bc3769619.tar.lz
yuzu-0d6d8129c46f96b2e9f05c592e0d9a6bc3769619.tar.xz
yuzu-0d6d8129c46f96b2e9f05c592e0d9a6bc3769619.tar.zst
yuzu-0d6d8129c46f96b2e9f05c592e0d9a6bc3769619.zip
Diffstat (limited to 'src/video_core/debug_utils')
-rw-r--r--src/video_core/debug_utils/debug_utils.cpp49
-rw-r--r--src/video_core/debug_utils/debug_utils.h157
2 files changed, 0 insertions, 206 deletions
diff --git a/src/video_core/debug_utils/debug_utils.cpp b/src/video_core/debug_utils/debug_utils.cpp
deleted file mode 100644
index f0ef67535..000000000
--- a/src/video_core/debug_utils/debug_utils.cpp
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2014 Citra Emulator Project
-// Licensed under GPLv2
-// Refer to the license.txt file included.
-
-#include <mutex>
-
-#include "video_core/debug_utils/debug_utils.h"
-
-namespace Tegra {
-
-void DebugContext::DoOnEvent(Event event, void* data) {
- {
- std::unique_lock lock{breakpoint_mutex};
-
- // TODO(Subv): Commit the rasterizer's caches so framebuffers, render targets, etc. will
- // show on debug widgets
-
- // TODO: Should stop the CPU thread here once we multithread emulation.
-
- active_breakpoint = event;
- at_breakpoint = true;
-
- // Tell all observers that we hit a breakpoint
- for (auto& breakpoint_observer : breakpoint_observers) {
- breakpoint_observer->OnMaxwellBreakPointHit(event, data);
- }
-
- // Wait until another thread tells us to Resume()
- resume_from_breakpoint.wait(lock, [&] { return !at_breakpoint; });
- }
-}
-
-void DebugContext::Resume() {
- {
- std::lock_guard lock{breakpoint_mutex};
-
- // Tell all observers that we are about to resume
- for (auto& breakpoint_observer : breakpoint_observers) {
- breakpoint_observer->OnMaxwellResume();
- }
-
- // Resume the waiting thread (i.e. OnEvent())
- at_breakpoint = false;
- }
-
- resume_from_breakpoint.notify_one();
-}
-
-} // namespace Tegra
diff --git a/src/video_core/debug_utils/debug_utils.h b/src/video_core/debug_utils/debug_utils.h
deleted file mode 100644
index ac3a2eb01..000000000
--- a/src/video_core/debug_utils/debug_utils.h
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright 2014 Citra Emulator Project
-// Licensed under GPLv2
-// Refer to the license.txt file included.
-
-#pragma once
-
-#include <array>
-#include <condition_variable>
-#include <list>
-#include <memory>
-#include <mutex>
-
-namespace Tegra {
-
-class DebugContext {
-public:
- enum class Event {
- FirstEvent = 0,
-
- MaxwellCommandLoaded = FirstEvent,
- MaxwellCommandProcessed,
- IncomingPrimitiveBatch,
- FinishedPrimitiveBatch,
-
- NumEvents
- };
-
- /**
- * Inherit from this class to be notified of events registered to some debug context.
- * Most importantly this is used for our debugger GUI.
- *
- * To implement event handling, override the OnMaxwellBreakPointHit and OnMaxwellResume methods.
- * @warning All BreakPointObservers need to be on the same thread to guarantee thread-safe state
- * access
- * @todo Evaluate an alternative interface, in which there is only one managing observer and
- * multiple child observers running (by design) on the same thread.
- */
- class BreakPointObserver {
- public:
- /// Constructs the object such that it observes events of the given DebugContext.
- explicit BreakPointObserver(std::shared_ptr<DebugContext> debug_context)
- : context_weak(debug_context) {
- std::unique_lock lock{debug_context->breakpoint_mutex};
- debug_context->breakpoint_observers.push_back(this);
- }
-
- virtual ~BreakPointObserver() {
- auto context = context_weak.lock();
- if (context) {
- {
- std::unique_lock lock{context->breakpoint_mutex};
- context->breakpoint_observers.remove(this);
- }
-
- // If we are the last observer to be destroyed, tell the debugger context that
- // it is free to continue. In particular, this is required for a proper yuzu
- // shutdown, when the emulation thread is waiting at a breakpoint.
- if (context->breakpoint_observers.empty())
- context->Resume();
- }
- }
-
- /**
- * Action to perform when a breakpoint was reached.
- * @param event Type of event which triggered the breakpoint
- * @param data Optional data pointer (if unused, this is a nullptr)
- * @note This function will perform nothing unless it is overridden in the child class.
- */
- virtual void OnMaxwellBreakPointHit(Event event, void* data) {}
-
- /**
- * Action to perform when emulation is resumed from a breakpoint.
- * @note This function will perform nothing unless it is overridden in the child class.
- */
- virtual void OnMaxwellResume() {}
-
- protected:
- /**
- * Weak context pointer. This need not be valid, so when requesting a shared_ptr via
- * context_weak.lock(), always compare the result against nullptr.
- */
- std::weak_ptr<DebugContext> context_weak;
- };
-
- /**
- * Simple structure defining a breakpoint state
- */
- struct BreakPoint {
- bool enabled = false;
- };
-
- /**
- * Static constructor used to create a shared_ptr of a DebugContext.
- */
- static std::shared_ptr<DebugContext> Construct() {
- return std::shared_ptr<DebugContext>(new DebugContext);
- }
-
- /**
- * Used by the emulation core when a given event has happened. If a breakpoint has been set
- * for this event, OnEvent calls the event handlers of the registered breakpoint observers.
- * The current thread then is halted until Resume() is called from another thread (or until
- * emulation is stopped).
- * @param event Event which has happened
- * @param data Optional data pointer (pass nullptr if unused). Needs to remain valid until
- * Resume() is called.
- */
- void OnEvent(Event event, void* data) {
- // This check is left in the header to allow the compiler to inline it.
- if (!breakpoints[(int)event].enabled)
- return;
- // For the rest of event handling, call a separate function.
- DoOnEvent(event, data);
- }
-
- void DoOnEvent(Event event, void* data);
-
- /**
- * Resume from the current breakpoint.
- * @warning Calling this from the same thread that OnEvent was called in will cause a deadlock.
- * Calling from any other thread is safe.
- */
- void Resume();
-
- /**
- * Delete all set breakpoints and resume emulation.
- */
- void ClearBreakpoints() {
- for (auto& bp : breakpoints) {
- bp.enabled = false;
- }
- Resume();
- }
-
- // TODO: Evaluate if access to these members should be hidden behind a public interface.
- std::array<BreakPoint, static_cast<int>(Event::NumEvents)> breakpoints;
- Event active_breakpoint{};
- bool at_breakpoint = false;
-
-private:
- /**
- * Private default constructor to make sure people always construct this through Construct()
- * instead.
- */
- DebugContext() = default;
-
- /// Mutex protecting current breakpoint state and the observer list.
- std::mutex breakpoint_mutex;
-
- /// Used by OnEvent to wait for resumption.
- std::condition_variable resume_from_breakpoint;
-
- /// List of registered observers
- std::list<BreakPointObserver*> breakpoint_observers;
-};
-
-} // namespace Tegra