Commit 3ee39998 authored by dcastagna's avatar dcastagna Committed by Commit bot

exo: Fullscreen overlay candidates support.

In order to be able to promote a buffer to full screen overlay on CrOS
the buffer needs to be in an RGB format and resource_size_in_pixels
has to be set on the quad.

This CL makes sure overlay candidates coming from exo satisfy those
two requirements.

BUG=b/29430506

Review-Url: https://codereview.chromium.org/2160113002
Cr-Commit-Position: refs/heads/master@{#406136}
parent ea7f6650
......@@ -90,7 +90,8 @@ std::unique_ptr<Buffer> Display::CreateLinuxDMABufBuffer(
// List of overlay formats that are known to be supported.
// TODO(reveman): Determine this at runtime.
const gfx::BufferFormat kOverlayFormats[] = {gfx::BufferFormat::BGRX_8888};
const gfx::BufferFormat kOverlayFormats[] = {gfx::BufferFormat::RGBA_8888,
gfx::BufferFormat::RGBX_8888};
bool is_overlay_candidate =
std::find(std::begin(kOverlayFormats), std::end(kOverlayFormats),
format) != std::end(kOverlayFormats);
......
......@@ -799,6 +799,8 @@ void Surface::UpdateSurface(bool full_damage) {
current_resource_.id, true, uv_top_left,
uv_bottom_right, SK_ColorTRANSPARENT, vertex_opacity,
false, false, state_.only_visible_on_secure_output);
if (current_resource_.is_overlay_candidate)
texture_quad->set_resource_size_in_pixels(current_resource_.size);
delegated_frame->resource_list.push_back(current_resource_);
} else {
cc::SolidColorDrawQuad* solid_quad =
......
......@@ -5,6 +5,7 @@
#include "base/bind.h"
#include "cc/output/compositor_frame.h"
#include "cc/output/delegated_frame_data.h"
#include "cc/quads/texture_draw_quad.h"
#include "cc/surfaces/surface.h"
#include "cc/surfaces/surface_manager.h"
#include "components/exo/buffer.h"
......@@ -214,6 +215,27 @@ TEST_F(SurfaceTest, SetBlendMode) {
->ShouldDrawWithBlending());
}
TEST_F(SurfaceTest, OverlayCandidate) {
gfx::Size buffer_size(1, 1);
std::unique_ptr<Buffer> buffer(new Buffer(
exo_test_helper()->CreateGpuMemoryBuffer(buffer_size), 0, 0, true, true));
std::unique_ptr<Surface> surface(new Surface);
surface->Attach(buffer.get());
surface->Commit();
const cc::DelegatedFrameData* frame_data = GetFrameFromSurface(surface.get());
ASSERT_EQ(1u, frame_data->render_pass_list.size());
ASSERT_EQ(1u, frame_data->render_pass_list.back()->quad_list.size());
cc::DrawQuad* draw_quad =
frame_data->render_pass_list.back()->quad_list.back();
ASSERT_EQ(cc::DrawQuad::TEXTURE_CONTENT, draw_quad->material);
const cc::TextureDrawQuad* texture_quad =
cc::TextureDrawQuad::MaterialCast(draw_quad);
EXPECT_FALSE(texture_quad->resource_size_in_pixels().IsEmpty());
}
TEST_F(SurfaceTest, SetAlpha) {
gfx::Size buffer_size(1, 1);
std::unique_ptr<Buffer> buffer(
......
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