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

Unified Diff: gpu/command_buffer/client/gles2_implementation.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/client/gles2_implementation.cc
diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc
index e5e03ad616de3af16ecfaba5f899227d379996e1..9bc057e77835700c0a0b2fab4939019b218b9775 100644
--- a/gpu/command_buffer/client/gles2_implementation.cc
+++ b/gpu/command_buffer/client/gles2_implementation.cc
@@ -398,6 +398,8 @@ GLES2Implementation::GLES2Implementation(
bound_renderbuffer_(0),
bound_array_buffer_id_(0),
bound_element_array_buffer_id_(0),
+ bound_pixel_pack_transfer_buffer_id_(0),
+ bound_pixel_unpack_transfer_buffer_id_(0),
client_side_array_id_(0),
client_side_element_array_id_(0),
error_bits_(0),
@@ -468,6 +470,7 @@ bool GLES2Implementation::Initialize(
new TextureUnit[gl_state_.int_state.max_combined_texture_image_units]);
query_tracker_.reset(new QueryTracker(mapped_memory_.get()));
+ buffer_tracker_.reset(new BufferTracker(mapped_memory_.get()));
#if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
GetIdHandler(id_namespaces::kBuffers)->MakeIds(
@@ -489,6 +492,7 @@ GLES2Implementation::~GLES2Implementation() {
// shared will fail and abort (ie, it will stop running).
Finish();
query_tracker_.reset();
+ buffer_tracker_.reset();
#if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
DeleteBuffers(arraysize(reserved_ids_), &reserved_ids_[0]);
@@ -885,6 +889,18 @@ bool GLES2Implementation::GetHelper(GLenum pname, GLint* params) {
return true;
}
return false;
+ case GL_PIXEL_PACK_TRANSFER_BUFFER_BINDING_CHROMIUM:
+ if (share_group_->bind_generates_resource()) {
+ *params = bound_pixel_pack_transfer_buffer_id_;
+ return true;
+ }
+ return false;
+ case GL_PIXEL_UNPACK_TRANSFER_BUFFER_BINDING_CHROMIUM:
+ if (share_group_->bind_generates_resource()) {
+ *params = bound_pixel_unpack_transfer_buffer_id_;
+ return true;
+ }
+ return false;
case GL_ACTIVE_TEXTURE:
*params = active_texture_unit_ + GL_TEXTURE0;
return true;
@@ -1491,6 +1507,31 @@ void GLES2Implementation::BufferDataHelper(
return;
}
+ switch (target) {
+ case GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM:
greggman 2012/05/24 20:56:00 style: case is indented from switch
+ case GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM: {
+ GLuint buffer_id = target != GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM ?
+ bound_pixel_unpack_transfer_buffer_id_ :
+ bound_pixel_pack_transfer_buffer_id_;
+ if (!buffer_id) {
+ SetGLError(GL_INVALID_VALUE, "glBufferData: unknown buffer");
+ return;
+ }
+ // Remove old buffer.
+ buffer_tracker_->RemoveBuffer(buffer_id);
greggman 2012/05/24 20:56:00 Should this happen inside buffer_tracker as in som
reveman 2012/05/25 15:45:10 I agree. will fix this.
+
+ // Creat new buffer.
+ BufferTracker::Buffer* buffer = buffer_tracker_->CreateBuffer(
+ buffer_id, size);
+ GPU_DCHECK(buffer);
+ if (data)
+ memcpy(buffer->address(), data, size);
+ helper_->BufferData(
+ target, size, buffer->shm_id(), buffer->shm_offset(), usage);
+ return;
+ } break;
+ }
+
// If there is no data just send BufferData
if (!data) {
helper_->BufferData(target, size, 0, 0, usage);
@@ -1769,6 +1810,13 @@ void GLES2Implementation::TexSubImage2D(
return;
}
+ if (bound_pixel_unpack_transfer_buffer_id_) {
+ helper_->TexSubImage2D(
+ target, level, xoffset, yoffset, width, height, format, type,
+ 0, ToGLuint(pixels), false);
+ return;
+ }
+
uint32 temp_size;
uint32 unpadded_row_size;
uint32 padded_row_size;
@@ -2292,6 +2340,12 @@ void GLES2Implementation::BindBufferHelper(
case GL_ELEMENT_ARRAY_BUFFER:
bound_element_array_buffer_id_ = buffer;
break;
+ case GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM:
+ bound_pixel_pack_transfer_buffer_id_ = buffer;
+ break;
+ case GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM:
+ bound_pixel_unpack_transfer_buffer_id_ = buffer;
+ break;
default:
break;
}
@@ -2643,12 +2697,29 @@ void* GLES2Implementation::MapBufferSubDataCHROMIUM(
SetGLError(GL_INVALID_VALUE, "MapBufferSubDataCHROMIUM: bad range");
return NULL;
}
- int32 shm_id;
- unsigned int shm_offset;
- void* mem = mapped_memory_->Alloc(size, &shm_id, &shm_offset);
- if (!mem) {
- SetGLError(GL_OUT_OF_MEMORY, "MapBufferSubDataCHROMIUM: out of memory");
- return NULL;
+ int32 shm_id = 0;
+ unsigned int shm_offset = 0;
+ void* mem = 0;
+ switch (target) {
+ case GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM:
greggman 2012/05/24 20:56:00 style: indent
+ case GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM: {
+ BufferTracker::Buffer* buffer = buffer_tracker_->GetBuffer(
+ target == GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM ?
+ bound_pixel_pack_transfer_buffer_id_ :
+ bound_pixel_unpack_transfer_buffer_id_);
+ if (!buffer) {
+ SetGLError(GL_INVALID_VALUE, "MapBufferSubDataCHROMIUM: invalid buffer");
+ return NULL;
+ }
+ mem = static_cast<uint8*>(buffer->address()) + offset;
+ } break;
greggman 2012/05/24 20:56:00 style: breaks go inside case blocks
greggman 2012/05/24 20:56:00 style: break goes inside case block
+ default:
+ mem = mapped_memory_->Alloc(size, &shm_id, &shm_offset);
+ if (!mem) {
+ SetGLError(GL_OUT_OF_MEMORY, "MapBufferSubDataCHROMIUM: out of memory");
+ return NULL;
+ }
+ break;
}
std::pair<MappedBufferMap::iterator, bool> result =
@@ -2672,15 +2743,22 @@ void GLES2Implementation::UnmapBufferSubDataCHROMIUM(const void* mem) {
return;
}
const MappedBuffer& mb = it->second;
- helper_->BufferSubData(
- mb.target, mb.offset, mb.size, mb.shm_id, mb.shm_offset);
- mapped_memory_->FreePendingToken(mb.shm_memory, helper_->InsertToken());
- // Flushing after unmap lets the service side start processing commands
- // sooner. However, on lowend devices, the thread thrashing causes is
- // worse than the latency hit.
+ switch (mb.target) {
+ case GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM:
greggman 2012/05/24 20:56:00 indent
+ case GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM:
+ break;
+ default:
+ helper_->BufferSubData(
+ mb.target, mb.offset, mb.size, mb.shm_id, mb.shm_offset);
+ mapped_memory_->FreePendingToken(mb.shm_memory, helper_->InsertToken());
+ // Flushing after unmap lets the service side start processing commands
+ // sooner. However, on lowend devices, the thread thrashing causes is
+ // worse than the latency hit.
#if !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
- helper_->CommandBufferHelper::Flush();
+ helper_->CommandBufferHelper::Flush();
#endif
+ break;
+ }
mapped_buffers_.erase(it);
greggman 2012/05/24 20:56:00 I'm not sure why you'd erase the buffer here but t
}

Powered by Google App Engine
This is Rietveld 408576698