|
|
|
@ -14,14 +14,23 @@ static const u32 kFrameTicks = kFrameCycles / 3; ///< Approximate number of i |
|
|
|
|
|
|
|
struct Registers { |
|
|
|
enum Id : u32 { |
|
|
|
FramebufferTopLeft1 = 0x1EF00468, // Main LCD, first framebuffer for 3D left |
|
|
|
FramebufferTopLeft2 = 0x1EF0046C, // Main LCD, second framebuffer for 3D left |
|
|
|
FramebufferTopRight1 = 0x1EF00494, // Main LCD, first framebuffer for 3D right |
|
|
|
FramebufferTopRight2 = 0x1EF00498, // Main LCD, second framebuffer for 3D right |
|
|
|
FramebufferSubLeft1 = 0x1EF00568, // Sub LCD, first framebuffer |
|
|
|
FramebufferSubLeft2 = 0x1EF0056C, // Sub LCD, second framebuffer |
|
|
|
FramebufferSubRight1 = 0x1EF00594, // Sub LCD, unused first framebuffer |
|
|
|
FramebufferSubRight2 = 0x1EF00598, // Sub LCD, unused second framebuffer |
|
|
|
FramebufferTopSize = 0x1EF0045C, |
|
|
|
FramebufferTopLeft1 = 0x1EF00468, // Main LCD, first framebuffer for 3D left |
|
|
|
FramebufferTopLeft2 = 0x1EF0046C, // Main LCD, second framebuffer for 3D left |
|
|
|
FramebufferTopFormat = 0x1EF00470, |
|
|
|
FramebufferTopSwapBuffers = 0x1EF00478, |
|
|
|
FramebufferTopStride = 0x1EF00490, // framebuffer row stride? |
|
|
|
FramebufferTopRight1 = 0x1EF00494, // Main LCD, first framebuffer for 3D right |
|
|
|
FramebufferTopRight2 = 0x1EF00498, // Main LCD, second framebuffer for 3D right |
|
|
|
|
|
|
|
FramebufferSubSize = 0x1EF0055C, |
|
|
|
FramebufferSubLeft1 = 0x1EF00568, // Sub LCD, first framebuffer |
|
|
|
FramebufferSubLeft2 = 0x1EF0056C, // Sub LCD, second framebuffer |
|
|
|
FramebufferSubFormat = 0x1EF00570, |
|
|
|
FramebufferSubSwapBuffers = 0x1EF00578, |
|
|
|
FramebufferSubStride = 0x1EF00590, // framebuffer row stride? |
|
|
|
FramebufferSubRight1 = 0x1EF00594, // Sub LCD, unused first framebuffer |
|
|
|
FramebufferSubRight2 = 0x1EF00598, // Sub LCD, unused second framebuffer |
|
|
|
|
|
|
|
DisplayInputBufferAddr = 0x1EF00C00, |
|
|
|
DisplayOutputBufferAddr = 0x1EF00C04, |
|
|
|
@ -36,6 +45,15 @@ struct Registers { |
|
|
|
ProcessCommandList = 0x1EF018F0, |
|
|
|
}; |
|
|
|
|
|
|
|
enum class FramebufferFormat : u32 { |
|
|
|
RGBA8 = 0, |
|
|
|
RGB8 = 1, |
|
|
|
RGB565 = 2, |
|
|
|
RGB5A1 = 3, |
|
|
|
RGBA4 = 4, |
|
|
|
}; |
|
|
|
|
|
|
|
// TODO: Move these into the framebuffer struct |
|
|
|
u32 framebuffer_top_left_1; |
|
|
|
u32 framebuffer_top_left_2; |
|
|
|
u32 framebuffer_top_right_1; |
|
|
|
@ -45,6 +63,31 @@ struct Registers { |
|
|
|
u32 framebuffer_sub_right_1; |
|
|
|
u32 framebuffer_sub_right_2; |
|
|
|
|
|
|
|
struct FrameBufferConfig { |
|
|
|
union { |
|
|
|
u32 size; |
|
|
|
|
|
|
|
BitField< 0, 16, u32> width; |
|
|
|
BitField<16, 16, u32> height; |
|
|
|
}; |
|
|
|
|
|
|
|
union { |
|
|
|
u32 format; |
|
|
|
|
|
|
|
BitField< 0, 3, FramebufferFormat> color_format; |
|
|
|
}; |
|
|
|
|
|
|
|
union { |
|
|
|
u32 active_fb; |
|
|
|
|
|
|
|
BitField<0, 1, u32> second_fb_active; |
|
|
|
}; |
|
|
|
|
|
|
|
u32 stride; |
|
|
|
}; |
|
|
|
FrameBufferConfig top_framebuffer; |
|
|
|
FrameBufferConfig sub_framebuffer; |
|
|
|
|
|
|
|
struct { |
|
|
|
u32 input_address; |
|
|
|
u32 output_address; |
|
|
|
@ -75,8 +118,8 @@ struct Registers { |
|
|
|
u32 flags; |
|
|
|
|
|
|
|
BitField< 0, 1, u32> flip_data; |
|
|
|
BitField< 8, 3, u32> input_format; |
|
|
|
BitField<12, 3, u32> output_format; |
|
|
|
BitField< 8, 3, FramebufferFormat> input_format; |
|
|
|
BitField<12, 3, FramebufferFormat> output_format; |
|
|
|
BitField<16, 1, u32> output_tiled; |
|
|
|
}; |
|
|
|
|
|
|
|
|