// Copyright 2012 Dolphin Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include #include #include "Common/CommonTypes.h" enum PerfQueryType { PQ_ZCOMP_INPUT_ZCOMPLOC = 0, PQ_ZCOMP_OUTPUT_ZCOMPLOC, PQ_ZCOMP_INPUT, PQ_ZCOMP_OUTPUT, PQ_BLEND_INPUT, PQ_EFB_COPY_CLOCKS, PQ_NUM_MEMBERS }; enum PerfQueryGroup { PQG_ZCOMP_ZCOMPLOC, PQG_ZCOMP, PQG_EFB_COPY_CLOCKS, PQG_NUM_MEMBERS, }; class PerfQueryBase { public: virtual ~PerfQueryBase(); virtual bool Initialize() { return true; } // Checks if performance queries are enabled in the gameini configuration. // NOTE: Called from CPU+GPU thread static bool ShouldEmulate(); // Begin querying the specified value for the following host GPU commands // The call to EnableQuery() should be placed immediately before the draw command, otherwise // there is a risk of GPU resets if the query is left open and the buffer is submitted during // resource binding (D3D12/Vulkan). virtual void EnableQuery(PerfQueryGroup type) = 0; // Stop querying the specified value for the following host GPU commands virtual void DisableQuery(PerfQueryGroup type) = 0; // Reset query counters to zero and drop any pending queries virtual void ResetQuery() = 0; // Return the measured value for the specified query type // NOTE: Called from CPU thread virtual u32 GetQueryResult(PerfQueryType type) = 0; // Request the value of any pending queries - causes a pipeline flush and thus should be used // carefully! virtual void FlushResults() = 0; // True if there are no further pending query results // NOTE: Called from CPU thread virtual bool IsFlushed() const = 0; }; class HardwarePerfQueryBase : public PerfQueryBase { public: u32 GetQueryResult(PerfQueryType type) final; bool IsFlushed() const final; protected: std::atomic m_query_count{}; std::array, PQG_NUM_MEMBERS> m_results{}; }; extern std::unique_ptr g_perf_query;