File: gpu_bind_group.cc

package info (click to toggle)
chromium 138.0.7204.183-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 6,071,908 kB
  • sloc: cpp: 34,937,088; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,953; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,806; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (120 lines) | stat: -rw-r--r-- 4,863 bytes parent folder | download | duplicates (5)
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "third_party/blink/renderer/modules/webgpu/gpu_bind_group.h"

#include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_bind_group_descriptor.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_bind_group_entry.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_buffer_binding.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_union_gpubuffer_gpubufferbinding_gpuexternaltexture_gpusampler_gputextureview.h"
#include "third_party/blink/renderer/modules/webgpu/dawn_conversions.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_bind_group_layout.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_buffer.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_device.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_external_texture.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_sampler.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_texture_view.h"
#include "third_party/blink/renderer/platform/bindings/exception_state.h"

namespace blink {

wgpu::BindGroupEntry AsDawnType(
    const GPUBindGroupEntry* webgpu_binding,
    Vector<std::unique_ptr<wgpu::ExternalTextureBindingEntry>>*
        externalTextureBindingEntries) {
  wgpu::BindGroupEntry dawn_binding = {
      .binding = webgpu_binding->binding(),
  };

  switch (webgpu_binding->resource()->GetContentType()) {
    case V8GPUBindingResource::ContentType::kGPUBuffer: {
      GPUBuffer* buffer = webgpu_binding->resource()->GetAsGPUBuffer();
      dawn_binding.buffer = AsDawnType(buffer);
      break;
    }
    case V8GPUBindingResource::ContentType::kGPUBufferBinding: {
      GPUBufferBinding* buffer =
          webgpu_binding->resource()->GetAsGPUBufferBinding();
      dawn_binding.offset = buffer->offset();
      if (buffer->hasSize()) {
        dawn_binding.size = buffer->size();
      }
      dawn_binding.buffer = AsDawnType(buffer->buffer());
      break;
    }
    case V8GPUBindingResource::ContentType::kGPUSampler:
      dawn_binding.sampler =
          AsDawnType(webgpu_binding->resource()->GetAsGPUSampler());
      break;
    case V8GPUBindingResource::ContentType::kGPUTextureView:
      dawn_binding.textureView =
          AsDawnType(webgpu_binding->resource()->GetAsGPUTextureView());
      break;
    case V8GPUBindingResource::ContentType::kGPUExternalTexture:
      std::unique_ptr<wgpu::ExternalTextureBindingEntry>
          externalTextureBindingEntry =
              std::make_unique<wgpu::ExternalTextureBindingEntry>();
      externalTextureBindingEntry->externalTexture =
          AsDawnType(webgpu_binding->resource()->GetAsGPUExternalTexture());
      dawn_binding.nextInChain = externalTextureBindingEntry.get();
      externalTextureBindingEntries->push_back(
          std::move(externalTextureBindingEntry));
      break;
  }

  return dawn_binding;
}

base::HeapArray<wgpu::BindGroupEntry> AsDawnType(
    const HeapVector<Member<GPUBindGroupEntry>>& webgpu_objects,
    Vector<std::unique_ptr<wgpu::ExternalTextureBindingEntry>>*
        externalTextureBindingEntries) {
  const wtf_size_t count = webgpu_objects.size();
  auto dawn_objects = base::HeapArray<wgpu::BindGroupEntry>::WithSize(count);
  for (wtf_size_t i = 0; i < count; ++i) {
    dawn_objects[i] =
        AsDawnType(webgpu_objects[i].Get(), externalTextureBindingEntries);
  }
  return dawn_objects;
}

// static
GPUBindGroup* GPUBindGroup::Create(GPUDevice* device,
                                   const GPUBindGroupDescriptor* webgpu_desc,
                                   ExceptionState& exception_state) {
  DCHECK(device);
  DCHECK(webgpu_desc);

  uint32_t entry_count = 0;
  base::HeapArray<wgpu::BindGroupEntry> entries;
  Vector<std::unique_ptr<wgpu::ExternalTextureBindingEntry>>
      externalTextureBindingEntries;
  entry_count = static_cast<uint32_t>(webgpu_desc->entries().size());
  if (entry_count > 0) {
    entries =
        AsDawnType(webgpu_desc->entries(), &externalTextureBindingEntries);
  }

  wgpu::BindGroupDescriptor dawn_desc = {
      .layout = AsDawnType(webgpu_desc->layout()),
      .entryCount = entry_count,
      .entries = entries.data(),
  };
  std::string label = webgpu_desc->label().Utf8();
  if (!label.empty()) {
    dawn_desc.label = label.c_str();
  }

  GPUBindGroup* bind_group = MakeGarbageCollected<GPUBindGroup>(
      device, device->GetHandle().CreateBindGroup(&dawn_desc),
      webgpu_desc->label());
  return bind_group;
}

GPUBindGroup::GPUBindGroup(GPUDevice* device,
                           wgpu::BindGroup bind_group,
                           const String& label)
    : DawnObject<wgpu::BindGroup>(device, std::move(bind_group), label) {}

}  // namespace blink