Skip to content

Commit be20391

Browse files
committed
feat: webgl2
1 parent b05d799 commit be20391

File tree

29 files changed

+7748
-2856
lines changed

29 files changed

+7748
-2856
lines changed

crates/canvas-c/src/webgl/gl.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1279,6 +1279,20 @@ pub extern "C" fn canvas_native_webgl_result_get_bool_array(
12791279
})))
12801280
}
12811281

1282+
#[no_mangle]
1283+
pub extern "C" fn canvas_native_webgl_result_into_bool_array(
1284+
result: *mut WebGLResult,
1285+
) -> Vec<bool> {
1286+
if result.is_null() {
1287+
return Vec::new();
1288+
}
1289+
let result = unsafe { *Box::from_raw(result) };
1290+
match result.0 {
1291+
canvas_webgl::prelude::WebGLResult::BooleanArray(value) => value,
1292+
_ => Vec::new(),
1293+
}
1294+
}
1295+
12821296
#[no_mangle]
12831297
pub extern "C" fn canvas_native_webgl_result_get_u32(result: *const WebGLResult) -> u32 {
12841298
let result = unsafe { &*result };

crates/canvas-c/src/webgl/gl2.rs

Lines changed: 186 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
use std::ffi::{CStr, CString};
2-
use std::os::raw::{c_char, c_ulong, c_void};
3-
use canvas_webgl::utils;
4-
use canvas_webgl::utils::gl::bytes_per_pixel;
51
use crate::buffers::U32Buffer;
62
use crate::c2d::CanvasRenderingContext2D;
73
use crate::image_asset::ImageAsset;
8-
use crate::ImageData;
94
use crate::webgl::gl::{WebGLActiveInfo, WebGLResult, WebGLState};
5+
use crate::ImageData;
6+
use canvas_webgl::utils;
7+
use canvas_webgl::utils::gl::bytes_per_pixel;
8+
use std::ffi::{CStr, CString};
9+
use std::os::raw::{c_char, c_ulong, c_void};
1010

1111
pub struct WebGLSync(canvas_webgl::webgl2::GLSync);
1212

@@ -258,6 +258,69 @@ pub extern "C" fn canvas_native_webgl2_client_wait_sync(
258258
)
259259
}
260260

