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