aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/rasterizer_interface.h
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2019-11-26 18:52:15 -0300
committerReinUsesLisp <reinuseslisp@airmail.cc>2020-02-14 17:33:13 -0300
commitaae8c180cbbf91ba12f53c37e81a97d4b3cc4ccd (patch)
tree560202675a073aa8e3863b4e17874fed27db8a6d /src/video_core/rasterizer_interface.h
parentef9920e164e208f03488ed9593ecffeaf4bcac3e (diff)
gl_query_cache: Implement host queries using a deferred cache
Instead of waiting immediately for executed commands, defer the query until the guest CPU reads it. This way we get closer to what the guest program is doing. To archive this we have to build a dependency queue, because host APIs (like OpenGL and Vulkan) use ranged queries instead of counters like NVN. Waiting for queries implicitly uses fences and this requires a command being queued, otherwise the driver will lock waiting until a timeout. To fix this when there are no commands queued, we explicitly call glFlush.
Diffstat (limited to 'src/video_core/rasterizer_interface.h')
-rw-r--r--src/video_core/rasterizer_interface.h5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/video_core/rasterizer_interface.h b/src/video_core/rasterizer_interface.h
index 2fc6275398..a394f2d3e0 100644
--- a/src/video_core/rasterizer_interface.h
+++ b/src/video_core/rasterizer_interface.h
@@ -20,6 +20,7 @@ namespace VideoCore {
enum class QueryType {
SamplesPassed,
};
+constexpr std::size_t NumQueryTypes = 1;
enum class LoadCallbackStage {
Prepare,
@@ -48,8 +49,8 @@ public:
/// Resets the counter of a query
virtual void ResetCounter(QueryType type) = 0;
- /// Returns the value of a GPU query
- virtual u64 Query(QueryType type) = 0;
+ /// Records a GPU query and caches it
+ virtual void Query(GPUVAddr gpu_addr, QueryType type) = 0;
/// Notify rasterizer that all caches should be flushed to Switch memory
virtual void FlushAll() = 0;