From 62cffd93abbacaeb9f0d0f3286e66512dad22b61 Mon Sep 17 00:00:00 2001 From: luboslenco Date: Thu, 1 May 2025 12:32:28 +0200 Subject: [PATCH] Metal fixes --- armorpaint/sources/make_mesh.ts | 12 ++++++------ armorsculpt/sources/make_mesh.ts | 2 +- base/shaders/cursor.kong | 8 ++++---- base/sources/backends/metal_gpu.m | 4 +++- base/sources/iron_draw.c | 2 +- base/sources/iron_gpu.c | 2 +- base/sources/ts/iron/shader_data.ts | 30 ++++++++++++++++++++++++----- base/sources/ts/node_shader.ts | 2 +- base/sources/ts/parser_material.ts | 2 +- base/sources/ts/pipes.ts | 1 + 10 files changed, 44 insertions(+), 21 deletions(-) diff --git a/armorpaint/sources/make_mesh.ts b/armorpaint/sources/make_mesh.ts index d77df2cb..dbd2b6ef 100644 --- a/armorpaint/sources/make_mesh.ts +++ b/armorpaint/sources/make_mesh.ts @@ -433,7 +433,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } else if (context_raw.viewport_mode == viewport_mode_t.OBJECT_NORMAL) { kong.frag_nattr = true; - node_shader_write_frag(kong, "output[1] = float4(nattr, 1.0);"); + node_shader_write_frag(kong, "output[1] = float4(input.nattr, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.MATERIAL_ID) { let id: i32 = context_raw.layer.id; @@ -446,11 +446,11 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_frag(kong, "output[1] = float4(matid_r, matid_g, matid_b, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OBJECT_ID) { - node_shader_add_constant(kong, "float object_id", "_object_id"); - node_shader_write_frag(kong, "float obid = constants.object_id + 1.0 / 255.0;"); - node_shader_write_frag(kong, "float id_r = frac(sin(dot(float2(obid, obid * 20.0), float2(12.9898, 78.233))) * 43758.5453);"); - node_shader_write_frag(kong, "float id_g = frac(sin(dot(float2(obid * 20.0, obid), float2(12.9898, 78.233))) * 43758.5453);"); - node_shader_write_frag(kong, "float id_b = frac(sin(dot(float2(obid, obid * 40.0), float2(12.9898, 78.233))) * 43758.5453);"); + node_shader_add_constant(kong, "object_id: float", "_object_id"); + node_shader_write_frag(kong, "var obid: float = constants.object_id + 1.0 / 255.0;"); + node_shader_write_frag(kong, "var id_r: float = frac(sin(dot(float2(obid, obid * 20.0), float2(12.9898, 78.233))) * 43758.5453);"); + node_shader_write_frag(kong, "var id_g: float = frac(sin(dot(float2(obid * 20.0, obid), float2(12.9898, 78.233))) * 43758.5453);"); + node_shader_write_frag(kong, "var id_b: float = frac(sin(dot(float2(obid, obid * 40.0), float2(12.9898, 78.233))) * 43758.5453);"); node_shader_write_frag(kong, "output[1] = float4(id_r, id_g, id_b, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.MASK && (slot_layer_get_masks(context_raw.layer) != null || slot_layer_is_mask(context_raw.layer))) { diff --git a/armorsculpt/sources/make_mesh.ts b/armorsculpt/sources/make_mesh.ts index fad57c7d..6612ef4c 100644 --- a/armorsculpt/sources/make_mesh.ts +++ b/armorsculpt/sources/make_mesh.ts @@ -294,7 +294,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } else if (context_raw.viewport_mode == viewport_mode_t.OBJECT_NORMAL) { kong.frag_nattr = true; - node_shader_write_frag(kong, "output[1] = float4(nAttr, 1.0);"); + node_shader_write_frag(kong, "output[1] = float4(input.nattr, 1.0);"); } else if (context_raw.viewport_mode == viewport_mode_t.OBJECT_ID) { node_shader_add_constant(kong, "object_id: float", "_object_id"); diff --git a/base/shaders/cursor.kong b/base/shaders/cursor.kong index fec19f9e..87d12a10 100644 --- a/base/shaders/cursor.kong +++ b/base/shaders/cursor.kong @@ -17,9 +17,10 @@ const sampler_linear: sampler; const gbufferD: tex2d; struct vert_in { - pos: float4; // hlsl - nor: float2; // hlsl + pos: float4; + nor: float2; tex: float2; + col: float4; } struct vert_out { @@ -46,8 +47,7 @@ fun get_normal(p0: float3, uv: float2): float3 { // } fun cursor_vert(input: vert_in): vert_out { - - var keep: float = input.pos.x + input.nor.x; // hlsl + var keep: float = input.pos.x + input.nor.x + input.col.x; // hlsl var output: vert_out; output.tex = input.tex; diff --git a/base/sources/backends/metal_gpu.m b/base/sources/backends/metal_gpu.m index 20d19084..563a6cfb 100644 --- a/base/sources/backends/metal_gpu.m +++ b/base/sources/backends/metal_gpu.m @@ -252,6 +252,8 @@ void iron_gpu_internal_init_window(int depth_buffer_bits, bool vsync) { // device.makeArgumentEncoder(bufferIndex:) argument_buffer_step = [argument_encoder encodedLength]; + // int align = [argument_encoder alignment]; + // argument_buffer_step += (align - (argument_buffer_step % align)) % align; argument_buffer = [device newBufferWithLength:(argument_buffer_step * 2048) options:MTLResourceStorageModeShared]; for (int i = 0; i < 2048; ++i) { [argument_encoder setArgumentBuffer:argument_buffer offset:argument_buffer_step * i]; @@ -520,7 +522,7 @@ void iron_gpu_command_list_set_constant_buffer(iron_gpu_command_list_t *list, ir id buf = (__bridge id)buffer->impl._buffer; int i = constant_buffer_index; [argument_encoder setArgumentBuffer:argument_buffer offset:argument_buffer_step * i]; - [argument_encoder setBuffer:buf offset:offset atIndex:0 ]; + [argument_encoder setBuffer:buf offset:offset atIndex:0]; [command_encoder setVertexBuffer:argument_buffer offset:argument_buffer_step * i atIndex:1]; [command_encoder setFragmentBuffer:argument_buffer offset:argument_buffer_step * i atIndex:1]; [command_encoder useResource:buf usage:MTLResourceUsageRead]; diff --git a/base/sources/iron_draw.c b/base/sources/iron_draw.c index 8edf6ff1..0f57c252 100644 --- a/base/sources/iron_draw.c +++ b/base/sources/iron_draw.c @@ -208,7 +208,7 @@ void draw_init(buffer_t *image_vert, buffer_t *image_frag, buffer_t *rect_vert, tris_pos2_loc = iron_gpu_pipeline_get_constant_location(&tris_pipeline, "pos2"); tris_pos2_loc.impl.vertexOffset = 80; tris_col_loc = iron_gpu_pipeline_get_constant_location(&tris_pipeline, "col"); - tris_col_loc.impl.vertexOffset = 96; + tris_col_loc.impl.vertexOffset = 96; // 88 with 16 align } // Text painter diff --git a/base/sources/iron_gpu.c b/base/sources/iron_gpu.c index 250735f4..8983ff09 100644 --- a/base/sources/iron_gpu.c +++ b/base/sources/iron_gpu.c @@ -50,7 +50,7 @@ void gpu_draw(void) { void gpu_begin() { constant_buffer_index = 0; - iron_gpu_constant_buffer_lock(&constant_buffer, constant_buffer_index, CONSTANT_BUFFER_SIZE); + iron_gpu_constant_buffer_lock(&constant_buffer, constant_buffer_index * CONSTANT_BUFFER_SIZE, CONSTANT_BUFFER_SIZE); framebuffer_index = (framebuffer_index + 1) % FRAMEBUFFER_COUNT; // if (window_resized) { diff --git a/base/sources/ts/iron/shader_data.ts b/base/sources/ts/iron/shader_data.ts index c2bf8291..f400d150 100644 --- a/base/sources/ts/iron/shader_data.ts +++ b/base/sources/ts/iron/shader_data.ts @@ -158,12 +158,33 @@ function shader_context_compile(raw: shader_context_t): shader_context_t { return shader_context_finish_compile(raw); } +///if arm_metal + function shader_context_type_size(t: string): i32 { if (t == "int") return 4; if (t == "float") return 4; if (t == "vec2") return 8; - if (t == "vec3") return 12; - // if (t == "vec3") return 16; + if (t == "vec3") return 16; + if (t == "vec4") return 16; + if (t == "mat3") return 48; + if (t == "mat4") return 64; + return 0; +} + +function shader_context_type_pad(offset: i32, size: i32): i32 { + if (size > 16) { + size = 16; + } + return (size - (offset % size)) % size; +} + +///else + +function shader_context_type_size(t: string): i32 { + if (t == "int") return 4; + if (t == "float") return 4; + if (t == "vec2") return 8; + if (t == "vec3") return 12; if (t == "vec4") return 16; if (t == "mat3") return 48; if (t == "mat4") return 64; @@ -171,9 +192,6 @@ function shader_context_type_size(t: string): i32 { } function shader_context_type_pad(offset: i32, size: i32): i32 { - ///if arm_metal - // return 0; - ///end let r: i32 = offset % 16; if (r == 0) { return 0; @@ -184,6 +202,8 @@ function shader_context_type_pad(offset: i32, size: i32): i32 { return 0; } +///end + function shader_context_finish_compile(raw: shader_context_t): shader_context_t { gpu_compile_pipeline(raw._.pipe_state); diff --git a/base/sources/ts/node_shader.ts b/base/sources/ts/node_shader.ts index a5c97601..af35e373 100644 --- a/base/sources/ts/node_shader.ts +++ b/base/sources/ts/node_shader.ts @@ -219,7 +219,7 @@ function node_shader_get(raw: node_shader_t): string { s += raw.vert_normal; s += raw.vert; s += raw.vert_end; - s += "output.pos.z = (output.pos.z + output.pos.w) * 0.5;\n"; + s += "output.pos.z = (output.pos.z + output.pos.w) * 0.5;\n"; //// s += "\n\treturn output;\n"; s += "}\n\n"; diff --git a/base/sources/ts/parser_material.ts b/base/sources/ts/parser_material.ts index 0f3f9735..2e3dfef2 100644 --- a/base/sources/ts/parser_material.ts +++ b/base/sources/ts/parser_material.ts @@ -251,7 +251,7 @@ function parser_material_finalize(con: node_shader_context_t) { node_shader_write_attrib_vert(kong, "var wnormal: float3 = normalize(constants.N * float3(input.nor.xy, input.pos.w));"); } if (kong.frag_nattr) { - node_shader_add_out(kong, "var nattr: float3"); + node_shader_add_out(kong, "nattr: float3"); node_shader_write_attrib_vert(kong, "output.nattr = float3(input.nor.xy, input.pos.w);"); } if (kong.frag_dotnv) { diff --git a/base/sources/ts/pipes.ts b/base/sources/ts/pipes.ts index bbd015fa..d6090623 100644 --- a/base/sources/ts/pipes.ts +++ b/base/sources/ts/pipes.ts @@ -266,6 +266,7 @@ function pipes_init() { gpu_vertex_struct_add(vs, "pos", vertex_data_t.I16_4X_NORM); gpu_vertex_struct_add(vs, "nor", vertex_data_t.I16_2X_NORM); gpu_vertex_struct_add(vs, "tex", vertex_data_t.I16_2X_NORM); + gpu_vertex_struct_add(vs, "col", vertex_data_t.I16_4X_NORM); pipes_cursor.input_layout = vs; pipes_cursor.blend_source = blend_factor_t.SOURCE_ALPHA; pipes_cursor.blend_destination = blend_factor_t.INV_SOURCE_ALPHA;