Chromium Code Reviews| 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
|
| } |