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

View File

@@ -13,7 +13,7 @@ cur.samplers = [];
function bind_pipeline(pass, pipeline) function bind_pipeline(pass, pipeline)
{ {
make_pipeline(pipeline) make_pipeline(pipeline)
pass.bind_pipeline(pipeline) pass.bind_pipeline(pipeline.gpu)
pass.pipeline = pipeline; pass.pipeline = pipeline;
} }
@@ -52,11 +52,11 @@ var base_pipeline = {
}, },
blend: { blend: {
enabled: false, 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 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_factor_rgb: "zero", dst_rgb: "zero",
op_rgb: "add", // add/sub/rev_sub/min/max op_rgb: "add", // add/sub/rev_sub/min/max
src_factor_alpha: "one", src_alpha: "one",
dst_factor_alpha: "zero", dst_alpha: "zero",
op_alpha: "add" op_alpha: "add"
}, },
cull: "none", // none/front/back cull: "none", // none/front/back
@@ -68,12 +68,19 @@ var base_pipeline = {
domask: false domask: false
}, },
label: "scripted pipeline", label: "scripted pipeline",
target: "main" target: {}
} }
var cornflower = [62/255,96/255,113/255,1]; var cornflower = [62/255,96/255,113/255,1];
var sprite_pipeline = Object.create(base_pipeline); 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); var post_pipeline = Object.create(base_pipeline);
post_pipeline.stencil = { post_pipeline.stencil = {
@@ -337,7 +344,21 @@ render.device = {
var render_queue = []; var render_queue = [];
render.device.doc = `Device resolutions given as [x,y,inches diagonal].`; 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; var tbuffer;
@@ -408,14 +429,57 @@ function group_sprites_by_texture(sprites)
return groups; 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; if (render_queue.length == 0) return;
camera.target ??= render._main.mainRT(prosperon.camera.size); if (!camera.target) {
var cmds = render._main.acquire_cmd_buffer(); 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); var spritemesh = render._main.make_sprite_mesh(render_queue);
cmds.upload_model(spritemesh); cmds.upload_model(spritemesh);
var pass = cmds.render_pass(camera.target, cornflower); var pass = cmds.render_pass(camera.target);
var camera = prosperon.camera; var camera = prosperon.camera;
var draw_cmds = group_sprites_by_texture(render_queue); var draw_cmds = group_sprites_by_texture(render_queue);
@@ -440,45 +504,25 @@ function render_camera(camera)
pass.end(); pass.end();
cmds.submit();
render_queue.length = 0; render_queue.length = 0;
} }
var swaps = [];
function gpupresent() function gpupresent()
{ {
try{ try{
render_camera(prosperon.camera);
} catch(e) { console.error(e); } finally {
var cmds = render._main.acquire_cmd_buffer(); var cmds = render._main.acquire_cmd_buffer();
var winsize = render._main.window.size; render_camera(cmds, prosperon.camera);
var pipeline = post_pipeline; } catch(e) { console.error(e); } finally {
var T = os.make_transform(); var swapchain_tex = cmds.acquire_swapchain();
T.trs([0,0],undefined, [winsize.x, winsize.y]); if (!swapchain_tex)
var pass = cmds.swapchain_pass(); cmds.cancel();
bind_pipeline(pass,pipeline); else {
bind_model(pass,pipeline,quad_model); if (swapchain_tex) cmds.blit({
var camslot = get_pipeline_ubo_slot(pipeline, 'TransformBuffer'); src: prosperon.camera.target.color_targets[0].texture,
dst: swapchain_tex,
if (typeof camslot !== 'undefined') { });
post_camera.size = render._main.window.size; cmds.submit()
cmds.camera(post_camera, pass, undefined, camslot);
} }
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 () { render.init = function () {
shader_type = render._main.shader_format()[0]; 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({ std_sampler = render._main.make_sampler({
min_filter: "nearest", min_filter: "nearest",
mag_filter: "nearest", mag_filter: "nearest",
mipmap_mode: "nearest", mipmap_mode: "nearest",
address_mode_u: "clamp_edge", address_mode_u: "repeat",
address_mode_v: "clamp_edge", address_mode_v: "repeat",
address_mode_w: "clamp_edge" address_mode_w: "repeat"
}); });
quad_model = render._main.make_quad(); quad_model = render._main.make_quad();
io.mount("core"); io.mount("core");
@@ -514,7 +556,6 @@ render.init = function () {
var img = {}; var img = {};
img.surface = os.make_texture(mat[i]); img.surface = os.make_texture(mat[i]);
img.texture = render._main.load_texture(img.surface); img.texture = render._main.load_texture(img.surface);
img.texture.mode(0);
img.sampler = std_sampler; img.sampler = std_sampler;
mat[i] = img; mat[i] = img;
} }

View File

@@ -247,9 +247,22 @@ Cmdline.register_order(
else console.warn("No config.js file found. Starting with default parameters."); else console.warn("No config.js file found. Starting with default parameters.");
prosperon.window = game.engine_start(prosperon); 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.window = prosperon.window;
render._main.claim_window(prosperon.window); render._main.claim_window(prosperon.window);
render._main.set_swapchain("sdr", "immediate");
var tt = game.texture('moon'); var tt = game.texture('moon');
tt.texture.__proto__.toString = function() { return os.value_id(this); } tt.texture.__proto__.toString = function() { return os.value_id(this); }

File diff suppressed because it is too large Load Diff