mirror of
https://github.com/Ed94/pikuma_ps1.git
synced 2026-08-25 02:20:33 +00:00
reducing cross product atom procs to a single one in gte for once.
This commit is contained in:
@@ -171,18 +171,27 @@ WORD_COUNT(mac_load_word_imm, 2)
|
||||
, shift_aright(dt_z, dt_z, shift_amount)
|
||||
WORD_COUNT(mac_shift_aright_v3_self, 3)
|
||||
|
||||
#define mac_shift_aright_v3s4_self(dt, shift) \
|
||||
mac_shift_aright_v3_self(dt.x, dt.y, dt.z, shift)
|
||||
WORD_COUNT(mac_shift_aright_v3s4_self, 3)
|
||||
|
||||
#define mac_shift_aright_var_v3(rd_v0, rd_v1, rd_v2, rs_v0, rs_v1, rs_v2, r_shift) \
|
||||
shift_aright_var(rd_v0, rs_v0, r_shift) \
|
||||
, shift_aright_var(rd_v1, rs_v1, r_shift) \
|
||||
, shift_aright_var(rd_v2, rs_v2, r_shift)
|
||||
WORD_COUNT(mac_shift_aright_var_v3, 3)
|
||||
|
||||
/* atom_dbg_skip */
|
||||
#define mac_shift_aright_var_v3_self(rds_v0, rds_v1, rds_v2, r_shift) \
|
||||
shift_aright_var(rds_v0, rds_v0, r_shift) \
|
||||
, shift_aright_var(rds_v1, rds_v1, r_shift) \
|
||||
, shift_aright_var(rds_v2, rds_v2, r_shift)
|
||||
WORD_COUNT(mac_shift_aright_var_v3_self, 3)
|
||||
|
||||
#define mac_shift_aright_var_v3s4_self(ds, shift) \
|
||||
mac_shift_aright_var_v3_self(ds.x, ds.y, ds.z, shift)
|
||||
WORD_COUNT(mac_shift_aright_var_v3s4_self, 3)
|
||||
|
||||
/* atom_dbg_skip */
|
||||
#define mac_load_tri_indices(r_face_cusor, r_i0, r_i1, r_i2) \
|
||||
load_half_u(r_i0, r_face_cusor, 0 * S_(S2)) \
|
||||
@@ -190,6 +199,18 @@ WORD_COUNT(mac_shift_aright_var_v3_self, 3)
|
||||
, load_half_u(r_i2, r_face_cusor, 2 * S_(S2))
|
||||
WORD_COUNT(mac_load_tri_indices, 3)
|
||||
|
||||
#define mac_gte_mv_to_cr_diag_v3s4(v) \
|
||||
gte_mv_to_ctrl_r(v.y, gte_cr_RT13) \
|
||||
, gte_mv_to_ctrl_r(v.z, gte_cr_RT22) \
|
||||
, gte_mv_to_ctrl_r(v.x, gte_cr_RT11)
|
||||
WORD_COUNT(mac_gte_mv_to_cr_diag_v3s4, 3)
|
||||
|
||||
#define mac_gte_ld_ir123_v3s4(v) \
|
||||
gte_mv_to_data_r(v.x, C2_IR1) \
|
||||
, gte_mv_to_data_r(v.y, C2_IR2) \
|
||||
, gte_mv_to_data_r(v.z, C2_IR3)
|
||||
WORD_COUNT(mac_gte_ld_ir123_v3s4, 3)
|
||||
|
||||
/* atom_dbg_skip */
|
||||
#define mac_gte_store_f3(r_primitive_cursor) \
|
||||
gte_sw(C2_SXY0, r_primitive_cursor, O_(Poly_F3,p0)) \
|
||||
|
||||
@@ -18,6 +18,18 @@ atom_dbg_skip MipsAtomComp_Proc_(ab, {
|
||||
load_half_u(r_i2, r_face_cusor, 2 * S_(S2)),
|
||||
})
|
||||
|
||||
FI_ Slice_MipsCode ac_gte_mv_to_cr_diag_v3s4(AtomBuilder_R ab, Reg_(V3_S4) v) MipsAtomComp_Proc_(ab, {
|
||||
gte_mv_to_ctrl_r(v.y, gte_cr_RT13),
|
||||
gte_mv_to_ctrl_r(v.z, gte_cr_RT22),
|
||||
gte_mv_to_ctrl_r(v.x, gte_cr_RT11),
|
||||
})
|
||||
|
||||
FI_ Slice_MipsCode ac_gte_ld_ir123_v3s4(AtomBuilder_R ab, Reg_(V3_S4) v) MipsAtomComp_Proc_(ab, {
|
||||
gte_mv_to_data_r(v.x, C2_IR1),
|
||||
gte_mv_to_data_r(v.y, C2_IR2),
|
||||
gte_mv_to_data_r(v.z, C2_IR3),
|
||||
})
|
||||
|
||||
/* Words: 3; Stores the 3 transformed (V2_S2 screen) vertices to the F3.
|
||||
* PIPELINE: post-RTPT (SXY0=v0.screen, SXY1=v1.screen, SXY2=v2.screen). */
|
||||
FI_ Slice_MipsCode ac_gte_store_f3(AtomBuilder_R ab, U4 r_primitive_cursor) atom_dbg_skip MipsAtomComp_Proc_(ab, {
|
||||
@@ -319,6 +331,35 @@ MipsAtom_Proc_(aa, {
|
||||
mac_yield()
|
||||
})
|
||||
|
||||
typedef Struct_(Binds_gte_cross_v3s4) { V3_S4* src_a; V3_S4* src_b; V3_S4* out; };
|
||||
typedef Struct_(RegUse_gte_cross_v3s4) {
|
||||
Reg_(V3_S4) a;
|
||||
Reg_(V3_S4) b;
|
||||
union { Reg t0, out; };
|
||||
union { Reg t1, src_a, rt11; };
|
||||
union { Reg t2, src_b, rt22; };
|
||||
};
|
||||
internal MipsAtom* gte_cross_v3s4(AtomArena_R aa, RegUse_gte_cross_v3s4 r)
|
||||
atom_info(atom_bind(Binds_gte_cross_v3s4)) MipsAtom_Proc_(aa, {
|
||||
load_word(r.src_a, R_TapePtr, O_(Binds_gte_cross_v3s4,src_a)),
|
||||
load_word(r.src_b, R_TapePtr, O_(Binds_gte_cross_v3s4,src_b)),
|
||||
load_word(r.out, R_TapePtr, O_(Binds_gte_cross_v3s4,out)),
|
||||
LdSlot_ add_ui_self(R_TapePtr, S_(Binds_gte_cross_v3s4)),
|
||||
|
||||
mac_load_v3s4(r.a, r.src_a, 0), LdSlot_
|
||||
mac_load_v3s4(r.b, r.src_b, 0), LdSlot_
|
||||
|
||||
mac_gte_mv_to_cr_diag_v3s4(r.a), GteDelay_ /* RT diagonal: D1 = a.x, D2 = a.y, D3 = a.z. */
|
||||
mac_gte_ld_ir123_v3s4(r.b), GteDelay_ /* IR: second operand. */
|
||||
gte_cmdw_cross, /* MAC1/2/3 = a × b */
|
||||
mac_gte_mv_from_data_r_mac123(r.a.x, r.a.y, r.a.z), GteDelay_ //nop,
|
||||
|
||||
mac_shift_aright_v3s4_self(r.a, 12),
|
||||
mac_store_v3s4(r.a, r.out, 0),
|
||||
|
||||
mac_yield()
|
||||
})
|
||||
|
||||
#pragma endregion Atom Procs
|
||||
|
||||
#pragma region Baked Atoms
|
||||
|
||||
+14
-14
@@ -101,20 +101,20 @@ enum {
|
||||
|
||||
/* Semantic Aliases for GTE Data Registers */
|
||||
enum {
|
||||
gte_in_v0_xy = C2_VXY0, /* Input Vector 0 (X, Y) */
|
||||
gte_in_v0_z = C2_VZ0, /* Input Vector 0 (Z) */
|
||||
gte_in_v1_xy = C2_VXY1, /* Input Vector 1 (X, Y) */
|
||||
gte_in_v1_z = C2_VZ1, /* Input Vector 1 (Z) */
|
||||
gte_in_v2_xy = C2_VXY2, /* Input Vector 2 (X, Y) */
|
||||
gte_in_v2_z = C2_VZ2, /* Input Vector 2 (Z) */
|
||||
gte_in_rgb = C2_RGB, /* Input Color (R, G, B, MipsCode) */
|
||||
gte_out_scr_xy0 = C2_SXY0, /* Output Screen Coord 0 (X, Y) */
|
||||
gte_out_scr_xy1 = C2_SXY1, /* Output Screen Coord 1 (X, Y) */
|
||||
gte_out_scr_xy2 = C2_SXY2, /* Output Screen Coord 2 (X, Y) */
|
||||
gte_out_depth = C2_OTZ, /* Output Ordering Table Z (Depth) */
|
||||
gte_math_accum0 = C2_MAC0, /* Math Accumulator 0 */
|
||||
gte_math_accum1 = C2_MAC1, /* Math Accumulator 1 */
|
||||
gte_math_accum2 = C2_MAC2, /* Math Accumulator 2 */
|
||||
C2_InV0_XY = C2_VXY0, /* Input Vector 0 (X, Y) */
|
||||
C2_InV0_Z = C2_VZ0, /* Input Vector 0 (Z) */
|
||||
C2_InV1_XY = C2_VXY1, /* Input Vector 1 (X, Y) */
|
||||
C2_InV1_Z = C2_VZ1, /* Input Vector 1 (Z) */
|
||||
C2_InV2_XY = C2_VXY2, /* Input Vector 2 (X, Y) */
|
||||
C2_InV2_Z = C2_VZ2, /* Input Vector 2 (Z) */
|
||||
C2_In_RGB = C2_RGB, /* Input Color (R, G, B, MipsCode) */
|
||||
C2_OutSrc_XY0 = C2_SXY0, /* Output Screen Coord 0 (X, Y) */
|
||||
C2_OutSrc_XY1 = C2_SXY1, /* Output Screen Coord 1 (X, Y) */
|
||||
C2_OutSrc_XY2 = C2_SXY2, /* Output Screen Coord 2 (X, Y) */
|
||||
C2_OutDepth = C2_OTZ, /* Output Ordering Table Z (Depth) */
|
||||
C2_MathAccu0 = C2_MAC0, /* Math Accumulator 0 */
|
||||
C2_MathAccu1 = C2_MAC1, /* Math Accumulator 1 */
|
||||
C2_MathAccu2 = C2_MAC2, /* Math Accumulator 2 */
|
||||
};
|
||||
|
||||
/* --- GTE Command Semantics (The Bitfield Meanings) ---
|
||||
|
||||
@@ -110,7 +110,7 @@ typedef Slice_(MipsAtom);
|
||||
// Sometimes a user will define a bundle of atoms that represent a procedure of work as:
|
||||
// MipsAtom* <identifier>[...];
|
||||
// Unfortuantely if using slice_from_array it will make the slice's pointer: MipsAtom** so this enforce its defined as MipsAtom*
|
||||
// TODO(Ed): Alternatively we can make the MipsAtom an opaque pointer to the atom... so that the blow returns 'MipsAtom'.
|
||||
// TODO(Ed): Alternatively we can make the MipsAtom an opaque pointer to the atom... so that the proc returns 'MipsAtom'.
|
||||
#define atombundle_from_array(array) (Slice_MipsAtom){.ptr=array[0],.len=Array_len(array)}
|
||||
|
||||
// Underlying type to an ptr to an array of mips asm words that must terminate with an ac_yield.
|
||||
|
||||
@@ -23,6 +23,8 @@ MipsAtomComp_Proc_( ab, {
|
||||
shift_aright(dt_z, dt_z, shift_amount),
|
||||
})
|
||||
|
||||
FI_ Slice_MipsCode ac_shift_aright_v3s4_self(AtomBuilder_R ab, Reg_(V3_S4) dt, U2 shift) MipsAtomComp_ProcMap_(ab, mac_shift_aright_v3_self(dt.x, dt.y, dt.z, shift))
|
||||
|
||||
FI_ Slice_MipsCode ac_shift_aright_var_v3(AtomBuilder_R ab
|
||||
, Reg rd_v0, Reg rd_v1, Reg rd_v2
|
||||
, Reg rs_v0, Reg rs_v1, Reg rs_v2
|
||||
@@ -33,15 +35,15 @@ MipsAtomComp_Proc_(ab, {
|
||||
shift_aright_var(rd_v2, rs_v2, r_shift),
|
||||
})
|
||||
|
||||
FI_ Slice_MipsCode ac_shift_aright_var_v3_self(AtomBuilder_R ab
|
||||
, Reg rds_v0, Reg rds_v1, Reg rds_v2
|
||||
, Reg r_shift)
|
||||
MipsAtomComp_Proc_(ab, {
|
||||
FI_ Slice_MipsCode ac_shift_aright_var_v3_self(AtomBuilder_R ab, Reg rds_v0, Reg rds_v1, Reg rds_v2, Reg r_shift)
|
||||
atom_dbg_skip MipsAtomComp_Proc_(ab, {
|
||||
shift_aright_var(rds_v0, rds_v0, r_shift),
|
||||
shift_aright_var(rds_v1, rds_v1, r_shift),
|
||||
shift_aright_var(rds_v2, rds_v2, r_shift),
|
||||
})
|
||||
|
||||
FI_ Slice_MipsCode ac_shift_aright_var_v3s4_self(AtomBuilder_R ab, Reg_(V3_S4) ds, Reg shift) MipsAtomComp_ProcMap_(ab, mac_shift_aright_var_v3_self(ds.x, ds.y, ds.z, shift))
|
||||
|
||||
#pragma endregion MACs (Mips Atom Components)
|
||||
|
||||
#pragma region Baked Atoms
|
||||
|
||||
@@ -55,6 +55,7 @@ WORD_COUNT(gte_mv_to_ctrl_r, 1)
|
||||
WORD_COUNT(gte_sw, 1)
|
||||
WORD_COUNT(gte_cmdw_rtpt, 1)
|
||||
WORD_COUNT(gte_cmdw_nclip, 1)
|
||||
WORD_COUNT(gte_cmdw_op, 1)
|
||||
WORD_COUNT(gte_avg_sort_z3, 1)
|
||||
WORD_COUNT(gte_cmdw_sqr, 1)
|
||||
WORD_COUNT(gte_cmdw_gpf, 1)
|
||||
|
||||
Reference in New Issue
Block a user