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

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: Add operator= Created 4 years, 7 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
« no previous file with comments | « cc/output/ca_layer_overlay.h ('k') | cc/output/gl_renderer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 23 matching lines...) Expand all
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
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
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
OLDNEW
« no previous file with comments | « cc/output/ca_layer_overlay.h ('k') | cc/output/gl_renderer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698