From 6f5007525c3b429dcecf254ba4bdaad3cbc03ac9 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Mon, 20 Oct 2025 21:09:52 -0500 Subject: [PATCH] shadertoy: assemble shadertoy.fs.asm from source --- drm/length.fs.asm | 15 +++++++++++++++ drm/length.fs.inc | 28 ++++++++++++++++++++++++++++ drm/shadertoy.c | 27 +++++++++++++++------------ drm/shadertoy.fs.asm | 4 ++++ drm/shadertoy.fs.inc | 7 +++++++ regs/us_disassemble2.py | 9 ++++++++- 6 files changed, 77 insertions(+), 13 deletions(-) create mode 100644 drm/length.fs.asm create mode 100644 drm/length.fs.inc create mode 100644 drm/shadertoy.fs.asm create mode 100644 drm/shadertoy.fs.inc diff --git a/drm/length.fs.asm b/drm/length.fs.asm new file mode 100644 index 0000000..b5374d7 --- /dev/null +++ b/drm/length.fs.asm @@ -0,0 +1,15 @@ +src0.rgb = temp[0] : + temp[0].r = DP3 src0.rg0 src0.rg0 ; + +src0.rgb = temp[0] : + temp[0].a = RSQ |src0.r| ; + +OUT +src0.a = temp[0] : + RCP src0.a , + out[0].r = SOP ; + +OUT TEX_SEM_WAIT + : + out[0].a = MAX src0.1 src0.1 , + out[0].gb = MAX src0.000 src0.000 ; diff --git a/drm/length.fs.inc b/drm/length.fs.inc new file mode 100644 index 0000000..2aae073 --- /dev/null +++ b/drm/length.fs.inc @@ -0,0 +1,28 @@ +0x00000800, +0x08020000, +0x08020080, +0x00840420, +0x00000000, +0x00000001, + +0x00004000, +0x08020000, +0x08020080, +0x00000000, +0x0004000b, +0x00000000, + +0x00008001, +0x08020080, +0x08020000, +0x00000000, +0x0000c00a, +0x0000000a, + +0x00070005, +0x08020080, +0x08020080, +0x00920490, +0x00c18003, +0x00000005, + diff --git a/drm/shadertoy.c b/drm/shadertoy.c index a4fa851..eb216e7 100644 --- a/drm/shadertoy.c +++ b/drm/shadertoy.c @@ -244,9 +244,6 @@ int indirect_buffer() T0V(US_CONFIG , US_CONFIG__ZERO_TIMES_ANYTHING_EQUALS_ZERO(1) ); - T0V(US_PIXSIZE - , US_PIXSIZE__PIX_SIZE(1) - ); T0V(US_FC_CTRL, 0); T0V(FG_DEPTH_SRC, 0x00000000); @@ -433,25 +430,31 @@ int indirect_buffer() // GA_US ////////////////////////////////////////////////////////////////////////////// + const uint32_t fragment_shader[] = { + #include "shadertoy.fs.inc" + }; + const int fragment_shader_length = (sizeof (fragment_shader)) / (sizeof (fragment_shader[0])); + assert(fragment_shader_length % 6 == 0); + printf("fs length %d\n", fragment_shader_length); + const int fragment_shader_instructions = fragment_shader_length / 6; + printf("fs instructions %d\n", fragment_shader_instructions); + + T0V(US_PIXSIZE + , US_PIXSIZE__PIX_SIZE(1) // pixel shader stack frame size + ); + T0V(US_CODE_RANGE , US_CODE_RANGE__CODE_ADDR(0) - | US_CODE_RANGE__CODE_SIZE(0) + | US_CODE_RANGE__CODE_SIZE(fragment_shader_instructions - 1) ); T0V(US_CODE_OFFSET , US_CODE_OFFSET__OFFSET_ADDR(0) ); T0V(US_CODE_ADDR , US_CODE_ADDR__START_ADDR(0) - | US_CODE_ADDR__END_ADDR(0) + | US_CODE_ADDR__END_ADDR(fragment_shader_instructions - 1) ); - const uint32_t fragment_shader[] = { - #include "../shader_examples/mesa/shadertoy.fs.txt" - }; - const int fragment_shader_length = (sizeof (fragment_shader)) / (sizeof (fragment_shader[0])); - assert(fragment_shader_length % 6 == 0); - printf("fs length %d\n", fragment_shader_length); - T0V(GA_US_VECTOR_INDEX, 0x00000000); T0_ONE_REG(GA_US_VECTOR_DATA, fragment_shader_length - 1); for (int i = 0; i < fragment_shader_length; i++) { diff --git a/drm/shadertoy.fs.asm b/drm/shadertoy.fs.asm new file mode 100644 index 0000000..0620dbc --- /dev/null +++ b/drm/shadertoy.fs.asm @@ -0,0 +1,4 @@ +OUT TEX_SEM_WAIT +src0.rgb = temp[0] : + out[0].a = MAX src0.1 src0.1 , + out[0].rgb = MAX src0.rg0 src0.rg0 ; diff --git a/drm/shadertoy.fs.inc b/drm/shadertoy.fs.inc new file mode 100644 index 0000000..baa663e --- /dev/null +++ b/drm/shadertoy.fs.inc @@ -0,0 +1,7 @@ +0x00078005, +0x08020000, +0x08020080, +0x00840420, +0x00c18003, +0x00000005, + diff --git a/regs/us_disassemble2.py b/regs/us_disassemble2.py index 940c84e..61c54ac 100644 --- a/regs/us_disassemble2.py +++ b/regs/us_disassemble2.py @@ -299,6 +299,7 @@ def disassemble_alu(code, is_output): rgb_swizzle_sel, rgb_sels = disassemble_rgb_swizzle_sel(code) #print(", ".join([*rgb_swizzle_sel, *a_swizzle_sel])) + type = US_CMN_INST.TYPE(code) tex_sem_wait = US_CMN_INST.TEX_SEM_WAIT(code) _, a_op, _ = US_ALU_ALPHA_INST._ALPHA_OP(code) @@ -309,8 +310,14 @@ def disassemble_alu(code, is_output): (a_out_str, a_temp_str), (rgb_out_str, rgb_temp_str) = disassemble_alu_dest(code) + tags = [] + assert type in {0, 1}, type + if type == 1: + tags.append("OUT") if tex_sem_wait: - print("TEX_SEM_WAIT") + tags.append("TEX_SEM_WAIT") + if tags: + print(" ".join(tags)) if not VERBOSE: a_swizzle_sel = a_swizzle_sel[:a_op_operands]