mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
178 lines
3.9 KiB
C++
178 lines
3.9 KiB
C++
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef GPU_COMMAND_BUFFER_CLIENT_QUERY_TRACKER_H_
|
|
#define GPU_COMMAND_BUFFER_CLIENT_QUERY_TRACKER_H_
|
|
|
|
#include <GLES2/gl2.h>
|
|
|
|
#include <deque>
|
|
#include <list>
|
|
|
|
#include "base/atomicops.h"
|
|
#include "base/containers/hash_tables.h"
|
|
#include "gles2_impl_export.h"
|
|
#include "gpu/command_buffer/common/gles2_cmd_format.h"
|
|
|
|
namespace gpu {
|
|
|
|
class CommandBufferHelper;
|
|
class MappedMemoryManager;
|
|
|
|
namespace gles2 {
|
|
|
|
class GLES2Implementation;
|
|
|
|
// Manages buckets of QuerySync instances in mapped memory.
|
|
class GLES2_IMPL_EXPORT QuerySyncManager {
|
|
public:
|
|
static const size_t kSyncsPerBucket = 4096;
|
|
|
|
struct Bucket {
|
|
explicit Bucket(QuerySync* sync_mem)
|
|
: syncs(sync_mem),
|
|
used_query_count(0) {
|
|
}
|
|
QuerySync* syncs;
|
|
unsigned used_query_count;
|
|
};
|
|
struct QueryInfo {
|
|
QueryInfo(Bucket* bucket, int32 id, uint32 offset, QuerySync* sync_mem)
|
|
: bucket(bucket),
|
|
shm_id(id),
|
|
shm_offset(offset),
|
|
sync(sync_mem) {
|
|
}
|
|
|
|
QueryInfo()
|
|
: bucket(NULL),
|
|
shm_id(0),
|
|
shm_offset(0),
|
|
sync(NULL) {
|
|
}
|
|
|
|
Bucket* bucket;
|
|
int32 shm_id;
|
|
uint32 shm_offset;
|
|
QuerySync* sync;
|
|
};
|
|
|
|
explicit QuerySyncManager(MappedMemoryManager* manager);
|
|
~QuerySyncManager();
|
|
|
|
bool Alloc(QueryInfo* info);
|
|
void Free(const QueryInfo& sync);
|
|
void Shrink();
|
|
|
|
private:
|
|
MappedMemoryManager* mapped_memory_;
|
|
std::deque<Bucket*> buckets_;
|
|
std::deque<QueryInfo> free_queries_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(QuerySyncManager);
|
|
};
|
|
|
|
// Tracks queries for client side of command buffer.
|
|
class GLES2_IMPL_EXPORT QueryTracker {
|
|
public:
|
|
class GLES2_IMPL_EXPORT Query {
|
|
public:
|
|
enum State {
|
|
kUninitialized, // never used
|
|
kActive, // between begin - end
|
|
kPending, // not yet complete
|
|
kComplete // completed
|
|
};
|
|
|
|
Query(GLuint id, GLenum target, const QuerySyncManager::QueryInfo& info);
|
|
|
|
GLenum target() const {
|
|
return target_;
|
|
}
|
|
|
|
GLenum id() const {
|
|
return id_;
|
|
}
|
|
|
|
int32 shm_id() const {
|
|
return info_.shm_id;
|
|
}
|
|
|
|
uint32 shm_offset() const {
|
|
return info_.shm_offset;
|
|
}
|
|
|
|
void MarkAsActive() {
|
|
state_ = kActive;
|
|
++submit_count_;
|
|
if (submit_count_ == INT_MAX)
|
|
submit_count_ = 1;
|
|
}
|
|
|
|
void MarkAsPending(int32 token) {
|
|
token_ = token;
|
|
state_ = kPending;
|
|
}
|
|
|
|
base::subtle::Atomic32 submit_count() const { return submit_count_; }
|
|
|
|
int32 token() const {
|
|
return token_;
|
|
}
|
|
|
|
bool NeverUsed() const {
|
|
return state_ == kUninitialized;
|
|
}
|
|
|
|
bool Pending() const {
|
|
return state_ == kPending;
|
|
}
|
|
|
|
bool CheckResultsAvailable(CommandBufferHelper* helper);
|
|
|
|
uint32 GetResult() const;
|
|
|
|
void Begin(GLES2Implementation* gl);
|
|
void End(GLES2Implementation* gl);
|
|
|
|
private:
|
|
friend class QueryTracker;
|
|
friend class QueryTrackerTest;
|
|
|
|
GLuint id_;
|
|
GLenum target_;
|
|
QuerySyncManager::QueryInfo info_;
|
|
State state_;
|
|
base::subtle::Atomic32 submit_count_;
|
|
int32 token_;
|
|
uint32 flush_count_;
|
|
uint64 client_begin_time_us_; // Only used for latency query target.
|
|
uint32 result_;
|
|
};
|
|
|
|
QueryTracker(MappedMemoryManager* manager);
|
|
~QueryTracker();
|
|
|
|
Query* CreateQuery(GLuint id, GLenum target);
|
|
Query* GetQuery(GLuint id);
|
|
void RemoveQuery(GLuint id);
|
|
void Shrink();
|
|
void FreeCompletedQueries();
|
|
|
|
private:
|
|
typedef base::hash_map<GLuint, Query*> QueryMap;
|
|
typedef std::list<Query*> QueryList;
|
|
|
|
QueryMap queries_;
|
|
QueryList removed_queries_;
|
|
QuerySyncManager query_sync_manager_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(QueryTracker);
|
|
};
|
|
|
|
} // namespace gles2
|
|
} // namespace gpu
|
|
|
|
#endif // GPU_COMMAND_BUFFER_CLIENT_QUERY_TRACKER_H_
|