aboutsummaryrefslogtreecommitdiff
path: root/ctru-sys/src/services/gspgpu.rs
blob: 72658124c1d5c0363c634fc9cac231d6b0a98178 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
use ::{Handle, Result};
use ::c_void;
use ::types::*;

#[inline]
pub fn GSPGPU_REBASE_REG(r: u32) {
    ((r)-0x1EB00000);
}

#[repr(C)]
#[derive(Copy)]
pub struct GSPGPU_FramebufferInfo {
    pub active_framebuf: u32,
    pub framebuf0_vaddr: *mut u32,
    pub framebuf1_vaddr: *mut u32,
    pub framebuf_widthbytesize: u32,
    pub format: u32,
    pub framebuf_dispselect: u32,
    pub unk: u32,
}
impl ::core::clone::Clone for GSPGPU_FramebufferInfo {
    fn clone(&self) -> Self { *self }
}
impl ::core::default::Default for GSPGPU_FramebufferInfo {
    fn default() -> Self { unsafe { ::core::mem::zeroed() } }
}

#[derive(Clone, Copy)]
#[repr(C)]
pub enum GSPGPU_FramebufferFormats {
    GSP_RGBA8_OES = 0,
    GSP_BGR8_OES = 1,
    GSP_RGB565_OES = 2,
    GSP_RGB5_A1_OES = 3,
    GSP_RGBA4_OES = 4,
}

#[repr(C)]
#[derive(Copy)]
pub struct GSPGPU_CaptureInfoEntry {
    pub framebuf0_vaddr: *mut u32,
    pub framebuf1_vaddr: *mut u32,
    pub format: u32,
    pub framebuf_widthbytesize: u32,
}
impl ::core::clone::Clone for GSPGPU_CaptureInfoEntry {
    fn clone(&self) -> Self { *self }
}
impl ::core::default::Default for GSPGPU_CaptureInfoEntry {
    fn default() -> Self { unsafe { ::core::mem::zeroed() } }
}

#[repr(C)]
#[derive(Copy)]
pub struct GSPGPU_CaptureInfo {
    pub screencapture: [GSPGPU_CaptureInfoEntry; 2usize],
}
impl ::core::clone::Clone for GSPGPU_CaptureInfo {
    fn clone(&self) -> Self { *self }
}
impl ::core::default::Default for GSPGPU_CaptureInfo {
    fn default() -> Self { unsafe { ::core::mem::zeroed() } }
}

#[repr(C)]
pub enum GSPGPU_Event {
    GSPGPU_EVENT_PSC0 = 0,
    GSPGPU_EVENT_PSC1 = 1,
    GSPGPU_EVENT_VBlank0 = 2,
    GSPGPU_EVENT_VBlank1 = 3,
    GSPGPU_EVENT_PPF = 4,
    GSPGPU_EVENT_P3D = 5,
    GSPGPU_EVENT_DMA = 6,
    GSPGPU_EVENT_MAX = 7,
}

use ThreadFunc;

extern "C" {
    pub fn gspInit() -> Result;
    pub fn gspExit();
    pub fn gspSetEventCallback(id: GSPGPU_Event, cb: ThreadFunc,
                               data: *mut c_void,
                               oneShot: u8);
    pub fn gspInitEventHandler(gspEvent: Handle, gspSharedMem: *mut vu8,
                               gspThreadId: u8) -> Result;
    pub fn gspExitEventHandler();
    pub fn gspWaitForEvent(id: GSPGPU_Event, nextEvent: u8);
    pub fn gspWaitForAnyEvent() -> GSPGPU_Event;
    pub fn gspSubmitGxCommand(sharedGspCmdBuf: *mut u32,
                              gxCommand: *mut u32) -> Result;
    pub fn GSPGPU_AcquireRight(flags: u8) -> Result;
    pub fn GSPGPU_ReleaseRight() -> Result;
    pub fn GSPGPU_ImportDisplayCaptureInfo(captureinfo:
                                               *mut GSPGPU_CaptureInfo)
     -> Result;
    pub fn GSPGPU_SaveVramSysArea() -> Result;
    pub fn GSPGPU_RestoreVramSysArea() -> Result;
    pub fn GSPGPU_SetLcdForceBlack(flags: u8) -> Result;
    pub fn GSPGPU_SetBufferSwap(screenid: u32,
                                framebufinfo: *mut GSPGPU_FramebufferInfo)
     -> Result;
    pub fn GSPGPU_FlushDataCache(adr: *const c_void,
                                 size: u32) -> Result;
    pub fn GSPGPU_InvalidateDataCache(adr: *const c_void,
                                      size: u32) -> Result;
    pub fn GSPGPU_WriteHWRegs(regAddr: u32, data: *mut u32, size: u8)
     -> Result;
    pub fn GSPGPU_WriteHWRegsWithMask(regAddr: u32, data: *mut u32,
                                      datasize: u8, maskdata: *mut u32,
                                      masksize: u8) -> Result;
    pub fn GSPGPU_ReadHWRegs(regAddr: u32, data: *mut u32, size: u8)
     -> Result;
    pub fn GSPGPU_RegisterInterruptRelayQueue(eventHandle: Handle,
                                              flags: u32,
                                              outMemHandle: *mut Handle,
                                              threadID: *mut u8) -> Result;
    pub fn GSPGPU_UnregisterInterruptRelayQueue() -> Result;
    pub fn GSPGPU_TriggerCmdReqQueue() -> Result;
}