shadertoy: assemble shadertoy.fs.asm from source

This commit is contained in:
Zack Buhman 2025-10-20 21:09:52 -05:00
parent 50c53376df
commit 6f5007525c
6 changed files with 77 additions and 13 deletions

15
drm/length.fs.asm Normal file
View File

@ -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 ;

28
drm/length.fs.inc Normal file
View File

@ -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,

View File

@ -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++) {

4
drm/shadertoy.fs.asm Normal file
View File

@ -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 ;

7
drm/shadertoy.fs.inc Normal file
View File

@ -0,0 +1,7 @@
0x00078005,
0x08020000,
0x08020080,
0x00840420,
0x00c18003,
0x00000005,

View File

@ -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]