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