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 && |