PowerBlocks SDK
 
Loading...
Searching...
No Matches
gx.h
Go to the documentation of this file.
1
12
13#pragma once
14
15#include <stdint.h>
16#include <stdbool.h>
17
18#include "framebuffer.h"
19#include "video.h"
20
21#include "FreeRTOS.h"
22#include "task.h"
23
24#define GX_WPAR_ADDRESS 0xCC008000
25
26// The write gather pipeline will collect writes to these and
27// put them into the GX FIFO
28#define GX_WPAR_U8 (*(volatile uint8_t*)GX_WPAR_ADDRESS)
29#define GX_WPAR_U16 (*(volatile uint16_t*)GX_WPAR_ADDRESS)
30#define GX_WPAR_U32 (*(volatile uint32_t*)GX_WPAR_ADDRESS)
31#define GX_WPAR_S8 (*(volatile int8_t*)GX_WPAR_ADDRESS)
32#define GX_WPAR_S16 (*(volatile int16_t*)GX_WPAR_ADDRESS)
33#define GX_WPAR_S32 (*(volatile int32_t*)GX_WPAR_ADDRESS)
34#define GX_WPAR_F32 (*(volatile float*)GX_WPAR_ADDRESS)
35
36// Some useful defines regarding GX FIFO Spec
37#define GX_FIFO_MINIMUM_SIZE (64 * 1024) // Standard small fifo size
38#define GX_FIFO_WATERMARK (16 * 1024) // How many bytes to too full and too low level
39
40#include "gx_xf.h"
41#include "gx_tev.h"
42#include "gx_immediate.h"
43
44// Vertex Data Type
45typedef enum {
46 GX_VTXATTR_DATA_DISABLED,
47 GX_VTXATTR_DATA_DIRECT,
48 GX_VTXATTR_DATA_INDEX8,
49 GX_VTXATTR_DATA_INDEX16
50} gx_vtxattr_data_t;
51
52typedef enum {
53 GX_VTXDESC_POSNORM_INDEX,
54 GX_VTXDESC_TEXCOORDMTX0,
55 GX_VTXDESC_TEXCOORDMTX1,
56 GX_VTXDESC_TEXCOORDMTX2,
57 GX_VTXDESC_TEXCOORDMTX3,
58 GX_VTXDESC_TEXCOORDMTX4,
59 GX_VTXDESC_TEXCOORDMTX5,
60 GX_VTXDESC_TEXCOORDMTX6,
61 GX_VTXDESC_TEXCOORDMTX7,
62 GX_VTXDESC_POSITION,
63 GX_VTXDESC_NORMAL,
64 GX_VTXDESC_NORMAL_NBT,
65 GX_VTXDESC_COLOR0,
66 GX_VTXDESC_COLOR1,
67 GX_VTXDESC_TEXCOORD0,
68 GX_VTXDESC_TEXCOORD1,
69 GX_VTXDESC_TEXCOORD2,
70 GX_VTXDESC_TEXCOORD3,
71 GX_VTXDESC_TEXCOORD4,
72 GX_VTXDESC_TEXCOORD5,
73 GX_VTXDESC_TEXCOORD6,
74 GX_VTXDESC_TEXCOORD7
75} gx_vtxdesc_t;
76
77typedef enum {
78 GX_VTXATTR_POS_XY = 0,
79 GX_VTXATTR_POS_XYZ = 1,
80
81 GX_VTXATTR_RGB = 0,
82 GX_VTXATTR_RGBA = 1,
83
84 GX_VTXATTR_NRM_XYZ = 0,
85 GX_VTXATTR_NRM_NBT = 1,
86 GX_VTXATTR_NRM_NBT3 = 3,
87
88 GX_VTXATTR_TEX_S = 0,
89 GX_VTXATTR_TEX_ST = 1
90} gx_vtxattr_component_t;
91
92typedef enum {
93 GX_VTXATTR_U8 = 0,
94 GX_VTXATTR_S8,
95 GX_VTXATTR_U16,
96 GX_VTXATTR_S16,
97 GX_VTXATTR_F32,
98
99 GX_VTXATTR_RGB565 = 0,
100 GX_VTXATTR_RGB8,
101 GX_VTXATTR_RGBX8,
102 GX_VTXATTR_RGBA4,
103 GX_VTXATTR_RGBA6,
104 GX_VTXATTR_RGBA8
105} gx_vtxattr_component_format_t;
106
107typedef enum {
108 GX_LINES = 0xA8,
109 GX_LINESTRIP = 0xB0,
110 GX_POINTS = 0xB8,
111 GX_QUADS = 0x80,
112 GX_TRIANGLE_FAN = 0xA0,
113 GX_TRIANGLES = 0x90,
114 GX_TRIANGLE_STRIP = 0x98
115} gx_primitive_t;
116
117typedef enum {
118 GX_COMPARE_NEVER,
119 GX_COMPARE_LESS,
120 GX_COMPARE_EQUAL,
121 GX_COMPARE_LESS_EQUAL,
122 GX_COMPARE_GREATER,
123 GX_COMPARE_NOT_EQUAL,
124 GX_COMPARE_GREATER_EQUAL,
125 GX_COMPARE_ALWAYS
126} gx_compare_t;
127
128typedef enum {
129 GX_PIXEL_FORMAT_RGB8_Z24,
130 GX_PIXEL_FORMAT_RGBA6_Z24,
131 GX_PIXEL_FORMAT_RGB565_Z16,
132 GX_PIXEL_FORMAT_Z24,
133 GX_PIXEL_FORMAT_Y8,
134 GX_PIXEL_FORMAT_U8,
135 GX_PIXEL_FORMAT_V8,
136 GX_PIXEL_FORMAT_YUV420
137} gx_pixel_format_t;
138
139typedef enum {
140 GX_Z_FORMAT_LINEAR,
141 GX_Z_FORMAT_NEAR,
142 GX_Z_FORMAT_MID,
143 GX_Z_FORMAT_FAR
144} gx_z_format_t;
145
146typedef enum {
147 GX_CLAMP_MODE_NONE,
148 GX_CLAMP_MODE_TOP,
149 GX_CLAMP_MODE_BOTTOM,
150 GX_CLAMP_MODE_TOP_BOTTOM,
151} gx_clamp_mode_t;
152
153typedef enum {
154 GX_GAMMA_1_0, // 1.0
155 GX_GAMMA_1_7, // 1.7
156 GX_GAMMA_2_2 // 2.2
157} gx_gamma_t;
158
159typedef enum {
160 GX_LINE_MODE_PROGRESSIVE,
161 GX_LINE_MODE_EVEN = 2,
162 GX_LINE_MODE_ODD,
163} gx_line_mode_t;
164
165// So in actual hardware, the first 4, and last 4 textures are in
166// separated memory addresses. I kept the enum simple though since
167// I did not want it messing with things.
168typedef enum {
169 GX_TEXTURE_ID_0,
170 GX_TEXTURE_ID_1,
171 GX_TEXTURE_ID_2,
172 GX_TEXTURE_ID_3,
173 GX_TEXTURE_ID_4,
174 GX_TEXTURE_ID_5,
175 GX_TEXTURE_ID_6,
176 GX_TEXTURE_ID_7
177} gx_texture_id_t;
178
179#define GX_WPAR_OPCODE_LOAD_CP 0x08
180#define GX_WPAR_OPCODE_LOAD_XF 0x10
181#define GX_WPAR_OPCODE_LOAD_BP 0x61
182#define GX_WPAR_OPCODE_PRIMITIVE(type, format) (((uint8_t)type) | format)
183
184#define GX_XF_MEMORY_POSTEX_MTX_0 0x0000
185#define GX_XF_MEMORY_NORMAL_MTX_0 0x0400
186#define GX_XF_MEMORY_DUALTEX_MTX_0 0x0500
187#define GX_XF_MEMORY_LIGHT0 0x0600
188#define GX_XF_REGISTER_VERTEX_STATS 0x1008
189#define GX_XF_REGISTER_COLOR_COUNT 0x1009
190#define GX_XF_REGISTER_COLOR_CONTROL 0x100E
191#define GX_XF_REGISTER_DUALTEXTRANS 0x1012
192#define GX_XF_REGISTER_MTXIDX_A 0x1018
193#define GX_XF_REGISTER_MTXIDX_B 0x1019
194#define GX_XF_REGISTER_VIEWPORT 0x101A
195#define GX_XF_REGISTER_PROJECTION 0x1020
196#define GX_XF_REGISTER_TEXCOORD_COUNT 0x103F
197#define GX_XF_REGISTER_TEX0 0x1040
198#define GX_XF_REGISTER_DUALTEX0 0x1050
199
200#define GX_BP_REGISTERS_GENMODE (0x00 << 24)
201#define GX_BP_REGISTERS_COPY_FILTER_POS_A (0x01 << 24)
202#define GX_BP_REGISTERS_COPY_FILTER_POS_B (0x02 << 24)
203#define GX_BP_REGISTERS_COPY_FILTER_POS_C (0x03 << 24)
204#define GX_BP_REGISTERS_COPY_FILTER_POS_D (0x04 << 24)
205#define GX_BP_REGISTERS_SCISSOR_TL (0x20 << 24)
206#define GX_BP_REGISTERS_SCISSOR_BR (0x21 << 24)
207#define GX_BP_REGISTERS_SSIZE0 (0x30 << 24)
208#define GX_BP_REGISTERS_TSIZE0 (0x31 << 24)
209#define GX_BP_REGISTERS_Z_MODE (0x40 << 24)
210#define GX_BP_REGISTERS_CMODE_0 (0x41 << 24)
211#define GX_BP_REGISTERS_CMODE_1 (0x42 << 24)
212#define GX_BP_REGISTERS_PE_CONTROL (0X43 << 24)
213#define GX_BP_REGISTERS_PE_DONE (0x45 << 24)
214#define GX_BP_REGISTERS_EFB_SOURCE_TOP_LEFT (0x49 << 24)
215#define GX_BP_REGISTERS_EFB_SOURCE_WIDTH_HEIGHT (0x4A << 24)
216#define GX_BP_REGISTERS_XFB_TARGET_ADDRESS (0x4B << 24)
217#define GX_BP_REGISTERS_EFB_DESTINATION_WIDTH (0x4D << 24)
218#define GX_BP_REGISTERS_Y_SCALE (0x4E << 24)
219#define GX_BP_REGISTERS_PE_COPY_CLEAR_AR (0x4F << 24)
220#define GX_BP_REGISTERS_PE_COPY_CLEAR_GB (0x50 << 24)
221#define GX_BP_REGISTERS_PE_COPY_CLEAR_Z (0x51 << 24)
222#define GX_BP_REGISTERS_PE_COPY_EXECUTE (0x52 << 24)
223#define GX_BP_REGISTERS_COPY_FILTER_COEFF_A (0x53 << 24)
224#define GX_BP_REGISTERS_COPY_FILTER_COEFF_B (0x54 << 24)
225#define GX_BP_REGISTERS_SCISSOR_OFFSET (0x59 << 24)
226#define GX_BP_REGISTERS_TX_SETMODE0_I0 (0x80 << 24) // 0-3 HERE, 4-7 AT 0XA0
227#define GX_BP_REGISTERS_TX_SETMODE1_I0 (0x84 << 24) // 0-3 HERE, 4-7 AT 0XA4
228#define GX_BP_REGISTERS_TX_SETIMAGE0_I0 (0x88 << 24) // 0-3 HERE, 4-7 AT 0XA8
229#define GX_BP_REGISTERS_TX_SETIMAGE1_I0 (0x8C << 24) // 0-3 HERE, 4-7 AT 0XAC
230#define GX_BP_REGISTERS_TX_SETIMAGE2_I0 (0x90 << 24) // 0-3 HERE, 4-7 AT 0XB0
231#define GX_BP_REGISTERS_TX_SETIMAGE3_I0 (0x94 << 24) // 0-3 HERE, 4-7 AT 0XB4
232#define GX_BP_REGISTERS_TX_SETTLUT_0 (0x98 << 24) // 0-3 HERE, 4-7 AT 0XB8
233#define GX_BP_REGISTERS_TEV0_COLOR_ENV (0xC0 << 24)
234#define GX_BP_REGISTERS_TEV0_ALPHA_ENV (0xC1 << 24)
235#define GX_BP_REGISTERS_TEV_REGISTERL_0 (0xE0 << 24)
236#define GX_BP_REGISTERS_TEV_REGISTERH_0 (0xE1 << 24)
237
238#define GX_CP_REGISTERS_MTXIDX_A 0x30
239#define GX_CP_REGISTERS_MTXIDX_B 0x40
240#define GX_CP_REGISTER_VCD_LOW 0x50
241#define GX_CP_REGISTER_VCD_HIGH 0x60
242#define GX_CP_REGISTER_VAT_A 0x70
243#define GX_CP_REGISTER_VAT_B 0x80
244#define GX_CP_REGISTER_VAT_C 0x90
245
246// Load a 32 bit value into the command processor
247// through the pipeline.
248#define GX_WPAR_CP_LOAD(address, value) \
249 GX_WPAR_U8 = GX_WPAR_OPCODE_LOAD_CP; /* Load CP Command */ \
250 GX_WPAR_U8 = address; /* Register Address */ \
251 GX_WPAR_U32 = value; /* Register Value */
252
253// Load some amount of 32 bit values onto the XF
254// To be followed with each value on the WPAR.
255#define GX_WPAR_XF_LOAD(address, words) \
256 GX_WPAR_U8 = GX_WPAR_OPCODE_LOAD_XF; /* Load XF Command */ \
257 GX_WPAR_U16 = (words) - 1; /* Load N-1 32 bit values */ \
258 GX_WPAR_U16 = address; /* Register Address */
259
260// Loads a BP register. The upper 8 bits are the register address
261// The lower 24 are the value. We have just combined them here due to avoid dealing with 24 bit imm
262#define GX_WPAR_BP_LOAD(value) \
263 GX_WPAR_U8 = GX_WPAR_OPCODE_LOAD_BP; /* Load BP Command */ \
264 GX_WPAR_U32 = value; /* Combined 8 bit address and 24 bit value. */
265
266
275typedef struct {
276 uint32_t base_address;
277 uint32_t end_address;
278 uint32_t high_watermark;
279 uint32_t low_watermark;
280 uint32_t distance;
281 uint32_t write_head;
282 uint32_t read_head;
283 uint32_t breakpoint;
284} gx_fifo_t;
285
289typedef struct {
290 // Texture Control Registers
291 uint32_t mode0; // lookup and filtering register
292 uint32_t mode1; // LOD data
293 uint32_t image0; // Width, hight, format
294 uint32_t image1; // even LOD address in TMEM
295 uint32_t image2; // odd LOD address in TMEM
296 uint32_t image3; // Address in main memory
297 uint32_t lut; // offset + format
299
300typedef enum {
301 GX_TEXTURE_FORMAT_I4, // 4 Ininstty/Brightness Bits
302 GX_TEXTURE_FORMAT_I8, // 8 Ininstty/Brightness Bits
303 GX_TEXTURE_FORMAT_IA4, // 4 Intensity + 4 Alpha
304 GX_TEXTURE_FORMAT_IA8, // 8 Intensity + 8 Alpha
305 GX_TEXTURE_FORMAT_RGB565, // 5 Red + 6 Green + 5 Blue
306 GX_TEXTURE_FORMAT_RGB5A3, // 5 bits each for R, G, and B, then 3 for alpha
307 GX_TEXTURE_FORMAT_RGBA8, // 8 bits for each R, G, B, and A
308 GX_TEXTURE_FORMAT_C4 = 8, // 4 bit color indexing
309 GX_TEXTURE_FORMAT_C8, // 8 bit color indexing
310 GX_TEXTURE_FORMAT_C14X2, // 14 bit indexing + 2 alignment bits?
311 GX_TEXTURE_FORMAT_CMP = 14 // Compressed
312} gx_texture_format_t;
313
314typedef enum {
315 GX_WRAP_CLAMP,
316 GX_WRAP_REPEAT,
317 GX_WRAP_MIRROR
318} gx_texture_wrap_t;
319
320// This is used internally when decoding texture formats
321typedef enum {
322 GX_TEXTURE_MIN_FILTER_NEAR,
323 GX_TEXTURE_MIN_FILTER_NEAR_MIP,
324 GX_TEXTURE_MIN_FILTER_NEAR_MIP_LINEAR,
325 GX_TEXTURE_MIN_FILTER_LINEAR = 4,
326 GX_TEXTURE_MIN_FILTER_LINEAR_MIP_NEAR,
327 GX_TEXTURE_MIN_FILTER_LINEAR_MIP_LINEAR,
328} gx_texture_min_filter;
329
342extern void gx_initialize(const gx_fifo_t* fifo, const video_profile_t* video_profile);
343
355extern void gx_initialize_state();
356
363extern void gx_initialize_video(const video_profile_t* video_profile);
364
374extern void gx_fifo_initialize(gx_fifo_t* fifo, void* fifo_buffer, uint32_t fifo_buffer_size);
375
386extern void gx_fifo_set(const gx_fifo_t* fifo);
387
396extern void gx_fifo_get(gx_fifo_t* fifo);
397
408extern void gx_flush();
409
419extern uint32_t gx_efb_peak(uint32_t x, uint32_t y);
420
430extern void gx_fifo_initialize(gx_fifo_t* fifo, void* fifo_buffer, uint32_t fifo_buffer_size);
431
443extern void gx_vtxdesc_clear();
444
460extern void gx_vtxdesc_set(gx_vtxdesc_t desc, gx_vtxattr_data_t type);
461
475extern void gx_vtxfmtattr_clear(uint8_t attribute_index);
476
489extern void gx_vtxfmtattr_set(uint8_t attribute_index, gx_vtxdesc_t attribute, gx_vtxattr_component_t component, gx_vtxattr_component_format_t fmt, uint8_t fraction);
490
501extern void gx_begin(gx_primitive_t primitive, uint8_t attribute, uint16_t count);
502
511#define gx_end()
512
519extern void gx_draw_done();
520
535extern void gx_set_render_thread(TaskHandle_t task);
536
548extern void gx_set_clear_color(uint8_t r, uint8_t g, uint8_t b, uint8_t a);
549
557extern void gx_set_clear_z(uint32_t z);
558
566extern void gx_set_copy_y_scale(float y_scale);
567
583extern void gx_set_scissor_rectangle(uint32_t x, uint32_t y, uint32_t width, uint32_t height);
584
595extern void gx_set_scissor_offset(int32_t x, int32_t y);
596
608extern void gx_set_copy_window(uint32_t x, uint32_t y, uint32_t width, uint32_t height, uint32_t xfb_width);
609
617extern void gx_set_clamp_mode(gx_clamp_mode_t mode);
618
626extern void gx_set_gamma(gx_gamma_t gamma);
627
636extern void gx_set_line_mode(gx_line_mode_t line_mode);
637
663extern void gx_set_copy_filter(const uint8_t pattern[12][2], const uint8_t filter[7]);
664
672extern void gx_set_z_mode(bool enable_compare, gx_compare_t compare, bool enable_update);
673
680extern void gx_set_color_update(bool update_color, bool update_alpha);
681
696extern void gx_enable_z_precheck(bool enable);
697
707extern void gx_set_pixel_format(gx_pixel_format_t pixels_format, gx_z_format_t z_format);
708
719extern void gx_copy_framebuffer(framebuffer_t* framebuffer, bool clear);
720
721/* -------------------Textures--------------------- */
738extern void gx_initialize_texture(gx_texture_t* texture, const void* data, gx_texture_format_t format, int width, int height,
739 gx_texture_wrap_t s_wrap, gx_texture_wrap_t t_wrap, bool mipmap);
740
752extern void gx_flash_texture(gx_texture_map_t map, const gx_texture_t* texture);
Functions for managing and rendering framebuffers.
void gx_flush()
Flushes all commands to the command processor.
Definition gx.c:736
void gx_vtxfmtattr_set(uint8_t attribute_index, gx_vtxdesc_t attribute, gx_vtxattr_component_t component, gx_vtxattr_component_format_t fmt, uint8_t fraction)
Sets the format of a vertex attribute.
Definition gx.c:859
void gx_set_copy_window(uint32_t x, uint32_t y, uint32_t width, uint32_t height, uint32_t xfb_width)
Sets the window to of the EFB into the XFB.
Definition gx.c:991
void gx_set_render_thread(TaskHandle_t task)
Sets the current render thread for suspension.
Definition gx.c:950
void gx_fifo_set(const gx_fifo_t *fifo)
Sets the current FIFO.
Definition gx.c:699
uint32_t gx_efb_peak(uint32_t x, uint32_t y)
Grabs a pixel from the embedded frame buffer.
Definition gx.c:749
void gx_begin(gx_primitive_t primitive, uint8_t attribute, uint16_t count)
Begin drawing primatives.
Definition gx.c:929
void gx_copy_framebuffer(framebuffer_t *framebuffer, bool clear)
Copys the internal framebuffer to the external frame buffer.
Definition gx.c:1101
void gx_set_scissor_rectangle(uint32_t x, uint32_t y, uint32_t width, uint32_t height)
Sets the scissor rectangle.
Definition gx.c:975
void gx_set_gamma(gx_gamma_t gamma)
Sets the gamma value when copying from EFB to XFB.
Definition gx.c:1001
void gx_initialize_state()
Initializes the graphics state.
Definition gx.c:565
void gx_set_pixel_format(gx_pixel_format_t pixels_format, gx_z_format_t z_format)
Sets the format of pixels in the EFB.
Definition gx.c:1075
void gx_set_z_mode(bool enable_compare, gx_compare_t compare, bool enable_update)
Determins how Z values will be treated.
Definition gx.c:1048
void gx_set_clear_color(uint8_t r, uint8_t g, uint8_t b, uint8_t a)
Sets the background color when copying framebuffers.
Definition gx.c:954
void gx_set_scissor_offset(int32_t x, int32_t y)
Offsets the scissor rectangle.
Definition gx.c:985
void gx_set_line_mode(gx_line_mode_t line_mode)
Sets the what lines are copied from EFB to XFB.
Definition gx.c:1005
void gx_set_clear_z(uint32_t z)
Sets the z value the frame buffer is cleared with.
Definition gx.c:959
void gx_flash_texture(gx_texture_map_t map, const gx_texture_t *texture)
Flashes a texture configuration onto the BP.
Definition gx.c:1175
void gx_enable_z_precheck(bool enable)
Enables / Disables checking Z before or after texturing.
Definition gx.c:1068
void gx_initialize_video(const video_profile_t *video_profile)
Initializes all the video settings from a video profile.
Definition gx.c:674
void gx_fifo_initialize(gx_fifo_t *fifo, void *fifo_buffer, uint32_t fifo_buffer_size)
Creates the fifo data structure.
Definition gx.c:682
void gx_vtxfmtattr_clear(uint8_t attribute_index)
Clears out a vertex attribute format.
Definition gx.c:852
void gx_vtxdesc_clear()
Clears out all vertex descriptions.
Definition gx.c:759
void gx_set_copy_filter(const uint8_t pattern[12][2], const uint8_t filter[7])
Sets the interpolation filters used when copying the frame buffer into external frame buffers of diff...
Definition gx.c:1009
void gx_set_copy_y_scale(float y_scale)
Sets the scale of the EFB to the XFB's Y.
Definition gx.c:963
void gx_initialize(const gx_fifo_t *fifo, const video_profile_t *video_profile)
Initializes the graphics.
Definition gx.c:518
void gx_draw_done()
Call to send end current drawing session. Then wait.
Definition gx.c:939
void gx_vtxdesc_set(gx_vtxdesc_t desc, gx_vtxattr_data_t type)
Sets a vertex description.
Definition gx.c:766
void gx_fifo_get(gx_fifo_t *fifo)
Gets the current FIFO.
Definition gx.c:724
void gx_set_clamp_mode(gx_clamp_mode_t mode)
Set the clamp mode when copying from EFB to XFB.
Definition gx.c:997
void gx_initialize_texture(gx_texture_t *texture, const void *data, gx_texture_format_t format, int width, int height, gx_texture_wrap_t s_wrap, gx_texture_wrap_t t_wrap, bool mipmap)
Initializes a texture object for use.
Definition gx.c:1146
void gx_set_color_update(bool update_color, bool update_alpha)
Enables updating the color when rendering into the EFB.
Definition gx.c:1056
Extension of GX with the immediate draw calls.
TEV definitions.
XF definitions and function of GX.
Data format for framebuffers.
Definition framebuffer.h:28
Represents the a fifo for the Command Processor.
Definition gx.h:275
Cool little texture object. Really just a copy of the registers that will be set onto the GPU when th...
Definition gx.h:289
Definition video.h:42
Manages the video output of the system.