Files
parallel-gx1/Source/Core/VideoCommon/PerfQueryBase.h
T
LibretroAdmin 53238c0a06 VideoCommon, backends, input, DiscIO: std::atomic -> retro_atomic
- CommandProcessor: the FIFO registers shared by the CPU and GPU
  threads are retro_atomic words, read and written through LoadReg and
  StoreReg; MMIO's LowPart/HighPart take those words.
- Fifo: the video buffer write and seen pointers, the sync ticks and
  the stop request.
- PerfQueryBase: the query count and results sit behind base-class
  helpers that every backend (Metal too) uses instead of touching the
  atomics.
- Custom assets: the loader's memory delta and an asset's last load
  time are 64-bit words; Present's swap flag is an int.
- D3D's input layout, Vulkan's waiting_for_submit.
- InputCommon: a NumericSetting's value and the Wiimote and Android
  rumble levels are kept as their bits in a 64-bit word; the
  ControllerInterface flags, counter and aspect ratio are int words.
- CachedBlob's fill position and stop flag.

UICommon/GameFileCache is deleted: only the Android app's game list
used it, and that is not part of the core.
2026-11-06 00:19:39 +01:00

110 lines
3.1 KiB
C++

// Copyright 2012 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <memory>
#include <retro_atomic.h>
#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:
PerfQueryBase() {}
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) {}
// Stop querying the specified value for the following host GPU commands
virtual void DisableQuery(PerfQueryGroup type) {}
// Reset query counters to zero and drop any pending queries
virtual void ResetQuery() {}
// Return the measured value for the specified query type
// NOTE: Called from CPU thread
virtual u32 GetQueryResult(PerfQueryType type) { return 0; }
// Request the value of any pending queries - causes a pipeline flush and thus should be used
// carefully!
virtual void FlushResults() {}
// True if there are no further pending query results
// NOTE: Called from CPU thread
virtual bool IsFlushed() const { return true; }
protected:
/* The GPU thread retires queries while the CPU thread reads results: u32s in atomic words. */
u32 QueryCount() const { return static_cast<u32>(retro_atomic_load_acquire_int(&m_query_count)); }
void AddQueryCount(u32 count)
{
retro_atomic_fetch_add_int(&m_query_count, static_cast<int>(count));
}
void SubQueryCount(u32 count)
{
retro_atomic_fetch_sub_int(&m_query_count, static_cast<int>(count));
}
u32 QueryResult(PerfQueryGroup group) const
{
return static_cast<u32>(retro_atomic_load_acquire_int(&m_results[group]));
}
void AddQueryResult(PerfQueryGroup group, u32 value)
{
retro_atomic_fetch_add_int(&m_results[group], static_cast<int>(value));
}
void SetQueryResult(PerfQueryGroup group, u32 value)
{
retro_atomic_store_release_int(&m_results[group], static_cast<int>(value));
}
/* Drops the pending queries and zeroes the results. */
void ResetQueryState()
{
int i;
retro_atomic_store_release_int(&m_query_count, 0);
for (i = 0; i < PQG_NUM_MEMBERS; i++)
retro_atomic_store_release_int(&m_results[i], 0);
}
void ResetQueryResults()
{
int i;
for (i = 0; i < PQG_NUM_MEMBERS; i++)
retro_atomic_store_release_int(&m_results[i], 0);
}
retro_atomic_int_t m_query_count{};
retro_atomic_int_t m_results[PQG_NUM_MEMBERS]{};
};
extern std::unique_ptr<PerfQueryBase> g_perf_query;