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/gl_surface_egl.h" | 5 #include "ui/gl/gl_surface_egl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <map> | 10 #include <map> |
(...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
631 | 631 |
632 return g_display; | 632 return g_display; |
633 } | 633 } |
634 | 634 |
635 NativeViewGLSurfaceEGL::NativeViewGLSurfaceEGL(EGLNativeWindowType window) | 635 NativeViewGLSurfaceEGL::NativeViewGLSurfaceEGL(EGLNativeWindowType window) |
636 : window_(window), | 636 : window_(window), |
637 size_(1, 1), | 637 size_(1, 1), |
638 enable_fixed_size_angle_(false), | 638 enable_fixed_size_angle_(false), |
639 surface_(NULL), | 639 surface_(NULL), |
640 supports_post_sub_buffer_(false), | 640 supports_post_sub_buffer_(false), |
| 641 supports_swap_buffer_with_damage_(false), |
641 flips_vertically_(false), | 642 flips_vertically_(false), |
642 swap_interval_(1) { | 643 swap_interval_(1) { |
643 #if defined(OS_ANDROID) | 644 #if defined(OS_ANDROID) |
644 if (window) | 645 if (window) |
645 ANativeWindow_acquire(window); | 646 ANativeWindow_acquire(window); |
646 #endif | 647 #endif |
647 | 648 |
648 #if defined(OS_WIN) | 649 #if defined(OS_WIN) |
649 vsync_override_ = false; | 650 vsync_override_ = false; |
650 swap_generation_ = 0; | 651 swap_generation_ = 0; |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
723 return false; | 724 return false; |
724 } | 725 } |
725 | 726 |
726 if (g_driver_egl.ext.b_EGL_NV_post_sub_buffer) { | 727 if (g_driver_egl.ext.b_EGL_NV_post_sub_buffer) { |
727 EGLint surfaceVal; | 728 EGLint surfaceVal; |
728 EGLBoolean retVal = eglQuerySurface( | 729 EGLBoolean retVal = eglQuerySurface( |
729 GetDisplay(), surface_, EGL_POST_SUB_BUFFER_SUPPORTED_NV, &surfaceVal); | 730 GetDisplay(), surface_, EGL_POST_SUB_BUFFER_SUPPORTED_NV, &surfaceVal); |
730 supports_post_sub_buffer_ = (surfaceVal && retVal) == EGL_TRUE; | 731 supports_post_sub_buffer_ = (surfaceVal && retVal) == EGL_TRUE; |
731 } | 732 } |
732 | 733 |
| 734 supports_swap_buffer_with_damage_ = |
| 735 g_driver_egl.ext.b_EGL_KHR_swap_buffers_with_damage && |
| 736 base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 737 switches::kEnableSwapBuffersWithDamage); |
| 738 |
733 if (sync_provider) | 739 if (sync_provider) |
734 vsync_provider_.reset(sync_provider.release()); | 740 vsync_provider_.reset(sync_provider.release()); |
735 else if (g_egl_sync_control_supported) | 741 else if (g_egl_sync_control_supported) |
736 vsync_provider_.reset(new EGLSyncControlVSyncProvider(surface_)); | 742 vsync_provider_.reset(new EGLSyncControlVSyncProvider(surface_)); |
737 return true; | 743 return true; |
738 } | 744 } |
739 | 745 |
740 bool NativeViewGLSurfaceEGL::InitializeNativeWindow() { | 746 bool NativeViewGLSurfaceEGL::InitializeNativeWindow() { |
741 return true; | 747 return true; |
742 } | 748 } |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
862 LOG(ERROR) << "Failed to create surface."; | 868 LOG(ERROR) << "Failed to create surface."; |
863 return false; | 869 return false; |
864 } | 870 } |
865 return true; | 871 return true; |
866 } | 872 } |
867 | 873 |
868 EGLSurface NativeViewGLSurfaceEGL::GetHandle() { | 874 EGLSurface NativeViewGLSurfaceEGL::GetHandle() { |
869 return surface_; | 875 return surface_; |
870 } | 876 } |
871 | 877 |
| 878 bool NativeViewGLSurfaceEGL::SupportsSwapBuffersWithDamage() { |
| 879 return supports_swap_buffer_with_damage_; |
| 880 } |
| 881 |
872 bool NativeViewGLSurfaceEGL::SupportsPostSubBuffer() { | 882 bool NativeViewGLSurfaceEGL::SupportsPostSubBuffer() { |
873 return supports_post_sub_buffer_; | 883 return supports_post_sub_buffer_; |
874 } | 884 } |
875 | 885 |
876 bool NativeViewGLSurfaceEGL::FlipsVertically() const { | 886 bool NativeViewGLSurfaceEGL::FlipsVertically() const { |
877 return flips_vertically_; | 887 return flips_vertically_; |
878 } | 888 } |
879 | 889 |
880 bool NativeViewGLSurfaceEGL::BuffersFlipped() const { | 890 bool NativeViewGLSurfaceEGL::BuffersFlipped() const { |
881 return g_use_direct_composition; | 891 return g_use_direct_composition; |
882 } | 892 } |
883 | 893 |
| 894 gfx::SwapResult NativeViewGLSurfaceEGL::SwapBuffersWithDamage(int x, |
| 895 int y, |
| 896 int width, |
| 897 int height) { |
| 898 DCHECK(supports_swap_buffer_with_damage_); |
| 899 UpdateSwapInterval(); |
| 900 if (!CommitAndClearPendingOverlays()) { |
| 901 DVLOG(1) << "Failed to commit pending overlay planes."; |
| 902 return gfx::SwapResult::SWAP_FAILED; |
| 903 } |
| 904 if (flips_vertically_) { |
| 905 // With EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE the contents are rendered |
| 906 // inverted, but the damage rectangle is still measured from the |
| 907 // bottom left. |
| 908 y = GetSize().height() - y - height; |
| 909 } |
| 910 |
| 911 EGLint damage_rect[4] = {x, y, width, height}; |
| 912 if (!eglSwapBuffersWithDamageKHR(GetDisplay(), surface_, damage_rect, 1)) { |
| 913 DVLOG(1) << "eglSwapBuffersWithDamageKHR failed with error " |
| 914 << GetLastEGLErrorString(); |
| 915 return gfx::SwapResult::SWAP_FAILED; |
| 916 } |
| 917 return gfx::SwapResult::SWAP_ACK; |
| 918 } |
| 919 |
884 gfx::SwapResult NativeViewGLSurfaceEGL::PostSubBuffer(int x, | 920 gfx::SwapResult NativeViewGLSurfaceEGL::PostSubBuffer(int x, |
885 int y, | 921 int y, |
886 int width, | 922 int width, |
887 int height) { | 923 int height) { |
888 DCHECK(supports_post_sub_buffer_); | 924 DCHECK(supports_post_sub_buffer_); |
889 UpdateSwapInterval(); | 925 UpdateSwapInterval(); |
890 if (!CommitAndClearPendingOverlays()) { | 926 if (!CommitAndClearPendingOverlays()) { |
891 DVLOG(1) << "Failed to commit pending overlay planes."; | 927 DVLOG(1) << "Failed to commit pending overlay planes."; |
892 return gfx::SwapResult::SWAP_FAILED; | 928 return gfx::SwapResult::SWAP_FAILED; |
893 } | 929 } |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1155 } | 1191 } |
1156 | 1192 |
1157 void* SurfacelessEGL::GetShareHandle() { | 1193 void* SurfacelessEGL::GetShareHandle() { |
1158 return NULL; | 1194 return NULL; |
1159 } | 1195 } |
1160 | 1196 |
1161 SurfacelessEGL::~SurfacelessEGL() { | 1197 SurfacelessEGL::~SurfacelessEGL() { |
1162 } | 1198 } |
1163 | 1199 |
1164 } // namespace gl | 1200 } // namespace gl |
OLD | NEW |