blob: f1a854fdb2a9564249f5b0dd535eca48e51fa584 [file] [log] [blame]
/*
* Copyright (c) 2021 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#import "config.h"
#import "Device.h"
#import "BindGroup.h"
#import "BindGroupLayout.h"
#import "Buffer.h"
#import "CommandEncoder.h"
#import "ComputePipeline.h"
#import "PipelineLayout.h"
#import "QuerySet.h"
#import "Queue.h"
#import "RenderBundleEncoder.h"
#import "RenderPipeline.h"
#import "Sampler.h"
#import "ShaderModule.h"
#import "Surface.h"
#import "SwapChain.h"
#import "Texture.h"
#import "WebGPUExt.h"
#import <wtf/StdLibExtras.h>
namespace WebGPU {
Device::Device() = default;
Device::~Device() = default;
Ref<BindGroup> Device::createBindGroup(const WGPUBindGroupDescriptor* descriptor)
{
UNUSED_PARAM(descriptor);
return BindGroup::create();
}
Ref<BindGroupLayout> Device::createBindGroupLayout(const WGPUBindGroupLayoutDescriptor* descriptor)
{
UNUSED_PARAM(descriptor);
return BindGroupLayout::create();
}
Ref<Buffer> Device::createBuffer(const WGPUBufferDescriptor* descriptor)
{
UNUSED_PARAM(descriptor);
return Buffer::create();
}
Ref<CommandEncoder> Device::createCommandEncoder(const WGPUCommandEncoderDescriptor* descriptor)
{
UNUSED_PARAM(descriptor);
return CommandEncoder::create();
}
Ref<ComputePipeline> Device::createComputePipeline(const WGPUComputePipelineDescriptor* descriptor)
{
UNUSED_PARAM(descriptor);
return ComputePipeline::create();
}
void Device::createComputePipelineAsync(const WGPUComputePipelineDescriptor* descriptor, WTF::Function<void(WGPUCreatePipelineAsyncStatus, Ref<ComputePipeline>&&, const char* message)>&& callback)
{
UNUSED_PARAM(descriptor);
UNUSED_PARAM(callback);
}
Ref<PipelineLayout> Device::createPipelineLayout(const WGPUPipelineLayoutDescriptor* descriptor)
{
UNUSED_PARAM(descriptor);
return PipelineLayout::create();
}
Ref<QuerySet> Device::createQuerySet(const WGPUQuerySetDescriptor* descriptor)
{
UNUSED_PARAM(descriptor);
return QuerySet::create();
}
Ref<RenderBundleEncoder> Device::createRenderBundleEncoder(const WGPURenderBundleEncoderDescriptor* descriptor)
{
UNUSED_PARAM(descriptor);
return RenderBundleEncoder::create();
}
Ref<RenderPipeline> Device::createRenderPipeline(const WGPURenderPipelineDescriptor* descriptor)
{
UNUSED_PARAM(descriptor);
return RenderPipeline::create();
}
void Device::createRenderPipelineAsync(const WGPURenderPipelineDescriptor* descriptor, WTF::Function<void(WGPUCreatePipelineAsyncStatus, Ref<RenderPipeline>&&, const char* message)>&& callback)
{
UNUSED_PARAM(descriptor);
UNUSED_PARAM(callback);
}
Ref<Sampler> Device::createSampler(const WGPUSamplerDescriptor* descriptor)
{
UNUSED_PARAM(descriptor);
return Sampler::create();
}
Ref<ShaderModule> Device::createShaderModule(const WGPUShaderModuleDescriptor* descriptor)
{
UNUSED_PARAM(descriptor);
return ShaderModule::create();
}
Ref<SwapChain> Device::createSwapChain(const Surface& surface, const WGPUSwapChainDescriptor* descriptor)
{
UNUSED_PARAM(surface);
UNUSED_PARAM(descriptor);
return SwapChain::create();
}
Ref<Texture> Device::createTexture(const WGPUTextureDescriptor* descriptor)
{
UNUSED_PARAM(descriptor);
return Texture::create();
}
void Device::destroy()
{
}
bool Device::getLimits(WGPUSupportedLimits* limits)
{
UNUSED_PARAM(limits);
return false;
}
Ref<Queue> Device::getQueue()
{
return Queue::create();
}
bool Device::popErrorScope(WTF::Function<void(WGPUErrorType, const char*)>&& callback)
{
UNUSED_PARAM(callback);
return false;
}
void Device::pushErrorScope(WGPUErrorFilter filter)
{
UNUSED_PARAM(filter);
}
void Device::setDeviceLostCallback(WTF::Function<void(WGPUDeviceLostReason, const char*)>&& callback)
{
UNUSED_PARAM(callback);
}
void Device::setUncapturedErrorCallback(WTF::Function<void(WGPUErrorType, const char*)>&& callback)
{
UNUSED_PARAM(callback);
}
void Device::setLabel(const char* label)
{
UNUSED_PARAM(label);
}
} // namespace WebGPU
void wgpuDeviceRelease(WGPUDevice device)
{
delete device;
}
WGPUBindGroup wgpuDeviceCreateBindGroup(WGPUDevice device, const WGPUBindGroupDescriptor* descriptor)
{
return new WGPUBindGroupImpl { device->device->createBindGroup(descriptor) };
}
WGPUBindGroupLayout wgpuDeviceCreateBindGroupLayout(WGPUDevice device, const WGPUBindGroupLayoutDescriptor* descriptor)
{
return new WGPUBindGroupLayoutImpl { device->device->createBindGroupLayout(descriptor) };
}
WGPUBuffer wgpuDeviceCreateBuffer(WGPUDevice device, const WGPUBufferDescriptor* descriptor)
{
return new WGPUBufferImpl { device->device->createBuffer(descriptor) };
}
WGPUCommandEncoder wgpuDeviceCreateCommandEncoder(WGPUDevice device, const WGPUCommandEncoderDescriptor* descriptor)
{
return new WGPUCommandEncoderImpl { device->device->createCommandEncoder(descriptor) };
}
WGPUComputePipeline wgpuDeviceCreateComputePipeline(WGPUDevice device, const WGPUComputePipelineDescriptor* descriptor)
{
return new WGPUComputePipelineImpl { device->device->createComputePipeline(descriptor) };
}
void wgpuDeviceCreateComputePipelineAsync(WGPUDevice device, const WGPUComputePipelineDescriptor* descriptor, WGPUCreateComputePipelineAsyncCallback callback, void* userdata)
{
device->device->createComputePipelineAsync(descriptor, [callback, userdata] (WGPUCreatePipelineAsyncStatus status, Ref<WebGPU::ComputePipeline>&& pipeline, const char* message) {
callback(status, new WGPUComputePipelineImpl { WTFMove(pipeline) }, message, userdata);
});
}
WGPUPipelineLayout wgpuDeviceCreatePipelineLayout(WGPUDevice device, const WGPUPipelineLayoutDescriptor* descriptor)
{
return new WGPUPipelineLayoutImpl { device->device->createPipelineLayout(descriptor) };
}
WGPUQuerySet wgpuDeviceCreateQuerySet(WGPUDevice device, const WGPUQuerySetDescriptor* descriptor)
{
return new WGPUQuerySetImpl { device->device->createQuerySet(descriptor) };
}
WGPURenderBundleEncoder wgpuDeviceCreateRenderBundleEncoder(WGPUDevice device, const WGPURenderBundleEncoderDescriptor* descriptor)
{
return new WGPURenderBundleEncoderImpl { device->device->createRenderBundleEncoder(descriptor) };
}
WGPURenderPipeline wgpuDeviceCreateRenderPipeline(WGPUDevice device, const WGPURenderPipelineDescriptor* descriptor)
{
return new WGPURenderPipelineImpl { device->device->createRenderPipeline(descriptor) };
}
void wgpuDeviceCreateRenderPipelineAsync(WGPUDevice device, const WGPURenderPipelineDescriptor* descriptor, WGPUCreateRenderPipelineAsyncCallback callback, void* userdata)
{
device->device->createRenderPipelineAsync(descriptor, [callback, userdata] (WGPUCreatePipelineAsyncStatus status, Ref<WebGPU::RenderPipeline>&& pipeline, const char* message) {
callback(status, new WGPURenderPipelineImpl { WTFMove(pipeline) }, message, userdata);
});
}
WGPUSampler wgpuDeviceCreateSampler(WGPUDevice device, const WGPUSamplerDescriptor* descriptor)
{
return new WGPUSamplerImpl { device->device->createSampler(descriptor) };
}
WGPUShaderModule wgpuDeviceCreateShaderModule(WGPUDevice device, const WGPUShaderModuleDescriptor* descriptor)
{
return new WGPUShaderModuleImpl { device->device->createShaderModule(descriptor) };
}
WGPUSwapChain wgpuDeviceCreateSwapChain(WGPUDevice device, WGPUSurface surface, const WGPUSwapChainDescriptor* descriptor)
{
return new WGPUSwapChainImpl { device->device->createSwapChain(surface->surface, descriptor) };
}
WGPUTexture wgpuDeviceCreateTexture(WGPUDevice device, const WGPUTextureDescriptor* descriptor)
{
return new WGPUTextureImpl { device->device->createTexture(descriptor) };
}
void wgpuDeviceDestroy(WGPUDevice device)
{
device->device->destroy();
}
bool wgpuDeviceGetLimits(WGPUDevice device, WGPUSupportedLimits* limits)
{
return device->device->getLimits(limits);
}
WGPUQueue wgpuDeviceGetQueue(WGPUDevice device)
{
return new WGPUQueueImpl { device->device->getQueue() };
}
bool wgpuDevicePopErrorScope(WGPUDevice device, WGPUErrorCallback callback, void* userdata)
{
return device->device->popErrorScope([callback, userdata] (WGPUErrorType type, const char* message) {
callback(type, message, userdata);
});
}
void wgpuDevicePushErrorScope(WGPUDevice device, WGPUErrorFilter filter)
{
device->device->pushErrorScope(filter);
}
void wgpuDeviceSetDeviceLostCallback(WGPUDevice device, WGPUDeviceLostCallback callback, void* userdata)
{
return device->device->setDeviceLostCallback([callback, userdata] (WGPUDeviceLostReason reason, const char* message) {
if (callback)
callback(reason, message, userdata);
});
}
void wgpuDeviceSetUncapturedErrorCallback(WGPUDevice device, WGPUErrorCallback callback, void* userdata)
{
return device->device->setUncapturedErrorCallback([callback, userdata] (WGPUErrorType type, const char* message) {
if (callback)
callback(type, message, userdata);
});
}
void wgpuDeviceSetLabel(WGPUDevice device, const char* label)
{
device->device->setLabel(label);
}