sdl gpu wrap

This commit is contained in:
2025-01-07 09:30:01 -06:00
parent cd9bafd1c1
commit 854e3b4c24
4 changed files with 1031 additions and 1115 deletions

View File

@@ -176,29 +176,22 @@ function create_image(path)
switch(path.ext()) {
case 'gif':
newimg = os.make_gif(data);
if (newimg.surface) {
if (newimg.surface)
newimg.texture = render._main.load_texture(newimg.surface);
newimg.texture.mode(0);
}
else
for (var frame of newimg.frames) {
for (var frame of newimg.frames)
frame.texture = render._main.load_texture(frame.surface);
frame.texture.mode(0);
}
break;
case 'ase':
case 'aseprite':
newimg = os.make_aseprite(data);
if (newimg.surface) {
if (newimg.surface)
newimg.texture = render._main.load_texture(newimg.surface);
newimg.texture.mode(0);
} else {
else {
for (var anim in newimg) {
var a = newimg[anim];
for (var frame of a.frames) {
for (var frame of a.frames)
frame.texture = render._main.load_texture(frame.surface);
frame.texture.mode(0)
}
}
}
break;
@@ -207,7 +200,6 @@ function create_image(path)
surface: os.make_texture(data)
};
newimg.texture = render._main.load_texture(newimg.surface);
newimg.texture.mode(0);
break;
}
return newimg;

View File

