Index: gpu/command_buffer/service/context_state.cc |
diff --git a/gpu/command_buffer/service/context_state.cc b/gpu/command_buffer/service/context_state.cc |
index e8c00727cf43ce7bfdcb9647325d53bea20b3858..44ad3199c1de5b3af3634baa38e2ad420d25b8f1 100644 |
--- a/gpu/command_buffer/service/context_state.cc |
+++ b/gpu/command_buffer/service/context_state.cc |
@@ -270,8 +270,10 @@ void ContextState::RestoreBufferBindings() const { |
GetBufferId(bound_copy_write_buffer.get())); |
glBindBuffer(GL_PIXEL_PACK_BUFFER, |
GetBufferId(bound_pixel_pack_buffer.get())); |
+ UpdatePackParameters(); |
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, |
GetBufferId(bound_pixel_unpack_buffer.get())); |
+ UpdateUnpackParameters(); |
glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, |
GetBufferId(bound_transform_feedback_buffer.get())); |
glBindBuffer(GL_UNIFORM_BUFFER, GetBufferId(bound_uniform_buffer.get())); |
@@ -442,6 +444,38 @@ void ContextState::EnableDisable(GLenum pname, bool enable) const { |
} |
} |
+void ContextState::UpdatePackParameters() const { |
+ if (!feature_info_->IsES3Capable()) |
+ return; |
+ if (bound_pixel_pack_buffer.get()) { |
+ glPixelStorei(GL_PACK_ROW_LENGTH, pack_row_length); |
+ glPixelStorei(GL_PACK_SKIP_PIXELS, pack_skip_pixels); |
+ glPixelStorei(GL_PACK_SKIP_ROWS, pack_skip_rows); |
+ } else { |
+ glPixelStorei(GL_PACK_ROW_LENGTH, 0); |
+ glPixelStorei(GL_PACK_SKIP_PIXELS, 0); |
+ glPixelStorei(GL_PACK_SKIP_ROWS, 0); |
+ } |
+} |
+ |
+void ContextState::UpdateUnpackParameters() const { |
+ if (!feature_info_->IsES3Capable()) |
+ return; |
+ if (bound_pixel_unpack_buffer.get()) { |
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, unpack_row_length); |
+ glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, unpack_image_height); |
+ glPixelStorei(GL_UNPACK_SKIP_PIXELS, unpack_skip_pixels); |
+ glPixelStorei(GL_UNPACK_SKIP_ROWS, unpack_skip_rows); |
+ glPixelStorei(GL_UNPACK_SKIP_IMAGES, unpack_skip_images); |
+ } else { |
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); |
+ glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, 0); |
+ glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); |
+ glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); |
+ glPixelStorei(GL_UNPACK_SKIP_IMAGES, 0); |
+ } |
+} |
+ |
void ContextState::SetBoundBuffer(GLenum target, Buffer* buffer) { |
switch (target) { |
case GL_ARRAY_BUFFER: |
@@ -458,9 +492,11 @@ void ContextState::SetBoundBuffer(GLenum target, Buffer* buffer) { |
break; |
case GL_PIXEL_PACK_BUFFER: |
bound_pixel_pack_buffer = buffer; |
+ UpdatePackParameters(); |
break; |
case GL_PIXEL_UNPACK_BUFFER: |
bound_pixel_unpack_buffer = buffer; |
+ UpdateUnpackParameters(); |
break; |
case GL_TRANSFORM_FEEDBACK_BUFFER: |
bound_transform_feedback_buffer = buffer; |
@@ -488,9 +524,11 @@ void ContextState::RemoveBoundBuffer(Buffer* buffer) { |
} |
if (bound_pixel_pack_buffer.get() == buffer) { |
bound_pixel_pack_buffer = nullptr; |
+ UpdatePackParameters(); |
} |
if (bound_pixel_unpack_buffer.get() == buffer) { |
bound_pixel_unpack_buffer = nullptr; |
+ UpdateUnpackParameters(); |
} |
if (bound_transform_feedback_buffer.get() == buffer) { |
bound_transform_feedback_buffer = nullptr; |