Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(146)

Unified Diff: gpu/command_buffer/service/client_service_map.h

Issue 2317363005: Add basic GL functionality to the passthrough command buffer. (Closed)
Patch Set: Address piman's comments. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: gpu/command_buffer/service/client_service_map.h
diff --git a/gpu/command_buffer/service/client_service_map.h b/gpu/command_buffer/service/client_service_map.h
new file mode 100644
index 0000000000000000000000000000000000000000..f9812a377b32537a7d1bf20bc91e69eb86cef384
--- /dev/null
+++ b/gpu/command_buffer/service/client_service_map.h
@@ -0,0 +1,93 @@
+// Copyright (c) 2016 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_SERVICE_CLIENT_SERVICE_MAP_H_
+#define GPU_COMMAND_BUFFER_SERVICE_CLIENT_SERVICE_MAP_H_
+
+#include <limits>
+#include <unordered_map>
+
+namespace gpu {
+
+namespace gles2 {
+
+template <typename ClientType, typename ServiceType>
+class ClientServiceMap {
+ public:
+ ClientServiceMap()
+ : client_to_service_(),
+ reserved_client_to_service_(),
+ next_service_reserved_index_(std::numeric_limits<ServiceType>::max()) {}
+
+ void SetIDMapping(ClientType client_id, ServiceType service_id) {
+ DCHECK(client_to_service_.find(client_id) == client_to_service_.end() ||
+ reserved_client_to_service_.find(client_id) !=
+ reserved_client_to_service_.end());
+ client_to_service_[client_id] = service_id;
+ reserved_client_to_service_.erase(client_id);
+ }
+
+ void RemoveClientID(ClientType client_id) {
+ client_to_service_.erase(client_id);
+ reserved_client_to_service_.erase(client_id);
+ }
+
+ void Clear() {
+ client_to_service_.clear();
+ reserved_client_to_service_.clear();
+ next_service_reserved_index_ = std::numeric_limits<ServiceType>::max();
+ }
+
+ bool GetServiceID(ClientType client_id, ServiceType* service_id) const {
+ if (client_id == 0) {
+ if (service_id) {
+ *service_id = 0;
+ }
+ return true;
+ }
+ auto iter = client_to_service_.find(client_id);
+ if (iter != client_to_service_.end()) {
+ if (service_id) {
+ *service_id = iter->second;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ ServiceType GetServiceIDOrReserve(ClientType client_id) {
+ ServiceType service_id;
+ if (GetServiceID(client_id, &service_id)) {
+ return service_id;
+ }
+ return GetReservedServiceID(client_id);
+ }
+
+ typedef typename std::unordered_map<ClientType, ServiceType>::const_iterator
+ const_iterator;
+ const_iterator begin() const { return client_to_service_.begin(); }
+ const_iterator end() const { return client_to_service_.end(); }
+
+ private:
+ ServiceType GetReservedServiceID(ClientType client_id) {
+ auto iter = reserved_client_to_service_.find(client_id);
+ if (iter != reserved_client_to_service_.end()) {
+ return iter->second;
+ }
+
+ ServiceType service_id = next_service_reserved_index_--;
+ client_to_service_.erase(client_id);
+ reserved_client_to_service_[client_id] = service_id;
+ return service_id;
+ }
+
+ std::unordered_map<ClientType, ServiceType> client_to_service_;
+ std::unordered_map<ClientType, ServiceType> reserved_client_to_service_;
+ ServiceType next_service_reserved_index_;
+};
+
+} // namespace gles2
+} // namespace gpu
+
+#endif // GPU_COMMAND_BUFFER_SERVICE_CLIENT_SERVICE_MAP_H_

Powered by Google App Engine
This is Rietveld 408576698