Commit a29b4546 authored by Jiawei Shao's avatar Jiawei Shao Committed by Chromium LUCI CQ

[WebGPU] Add the entry point of CreateReadyComputePipeline

BUG=dawn:529

Change-Id: If23c63afeb72cae42bf800a945b5af22626cfdb2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2567635
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: default avatarCorentin Wallez <cwallez@chromium.org>
Reviewed-by: default avatarAustin Eng <enga@chromium.org>
Cr-Commit-Position: refs/heads/master@{#832717}
parent 01e79d26
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
#include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_compute_pipeline_descriptor.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_descriptor.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_programmable_stage_descriptor.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_bind_group_layout.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_device.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_pipeline_layout.h"
...@@ -14,26 +13,41 @@ ...@@ -14,26 +13,41 @@
namespace blink { namespace blink {
// static WGPUComputePipelineDescriptor AsDawnType(
GPUComputePipeline* GPUComputePipeline::Create( const GPUComputePipelineDescriptor* webgpu_desc,
GPUDevice* device, std::string* label,
const GPUComputePipelineDescriptor* webgpu_desc) { OwnedProgrammableStageDescriptor* computeStageDescriptor) {
DCHECK(device);
DCHECK(webgpu_desc); DCHECK(webgpu_desc);
DCHECK(label);
DCHECK(computeStageDescriptor);
std::string label;
WGPUComputePipelineDescriptor dawn_desc = {}; WGPUComputePipelineDescriptor dawn_desc = {};
dawn_desc.nextInChain = nullptr; dawn_desc.nextInChain = nullptr;
if (webgpu_desc->hasLayout()) { if (webgpu_desc->hasLayout()) {
dawn_desc.layout = AsDawnType(webgpu_desc->layout()); dawn_desc.layout = AsDawnType(webgpu_desc->layout());
} }
if (webgpu_desc->hasLabel()) { if (webgpu_desc->hasLabel()) {
label = webgpu_desc->label().Utf8(); *label = webgpu_desc->label().Utf8();
dawn_desc.label = label.c_str(); dawn_desc.label = label->c_str();
} }
auto compute_stage = AsDawnType(webgpu_desc->computeStage()); *computeStageDescriptor = AsDawnType(webgpu_desc->computeStage());
dawn_desc.computeStage = std::get<0>(compute_stage); dawn_desc.computeStage = std::get<0>(*computeStageDescriptor);
return dawn_desc;
}
// static
GPUComputePipeline* GPUComputePipeline::Create(
GPUDevice* device,
const GPUComputePipelineDescriptor* webgpu_desc) {
DCHECK(device);
DCHECK(webgpu_desc);
std::string label;
OwnedProgrammableStageDescriptor computeStageDescriptor;
WGPUComputePipelineDescriptor dawn_desc =
AsDawnType(webgpu_desc, &label, &computeStageDescriptor);
return MakeGarbageCollected<GPUComputePipeline>( return MakeGarbageCollected<GPUComputePipeline>(
device, device->GetProcs().deviceCreateComputePipeline( device, device->GetProcs().deviceCreateComputePipeline(
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBGPU_GPU_COMPUTE_PIPELINE_H_ #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBGPU_GPU_COMPUTE_PIPELINE_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBGPU_GPU_COMPUTE_PIPELINE_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBGPU_GPU_COMPUTE_PIPELINE_H_
#include "third_party/blink/renderer/modules/webgpu/dawn_conversions.h"
#include "third_party/blink/renderer/modules/webgpu/dawn_object.h" #include "third_party/blink/renderer/modules/webgpu/dawn_object.h"
namespace blink { namespace blink {
...@@ -12,6 +13,11 @@ namespace blink { ...@@ -12,6 +13,11 @@ namespace blink {
class GPUBindGroupLayout; class GPUBindGroupLayout;
class GPUComputePipelineDescriptor; class GPUComputePipelineDescriptor;
WGPUComputePipelineDescriptor AsDawnType(
const GPUComputePipelineDescriptor* webgpu_desc,
std::string* label,
OwnedProgrammableStageDescriptor* computeStageDescriptor);
class GPUComputePipeline : public DawnObject<WGPUComputePipeline> { class GPUComputePipeline : public DawnObject<WGPUComputePipeline> {
DEFINE_WRAPPERTYPEINFO(); DEFINE_WRAPPERTYPEINFO();
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "gpu/command_buffer/client/webgpu_interface.h" #include "gpu/command_buffer/client/webgpu_interface.h"
#include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/platform.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.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_device_descriptor.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_device_descriptor.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_extension_name.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_extension_name.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_uncaptured_error_event_init.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_uncaptured_error_event_init.h"
...@@ -148,6 +149,33 @@ void GPUDevice::OnDeviceLostError(const char* message) { ...@@ -148,6 +149,33 @@ void GPUDevice::OnDeviceLostError(const char* message) {
} }
} }
void GPUDevice::OnCreateReadyComputePipelineCallback(
ScriptPromiseResolver* resolver,
WGPUCreateReadyPipelineStatus status,
WGPUComputePipeline compute_pipeline,
const char* message) {
switch (status) {
case WGPUCreateReadyPipelineStatus_Success: {
resolver->Resolve(
MakeGarbageCollected<GPUComputePipeline>(this, compute_pipeline));
break;
}
case WGPUCreateReadyPipelineStatus_Error:
case WGPUCreateReadyPipelineStatus_DeviceLost:
case WGPUCreateReadyPipelineStatus_DeviceDestroyed:
case WGPUCreateReadyPipelineStatus_Unknown: {
resolver->Reject(MakeGarbageCollected<DOMException>(
DOMExceptionCode::kOperationError, message));
break;
}
default: {
NOTREACHED();
}
}
}
GPUAdapter* GPUDevice::adapter() const { GPUAdapter* GPUDevice::adapter() const {
return adapter_; return adapter_;
} }
...@@ -211,6 +239,29 @@ GPUComputePipeline* GPUDevice::createComputePipeline( ...@@ -211,6 +239,29 @@ GPUComputePipeline* GPUDevice::createComputePipeline(
return GPUComputePipeline::Create(this, descriptor); return GPUComputePipeline::Create(this, descriptor);
} }
ScriptPromise GPUDevice::createReadyComputePipeline(
ScriptState* script_state,
const GPUComputePipelineDescriptor* descriptor) {
auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
ScriptPromise promise = resolver->Promise();
std::string label;
OwnedProgrammableStageDescriptor computeStageDescriptor;
WGPUComputePipelineDescriptor dawn_desc =
AsDawnType(descriptor, &label, &computeStageDescriptor);
auto* callback =
BindDawnCallback(&GPUDevice::OnCreateReadyComputePipelineCallback,
WrapPersistent(this), WrapPersistent(resolver));
GetProcs().deviceCreateReadyComputePipeline(GetHandle(), &dawn_desc,
callback->UnboundCallback(),
callback->AsUserdata());
// WebGPU guarantees that promises are resolved in finite time so we need to
// ensure commands are flushed.
EnsureFlush();
return promise;
}
GPUCommandEncoder* GPUDevice::createCommandEncoder( GPUCommandEncoder* GPUDevice::createCommandEncoder(
const GPUCommandEncoderDescriptor* descriptor) { const GPUCommandEncoderDescriptor* descriptor) {
return GPUCommandEncoder::Create(this, descriptor); return GPUCommandEncoder::Create(this, descriptor);
......
...@@ -92,6 +92,9 @@ class GPUDevice final : public EventTargetWithInlineData, ...@@ -92,6 +92,9 @@ class GPUDevice final : public EventTargetWithInlineData,
const GPURenderPipelineDescriptor* descriptor); const GPURenderPipelineDescriptor* descriptor);
GPUComputePipeline* createComputePipeline( GPUComputePipeline* createComputePipeline(
const GPUComputePipelineDescriptor* descriptor); const GPUComputePipelineDescriptor* descriptor);
ScriptPromise createReadyComputePipeline(
ScriptState* script_state,
const GPUComputePipelineDescriptor* descriptor);
GPUCommandEncoder* createCommandEncoder( GPUCommandEncoder* createCommandEncoder(
const GPUCommandEncoderDescriptor* descriptor); const GPUCommandEncoderDescriptor* descriptor);
...@@ -123,6 +126,12 @@ class GPUDevice final : public EventTargetWithInlineData, ...@@ -123,6 +126,12 @@ class GPUDevice final : public EventTargetWithInlineData,
WGPUErrorType type, WGPUErrorType type,
const char* message); const char* message);
void OnCreateReadyComputePipelineCallback(
ScriptPromiseResolver* resolver,
WGPUCreateReadyPipelineStatus status,
WGPUComputePipeline compute_pipeline,
const char* message);
Member<GPUAdapter> adapter_; Member<GPUAdapter> adapter_;
Vector<String> extension_name_list_; Vector<String> extension_name_list_;
Member<GPUQueue> queue_; Member<GPUQueue> queue_;
......
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
[CallWith=ScriptState] GPURenderPipeline createRenderPipeline(GPURenderPipelineDescriptor descriptor); [CallWith=ScriptState] GPURenderPipeline createRenderPipeline(GPURenderPipelineDescriptor descriptor);
GPUComputePipeline createComputePipeline(GPUComputePipelineDescriptor descriptor); GPUComputePipeline createComputePipeline(GPUComputePipelineDescriptor descriptor);
[CallWith=ScriptState] Promise<GPUComputePipeline?> createReadyComputePipeline(GPUComputePipelineDescriptor descriptor);
GPUCommandEncoder createCommandEncoder(optional GPUCommandEncoderDescriptor descriptor = {}); GPUCommandEncoder createCommandEncoder(optional GPUCommandEncoderDescriptor descriptor = {});
GPURenderBundleEncoder createRenderBundleEncoder(GPURenderBundleEncoderDescriptor descriptor); GPURenderBundleEncoder createRenderBundleEncoder(GPURenderBundleEncoderDescriptor descriptor);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment