| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/gl/async_pixel_transfer_delegate_android.h" | 5 #include "ui/gl/async_pixel_transfer_delegate_android.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 | 177 |
| 178 // Implement AsyncPixelTransferState: | 178 // Implement AsyncPixelTransferState: |
| 179 bool TransferIsInProgress() { | 179 bool TransferIsInProgress() { |
| 180 return transfer_in_progress_; | 180 return transfer_in_progress_; |
| 181 } | 181 } |
| 182 | 182 |
| 183 void BindTransfer(AsyncTexImage2DParams* bound_params) { | 183 void BindTransfer(AsyncTexImage2DParams* bound_params) { |
| 184 TRACE_EVENT2("gpu", "BindAsyncTransfer glEGLImageTargetTexture2DOES", | 184 TRACE_EVENT2("gpu", "BindAsyncTransfer glEGLImageTargetTexture2DOES", |
| 185 "width", late_bind_define_params_.width, | 185 "width", late_bind_define_params_.width, |
| 186 "height", late_bind_define_params_.height); | 186 "height", late_bind_define_params_.height); |
| 187 | |
| 188 DCHECK(bound_params); | 187 DCHECK(bound_params); |
| 189 DCHECK(texture_id_); | 188 DCHECK(texture_id_); |
| 190 DCHECK_NE(EGL_NO_IMAGE_KHR, egl_image_); | |
| 191 *bound_params = late_bind_define_params_; | 189 *bound_params = late_bind_define_params_; |
| 192 if (!needs_late_bind_) | 190 if (!needs_late_bind_) |
| 193 return; | 191 return; |
| 192 DCHECK_NE(EGL_NO_IMAGE_KHR, egl_image_); |
| 194 | 193 |
| 195 // We can only change the active texture and unit 0, | 194 // We can only change the active texture and unit 0, |
| 196 // as that is all that will be restored. | 195 // as that is all that will be restored. |
| 197 glActiveTexture(GL_TEXTURE0); | 196 glActiveTexture(GL_TEXTURE0); |
| 198 glBindTexture(GL_TEXTURE_2D, texture_id_); | 197 glBindTexture(GL_TEXTURE_2D, texture_id_); |
| 199 glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, egl_image_); | 198 glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, egl_image_); |
| 200 needs_late_bind_ = false; | 199 needs_late_bind_ = false; |
| 201 | 200 |
| 202 DCHECK(CHECK_GL()); | 201 DCHECK(CHECK_GL()); |
| 203 } | 202 } |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 378 const AsyncMemoryParams& mem_params); | 377 const AsyncMemoryParams& mem_params); |
| 379 | 378 |
| 380 int texture_upload_count_; | 379 int texture_upload_count_; |
| 381 base::TimeDelta total_texture_upload_time_; | 380 base::TimeDelta total_texture_upload_time_; |
| 382 bool is_imagination_; | 381 bool is_imagination_; |
| 383 bool is_qualcomm_; | 382 bool is_qualcomm_; |
| 384 | 383 |
| 385 DISALLOW_COPY_AND_ASSIGN(AsyncPixelTransferDelegateAndroid); | 384 DISALLOW_COPY_AND_ASSIGN(AsyncPixelTransferDelegateAndroid); |
| 386 }; | 385 }; |
| 387 | 386 |
| 388 namespace { | |
| 389 // Imagination has some odd problems still. | |
| 390 bool IsImagination() { | |
| 391 std::string vendor; | |
| 392 vendor = reinterpret_cast<const char*>(glGetString(GL_VENDOR)); | |
| 393 return vendor.find("Imagination") != std::string::npos; | |
| 394 } | |
| 395 } | |
| 396 | |
| 397 // We only used threaded uploads when we can: | 387 // We only used threaded uploads when we can: |
| 398 // - Create EGLImages out of OpenGL textures (EGL_KHR_gl_texture_2D_image) | 388 // - Create EGLImages out of OpenGL textures (EGL_KHR_gl_texture_2D_image) |
| 399 // - Bind EGLImages to OpenGL textures (GL_OES_EGL_image) | 389 // - Bind EGLImages to OpenGL textures (GL_OES_EGL_image) |
| 400 // - Use fences (to test for upload completion). | 390 // - Use fences (to test for upload completion). |
| 401 scoped_ptr<AsyncPixelTransferDelegate> | 391 scoped_ptr<AsyncPixelTransferDelegate> |
| 402 AsyncPixelTransferDelegate::Create(gfx::GLContext* context) { | 392 AsyncPixelTransferDelegate::Create(gfx::GLContext* context) { |
| 403 DCHECK(context); | 393 DCHECK(context); |
| 404 if (context->HasExtension("EGL_KHR_fence_sync") && | 394 if (context->HasExtension("EGL_KHR_fence_sync") && |
| 405 context->HasExtension("EGL_KHR_image") && | 395 context->HasExtension("EGL_KHR_image") && |
| 406 context->HasExtension("EGL_KHR_image_base") && | 396 context->HasExtension("EGL_KHR_image_base") && |
| 407 context->HasExtension("EGL_KHR_gl_texture_2D_image") && | 397 context->HasExtension("EGL_KHR_gl_texture_2D_image") && |
| 408 context->HasExtension("GL_OES_EGL_image") && | 398 context->HasExtension("GL_OES_EGL_image")) { |
| 409 !IsImagination()) { | |
| 410 return make_scoped_ptr( | 399 return make_scoped_ptr( |
| 411 static_cast<AsyncPixelTransferDelegate*>( | 400 static_cast<AsyncPixelTransferDelegate*>( |
| 412 new AsyncPixelTransferDelegateAndroid())); | 401 new AsyncPixelTransferDelegateAndroid())); |
| 413 } else { | 402 } else { |
| 414 LOG(INFO) << "Async pixel transfers not supported"; | 403 LOG(INFO) << "Async pixel transfers not supported"; |
| 415 return make_scoped_ptr( | 404 return make_scoped_ptr( |
| 416 static_cast<AsyncPixelTransferDelegate*>( | 405 static_cast<AsyncPixelTransferDelegate*>( |
| 417 new AsyncPixelTransferDelegateStub())); | 406 new AsyncPixelTransferDelegateStub())); |
| 418 } | 407 } |
| 419 } | 408 } |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 760 const AsyncMemoryParams& mem_params) { | 749 const AsyncMemoryParams& mem_params) { |
| 761 if (!is_imagination_) | 750 if (!is_imagination_) |
| 762 return false; | 751 return false; |
| 763 | 752 |
| 764 // If the dimensions support fast async uploads, we can use the | 753 // If the dimensions support fast async uploads, we can use the |
| 765 // normal async upload path for uploads. | 754 // normal async upload path for uploads. |
| 766 if (DimensionsSupportImgFastPath(tex_params.width, tex_params.height)) | 755 if (DimensionsSupportImgFastPath(tex_params.width, tex_params.height)) |
| 767 return false; | 756 return false; |
| 768 | 757 |
| 769 // Fall back on a synchronous stub as we don't have a known fast path. | 758 // Fall back on a synchronous stub as we don't have a known fast path. |
| 759 // Also, older ICS drivers crash when we do any glTexSubImage2D on the |
| 760 // same thread. To work around this we do glTexImage2D instead. Since |
| 761 // we didn't create an EGLImage for this texture (see above), this is |
| 762 // okay, but it limits this API to full updates for now. |
| 763 DCHECK(!state->egl_image_); |
| 764 DCHECK_EQ(tex_params.xoffset, 0); |
| 765 DCHECK_EQ(tex_params.yoffset, 0); |
| 766 DCHECK_EQ(state->late_bind_define_params_.width, tex_params.width); |
| 767 DCHECK_EQ(state->late_bind_define_params_.height, tex_params.height); |
| 768 DCHECK_EQ(state->late_bind_define_params_.level, tex_params.level); |
| 769 DCHECK_EQ(state->late_bind_define_params_.format, tex_params.format); |
| 770 DCHECK_EQ(state->late_bind_define_params_.type, tex_params.type); |
| 771 |
| 770 void* data = GetAddress(mem_params.shared_memory, | 772 void* data = GetAddress(mem_params.shared_memory, |
| 771 mem_params.shm_data_offset); | 773 mem_params.shm_data_offset); |
| 772 base::TimeTicks begin_time(base::TimeTicks::HighResNow()); | 774 base::TimeTicks begin_time(base::TimeTicks::HighResNow()); |
| 773 { | 775 { |
| 774 TRACE_EVENT0("gpu", "glTexSubImage2D"); | 776 TRACE_EVENT0("gpu", "glTexSubImage2D"); |
| 775 DoTexSubImage2D(tex_params, data); | 777 // Note we use late_bind_define_params_ instead of tex_params. |
| 778 // The DCHECKs above verify this is always the same. |
| 779 DoTexImage2D(state->late_bind_define_params_, data); |
| 776 } | 780 } |
| 777 texture_upload_count_++; | 781 texture_upload_count_++; |
| 778 total_texture_upload_time_ += base::TimeTicks::HighResNow() - begin_time; | 782 total_texture_upload_time_ += base::TimeTicks::HighResNow() - begin_time; |
| 779 | 783 |
| 780 DCHECK(CHECK_GL()); | 784 DCHECK(CHECK_GL()); |
| 781 return true; | 785 return true; |
| 782 } | 786 } |
| 783 | 787 |
| 784 } // namespace gfx | 788 } // namespace gfx |
| OLD | NEW |