| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/ca_layer_overlay.h" | 5 #include "cc/output/ca_layer_overlay.h" |
| 6 | 6 |
| 7 #include "base/metrics/histogram.h" | 7 #include "base/metrics/histogram.h" |
| 8 #include "cc/quads/solid_color_draw_quad.h" | 8 #include "cc/quads/solid_color_draw_quad.h" |
| 9 #include "cc/quads/stream_video_draw_quad.h" | 9 #include "cc/quads/stream_video_draw_quad.h" |
| 10 #include "cc/quads/texture_draw_quad.h" | 10 #include "cc/quads/texture_draw_quad.h" |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 CA_LAYER_FAILED_PICTURE_CONTENT, | 34 CA_LAYER_FAILED_PICTURE_CONTENT, |
| 35 CA_LAYER_FAILED_RENDER_PASS, | 35 CA_LAYER_FAILED_RENDER_PASS, |
| 36 CA_LAYER_FAILED_SURFACE_CONTENT, | 36 CA_LAYER_FAILED_SURFACE_CONTENT, |
| 37 CA_LAYER_FAILED_YUV_VIDEO_CONTENT, | 37 CA_LAYER_FAILED_YUV_VIDEO_CONTENT, |
| 38 CA_LAYER_FAILED_COUNT, | 38 CA_LAYER_FAILED_COUNT, |
| 39 }; | 39 }; |
| 40 | 40 |
| 41 CALayerResult FromStreamVideoQuad(ResourceProvider* resource_provider, | 41 CALayerResult FromStreamVideoQuad(ResourceProvider* resource_provider, |
| 42 const StreamVideoDrawQuad* quad, | 42 const StreamVideoDrawQuad* quad, |
| 43 CALayerOverlay* ca_layer_overlay) { | 43 CALayerOverlay* ca_layer_overlay) { |
| 44 unsigned resource_id = quad->resource_id(); | 44 if (!resource_provider->IsOverlayCandidate(quad->resource_id())) |
| 45 if (!resource_provider->IsOverlayCandidate(resource_id)) | |
| 46 return CA_LAYER_FAILED_STREAM_VIDEO_NOT_CANDIDATE; | 45 return CA_LAYER_FAILED_STREAM_VIDEO_NOT_CANDIDATE; |
| 47 ca_layer_overlay->contents_resource_id = resource_id; | 46 ca_layer_overlay->resource_lock.reset( |
| 47 new ResourceProvider::ScopedReadLockGpuMemoryBuffer(resource_provider, |
| 48 quad->resource_id())); |
| 48 // TODO(ccameron): Support merging at least some basic transforms into the | 49 // TODO(ccameron): Support merging at least some basic transforms into the |
| 49 // layer transform. | 50 // layer transform. |
| 50 if (!quad->matrix.IsIdentity()) | 51 if (!quad->matrix.IsIdentity()) |
| 51 return CA_LAYER_FAILED_STREAM_VIDEO_TRANSFORM; | 52 return CA_LAYER_FAILED_STREAM_VIDEO_TRANSFORM; |
| 52 ca_layer_overlay->contents_rect = gfx::RectF(0, 0, 1, 1); | 53 ca_layer_overlay->contents_rect = gfx::RectF(0, 0, 1, 1); |
| 53 return CA_LAYER_SUCCESS; | 54 return CA_LAYER_SUCCESS; |
| 54 } | 55 } |
| 55 | 56 |
| 56 CALayerResult FromSolidColorDrawQuad(const SolidColorDrawQuad* quad, | 57 CALayerResult FromSolidColorDrawQuad(const SolidColorDrawQuad* quad, |
| 57 CALayerOverlay* ca_layer_overlay, | 58 CALayerOverlay* ca_layer_overlay, |
| 58 bool* skip) { | 59 bool* skip) { |
| 59 // Do not generate quads that are completely transparent. | 60 // Do not generate quads that are completely transparent. |
| 60 if (SkColorGetA(quad->color) == 0) { | 61 if (SkColorGetA(quad->color) == 0) { |
| 61 *skip = true; | 62 *skip = true; |
| 62 return CA_LAYER_SUCCESS; | 63 return CA_LAYER_SUCCESS; |
| 63 } | 64 } |
| 64 ca_layer_overlay->background_color = quad->color; | 65 ca_layer_overlay->background_color = quad->color; |
| 65 return CA_LAYER_SUCCESS; | 66 return CA_LAYER_SUCCESS; |
| 66 } | 67 } |
| 67 | 68 |
| 68 CALayerResult FromTextureQuad(ResourceProvider* resource_provider, | 69 CALayerResult FromTextureQuad(ResourceProvider* resource_provider, |
| 69 const TextureDrawQuad* quad, | 70 const TextureDrawQuad* quad, |
| 70 CALayerOverlay* ca_layer_overlay) { | 71 CALayerOverlay* ca_layer_overlay) { |
| 71 unsigned resource_id = quad->resource_id(); | 72 if (!resource_provider->IsOverlayCandidate(quad->resource_id())) |
| 72 if (!resource_provider->IsOverlayCandidate(resource_id)) | |
| 73 return CA_LAYER_FAILED_TEXTURE_NOT_CANDIDATE; | 73 return CA_LAYER_FAILED_TEXTURE_NOT_CANDIDATE; |
| 74 ca_layer_overlay->resource_lock.reset( |
| 75 new ResourceProvider::ScopedReadLockGpuMemoryBuffer(resource_provider, |
| 76 quad->resource_id())); |
| 74 if (quad->y_flipped) { | 77 if (quad->y_flipped) { |
| 75 // The anchor point is at the bottom-left corner of the CALayer. The | 78 // The anchor point is at the bottom-left corner of the CALayer. The |
| 76 // transformation that flips the contents of the layer without changing its | 79 // transformation that flips the contents of the layer without changing its |
| 77 // frame is the composition of a vertical flip about the anchor point, and a | 80 // frame is the composition of a vertical flip about the anchor point, and a |
| 78 // translation by the height of the layer. | 81 // translation by the height of the layer. |
| 79 ca_layer_overlay->transform.preTranslate( | 82 ca_layer_overlay->transform.preTranslate( |
| 80 0, ca_layer_overlay->bounds_rect.height(), 0); | 83 0, ca_layer_overlay->bounds_rect.height(), 0); |
| 81 ca_layer_overlay->transform.preScale(1, -1, 1); | 84 ca_layer_overlay->transform.preScale(1, -1, 1); |
| 82 } | 85 } |
| 83 ca_layer_overlay->contents_resource_id = resource_id; | |
| 84 ca_layer_overlay->contents_rect = | 86 ca_layer_overlay->contents_rect = |
| 85 BoundingRect(quad->uv_top_left, quad->uv_bottom_right); | 87 BoundingRect(quad->uv_top_left, quad->uv_bottom_right); |
| 86 ca_layer_overlay->background_color = quad->background_color; | 88 ca_layer_overlay->background_color = quad->background_color; |
| 87 for (int i = 1; i < 4; ++i) { | 89 for (int i = 1; i < 4; ++i) { |
| 88 if (quad->vertex_opacity[i] != quad->vertex_opacity[0]) | 90 if (quad->vertex_opacity[i] != quad->vertex_opacity[0]) |
| 89 return CA_LAYER_FAILED_UNKNOWN; | 91 return CA_LAYER_FAILED_UNKNOWN; |
| 90 } | 92 } |
| 91 ca_layer_overlay->opacity *= quad->vertex_opacity[0]; | 93 ca_layer_overlay->opacity *= quad->vertex_opacity[0]; |
| 92 ca_layer_overlay->filter = quad->nearest_neighbor ? GL_NEAREST : GL_LINEAR; | 94 ca_layer_overlay->filter = quad->nearest_neighbor ? GL_NEAREST : GL_LINEAR; |
| 93 return CA_LAYER_SUCCESS; | 95 return CA_LAYER_SUCCESS; |
| 94 } | 96 } |
| 95 | 97 |
| 96 CALayerResult FromTileQuad(ResourceProvider* resource_provider, | 98 CALayerResult FromTileQuad(ResourceProvider* resource_provider, |
| 97 const TileDrawQuad* quad, | 99 const TileDrawQuad* quad, |
| 98 CALayerOverlay* ca_layer_overlay) { | 100 CALayerOverlay* ca_layer_overlay) { |
| 99 unsigned resource_id = quad->resource_id(); | 101 if (!resource_provider->IsOverlayCandidate(quad->resource_id())) |
| 100 if (!resource_provider->IsOverlayCandidate(resource_id)) | |
| 101 return CA_LAYER_FAILED_TILE_NOT_CANDIDATE; | 102 return CA_LAYER_FAILED_TILE_NOT_CANDIDATE; |
| 102 ca_layer_overlay->contents_resource_id = resource_id; | 103 ca_layer_overlay->resource_lock.reset( |
| 104 new ResourceProvider::ScopedReadLockGpuMemoryBuffer(resource_provider, |
| 105 quad->resource_id())); |
| 103 ca_layer_overlay->contents_rect = quad->tex_coord_rect; | 106 ca_layer_overlay->contents_rect = quad->tex_coord_rect; |
| 104 ca_layer_overlay->contents_rect.Scale(1.f / quad->texture_size.width(), | 107 ca_layer_overlay->contents_rect.Scale(1.f / quad->texture_size.width(), |
| 105 1.f / quad->texture_size.height()); | 108 1.f / quad->texture_size.height()); |
| 106 return CA_LAYER_SUCCESS; | 109 return CA_LAYER_SUCCESS; |
| 107 } | 110 } |
| 108 | 111 |
| 109 CALayerResult FromDrawQuad(ResourceProvider* resource_provider, | 112 CALayerResult FromDrawQuad(ResourceProvider* resource_provider, |
| 110 const gfx::RectF& display_rect, | 113 const gfx::RectF& display_rect, |
| 111 const DrawQuad* quad, | 114 const DrawQuad* quad, |
| 112 CALayerOverlay* ca_layer_overlay, | 115 CALayerOverlay* ca_layer_overlay, |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 break; | 174 break; |
| 172 } | 175 } |
| 173 | 176 |
| 174 return CA_LAYER_FAILED_UNKNOWN; | 177 return CA_LAYER_FAILED_UNKNOWN; |
| 175 } | 178 } |
| 176 | 179 |
| 177 } // namespace | 180 } // namespace |
| 178 | 181 |
| 179 CALayerOverlay::CALayerOverlay() : filter(GL_LINEAR) {} | 182 CALayerOverlay::CALayerOverlay() : filter(GL_LINEAR) {} |
| 180 | 183 |
| 181 CALayerOverlay::CALayerOverlay(const CALayerOverlay& other) = default; | 184 CALayerOverlay::CALayerOverlay(CALayerOverlay&& other) = default; |
| 185 |
| 186 CALayerOverlay& CALayerOverlay::operator=(CALayerOverlay&& other) = default; |
| 182 | 187 |
| 183 CALayerOverlay::~CALayerOverlay() {} | 188 CALayerOverlay::~CALayerOverlay() {} |
| 184 | 189 |
| 185 bool ProcessForCALayerOverlays(ResourceProvider* resource_provider, | 190 bool ProcessForCALayerOverlays(ResourceProvider* resource_provider, |
| 186 const gfx::RectF& display_rect, | 191 const gfx::RectF& display_rect, |
| 187 const QuadList& quad_list, | 192 const QuadList& quad_list, |
| 188 CALayerOverlayList* ca_layer_overlays) { | 193 CALayerOverlayList* ca_layer_overlays) { |
| 189 CALayerResult result = CA_LAYER_SUCCESS; | 194 CALayerResult result = CA_LAYER_SUCCESS; |
| 190 ca_layer_overlays->reserve(quad_list.size()); | 195 ca_layer_overlays->reserve(quad_list.size()); |
| 191 | 196 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 210 previous_ca_layer.sorting_context_id == ca_layer.sorting_context_id) { | 215 previous_ca_layer.sorting_context_id == ca_layer.sorting_context_id) { |
| 211 if (previous_ca_layer.is_clipped != ca_layer.is_clipped || | 216 if (previous_ca_layer.is_clipped != ca_layer.is_clipped || |
| 212 previous_ca_layer.clip_rect != ca_layer.clip_rect) { | 217 previous_ca_layer.clip_rect != ca_layer.clip_rect) { |
| 213 // TODO(ccameron): Add a histogram value for this. | 218 // TODO(ccameron): Add a histogram value for this. |
| 214 result = CA_LAYER_FAILED_UNKNOWN; | 219 result = CA_LAYER_FAILED_UNKNOWN; |
| 215 break; | 220 break; |
| 216 } | 221 } |
| 217 } | 222 } |
| 218 } | 223 } |
| 219 | 224 |
| 220 ca_layer_overlays->push_back(ca_layer); | 225 ca_layer_overlays->emplace_back(std::move(ca_layer)); |
| 221 } | 226 } |
| 222 | 227 |
| 223 UMA_HISTOGRAM_ENUMERATION("Compositing.Renderer.CALayerResult", result, | 228 UMA_HISTOGRAM_ENUMERATION("Compositing.Renderer.CALayerResult", result, |
| 224 CA_LAYER_FAILED_COUNT); | 229 CA_LAYER_FAILED_COUNT); |
| 225 | 230 |
| 226 if (result != CA_LAYER_SUCCESS) { | 231 if (result != CA_LAYER_SUCCESS) { |
| 227 ca_layer_overlays->clear(); | 232 ca_layer_overlays->clear(); |
| 228 return false; | 233 return false; |
| 229 } | 234 } |
| 230 return true; | 235 return true; |
| 231 } | 236 } |
| 232 | 237 |
| 233 } // namespace cc | 238 } // namespace cc |
| OLD | NEW |