From d95f6c3dbdffcd5cff7e5c01cb2ff9bebdacad26 Mon Sep 17 00:00:00 2001 From: Boris Sazonov <bsazonov@chromium.org> Date: Thu, 28 Nov 2024 12:19:00 +0000 Subject: [PATCH] Revert "Use DawnAHardwareBufferImageRepresentation for all dawn backends" This reverts commit f5334a65d6702212918a0a410b308c65fc3e9bc5. Reason for revert: caused failures on Android (see https://crbug.com/381386757). Original change's description: > Use DawnAHardwareBufferImageRepresentation for all dawn backends > > Dawn now supports direct AHardwareBuffer import on all Android > backends. > > Bug: 42241435 > Change-Id: I14e98bf78ba687294ad101e5401850ca4f175b74 > Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6019930 > Reviewed-by: Kai Ninomiya <kainino@chromium.org> > Commit-Queue: Geoff Lang <geofflang@chromium.org> > Cr-Commit-Position: refs/heads/main@{#1388986} Bug: 42241435, 381386757 Change-Id: I278ab553c8a40637c17b0d7bec6c1000bacf8595 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6054214 Commit-Queue: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com> Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com> Owners-Override: Boris Sazonov <bsazonov@chromium.org> Auto-Submit: Boris Sazonov <bsazonov@chromium.org> Commit-Queue: Boris Sazonov <bsazonov@chromium.org> Cr-Commit-Position: refs/heads/main@{#1389340} --- .../ahardwarebuffer_image_backing_factory.cc | 23 ++++++++++++++++++- ...rebuffer_image_backing_factory_unittest.cc | 17 ++++---------- ...wn_ahardwarebuffer_image_representation.cc | 10 ++------ ...awn_ahardwarebuffer_image_representation.h | 2 -- 4 files changed, 29 insertions(+), 23 deletions(-) diff --git a/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory.cc b/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory.cc index e24abdd47d5c3..a23e6a31e9fa7 100644 --- a/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory.cc +++ b/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory.cc @@ -39,6 +39,7 @@ #include "gpu/command_buffer/service/shared_context_state.h" #include "gpu/command_buffer/service/shared_image/android_image_backing.h" #include "gpu/command_buffer/service/shared_image/dawn_ahardwarebuffer_image_representation.h" +#include "gpu/command_buffer/service/shared_image/dawn_egl_image_representation.h" #include "gpu/command_buffer/service/shared_image/gl_texture_android_image_representation.h" #include "gpu/command_buffer/service/shared_image/gl_texture_passthrough_android_image_representation.h" #include "gpu/command_buffer/service/shared_image/shared_image_backing.h" @@ -608,6 +609,26 @@ AHardwareBufferImageBacking::ProduceDawn( // backing. DCHECK(hardware_buffer_handle_.is_valid()); +#if BUILDFLAG(USE_DAWN) && BUILDFLAG(DAWN_ENABLE_BACKEND_OPENGLES) + if (backend_type == wgpu::BackendType::OpenGLES) { + std::unique_ptr<GLTextureImageRepresentationBase> gl_representation; + if (use_passthrough_) { + gl_representation = ProduceGLTexturePassthrough(manager, tracker); + } else { + gl_representation = ProduceGLTexture(manager, tracker); + } + + gl::ScopedEGLImage egl_image = + CreateEGLImageFromAHardwareBuffer(hardware_buffer_handle_.get()); + + auto result = std::make_unique<DawnEGLImageRepresentation>( + std::move(gl_representation), std::move(egl_image), manager, this, + tracker, device, std::move(view_formats)); + return result; + } +#endif + + DCHECK_EQ(backend_type, wgpu::BackendType::Vulkan); wgpu::TextureFormat webgpu_format = ToDawnFormat(format()); if (webgpu_format == wgpu::TextureFormat::Undefined) { LOG(ERROR) << "Unable to fine a suitable WebGPU format."; @@ -615,7 +636,7 @@ AHardwareBufferImageBacking::ProduceDawn( } return std::make_unique<DawnAHardwareBufferImageRepresentation>( - manager, this, tracker, wgpu::Device(device), backend_type, webgpu_format, + manager, this, tracker, wgpu::Device(device), webgpu_format, std::move(view_formats), hardware_buffer_handle_.get()); #else return nullptr; diff --git a/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory_unittest.cc b/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory_unittest.cc index 904545aece6dd..eb7f8e3d05f3d 100644 --- a/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory_unittest.cc +++ b/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory_unittest.cc @@ -253,18 +253,11 @@ TEST_P(AHardwareBufferImageBackingFactoryTest, ProduceDawnOpenGLES) { wgpu::DeviceDescriptor device_descriptor; - constexpr wgpu::FeatureName kOptionalFeatures[] = { - // We need to request internal usage to be able to do operations with - // internal methods that would need specific usages. - wgpu::FeatureName::DawnInternalUsages, - - // AHardwareBuffers are imported directly into Dawn and SyncFDs are used - // to synchronize them. - wgpu::FeatureName::SharedTextureMemoryAHardwareBuffer, - wgpu::FeatureName::SharedFenceSyncFD, - }; - device_descriptor.requiredFeatureCount = std::size(kOptionalFeatures); - device_descriptor.requiredFeatures = kOptionalFeatures; + // We need to request internal usage to be able to do operations with + // internal methods that would need specific usages. + wgpu::FeatureName dawn_internal_usage = wgpu::FeatureName::DawnInternalUsages; + device_descriptor.requiredFeatureCount = 1; + device_descriptor.requiredFeatures = &dawn_internal_usage; wgpu::Device device = adapter.CreateDevice(&device_descriptor); diff --git a/gpu/command_buffer/service/shared_image/dawn_ahardwarebuffer_image_representation.cc b/gpu/command_buffer/service/shared_image/dawn_ahardwarebuffer_image_representation.cc index 1796e13ff0cee..e9df988baa260 100644 --- a/gpu/command_buffer/service/shared_image/dawn_ahardwarebuffer_image_representation.cc +++ b/gpu/command_buffer/service/shared_image/dawn_ahardwarebuffer_image_representation.cc @@ -17,13 +17,11 @@ DawnAHardwareBufferImageRepresentation::DawnAHardwareBufferImageRepresentation( AndroidImageBacking* backing, MemoryTypeTracker* tracker, wgpu::Device device, - wgpu::BackendType backend_type, wgpu::TextureFormat format, std::vector<wgpu::TextureFormat> view_formats, AHardwareBuffer* buffer) : DawnImageRepresentation(manager, backing, tracker), device_(std::move(device)), - backend_type_(backend_type), format_(format), view_formats_(std::move(view_formats)) { DCHECK(device_); @@ -83,9 +81,7 @@ wgpu::Texture DawnAHardwareBufferImageRepresentation::BeginAccess( // TODO(crbug.com/327111284): Track layouts correctly. begin_layout.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; begin_layout.newLayout = VK_IMAGE_LAYOUT_UNDEFINED; - if (backend_type_ == wgpu::BackendType::Vulkan) { - begin_access_desc.nextInChain = &begin_layout; - } + begin_access_desc.nextInChain = &begin_layout; wgpu::SharedFence shared_fence; // Pass 1 as the signaled value for the binary semaphore @@ -162,9 +158,7 @@ void DawnAHardwareBufferImageRepresentation::EndAccess() { wgpu::SharedTextureMemoryEndAccessState end_access_desc = {}; wgpu::SharedTextureMemoryVkImageLayoutEndState end_layout{}; - if (backend_type_ == wgpu::BackendType::Vulkan) { - end_access_desc.nextInChain = &end_layout; - } + end_access_desc.nextInChain = &end_layout; if (shared_texture_memory_.EndAccess(texture_, &end_access_desc) != wgpu::Status::Success) { diff --git a/gpu/command_buffer/service/shared_image/dawn_ahardwarebuffer_image_representation.h b/gpu/command_buffer/service/shared_image/dawn_ahardwarebuffer_image_representation.h index b4886644a6778..708897e15075b 100644 --- a/gpu/command_buffer/service/shared_image/dawn_ahardwarebuffer_image_representation.h +++ b/gpu/command_buffer/service/shared_image/dawn_ahardwarebuffer_image_representation.h @@ -23,7 +23,6 @@ class DawnAHardwareBufferImageRepresentation : public DawnImageRepresentation { AndroidImageBacking* backing, MemoryTypeTracker* tracker, wgpu::Device device, - wgpu::BackendType backend_type, wgpu::TextureFormat format, std::vector<wgpu::TextureFormat> view_formats, AHardwareBuffer* buffer); @@ -41,7 +40,6 @@ class DawnAHardwareBufferImageRepresentation : public DawnImageRepresentation { base::android::ScopedHardwareBufferHandle handle_; wgpu::Texture texture_; wgpu::Device device_; - wgpu::BackendType backend_type_; wgpu::TextureFormat format_; std::vector<wgpu::TextureFormat> view_formats_; // There is a SharedTextureMemory per representation with how this works