@@ -13,7 +13,7 @@ cur.samplers = [];
function bind_pipeline(pass, pipeline)
{
make_pipeline(pipeline)
pass.bind_pipeline(pipeline)
pass.bind_pipeline(pipeline.gpu)
pass.pipeline = pipeline;
}
@@ -52,11 +52,11 @@ var base_pipeline = {
},
blend: {
enabled: false,
src_factor_rgb: "one", // zero/one/src_color/one_minus_src_color/dst_color/one_minus_dst_color/src_alpha/one_minus_src_alpha/dst_alpha/one_minus_dst_alpha/constant_color/one_minus_constant_color/src_alpha_saturate
dst_factor_rgb: "zero",
src_rgb: "one", // zero/one/src_color/one_minus_src_color/dst_color/one_minus_dst_color/src_alpha/one_minus_src_alpha/dst_alpha/one_minus_dst_alpha/constant_color/one_minus_constant_color/src_alpha_saturate
dst_rgb: "zero",
op_rgb: "add", // add/sub/rev_sub/min/max
src_factor_alpha: "one",
dst_factor_alpha: "zero",
src_alpha: "one",
dst_alpha: "zero",
op_alpha: "add"
},
cull: "none", // none/front/back
@@ -68,12 +68,19 @@ var base_pipeline = {
domask: false
},
label: "scripted pipeline",
target: "main"
target: {}
}
var cornflower = [62/255,96/255,113/255,1];
var sprite_pipeline = Object.create(base_pipeline);
sprite_pipeline.target = {
color_targets: [{
format:"rgba8",
blend:base_pipeline.blend
}],
depth: "d32 float s8"
};
var post_pipeline = Object.create(base_pipeline);
post_pipeline.stencil = {
@@ -337,7 +344,21 @@ render.device = {
var render_queue = [];
render.device.doc = `Device resolutions given as [x,y,inches diagonal].`;
var std_sampler;
var std_sampler = {
min_filter: "nearest",
mag_filter: "nearest",
mipmap: "linear",
u: "repeat",
v: "repeat",
w: "repeat",
mip_bias: 0,
max_anisotropy: 0,
compare_op: "none",
min_lod: 0,
max_lod: 0,
anisotropy: false,
compare: false
};
var tbuffer;
@@ -408,14 +429,57 @@ function group_sprites_by_texture(sprites)
return groups;
}
function render_camera(camera)
var main_color = {
type:"2d",
format: "rgba8",
layers: 1,
mip_levels: 1,
samples: 0,
sampler:true,
color_target:true
};
var main_depth = {
type: "2d",
format: "d32 float s8",
layers:1,
mip_levels:1,
samples:0,
sampler:true,
depth_target:true
};
function render_camera(cmds, camera)
{
if (render_queue.length == 0) return;
camera.target ??= render._main.mainRT(prosperon.camera.size);
var cmds = render._main.acquire_cmd_buffer();
if (!camera.target) {
main_color.width = main_depth.width = prosperon.camera.size.x;
main_color.height = main_depth.height = prosperon.camera.size.y;
camera.target = {
color_targets: [{
texture: render._main.texture(main_color),
mip_level:0,
layer: 0,
load:"clear",
store:"store",
clear: cornflower
}
],
depth_stencil: {
texture: render._main.texture(main_depth),
clear:1,
load:"clear",
store:"dont_care",
stencil_load:"clear",
stencil_store:"dont_care",
stencil_clear:0
}
};
}
var spritemesh = render._main.make_sprite_mesh(render_queue);
cmds.upload_model(spritemesh);
var pass = cmds.render_pass(camera.target, cornflower);
var pass = cmds.render_pass(camera.target);
var camera = prosperon.camera;
var draw_cmds = group_sprites_by_texture(render_queue);
@@ -440,45 +504,25 @@ function render_camera(camera)
pass.end();
cmds.submit();
render_queue.length = 0;
}
var swaps = [];
function gpupresent()
{
try{
render_camera(prosperon.camera);
} catch(e) { console.error(e); } finally {
var cmds = render._main.acquire_cmd_buffer();
var winsize = render._main.window.size;
var pipeline = post_pipeline;
var T = os.make_transform();
T.trs([0,0],undefined, [winsize.x, winsize.y]);
var pass = cmds.swapchain_pass();
bind_pipeline(pass,pipeline);
bind_model(pass,pipeline,quad_model);
var camslot = get_pipeline_ubo_slot(pipeline, 'TransformBuffer');
if (typeof camslot !== 'undefined') {
post_camera.size = render._main.window.size;
cmds.camera(post_camera, pass, undefined, camslot);
render_camera(cmds, prosperon.camera);
} catch(e) { console.error(e); } finally {
var swapchain_tex = cmds.acquire_swapchain();
if (!swapchain_tex)
cmds.cancel();
else {
if (swapchain_tex) cmds.blit({
src: prosperon.camera.target.color_targets[0].texture,
dst: swapchain_tex,
});
cmds.submit()
}
var modelslot = get_pipeline_ubo_slot(pipeline, "model");
if (typeof modelslot !== 'undefined') {
var ubo = ubo_obj_to_array(pipeline, 'model', {model:T, color:[1,1,1,1]});
cmds.push_vertex_uniform_data(modelslot, ubo);
}
var mat = {};
mat.diffuse = {
texture:prosperon.camera.target.color_targets[0].texture,
sampler:std_sampler
};
bind_mat(pass, pipeline, mat);
pass.draw_indexed(quad_model.num_indices,1,quad_model.first_index,0,0);
pass.end();
cmds.submit();
}
}
@@ -493,16 +537,14 @@ var quad_model;
render.init = function () {
shader_type = render._main.shader_format()[0];
console.log(render._main.shader_format())
console.log(`shader format ${shader_type}`)
std_sampler = render._main.make_sampler({
min_filter: "nearest",
mag_filter: "nearest",
mipmap_mode: "nearest",
address_mode_u: "clamp_edge",
address_mode_v: "clamp_edge",
address_mode_w: "clamp_edge"
address_mode_u: "repeat",
address_mode_v: "repeat",
address_mode_w: "repeat"
});
quad_model = render._main.make_quad();
io.mount("core");
@@ -514,7 +556,6 @@ render.init = function () {
var img = {};
img.surface = os.make_texture(mat[i]);
img.texture = render._main.load_texture(img.surface);
img.texture.mode(0);
img.sampler = std_sampler;
mat[i] = img;
}

View File

@@ -247,9 +247,22 @@ Cmdline.register_order(
else console.warn("No config.js file found. Starting with default parameters.");
prosperon.window = game.engine_start(prosperon);
render._main = prosperon.window.make_gpu();
var driver = "vulkan"
switch(os.sys()) {
case "Linux":
driver = "vulkan"
break
case "Windows":
driver = "direct3d12"
break
case "Mac OS X":
driver = "metal"
break
}
render._main = prosperon.window.make_gpu(false, driver);
render._main.window = prosperon.window;
render._main.claim_window(prosperon.window);
render._main.set_swapchain("sdr", "immediate");
var tt = game.texture('moon');
tt.texture.__proto__.toString = function() { return os.value_id(this); }

File diff suppressed because it is too large Load Diff