sdl gpu wrap
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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); }
|
||||
|
||||
|
||||
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