#include "gpu/command_buffer/service/shared_image/ozone_image_backing.h"
#include <dawn/webgpu.h>
#include <memory>
#include <utility>
#include "base/containers/contains.h"
#include "base/logging.h"
#include "base/memory/scoped_refptr.h"
#include "base/not_fatal_until.h"
#include "base/numerics/checked_math.h"
#include "build/build_config.h"
#include "components/viz/common/gpu/vulkan_context_provider.h"
#include "gpu/command_buffer/common/mailbox.h"
#include "gpu/command_buffer/common/shared_image_usage.h"
#include "gpu/command_buffer/service/memory_tracking.h"
#include "gpu/command_buffer/service/shared_context_state.h"
#include "gpu/command_buffer/service/shared_image/gl_ozone_image_representation.h"
#include "gpu/command_buffer/service/shared_image/ozone_image_gl_textures_holder.h"
#include "gpu/command_buffer/service/shared_image/shared_image_format_service_utils.h"
#include "gpu/command_buffer/service/shared_image/shared_image_manager.h"
#include "gpu/command_buffer/service/shared_image/shared_image_representation.h"
#include "gpu/command_buffer/service/shared_image/skia_gl_image_representation.h"
#include "gpu/command_buffer/service/shared_memory_region_wrapper.h"
#include "gpu/command_buffer/service/skia_utils.h"
#include "gpu/config/gpu_finch_features.h"
#include "third_party/skia/include/gpu/GrBackendSemaphore.h"
#include "third_party/skia/include/private/chromium/GrPromiseImageTexture.h"
#include "ui/gfx/buffer_format_util.h"
#include "ui/gfx/buffer_types.h"
#include "ui/gfx/color_space.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/gpu_fence.h"
#include "ui/gfx/gpu_fence_handle.h"
#include "ui/gfx/native_pixmap.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/gl/buildflags.h"
#include "ui/gl/scoped_make_current_unsafe.h"
#if BUILDFLAG(ENABLE_VULKAN)
#include "gpu/command_buffer/service/shared_image/skia_vk_ozone_image_representation.h"
#include "gpu/command_buffer/service/shared_image/vulkan_ozone_image_representation.h"
#include "gpu/vulkan/vulkan_image.h"
#include "gpu/vulkan/vulkan_implementation.h"
#endif
#if BUILDFLAG(USE_DAWN)
#include "gpu/command_buffer/service/dawn_context_provider.h"
#include "gpu/command_buffer/service/shared_image/dawn_ozone_image_representation.h"
#include "gpu/command_buffer/service/shared_image/skia_graphite_dawn_image_representation.h"
#include "third_party/skia/include/gpu/graphite/Context.h"
#include "third_party/skia/include/gpu/graphite/Recorder.h"
#endif
namespace gpu {
namespace {
size_t GetPixmapSizeInBytes(const gfx::NativePixmap& pixmap) { … }
bool IsExoTexture(std::string_view label) { … }
}
class OzoneImageBacking::OverlayOzoneImageRepresentation
: public OverlayImageRepresentation { … };
SharedImageBackingType OzoneImageBacking::GetType() const { … }
void OzoneImageBacking::Update(std::unique_ptr<gfx::GpuFence> in_fence) { … }
scoped_refptr<gfx::NativePixmap> OzoneImageBacking::GetNativePixmap() { … }
bool OzoneImageBacking::IsImportedFromExo() { … }
gfx::GpuMemoryBufferHandle OzoneImageBacking::GetGpuMemoryBufferHandle() { … }
gfx::GpuMemoryBufferHandle
OzoneImageBacking::GetSinglePlaneGpuMemoryBufferHandle(uint32_t index) { … }
std::unique_ptr<DawnImageRepresentation> OzoneImageBacking::ProduceDawn(
SharedImageManager* manager,
MemoryTypeTracker* tracker,
const wgpu::Device& device,
wgpu::BackendType backend_type,
std::vector<wgpu::TextureFormat> view_formats,
scoped_refptr<SharedContextState> context_state) { … }
std::unique_ptr<SkiaGraphiteImageRepresentation>
OzoneImageBacking::ProduceSkiaGraphite(
SharedImageManager* manager,
MemoryTypeTracker* tracker,
scoped_refptr<SharedContextState> context_state) { … }
scoped_refptr<OzoneImageGLTexturesHolder>
OzoneImageBacking::RetainGLTexturePerContextCache() { … }
std::unique_ptr<GLTexturePassthroughImageRepresentation>
OzoneImageBacking::ProduceGLTexturePassthrough(SharedImageManager* manager,
MemoryTypeTracker* tracker) { … }
std::unique_ptr<SkiaGaneshImageRepresentation>
OzoneImageBacking::ProduceSkiaGanesh(
SharedImageManager* manager,
MemoryTypeTracker* tracker,
scoped_refptr<SharedContextState> context_state) { … }
std::unique_ptr<OverlayImageRepresentation> OzoneImageBacking::ProduceOverlay(
SharedImageManager* manager,
MemoryTypeTracker* tracker) { … }
OzoneImageBacking::OzoneImageBacking(
const Mailbox& mailbox,
viz::SharedImageFormat format,
const gfx::Size& size,
const gfx::ColorSpace& color_space,
GrSurfaceOrigin surface_origin,
SkAlphaType alpha_type,
SharedImageUsageSet usage,
std::string debug_label,
scoped_refptr<SharedContextState> context_state,
scoped_refptr<gfx::NativePixmap> pixmap,
const GpuDriverBugWorkarounds& workarounds,
std::optional<gfx::BufferUsage> buffer_usage)
: … { … }
OzoneImageBacking::~OzoneImageBacking() { … }
#if BUILDFLAG(ENABLE_VULKAN)
std::unique_ptr<VulkanImageRepresentation> OzoneImageBacking::ProduceVulkan(
SharedImageManager* manager,
MemoryTypeTracker* tracker,
gpu::VulkanDeviceQueue* vulkan_device_queue,
gpu::VulkanImplementation& vulkan_impl,
bool needs_detiling) { … }
#endif
bool OzoneImageBacking::UploadFromMemory(const std::vector<SkPixmap>& pixmaps) { … }
#if BUILDFLAG(USE_DAWN)
bool OzoneImageBacking::UploadFromMemoryGraphite(
const std::vector<SkPixmap>& pixmaps) { … }
#endif
void OzoneImageBacking::FlushAndSubmitIfNecessary(
std::vector<GrBackendSemaphore> signal_semaphores,
SharedContextState* const shared_context_state) { … }
bool OzoneImageBacking::BeginAccess(bool readonly,
AccessStream access_stream,
std::vector<gfx::GpuFenceHandle>* fences,
bool& need_end_fence) { … }
void OzoneImageBacking::EndAccess(bool readonly,
AccessStream access_stream,
gfx::GpuFenceHandle fence) { … }
void OzoneImageBacking::OnGLContextLost(gl::GLContext* context) { … }
void OzoneImageBacking::OnGLContextWillDestroy(gl::GLContext* context) { … }
void OzoneImageBacking::OnGLContextLostOrDestroy(gl::GLContext* context,
bool mark_context_lost) { … }
void OzoneImageBacking::DestroyTexturesOnContext(
OzoneImageGLTexturesHolder* holder,
gl::GLContext* context) { … }
}