File: test_resource_factory.cc

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (100 lines) | stat: -rw-r--r-- 3,695 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// 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 "components/viz/service/display/test_resource_factory.h"

#include <unordered_map>
#include <vector>

#include "components/viz/client/client_resource_provider.h"
#include "components/viz/common/resources/resource_id.h"
#include "components/viz/service/display/display_resource_provider_skia.h"
#include "components/viz/test/fake_skia_output_surface.h"
#include "components/viz/test/test_context_provider.h"
#include "gpu/command_buffer/client/client_shared_image.h"

namespace viz {
namespace {

static ResourceId CreateResourceInLayerTree(
    ClientResourceProvider* child_resource_provider,
    const gfx::Size& size,
    const TestResourceFactory::TestResourceContext& resource_context,
    SharedImageFormat format) {
  gpu::SharedImageUsageSet usage = gpu::SHARED_IMAGE_USAGE_DISPLAY_READ;
  if (resource_context.is_overlay_candidate) {
    usage |= gpu::SHARED_IMAGE_USAGE_SCANOUT;
  }
  auto resource = TransferableResource::Make(
      gpu::ClientSharedImage::CreateForTesting(
          {format, size, gfx::ColorSpace(), kTopLeft_GrSurfaceOrigin,
           kPremul_SkAlphaType, usage},
          GL_TEXTURE_2D),
      TransferableResource::ResourceSource::kTest, gpu::SyncToken());

  if (resource_context.is_low_latency_rendering) {
    resource.is_low_latency_rendering = true;
  }

  ResourceId resource_id =
      child_resource_provider->ImportResource(resource, base::DoNothing());

  return resource_id;
}

}  // namespace

TestResourceFactory::TestResourceFactory() {
  output_surface_ = FakeSkiaOutputSurface::Create3d();
  output_surface_->BindToClient(&output_surface_client_);

  display_resource_provider_ = std::make_unique<DisplayResourceProviderSkia>();
  lock_set_for_external_use_.emplace(display_resource_provider_.get(),
                                     output_surface_.get());

  client_context_provider_ = TestContextProvider::Create();
  client_context_provider_->BindToCurrentSequence();
  client_resource_provider_ = std::make_unique<ClientResourceProvider>();
}

TestResourceFactory::~TestResourceFactory() {
  client_resource_provider_->ShutdownAndReleaseAllResources();
  client_resource_provider_ = nullptr;
  client_context_provider_ = nullptr;
  lock_set_for_external_use_.reset();
  display_resource_provider_ = nullptr;
  output_surface_ = nullptr;
}

ResourceId TestResourceFactory::CreateResource(
    const gfx::Size& size,
    const TestResourceContext& resource_context,
    SharedImageFormat format,
    SurfaceId test_surface_id) {
  ResourceId resource_id = CreateResourceInLayerTree(
      client_resource_provider_.get(), size, resource_context, format);

  const int child_id = display_resource_provider_->CreateChild(
      base::DoNothing(), test_surface_id);

  // Transfer resource to the parent.
  std::vector<ResourceId> resource_ids_to_transfer;
  resource_ids_to_transfer.push_back(resource_id);
  std::vector<TransferableResource> list;

  client_resource_provider_->PrepareSendToParent(
      resource_ids_to_transfer, &list, client_context_provider_.get());
  display_resource_provider_->ReceiveFromChild(child_id, list);

  // Delete it in the child so it won't be leaked, and will be released once
  // returned from the parent.
  client_resource_provider_->RemoveImportedResource(resource_id);

  // In DisplayResourceProvider's namespace, use the mapped resource id.
  std::unordered_map<ResourceId, ResourceId, ResourceIdHasher> resource_map =
      display_resource_provider_->GetChildToParentMap(child_id);
  return resource_map[list[0].id];
}

}  // namespace viz