Commit b3417f3e authored by Michael Ludwig's avatar Michael Ludwig Committed by Commit Bot

SkiaRenderer: Support all simple content quads when bypassing RenderPasses

This expands the DrawQuad materials that can be drawn directly in
place of a RenderPass to include video stream and YUV video quads
(since these are simple image draws), and unsupported quad types
(since they are mapped to solid color draws).

Bug: 1013735
Change-Id: I22c4c54253f9abf915b14fdfb1377fc9fecbc031
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1862660
Commit-Queue: Michael Ludwig <michaelludwig@google.com>
Reviewed-by: default avatarweiliangc <weiliangc@chromium.org>
Cr-Commit-Position: refs/heads/master@{#709534}
parent 6c7144e4
...@@ -961,12 +961,11 @@ void SkiaRenderer::DrawQuadInternal(const DrawQuad* quad, ...@@ -961,12 +961,11 @@ void SkiaRenderer::DrawQuadInternal(const DrawQuad* quad,
params); params);
break; break;
case DrawQuad::Material::kStreamVideoContent: case DrawQuad::Material::kStreamVideoContent:
// TODO(michaelludwig) - Support video quads bypassing a renderpass DrawStreamVideoQuad(StreamVideoDrawQuad::MaterialCast(quad), rpdq_params,
DCHECK(rpdq_params == nullptr); params);
DrawStreamVideoQuad(StreamVideoDrawQuad::MaterialCast(quad), params);
break; break;
case DrawQuad::Material::kTextureContent: case DrawQuad::Material::kTextureContent:
// TODO(michaelludwig) - Support video quads bypassing a renderpass // TODO(michaelludwig) - Support texture quads bypassing a renderpass
DCHECK(rpdq_params == nullptr); DCHECK(rpdq_params == nullptr);
DrawTextureQuad(TextureDrawQuad::MaterialCast(quad), params); DrawTextureQuad(TextureDrawQuad::MaterialCast(quad), params);
break; break;
...@@ -974,14 +973,11 @@ void SkiaRenderer::DrawQuadInternal(const DrawQuad* quad, ...@@ -974,14 +973,11 @@ void SkiaRenderer::DrawQuadInternal(const DrawQuad* quad,
DrawTileDrawQuad(TileDrawQuad::MaterialCast(quad), rpdq_params, params); DrawTileDrawQuad(TileDrawQuad::MaterialCast(quad), rpdq_params, params);
break; break;
case DrawQuad::Material::kYuvVideoContent: case DrawQuad::Material::kYuvVideoContent:
// TODO(michaelludwig) - Support yuv video quads bypassing a renderpass DrawYUVVideoQuad(YUVVideoDrawQuad::MaterialCast(quad), rpdq_params,
DCHECK(rpdq_params == nullptr); params);
DrawYUVVideoQuad(YUVVideoDrawQuad::MaterialCast(quad), params);
break; break;
case DrawQuad::Material::kInvalid: case DrawQuad::Material::kInvalid:
// TODO(michaelludwig) - Support unsupported quads bypassing a renderpass DrawUnsupportedQuad(quad, rpdq_params, params);
DCHECK(rpdq_params == nullptr);
DrawUnsupportedQuad(quad, params);
NOTREACHED(); NOTREACHED();
break; break;
case DrawQuad::Material::kVideoHole: case DrawQuad::Material::kVideoHole:
...@@ -991,14 +987,12 @@ void SkiaRenderer::DrawQuadInternal(const DrawQuad* quad, ...@@ -991,14 +987,12 @@ void SkiaRenderer::DrawQuadInternal(const DrawQuad* quad,
// Quad and the quad would then reach here unexpectedly. Therefore // Quad and the quad would then reach here unexpectedly. Therefore
// we should skip NOTREACHED() so an untrusted render is not capable // we should skip NOTREACHED() so an untrusted render is not capable
// of causing a crash. // of causing a crash.
DCHECK(rpdq_params == nullptr); DrawUnsupportedQuad(quad, rpdq_params, params);
DrawUnsupportedQuad(quad, params);
break; break;
default: default:
// If we've reached here, it's a new quad type that needs a // If we've reached here, it's a new quad type that needs a
// dedicated implementation // dedicated implementation
DCHECK(rpdq_params == nullptr); DrawUnsupportedQuad(quad, rpdq_params, params);
DrawUnsupportedQuad(quad, params);
NOTREACHED(); NOTREACHED();
break; break;
} }
...@@ -1274,11 +1268,8 @@ SkiaRenderer::DrawQuadParams SkiaRenderer::CalculateDrawQuadParams( ...@@ -1274,11 +1268,8 @@ SkiaRenderer::DrawQuadParams SkiaRenderer::CalculateDrawQuadParams(
} }
const DrawQuad* SkiaRenderer::CanPassBeDrawnDirectly(const RenderPass* pass) { const DrawQuad* SkiaRenderer::CanPassBeDrawnDirectly(const RenderPass* pass) {
// TODO(michaelludwig) - For now, this only supports opaque, src-over // TODO(michaelludwig) - For now, this only supports opaque, src-over quads
// TileDrawQuads and SolidColor quads with invertable transforms. // with invertible transforms and simple content (image or color only).
// It will be updated to select more quad material types as their
// corresponding DrawXQuad() functions are updated to accept DrawRPDQParams
// as well.
// Can only collapse a single tile quad. // Can only collapse a single tile quad.
if (pass->quad_list.size() != 1) if (pass->quad_list.size() != 1)
return nullptr; return nullptr;
...@@ -1288,10 +1279,11 @@ const DrawQuad* SkiaRenderer::CanPassBeDrawnDirectly(const RenderPass* pass) { ...@@ -1288,10 +1279,11 @@ const DrawQuad* SkiaRenderer::CanPassBeDrawnDirectly(const RenderPass* pass) {
return nullptr; return nullptr;
const DrawQuad* quad = *pass->quad_list.BackToFrontBegin(); const DrawQuad* quad = *pass->quad_list.BackToFrontBegin();
// TODO(michaelludwig) - The set of supported material types can be expanded // TODO(michaelludwig) - With additional caveats, kTexture can be drawn direct
// by passing the DrawRPDQParams to the other DrawXQuad() functions. if (quad->material == DrawQuad::Material::kRenderPass ||
if (quad->material != DrawQuad::Material::kTiledContent && quad->material == DrawQuad::Material::kDebugBorder ||
quad->material != DrawQuad::Material::kSolidColor) quad->material == DrawQuad::Material::kPictureContent ||
quad->material == DrawQuad::Material::kTextureContent)
return nullptr; return nullptr;
// In order to concatenate the bypass'ed quads transform with RP itself, it // In order to concatenate the bypass'ed quads transform with RP itself, it
...@@ -1696,8 +1688,9 @@ void SkiaRenderer::DrawSolidColorQuad(const SolidColorDrawQuad* quad, ...@@ -1696,8 +1688,9 @@ void SkiaRenderer::DrawSolidColorQuad(const SolidColorDrawQuad* quad,
} }
void SkiaRenderer::DrawStreamVideoQuad(const StreamVideoDrawQuad* quad, void SkiaRenderer::DrawStreamVideoQuad(const StreamVideoDrawQuad* quad,
const DrawRPDQParams* rpdq_params,
DrawQuadParams* params) { DrawQuadParams* params) {
DCHECK(!MustFlushBatchedQuads(quad, nullptr, *params)); DCHECK(!MustFlushBatchedQuads(quad, rpdq_params, *params));
ScopedSkImageBuilder builder(this, quad->resource_id(), ScopedSkImageBuilder builder(this, quad->resource_id(),
kUnpremul_SkAlphaType); kUnpremul_SkAlphaType);
...@@ -1718,7 +1711,12 @@ void SkiaRenderer::DrawStreamVideoQuad(const StreamVideoDrawQuad* quad, ...@@ -1718,7 +1711,12 @@ void SkiaRenderer::DrawStreamVideoQuad(const StreamVideoDrawQuad* quad,
? gfx::RectF(image->width(), image->height()) ? gfx::RectF(image->width(), image->height())
: gfx::RectF(gfx::SizeF(quad->resource_size_in_pixels())); : gfx::RectF(gfx::SizeF(quad->resource_size_in_pixels()));
AddQuadToBatch(image, valid_texel_bounds, params); if (rpdq_params) {
SkPaint paint = params->paint();
DrawSingleImage(image, valid_texel_bounds, rpdq_params, &paint, params);
} else {
AddQuadToBatch(image, valid_texel_bounds, params);
}
} }
void SkiaRenderer::DrawTextureQuad(const TextureDrawQuad* quad, void SkiaRenderer::DrawTextureQuad(const TextureDrawQuad* quad,
...@@ -1874,6 +1872,7 @@ void SkiaRenderer::DrawTileDrawQuad(const TileDrawQuad* quad, ...@@ -1874,6 +1872,7 @@ void SkiaRenderer::DrawTileDrawQuad(const TileDrawQuad* quad,
} }
void SkiaRenderer::DrawYUVVideoQuad(const YUVVideoDrawQuad* quad, void SkiaRenderer::DrawYUVVideoQuad(const YUVVideoDrawQuad* quad,
const DrawRPDQParams* rpdq_params,
DrawQuadParams* params) { DrawQuadParams* params) {
// Since YUV quads always use a color filter, they require a complex skPaint // Since YUV quads always use a color filter, they require a complex skPaint
// that precludes batching. If this changes, we could add YUV quads that don't // that precludes batching. If this changes, we could add YUV quads that don't
...@@ -1911,15 +1910,16 @@ void SkiaRenderer::DrawYUVVideoQuad(const YUVVideoDrawQuad* quad, ...@@ -1911,15 +1910,16 @@ void SkiaRenderer::DrawYUVVideoQuad(const YUVVideoDrawQuad* quad,
// Use provided, unclipped texture coordinates as the content area, which will // Use provided, unclipped texture coordinates as the content area, which will
// force coord clamping unless the geometry was clipped, or they span the // force coord clamping unless the geometry was clipped, or they span the
// entire YUV image. // entire YUV image.
DrawSingleImage(image, quad->ya_tex_coord_rect, nullptr, &paint, params); DrawSingleImage(image, quad->ya_tex_coord_rect, rpdq_params, &paint, params);
} }
void SkiaRenderer::DrawUnsupportedQuad(const DrawQuad* quad, void SkiaRenderer::DrawUnsupportedQuad(const DrawQuad* quad,
const DrawRPDQParams* rpdq_params,
DrawQuadParams* params) { DrawQuadParams* params) {
#ifdef NDEBUG #ifdef NDEBUG
DrawColoredQuad(SK_ColorWHITE, nullptr, params); DrawColoredQuad(SK_ColorWHITE, rpdq_params, params);
#else #else
DrawColoredQuad(SK_ColorMAGENTA, nullptr, params); DrawColoredQuad(SK_ColorMAGENTA, rpdq_params, params);
#endif #endif
} }
......
...@@ -191,13 +191,19 @@ class VIZ_SERVICE_EXPORT SkiaRenderer : public DirectRenderer { ...@@ -191,13 +191,19 @@ class VIZ_SERVICE_EXPORT SkiaRenderer : public DirectRenderer {
DrawQuadParams* params); DrawQuadParams* params);
void DrawStreamVideoQuad(const StreamVideoDrawQuad* quad, void DrawStreamVideoQuad(const StreamVideoDrawQuad* quad,
const DrawRPDQParams* rpdq_params,
DrawQuadParams* params); DrawQuadParams* params);
void DrawTextureQuad(const TextureDrawQuad* quad, DrawQuadParams* params); void DrawTextureQuad(const TextureDrawQuad* quad, DrawQuadParams* params);
void DrawTileDrawQuad(const TileDrawQuad* quad, void DrawTileDrawQuad(const TileDrawQuad* quad,
const DrawRPDQParams* rpdq_params, const DrawRPDQParams* rpdq_params,
DrawQuadParams* params); DrawQuadParams* params);
void DrawYUVVideoQuad(const YUVVideoDrawQuad* quad, DrawQuadParams* params); void DrawYUVVideoQuad(const YUVVideoDrawQuad* quad,
void DrawUnsupportedQuad(const DrawQuad* quad, DrawQuadParams* params); const DrawRPDQParams* rpdq_params,
DrawQuadParams* params);
void DrawUnsupportedQuad(const DrawQuad* quad,
const DrawRPDQParams* rpdq_params,
DrawQuadParams* params);
// Schedule overlay candidates for presentation at next SwapBuffers(). // Schedule overlay candidates for presentation at next SwapBuffers().
void ScheduleDCLayers(); void ScheduleDCLayers();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment