12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef GPU_COMMAND_BUFFER_CLIENT_BUFFER_TRACKER_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define GPU_COMMAND_BUFFER_CLIENT_BUFFER_TRACKER_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <GLES2/gl2.h> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <queue> 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/containers/hash_tables.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gles2_impl_export.h" 1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_format.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gpu { 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CommandBufferHelper; 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MappedMemoryManager; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gles2 { 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tracks buffer objects for client side of command buffer. 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GLES2_IMPL_EXPORT BufferTracker { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class GLES2_IMPL_EXPORT Buffer { 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Buffer(GLuint id, 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned int size, 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 shm_id, 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 shm_offset, 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* address) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : id_(id), 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_(size), 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shm_id_(shm_id), 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shm_offset_(shm_offset), 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) address_(address), 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mapped_(false), 384ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch last_usage_token_(0), 394ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch last_async_upload_token_(0) { 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum id() const { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return id_; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned int size() const { 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return size_; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 shm_id() const { 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return shm_id_; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 shm_offset() const { 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return shm_offset_; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* address() const { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return address_; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_mapped(bool mapped) { 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mapped_ = mapped; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool mapped() const { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mapped_; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 704ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch void set_last_usage_token(int token) { 714ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch last_usage_token_ = token; 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 744ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch int last_usage_token() const { 754ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch return last_usage_token_; 764ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch } 774ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 784ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch void set_last_async_upload_token(uint32 async_token) { 794ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch last_async_upload_token_ = async_token; 804ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch } 814ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 824ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch GLuint last_async_upload_token() const { 834ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch return last_async_upload_token_; 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class BufferTracker; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class BufferTrackerTest; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint id_; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned int size_; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 shm_id_; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 shm_offset_; 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* address_; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool mapped_; 964ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch int32 last_usage_token_; 974ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch GLuint last_async_upload_token_; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BufferTracker(MappedMemoryManager* manager); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~BufferTracker(); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Buffer* CreateBuffer(GLuint id, GLsizeiptr size); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Buffer* GetBuffer(GLuint id); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RemoveBuffer(GLuint id); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Frees the block of memory associated with buffer, pending the passage 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // of a token. 1094ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch void FreePendingToken(Buffer* buffer, int32 token); 1104ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch void Unmanage(Buffer* buffer); 1114ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch void Free(Buffer* buffer); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) typedef base::hash_map<GLuint, Buffer*> BufferMap; 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MappedMemoryManager* mapped_memory_; 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BufferMap buffers_; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BufferTracker); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace gles2 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace gpu 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // GPU_COMMAND_BUFFER_CLIENT_BUFFER_TRACKER_H_ 126