OLD | NEW |
1 // Copyright 2010 The Chromium Authors. All rights reserved. | 1 // Copyright 2010 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 "cc/output/gl_renderer.h" | 5 #include "cc/output/gl_renderer.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 // Block or crash if the number of pending sync queries reach this high as | 149 // Block or crash if the number of pending sync queries reach this high as |
150 // something is seriously wrong on the service side if this happens. | 150 // something is seriously wrong on the service side if this happens. |
151 const size_t kMaxPendingSyncQueries = 16; | 151 const size_t kMaxPendingSyncQueries = 16; |
152 } // anonymous namespace | 152 } // anonymous namespace |
153 | 153 |
154 // Parameters needed to draw a RenderPassDrawQuad. | 154 // Parameters needed to draw a RenderPassDrawQuad. |
155 struct DrawRenderPassDrawQuadParams { | 155 struct DrawRenderPassDrawQuadParams { |
156 DrawRenderPassDrawQuadParams() {} | 156 DrawRenderPassDrawQuadParams() {} |
157 ~DrawRenderPassDrawQuadParams() {} | 157 ~DrawRenderPassDrawQuadParams() {} |
158 | 158 |
159 // Inputs. | 159 // Required Inputs. |
160 const RenderPassDrawQuad* quad = nullptr; | 160 const RenderPassDrawQuad* quad = nullptr; |
161 const Resource* contents_texture = nullptr; | 161 const Resource* contents_texture = nullptr; |
162 DirectRenderer::DrawingFrame* frame = nullptr; | |
163 const gfx::QuadF* clip_region = nullptr; | 162 const gfx::QuadF* clip_region = nullptr; |
164 bool flip_texture = false; | 163 bool flip_texture = false; |
165 | 164 |
| 165 gfx::Transform window_matrix; |
| 166 gfx::Transform projection_matrix; |
| 167 |
| 168 // |frame| is needed for background effects. |
| 169 DirectRenderer::DrawingFrame* frame = nullptr; |
| 170 |
166 // Whether the texture to be sampled from needs to be flipped. | 171 // Whether the texture to be sampled from needs to be flipped. |
167 bool source_needs_flip = false; | 172 bool source_needs_flip = false; |
168 | 173 |
169 float edge[24]; | 174 float edge[24]; |
170 SkScalar color_matrix[20]; | 175 SkScalar color_matrix[20]; |
171 | 176 |
172 // Blending refers to modifications to the backdrop. | 177 // Blending refers to modifications to the backdrop. |
173 bool use_shaders_for_blending = false; | 178 bool use_shaders_for_blending = false; |
174 ShaderLocations locations; | 179 ShaderLocations locations; |
175 | 180 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 }; | 220 }; |
216 | 221 |
217 static GLint GetActiveTextureUnit(GLES2Interface* gl) { | 222 static GLint GetActiveTextureUnit(GLES2Interface* gl) { |
218 GLint active_unit = 0; | 223 GLint active_unit = 0; |
219 gl->GetIntegerv(GL_ACTIVE_TEXTURE, &active_unit); | 224 gl->GetIntegerv(GL_ACTIVE_TEXTURE, &active_unit); |
220 return active_unit; | 225 return active_unit; |
221 } | 226 } |
222 | 227 |
223 class GLRenderer::ScopedUseGrContext { | 228 class GLRenderer::ScopedUseGrContext { |
224 public: | 229 public: |
225 static std::unique_ptr<ScopedUseGrContext> Create(GLRenderer* renderer, | 230 static std::unique_ptr<ScopedUseGrContext> Create(GLRenderer* renderer) { |
226 DrawingFrame* frame) { | |
227 // GrContext for filters is created lazily, and may fail if the context | 231 // GrContext for filters is created lazily, and may fail if the context |
228 // is lost. | 232 // is lost. |
229 // TODO(vmiura,bsalomon): crbug.com/487850 Ensure that | 233 // TODO(vmiura,bsalomon): crbug.com/487850 Ensure that |
230 // ContextProvider::GrContext() does not return NULL. | 234 // ContextProvider::GrContext() does not return NULL. |
231 if (renderer->output_surface_->context_provider()->GrContext()) | 235 if (renderer->output_surface_->context_provider()->GrContext()) |
232 return base::WrapUnique(new ScopedUseGrContext(renderer, frame)); | 236 return base::WrapUnique(new ScopedUseGrContext(renderer)); |
233 return nullptr; | 237 return nullptr; |
234 } | 238 } |
235 | 239 |
236 ~ScopedUseGrContext() { | 240 ~ScopedUseGrContext() { |
237 // Pass context control back to GLrenderer. | 241 // Pass context control back to GLrenderer. |
238 scoped_gpu_raster_ = nullptr; | 242 scoped_gpu_raster_ = nullptr; |
239 renderer_->RestoreGLState(); | 243 renderer_->RestoreGLState(); |
240 renderer_->RestoreFramebuffer(frame_); | |
241 } | 244 } |
242 | 245 |
243 GrContext* context() const { | 246 GrContext* context() const { |
244 return renderer_->output_surface_->context_provider()->GrContext(); | 247 return renderer_->output_surface_->context_provider()->GrContext(); |
245 } | 248 } |
246 | 249 |
247 private: | 250 private: |
248 ScopedUseGrContext(GLRenderer* renderer, DrawingFrame* frame) | 251 explicit ScopedUseGrContext(GLRenderer* renderer) |
249 : scoped_gpu_raster_( | 252 : scoped_gpu_raster_( |
250 new ScopedGpuRaster(renderer->output_surface_->context_provider())), | 253 new ScopedGpuRaster(renderer->output_surface_->context_provider())), |
251 renderer_(renderer), | 254 renderer_(renderer) { |
252 frame_(frame) { | |
253 // scoped_gpu_raster_ passes context control to Skia. | 255 // scoped_gpu_raster_ passes context control to Skia. |
254 } | 256 } |
255 | 257 |
256 std::unique_ptr<ScopedGpuRaster> scoped_gpu_raster_; | 258 std::unique_ptr<ScopedGpuRaster> scoped_gpu_raster_; |
257 GLRenderer* renderer_; | 259 GLRenderer* renderer_; |
258 DrawingFrame* frame_; | |
259 | 260 |
260 DISALLOW_COPY_AND_ASSIGN(ScopedUseGrContext); | 261 DISALLOW_COPY_AND_ASSIGN(ScopedUseGrContext); |
261 }; | 262 }; |
262 | 263 |
263 struct GLRenderer::PendingAsyncReadPixels { | 264 struct GLRenderer::PendingAsyncReadPixels { |
264 PendingAsyncReadPixels() : buffer(0) {} | 265 PendingAsyncReadPixels() : buffer(0) {} |
265 | 266 |
266 std::unique_ptr<CopyOutputRequest> copy_request; | 267 std::unique_ptr<CopyOutputRequest> copy_request; |
267 base::CancelableClosure finished_read_pixels_callback; | 268 base::CancelableClosure finished_read_pixels_callback; |
268 unsigned buffer; | 269 unsigned buffer; |
(...skipping 634 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
903 resource_provider_->best_texture_format()); | 904 resource_provider_->best_texture_format()); |
904 { | 905 { |
905 ResourceProvider::ScopedWriteLockGL lock( | 906 ResourceProvider::ScopedWriteLockGL lock( |
906 resource_provider_, device_background_texture->id(), false); | 907 resource_provider_, device_background_texture->id(), false); |
907 GetFramebufferTexture(lock.texture_id(), bounding_rect); | 908 GetFramebufferTexture(lock.texture_id(), bounding_rect); |
908 } | 909 } |
909 return device_background_texture; | 910 return device_background_texture; |
910 } | 911 } |
911 | 912 |
912 sk_sp<SkImage> GLRenderer::ApplyBackgroundFilters( | 913 sk_sp<SkImage> GLRenderer::ApplyBackgroundFilters( |
913 DrawingFrame* frame, | |
914 const RenderPassDrawQuad* quad, | 914 const RenderPassDrawQuad* quad, |
915 ScopedResource* background_texture, | 915 ScopedResource* background_texture, |
916 const gfx::RectF& rect) { | 916 const gfx::RectF& rect) { |
917 DCHECK(ShouldApplyBackgroundFilters(quad)); | 917 DCHECK(ShouldApplyBackgroundFilters(quad)); |
918 auto use_gr_context = ScopedUseGrContext::Create(this, frame); | 918 auto use_gr_context = ScopedUseGrContext::Create(this); |
919 sk_sp<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( | 919 sk_sp<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( |
920 quad->background_filters, gfx::SizeF(background_texture->size())); | 920 quad->background_filters, gfx::SizeF(background_texture->size())); |
921 | 921 |
922 // TODO(senorblanco): background filters should be moved to the | 922 // TODO(senorblanco): background filters should be moved to the |
923 // makeWithFilter fast-path, and go back to calling ApplyImageFilter(). | 923 // makeWithFilter fast-path, and go back to calling ApplyImageFilter(). |
924 // See http://crbug.com/613233. | 924 // See http://crbug.com/613233. |
925 if (!filter || !use_gr_context) | 925 if (!filter || !use_gr_context) |
926 return nullptr; | 926 return nullptr; |
927 | 927 |
928 ResourceProvider::ScopedReadLockGL lock(resource_provider_, | 928 ResourceProvider::ScopedReadLockGL lock(resource_provider_, |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1032 } | 1032 } |
1033 | 1033 |
1034 void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, | 1034 void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, |
1035 const RenderPassDrawQuad* quad, | 1035 const RenderPassDrawQuad* quad, |
1036 const gfx::QuadF* clip_region) { | 1036 const gfx::QuadF* clip_region) { |
1037 auto bypass = render_pass_bypass_quads_.find(quad->render_pass_id); | 1037 auto bypass = render_pass_bypass_quads_.find(quad->render_pass_id); |
1038 DrawRenderPassDrawQuadParams params; | 1038 DrawRenderPassDrawQuadParams params; |
1039 params.quad = quad; | 1039 params.quad = quad; |
1040 params.frame = frame; | 1040 params.frame = frame; |
1041 params.clip_region = clip_region; | 1041 params.clip_region = clip_region; |
| 1042 params.window_matrix = frame->window_matrix; |
| 1043 params.projection_matrix = frame->projection_matrix; |
1042 if (bypass != render_pass_bypass_quads_.end()) { | 1044 if (bypass != render_pass_bypass_quads_.end()) { |
1043 TileDrawQuad* tile_quad = &bypass->second; | 1045 TileDrawQuad* tile_quad = &bypass->second; |
1044 // RGBA_8888 here is arbitrary and unused. | 1046 // RGBA_8888 here is arbitrary and unused. |
1045 Resource tile_resource(tile_quad->resource_id(), tile_quad->texture_size, | 1047 Resource tile_resource(tile_quad->resource_id(), tile_quad->texture_size, |
1046 ResourceFormat::RGBA_8888); | 1048 ResourceFormat::RGBA_8888); |
1047 // The projection matrix used by GLRenderer has a flip. As tile texture | 1049 // The projection matrix used by GLRenderer has a flip. As tile texture |
1048 // inputs are oriented opposite to framebuffer outputs, don't flip via | 1050 // inputs are oriented opposite to framebuffer outputs, don't flip via |
1049 // texture coords and let the projection matrix naturallyd o it. | 1051 // texture coords and let the projection matrix naturallyd o it. |
1050 params.flip_texture = false; | 1052 params.flip_texture = false; |
1051 params.contents_texture = &tile_resource; | 1053 params.contents_texture = &tile_resource; |
(...skipping 11 matching lines...) Expand all Loading... |
1063 } | 1065 } |
1064 } | 1066 } |
1065 | 1067 |
1066 void GLRenderer::DrawRenderPassQuadInternal( | 1068 void GLRenderer::DrawRenderPassQuadInternal( |
1067 DrawRenderPassDrawQuadParams* params) { | 1069 DrawRenderPassDrawQuadParams* params) { |
1068 if (!InitializeRPDQParameters(params)) | 1070 if (!InitializeRPDQParameters(params)) |
1069 return; | 1071 return; |
1070 UpdateRPDQShadersForBlending(params); | 1072 UpdateRPDQShadersForBlending(params); |
1071 if (!UpdateRPDQWithSkiaFilters(params)) | 1073 if (!UpdateRPDQWithSkiaFilters(params)) |
1072 return; | 1074 return; |
| 1075 UseRenderPass(params->frame, params->frame->current_render_pass); |
| 1076 SetViewport(); |
1073 UpdateRPDQTexturesForSampling(params); | 1077 UpdateRPDQTexturesForSampling(params); |
1074 UpdateRPDQBlendMode(params); | 1078 UpdateRPDQBlendMode(params); |
1075 ChooseRPDQProgram(params); | 1079 ChooseRPDQProgram(params); |
1076 UpdateRPDQUniforms(params); | 1080 UpdateRPDQUniforms(params); |
1077 DrawRPDQ(*params); | 1081 DrawRPDQ(*params); |
1078 } | 1082 } |
1079 | 1083 |
1080 bool GLRenderer::InitializeRPDQParameters( | 1084 bool GLRenderer::InitializeRPDQParameters( |
1081 DrawRenderPassDrawQuadParams* params) { | 1085 DrawRenderPassDrawQuadParams* params) { |
1082 const RenderPassDrawQuad* quad = params->quad; | 1086 const RenderPassDrawQuad* quad = params->quad; |
1083 SkMatrix scale_matrix; | 1087 SkMatrix scale_matrix; |
1084 scale_matrix.setScale(quad->filters_scale.x(), quad->filters_scale.y()); | 1088 scale_matrix.setScale(quad->filters_scale.x(), quad->filters_scale.y()); |
1085 gfx::Rect dst_rect = quad->filters.MapRect(quad->rect, scale_matrix); | 1089 gfx::Rect dst_rect = quad->filters.MapRect(quad->rect, scale_matrix); |
1086 params->dst_rect.SetRect(static_cast<float>(dst_rect.x()), | 1090 params->dst_rect.SetRect(static_cast<float>(dst_rect.x()), |
1087 static_cast<float>(dst_rect.y()), | 1091 static_cast<float>(dst_rect.y()), |
1088 static_cast<float>(dst_rect.width()), | 1092 static_cast<float>(dst_rect.width()), |
1089 static_cast<float>(dst_rect.height())); | 1093 static_cast<float>(dst_rect.height())); |
1090 gfx::Transform quad_rect_matrix; | 1094 gfx::Transform quad_rect_matrix; |
1091 QuadRectTransform(&quad_rect_matrix, | 1095 QuadRectTransform(&quad_rect_matrix, |
1092 quad->shared_quad_state->quad_to_target_transform, | 1096 quad->shared_quad_state->quad_to_target_transform, |
1093 params->dst_rect); | 1097 params->dst_rect); |
1094 params->contents_device_transform = params->frame->window_matrix * | 1098 params->contents_device_transform = |
1095 params->frame->projection_matrix * | 1099 params->window_matrix * params->projection_matrix * quad_rect_matrix; |
1096 quad_rect_matrix; | |
1097 params->contents_device_transform.FlattenTo2d(); | 1100 params->contents_device_transform.FlattenTo2d(); |
1098 | 1101 |
1099 // Can only draw surface if device matrix is invertible. | 1102 // Can only draw surface if device matrix is invertible. |
1100 if (!params->contents_device_transform.IsInvertible()) | 1103 if (!params->contents_device_transform.IsInvertible()) |
1101 return false; | 1104 return false; |
1102 | 1105 |
1103 params->surface_quad = SharedGeometryQuad(); | 1106 params->surface_quad = SharedGeometryQuad(); |
1104 | 1107 |
1105 gfx::QuadF device_layer_quad; | 1108 gfx::QuadF device_layer_quad; |
1106 if (settings_->allow_antialiasing) { | 1109 if (settings_->allow_antialiasing) { |
(...skipping 15 matching lines...) Expand all Loading... |
1122 void GLRenderer::UpdateRPDQShadersForBlending( | 1125 void GLRenderer::UpdateRPDQShadersForBlending( |
1123 DrawRenderPassDrawQuadParams* params) { | 1126 DrawRenderPassDrawQuadParams* params) { |
1124 const RenderPassDrawQuad* quad = params->quad; | 1127 const RenderPassDrawQuad* quad = params->quad; |
1125 SkXfermode::Mode blend_mode = quad->shared_quad_state->blend_mode; | 1128 SkXfermode::Mode blend_mode = quad->shared_quad_state->blend_mode; |
1126 params->use_shaders_for_blending = | 1129 params->use_shaders_for_blending = |
1127 !CanApplyBlendModeUsingBlendFunc(blend_mode) || | 1130 !CanApplyBlendModeUsingBlendFunc(blend_mode) || |
1128 ShouldApplyBackgroundFilters(quad) || | 1131 ShouldApplyBackgroundFilters(quad) || |
1129 settings_->force_blending_with_shaders; | 1132 settings_->force_blending_with_shaders; |
1130 | 1133 |
1131 if (params->use_shaders_for_blending) { | 1134 if (params->use_shaders_for_blending) { |
| 1135 DCHECK(params->frame); |
1132 // Compute a bounding box around the pixels that will be visible through | 1136 // Compute a bounding box around the pixels that will be visible through |
1133 // the quad. | 1137 // the quad. |
1134 params->background_rect = GetBackdropBoundingBoxForRenderPassQuad( | 1138 params->background_rect = GetBackdropBoundingBoxForRenderPassQuad( |
1135 params->frame, quad, params->contents_device_transform, | 1139 params->frame, quad, params->contents_device_transform, |
1136 params->clip_region, params->use_aa); | 1140 params->clip_region, params->use_aa); |
1137 | 1141 |
1138 if (!params->background_rect.IsEmpty()) { | 1142 if (!params->background_rect.IsEmpty()) { |
1139 // The pixels from the filtered background should completely replace the | 1143 // The pixels from the filtered background should completely replace the |
1140 // current pixel values. | 1144 // current pixel values. |
1141 if (blend_enabled()) | 1145 if (blend_enabled()) |
1142 SetBlendEnabled(false); | 1146 SetBlendEnabled(false); |
1143 | 1147 |
1144 // Read the pixels in the bounding box into a buffer R. | 1148 // Read the pixels in the bounding box into a buffer R. |
1145 // This function allocates a texture, which should contribute to the | 1149 // This function allocates a texture, which should contribute to the |
1146 // amount of memory used by render surfaces: | 1150 // amount of memory used by render surfaces: |
1147 // LayerTreeHost::CalculateMemoryForRenderSurfaces. | 1151 // LayerTreeHost::CalculateMemoryForRenderSurfaces. |
1148 params->background_texture = GetBackdropTexture(params->background_rect); | 1152 params->background_texture = GetBackdropTexture(params->background_rect); |
1149 | 1153 |
1150 if (ShouldApplyBackgroundFilters(quad) && params->background_texture) { | 1154 if (ShouldApplyBackgroundFilters(quad) && params->background_texture) { |
1151 // Apply the background filters to R, so that it is applied in the | 1155 // Apply the background filters to R, so that it is applied in the |
1152 // pixels' coordinate space. | 1156 // pixels' coordinate space. |
1153 params->background_image = ApplyBackgroundFilters( | 1157 params->background_image = |
1154 params->frame, quad, params->background_texture.get(), | 1158 ApplyBackgroundFilters(quad, params->background_texture.get(), |
1155 gfx::RectF(params->background_rect)); | 1159 gfx::RectF(params->background_rect)); |
1156 if (params->background_image) { | 1160 if (params->background_image) { |
1157 params->background_image_id = | 1161 params->background_image_id = |
1158 skia::GrBackendObjectToGrGLTextureInfo( | 1162 skia::GrBackendObjectToGrGLTextureInfo( |
1159 params->background_image->getTextureHandle(true)) | 1163 params->background_image->getTextureHandle(true)) |
1160 ->fID; | 1164 ->fID; |
1161 DCHECK(params->background_image_id); | 1165 DCHECK(params->background_image_id); |
1162 } | 1166 } |
1163 } | 1167 } |
1164 } | 1168 } |
1165 | 1169 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1219 params->dst_rect.Intersect(local_clip.BoundingBox()); | 1223 params->dst_rect.Intersect(local_clip.BoundingBox()); |
1220 // If we've been fully clipped out (by crop rect or clipping), there's | 1224 // If we've been fully clipped out (by crop rect or clipping), there's |
1221 // nothing to draw. | 1225 // nothing to draw. |
1222 if (params->dst_rect.IsEmpty()) { | 1226 if (params->dst_rect.IsEmpty()) { |
1223 return false; | 1227 return false; |
1224 } | 1228 } |
1225 SkIPoint offset; | 1229 SkIPoint offset; |
1226 SkIRect subset; | 1230 SkIRect subset; |
1227 gfx::RectF src_rect(quad->rect); | 1231 gfx::RectF src_rect(quad->rect); |
1228 params->filter_image = ApplyImageFilter( | 1232 params->filter_image = ApplyImageFilter( |
1229 ScopedUseGrContext::Create(this, params->frame), resource_provider_, | 1233 ScopedUseGrContext::Create(this), resource_provider_, src_rect, |
1230 src_rect, params->dst_rect, quad->filters_scale, std::move(filter), | 1234 params->dst_rect, quad->filters_scale, std::move(filter), |
1231 params->contents_texture, &offset, &subset, params->flip_texture); | 1235 params->contents_texture, &offset, &subset, params->flip_texture); |
1232 if (!params->filter_image) | 1236 if (!params->filter_image) |
1233 return false; | 1237 return false; |
1234 params->dst_rect = | 1238 params->dst_rect = |
1235 gfx::RectF(src_rect.x() + offset.fX, src_rect.y() + offset.fY, | 1239 gfx::RectF(src_rect.x() + offset.fX, src_rect.y() + offset.fY, |
1236 subset.width(), subset.height()); | 1240 subset.width(), subset.height()); |
1237 params->src_offset.SetPoint(subset.x(), subset.y()); | 1241 params->src_offset.SetPoint(subset.x(), subset.y()); |
1238 } | 1242 } |
1239 } | 1243 } |
1240 } | 1244 } |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1487 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), | 1491 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), |
1488 params->shader_background_sampler_lock->target()); | 1492 params->shader_background_sampler_lock->target()); |
1489 } | 1493 } |
1490 } | 1494 } |
1491 | 1495 |
1492 SetShaderOpacity(params->quad->shared_quad_state->opacity, locations.alpha); | 1496 SetShaderOpacity(params->quad->shared_quad_state->opacity, locations.alpha); |
1493 SetShaderQuadF(params->surface_quad, locations.quad); | 1497 SetShaderQuadF(params->surface_quad, locations.quad); |
1494 } | 1498 } |
1495 | 1499 |
1496 void GLRenderer::DrawRPDQ(const DrawRenderPassDrawQuadParams& params) { | 1500 void GLRenderer::DrawRPDQ(const DrawRenderPassDrawQuadParams& params) { |
1497 DrawQuadGeometry(params.frame, | 1501 DrawQuadGeometry(params.projection_matrix, |
1498 params.quad->shared_quad_state->quad_to_target_transform, | 1502 params.quad->shared_quad_state->quad_to_target_transform, |
1499 params.dst_rect, params.locations.matrix); | 1503 params.dst_rect, params.locations.matrix); |
1500 | 1504 |
1501 // Flush the compositor context before the filter bitmap goes out of | 1505 // Flush the compositor context before the filter bitmap goes out of |
1502 // scope, so the draw gets processed before the filter texture gets deleted. | 1506 // scope, so the draw gets processed before the filter texture gets deleted. |
1503 if (params.filter_image) | 1507 if (params.filter_image) |
1504 gl_->Flush(); | 1508 gl_->Flush(); |
1505 | 1509 |
1506 if (!params.use_shaders_for_blending) | 1510 if (!params.use_shaders_for_blending) |
1507 RestoreBlendFuncToDefault(params.quad->shared_quad_state->blend_mode); | 1511 RestoreBlendFuncToDefault(params.quad->shared_quad_state->blend_mode); |
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1868 SetShaderQuadF(local_quad, uniforms.quad_location); | 1872 SetShaderQuadF(local_quad, uniforms.quad_location); |
1869 | 1873 |
1870 // The transform and vertex data are used to figure out the extents that the | 1874 // The transform and vertex data are used to figure out the extents that the |
1871 // un-antialiased quad should have and which vertex this is and the float | 1875 // un-antialiased quad should have and which vertex this is and the float |
1872 // quad passed in via uniform is the actual geometry that gets used to draw | 1876 // quad passed in via uniform is the actual geometry that gets used to draw |
1873 // it. This is why this centered rect is used and not the original | 1877 // it. This is why this centered rect is used and not the original |
1874 // quad_rect. | 1878 // quad_rect. |
1875 gfx::RectF centered_rect( | 1879 gfx::RectF centered_rect( |
1876 gfx::PointF(-0.5f * tile_rect.width(), -0.5f * tile_rect.height()), | 1880 gfx::PointF(-0.5f * tile_rect.width(), -0.5f * tile_rect.height()), |
1877 gfx::SizeF(tile_rect.size())); | 1881 gfx::SizeF(tile_rect.size())); |
1878 DrawQuadGeometry(frame, quad->shared_quad_state->quad_to_target_transform, | 1882 DrawQuadGeometry(frame->projection_matrix, |
| 1883 quad->shared_quad_state->quad_to_target_transform, |
1879 centered_rect, uniforms.matrix_location); | 1884 centered_rect, uniforms.matrix_location); |
1880 } else { | 1885 } else { |
1881 PrepareGeometry(SHARED_BINDING); | 1886 PrepareGeometry(SHARED_BINDING); |
1882 SetShaderQuadF(local_quad, uniforms.quad_location); | 1887 SetShaderQuadF(local_quad, uniforms.quad_location); |
1883 static float gl_matrix[16]; | 1888 static float gl_matrix[16]; |
1884 ToGLMatrix(&gl_matrix[0], | 1889 ToGLMatrix(&gl_matrix[0], |
1885 frame->projection_matrix * | 1890 frame->projection_matrix * |
1886 quad->shared_quad_state->quad_to_target_transform); | 1891 quad->shared_quad_state->quad_to_target_transform); |
1887 gl_->UniformMatrix4fv(uniforms.matrix_location, 1, false, &gl_matrix[0]); | 1892 gl_->UniformMatrix4fv(uniforms.matrix_location, 1, false, &gl_matrix[0]); |
1888 | 1893 |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2067 SetShaderOpacity(quad->shared_quad_state->opacity, uniforms.alpha_location); | 2072 SetShaderOpacity(quad->shared_quad_state->opacity, uniforms.alpha_location); |
2068 SetShaderQuadF(local_quad, uniforms.quad_location); | 2073 SetShaderQuadF(local_quad, uniforms.quad_location); |
2069 | 2074 |
2070 // The transform and vertex data are used to figure out the extents that the | 2075 // The transform and vertex data are used to figure out the extents that the |
2071 // un-antialiased quad should have and which vertex this is and the float | 2076 // un-antialiased quad should have and which vertex this is and the float |
2072 // quad passed in via uniform is the actual geometry that gets used to draw | 2077 // quad passed in via uniform is the actual geometry that gets used to draw |
2073 // it. This is why this centered rect is used and not the original quad_rect. | 2078 // it. This is why this centered rect is used and not the original quad_rect. |
2074 gfx::RectF centered_rect( | 2079 gfx::RectF centered_rect( |
2075 gfx::PointF(-0.5f * tile_rect.width(), -0.5f * tile_rect.height()), | 2080 gfx::PointF(-0.5f * tile_rect.width(), -0.5f * tile_rect.height()), |
2076 gfx::SizeF(tile_rect.size())); | 2081 gfx::SizeF(tile_rect.size())); |
2077 DrawQuadGeometry(frame, quad->shared_quad_state->quad_to_target_transform, | 2082 DrawQuadGeometry(frame->projection_matrix, |
| 2083 quad->shared_quad_state->quad_to_target_transform, |
2078 centered_rect, uniforms.matrix_location); | 2084 centered_rect, uniforms.matrix_location); |
2079 } | 2085 } |
2080 | 2086 |
2081 void GLRenderer::DrawContentQuadNoAA(const DrawingFrame* frame, | 2087 void GLRenderer::DrawContentQuadNoAA(const DrawingFrame* frame, |
2082 const ContentDrawQuadBase* quad, | 2088 const ContentDrawQuadBase* quad, |
2083 ResourceId resource_id, | 2089 ResourceId resource_id, |
2084 const gfx::QuadF* clip_region) { | 2090 const gfx::QuadF* clip_region) { |
2085 gfx::RectF tex_coord_rect = MathUtil::ScaleRectProportional( | 2091 gfx::RectF tex_coord_rect = MathUtil::ScaleRectProportional( |
2086 quad->tex_coord_rect, gfx::RectF(quad->rect), | 2092 quad->tex_coord_rect, gfx::RectF(quad->rect), |
2087 gfx::RectF(quad->visible_rect)); | 2093 gfx::RectF(quad->visible_rect)); |
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2385 // The transform and vertex data are used to figure out the extents that the | 2391 // The transform and vertex data are used to figure out the extents that the |
2386 // un-antialiased quad should have and which vertex this is and the float | 2392 // un-antialiased quad should have and which vertex this is and the float |
2387 // quad passed in via uniform is the actual geometry that gets used to draw | 2393 // quad passed in via uniform is the actual geometry that gets used to draw |
2388 // it. This is why this centered rect is used and not the original quad_rect. | 2394 // it. This is why this centered rect is used and not the original quad_rect. |
2389 auto tile_rect = gfx::RectF(quad->rect); | 2395 auto tile_rect = gfx::RectF(quad->rect); |
2390 gl_->UniformMatrix3fv(yuv_matrix_location, 1, 0, yuv_to_rgb_multiplied); | 2396 gl_->UniformMatrix3fv(yuv_matrix_location, 1, 0, yuv_to_rgb_multiplied); |
2391 gl_->Uniform3fv(yuv_adj_location, 1, yuv_adjust_with_offset); | 2397 gl_->Uniform3fv(yuv_adj_location, 1, yuv_adjust_with_offset); |
2392 | 2398 |
2393 SetShaderOpacity(quad->shared_quad_state->opacity, alpha_location); | 2399 SetShaderOpacity(quad->shared_quad_state->opacity, alpha_location); |
2394 if (!clip_region) { | 2400 if (!clip_region) { |
2395 DrawQuadGeometry(frame, quad->shared_quad_state->quad_to_target_transform, | 2401 DrawQuadGeometry(frame->projection_matrix, |
| 2402 quad->shared_quad_state->quad_to_target_transform, |
2396 tile_rect, matrix_location); | 2403 tile_rect, matrix_location); |
2397 } else { | 2404 } else { |
2398 float uvs[8] = {0}; | 2405 float uvs[8] = {0}; |
2399 GetScaledUVs(quad->visible_rect, clip_region, uvs); | 2406 GetScaledUVs(quad->visible_rect, clip_region, uvs); |
2400 gfx::QuadF region_quad = *clip_region; | 2407 gfx::QuadF region_quad = *clip_region; |
2401 region_quad.Scale(1.0f / tile_rect.width(), 1.0f / tile_rect.height()); | 2408 region_quad.Scale(1.0f / tile_rect.width(), 1.0f / tile_rect.height()); |
2402 region_quad -= gfx::Vector2dF(0.5f, 0.5f); | 2409 region_quad -= gfx::Vector2dF(0.5f, 0.5f); |
2403 DrawQuadGeometryClippedByQuadF( | 2410 DrawQuadGeometryClippedByQuadF( |
2404 frame, quad->shared_quad_state->quad_to_target_transform, tile_rect, | 2411 frame, quad->shared_quad_state->quad_to_target_transform, tile_rect, |
2405 region_quad, matrix_location, uvs); | 2412 region_quad, matrix_location, uvs); |
(...skipping 26 matching lines...) Expand all Loading... |
2432 gl_->BindTexture(GL_TEXTURE_EXTERNAL_OES, lock.texture_id()); | 2439 gl_->BindTexture(GL_TEXTURE_EXTERNAL_OES, lock.texture_id()); |
2433 | 2440 |
2434 gl_->UniformMatrix4fvStreamTextureMatrixCHROMIUM( | 2441 gl_->UniformMatrix4fvStreamTextureMatrixCHROMIUM( |
2435 program->vertex_shader().tex_matrix_location(), false, gl_matrix); | 2442 program->vertex_shader().tex_matrix_location(), false, gl_matrix); |
2436 | 2443 |
2437 gl_->Uniform1i(program->fragment_shader().sampler_location(), 0); | 2444 gl_->Uniform1i(program->fragment_shader().sampler_location(), 0); |
2438 | 2445 |
2439 SetShaderOpacity(quad->shared_quad_state->opacity, | 2446 SetShaderOpacity(quad->shared_quad_state->opacity, |
2440 program->fragment_shader().alpha_location()); | 2447 program->fragment_shader().alpha_location()); |
2441 if (!clip_region) { | 2448 if (!clip_region) { |
2442 DrawQuadGeometry(frame, quad->shared_quad_state->quad_to_target_transform, | 2449 DrawQuadGeometry(frame->projection_matrix, |
| 2450 quad->shared_quad_state->quad_to_target_transform, |
2443 gfx::RectF(quad->rect), | 2451 gfx::RectF(quad->rect), |
2444 program->vertex_shader().matrix_location()); | 2452 program->vertex_shader().matrix_location()); |
2445 } else { | 2453 } else { |
2446 gfx::QuadF region_quad(*clip_region); | 2454 gfx::QuadF region_quad(*clip_region); |
2447 region_quad.Scale(1.0f / quad->rect.width(), 1.0f / quad->rect.height()); | 2455 region_quad.Scale(1.0f / quad->rect.width(), 1.0f / quad->rect.height()); |
2448 region_quad -= gfx::Vector2dF(0.5f, 0.5f); | 2456 region_quad -= gfx::Vector2dF(0.5f, 0.5f); |
2449 float uvs[8] = {0}; | 2457 float uvs[8] = {0}; |
2450 GetScaledUVs(quad->visible_rect, clip_region, uvs); | 2458 GetScaledUVs(quad->visible_rect, clip_region, uvs); |
2451 DrawQuadGeometryClippedByQuadF( | 2459 DrawQuadGeometryClippedByQuadF( |
2452 frame, quad->shared_quad_state->quad_to_target_transform, | 2460 frame, quad->shared_quad_state->quad_to_target_transform, |
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2797 gfx::Transform quad_rect_matrix; | 2805 gfx::Transform quad_rect_matrix; |
2798 QuadRectTransform(&quad_rect_matrix, draw_transform, quad_rect); | 2806 QuadRectTransform(&quad_rect_matrix, draw_transform, quad_rect); |
2799 static float gl_matrix[16]; | 2807 static float gl_matrix[16]; |
2800 ToGLMatrix(&gl_matrix[0], frame->projection_matrix * quad_rect_matrix); | 2808 ToGLMatrix(&gl_matrix[0], frame->projection_matrix * quad_rect_matrix); |
2801 gl_->UniformMatrix4fv(matrix_location, 1, false, &gl_matrix[0]); | 2809 gl_->UniformMatrix4fv(matrix_location, 1, false, &gl_matrix[0]); |
2802 | 2810 |
2803 gl_->DrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, | 2811 gl_->DrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, |
2804 reinterpret_cast<const void*>(0)); | 2812 reinterpret_cast<const void*>(0)); |
2805 } | 2813 } |
2806 | 2814 |
2807 void GLRenderer::DrawQuadGeometry(const DrawingFrame* frame, | 2815 void GLRenderer::DrawQuadGeometry(const gfx::Transform& projection_matrix, |
2808 const gfx::Transform& draw_transform, | 2816 const gfx::Transform& draw_transform, |
2809 const gfx::RectF& quad_rect, | 2817 const gfx::RectF& quad_rect, |
2810 int matrix_location) { | 2818 int matrix_location) { |
2811 PrepareGeometry(SHARED_BINDING); | 2819 PrepareGeometry(SHARED_BINDING); |
2812 gfx::Transform quad_rect_matrix; | 2820 gfx::Transform quad_rect_matrix; |
2813 QuadRectTransform(&quad_rect_matrix, draw_transform, quad_rect); | 2821 QuadRectTransform(&quad_rect_matrix, draw_transform, quad_rect); |
2814 static float gl_matrix[16]; | 2822 static float gl_matrix[16]; |
2815 ToGLMatrix(&gl_matrix[0], frame->projection_matrix * quad_rect_matrix); | 2823 ToGLMatrix(&gl_matrix[0], projection_matrix * quad_rect_matrix); |
2816 gl_->UniformMatrix4fv(matrix_location, 1, false, &gl_matrix[0]); | 2824 gl_->UniformMatrix4fv(matrix_location, 1, false, &gl_matrix[0]); |
2817 | 2825 |
2818 gl_->DrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); | 2826 gl_->DrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); |
2819 } | 2827 } |
2820 | 2828 |
2821 void GLRenderer::Finish() { | 2829 void GLRenderer::Finish() { |
2822 TRACE_EVENT0("cc", "GLRenderer::Finish"); | 2830 TRACE_EVENT0("cc", "GLRenderer::Finish"); |
2823 gl_->Finish(); | 2831 gl_->Finish(); |
2824 } | 2832 } |
2825 | 2833 |
(...skipping 897 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3723 | 3731 |
3724 if (is_scissor_enabled_) { | 3732 if (is_scissor_enabled_) { |
3725 gl_->Enable(GL_SCISSOR_TEST); | 3733 gl_->Enable(GL_SCISSOR_TEST); |
3726 gl_->Scissor(scissor_rect_.x(), scissor_rect_.y(), scissor_rect_.width(), | 3734 gl_->Scissor(scissor_rect_.x(), scissor_rect_.y(), scissor_rect_.width(), |
3727 scissor_rect_.height()); | 3735 scissor_rect_.height()); |
3728 } else { | 3736 } else { |
3729 gl_->Disable(GL_SCISSOR_TEST); | 3737 gl_->Disable(GL_SCISSOR_TEST); |
3730 } | 3738 } |
3731 } | 3739 } |
3732 | 3740 |
3733 void GLRenderer::RestoreFramebuffer(DrawingFrame* frame) { | |
3734 UseRenderPass(frame, frame->current_render_pass); | |
3735 | |
3736 // Call SetViewport directly, rather than through PrepareSurfaceForPass. | |
3737 // PrepareSurfaceForPass also clears the surface, which is not desired when | |
3738 // restoring. | |
3739 SetViewport(); | |
3740 } | |
3741 | |
3742 bool GLRenderer::IsContextLost() { | 3741 bool GLRenderer::IsContextLost() { |
3743 return gl_->GetGraphicsResetStatusKHR() != GL_NO_ERROR; | 3742 return gl_->GetGraphicsResetStatusKHR() != GL_NO_ERROR; |
3744 } | 3743 } |
3745 | 3744 |
3746 void GLRenderer::ScheduleCALayers(DrawingFrame* frame) { | 3745 void GLRenderer::ScheduleCALayers(DrawingFrame* frame) { |
3747 scoped_refptr<CALayerOverlaySharedState> shared_state; | 3746 scoped_refptr<CALayerOverlaySharedState> shared_state; |
3748 size_t copied_render_pass_count = 0; | 3747 size_t copied_render_pass_count = 0; |
3749 for (const CALayerOverlay& ca_layer_overlay : frame->ca_layer_overlay_list) { | 3748 for (const CALayerOverlay& ca_layer_overlay : frame->ca_layer_overlay_list) { |
3750 if (!overlay_resource_pool_) { | 3749 if (!overlay_resource_pool_) { |
3751 overlay_resource_pool_ = ResourcePool::CreateForGpuMemoryBufferResources( | 3750 overlay_resource_pool_ = ResourcePool::CreateForGpuMemoryBufferResources( |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3881 resource_provider_, contents_texture->id())); | 3880 resource_provider_, contents_texture->id())); |
3882 source_texture = source->texture_id(); | 3881 source_texture = source->texture_id(); |
3883 } | 3882 } |
3884 gl_->CopySubTextureCHROMIUM(source_texture, destination.texture_id(), 0, 0, 0, | 3883 gl_->CopySubTextureCHROMIUM(source_texture, destination.texture_id(), 0, 0, 0, |
3885 0, contents_texture->size().width(), | 3884 0, contents_texture->size().width(), |
3886 contents_texture->size().height(), GL_TRUE, | 3885 contents_texture->size().height(), GL_TRUE, |
3887 GL_FALSE, GL_FALSE); | 3886 GL_FALSE, GL_FALSE); |
3888 } | 3887 } |
3889 | 3888 |
3890 } // namespace cc | 3889 } // namespace cc |
OLD | NEW |