buffer_tracker.h revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
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>
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gles2_impl_export.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/client/hash_tables.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),
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          transfer_ready_token_(0) {
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLenum id() const {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return id_;
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned int size() const {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return size_;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int32 shm_id() const {
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return shm_id_;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    uint32 shm_offset() const {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return shm_offset_;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void* address() const {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return address_;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void set_mapped(bool mapped) {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      mapped_ = mapped;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool mapped() const {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return mapped_;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    void set_transfer_ready_token(int token) {
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      transfer_ready_token_ = token;
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    uint32 transfer_ready_token() const {
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return transfer_ready_token_;
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   private:
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    friend class BufferTracker;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    friend class BufferTrackerTest;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLuint id_;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned int size_;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int32 shm_id_;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    uint32 shm_offset_;
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void* address_;
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool mapped_;
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int32 transfer_ready_token_;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BufferTracker(MappedMemoryManager* manager);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~BufferTracker();
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Buffer* CreateBuffer(GLuint id, GLsizeiptr size);
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Buffer* GetBuffer(GLuint id);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RemoveBuffer(GLuint id);
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Frees the block of memory associated with buffer, pending the passage
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // of a token.
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FreePendingToken(Buffer*, int32 token);
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef gpu::hash_map<GLuint, Buffer*> BufferMap;
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MappedMemoryManager* mapped_memory_;
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BufferMap buffers_;
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BufferTracker);
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace gles2
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace gpu
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // GPU_COMMAND_BUFFER_CLIENT_BUFFER_TRACKER_H_
114