sdl gpu wrap
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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); }
|
||||||
|
|
||||||
|
|||||||
1974
source/jsffi.c
1974
source/jsffi.c
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user