Chromium Code Reviews| Index: gpu/command_buffer/service/buffer_manager.cc |
| diff --git a/gpu/command_buffer/service/buffer_manager.cc b/gpu/command_buffer/service/buffer_manager.cc |
| index 864027dce48c38c395d63e2515069d09824ea45f..26c22e9adeebd5b2458c52ebbf4552cab2418670 100644 |
| --- a/gpu/command_buffer/service/buffer_manager.cc |
| +++ b/gpu/command_buffer/service/buffer_manager.cc |
| @@ -79,7 +79,9 @@ BufferManager::BufferInfo::BufferInfo(BufferManager* manager, GLuint service_id) |
| target_(0), |
| size_(0), |
| usage_(GL_STATIC_DRAW), |
| - shadowed_(false) { |
| + shadowed_(false), |
| + shm_id_(0), |
| + shm_offset_(0) { |
| manager_->StartTracking(this); |
| } |
| @@ -97,7 +99,9 @@ BufferManager::BufferInfo::~BufferInfo() { |
| void BufferManager::BufferInfo::SetInfo( |
| GLsizeiptr size, GLenum usage, bool shadow) { |
| usage_ = usage; |
| - if (size != size_ || shadow != shadowed_) { |
| + shm_id_ = 0; |
| + shm_offset_ = 0; |
| + if (size != size_ || shadow != shadowed_ || decoder_.get()) { |
| shadowed_ = shadow; |
| size_ = size; |
| ClearCache(); |
| @@ -105,6 +109,24 @@ void BufferManager::BufferInfo::SetInfo( |
| shadow_.reset(new int8[size]); |
| memset(shadow_.get(), 0, size); |
| } |
| + decoder_.reset(); |
| + } |
| +} |
| + |
| +void BufferManager::BufferInfo::SetInfo( |
| + GLsizeiptr size, GLenum usage, CommonDecoder* decoder, int32 shm_id, |
| + uint32 shm_offset) { |
| + usage_ = usage; |
| + shm_id_ = shm_id; |
| + shm_offset_ = shm_offset; |
| + if (size != size_ || shadowed_ || decoder_.get() != decoder) { |
| + size_ = size; |
| + ClearCache(); |
| + if (shadowed_) { |
| + shadow_.reset(); |
| + shadowed_ = false; |
| + } |
| + decoder_ = decoder->AsWeakPtr(); |
| } |
| } |
| @@ -117,18 +139,31 @@ bool BufferManager::BufferInfo::SetRange( |
| memcpy(shadow_.get() + offset, data, size); |
| ClearCache(); |
| } |
| + if (decoder_) { |
| + int8* shm_data = decoder_->GetSharedMemoryAs<int8*>( |
|
greggman
2012/05/24 20:56:00
I'm confused. Why would you need to copy memory in
reveman
2012/05/25 15:45:10
This is for when a client calls glBufferSubData, w
|
| + shm_id_, shm_offset_, size_); |
| + if (shm_data) |
| + memcpy(shm_data + offset, data, size); |
| + } |
| return true; |
| } |
| const void* BufferManager::BufferInfo::GetRange( |
| GLintptr offset, GLsizeiptr size) const { |
| - if (!shadowed_) { |
| - return NULL; |
| - } |
| if (offset < 0 || offset + size < offset || offset + size > size_) { |
| return NULL; |
| } |
| - return shadow_.get() + offset; |
| + if (shadowed_) { |
| + return shadow_.get() + offset; |
| + } |
| + if (decoder_) { |
|
greggman
2012/05/24 20:56:00
If this is a shared memory buffer should this go b
reveman
2012/05/25 15:45:10
Doesn't really matter as making a buffer a shm buf
|
| + int8* shm_data = decoder_->GetSharedMemoryAs<int8*>( |
| + shm_id_, shm_offset_, size_); |
| + if (!shm_data) |
| + return NULL; |
| + return shm_data + offset; |
| + } |
| + return NULL; |
| } |
| void BufferManager::BufferInfo::ClearCache() { |
| @@ -228,6 +263,15 @@ void BufferManager::SetInfo( |
| mem_represented_ += info->size(); |
| } |
| +void BufferManager::SetInfo( |
| + BufferManager::BufferInfo* info, GLsizeiptr size, GLenum usage, |
| + CommonDecoder* decoder, int32 shm_id, uint32 shm_offset) { |
| + DCHECK(info); |
| + mem_represented_ -= info->size(); |
| + info->SetInfo(size, usage, decoder, shm_id, shm_offset); |
| + mem_represented_ += info->size(); |
| +} |
| + |
| bool BufferManager::SetTarget(BufferManager::BufferInfo* info, GLenum target) { |
| // Check that we are not trying to bind it to a different target. |
| if (info->target() != 0 && info->target() != target && |