summaryrefslogtreecommitdiff
path: root/chromium/ui/ozone/platform/scenic
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ui/ozone/platform/scenic')
-rw-r--r--chromium/ui/ozone/platform/scenic/BUILD.gn2
-rw-r--r--chromium/ui/ozone/platform/scenic/ozone_platform_scenic.cc10
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_surface.cc17
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_surface.h6
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_surface_factory.cc7
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_window.cc26
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_window.h4
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_window_manager.cc4
-rw-r--r--chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.cc58
-rw-r--r--chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.h15
-rw-r--r--chromium/ui/ozone/platform/scenic/sysmem_buffer_manager.cc8
-rw-r--r--chromium/ui/ozone/platform/scenic/sysmem_buffer_manager.h5
-rw-r--r--chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc14
-rw-r--r--chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.h4
14 files changed, 99 insertions, 81 deletions
diff --git a/chromium/ui/ozone/platform/scenic/BUILD.gn b/chromium/ui/ozone/platform/scenic/BUILD.gn
index ed6dd8a0f29..32792aaf31a 100644
--- a/chromium/ui/ozone/platform/scenic/BUILD.gn
+++ b/chromium/ui/ozone/platform/scenic/BUILD.gn
@@ -55,6 +55,8 @@ source_set("scenic") {
"//third_party/fuchsia-sdk/sdk/pkg/scenic_cpp",
"//third_party/fuchsia-sdk/sdk/pkg/sys_cpp",
"//ui/base",
+ "//ui/base/cursor",
+ "//ui/base/cursor:cursor_base",
"//ui/base/ime/fuchsia",
"//ui/display/fake",
"//ui/events:dom_keycode_converter",
diff --git a/chromium/ui/ozone/platform/scenic/ozone_platform_scenic.cc b/chromium/ui/ozone/platform/scenic/ozone_platform_scenic.cc
index c9f0f74031d..fcd5d1ccf32 100644
--- a/chromium/ui/ozone/platform/scenic/ozone_platform_scenic.cc
+++ b/chromium/ui/ozone/platform/scenic/ozone_platform_scenic.cc
@@ -15,6 +15,7 @@
#include "base/message_loop/message_pump_type.h"
#include "base/notreached.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "ui/base/cursor/cursor_factory.h"
#include "ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h"
#include "ui/base/ime/fuchsia/input_method_fuchsia.h"
#include "ui/display/fake/fake_display_delegate.h"
@@ -30,7 +31,6 @@
#include "ui/ozone/platform/scenic/scenic_window_manager.h"
#include "ui/ozone/platform/scenic/sysmem_buffer_collection.h"
#include "ui/ozone/platform_selection.h"
-#include "ui/ozone/public/cursor_factory_ozone.h"
#include "ui/ozone/public/gpu_platform_support_host.h"
#include "ui/ozone/public/input_controller.h"
#include "ui/ozone/public/mojom/scenic_gpu_service.mojom.h"
@@ -77,9 +77,7 @@ class OzonePlatformScenic
return overlay_manager_.get();
}
- CursorFactoryOzone* GetCursorFactoryOzone() override {
- return cursor_factory_ozone_.get();
- }
+ CursorFactory* GetCursorFactory() override { return cursor_factory_.get(); }
InputController* GetInputController() override {
return input_controller_.get();
@@ -137,7 +135,7 @@ class OzonePlatformScenic
window_manager_ = std::make_unique<ScenicWindowManager>();
overlay_manager_ = std::make_unique<StubOverlayManager>();
input_controller_ = CreateStubInputController();
- cursor_factory_ozone_ = std::make_unique<BitmapCursorFactoryOzone>();
+ cursor_factory_ = std::make_unique<BitmapCursorFactoryOzone>();
scenic_gpu_host_ = std::make_unique<ScenicGpuHost>(window_manager_.get());
@@ -208,7 +206,7 @@ class OzonePlatformScenic
std::unique_ptr<KeyboardLayoutEngine> keyboard_layout_engine_;
std::unique_ptr<PlatformEventSource> platform_event_source_;
- std::unique_ptr<CursorFactoryOzone> cursor_factory_ozone_;
+ std::unique_ptr<CursorFactory> cursor_factory_;
std::unique_ptr<InputController> input_controller_;
std::unique_ptr<OverlayManagerOzone> overlay_manager_;
std::unique_ptr<ScenicGpuHost> scenic_gpu_host_;
diff --git a/chromium/ui/ozone/platform/scenic/scenic_surface.cc b/chromium/ui/ozone/platform/scenic/scenic_surface.cc
index 2d75a091190..dc7fd2ec10f 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_surface.cc
+++ b/chromium/ui/ozone/platform/scenic/scenic_surface.cc
@@ -19,11 +19,13 @@ ScenicSurface::ScenicSurface(
scenic::SessionPtrAndListenerRequest sesion_and_listener_request)
: scenic_session_(std::move(sesion_and_listener_request)),
shape_(&scenic_session_),
- material_(&scenic_session_),
scenic_surface_factory_(scenic_surface_factory),
window_(window) {
+ // Setting alpha to 0 makes this transparent.
+ scenic::Material transparent_material(&scenic_session_);
+ transparent_material.SetColor(0, 0, 0, 0);
shape_.SetShape(scenic::Rectangle(&scenic_session_, 1.f, 1.f));
- shape_.SetMaterial(material_);
+ shape_.SetMaterial(transparent_material);
scenic_surface_factory->AddSurface(window, this);
scenic_session_.SetDebugName("Chromium ScenicSurface");
}
@@ -33,23 +35,28 @@ ScenicSurface::~ScenicSurface() {
scenic_surface_factory_->RemoveSurface(window_);
}
-void ScenicSurface::SetTextureToNewImagePipe(
+bool ScenicSurface::SetTextureToNewImagePipe(
fidl::InterfaceRequest<fuchsia::images::ImagePipe2> image_pipe_request) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
uint32_t image_pipe_id = scenic_session_.AllocResourceId();
scenic_session_.Enqueue(scenic::NewCreateImagePipe2Cmd(
image_pipe_id, std::move(image_pipe_request)));
- material_.SetTexture(image_pipe_id);
+ scenic::Material image_material(&scenic_session_);
+ image_material.SetTexture(image_pipe_id);
+ shape_.SetMaterial(image_material);
scenic_session_.ReleaseResource(image_pipe_id);
scenic_session_.Present2(
/*requested_presentation_time=*/0,
/*requested_prediction_span=*/0,
[](fuchsia::scenic::scheduling::FuturePresentationTimes info) {});
+ return true;
}
void ScenicSurface::SetTextureToImage(const scenic::Image& image) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
- material_.SetTexture(image);
+ scenic::Material image_material(&scenic_session_);
+ image_material.SetTexture(image);
+ shape_.SetMaterial(image_material);
}
mojo::PlatformHandle ScenicSurface::CreateView() {
diff --git a/chromium/ui/ozone/platform/scenic/scenic_surface.h b/chromium/ui/ozone/platform/scenic/scenic_surface.h
index d9b730ae611..3264a594fc0 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_surface.h
+++ b/chromium/ui/ozone/platform/scenic/scenic_surface.h
@@ -35,8 +35,9 @@ class ScenicSurface : public ui::PlatformWindowSurface {
~ScenicSurface() override;
// Sets the texture of the surface to a new image pipe.
- void SetTextureToNewImagePipe(
- fidl::InterfaceRequest<fuchsia::images::ImagePipe2> image_pipe_request);
+ bool SetTextureToNewImagePipe(
+ fidl::InterfaceRequest<fuchsia::images::ImagePipe2> image_pipe_request)
+ override;
// Sets the texture of the surface to an image resource.
void SetTextureToImage(const scenic::Image& image);
@@ -58,7 +59,6 @@ class ScenicSurface : public ui::PlatformWindowSurface {
scenic::Session scenic_session_;
std::unique_ptr<scenic::View> parent_;
scenic::ShapeNode shape_;
- scenic::Material material_;
ScenicSurfaceFactory* const scenic_surface_factory_;
const gfx::AcceleratedWidget window_;
diff --git a/chromium/ui/ozone/platform/scenic/scenic_surface_factory.cc b/chromium/ui/ozone/platform/scenic/scenic_surface_factory.cc
index 7280c5e154f..7719bac9d88 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_surface_factory.cc
+++ b/chromium/ui/ozone/platform/scenic/scenic_surface_factory.cc
@@ -9,8 +9,8 @@
#include <memory>
#include "base/bind.h"
-#include "base/fuchsia/default_context.h"
#include "base/fuchsia/fuchsia_logging.h"
+#include "base/fuchsia/process_context.h"
#include "base/macros.h"
#include "base/memory/ptr_util.h"
#include "third_party/angle/src/common/fuchsia_egl/fuchsia_egl.h"
@@ -43,7 +43,7 @@ struct FuchsiaEGLWindowDeleter {
fuchsia::ui::scenic::ScenicPtr ConnectToScenic() {
fuchsia::ui::scenic::ScenicPtr scenic =
- base::fuchsia::ComponentContextForCurrentProcess()
+ base::ComponentContextForProcess()
->svc()
->Connect<fuchsia::ui::scenic::Scenic>();
scenic.set_error_handler([](zx_status_t status) {
@@ -130,8 +130,7 @@ class GLOzoneEGLScenic : public GLOzoneEGL {
fuchsia::sysmem::AllocatorHandle ConnectSysmemAllocator() {
fuchsia::sysmem::AllocatorHandle allocator;
- base::fuchsia::ComponentContextForCurrentProcess()->svc()->Connect(
- allocator.NewRequest());
+ base::ComponentContextForProcess()->svc()->Connect(allocator.NewRequest());
return allocator;
}
diff --git a/chromium/ui/ozone/platform/scenic/scenic_window.cc b/chromium/ui/ozone/platform/scenic/scenic_window.cc
index 0de00de69aa..81cafe89676 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_window.cc
+++ b/chromium/ui/ozone/platform/scenic/scenic_window.cc
@@ -37,8 +37,7 @@ ScenicWindow::ScenicWindow(ScenicWindowManager* window_manager,
"chromium window"),
node_(&scenic_session_),
input_node_(&scenic_session_),
- render_node_(&scenic_session_),
- background_node_(&scenic_session_) {
+ render_node_(&scenic_session_) {
scenic_session_.set_error_handler(
fit::bind_member(this, &ScenicWindow::OnScenicError));
scenic_session_.set_event_handler(
@@ -52,28 +51,8 @@ ScenicWindow::ScenicWindow(ScenicWindowManager* window_manager,
// Add input shape.
node_.AddChild(input_node_);
- // Add rendering subtree, rooted at Z=-2 to make room for background layers in
- // the Z-order (lesser values are higher in the visual ordering).
- constexpr float kRenderNodeZPosition = -2.;
- constexpr float kBackgroundNodeZPosition = kRenderNodeZPosition + 1.;
- render_node_.SetTranslation(0., 0., kRenderNodeZPosition);
node_.AddChild(render_node_);
- // Initialize a black background to be just behind |render_node_|.
- scenic::Material background_color(&scenic_session_);
- background_color.SetColor(0, 0, 0, 255); // RGBA (0,0,0,255) = opaque black.
- background_node_.SetMaterial(background_color);
- scenic::Rectangle background_shape(&scenic_session_, 1., 1.);
- background_node_.SetShape(background_shape);
- background_node_.SetTranslation(0., 0., kBackgroundNodeZPosition);
- node_.AddChild(background_node_);
-
- // Render the background immediately.
- scenic_session_.Present2(
- /*requested_presentation_time=*/0,
- /*requested_prediction_span=*/0,
- [](fuchsia::scenic::scheduling::FuturePresentationTimes info) {});
-
delegate_->OnAcceleratedWidgetAvailable(window_id_);
}
@@ -247,9 +226,6 @@ void ScenicWindow::UpdateSize() {
size_dips_.height());
input_node_.SetShape(window_rect);
- // Resize the input and background nodes to cover the whole surface.
- background_node_.SetShape(window_rect);
-
// This is necessary when using vulkan because ImagePipes are presented
// separately and we need to make sure our sizes change is committed.
scenic_session_.Present2(
diff --git a/chromium/ui/ozone/platform/scenic/scenic_window.h b/chromium/ui/ozone/platform/scenic/scenic_window.h
index d70d88b218f..2edac2d4e7e 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_window.h
+++ b/chromium/ui/ozone/platform/scenic/scenic_window.h
@@ -119,10 +119,6 @@ class COMPONENT_EXPORT(OZONE) ScenicWindow
// Node in |scenic_session_| for rendering (hit testing disabled).
scenic::EntityNode render_node_;
- // Node in |scenic_session_| for rendering a solid color, placed just behind
- // |render_node_| in the Z order.
- scenic::ShapeNode background_node_;
-
std::unique_ptr<scenic::ViewHolder> surface_view_holder_;
// The ratio used for translating device-independent coordinates to absolute
diff --git a/chromium/ui/ozone/platform/scenic/scenic_window_manager.cc b/chromium/ui/ozone/platform/scenic/scenic_window_manager.cc
index b8a8c539251..6a0a177b10d 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_window_manager.cc
+++ b/chromium/ui/ozone/platform/scenic/scenic_window_manager.cc
@@ -7,8 +7,8 @@
#include <lib/sys/cpp/component_context.h>
#include <memory>
-#include "base/fuchsia/default_context.h"
#include "base/fuchsia/fuchsia_logging.h"
+#include "base/fuchsia/process_context.h"
#include "ui/ozone/platform/scenic/ozone_platform_scenic.h"
namespace ui {
@@ -33,7 +33,7 @@ std::unique_ptr<PlatformScreen> ScenicWindowManager::CreateScreen() {
fuchsia::ui::scenic::Scenic* ScenicWindowManager::GetScenic() {
if (!scenic_) {
- scenic_ = base::fuchsia::ComponentContextForCurrentProcess()
+ scenic_ = base::ComponentContextForProcess()
->svc()
->Connect<fuchsia::ui::scenic::Scenic>();
scenic_.set_error_handler(
diff --git a/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.cc b/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.cc
index a1a51db49d0..d320987b58e 100644
--- a/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.cc
+++ b/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.cc
@@ -116,7 +116,8 @@ bool SysmemBufferCollection::IsNativePixmapConfigSupported(
format == gfx::BufferFormat::BGRX_8888;
bool usage_supported = usage == gfx::BufferUsage::SCANOUT ||
usage == gfx::BufferUsage::SCANOUT_CPU_READ_WRITE ||
- usage == gfx::BufferUsage::GPU_READ_CPU_READ_WRITE;
+ usage == gfx::BufferUsage::GPU_READ_CPU_READ_WRITE ||
+ usage == gfx::BufferUsage::GPU_READ;
return format_supported && usage_supported;
}
@@ -142,7 +143,7 @@ bool SysmemBufferCollection::Initialize(
if (vk_device == VK_NULL_HANDLE)
return false;
- size_ = size;
+ min_size_ = size;
format_ = format;
usage_ = usage;
vk_device_ = vk_device;
@@ -163,15 +164,24 @@ bool SysmemBufferCollection::Initialize(
bool SysmemBufferCollection::Initialize(
fuchsia::sysmem::Allocator_Sync* allocator,
VkDevice vk_device,
- zx::channel token_handle) {
+ zx::channel token_handle,
+ gfx::BufferFormat format,
+ gfx::BufferUsage usage,
+ bool force_protected) {
DCHECK(!collection_);
DCHECK(!vk_buffer_collection_);
- usage_ = gfx::BufferUsage::GPU_READ;
- vk_device_ = vk_device;
+ // Set nominal size of 1x1, which will be used only for
+ // vkSetBufferCollectionConstraintsFUCHSIA(). The actual size of the allocated
+ // buffers is determined by constraints set by other sysmem clients for the
+ // same collection. Size of the Vulkan image is determined by the valus passed
+ // to CreateVkImage().
+ min_size_ = gfx::Size(1, 1);
- // Assume that all imported collections are in NV12 format.
- format_ = gfx::BufferFormat::YUV_420_BIPLANAR;
+ vk_device_ = vk_device;
+ format_ = format;
+ usage_ = usage;
+ is_protected_ = force_protected;
fuchsia::sysmem::BufferCollectionTokenSyncPtr token;
token.Bind(std::move(token_handle));
@@ -206,18 +216,12 @@ scoped_refptr<gfx::NativePixmap> SysmemBufferCollection::CreateNativePixmap(
buffers_info_.settings.image_format_constraints;
// The logic should match LogicalBufferCollection::Allocate().
- size_t width =
- RoundUp(std::max(format.min_coded_width, format.required_max_coded_width),
- format.coded_width_divisor);
- size_t stride =
- RoundUp(std::max(static_cast<size_t>(format.min_bytes_per_row),
- gfx::RowSizeForBufferFormat(width, format_, 0)),
- format.bytes_per_row_divisor);
- size_t height = RoundUp(
- std::max(format.min_coded_height, format.required_max_coded_height),
- format.coded_height_divisor);
+ size_t stride = RoundUp(
+ std::max(static_cast<size_t>(format.min_bytes_per_row),
+ gfx::RowSizeForBufferFormat(image_size_.width(), format_, 0)),
+ format.bytes_per_row_divisor);
size_t plane_offset = buffers_info_.buffers[buffer_index].vmo_usable_start;
- size_t plane_size = stride * height;
+ size_t plane_size = stride * image_size_.height();
handle.planes.emplace_back(stride, plane_offset, plane_size,
std::move(main_plane_vmo));
@@ -421,7 +425,7 @@ bool SysmemBufferCollection::InitializeInternal(
ignore_result(token_channel.release());
VkImageCreateInfo image_create_info;
- InitializeImageCreateInfo(&image_create_info, size_);
+ InitializeImageCreateInfo(&image_create_info, min_size_);
if (vkSetBufferCollectionConstraintsFUCHSIA(vk_device_, vk_buffer_collection_,
&image_create_info) !=
@@ -446,6 +450,16 @@ bool SysmemBufferCollection::InitializeInternal(
DCHECK_GE(buffers_info_.buffer_count, buffers_for_camping);
DCHECK(buffers_info_.settings.has_image_format_constraints);
+ // The logic should match LogicalBufferCollection::Allocate().
+ const fuchsia::sysmem::ImageFormatConstraints& format =
+ buffers_info_.settings.image_format_constraints;
+ size_t width =
+ RoundUp(std::max(format.min_coded_width, format.required_max_coded_width),
+ format.coded_width_divisor);
+ size_t height = RoundUp(
+ std::max(format.min_coded_height, format.required_max_coded_height),
+ format.coded_height_divisor);
+ image_size_ = gfx::Size(width, height);
buffer_size_ = buffers_info_.settings.buffer_settings.size_bytes;
is_protected_ = buffers_info_.settings.buffer_settings.is_secure;
@@ -469,7 +483,13 @@ void SysmemBufferCollection::InitializeImageCreateInfo(
vk_image_info->samples = VK_SAMPLE_COUNT_1_BIT;
vk_image_info->tiling =
is_mappable() ? VK_IMAGE_TILING_LINEAR : VK_IMAGE_TILING_OPTIMAL;
+
vk_image_info->usage = VK_IMAGE_USAGE_SAMPLED_BIT;
+ if (usage_ == gfx::BufferUsage::SCANOUT ||
+ usage_ == gfx::BufferUsage::SCANOUT_CPU_READ_WRITE) {
+ vk_image_info->usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
+ }
+
vk_image_info->sharingMode = VK_SHARING_MODE_EXCLUSIVE;
vk_image_info->initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
}
diff --git a/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.h b/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.h
index 1bfed23b840..34628685327 100644
--- a/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.h
+++ b/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.h
@@ -48,7 +48,10 @@ class SysmemBufferCollection
bool Initialize(fuchsia::sysmem::Allocator_Sync* allocator,
VkDevice vk_device,
- zx::channel token);
+ zx::channel token,
+ gfx::BufferFormat format,
+ gfx::BufferUsage usage,
+ bool force_protected);
// Must not be called more than once.
void SetOnDeletedCallback(base::OnceClosure on_deleted);
@@ -70,7 +73,7 @@ class SysmemBufferCollection
gfx::SysmemBufferCollectionId id() const { return id_; }
size_t num_buffers() const { return buffers_info_.buffer_count; }
- gfx::Size size() const { return size_; }
+ gfx::Size size() const { return image_size_; }
gfx::BufferFormat format() const { return format_; }
size_t buffer_size() const {
return buffers_info_.settings.buffer_settings.size_bytes;
@@ -96,10 +99,11 @@ class SysmemBufferCollection
const gfx::SysmemBufferCollectionId id_;
- gfx::Size size_;
+ // Image size passed to vkSetBufferCollectionConstraintsFUCHSIA(). The actual
+ // buffers size may be larger depending on constraints set by other
+ // sysmem clients. Size of the image is passed to CreateVkImage().
+ gfx::Size min_size_;
- // Valid only for owned buffer collections, i.e. those that that were
- // initialized using the first Initialize() methods.
gfx::BufferFormat format_ = gfx::BufferFormat::RGBA_8888;
gfx::BufferUsage usage_ = gfx::BufferUsage::GPU_READ_CPU_READ_WRITE;
@@ -118,6 +122,7 @@ class SysmemBufferCollection
// threads.
THREAD_CHECKER(vulkan_thread_checker_);
+ gfx::Size image_size_;
size_t buffer_size_ = 0;
bool is_protected_ = false;
diff --git a/chromium/ui/ozone/platform/scenic/sysmem_buffer_manager.cc b/chromium/ui/ozone/platform/scenic/sysmem_buffer_manager.cc
index 2d0a2d5869a..b1bdfb23b55 100644
--- a/chromium/ui/ozone/platform/scenic/sysmem_buffer_manager.cc
+++ b/chromium/ui/ozone/platform/scenic/sysmem_buffer_manager.cc
@@ -51,9 +51,13 @@ scoped_refptr<SysmemBufferCollection>
SysmemBufferManager::ImportSysmemBufferCollection(
VkDevice vk_device,
gfx::SysmemBufferCollectionId id,
- zx::channel token) {
+ zx::channel token,
+ gfx::BufferFormat format,
+ gfx::BufferUsage usage,
+ bool force_protected) {
auto result = base::MakeRefCounted<SysmemBufferCollection>(id);
- if (!result->Initialize(allocator_.get(), vk_device, std::move(token))) {
+ if (!result->Initialize(allocator_.get(), vk_device, std::move(token), format,
+ usage, force_protected)) {
return nullptr;
}
RegisterCollection(result.get());
diff --git a/chromium/ui/ozone/platform/scenic/sysmem_buffer_manager.h b/chromium/ui/ozone/platform/scenic/sysmem_buffer_manager.h
index b726855beb2..9bc6fe9bd35 100644
--- a/chromium/ui/ozone/platform/scenic/sysmem_buffer_manager.h
+++ b/chromium/ui/ozone/platform/scenic/sysmem_buffer_manager.h
@@ -46,7 +46,10 @@ class SysmemBufferManager {
scoped_refptr<SysmemBufferCollection> ImportSysmemBufferCollection(
VkDevice vk_device,
gfx::SysmemBufferCollectionId id,
- zx::channel token);
+ zx::channel token,
+ gfx::BufferFormat format,
+ gfx::BufferUsage usage,
+ bool force_protected);
scoped_refptr<SysmemBufferCollection> GetCollectionById(
gfx::SysmemBufferCollectionId id);
diff --git a/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc b/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc
index ce74e4b9cf8..9152a959c73 100644
--- a/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc
+++ b/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc
@@ -269,7 +269,7 @@ VulkanImplementationScenic::CreateImageFromGpuMemoryHandle(
auto image = gpu::VulkanImage::Create(
device_queue, vk_image, vk_device_memory, size, vk_image_info.format,
vk_image_info.tiling, vk_device_size, 0 /* memory_type_index */,
- ycbcr_info);
+ ycbcr_info, vk_image_info.flags);
if (image->format() != vk_format) {
DLOG(ERROR) << "Unexpected format " << vk_format << " vs "
@@ -298,10 +298,16 @@ std::unique_ptr<gpu::SysmemBufferCollection>
VulkanImplementationScenic::RegisterSysmemBufferCollection(
VkDevice device,
gfx::SysmemBufferCollectionId id,
- zx::channel token) {
+ zx::channel token,
+ gfx::BufferFormat format,
+ gfx::BufferUsage usage) {
+ // SCANOUT images must be protected in protected mode.
+ bool force_protected =
+ usage == gfx::BufferUsage::SCANOUT && enforce_protected_memory();
+
return std::make_unique<SysmemBufferCollectionImpl>(
- sysmem_buffer_manager_->ImportSysmemBufferCollection(device, id,
- std::move(token)));
+ sysmem_buffer_manager_->ImportSysmemBufferCollection(
+ device, id, std::move(token), format, usage, force_protected));
}
} // namespace ui
diff --git a/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.h b/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.h
index 6b1a1afa1f1..cbc7e0d111b 100644
--- a/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.h
+++ b/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.h
@@ -56,7 +56,9 @@ class VulkanImplementationScenic : public gpu::VulkanImplementation {
std::unique_ptr<gpu::SysmemBufferCollection> RegisterSysmemBufferCollection(
VkDevice device,
gfx::SysmemBufferCollectionId id,
- zx::channel token) override;
+ zx::channel token,
+ gfx::BufferFormat format,
+ gfx::BufferUsage usage) override;
private:
ScenicSurfaceFactory* const scenic_surface_factory_;