8#ifndef __LIBDRAGON_RDPQ_INTERNAL_H
9#define __LIBDRAGON_RDPQ_INTERNAL_H
13#include "../rspq/rspq_internal.h"
59 uint8_t cycle_type_frozen : 2;
74typedef struct rdpq_block_s {
77 uint32_t cmds[] __attribute__((aligned(8)));
85typedef struct rdpq_block_state_s {
126void __rdpq_write8(uint32_t cmd_id, uint32_t arg0, uint32_t arg1);
127void __rdpq_write16(uint32_t cmd_id, uint32_t arg0, uint32_t arg1, uint32_t arg2, uint32_t arg3);
135#define __rdpcmd_count_words2(rdp_cmd_id, arg0, ...) nwords += __COUNT_VARARGS(__VA_ARGS__) + 1;
136#define __rdpcmd_count_words(arg) __rdpcmd_count_words2 arg
138#define __rdpcmd_write_arg(arg) *ptr++ = arg;
139#define __rdpcmd_write2(rdp_cmd_id, arg0, ...) \
140 *ptr++ = (RDPQ_OVL_ID + ((rdp_cmd_id)<<24)) | (arg0); \
141 __CALL_FOREACH_BIS(__rdpcmd_write_arg, ##__VA_ARGS__);
142#define __rdpcmd_write(arg) __rdpcmd_write2 arg
144#define __rspcmd_write(...) ({ rspq_write(RDPQ_OVL_ID, __VA_ARGS__ ); })
163#define rdpq_passthrough_write(rdp_cmd) ({ \
164 if (__builtin_expect(rspq_in_block(), 0)) { \
165 extern rdpq_block_state_t rdpq_block_state; \
166 int nwords = 0; __rdpcmd_count_words(rdp_cmd); \
167 if (__builtin_expect(rdpq_block_state.wptr + nwords > rdpq_block_state.wend, 0)) \
168 __rdpq_block_next_buffer(); \
169 volatile uint32_t *ptr = rdpq_block_state.wptr; \
170 __rdpcmd_write(rdp_cmd); \
171 __rdpq_block_update((uint32_t*)ptr); \
173 __rspcmd_write rdp_cmd; \
rdpq_tracking_t tracking
Tracking state at the end of a block (this is populated only on the first link)
Definition rdpq_internal.h:76
rdpq_block_t * __rdpq_block_end()
Finish creation of a RDP block.
Definition rdpq.c:717
void __rdpq_autosync_change(uint32_t res)
Autosync engine: mark certain resources as being changed.
Definition rdpq.c:589
volatile uint32_t * wptr
During block creation, current write pointer within the RDP buffer.
Definition rdpq_internal.h:87
void __rdpq_autosync_use(uint32_t res)
Autosync engine: mark certain resources as in use.
Definition rdpq_internal.h:120
bool __rdpq_inited
True if the rdpq module was inited.
Definition rdpq.c:400
uint8_t cycle_type_known
0=unknown, 1=standard, 2=copy/fill
Definition rdpq_internal.h:58
rdpq_block_t * next
Link to next buffer (or NULL if this is the last one for this block)
Definition rdpq_internal.h:75
void __rdpq_block_begin()
Initialize RDP block mangament.
Definition rdpq.c:626
volatile uint32_t * pending_wend
Previous wend, swapped out to go back to dynamic buffer.
Definition rdpq_internal.h:93
void rdpq_triangle_rsp(const rdpq_trifmt_t *fmt, const float *v1, const float *v2, const float *v3)
RDP triangle primitive assembled on the RSP.
Definition rdpq_tri.c:467
void __rdpq_block_run(rdpq_block_t *block)
Notify that a rspq block was run (called by rspq_block_run).
Definition rdpq.c:742
rdpq_tracking_t rdpq_tracking
Tracking state of RDP.
Definition rdpq.c:409
void __rdpq_write16(uint32_t cmd_id, uint32_t arg0, uint32_t arg1, uint32_t arg2, uint32_t arg3)
Write a standard 16-byte RDP command
Definition rdpq.c:937
uint32_t autosync
State of the autosync engine.
Definition rdpq_internal.h:54
void __rdpq_block_free(rdpq_block_t *block)
Free a block.
Definition rdpq.c:796
rdpq_block_t * last_node
Point to the RDP block being created.
Definition rdpq_internal.h:95
void __rdpq_block_reserve(int num_rdp_commands)
Reserve space in the RDP static buffer for a number of RDP commands.
Definition rdpq.c:814
void __rdpq_block_next_buffer(void)
Allocate a new RDP block buffer, chaining it to the current one (if any)
Definition rdpq.c:648
bool mode_freeze
True if the mode changes are currently frozen.
Definition rdpq_internal.h:56
volatile uint32_t * pending_wptr
Previous wptr, swapped out to go back to dynamic buffer.
Definition rdpq_internal.h:91
rdpq_block_t * first_node
Point to the first link of the RDP block being created.
Definition rdpq_internal.h:97
volatile uint32_t * wend
During block creation, pointer to the end of the RDP buffer.
Definition rdpq_internal.h:89
void rdpq_triangle_cpu(const rdpq_trifmt_t *fmt, const float *v1, const float *v2, const float *v3)
RDP triangle primitive assembled on the CPU.
Definition rdpq_tri.c:412
volatile uint32_t * last_rdp_append_buffer
Definition rdpq_internal.h:105
void rdpq_fence(void)
Public rdpq_fence API, redefined it.
Definition rdpq.c:518
void __rdpq_write8(uint32_t cmd_id, uint32_t arg0, uint32_t arg1)
Write a standard 8-byte RDP command.
Definition rdpq.c:905
rdpq_tracking_t previous_tracking
Tracking state before starting building the block.
Definition rdpq_internal.h:109
int bufsize
Current buffer size for RDP blocks.
Definition rdpq_internal.h:99
void __rdpq_block_update(volatile uint32_t *wptr)
Set a new RDP write pointer, and enqueue a RSP command to run the buffer until there.
Definition rdpq.c:863
RDP block management state.
Definition rdpq_internal.h:85
A buffer that piggybacks onto rspq_block_t to store RDP commands.
Definition rdpq_internal.h:74
RDP tracking state.
Definition rdpq_internal.h:41
Format descriptor of a triangle.
Definition rdpq_tri.h:35