Skip to content

Commit 2f837e5

Browse files
committed
Merge remote-tracking branch 'upstream/preview' into gfx-rdp
2 parents 0e20d4c + 56740f4 commit 2f837e5

9 files changed

+101
-22
lines changed

include/rdpq.h

+25
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,7 @@ inline void rdpq_set_tile(rdpq_tile_t tile,
779779
else {
780780
assertf(parms->s.shift >= -5 && parms->s.shift <= 10, "invalid s shift %d: must be in [-5..10]", parms->s.shift);
781781
assertf(parms->t.shift >= -5 && parms->t.shift <= 10, "invalid t shift %d: must be in [-5..10]", parms->t.shift);
782+
assertf(parms->palette < 16, "invalid palette %d: must be in [0..15]", parms->palette);
782783
}
783784
bool fixup = false;
784785
bool reuse = false;
@@ -1269,6 +1270,30 @@ inline void rdpq_set_texture_image_raw(uint8_t index, uint32_t offset, tex_forma
12691270
AUTOSYNC_PIPE);
12701271
}
12711272

1273+
/**
1274+
* @brief Load a block of memory to TMEM with a single contiguous memory transfer.
1275+
*
1276+
* Loads data from RDRAM to TMEM but takes in byte offsets and sizes unlike #rdpq_load_block.
1277+
*
1278+
* @param[in] offset Destination TMEM offset
1279+
* @param[in] buffer Pointer to data in RDRAM to load
1280+
* @param[in] size Number of bytes to load (max: 4096)
1281+
*
1282+
* @see #rdpq_load_block
1283+
* @see #rdpq_load_block_fx
1284+
*/
1285+
inline void rdpq_load_block_linear(int32_t offset, void *buffer, uint16_t size)
1286+
{
1287+
assertf((offset & 7) == 0, "invalid TMEM offset %ld: must be 8-byte aligned", offset);
1288+
assertf((PhysicalAddr(buffer) & 7) == 0, "invalid buffer: %p, must be 8-byte aligned", buffer);
1289+
assertf((size & 7) == 0, "invalid size %d: must be a multiple of 8", size);
1290+
assertf(size <= 4096, "invalid size %d: must fit TMEM", size);
1291+
rdpq_set_texture_image_raw(0, PhysicalAddr(buffer), FMT_RGBA16, 8, size / 8);
1292+
rdpq_set_tile(RDPQ_TILE_INTERNAL, FMT_RGBA16, offset, 0, NULL);
1293+
uint32_t num_texels = size / 2;
1294+
rdpq_load_block(RDPQ_TILE_INTERNAL, 0, 0, num_texels, 16);
1295+
}
1296+
12721297
/**
12731298
* @brief Store an address into the rdpq lookup table
12741299
*

src/GL/gl_internal.h

-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@
5656
#define gl_ensure_no_begin_end() ({ \
5757
if (state->begin_end_active) { \
5858
gl_set_error(GL_INVALID_OPERATION, "%s is not allowed between glBegin/glEnd", __func__); \
59-
false; \
6059
} \
6160
true; \
6261
})

src/joybus.c

+2
Original file line numberDiff line numberDiff line change
@@ -275,3 +275,5 @@ void joybus_exec( const void * input, void * output )
275275
}
276276
}
277277
}
278+
279+
extern inline void joybus_exec_cmd(int port, size_t send_len, size_t recv_len, const void *send_data, void *recv_data);

src/joypad_accessory.c

+47-12
Original file line numberDiff line numberDiff line change
@@ -291,15 +291,34 @@ static void joypad_accessory_detect_read_callback(uint64_t *out_dwords, void *ct
291291
{
292292
return; // Accessory communication error!
293293
}
294-
else if (state == JOYPAD_ACCESSORY_STATE_DETECT_LABEL_READ)
294+
else if (state == JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_BACKUP)
295+
{
296+
memcpy((void *)accessory->cpak_label_backup, cmd->recv.data, sizeof(cmd->recv.data));
297+
// Step 2C: Overwrite the Controller Pak "label" area
298+
for (size_t i = 0; i < sizeof(write_data); ++i) write_data[i] = i;
299+
accessory->state = JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_WRITE;
300+
accessory->error = JOYPAD_ACCESSORY_ERROR_PENDING;
301+
accessory->retries = 0;
302+
joybus_accessory_write_async(
303+
port, JOYBUS_ACCESSORY_ADDR_LABEL, write_data,
304+
joypad_accessory_detect_write_callback, ctx
305+
);
306+
}
307+
else if (state == JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_READ)
295308
{
296309
// Compare the expected label with what was actually read back
297310
for (size_t i = 0; i < sizeof(write_data); ++i) write_data[i] = i;
298311
if (memcmp(cmd->recv.data, write_data, sizeof(write_data)) == 0)
299312
{
300-
// Success: Label write persisted; this appears to be a Controller Pak
301-
accessory->state = JOYPAD_ACCESSORY_STATE_IDLE;
302-
accessory->type = JOYPAD_ACCESSORY_TYPE_CONTROLLER_PAK;
313+
// Step 2E: Restore the Controller Pak "label" area
314+
memcpy(write_data, (void *)accessory->cpak_label_backup, sizeof(write_data));
315+
accessory->state = JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_RESTORE;
316+
accessory->error = JOYPAD_ACCESSORY_ERROR_PENDING;
317+
accessory->retries = 0;
318+
joybus_accessory_write_async(
319+
port, JOYBUS_ACCESSORY_ADDR_LABEL, write_data,
320+
joypad_accessory_detect_write_callback, ctx
321+
);
303322
}
304323
else
305324
{
@@ -418,28 +437,44 @@ static void joypad_accessory_detect_write_callback(uint64_t *out_dwords, void *c
418437
{
419438
// Transfer Pak has been turned off; reset Transfer Pak status
420439
accessory->transfer_pak_status.raw = 0x00;
421-
// Step 2A: Overwrite "label" area to detect Controller Pak
422-
uint8_t data[JOYBUS_ACCESSORY_DATA_SIZE];
423-
for (size_t i = 0; i < sizeof(data); ++i) data[i] = i;
424-
accessory->state = JOYPAD_ACCESSORY_STATE_DETECT_LABEL_WRITE;
440+
// Step 2A: Set Controller Pak "linear paging bank" to 0
441+
uint8_t data[JOYBUS_ACCESSORY_DATA_SIZE] = {0};
442+
accessory->state = JOYPAD_ACCESSORY_STATE_DETECT_CPAK_BANK_WRITE;
425443
accessory->error = JOYPAD_ACCESSORY_ERROR_PENDING;
426444
accessory->retries = 0;
427445
joybus_accessory_write_async(
428-
port, JOYBUS_ACCESSORY_ADDR_LABEL, data,
446+
port, JOYPAD_CONTROLLER_PAK_BANK_SWITCH_ADDRESS, data,
429447
joypad_accessory_detect_write_callback, ctx
430448
);
431449
}
432-
else if (state == JOYPAD_ACCESSORY_STATE_DETECT_LABEL_WRITE)
450+
else if (state == JOYPAD_ACCESSORY_STATE_DETECT_CPAK_BANK_WRITE)
433451
{
434-
// Step 2B: Read back the "label" area to detect Controller Pak
435-
accessory->state = JOYPAD_ACCESSORY_STATE_DETECT_LABEL_READ;
452+
// Step 2B: Backup the Controller Pak "label" area
453+
accessory->state = JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_BACKUP;
436454
accessory->error = JOYPAD_ACCESSORY_ERROR_PENDING;
437455
accessory->retries = 0;
438456
joybus_accessory_read_async(
439457
port, JOYBUS_ACCESSORY_ADDR_LABEL,
440458
joypad_accessory_detect_read_callback, ctx
441459
);
442460
}
461+
else if (state == JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_WRITE)
462+
{
463+
// Step 2D: Read back the "label" area to detect Controller Pak
464+
accessory->state = JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_READ;
465+
accessory->error = JOYPAD_ACCESSORY_ERROR_PENDING;
466+
accessory->retries = 0;
467+
joybus_accessory_read_async(
468+
port, JOYBUS_ACCESSORY_ADDR_LABEL,
469+
joypad_accessory_detect_read_callback, ctx
470+
);
471+
}
472+
else if (state == JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_RESTORE)
473+
{
474+
// Success: Controller Pak detected
475+
accessory->state = JOYPAD_ACCESSORY_STATE_IDLE;
476+
accessory->type = JOYPAD_ACCESSORY_TYPE_CONTROLLER_PAK;
477+
}
443478
else if (state == JOYPAD_ACCESSORY_STATE_DETECT_RUMBLE_PROBE_WRITE)
444479
{
445480
// Step 3B: Read probe value to detect Rumble Pak

src/joypad_accessory.h

+11-4
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,11 @@ typedef enum
3333
JOYPAD_ACCESSORY_STATE_IDLE = 0,
3434
// Accessory detection routine states
3535
JOYPAD_ACCESSORY_STATE_DETECT_INIT,
36-
JOYPAD_ACCESSORY_STATE_DETECT_LABEL_WRITE,
37-
JOYPAD_ACCESSORY_STATE_DETECT_LABEL_READ,
36+
JOYPAD_ACCESSORY_STATE_DETECT_CPAK_BANK_WRITE,
37+
JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_BACKUP,
38+
JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_WRITE,
39+
JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_READ,
40+
JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_RESTORE,
3841
JOYPAD_ACCESSORY_STATE_DETECT_RUMBLE_PROBE_WRITE,
3942
JOYPAD_ACCESSORY_STATE_DETECT_RUMBLE_PROBE_READ,
4043
JOYPAD_ACCESSORY_STATE_DETECT_TRANSFER_PROBE_ON,
@@ -138,6 +141,7 @@ typedef struct joypad_accessory_s
138141
joypad_accessory_state_t state;
139142
joypad_accessory_error_t error;
140143
unsigned retries;
144+
uint8_t cpak_label_backup[JOYBUS_ACCESSORY_DATA_SIZE];
141145
joypad_accessory_io_t io;
142146
timer_link_t *transfer_pak_wait_timer;
143147
joybus_transfer_pak_status_t transfer_pak_status;
@@ -155,8 +159,11 @@ void joypad_accessory_reset(joypad_port_t port);
155159
* @brief Detect which accessory is inserted in an N64 controller.
156160
*
157161
* * Step 1: Ensure Transfer Pak is turned off
158-
* * Step 2A: Overwrite "label" area to detect Controller Pak
159-
* * Step 2B: Read back the "label" area to detect Controller Pak
162+
* * Step 2A: Set Controller Pak "linear paging bank" to 0
163+
* * Step 2B: Backup the Controller Pak "label" area
164+
* * Step 2C: Overwrite the Controller Pak "label" area
165+
* * Step 2D: Read back the "label" area to detect Controller Pak
166+
* * Step 2E: Restore the Controller Pak "label" area
160167
* * Step 3A: Write probe value to detect Rumble Pak
161168
* * Step 3B: Read probe value to detect Rumble Pak
162169
* * Step 4A: Write probe value to detect Transfer Pak

src/rdpq/rdpq.c

+2
Original file line numberDiff line numberDiff line change
@@ -1182,6 +1182,7 @@ extern inline void rdpq_load_tlut_raw(rdpq_tile_t tile, int first_color, int num
11821182
extern inline void rdpq_set_tile_size_fx(rdpq_tile_t tile, uint16_t s0, uint16_t t0, uint16_t s1, uint16_t t1);
11831183
extern inline void rdpq_load_block(rdpq_tile_t tile, uint16_t s0, uint16_t t0, uint16_t num_texels, uint16_t tmem_pitch);
11841184
extern inline void rdpq_load_block_fx(rdpq_tile_t tile, uint16_t s0, uint16_t t0, uint16_t num_texels, uint16_t dxt);
1185+
extern inline void rdpq_load_block_linear(int32_t offset, void *buffer, uint16_t size);
11851186
extern inline void rdpq_load_tile_fx(rdpq_tile_t tile, uint16_t s0, uint16_t t0, uint16_t s1, uint16_t t1);
11861187
extern inline void rdpq_set_combiner_raw(uint64_t cc);
11871188
extern inline void rdpq_set_other_modes_raw(uint64_t mode);
@@ -1192,3 +1193,4 @@ extern inline void rdpq_set_texture_image_raw(uint8_t index, uint32_t offset, te
11921193
extern inline void rdpq_set_lookup_address(uint8_t index, void* rdram_addr);
11931194
extern inline void rdpq_set_tile(rdpq_tile_t tile, tex_format_t format, int32_t tmem_addr, uint16_t tmem_pitch, const rdpq_tileparms_t *parms);
11941195
extern inline void rdpq_call_deferred(void (*func)(void *), void *arg);
1196+
extern inline void rdpq_set_yuv_parms(uint16_t k0, uint16_t k1, uint16_t k2, uint16_t k3, uint16_t k4, uint16_t k5);

src/vi.c

+1
Original file line numberDiff line numberDiff line change
@@ -741,4 +741,5 @@ void vi_init(void)
741741
}
742742

743743
extern inline int vi_get_scanline(int *field);
744+
extern inline void vi_write(volatile uint32_t *reg, uint32_t value);
744745
extern inline uint32_t vi_read(volatile uint32_t *reg);

tools/build-gdb.sh

+6-2
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,16 @@ command_exists () {
4646

4747
# Download the file URL using wget or curl (depending on which is installed)
4848
download () {
49-
if command_exists wget ; then (cd "$DOWNLOAD_PATH" && wget -c "$1")
50-
elif command_exists curl ; then (cd "$DOWNLOAD_PATH" && curl -LO "$1")
49+
local url="$1"
50+
local file="$DOWNLOAD_PATH/$(basename "$url")"
51+
local tmpfile="$file.part"
52+
if command_exists wget ; then wget --continue --output-document "$tmpfile" "$url"
53+
elif command_exists curl ; then curl --location --output "$tmpfile" "$url"
5154
else
5255
echo "Install wget or curl to download toolchain sources" 1>&2
5356
return 1
5457
fi
58+
mv "$tmpfile" "$file"
5559
}
5660

5761
# Dependency downloads and unpack

tools/build-toolchain.sh

+7-3
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,16 @@ command_exists () {
5959

6060
# Download the file URL using wget or curl (depending on which is installed)
6161
download () {
62-
if command_exists wget ; then (cd "$DOWNLOAD_PATH" && wget -c "$1")
63-
elif command_exists curl ; then (cd "$DOWNLOAD_PATH" && curl -LO "$1")
62+
local url="$1"
63+
local file="$DOWNLOAD_PATH/$(basename "$url")"
64+
local tmpfile="$file.part"
65+
if command_exists wget ; then wget --continue --output-document "$tmpfile" "$url"
66+
elif command_exists curl ; then curl --location --output "$tmpfile" "$url"
6467
else
6568
echo "Install wget or curl to download toolchain sources" 1>&2
6669
return 1
6770
fi
71+
mv "$tmpfile" "$file"
6872
}
6973

7074
# Compilation on macOS via homebrew
@@ -220,7 +224,7 @@ pushd gcc_compile_target
220224
--with-newlib \
221225
--disable-win32-registry \
222226
--disable-nls \
223-
--disable-werror
227+
--disable-werror
224228
make all-gcc -j "$JOBS"
225229
make install-gcc || sudo make install-gcc || su -c "make install-gcc"
226230
make all-target-libgcc -j "$JOBS"

0 commit comments

Comments
 (0)