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
|
// 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_compute_pipeline.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_compute_pipeline_descriptor.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_programmable_stage.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_bind_group_layout.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_device.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_pipeline_layout.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_programmable_stage.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_shader_module.h"
namespace blink {
wgpu::ComputePipelineDescriptor AsDawnType(
GPUDevice* device,
const GPUComputePipelineDescriptor* webgpu_desc,
std::string* label,
OwnedProgrammableStage* computeStage) {
DCHECK(webgpu_desc);
DCHECK(label);
DCHECK(computeStage);
wgpu::ComputePipelineDescriptor dawn_desc = {
.layout = AsDawnType(webgpu_desc->layout()),
};
*label = webgpu_desc->label().Utf8();
if (!label->empty()) {
dawn_desc.label = label->c_str();
}
GPUProgrammableStage* programmable_stage_desc = webgpu_desc->compute();
GPUProgrammableStageAsWGPUProgrammableStage(programmable_stage_desc,
computeStage);
dawn_desc.compute.constantCount = computeStage->constantCount;
dawn_desc.compute.constants = computeStage->constants.get();
dawn_desc.compute.module = programmable_stage_desc->module()->GetHandle();
dawn_desc.compute.entryPoint =
computeStage->entry_point ? computeStage->entry_point->c_str() : nullptr;
return dawn_desc;
}
// static
GPUComputePipeline* GPUComputePipeline::Create(
GPUDevice* device,
const GPUComputePipelineDescriptor* webgpu_desc) {
DCHECK(device);
DCHECK(webgpu_desc);
std::string label;
OwnedProgrammableStage computeStage;
wgpu::ComputePipelineDescriptor dawn_desc =
AsDawnType(device, webgpu_desc, &label, &computeStage);
GPUComputePipeline* pipeline = MakeGarbageCollected<GPUComputePipeline>(
device, device->GetHandle().CreateComputePipeline(&dawn_desc),
webgpu_desc->label());
return pipeline;
}
GPUComputePipeline::GPUComputePipeline(GPUDevice* device,
wgpu::ComputePipeline compute_pipeline,
const String& label)
: DawnObject<wgpu::ComputePipeline>(device,
std::move(compute_pipeline),
label) {}
GPUBindGroupLayout* GPUComputePipeline::getBindGroupLayout(uint32_t index) {
return MakeGarbageCollected<GPUBindGroupLayout>(
device_, GetHandle().GetBindGroupLayout(index), String());
}
} // namespace blink
|