Chromium Code Reviews| 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 20 matching lines...) Expand all Loading... | |
| 31 CA_LAYER_FAILED_QUAD_TRANSFORM, | 31 CA_LAYER_FAILED_QUAD_TRANSFORM, |
| 32 CA_LAYER_FAILED_QUAD_CLIPPING, | 32 CA_LAYER_FAILED_QUAD_CLIPPING, |
| 33 CA_LAYER_FAILED_DEBUG_BORDER, | 33 CA_LAYER_FAILED_DEBUG_BORDER, |
| 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 bool SetResource(ResourceProvider* resource_provider, | |
|
erikchen
2016/05/26 00:32:01
I think the conditional should live outside the fu
ccameron
2016/05/26 18:49:15
But but ... it seems so wasteful to look the same
| |
| 42 unsigned resource_id, | |
| 43 CALayerOverlay* ca_layer_overlay) { | |
| 44 std::unique_ptr<ResourceProvider::ScopedReadLockGpuMemoryBuffer> | |
| 45 resource_lock(new ResourceProvider::ScopedReadLockGpuMemoryBuffer( | |
| 46 resource_provider, resource_id)); | |
| 47 if (!resource_lock->IsOverlayCandidate()) | |
| 48 return false; | |
| 49 ca_layer_overlay->resource_lock = std::move(resource_lock); | |
| 50 return true; | |
| 51 } | |
| 52 | |
| 41 CALayerResult FromStreamVideoQuad(ResourceProvider* resource_provider, | 53 CALayerResult FromStreamVideoQuad(ResourceProvider* resource_provider, |
| 42 const StreamVideoDrawQuad* quad, | 54 const StreamVideoDrawQuad* quad, |
| 43 CALayerOverlay* ca_layer_overlay) { | 55 CALayerOverlay* ca_layer_overlay) { |
| 44 unsigned resource_id = quad->resource_id(); | 56 if (!SetResource(resource_provider, quad->resource_id(), ca_layer_overlay)) |
| 45 if (!resource_provider->IsOverlayCandidate(resource_id)) | |
| 46 return CA_LAYER_FAILED_STREAM_VIDEO_NOT_CANDIDATE; | 57 return CA_LAYER_FAILED_STREAM_VIDEO_NOT_CANDIDATE; |
| 47 ca_layer_overlay->contents_resource_id = resource_id; | |
| 48 // TODO(ccameron): Support merging at least some basic transforms into the | 58 // TODO(ccameron): Support merging at least some basic transforms into the |
| 49 // layer transform. | 59 // layer transform. |
| 50 if (!quad->matrix.IsIdentity()) | 60 if (!quad->matrix.IsIdentity()) |
| 51 return CA_LAYER_FAILED_STREAM_VIDEO_TRANSFORM; | 61 return CA_LAYER_FAILED_STREAM_VIDEO_TRANSFORM; |
| 52 ca_layer_overlay->contents_rect = gfx::RectF(0, 0, 1, 1); | 62 ca_layer_overlay->contents_rect = gfx::RectF(0, 0, 1, 1); |
| 53 return CA_LAYER_SUCCESS; | 63 return CA_LAYER_SUCCESS; |
| 54 } | 64 } |
| 55 | 65 |
| 56 CALayerResult FromSolidColorDrawQuad(const SolidColorDrawQuad* quad, | 66 CALayerResult FromSolidColorDrawQuad(const SolidColorDrawQuad* quad, |
| 57 CALayerOverlay* ca_layer_overlay, | 67 CALayerOverlay* ca_layer_overlay, |
| 58 bool* skip) { | 68 bool* skip) { |
| 59 // Do not generate quads that are completely transparent. | 69 // Do not generate quads that are completely transparent. |
| 60 if (SkColorGetA(quad->color) == 0) { | 70 if (SkColorGetA(quad->color) == 0) { |
| 61 *skip = true; | 71 *skip = true; |
| 62 return CA_LAYER_SUCCESS; | 72 return CA_LAYER_SUCCESS; |
| 63 } | 73 } |
| 64 ca_layer_overlay->background_color = quad->color; | 74 ca_layer_overlay->background_color = quad->color; |
| 65 return CA_LAYER_SUCCESS; | 75 return CA_LAYER_SUCCESS; |
| 66 } | 76 } |
| 67 | 77 |
| 68 CALayerResult FromTextureQuad(ResourceProvider* resource_provider, | 78 CALayerResult FromTextureQuad(ResourceProvider* resource_provider, |
| 69 const TextureDrawQuad* quad, | 79 const TextureDrawQuad* quad, |
| 70 CALayerOverlay* ca_layer_overlay) { | 80 CALayerOverlay* ca_layer_overlay) { |
| 71 unsigned resource_id = quad->resource_id(); | 81 if (!SetResource(resource_provider, quad->resource_id(), ca_layer_overlay)) |
| 72 if (!resource_provider->IsOverlayCandidate(resource_id)) | |
| 73 return CA_LAYER_FAILED_TEXTURE_NOT_CANDIDATE; | 82 return CA_LAYER_FAILED_TEXTURE_NOT_CANDIDATE; |
| 74 if (quad->y_flipped) { | 83 if (quad->y_flipped) { |
| 75 // The anchor point is at the bottom-left corner of the CALayer. The | 84 // 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 | 85 // 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 | 86 // frame is the composition of a vertical flip about the anchor point, and a |
| 78 // translation by the height of the layer. | 87 // translation by the height of the layer. |
| 79 ca_layer_overlay->transform.preTranslate( | 88 ca_layer_overlay->transform.preTranslate( |
| 80 0, ca_layer_overlay->bounds_rect.height(), 0); | 89 0, ca_layer_overlay->bounds_rect.height(), 0); |
| 81 ca_layer_overlay->transform.preScale(1, -1, 1); | 90 ca_layer_overlay->transform.preScale(1, -1, 1); |
| 82 } | 91 } |
| 83 ca_layer_overlay->contents_resource_id = resource_id; | |
| 84 ca_layer_overlay->contents_rect = | 92 ca_layer_overlay->contents_rect = |
| 85 BoundingRect(quad->uv_top_left, quad->uv_bottom_right); | 93 BoundingRect(quad->uv_top_left, quad->uv_bottom_right); |
| 86 ca_layer_overlay->background_color = quad->background_color; | 94 ca_layer_overlay->background_color = quad->background_color; |
| 87 for (int i = 1; i < 4; ++i) { | 95 for (int i = 1; i < 4; ++i) { |
| 88 if (quad->vertex_opacity[i] != quad->vertex_opacity[0]) | 96 if (quad->vertex_opacity[i] != quad->vertex_opacity[0]) |
| 89 return CA_LAYER_FAILED_UNKNOWN; | 97 return CA_LAYER_FAILED_UNKNOWN; |
| 90 } | 98 } |
| 91 ca_layer_overlay->opacity *= quad->vertex_opacity[0]; | 99 ca_layer_overlay->opacity *= quad->vertex_opacity[0]; |
| 92 ca_layer_overlay->filter = quad->nearest_neighbor ? GL_NEAREST : GL_LINEAR; | 100 ca_layer_overlay->filter = quad->nearest_neighbor ? GL_NEAREST : GL_LINEAR; |
| 93 return CA_LAYER_SUCCESS; | 101 return CA_LAYER_SUCCESS; |
| 94 } | 102 } |
| 95 | 103 |
| 96 CALayerResult FromTileQuad(ResourceProvider* resource_provider, | 104 CALayerResult FromTileQuad(ResourceProvider* resource_provider, |
| 97 const TileDrawQuad* quad, | 105 const TileDrawQuad* quad, |
| 98 CALayerOverlay* ca_layer_overlay) { | 106 CALayerOverlay* ca_layer_overlay) { |
| 99 unsigned resource_id = quad->resource_id(); | 107 if (!SetResource(resource_provider, quad->resource_id(), ca_layer_overlay)) |
| 100 if (!resource_provider->IsOverlayCandidate(resource_id)) | |
| 101 return CA_LAYER_FAILED_TILE_NOT_CANDIDATE; | 108 return CA_LAYER_FAILED_TILE_NOT_CANDIDATE; |
| 102 ca_layer_overlay->contents_resource_id = resource_id; | |
| 103 ca_layer_overlay->contents_rect = quad->tex_coord_rect; | 109 ca_layer_overlay->contents_rect = quad->tex_coord_rect; |
| 104 ca_layer_overlay->contents_rect.Scale(1.f / quad->texture_size.width(), | 110 ca_layer_overlay->contents_rect.Scale(1.f / quad->texture_size.width(), |
| 105 1.f / quad->texture_size.height()); | 111 1.f / quad->texture_size.height()); |
| 106 return CA_LAYER_SUCCESS; | 112 return CA_LAYER_SUCCESS; |
| 107 } | 113 } |
| 108 | 114 |
| 109 CALayerResult FromDrawQuad(ResourceProvider* resource_provider, | 115 CALayerResult FromDrawQuad(ResourceProvider* resource_provider, |
| 110 const gfx::RectF& display_rect, | 116 const gfx::RectF& display_rect, |
| 111 const DrawQuad* quad, | 117 const DrawQuad* quad, |
| 112 CALayerOverlay* ca_layer_overlay, | 118 CALayerOverlay* ca_layer_overlay, |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 171 break; | 177 break; |
| 172 } | 178 } |
| 173 | 179 |
| 174 return CA_LAYER_FAILED_UNKNOWN; | 180 return CA_LAYER_FAILED_UNKNOWN; |
| 175 } | 181 } |
| 176 | 182 |
| 177 } // namespace | 183 } // namespace |
| 178 | 184 |
| 179 CALayerOverlay::CALayerOverlay() : filter(GL_LINEAR) {} | 185 CALayerOverlay::CALayerOverlay() : filter(GL_LINEAR) {} |
| 180 | 186 |
| 181 CALayerOverlay::CALayerOverlay(const CALayerOverlay& other) = default; | 187 CALayerOverlay::CALayerOverlay(CALayerOverlay&& other) = default; |
| 182 | 188 |
| 183 CALayerOverlay::~CALayerOverlay() {} | 189 CALayerOverlay::~CALayerOverlay() {} |
| 184 | 190 |
| 185 bool ProcessForCALayerOverlays(ResourceProvider* resource_provider, | 191 bool ProcessForCALayerOverlays(ResourceProvider* resource_provider, |
| 186 const gfx::RectF& display_rect, | 192 const gfx::RectF& display_rect, |
| 187 const QuadList& quad_list, | 193 const QuadList& quad_list, |
| 188 CALayerOverlayList* ca_layer_overlays) { | 194 CALayerOverlayList* ca_layer_overlays) { |
| 189 CALayerResult result = CA_LAYER_SUCCESS; | 195 CALayerResult result = CA_LAYER_SUCCESS; |
| 190 ca_layer_overlays->reserve(quad_list.size()); | 196 ca_layer_overlays->reserve(quad_list.size()); |
| 191 | 197 |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 210 previous_ca_layer.sorting_context_id == ca_layer.sorting_context_id) { | 216 previous_ca_layer.sorting_context_id == ca_layer.sorting_context_id) { |
| 211 if (previous_ca_layer.is_clipped != ca_layer.is_clipped || | 217 if (previous_ca_layer.is_clipped != ca_layer.is_clipped || |
| 212 previous_ca_layer.clip_rect != ca_layer.clip_rect) { | 218 previous_ca_layer.clip_rect != ca_layer.clip_rect) { |
| 213 // TODO(ccameron): Add a histogram value for this. | 219 // TODO(ccameron): Add a histogram value for this. |
| 214 result = CA_LAYER_FAILED_UNKNOWN; | 220 result = CA_LAYER_FAILED_UNKNOWN; |
| 215 break; | 221 break; |
| 216 } | 222 } |
| 217 } | 223 } |
| 218 } | 224 } |
| 219 | 225 |
| 220 ca_layer_overlays->push_back(ca_layer); | 226 ca_layer_overlays->push_back(std::move(ca_layer)); |
| 221 } | 227 } |
| 222 | 228 |
| 223 UMA_HISTOGRAM_ENUMERATION("Compositing.Renderer.CALayerResult", result, | 229 UMA_HISTOGRAM_ENUMERATION("Compositing.Renderer.CALayerResult", result, |
| 224 CA_LAYER_FAILED_COUNT); | 230 CA_LAYER_FAILED_COUNT); |
| 225 | 231 |
| 226 if (result != CA_LAYER_SUCCESS) { | 232 if (result != CA_LAYER_SUCCESS) { |
| 227 ca_layer_overlays->clear(); | 233 ca_layer_overlays->clear(); |
| 228 return false; | 234 return false; |
| 229 } | 235 } |
| 230 return true; | 236 return true; |
| 231 } | 237 } |
| 232 | 238 |
| 233 } // namespace cc | 239 } // namespace cc |
| OLD | NEW |