blob: f49005fca51646aa517ca88266ea97e101f59bbb [file] [log] [blame]
// 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