Commit 7a297c38 authored by yiyix's avatar yiyix Committed by Commit Bot

Fix regression: 3D objects are not shown correctly

The current draw occlusion cannot handle 3d object yet. This patch allows
DrawOcclusion to skip draw quads from a 3D objects.

Bug: 833748
Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel
Change-Id: I08d12c794d4acff0e1f584f4c74857bc5df83fee
Reviewed-on: https://chromium-review.googlesource.com/1044781
Commit-Queue: Yi Xu <yiyix@chromium.org>
Reviewed-by: default avatardanakj <danakj@chromium.org>
Cr-Commit-Position: refs/heads/master@{#556323}
parent 9d6e676a
......@@ -633,10 +633,12 @@ void Display::RemoveOverdrawQuads(CompositorFrame* frame) {
// Skip quad if it is a RenderPassDrawQuad because RenderPassDrawQuad is a
// special type of DrawQuad where the visible_rect of shared quad state is
// not entirely covered by draw quads in it; or the DrawQuad size is
// smaller than the kMinimumDrawOcclusionSize.
// smaller than the kMinimumDrawOcclusionSize; or the DrawQuad is inside
// a 3d objects.
if (quad->material == ContentDrawQuadBase::Material::RENDER_PASS ||
(quad->visible_rect.width() <= minimum_draw_occlusion_width &&
quad->visible_rect.height() <= minimum_draw_occlusion_height)) {
quad->visible_rect.height() <= minimum_draw_occlusion_height) ||
quad->shared_quad_state->sorting_context_id != 0) {
++quad;
continue;
}
......
......@@ -2074,6 +2074,62 @@ TEST_F(DisplayTest, CompositorFrameWithOpaquenessChange) {
TearDownDisplay();
}
// Test if draw occlusion skips 3d objects. https://crbug.com/833748
TEST_F(DisplayTest, CompositorFrameZTranslate) {
RendererSettings settings;
settings.kMinimumDrawOcclusionSize.set_width(0);
SetUpDisplay(settings, TestWebGraphicsContext3D::Create());
StubDisplayClient client;
display_->Initialize(&client, manager_.surface_manager());
CompositorFrame frame = MakeDefaultCompositorFrame();
gfx::Rect rect1(0, 0, 100, 100);
gfx::Rect rect2(0, 0, 200, 100);
gfx::Transform translate_back;
translate_back.Translate3d(0, 0, 100);
bool is_clipped = false;
bool are_contents_opaque = true;
float opacity = 1.f;
SharedQuadState* shared_quad_state =
frame.render_pass_list.front()->CreateAndAppendSharedQuadState();
auto* quad = frame.render_pass_list.front()
->quad_list.AllocateAndConstruct<SolidColorDrawQuad>();
SharedQuadState* shared_quad_state2 =
frame.render_pass_list.front()->CreateAndAppendSharedQuadState();
auto* quad2 = frame.render_pass_list.front()
->quad_list.AllocateAndConstruct<SolidColorDrawQuad>();
// 2 rects inside of 3d object is completely overlapping.
// +-----+
// | |
// +-----+
{
shared_quad_state->SetAll(translate_back, rect1, rect1, rect1, is_clipped,
are_contents_opaque, opacity,
SkBlendMode::kSrcOver, 1);
shared_quad_state2->SetAll(gfx::Transform(), rect1, rect1, rect1,
is_clipped, are_contents_opaque, opacity,
SkBlendMode::kSrcOver, 1);
quad->SetNew(shared_quad_state, rect1, rect1, SK_ColorBLACK, false);
quad2->SetNew(shared_quad_state2, rect2, rect1, SK_ColorBLACK, false);
EXPECT_EQ(2u, frame.render_pass_list.front()->quad_list.size());
display_->RemoveOverdrawQuads(&frame);
// Since both |quad| and |quad2| are inside of a 3d object, DrawOcclusion
// will not be applied to them.
EXPECT_EQ(2u, frame.render_pass_list.front()->quad_list.size());
EXPECT_EQ(rect1.ToString(), frame.render_pass_list.front()
->quad_list.ElementAt(0)
->rect.ToString());
EXPECT_EQ(rect2.ToString(), frame.render_pass_list.front()
->quad_list.ElementAt(1)
->rect.ToString());
}
TearDownDisplay();
}
TEST_F(DisplayTest, CompositorFrameWithTranslateTransformer) {
RendererSettings settings;
settings.kMinimumDrawOcclusionSize.set_width(0);
......
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