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

Side by Side Diff: cc/output/ca_layer_overlay.cc

Issue 2017473002: cc: Lock resources directly in CALayerOverlay (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 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
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698