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

Unified Diff: cc/output/ca_layer_overlay.cc

Issue 2164613003: Add logic to convert from RenderPassDrawQuads to CALayerOverlays. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@temp41_rpdq_converter
Patch Set: Compile errors. Created 4 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/output/ca_layer_overlay.h ('k') | cc/output/overlay_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/output/ca_layer_overlay.cc
diff --git a/cc/output/ca_layer_overlay.cc b/cc/output/ca_layer_overlay.cc
index ac61db0ac9dbaf9f216124193ab6c703767c6aef..8d4deb12ab2a90e3c8416500cd3e06a3d6fada6f 100644
--- a/cc/output/ca_layer_overlay.cc
+++ b/cc/output/ca_layer_overlay.cc
@@ -5,6 +5,7 @@
#include "cc/output/ca_layer_overlay.h"
#include "base/metrics/histogram.h"
+#include "cc/quads/render_pass_draw_quad.h"
#include "cc/quads/solid_color_draw_quad.h"
#include "cc/quads/stream_video_draw_quad.h"
#include "cc/quads/texture_draw_quad.h"
@@ -16,6 +17,8 @@ namespace cc {
namespace {
+bool g_allow_rpdq_quad_conversion = false;
+
// This enum is used for histogram states and should only have new values added
// to the end before COUNT.
enum CALayerResult {
@@ -37,9 +40,95 @@ enum CALayerResult {
CA_LAYER_FAILED_YUV_VIDEO_CONTENT,
CA_LAYER_FAILED_DIFFERENT_CLIP_SETTINGS,
CA_LAYER_FAILED_DIFFERENT_VERTEX_OPACITIES,
+ CA_LAYER_FAILED_RENDER_PASS_FILTER_SCALE,
+ CA_LAYER_FAILED_RENDER_PASS_BACKGROUND_FILTERS,
+ CA_LAYER_FAILED_RENDER_PASS_MASK,
+ CA_LAYER_FAILED_RENDER_PASS_FILTER_OPERATION,
CA_LAYER_FAILED_COUNT,
};
+bool ConvertAndAppendFilterOperation(
+ const FilterOperation& operation,
+ ui::CARendererLayerParams::FilterEffects* filter_effects) {
+ ui::CARendererLayerParams::FilterEffect filter_effect;
+ switch (operation.type()) {
+ case FilterOperation::GRAYSCALE:
+ filter_effect.type =
+ ui::CARendererLayerParams::FilterEffectType::GRAYSCALE;
+ break;
+ case FilterOperation::SEPIA:
+ filter_effect.type = ui::CARendererLayerParams::FilterEffectType::SEPIA;
+ break;
+ case FilterOperation::SATURATE:
+ filter_effect.type =
+ ui::CARendererLayerParams::FilterEffectType::SATURATE;
+ break;
+ case FilterOperation::HUE_ROTATE:
+ filter_effect.type =
+ ui::CARendererLayerParams::FilterEffectType::HUE_ROTATE;
+ break;
+ case FilterOperation::INVERT:
+ filter_effect.type = ui::CARendererLayerParams::FilterEffectType::INVERT;
+ break;
+ case FilterOperation::BRIGHTNESS:
+ filter_effect.type =
+ ui::CARendererLayerParams::FilterEffectType::BRIGHTNESS;
+ break;
+ case FilterOperation::CONTRAST:
+ filter_effect.type =
+ ui::CARendererLayerParams::FilterEffectType::CONTRAST;
+ break;
+ case FilterOperation::OPACITY:
+ filter_effect.type = ui::CARendererLayerParams::FilterEffectType::OPACITY;
+ break;
+ case FilterOperation::BLUR:
+ filter_effect.type = ui::CARendererLayerParams::FilterEffectType::BLUR;
+ break;
+ case FilterOperation::DROP_SHADOW:
+ filter_effect.type =
+ ui::CARendererLayerParams::FilterEffectType::DROP_SHADOW;
+ break;
+ default:
+ return false;
+ }
+
+ filter_effect.amount = operation.amount();
+ if (filter_effect.type ==
+ ui::CARendererLayerParams::FilterEffectType::DROP_SHADOW) {
+ filter_effect.drop_shadow_offset = operation.drop_shadow_offset();
+ filter_effect.drop_shadow_color = operation.drop_shadow_color();
+ }
+ filter_effects->push_back(filter_effect);
+ return true;
+}
+
+CALayerResult FromRenderPassQuad(ResourceProvider* resource_provider,
+ const RenderPassDrawQuad* quad,
+ CALayerOverlay* ca_layer_overlay) {
+ if (quad->filters_scale != gfx::Vector2dF(1, 1))
+ return CA_LAYER_FAILED_RENDER_PASS_FILTER_SCALE;
+ if (quad->background_filters.size() != 0)
+ return CA_LAYER_FAILED_RENDER_PASS_BACKGROUND_FILTERS;
+ if (quad->mask_resource_id() != 0)
+ return CA_LAYER_FAILED_RENDER_PASS_MASK;
+
+ for (const FilterOperation& operation : quad->filters.operations()) {
+ bool success = ConvertAndAppendFilterOperation(
+ operation, &ca_layer_overlay->filter_effects);
+ if (!success)
+ return CA_LAYER_FAILED_RENDER_PASS_FILTER_OPERATION;
+ }
+
+ ca_layer_overlay->render_pass_id = quad->render_pass_id;
+ ca_layer_overlay->contents_rect = gfx::RectF(0, 0, 1, 1);
+
+ // TODO(erikchen): Enable this when RenderPassDrawQuad promotion to CALayer
+ // is fully functional. https://crbug.com/581526.
+ if (g_allow_rpdq_quad_conversion)
+ return CA_LAYER_SUCCESS;
+ return CA_LAYER_FAILED_RENDER_PASS;
+}
+
CALayerResult FromStreamVideoQuad(ResourceProvider* resource_provider,
const StreamVideoDrawQuad* quad,
CALayerOverlay* ca_layer_overlay) {
@@ -175,7 +264,9 @@ class CALayerOverlayProcessor {
case DrawQuad::PICTURE_CONTENT:
return CA_LAYER_FAILED_PICTURE_CONTENT;
case DrawQuad::RENDER_PASS:
- return CA_LAYER_FAILED_RENDER_PASS;
+ return FromRenderPassQuad(resource_provider,
+ RenderPassDrawQuad::MaterialCast(quad),
+ ca_layer_overlay);
case DrawQuad::SURFACE_CONTENT:
return CA_LAYER_FAILED_SURFACE_CONTENT;
case DrawQuad::YUV_VIDEO_CONTENT:
@@ -251,4 +342,8 @@ bool ProcessForCALayerOverlays(ResourceProvider* resource_provider,
return true;
}
+void EnableRenderPassDrawQuadForTesting() {
+ g_allow_rpdq_quad_conversion = true;
+}
+
} // namespace cc
« no previous file with comments | « cc/output/ca_layer_overlay.h ('k') | cc/output/overlay_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698