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