Home | History | Annotate | Download | only in client
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef GPU_COMMAND_BUFFER_CLIENT_BUFFER_TRACKER_H_
      6 #define GPU_COMMAND_BUFFER_CLIENT_BUFFER_TRACKER_H_
      7 
      8 #include <GLES2/gl2.h>
      9 
     10 #include <queue>
     11 #include "base/containers/hash_tables.h"
     12 #include "gles2_impl_export.h"
     13 #include "gpu/command_buffer/common/gles2_cmd_format.h"
     14 
     15 namespace gpu {
     16 
     17 class CommandBufferHelper;
     18 class MappedMemoryManager;
     19 
     20 namespace gles2 {
     21 
     22 // Tracks buffer objects for client side of command buffer.
     23 class GLES2_IMPL_EXPORT BufferTracker {
     24  public:
     25   class GLES2_IMPL_EXPORT Buffer {
     26    public:
     27     Buffer(GLuint id,
     28            unsigned int size,
     29            int32 shm_id,
     30            uint32 shm_offset,
     31            void* address)
     32         : id_(id),
     33           size_(size),
     34           shm_id_(shm_id),
     35           shm_offset_(shm_offset),
     36           address_(address),
     37           mapped_(false),
     38           last_usage_token_(0),
     39           last_async_upload_token_(0) {
     40     }
     41 
     42     GLenum id() const {
     43       return id_;
     44     }
     45 
     46     unsigned int size() const {
     47       return size_;
     48     }
     49 
     50     int32 shm_id() const {
     51       return shm_id_;
     52     }
     53 
     54     uint32 shm_offset() const {
     55       return shm_offset_;
     56     }
     57 
     58     void* address() const {
     59       return address_;
     60     }
     61 
     62     void set_mapped(bool mapped) {
     63       mapped_ = mapped;
     64     }
     65 
     66     bool mapped() const {
     67       return mapped_;
     68     }
     69 
     70     void set_last_usage_token(int token) {
     71       last_usage_token_ = token;
     72     }
     73 
     74     int last_usage_token() const {
     75       return last_usage_token_;
     76     }
     77 
     78     void set_last_async_upload_token(uint32 async_token) {
     79       last_async_upload_token_ = async_token;
     80     }
     81 
     82     GLuint last_async_upload_token() const {
     83       return last_async_upload_token_;
     84     }
     85 
     86    private:
     87     friend class BufferTracker;
     88     friend class BufferTrackerTest;
     89 
     90     GLuint id_;
     91     unsigned int size_;
     92     int32 shm_id_;
     93     uint32 shm_offset_;
     94     void* address_;
     95     bool mapped_;
     96     int32 last_usage_token_;
     97     GLuint last_async_upload_token_;
     98   };
     99 
    100   BufferTracker(MappedMemoryManager* manager);
    101   ~BufferTracker();
    102 
    103   Buffer* CreateBuffer(GLuint id, GLsizeiptr size);
    104   Buffer* GetBuffer(GLuint id);
    105   void RemoveBuffer(GLuint id);
    106 
    107   // Frees the block of memory associated with buffer, pending the passage
    108   // of a token.
    109   void FreePendingToken(Buffer* buffer, int32 token);
    110   void Unmanage(Buffer* buffer);
    111   void Free(Buffer* buffer);
    112 
    113  private:
    114   typedef base::hash_map<GLuint, Buffer*> BufferMap;
    115 
    116   MappedMemoryManager* mapped_memory_;
    117   BufferMap buffers_;
    118 
    119   DISALLOW_COPY_AND_ASSIGN(BufferTracker);
    120 };
    121 
    122 }  // namespace gles2
    123 }  // namespace gpu
    124 
    125 #endif  // GPU_COMMAND_BUFFER_CLIENT_BUFFER_TRACKER_H_
    126