vk_query_cache: Implement generic query cache on Vulkan

This commit is contained in:
ReinUsesLisp 2020-02-11 18:59:44 -03:00
parent c31382ced5
commit bcd348f238
11 changed files with 327 additions and 20 deletions

View file

@ -31,15 +31,16 @@ constexpr GLenum GetTarget(VideoCore::QueryType type) {
} // Anonymous namespace
QueryCache::QueryCache(Core::System& system, RasterizerOpenGL& gl_rasterizer)
: VideoCommon::QueryCacheBase<QueryCache, CachedQuery, CounterStream,
HostCounter>{system, static_cast<VideoCore::RasterizerInterface&>(
gl_rasterizer)},
: VideoCommon::QueryCacheBase<
QueryCache, CachedQuery, CounterStream, HostCounter,
std::vector<OGLQuery>>{system,
static_cast<VideoCore::RasterizerInterface&>(gl_rasterizer)},
gl_rasterizer{gl_rasterizer} {}
QueryCache::~QueryCache() = default;
OGLQuery QueryCache::AllocateQuery(VideoCore::QueryType type) {
auto& reserve = queries_reserve[static_cast<std::size_t>(type)];
auto& reserve = query_pools[static_cast<std::size_t>(type)];
OGLQuery query;
if (reserve.empty()) {
query.Create(GetTarget(type));
@ -52,7 +53,7 @@ OGLQuery QueryCache::AllocateQuery(VideoCore::QueryType type) {
}
void QueryCache::Reserve(VideoCore::QueryType type, OGLQuery&& query) {
queries_reserve[static_cast<std::size_t>(type)].push_back(std::move(query));
query_pools[static_cast<std::size_t>(type)].push_back(std::move(query));
}
bool QueryCache::AnyCommandQueued() const noexcept {

View file

@ -6,12 +6,8 @@
#include <array>
#include <memory>
#include <optional>
#include <unordered_map>
#include <vector>
#include <glad/glad.h>
#include "common/common_types.h"
#include "video_core/query_cache.h"
#include "video_core/rasterizer_interface.h"
@ -30,8 +26,8 @@ class RasterizerOpenGL;
using CounterStream = VideoCommon::CounterStreamBase<QueryCache, HostCounter>;
class QueryCache final
: public VideoCommon::QueryCacheBase<QueryCache, CachedQuery, CounterStream, HostCounter> {
class QueryCache final : public VideoCommon::QueryCacheBase<QueryCache, CachedQuery, CounterStream,
HostCounter, std::vector<OGLQuery>> {
public:
explicit QueryCache(Core::System& system, RasterizerOpenGL& rasterizer);
~QueryCache();
@ -44,7 +40,6 @@ public:
private:
RasterizerOpenGL& gl_rasterizer;
std::array<std::vector<OGLQuery>, VideoCore::NumQueryTypes> queries_reserve;
};
class HostCounter final : public VideoCommon::HostCounterBase<QueryCache, HostCounter> {
@ -59,7 +54,7 @@ private:
u64 BlockingQuery() const override;
QueryCache& cache;
VideoCore::QueryType type;
const VideoCore::QueryType type;
OGLQuery query;
};