910e62b5创建于 1月15日历史提交
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "gpu/command_buffer/service/shared_image/dawn_image_backing.h"

#include <vector>

#include "gpu/command_buffer/service/shared_context_state.h"
#include "gpu/command_buffer/service/shared_image/shared_image_representation.h"

namespace gpu {

class DawnImageRepresentationImpl : public DawnImageRepresentation {
 public:
  DawnImageRepresentationImpl(SharedImageManager* manager,
                              SharedImageBacking* backing,
                              MemoryTypeTracker* tracker,
                              const wgpu::Device& device,
                              wgpu::Texture texture)
      : DawnImageRepresentation(manager, backing, tracker),
        device_(device),
        texture_(std::move(texture)) {}

  wgpu::Texture BeginAccess(wgpu::TextureUsage usage,
                            wgpu::TextureUsage internal_usage) final {
    return texture_;
  }

  void EndAccess() final {}

 private:
  const wgpu::Device device_;
  wgpu::Texture texture_;
};

DawnImageBacking::DawnImageBacking(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)
    : SharedImageBacking(mailbox,
                         format,
                         size,
                         color_space,
                         surface_origin,
                         alpha_type,
                         usage,
                         std::move(debug_label),
                         format.EstimatedSizeInBytes(size),
                         /*is_thread_safe=*/false) {}

DawnImageBacking::~DawnImageBacking() {
  if (texture_) {
    texture_.Destroy();
  }
}

SharedImageBackingType DawnImageBacking::GetType() const {
  return SharedImageBackingType::kDawn;
}

gfx::Rect DawnImageBacking::ClearedRect() const {
  return gfx::Rect(size());
}

void DawnImageBacking::SetClearedRect(const gfx::Rect& cleared_rect) {}

std::unique_ptr<DawnImageRepresentation> DawnImageBacking::ProduceDawn(
    SharedImageManager* manager,
    MemoryTypeTracker* tracker,
    const wgpu::Device& device,
    wgpu::BackendType backend_type,
    std::vector<wgpu::TextureFormat> view_formats,
    scoped_refptr<SharedContextState> context_state) {
  if (!device_) {
    wgpu::TextureDescriptor descriptor;
    descriptor.usage =
        static_cast<wgpu::TextureUsage>(wgpu::TextureUsage::RenderAttachment |
                                        wgpu::TextureUsage::TextureBinding);
    descriptor.dimension = wgpu::TextureDimension::e2D;
    descriptor.size = {static_cast<uint32_t>(size().width()),
                       static_cast<uint32_t>(size().height()), 1};
    descriptor.format = wgpu::TextureFormat::RGBA8Unorm;
    descriptor.mipLevelCount = 1;
    descriptor.sampleCount = 1;
    texture_ = device.CreateTexture(&descriptor);
    if (!texture_) {
      return nullptr;
    }
    device_ = device;
  } else if (device_.Get() != device.Get()) {
    return nullptr;
  }

  return std::make_unique<DawnImageRepresentationImpl>(manager, this, tracker,
                                                       device, texture_);
}

void DawnImageBacking::Update(std::unique_ptr<gfx::GpuFence> in_fence) {}

void DawnImageBacking::InitializeForTesting(const wgpu::Device& device) {
  wgpu::TextureDescriptor descriptor;
  descriptor.usage =
      static_cast<wgpu::TextureUsage>(wgpu::TextureUsage::RenderAttachment |
                                      wgpu::TextureUsage::TextureBinding);
  descriptor.dimension = wgpu::TextureDimension::e2D;
  descriptor.size = {static_cast<uint32_t>(size().width()),
                     static_cast<uint32_t>(size().height()), 1};
  descriptor.format = wgpu::TextureFormat::RGBA8Unorm;
  descriptor.mipLevelCount = 1;
  descriptor.sampleCount = 1;
  texture_ = device.CreateTexture(&descriptor);
  device_ = device;
}

}  // namespace gpu