Commit f34aba1c authored by Emircan Uysaler's avatar Emircan Uysaler Committed by Commit Bot

Move to ImagePipe2 usage in vulkan swapchain

This CL aligns Chrome code with Fuchsia's updated vulkan swapchain
extension that now requires ImagePipe2 interface.

This should land along with
https://fuchsia-review.googlesource.com/c/fuchsia/+/315288.

Bug: 982922
Change-Id: Icbe0fc4d947c5ba52e769136e1f2a7b9605d8f54
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1789851Reviewed-by: default avatarPeng Huang <penghuang@chromium.org>
Reviewed-by: default avatarMichael Spang <spang@chromium.org>
Reviewed-by: default avatarSergey Ulanov <sergeyu@chromium.org>
Commit-Queue: Emircan Uysaler <emircan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#696142}
parent 00f9b6a3
......@@ -129,7 +129,6 @@ bool VulkanInstance::Initialize(
#endif
std::vector<const char*> enabled_layer_names = required_layers;
#if DCHECK_IS_ON()
uint32_t num_instance_layers = 0;
result = vkEnumerateInstanceLayerProperties(&num_instance_layers, nullptr);
if (VK_SUCCESS != result) {
......@@ -138,14 +137,15 @@ bool VulkanInstance::Initialize(
return false;
}
std::vector<VkLayerProperties> instance_layers(num_instance_layers);
layer_properties_.resize(num_instance_layers);
result = vkEnumerateInstanceLayerProperties(&num_instance_layers,
instance_layers.data());
layer_properties_.data());
if (VK_SUCCESS != result) {
DLOG(ERROR) << "vkEnumerateInstanceLayerProperties() failed: " << result;
return false;
}
#if DCHECK_IS_ON()
// TODO(crbug.com/843346): Make validation work in combination with
// VK_KHR_xlib_surface or switch to VK_KHR_xcb_surface.
constexpr base::StringPiece xlib_surface_extension_name(
......@@ -160,7 +160,7 @@ bool VulkanInstance::Initialize(
// VK_KHR_xlib_surface.
constexpr base::StringPiece standard_validation(
"VK_LAYER_LUNARG_standard_validation");
for (const VkLayerProperties& layer_property : instance_layers) {
for (const VkLayerProperties& layer_property : layer_properties_) {
if (standard_validation != layer_property.layerName)
continue;
if (!require_xlib_surface_extension ||
......
......@@ -36,6 +36,10 @@ class VULKAN_EXPORT VulkanInstance {
return enabled_extensions_;
}
const std::vector<VkLayerProperties>& layer_properties() const {
return layer_properties_;
}
VkInstance vk_instance() { return vk_instance_; }
private:
......@@ -44,6 +48,7 @@ class VULKAN_EXPORT VulkanInstance {
uint32_t api_version_;
VkInstance vk_instance_ = VK_NULL_HANDLE;
std::vector<VkLayerProperties> layer_properties_;
gfx::ExtensionSet enabled_extensions_;
bool debug_report_enabled_ = false;
#if DCHECK_IS_ON()
......
......@@ -34,7 +34,7 @@ ScenicSurface::~ScenicSurface() {
scenic_surface_factory_->RemoveSurface(window_);
}
void ScenicSurface::SetTextureToNewImagePipe(
void ScenicSurface::SetTextureToNewImagePipe1(
fidl::InterfaceRequest<fuchsia::images::ImagePipe> image_pipe_request) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
uint32_t image_pipe_id = scenic_session_.AllocResourceId();
......@@ -46,6 +46,18 @@ void ScenicSurface::SetTextureToNewImagePipe(
/*presentation_time=*/0, [](fuchsia::images::PresentationInfo info) {});
}
void 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_session_.ReleaseResource(image_pipe_id);
scenic_session_.Present(
/*presentation_time=*/0, [](fuchsia::images::PresentationInfo info) {});
}
void ScenicSurface::SetTextureToImage(const scenic::Image& image) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
material_.SetTexture(image);
......
......@@ -35,8 +35,10 @@ class ScenicSurface : public ui::PlatformWindowSurface {
~ScenicSurface() override;
// Sets the texture of the surface to a new image pipe.
void SetTextureToNewImagePipe(
void SetTextureToNewImagePipe1(
fidl::InterfaceRequest<fuchsia::images::ImagePipe> image_pipe_request);
void SetTextureToNewImagePipe(
fidl::InterfaceRequest<fuchsia::images::ImagePipe2> image_pipe_request);
// Sets the texture of the surface to an image resource.
void SetTextureToImage(const scenic::Image& image);
......
......@@ -75,17 +75,38 @@ gpu::VulkanInstance* VulkanImplementationScenic::GetVulkanInstance() {
std::unique_ptr<gpu::VulkanSurface>
VulkanImplementationScenic::CreateViewSurface(gfx::AcceleratedWidget window) {
fuchsia::images::ImagePipePtr image_pipe;
// TODO(crbug.com/982922): Remove these checks after swapchain update and
// ImagePipe2 rollout completes.
uint32_t image_pipe_swapchain_implementation_version = 0;
constexpr base::StringPiece image_pipe_swapchain(
"VK_LAYER_FUCHSIA_imagepipe_swapchain");
for (const VkLayerProperties& layer_property :
vulkan_instance_.layer_properties()) {
if (image_pipe_swapchain != layer_property.layerName)
continue;
image_pipe_swapchain_implementation_version =
layer_property.implementationVersion;
break;
}
DCHECK_GT(image_pipe_swapchain_implementation_version, 0u);
ScenicSurface* scenic_surface = scenic_surface_factory_->GetSurface(window);
scenic_surface->SetTextureToNewImagePipe(image_pipe.NewRequest());
zx_handle_t image_pipe_handle = 0;
if (image_pipe_swapchain_implementation_version > 1u) {
fuchsia::images::ImagePipe2Ptr image_pipe;
scenic_surface->SetTextureToNewImagePipe(image_pipe.NewRequest());
image_pipe_handle = image_pipe.Unbind().TakeChannel().release();
} else {
fuchsia::images::ImagePipePtr image_pipe;
scenic_surface->SetTextureToNewImagePipe1(image_pipe.NewRequest());
image_pipe_handle = image_pipe.Unbind().TakeChannel().release();
}
VkSurfaceKHR surface;
VkImagePipeSurfaceCreateInfoFUCHSIA surface_create_info = {};
surface_create_info.sType =
VK_STRUCTURE_TYPE_IMAGEPIPE_SURFACE_CREATE_INFO_FUCHSIA;
surface_create_info.flags = 0;
surface_create_info.imagePipeHandle =
image_pipe.Unbind().TakeChannel().release();
surface_create_info.imagePipeHandle = image_pipe_handle;
VkResult result = vkCreateImagePipeSurfaceFUCHSIA(
vulkan_instance_.vk_instance(), &surface_create_info, nullptr, &surface);
......
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