261+
#[no_mangle]
262+
pub extern "C" fn canvas_native_webgl2_compressed_tex_image3d_none(
263+
target: u32,
264+
level: i32,
265+
internalformat: u32,
266+
width: i32,
267+
height: i32,
268+
depth: i32,
269+
border: i32,
270+
image_size: i32,
271+
offset: usize,
272+
state: *mut WebGLState,
273+
) {
274+
assert!(!state.is_null());
275+
let state = unsafe { &mut *state };
276+
canvas_webgl::webgl2::canvas_native_webgl2_compressed_tex_image3d_none(
277+
target,
278+
level,
279+
internalformat,
280+
width,
281+
height,
282+
depth,
283+
border,
284+
image_size,
285+
offset,
286+
state.get_inner_mut(),
287+
)
288+
}
289+
290+
#[no_mangle]
291+
pub extern "C" fn canvas_native_webgl2_compressed_tex_image3d(
292+
target: u32,
293+
level: i32,
294+
internalformat: u32,
295+
width: i32,
296+
height: i32,
297+
depth: i32,
298+
border: i32,
299+
src: *const u8,
300+
size: usize,
301+
src_offset: usize,
302+
src_length_override: usize,
303+
state: *mut WebGLState,
304+
) {
305+
assert!(!state.is_null());
306+
let src = unsafe { std::slice::from_raw_parts(src, size) };
307+
let state = unsafe { &mut *state };
308+
canvas_webgl::webgl2::canvas_native_webgl2_compressed_tex_image3d(
309+
target,
310+
level,
311+
internalformat,
312+
width,
313+
height,
314+
depth,
315+
border,
316+
src,
317+
src_offset,
318+
src_length_override,
319+
state.get_inner_mut(),
320+
)
321+
}
322+
323+
261324
#[no_mangle]
262325
pub extern "C" fn canvas_native_webgl2_compressed_tex_sub_image3d_none(
263326
target: u32,
@@ -270,7 +333,7 @@ pub extern "C" fn canvas_native_webgl2_compressed_tex_sub_image3d_none(
270333
depth: i32,
271334
format: u32,
272335
image_size: i32,
273-
offset: i32,
336+
offset: usize,
274337
state: *mut WebGLState,
275338
) {
276339
assert!(!state.is_null());
@@ -426,6 +489,15 @@ pub extern "C" fn canvas_native_webgl2_delete_sampler_with_sampler(
426489
)
427490
}
428491

492+
#[no_mangle]
493+
pub extern "C" fn canvas_native_webgl2_sync_destroy(
494+
sync: *const WebGLSync,
495+
) {
496+
if !sync.is_null() {
497+
let _ = unsafe { Box::from_raw(sync as *mut WebGLSync) };
498+
}
499+
}
500+
429501
#[no_mangle]
430502
pub extern "C" fn canvas_native_webgl2_delete_sync_with_sync(
431503
sync: *const WebGLSync,
@@ -1104,7 +1176,6 @@ pub extern "C" fn canvas_native_webgl2_tex_image3d_canvas2d(
11041176
let canvas = unsafe { &mut *canvas };
11051177

11061178

1107-
11081179
// let (width, height) = (canvas.context.width(), canvas.context.height());
11091180
// let snapshot = canvas.context.as_data();
11101181

@@ -1138,6 +1209,57 @@ pub extern "C" fn canvas_native_webgl2_tex_image3d_canvas2d(
11381209
)
11391210
}
11401211

1212+
1213+
#[no_mangle]
1214+
pub extern "C" fn canvas_native_webgl2_tex_image3d_webgl(
1215+
target: u32,
1216+
level: i32,
1217+
internalformat: i32,
1218+
_width: i32,
1219+
_height: i32,
1220+
depth: i32,
1221+
border: i32,
1222+
format: u32,
1223+
type_: u32,
1224+
webgl: *mut WebGLState,
1225+
state: *mut WebGLState,
1226+
) {
1227+
assert!(!state.is_null());
1228+
assert!(!webgl.is_null());
1229+
let state = unsafe { &mut *state };
1230+
let webgl = unsafe { &mut *webgl };
1231+
1232+
1233+
1234+
let (width, height, bytes) = canvas_webgl::webgl::canvas_native_webgl_read_webgl_pixels(
1235+
&mut webgl.0,
1236+
&mut state.0,
1237+
internalformat,
1238+
format as i32,
1239+
);
1240+
1241+
// todo handle pre-multipied
1242+
// let premultiply = state.get_inner().get_premultiplied_alpha();
1243+
1244+
// let buf = source_ctx.read_pixels_with_alpha_premultiply(&snapshot, format as i32, premultiply);
1245+
1246+
state.0.make_current();
1247+
1248+
canvas_webgl::webgl2::canvas_native_webgl2_tex_image3d(
1249+
target,
1250+
level,
1251+
internalformat,
1252+
width as i32,
1253+
height as i32,
1254+
depth,
1255+
border,
1256+
format,
1257+
type_,
1258+
bytes.as_slice(),
1259+
state.get_inner_mut(),
1260+
)
1261+
}
1262+
11411263
#[no_mangle]
11421264
pub extern "C" fn canvas_native_webgl2_tex_image3d(
11431265
target: u32,
@@ -1404,6 +1526,59 @@ pub extern "C" fn canvas_native_webgl2_tex_sub_image3d_canvas2d(
14041526
);
14051527
}
14061528

1529+
#[no_mangle]
1530+
pub extern "C" fn canvas_native_webgl2_tex_sub_image3d_webgl(
1531+
target: u32,
1532+
level: i32,
1533+
xoffset: i32,
1534+
yoffset: i32,
1535+
zoffset: i32,
1536+
_width: i32,
1537+
_height: i32,
1538+
depth: i32,
1539+
format: u32,
1540+
type_: u32,
1541+
webgl: *mut WebGLState,
1542+
state: *mut WebGLState,
1543+
) {
1544+
assert!(!state.is_null());
1545+
let state = unsafe { &mut *state };
1546+
let webgl = unsafe { &mut *webgl };
1547+
1548+
let (width, height, bytes) = canvas_webgl::webgl::canvas_native_webgl_read_webgl_pixels(
1549+
&mut webgl.0,
1550+
&mut state.0,
1551+
gl_bindings::RGBA as _,
1552+
gl_bindings::RGBA as _,
1553+
);
1554+
1555+
1556+
// canvas.make_current();
1557+
// let (width, height) = (canvas.context.width(), canvas.context.height());
1558+
// let data = canvas.context.as_data();
1559+
1560+
// let premultiply = state.get_inner().get_premultiplied_alpha();
1561+
1562+
// let buf = source_ctx.read_pixels_with_alpha_premultiply(&snapshot, format as i32, premultiply);
1563+
1564+
state.0.make_current();
1565+
1566+
canvas_webgl::webgl2::canvas_native_webgl2_tex_sub_image3d(
1567+
target,
1568+
level,
1569+
xoffset,
1570+
yoffset,
1571+
zoffset,
1572+
width,
1573+
height,
1574+
depth,
1575+
format,
1576+
type_,
1577+
bytes.as_slice(),
1578+
state.get_inner_mut(),
1579+
);
1580+
}
1581+
14071582
#[no_mangle]
14081583
pub extern "C" fn canvas_native_webgl2_tex_sub_image3d_offset(
14091584
target: u32,
@@ -1930,7 +2105,6 @@ pub extern "C" fn canvas_native_webgl2_tex_image2d_webgl(
19302105
}
19312106

19322107

1933-
19342108
#[no_mangle]
19352109
pub extern "C" fn canvas_native_webgl2_tex_image2d_canvas2d(
19362110
target: i32,
@@ -2004,8 +2178,8 @@ pub extern "C" fn canvas_native_webgl2_tex_image2d_canvas2d(
20042178
let integers = match format as u32 {
20052179
gl_bindings::RGBA_INTEGER => Some(canvas_core::image_asset::ImageAsset::rgba_to_rgba_integer(bytes.as_slice(), source_width as usize, source_height as usize)),
20062180
gl_bindings::RGB_INTEGER => Some(canvas_core::image_asset::ImageAsset::rgba_to_rgb_integer(bytes.as_slice(), source_width as usize, source_height as usize)),
2007-
gl_bindings::RED_INTEGER =>Some(canvas_core::image_asset::ImageAsset::rgba_to_red_integer(bytes.as_slice(), source_width as usize, source_height as usize)),
2008-
gl_bindings::RG_INTEGER =>Some(canvas_core::image_asset::ImageAsset::rgba_to_rg_integer(bytes.as_slice(), source_width as usize, source_height as usize)),
2181+
gl_bindings::RED_INTEGER => Some(canvas_core::image_asset::ImageAsset::rgba_to_red_integer(bytes.as_slice(), source_width as usize, source_height as usize)),
2182+
gl_bindings::RG_INTEGER => Some(canvas_core::image_asset::ImageAsset::rgba_to_rg_integer(bytes.as_slice(), source_width as usize, source_height as usize)),
20092183
_ => None,
20102184
};
20112185

@@ -2171,8 +2345,8 @@ pub extern "C" fn canvas_native_webgl2_tex_image2d_image_data(
21712345
let integers = match format as u32 {
21722346
gl_bindings::RGBA_INTEGER => Some(canvas_core::image_asset::ImageAsset::rgba_to_rgba_integer(bytes, source_width as usize, source_height as usize)),
21732347
gl_bindings::RGB_INTEGER => Some(canvas_core::image_asset::ImageAsset::rgba_to_rgb_integer(bytes, source_width as usize, source_height as usize)),
2174-
gl_bindings::RED_INTEGER =>Some(canvas_core::image_asset::ImageAsset::rgba_to_red_integer(bytes, source_width as usize, source_height as usize)),
2175-
gl_bindings::RG_INTEGER =>Some(canvas_core::image_asset::ImageAsset::rgba_to_rg_integer(bytes, source_width as usize, source_height as usize)),
2348+
gl_bindings::RED_INTEGER => Some(canvas_core::image_asset::ImageAsset::rgba_to_red_integer(bytes, source_width as usize, source_height as usize)),
2349+
gl_bindings::RG_INTEGER => Some(canvas_core::image_asset::ImageAsset::rgba_to_rg_integer(bytes, source_width as usize, source_height as usize)),
21762350
_ => None,
21772351
};
21782352

0 commit comments

Comments
 (0)