use super::interop::{
BindGroupId, BindGroupLayoutId, BufferId, CanvasId, ContextId, DeviceId, FutureId,
FutureStatus, ImageSourceId, JsBindGroupEntry, JsBindGroupLayoutEntry, JsRenderPassDescriptor,
JsRenderPipelineDescriptor, JsSamplerDescriptor, RenderPassId, RenderPipelineId, SamplerId,
ShaderId, Slice, TextureId,
};
use super::primitive::{WebGL2Features, WebGLContextAttribute};
use crate::descriptor::{BufferDescriptor, ImageDataLayout, TextureDescriptor};
use crate::primitive::{
BufferSize, Color, Extent2D, Extent3D, MipmapHint, Origin2D, Origin3D, ShaderStage,
};
#[cfg(feature = "wasm-bindgen")]
#[wasm_bindgen::prelude::wasm_bindgen(module = "mugl/wasm")]
extern "C" {
#[wasm_bindgen]
pub fn set_context_memory(context: f64, memory: wasm_bindgen::JsValue);
}
#[link(wasm_import_module = "mugl/wasm")]
extern "C" {
pub fn get_future_status(future: FutureId) -> FutureStatus;
pub fn create_image(context: ContextId, uri: Slice) -> ImageSourceId;
pub fn get_image_by_id(context: ContextId, id: Slice) -> ImageSourceId;
pub fn delete_image(image: ImageSourceId);
pub fn get_image_width(image: ImageSourceId) -> u32;
pub fn get_image_height(image: ImageSourceId) -> u32;
pub fn get_canvas_by_id(context: ContextId, id: Slice) -> CanvasId;
pub fn get_canvas_width(canvas: CanvasId) -> u32;
pub fn get_canvas_height(canvas: CanvasId) -> u32;
pub fn webgl_request_device(
canvas: CanvasId,
desc: WebGLContextAttribute,
features: WebGL2Features,
) -> DeviceId;
pub fn webgl_generate_mipmap(device: DeviceId, texture: TextureId, hint: MipmapHint);
pub fn reset_device(device: DeviceId);
pub fn delete_device(device: DeviceId);
pub fn is_device_lost(device: DeviceId) -> bool;
pub fn get_device_features(device: DeviceId) -> u32;
pub fn create_buffer(device: DeviceId, descriptor: BufferDescriptor) -> BufferId;
pub fn delete_buffer(buffer: BufferId);
pub fn create_texture(device: DeviceId, descriptor: TextureDescriptor) -> TextureId;
pub fn delete_texture(texture: TextureId);
pub fn create_sampler(device: DeviceId, descriptor: JsSamplerDescriptor) -> SamplerId;
pub fn delete_sampler(sampler: SamplerId);
pub fn create_shader(device: DeviceId, code: Slice, usage: ShaderStage) -> ShaderId;
pub fn delete_shader(shader: ShaderId);
pub fn create_bind_group(
device: DeviceId,
layout: BindGroupLayoutId,
entries: Slice<JsBindGroupEntry>,
) -> BindGroupId;
pub fn delete_bind_group(bind_group: BindGroupId);
pub fn create_bind_group_layout(
device: DeviceId,
entries: Slice<JsBindGroupLayoutEntry>,
) -> BindGroupLayoutId;
pub fn delete_bind_group_layout(bind_group_layout: BindGroupLayoutId);
pub fn create_render_pipeline(
device: DeviceId,
descriptor: JsRenderPipelineDescriptor,
) -> RenderPipelineId;
pub fn delete_render_pipeline(pipeline: RenderPipelineId);
pub fn create_render_pass(device: DeviceId, descriptor: JsRenderPassDescriptor)
-> RenderPassId;
pub fn delete_render_pass(pass: RenderPassId);
pub fn read_buffer(
device: DeviceId,
src: BufferId,
src_offset: BufferSize,
out: Slice,
) -> FutureId;
pub fn write_buffer(device: DeviceId, buffer: BufferId, data: Slice, offset: BufferSize);
pub fn copy_buffer(
device: DeviceId,
src: BufferId,
dst: BufferId,
size: BufferSize,
src_offset: BufferSize,
dst_offset: BufferSize,
);
pub fn write_texture(
device: DeviceId,
texture: TextureId,
mip_level: u32,
origin: Origin3D,
data: Slice,
layout: ImageDataLayout,
size: Extent3D,
);
pub fn copy_texture(
device: DeviceId,
src: TextureId,
src_mip_level: u32,
src_origin: Origin3D,
dst: TextureId,
dst_mip_evel: u32,
dst_origin: Origin3D,
size: Extent3D,
);
pub fn copy_texture_to_buffer(
device: DeviceId,
src: TextureId,
src_mip_level: u32,
src_origin: Origin3D,
dst: BufferId,
layout: ImageDataLayout,
size: Extent3D,
);
pub fn copy_external_image_to_texture(
device: DeviceId,
src: ImageSourceId,
src_origin: Origin2D,
dst: TextureId,
dst_mip_level: u32,
dst_origin: Origin3D,
size: Extent2D,
);
pub fn begin_render_pass(device: DeviceId, pass: RenderPassId);
pub fn submit_render_pass(device: DeviceId);
pub fn set_render_pipeline(device: DeviceId, pipeline: RenderPipelineId);
pub fn set_index(device: DeviceId, buffer: BufferId);
pub fn set_vertex(device: DeviceId, slot: u32, buffer: BufferId, offset: BufferSize);
pub fn set_bind_group(
device: DeviceId,
slot: u32,
bind_group: BindGroupId,
offsets: Slice<u32>,
);
pub fn draw(
device: DeviceId,
vertex_count: u32,
instance_count: u32,
firstvertex: u32,
first_instance: u32,
);
pub fn draw_indexed(
device: DeviceId,
index_count: u32,
instance_count: u32,
first_index: u32,
first_instance: u32,
);
pub fn set_viewport(
device: DeviceId,
x: u32,
y: u32,
width: u32,
height: u32,
min_depth: f32,
max_depth: f32,
);
pub fn set_scissor_rect(device: DeviceId, x: u32, y: u32, width: u32, height: u32);
pub fn set_blend_const(device: DeviceId, color: Color<f32>);
pub fn set_stencil_ref(device: DeviceId, reference: u32);
}