Transform convert_* functions in gpuconvert.rs to From/TryFrom implementations (#33302)

Signed-off-by: Taym <haddadi.taym@gmail.com>
This commit is contained in:
Taym Haddadi 2024-09-04 18:03:59 +02:00 committed by GitHub
parent c0ced7a524
commit 00389cf007
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 493 additions and 483 deletions

View file

@ -4,10 +4,11 @@
use dom_struct::dom_struct; use dom_struct::dom_struct;
use webgpu::wgc::command as wgpu_com; use webgpu::wgc::command as wgpu_com;
use webgpu::wgt::Color;
use webgpu::{self, wgt, WebGPU, WebGPUComputePass, WebGPURenderPass, WebGPURequest}; use webgpu::{self, wgt, WebGPU, WebGPUComputePass, WebGPURenderPass, WebGPURequest};
use super::bindings::error::Fallible; use super::bindings::error::Fallible;
use super::gpuconvert::{convert_color, convert_label}; use super::gpuconvert::convert_label;
use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::cell::DomRefCell;
use crate::dom::bindings::codegen::Bindings::WebGPUBinding::{ use crate::dom::bindings::codegen::Bindings::WebGPUBinding::{
GPUCommandBufferDescriptor, GPUCommandEncoderMethods, GPUComputePassDescriptor, GPUExtent3D, GPUCommandBufferDescriptor, GPUCommandEncoderMethods, GPUComputePassDescriptor, GPUExtent3D,
@ -20,9 +21,7 @@ use crate::dom::globalscope::GlobalScope;
use crate::dom::gpubuffer::GPUBuffer; use crate::dom::gpubuffer::GPUBuffer;
use crate::dom::gpucommandbuffer::GPUCommandBuffer; use crate::dom::gpucommandbuffer::GPUCommandBuffer;
use crate::dom::gpucomputepassencoder::GPUComputePassEncoder; use crate::dom::gpucomputepassencoder::GPUComputePassEncoder;
use crate::dom::gpuconvert::{ use crate::dom::gpuconvert::{convert_load_op, convert_store_op};
convert_ic_buffer, convert_ic_texture, convert_load_op, convert_store_op, convert_texture_size,
};
use crate::dom::gpudevice::GPUDevice; use crate::dom::gpudevice::GPUDevice;
use crate::dom::gpurenderpassencoder::GPURenderPassEncoder; use crate::dom::gpurenderpassencoder::GPURenderPassEncoder;
@ -152,7 +151,7 @@ impl GPUCommandEncoderMethods for GPUCommandEncoder {
clear_value: color clear_value: color
.clearValue .clearValue
.as_ref() .as_ref()
.map(|color| convert_color(color)) .map(|color| (color).try_into())
.transpose()? .transpose()?
.unwrap_or_default(), .unwrap_or_default(),
read_only: false, read_only: false,
@ -222,9 +221,9 @@ impl GPUCommandEncoderMethods for GPUCommandEncoder {
.0 .0
.send(WebGPURequest::CopyBufferToTexture { .send(WebGPURequest::CopyBufferToTexture {
command_encoder_id: self.encoder.0, command_encoder_id: self.encoder.0,
source: convert_ic_buffer(source), source: source.into(),
destination: convert_ic_texture(destination)?, destination: destination.try_into()?,
copy_size: convert_texture_size(&copy_size)?, copy_size: (&copy_size).try_into()?,
}) })
.expect("Failed to send CopyBufferToTexture"); .expect("Failed to send CopyBufferToTexture");
@ -242,9 +241,9 @@ impl GPUCommandEncoderMethods for GPUCommandEncoder {
.0 .0
.send(WebGPURequest::CopyTextureToBuffer { .send(WebGPURequest::CopyTextureToBuffer {
command_encoder_id: self.encoder.0, command_encoder_id: self.encoder.0,
source: convert_ic_texture(source)?, source: source.try_into()?,
destination: convert_ic_buffer(destination), destination: destination.into(),
copy_size: convert_texture_size(&copy_size)?, copy_size: (&copy_size).try_into()?,
}) })
.expect("Failed to send CopyTextureToBuffer"); .expect("Failed to send CopyTextureToBuffer");
@ -262,9 +261,9 @@ impl GPUCommandEncoderMethods for GPUCommandEncoder {
.0 .0
.send(WebGPURequest::CopyTextureToTexture { .send(WebGPURequest::CopyTextureToTexture {
command_encoder_id: self.encoder.0, command_encoder_id: self.encoder.0,
source: convert_ic_texture(source)?, source: source.try_into()?,
destination: convert_ic_texture(destination)?, destination: destination.try_into()?,
copy_size: convert_texture_size(&copy_size)?, copy_size: (&copy_size).try_into()?,
}) })
.expect("Failed to send CopyTextureToTexture"); .expect("Failed to send CopyTextureToTexture");

View file

@ -23,7 +23,8 @@ use crate::dom::bindings::codegen::Bindings::WebGPUBinding::{
use crate::dom::bindings::error::Fallible; use crate::dom::bindings::error::Fallible;
use crate::dom::types::GPUDevice; use crate::dom::types::GPUDevice;
pub fn convert_texture_format(format: GPUTextureFormat) -> wgt::TextureFormat { impl From<GPUTextureFormat> for wgt::TextureFormat {
fn from(format: GPUTextureFormat) -> Self {
match format { match format {
GPUTextureFormat::R8unorm => wgt::TextureFormat::R8Unorm, GPUTextureFormat::R8unorm => wgt::TextureFormat::R8Unorm,
GPUTextureFormat::R8snorm => wgt::TextureFormat::R8Snorm, GPUTextureFormat::R8snorm => wgt::TextureFormat::R8Snorm,
@ -205,22 +206,13 @@ pub fn convert_texture_format(format: GPUTextureFormat) -> wgt::TextureFormat {
channel: AstcChannel::UnormSrgb, channel: AstcChannel::UnormSrgb,
}, },
} }
}
pub fn convert_texture_view_dimension(
dimension: GPUTextureViewDimension,
) -> wgt::TextureViewDimension {
match dimension {
GPUTextureViewDimension::_1d => wgt::TextureViewDimension::D1,
GPUTextureViewDimension::_2d => wgt::TextureViewDimension::D2,
GPUTextureViewDimension::_2d_array => wgt::TextureViewDimension::D2Array,
GPUTextureViewDimension::Cube => wgt::TextureViewDimension::Cube,
GPUTextureViewDimension::Cube_array => wgt::TextureViewDimension::CubeArray,
GPUTextureViewDimension::_3d => wgt::TextureViewDimension::D3,
} }
} }
pub fn convert_texture_size(size: &GPUExtent3D) -> Fallible<wgt::Extent3d> { impl TryFrom<&GPUExtent3D> for wgt::Extent3d {
type Error = Error;
fn try_from(size: &GPUExtent3D) -> Result<Self, Self::Error> {
match *size { match *size {
GPUExtent3D::GPUExtent3DDict(ref dict) => Ok(wgt::Extent3d { GPUExtent3D::GPUExtent3DDict(ref dict) => Ok(wgt::Extent3d {
width: dict.width, width: dict.width,
@ -242,17 +234,21 @@ pub fn convert_texture_size(size: &GPUExtent3D) -> Fallible<wgt::Extent3d> {
} }
}, },
} }
}
} }
pub fn convert_image_data_layout(data_layout: &GPUImageDataLayout) -> wgt::ImageDataLayout { impl From<&GPUImageDataLayout> for wgt::ImageDataLayout {
fn from(data_layout: &GPUImageDataLayout) -> Self {
wgt::ImageDataLayout { wgt::ImageDataLayout {
offset: data_layout.offset as wgt::BufferAddress, offset: data_layout.offset as wgt::BufferAddress,
bytes_per_row: data_layout.bytesPerRow, bytes_per_row: data_layout.bytesPerRow,
rows_per_image: data_layout.rowsPerImage, rows_per_image: data_layout.rowsPerImage,
} }
}
} }
pub fn convert_vertex_format(format: GPUVertexFormat) -> wgt::VertexFormat { impl From<GPUVertexFormat> for wgt::VertexFormat {
fn from(format: GPUVertexFormat) -> Self {
match format { match format {
GPUVertexFormat::Uint8x2 => wgt::VertexFormat::Uint8x2, GPUVertexFormat::Uint8x2 => wgt::VertexFormat::Uint8x2,
GPUVertexFormat::Uint8x4 => wgt::VertexFormat::Uint8x4, GPUVertexFormat::Uint8x4 => wgt::VertexFormat::Uint8x4,
@ -285,17 +281,19 @@ pub fn convert_vertex_format(format: GPUVertexFormat) -> wgt::VertexFormat {
GPUVertexFormat::Sint32x3 => wgt::VertexFormat::Sint32x3, GPUVertexFormat::Sint32x3 => wgt::VertexFormat::Sint32x3,
GPUVertexFormat::Sint32x4 => wgt::VertexFormat::Sint32x4, GPUVertexFormat::Sint32x4 => wgt::VertexFormat::Sint32x4,
} }
}
} }
pub fn convert_primitive_state(primitive_state: &GPUPrimitiveState) -> wgt::PrimitiveState { impl From<&GPUPrimitiveState> for wgt::PrimitiveState {
fn from(primitive_state: &GPUPrimitiveState) -> Self {
wgt::PrimitiveState { wgt::PrimitiveState {
topology: convert_primitive_topology(&primitive_state.topology), topology: wgt::PrimitiveTopology::from(&primitive_state.topology),
strip_index_format: primitive_state.stripIndexFormat.map( strip_index_format: primitive_state.stripIndexFormat.map(|index_format| {
|index_format| match index_format { match index_format {
GPUIndexFormat::Uint16 => wgt::IndexFormat::Uint16, GPUIndexFormat::Uint16 => wgt::IndexFormat::Uint16,
GPUIndexFormat::Uint32 => wgt::IndexFormat::Uint32, GPUIndexFormat::Uint32 => wgt::IndexFormat::Uint32,
}, }
), }),
front_face: match primitive_state.frontFace { front_face: match primitive_state.frontFace {
GPUFrontFace::Ccw => wgt::FrontFace::Ccw, GPUFrontFace::Ccw => wgt::FrontFace::Ccw,
GPUFrontFace::Cw => wgt::FrontFace::Cw, GPUFrontFace::Cw => wgt::FrontFace::Cw,
@ -308,11 +306,11 @@ pub fn convert_primitive_state(primitive_state: &GPUPrimitiveState) -> wgt::Prim
unclipped_depth: primitive_state.clampDepth, unclipped_depth: primitive_state.clampDepth,
..Default::default() ..Default::default()
} }
}
} }
pub fn convert_primitive_topology( impl From<&GPUPrimitiveTopology> for wgt::PrimitiveTopology {
primitive_topology: &GPUPrimitiveTopology, fn from(primitive_topology: &GPUPrimitiveTopology) -> Self {
) -> wgt::PrimitiveTopology {
match primitive_topology { match primitive_topology {
GPUPrimitiveTopology::Point_list => wgt::PrimitiveTopology::PointList, GPUPrimitiveTopology::Point_list => wgt::PrimitiveTopology::PointList,
GPUPrimitiveTopology::Line_list => wgt::PrimitiveTopology::LineList, GPUPrimitiveTopology::Line_list => wgt::PrimitiveTopology::LineList,
@ -320,26 +318,30 @@ pub fn convert_primitive_topology(
GPUPrimitiveTopology::Triangle_list => wgt::PrimitiveTopology::TriangleList, GPUPrimitiveTopology::Triangle_list => wgt::PrimitiveTopology::TriangleList,
GPUPrimitiveTopology::Triangle_strip => wgt::PrimitiveTopology::TriangleStrip, GPUPrimitiveTopology::Triangle_strip => wgt::PrimitiveTopology::TriangleStrip,
} }
}
} }
pub fn convert_address_mode(address_mode: GPUAddressMode) -> wgt::AddressMode { impl From<GPUAddressMode> for wgt::AddressMode {
fn from(address_mode: GPUAddressMode) -> Self {
match address_mode { match address_mode {
GPUAddressMode::Clamp_to_edge => wgt::AddressMode::ClampToEdge, GPUAddressMode::Clamp_to_edge => wgt::AddressMode::ClampToEdge,
GPUAddressMode::Repeat => wgt::AddressMode::Repeat, GPUAddressMode::Repeat => wgt::AddressMode::Repeat,
GPUAddressMode::Mirror_repeat => wgt::AddressMode::MirrorRepeat, GPUAddressMode::Mirror_repeat => wgt::AddressMode::MirrorRepeat,
} }
}
} }
pub fn convert_filter_mode(filter_mode: GPUFilterMode) -> wgt::FilterMode { impl From<GPUFilterMode> for wgt::FilterMode {
fn from(filter_mode: GPUFilterMode) -> Self {
match filter_mode { match filter_mode {
GPUFilterMode::Nearest => wgt::FilterMode::Nearest, GPUFilterMode::Nearest => wgt::FilterMode::Nearest,
GPUFilterMode::Linear => wgt::FilterMode::Linear, GPUFilterMode::Linear => wgt::FilterMode::Linear,
} }
}
} }
pub fn convert_view_dimension( impl From<GPUTextureViewDimension> for wgt::TextureViewDimension {
view_dimension: GPUTextureViewDimension, fn from(view_dimension: GPUTextureViewDimension) -> Self {
) -> wgt::TextureViewDimension {
match view_dimension { match view_dimension {
GPUTextureViewDimension::_1d => wgt::TextureViewDimension::D1, GPUTextureViewDimension::_1d => wgt::TextureViewDimension::D1,
GPUTextureViewDimension::_2d => wgt::TextureViewDimension::D2, GPUTextureViewDimension::_2d => wgt::TextureViewDimension::D2,
@ -348,9 +350,11 @@ pub fn convert_view_dimension(
GPUTextureViewDimension::Cube_array => wgt::TextureViewDimension::CubeArray, GPUTextureViewDimension::Cube_array => wgt::TextureViewDimension::CubeArray,
GPUTextureViewDimension::_3d => wgt::TextureViewDimension::D3, GPUTextureViewDimension::_3d => wgt::TextureViewDimension::D3,
} }
}
} }
pub fn convert_compare_function(compare: GPUCompareFunction) -> wgt::CompareFunction { impl From<GPUCompareFunction> for wgt::CompareFunction {
fn from(compare: GPUCompareFunction) -> Self {
match compare { match compare {
GPUCompareFunction::Never => wgt::CompareFunction::Never, GPUCompareFunction::Never => wgt::CompareFunction::Never,
GPUCompareFunction::Less => wgt::CompareFunction::Less, GPUCompareFunction::Less => wgt::CompareFunction::Less,
@ -361,9 +365,11 @@ pub fn convert_compare_function(compare: GPUCompareFunction) -> wgt::CompareFunc
GPUCompareFunction::Greater_equal => wgt::CompareFunction::GreaterEqual, GPUCompareFunction::Greater_equal => wgt::CompareFunction::GreaterEqual,
GPUCompareFunction::Always => wgt::CompareFunction::Always, GPUCompareFunction::Always => wgt::CompareFunction::Always,
} }
}
} }
pub fn convert_blend_factor(factor: &GPUBlendFactor) -> wgt::BlendFactor { impl From<&GPUBlendFactor> for wgt::BlendFactor {
fn from(factor: &GPUBlendFactor) -> Self {
match factor { match factor {
GPUBlendFactor::Zero => wgt::BlendFactor::Zero, GPUBlendFactor::Zero => wgt::BlendFactor::Zero,
GPUBlendFactor::One => wgt::BlendFactor::One, GPUBlendFactor::One => wgt::BlendFactor::One,
@ -379,12 +385,14 @@ pub fn convert_blend_factor(factor: &GPUBlendFactor) -> wgt::BlendFactor {
GPUBlendFactor::Constant => wgt::BlendFactor::Constant, GPUBlendFactor::Constant => wgt::BlendFactor::Constant,
GPUBlendFactor::One_minus_constant => wgt::BlendFactor::OneMinusConstant, GPUBlendFactor::One_minus_constant => wgt::BlendFactor::OneMinusConstant,
} }
}
} }
pub fn convert_blend_component(blend_component: &GPUBlendComponent) -> wgt::BlendComponent { impl From<&GPUBlendComponent> for wgt::BlendComponent {
fn from(blend_component: &GPUBlendComponent) -> Self {
wgt::BlendComponent { wgt::BlendComponent {
src_factor: convert_blend_factor(&blend_component.srcFactor), src_factor: wgt::BlendFactor::from(&blend_component.srcFactor),
dst_factor: convert_blend_factor(&blend_component.dstFactor), dst_factor: wgt::BlendFactor::from(&blend_component.dstFactor),
operation: match blend_component.operation { operation: match blend_component.operation {
GPUBlendOperation::Add => wgt::BlendOperation::Add, GPUBlendOperation::Add => wgt::BlendOperation::Add,
GPUBlendOperation::Subtract => wgt::BlendOperation::Subtract, GPUBlendOperation::Subtract => wgt::BlendOperation::Subtract,
@ -393,6 +401,7 @@ pub fn convert_blend_component(blend_component: &GPUBlendComponent) -> wgt::Blen
GPUBlendOperation::Max => wgt::BlendOperation::Max, GPUBlendOperation::Max => wgt::BlendOperation::Max,
}, },
} }
}
} }
pub fn convert_load_op(op: Option<GPULoadOp>) -> wgpu_com::LoadOp { pub fn convert_load_op(op: Option<GPULoadOp>) -> wgpu_com::LoadOp {
@ -411,7 +420,8 @@ pub fn convert_store_op(op: Option<GPUStoreOp>) -> wgpu_com::StoreOp {
} }
} }
pub fn convert_stencil_op(operation: GPUStencilOperation) -> wgt::StencilOperation { impl From<GPUStencilOperation> for wgt::StencilOperation {
fn from(operation: GPUStencilOperation) -> Self {
match operation { match operation {
GPUStencilOperation::Keep => wgt::StencilOperation::Keep, GPUStencilOperation::Keep => wgt::StencilOperation::Keep,
GPUStencilOperation::Zero => wgt::StencilOperation::Zero, GPUStencilOperation::Zero => wgt::StencilOperation::Zero,
@ -422,16 +432,22 @@ pub fn convert_stencil_op(operation: GPUStencilOperation) -> wgt::StencilOperati
GPUStencilOperation::Increment_wrap => wgt::StencilOperation::IncrementWrap, GPUStencilOperation::Increment_wrap => wgt::StencilOperation::IncrementWrap,
GPUStencilOperation::Decrement_wrap => wgt::StencilOperation::DecrementWrap, GPUStencilOperation::Decrement_wrap => wgt::StencilOperation::DecrementWrap,
} }
}
pub fn convert_ic_buffer(ic_buffer: &GPUImageCopyBuffer) -> wgpu_com::ImageCopyBuffer {
wgpu_com::ImageCopyBuffer {
buffer: ic_buffer.buffer.id().0,
layout: convert_image_data_layout(&ic_buffer.parent),
} }
} }
pub fn convert_origin3d(origin: &GPUOrigin3D) -> Fallible<wgt::Origin3d> { impl From<&GPUImageCopyBuffer> for wgpu_com::ImageCopyBuffer {
fn from(ic_buffer: &GPUImageCopyBuffer) -> Self {
wgpu_com::ImageCopyBuffer {
buffer: ic_buffer.buffer.id().0,
layout: wgt::ImageDataLayout::from(&ic_buffer.parent),
}
}
}
impl TryFrom<&GPUOrigin3D> for wgt::Origin3d {
type Error = Error;
fn try_from(origin: &GPUOrigin3D) -> Result<Self, Self::Error> {
match origin { match origin {
GPUOrigin3D::RangeEnforcedUnsignedLongSequence(v) => { GPUOrigin3D::RangeEnforcedUnsignedLongSequence(v) => {
// https://gpuweb.github.io/gpuweb/#abstract-opdef-validate-gpuorigin3d-shape // https://gpuweb.github.io/gpuweb/#abstract-opdef-validate-gpuorigin3d-shape
@ -453,18 +469,20 @@ pub fn convert_origin3d(origin: &GPUOrigin3D) -> Fallible<wgt::Origin3d> {
z: d.z, z: d.z,
}), }),
} }
}
} }
pub fn convert_ic_texture( impl TryFrom<&GPUImageCopyTexture> for wgpu_com::ImageCopyTexture {
ic_texture: &GPUImageCopyTexture, type Error = Error;
) -> Fallible<wgpu_com::ImageCopyTexture> {
fn try_from(ic_texture: &GPUImageCopyTexture) -> Result<Self, Self::Error> {
Ok(wgpu_com::ImageCopyTexture { Ok(wgpu_com::ImageCopyTexture {
texture: ic_texture.texture.id().0, texture: ic_texture.texture.id().0,
mip_level: ic_texture.mipLevel, mip_level: ic_texture.mipLevel,
origin: ic_texture origin: ic_texture
.origin .origin
.as_ref() .as_ref()
.map(|origin| convert_origin3d(origin)) .map(|origin| wgt::Origin3d::try_from(origin))
.transpose()? .transpose()?
.unwrap_or_default(), .unwrap_or_default(),
aspect: match ic_texture.aspect { aspect: match ic_texture.aspect {
@ -473,6 +491,7 @@ pub fn convert_ic_texture(
GPUTextureAspect::Depth_only => wgt::TextureAspect::DepthOnly, GPUTextureAspect::Depth_only => wgt::TextureAspect::DepthOnly,
}, },
}) })
}
} }
pub fn convert_label<'a>(parent: &GPUObjectDescriptorBase) -> Option<Cow<'a, str>> { pub fn convert_label<'a>(parent: &GPUObjectDescriptorBase) -> Option<Cow<'a, str>> {
@ -519,7 +538,7 @@ pub fn convert_bind_group_layout_entry(
GPUStorageTextureAccess::Read_write => wgt::StorageTextureAccess::ReadWrite, GPUStorageTextureAccess::Read_write => wgt::StorageTextureAccess::ReadWrite,
}, },
format: device.validate_texture_format_required_features(&storage.format)?, format: device.validate_texture_format_required_features(&storage.format)?,
view_dimension: convert_view_dimension(storage.viewDimension), view_dimension: storage.viewDimension.into(),
}) })
} else if let Some(texture) = &bgle.texture { } else if let Some(texture) = &bgle.texture {
Some(wgt::BindingType::Texture { Some(wgt::BindingType::Texture {
@ -532,7 +551,7 @@ pub fn convert_bind_group_layout_entry(
GPUTextureSampleType::Sint => wgt::TextureSampleType::Sint, GPUTextureSampleType::Sint => wgt::TextureSampleType::Sint,
GPUTextureSampleType::Uint => wgt::TextureSampleType::Uint, GPUTextureSampleType::Uint => wgt::TextureSampleType::Uint,
}, },
view_dimension: convert_view_dimension(texture.viewDimension), view_dimension: texture.viewDimension.into(),
multisampled: texture.multisampled, multisampled: texture.multisampled,
}) })
} else { } else {
@ -558,7 +577,10 @@ pub fn convert_bind_group_layout_entry(
})) }))
} }
pub fn convert_color(color: &GPUColor) -> Fallible<wgt::Color> { impl TryFrom<&GPUColor> for wgt::Color {
type Error = Error;
fn try_from(color: &GPUColor) -> Result<Self, Self::Error> {
match color { match color {
GPUColor::DoubleSequence(s) => { GPUColor::DoubleSequence(s) => {
// https://gpuweb.github.io/gpuweb/#abstract-opdef-validate-gpucolor-shape // https://gpuweb.github.io/gpuweb/#abstract-opdef-validate-gpucolor-shape
@ -580,6 +602,7 @@ pub fn convert_color(color: &GPUColor) -> Fallible<wgt::Color> {
a: *d.a, a: *d.a,
}), }),
} }
}
} }
impl<'a> From<&GPUProgrammableStage> for ProgrammableStageDescriptor<'a> { impl<'a> From<&GPUProgrammableStage> for ProgrammableStageDescriptor<'a> {

View file

@ -15,7 +15,7 @@ use webgpu::wgc::pipeline::RenderPipelineDescriptor;
use webgpu::wgc::{ use webgpu::wgc::{
binding_model as wgpu_bind, command as wgpu_com, pipeline as wgpu_pipe, resource as wgpu_res, binding_model as wgpu_bind, command as wgpu_com, pipeline as wgpu_pipe, resource as wgpu_res,
}; };
use webgpu::wgt::TextureFormat; use webgpu::wgt::{BlendComponent, TextureFormat};
use webgpu::{ use webgpu::{
self, wgt, PopError, WebGPU, WebGPUComputePipeline, WebGPURenderPipeline, WebGPURequest, self, wgt, PopError, WebGPU, WebGPUComputePipeline, WebGPURenderPipeline, WebGPURequest,
WebGPUResponse, WebGPUResponse,
@ -57,11 +57,7 @@ use crate::dom::gpubindgrouplayout::GPUBindGroupLayout;
use crate::dom::gpubuffer::{ActiveBufferMapping, GPUBuffer}; use crate::dom::gpubuffer::{ActiveBufferMapping, GPUBuffer};
use crate::dom::gpucommandencoder::GPUCommandEncoder; use crate::dom::gpucommandencoder::GPUCommandEncoder;
use crate::dom::gpucomputepipeline::GPUComputePipeline; use crate::dom::gpucomputepipeline::GPUComputePipeline;
use crate::dom::gpuconvert::{ use crate::dom::gpuconvert::convert_label;
convert_address_mode, convert_blend_component, convert_compare_function, convert_filter_mode,
convert_label, convert_primitive_state, convert_stencil_op, convert_texture_format,
convert_texture_size, convert_vertex_format,
};
use crate::dom::gpupipelinelayout::GPUPipelineLayout; use crate::dom::gpupipelinelayout::GPUPipelineLayout;
use crate::dom::gpuqueue::GPUQueue; use crate::dom::gpuqueue::GPUQueue;
use crate::dom::gpurenderbundleencoder::GPURenderBundleEncoder; use crate::dom::gpurenderbundleencoder::GPURenderBundleEncoder;
@ -197,7 +193,7 @@ impl GPUDevice {
&self, &self,
format: &GPUTextureFormat, format: &GPUTextureFormat,
) -> Fallible<TextureFormat> { ) -> Fallible<TextureFormat> {
let texture_format = convert_texture_format(*format); let texture_format: TextureFormat = (*format).into();
if self if self
.features .features
.wgpu_features() .wgpu_features()
@ -276,7 +272,7 @@ impl GPUDevice {
.attributes .attributes
.iter() .iter()
.map(|att| wgt::VertexAttribute { .map(|att| wgt::VertexAttribute {
format: convert_vertex_format(att.format), format: att.format.into(),
offset: att.offset, offset: att.offset,
shader_location: att.shaderLocation, shader_location: att.shaderLocation,
}) })
@ -306,12 +302,8 @@ impl GPUDevice {
), ),
blend: state.blend.as_ref().map(|blend| { blend: state.blend.as_ref().map(|blend| {
wgt::BlendState { wgt::BlendState {
color: convert_blend_component( color: (&blend.color).into(),
&blend.color, alpha: (&blend.alpha).into(),
),
alpha: convert_blend_component(
&blend.alpha,
),
} }
}), }),
}) })
@ -322,7 +314,7 @@ impl GPUDevice {
}) })
}) })
.transpose()?, .transpose()?,
primitive: convert_primitive_state(&descriptor.primitive), primitive: (&descriptor.primitive).into(),
depth_stencil: descriptor depth_stencil: descriptor
.depthStencil .depthStencil
.as_ref() .as_ref()
@ -331,25 +323,20 @@ impl GPUDevice {
.map(|format| wgt::DepthStencilState { .map(|format| wgt::DepthStencilState {
format, format,
depth_write_enabled: dss_desc.depthWriteEnabled, depth_write_enabled: dss_desc.depthWriteEnabled,
depth_compare: convert_compare_function(dss_desc.depthCompare), depth_compare: dss_desc.depthCompare.into(),
stencil: wgt::StencilState { stencil: wgt::StencilState {
front: wgt::StencilFaceState { front: wgt::StencilFaceState {
compare: convert_compare_function( compare: dss_desc.stencilFront.compare.into(),
dss_desc.stencilFront.compare,
), fail_op: dss_desc.stencilFront.failOp.into(),
fail_op: convert_stencil_op(dss_desc.stencilFront.failOp), depth_fail_op: dss_desc.stencilFront.depthFailOp.into(),
depth_fail_op: convert_stencil_op( pass_op: dss_desc.stencilFront.passOp.into(),
dss_desc.stencilFront.depthFailOp,
),
pass_op: convert_stencil_op(dss_desc.stencilFront.passOp),
}, },
back: wgt::StencilFaceState { back: wgt::StencilFaceState {
compare: convert_compare_function(dss_desc.stencilBack.compare), compare: dss_desc.stencilBack.compare.into(),
fail_op: convert_stencil_op(dss_desc.stencilBack.failOp), fail_op: dss_desc.stencilBack.failOp.into(),
depth_fail_op: convert_stencil_op( depth_fail_op: dss_desc.stencilBack.depthFailOp.into(),
dss_desc.stencilBack.depthFailOp, pass_op: dss_desc.stencilBack.passOp.into(),
),
pass_op: convert_stencil_op(dss_desc.stencilBack.passOp),
}, },
read_mask: dss_desc.stencilReadMask, read_mask: dss_desc.stencilReadMask,
write_mask: dss_desc.stencilWriteMask, write_mask: dss_desc.stencilWriteMask,
@ -742,7 +729,7 @@ impl GPUDeviceMethods for GPUDevice {
/// <https://gpuweb.github.io/gpuweb/#dom-gpudevice-createtexture> /// <https://gpuweb.github.io/gpuweb/#dom-gpudevice-createtexture>
fn CreateTexture(&self, descriptor: &GPUTextureDescriptor) -> Fallible<DomRoot<GPUTexture>> { fn CreateTexture(&self, descriptor: &GPUTextureDescriptor) -> Fallible<DomRoot<GPUTexture>> {
let size = convert_texture_size(&descriptor.size)?; let size = (&descriptor.size).try_into()?;
let desc = wgpu_res::TextureDescriptor { let desc = wgpu_res::TextureDescriptor {
label: convert_label(&descriptor.parent), label: convert_label(&descriptor.parent),
size, size,
@ -803,16 +790,18 @@ impl GPUDeviceMethods for GPUDevice {
let desc = wgpu_res::SamplerDescriptor { let desc = wgpu_res::SamplerDescriptor {
label: convert_label(&descriptor.parent), label: convert_label(&descriptor.parent),
address_modes: [ address_modes: [
convert_address_mode(descriptor.addressModeU), descriptor.addressModeU.into(),
convert_address_mode(descriptor.addressModeV), descriptor.addressModeV.into(),
convert_address_mode(descriptor.addressModeW), descriptor.addressModeW.into(),
], ],
mag_filter: convert_filter_mode(descriptor.magFilter), mag_filter: descriptor.magFilter.into(),
min_filter: convert_filter_mode(descriptor.minFilter), min_filter: descriptor.minFilter.into(),
mipmap_filter: convert_filter_mode(descriptor.mipmapFilter), mipmap_filter: descriptor.mipmapFilter.into(),
lod_min_clamp: *descriptor.lodMinClamp, lod_min_clamp: *descriptor.lodMinClamp,
lod_max_clamp: *descriptor.lodMaxClamp, lod_max_clamp: *descriptor.lodMaxClamp,
compare: descriptor.compare.map(convert_compare_function), compare: descriptor
.compare
.map(|gpu_compare_function| gpu_compare_function.into()),
anisotropy_clamp: 1, anisotropy_clamp: 1,
border_color: None, border_color: None,
}; };

View file

@ -6,6 +6,7 @@ use std::rc::Rc;
use dom_struct::dom_struct; use dom_struct::dom_struct;
use ipc_channel::ipc::IpcSharedMemory; use ipc_channel::ipc::IpcSharedMemory;
use webgpu::wgt::Extent3d;
use webgpu::{wgt, WebGPU, WebGPUQueue, WebGPURequest, WebGPUResponse}; use webgpu::{wgt, WebGPU, WebGPUQueue, WebGPURequest, WebGPUResponse};
use super::bindings::codegen::Bindings::WebGPUBinding::{GPUImageCopyTexture, GPUImageDataLayout}; use super::bindings::codegen::Bindings::WebGPUBinding::{GPUImageCopyTexture, GPUImageDataLayout};
@ -22,7 +23,6 @@ use crate::dom::bindings::str::USVString;
use crate::dom::globalscope::GlobalScope; use crate::dom::globalscope::GlobalScope;
use crate::dom::gpubuffer::GPUBuffer; use crate::dom::gpubuffer::GPUBuffer;
use crate::dom::gpucommandbuffer::GPUCommandBuffer; use crate::dom::gpucommandbuffer::GPUCommandBuffer;
use crate::dom::gpuconvert::{convert_ic_texture, convert_image_data_layout, convert_texture_size};
use crate::dom::gpudevice::GPUDevice; use crate::dom::gpudevice::GPUDevice;
use crate::dom::promise::Promise; use crate::dom::promise::Promise;
@ -163,9 +163,9 @@ impl GPUQueueMethods for GPUQueue {
return Err(Error::Operation); return Err(Error::Operation);
} }
let texture_cv = convert_ic_texture(destination)?; let texture_cv = destination.try_into()?;
let texture_layout = convert_image_data_layout(data_layout); let texture_layout = data_layout.into();
let write_size = convert_texture_size(&size)?; let write_size = (&size).try_into()?;
let final_data = IpcSharedMemory::from_bytes(&bytes); let final_data = IpcSharedMemory::from_bytes(&bytes);
if let Err(e) = self.channel.0.send(WebGPURequest::WriteTexture { if let Err(e) = self.channel.0.send(WebGPURequest::WriteTexture {

View file

@ -19,7 +19,6 @@ use crate::dom::globalscope::GlobalScope;
use crate::dom::gpubindgroup::GPUBindGroup; use crate::dom::gpubindgroup::GPUBindGroup;
use crate::dom::gpubuffer::GPUBuffer; use crate::dom::gpubuffer::GPUBuffer;
use crate::dom::gpucommandencoder::GPUCommandEncoder; use crate::dom::gpucommandencoder::GPUCommandEncoder;
use crate::dom::gpuconvert::convert_color;
use crate::dom::gpurenderbundle::GPURenderBundle; use crate::dom::gpurenderbundle::GPURenderBundle;
use crate::dom::gpurenderpipeline::GPURenderPipeline; use crate::dom::gpurenderpipeline::GPURenderPipeline;
@ -132,7 +131,7 @@ impl GPURenderPassEncoderMethods for GPURenderPassEncoder {
/// <https://gpuweb.github.io/gpuweb/#dom-gpurenderpassencoder-setblendcolor> /// <https://gpuweb.github.io/gpuweb/#dom-gpurenderpassencoder-setblendcolor>
fn SetBlendConstant(&self, color: GPUColor) -> Fallible<()> { fn SetBlendConstant(&self, color: GPUColor) -> Fallible<()> {
self.send_render_command(RenderCommand::SetBlendConstant(convert_color(&color)?)); self.send_render_command(RenderCommand::SetBlendConstant((&color).try_into()?));
Ok(()) Ok(())
} }

View file

@ -19,7 +19,7 @@ use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector};
use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::bindings::str::USVString; use crate::dom::bindings::str::USVString;
use crate::dom::globalscope::GlobalScope; use crate::dom::globalscope::GlobalScope;
use crate::dom::gpuconvert::{convert_label, convert_texture_view_dimension}; use crate::dom::gpuconvert::convert_label;
use crate::dom::gpudevice::GPUDevice; use crate::dom::gpudevice::GPUDevice;
use crate::dom::gputextureview::GPUTextureView; use crate::dom::gputextureview::GPUTextureView;
@ -155,7 +155,7 @@ impl GPUTextureMethods for GPUTexture {
.format .format
.map(|f| self.device.validate_texture_format_required_features(&f)) .map(|f| self.device.validate_texture_format_required_features(&f))
.transpose()?, .transpose()?,
dimension: descriptor.dimension.map(convert_texture_view_dimension), dimension: descriptor.dimension.map(|dimension| dimension.into()),
range: wgt::ImageSubresourceRange { range: wgt::ImageSubresourceRange {
aspect: match descriptor.aspect { aspect: match descriptor.aspect {
GPUTextureAspect::All => wgt::TextureAspect::All, GPUTextureAspect::All => wgt::TextureAspect::All,