Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(59)

Side by Side Diff: android_webview/browser/hardware_renderer.cc

Issue 414163002: aw: Add and use DrawGL kModeSync (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: make AwDrawGLInfo future proof Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "android_webview/browser/hardware_renderer.h" 5 #include "android_webview/browser/hardware_renderer.h"
6 6
7 #include "android_webview/browser/aw_gl_surface.h" 7 #include "android_webview/browser/aw_gl_surface.h"
8 #include "android_webview/browser/deferred_gpu_command_service.h" 8 #include "android_webview/browser/deferred_gpu_command_service.h"
9 #include "android_webview/browser/parent_output_surface.h" 9 #include "android_webview/browser/parent_output_surface.h"
10 #include "android_webview/browser/shared_renderer_state.h" 10 #include "android_webview/browser/shared_renderer_state.h"
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 "Parent-Compositor"); 69 "Parent-Compositor");
70 } 70 }
71 71
72 } // namespace 72 } // namespace
73 73
74 HardwareRenderer::HardwareRenderer(SharedRendererState* state) 74 HardwareRenderer::HardwareRenderer(SharedRendererState* state)
75 : shared_renderer_state_(state), 75 : shared_renderer_state_(state),
76 last_egl_context_(eglGetCurrentContext()), 76 last_egl_context_(eglGetCurrentContext()),
77 stencil_enabled_(false), 77 stencil_enabled_(false),
78 viewport_clip_valid_for_dcheck_(false), 78 viewport_clip_valid_for_dcheck_(false),
79 gl_surface_(new AwGLSurface),
79 root_layer_(cc::Layer::Create()), 80 root_layer_(cc::Layer::Create()),
81 resource_collection_(new cc::DelegatedFrameResourceCollection),
80 output_surface_(NULL) { 82 output_surface_(NULL) {
81 DCHECK(last_egl_context_); 83 DCHECK(last_egl_context_);
82 84
83 gl_surface_ = new AwGLSurface; 85 resource_collection_->SetClient(this);
84 86
85 cc::LayerTreeSettings settings; 87 cc::LayerTreeSettings settings;
86 88
87 // Should be kept in sync with compositor_impl_android.cc. 89 // Should be kept in sync with compositor_impl_android.cc.
88 settings.allow_antialiasing = false; 90 settings.allow_antialiasing = false;
89 settings.highp_threshold_min = 2048; 91 settings.highp_threshold_min = 2048;
90 92
91 // Webview does not own the surface so should not clear it. 93 // Webview does not own the surface so should not clear it.
92 settings.should_clear_root_render_pass = false; 94 settings.should_clear_root_render_pass = false;
93 95
94 layer_tree_host_ = cc::LayerTreeHost::CreateSingleThreaded( 96 layer_tree_host_ = cc::LayerTreeHost::CreateSingleThreaded(
95 this, this, NULL, settings, NULL); 97 this, this, NULL, settings, NULL);
96 layer_tree_host_->SetRootLayer(root_layer_); 98 layer_tree_host_->SetRootLayer(root_layer_);
97 layer_tree_host_->SetLayerTreeHostClientReady(); 99 layer_tree_host_->SetLayerTreeHostClientReady();
98 layer_tree_host_->set_has_transparent_background(true); 100 layer_tree_host_->set_has_transparent_background(true);
99 } 101 }
100 102
101 HardwareRenderer::~HardwareRenderer() { 103 HardwareRenderer::~HardwareRenderer() {
102 // Must reset everything before |resource_collection_| to ensure all 104 // Must reset everything before |resource_collection_| to ensure all
103 // resources are returned before resetting |resource_collection_| client. 105 // resources are returned before resetting |resource_collection_| client.
104 layer_tree_host_.reset(); 106 layer_tree_host_.reset();
105 root_layer_ = NULL; 107 root_layer_ = NULL;
106 delegated_layer_ = NULL; 108 delegated_layer_ = NULL;
107 frame_provider_ = NULL; 109 frame_provider_ = NULL;
108 if (resource_collection_.get()) {
109 #if DCHECK_IS_ON 110 #if DCHECK_IS_ON
110 // Check collection is empty. 111 // Check collection is empty.
111 cc::ReturnedResourceArray returned_resources; 112 cc::ReturnedResourceArray returned_resources;
112 resource_collection_->TakeUnusedResourcesForChildCompositor( 113 resource_collection_->TakeUnusedResourcesForChildCompositor(
113 &returned_resources); 114 &returned_resources);
114 DCHECK_EQ(0u, returned_resources.size()); 115 DCHECK_EQ(0u, returned_resources.size());
115 #endif // DCHECK_IS_ON 116 #endif // DCHECK_IS_ON
116 117
117 resource_collection_->SetClient(NULL); 118 resource_collection_->SetClient(NULL);
118 }
119 } 119 }
120 120
121 void HardwareRenderer::DidBeginMainFrame() { 121 void HardwareRenderer::DidBeginMainFrame() {
122 // This is called after OutputSurface is created, but before the impl frame 122 // This is called after OutputSurface is created, but before the impl frame
123 // starts. We set the draw constraints here. 123 // starts. We set the draw constraints here.
124 DCHECK(output_surface_); 124 DCHECK(output_surface_);
125 DCHECK(viewport_clip_valid_for_dcheck_); 125 DCHECK(viewport_clip_valid_for_dcheck_);
126 output_surface_->SetExternalStencilTest(stencil_enabled_); 126 output_surface_->SetExternalStencilTest(stencil_enabled_);
127 output_surface_->SetDrawConstraints(viewport_, clip_); 127 output_surface_->SetDrawConstraints(viewport_, clip_);
128 } 128 }
129 129
130 void HardwareRenderer::CommitFrame() {
131 scoped_ptr<DrawGLInput> input = shared_renderer_state_->PassDrawGLInput();
132 if (!input.get()) {
133 DLOG(WARNING) << "No frame to commit";
134 return;
135 }
136
137 DCHECK(!input->frame.gl_frame_data);
138 DCHECK(!input->frame.software_frame_data);
139
140 // DelegatedRendererLayerImpl applies the inverse device_scale_factor of the
141 // renderer frame, assuming that the browser compositor will scale
142 // it back up to device scale. But on Android we put our browser layers in
143 // physical pixels and set our browser CC device_scale_factor to 1, so this
144 // suppresses the transform.
145 input->frame.delegated_frame_data->device_scale_factor = 1.0f;
146
147 gfx::Size frame_size =
148 input->frame.delegated_frame_data->render_pass_list.back()
149 ->output_rect.size();
150 bool size_changed = frame_size != frame_size_;
151 frame_size_ = frame_size;
152 scroll_offset_ = input->scroll_offset;
153
154 if (!frame_provider_ || size_changed) {
155 if (delegated_layer_) {
156 delegated_layer_->RemoveFromParent();
157 }
158
159 frame_provider_ = new cc::DelegatedFrameProvider(
160 resource_collection_.get(), input->frame.delegated_frame_data.Pass());
161
162 delegated_layer_ = cc::DelegatedRendererLayer::Create(frame_provider_);
163 delegated_layer_->SetBounds(gfx::Size(input->width, input->height));
164 delegated_layer_->SetIsDrawable(true);
165
166 root_layer_->AddChild(delegated_layer_);
167 } else {
168 frame_provider_->SetFrameData(input->frame.delegated_frame_data.Pass());
169 }
170 }
171
130 void HardwareRenderer::DrawGL(bool stencil_enabled, 172 void HardwareRenderer::DrawGL(bool stencil_enabled,
131 int framebuffer_binding_ext, 173 int framebuffer_binding_ext,
132 AwDrawGLInfo* draw_info) { 174 AwDrawGLInfo* draw_info) {
133 TRACE_EVENT0("android_webview", "HardwareRenderer::DrawGL"); 175 TRACE_EVENT0("android_webview", "HardwareRenderer::DrawGL");
134 176
135 // We need to watch if the current Android context has changed and enforce 177 // We need to watch if the current Android context has changed and enforce
136 // a clean-up in the compositor. 178 // a clean-up in the compositor.
137 EGLContext current_context = eglGetCurrentContext(); 179 EGLContext current_context = eglGetCurrentContext();
138 if (!current_context) { 180 if (!current_context) {
139 DLOG(ERROR) << "DrawGL called without EGLContext"; 181 DLOG(ERROR) << "DrawGL called without EGLContext";
140 return; 182 return;
141 } 183 }
142 184
185 if (!delegated_layer_.get()) {
186 DLOG(ERROR) << "No frame committed";
187 return;
188 }
189
143 // TODO(boliu): Handle context loss. 190 // TODO(boliu): Handle context loss.
144 if (last_egl_context_ != current_context) 191 if (last_egl_context_ != current_context)
145 DLOG(WARNING) << "EGLContextChanged"; 192 DLOG(WARNING) << "EGLContextChanged";
146 193
147 scoped_ptr<DrawGLInput> input = shared_renderer_state_->PassDrawGLInput();
148 if (!resource_collection_.get()) {
149 resource_collection_ = new cc::DelegatedFrameResourceCollection;
150 resource_collection_->SetClient(this);
151 }
152
153 if (input.get()) {
154 DCHECK(!input->frame.gl_frame_data);
155 DCHECK(!input->frame.software_frame_data);
156
157 // DelegatedRendererLayerImpl applies the inverse device_scale_factor of the
158 // renderer frame, assuming that the browser compositor will scale
159 // it back up to device scale. But on Android we put our browser layers in
160 // physical pixels and set our browser CC device_scale_factor to 1, so this
161 // suppresses the transform.
162 input->frame.delegated_frame_data->device_scale_factor = 1.0f;
163
164 gfx::Size frame_size =
165 input->frame.delegated_frame_data->render_pass_list.back()
166 ->output_rect.size();
167 bool size_changed = frame_size != frame_size_;
168 frame_size_ = frame_size;
169 scroll_offset_ = input->scroll_offset;
170
171 if (!frame_provider_ || size_changed) {
172 if (delegated_layer_) {
173 delegated_layer_->RemoveFromParent();
174 }
175
176 frame_provider_ = new cc::DelegatedFrameProvider(
177 resource_collection_.get(), input->frame.delegated_frame_data.Pass());
178
179 delegated_layer_ = cc::DelegatedRendererLayer::Create(frame_provider_);
180 delegated_layer_->SetBounds(gfx::Size(input->width, input->height));
181 delegated_layer_->SetIsDrawable(true);
182
183 root_layer_->AddChild(delegated_layer_);
184 } else {
185 frame_provider_->SetFrameData(input->frame.delegated_frame_data.Pass());
186 }
187 }
188
189 viewport_.SetSize(draw_info->width, draw_info->height); 194 viewport_.SetSize(draw_info->width, draw_info->height);
190 layer_tree_host_->SetViewportSize(viewport_); 195 layer_tree_host_->SetViewportSize(viewport_);
191 clip_.SetRect(draw_info->clip_left, 196 clip_.SetRect(draw_info->clip_left,
192 draw_info->clip_top, 197 draw_info->clip_top,
193 draw_info->clip_right - draw_info->clip_left, 198 draw_info->clip_right - draw_info->clip_left,
194 draw_info->clip_bottom - draw_info->clip_top); 199 draw_info->clip_bottom - draw_info->clip_top);
195 stencil_enabled_ = stencil_enabled; 200 stencil_enabled_ = stencil_enabled;
196 201
197 gfx::Transform transform(gfx::Transform::kSkipInitialization); 202 gfx::Transform transform(gfx::Transform::kSkipInitialization);
198 transform.matrix().setColMajorf(draw_info->transform); 203 transform.matrix().setColMajorf(draw_info->transform);
(...skipping 25 matching lines...) Expand all
224 } 229 }
225 230
226 void HardwareRenderer::UnusedResourcesAreAvailable() { 231 void HardwareRenderer::UnusedResourcesAreAvailable() {
227 cc::ReturnedResourceArray returned_resources; 232 cc::ReturnedResourceArray returned_resources;
228 resource_collection_->TakeUnusedResourcesForChildCompositor( 233 resource_collection_->TakeUnusedResourcesForChildCompositor(
229 &returned_resources); 234 &returned_resources);
230 shared_renderer_state_->InsertReturnedResources(returned_resources); 235 shared_renderer_state_->InsertReturnedResources(returned_resources);
231 } 236 }
232 237
233 } // namespace android_webview 238 } // namespace android_webview
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698