Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(126)

Unified Diff: gpu/command_buffer/service/buffer_manager.cc

Issue 10440019: Add support for GL_CHROMIUM_pixel_transfer_buffer_object. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 &&

Powered by Google App Engine
This is Rietveld 408576698