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)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/client/buffer_tracker.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/client/cmd_buffer_helper.h"
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/client/mapped_memory.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gpu {
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gles2 {
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BufferTracker::BufferTracker(MappedMemoryManager* manager)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : mapped_memory_(manager) {
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BufferTracker::~BufferTracker() {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (!buffers_.empty()) {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RemoveBuffer(buffers_.begin()->first);
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BufferTracker::Buffer* BufferTracker::CreateBuffer(
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLuint id, GLsizeiptr size) {
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK_NE(0u, id);
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK_LE(0, size);
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32 shm_id = -1;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32 shm_offset = 0;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void* address = NULL;
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (size)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    address = mapped_memory_->Alloc(size, &shm_id, &shm_offset);
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Buffer* buffer = new Buffer(id, size, shm_id, shm_offset, address);
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::pair<BufferMap::iterator, bool> result =
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      buffers_.insert(std::make_pair(id, buffer));
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(result.second);
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return buffer;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BufferTracker::Buffer* BufferTracker::GetBuffer(GLuint client_id) {
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BufferMap::iterator it = buffers_.find(client_id);
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return it != buffers_.end() ? it->second : NULL;
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BufferTracker::RemoveBuffer(GLuint client_id) {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BufferMap::iterator it = buffers_.find(client_id);
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (it != buffers_.end()) {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Buffer* buffer = it->second;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    buffers_.erase(it);
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (buffer->address_)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      mapped_memory_->Free(buffer->address_);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delete buffer;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BufferTracker::FreePendingToken(Buffer* buffer, int32 token) {
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (buffer->address_)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mapped_memory_->FreePendingToken(buffer->address_, token);
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  buffer->size_ = 0;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  buffer->shm_id_ = 0;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  buffer->shm_offset_ = 0;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  buffer->address_ = NULL;
634ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  buffer->last_usage_token_ = 0;
644ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  buffer->last_async_upload_token_ = 0;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
674ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochvoid BufferTracker::Unmanage(Buffer* buffer) {
684ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  buffer->size_ = 0;
694ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  buffer->shm_id_ = 0;
704ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  buffer->shm_offset_ = 0;
714ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  buffer->address_ = NULL;
724ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  buffer->last_usage_token_ = 0;
734ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  buffer->last_async_upload_token_ = 0;
744ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch}
754ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
764ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdochvoid BufferTracker::Free(Buffer* buffer) {
774ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  if (buffer->address_)
784ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    mapped_memory_->Free(buffer->address_);
794ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
804ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  buffer->size_ = 0;
814ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  buffer->shm_id_ = 0;
824ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  buffer->shm_offset_ = 0;
834ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  buffer->address_ = NULL;
844ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  buffer->last_usage_token_ = 0;
854ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  buffer->last_async_upload_token_ = 0;
864ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch}
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace gles2
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace gpu
90