mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-23 05:12:39 +02:00
Add vi wrappers for system StrayLayer usage.
This commit is contained in:
parent
4879937946
commit
798d8ff50c
@ -39,6 +39,13 @@ typedef enum {
|
|||||||
ViScalingMode_Default = 0x2,
|
ViScalingMode_Default = 0x2,
|
||||||
} ViScalingMode;
|
} ViScalingMode;
|
||||||
|
|
||||||
|
/// Used with viSetDisplayPowerState.
|
||||||
|
typedef enum {
|
||||||
|
ViPowerState_Off = 0,
|
||||||
|
ViPowerState_NotScanning = 1,
|
||||||
|
ViPowerState_On = 2,
|
||||||
|
} ViPowerState;
|
||||||
|
|
||||||
Result viInitialize(ViServiceType service_type);
|
Result viInitialize(ViServiceType service_type);
|
||||||
void viExit(void);
|
void viExit(void);
|
||||||
|
|
||||||
@ -48,6 +55,9 @@ Service* viGetSession_ISystemDisplayService(void);
|
|||||||
Service* viGetSession_IManagerDisplayService(void);
|
Service* viGetSession_IManagerDisplayService(void);
|
||||||
Service* viGetSession_IHOSBinderDriverIndirect(void);
|
Service* viGetSession_IHOSBinderDriverIndirect(void);
|
||||||
|
|
||||||
|
// Misc functions
|
||||||
|
Result viSetContentVisibility(bool v);
|
||||||
|
|
||||||
// Display functions
|
// Display functions
|
||||||
|
|
||||||
Result viOpenDisplay(const char *display_name, ViDisplay *display);
|
Result viOpenDisplay(const char *display_name, ViDisplay *display);
|
||||||
@ -59,12 +69,21 @@ static inline Result viOpenDefaultDisplay(ViDisplay *display)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Result viGetDisplayResolution(ViDisplay *display, u64 *width, u64 *height);
|
Result viGetDisplayResolution(ViDisplay *display, u64 *width, u64 *height);
|
||||||
|
Result viGetDisplayLogicalResolution(ViDisplay *display, u32 *width, u32 *height);
|
||||||
|
Result viSetDisplayMagnification(ViDisplay *display, u32 x, u32 y, u32 width, u32 height);
|
||||||
Result viGetDisplayVsyncEvent(ViDisplay *display, Event *event_out);
|
Result viGetDisplayVsyncEvent(ViDisplay *display, Event *event_out);
|
||||||
|
Result viSetDisplayPowerState(ViDisplay *display, ViPowerState state);
|
||||||
|
Result viSetDisplayAlpha(ViDisplay *display, float alpha);
|
||||||
|
Result viGetDisplayMinimumZ(ViDisplay *display, u64 *z);
|
||||||
|
Result viGetDisplayMaximumZ(ViDisplay *display, u64 *z);
|
||||||
|
|
||||||
// Layer functions
|
// Layer functions
|
||||||
|
|
||||||
Result viCreateLayer(const ViDisplay *display, ViLayer *layer);
|
Result viCreateLayer(const ViDisplay *display, ViLayer *layer);
|
||||||
Result viCreateManagedLayer(const ViDisplay *display, ViLayerFlags layer_flags, u64 aruid, u64 *layer_id);
|
Result viCreateManagedLayer(const ViDisplay *display, ViLayerFlags layer_flags, u64 aruid, u64 *layer_id);
|
||||||
|
Result viSetLayerSize(ViLayer *layer, u64 width, u64 height);
|
||||||
|
Result viSetLayerZ(ViLayer *layer, u64 z);
|
||||||
|
Result viSetLayerPosition(ViLayer *layer, float x, float y);
|
||||||
Result viCloseLayer(ViLayer *layer);
|
Result viCloseLayer(ViLayer *layer);
|
||||||
|
|
||||||
Result viSetLayerScalingMode(ViLayer *layer, ViScalingMode scaling_mode);
|
Result viSetLayerScalingMode(ViLayer *layer, ViScalingMode scaling_mode);
|
||||||
|
@ -276,6 +276,95 @@ Result viGetDisplayResolution(ViDisplay *display, u64 *width, u64 *height)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result viGetDisplayLogicalResolution(ViDisplay *display, u32 *width, u32 *height)
|
||||||
|
{
|
||||||
|
IpcCommand c;
|
||||||
|
ipcInitialize(&c);
|
||||||
|
|
||||||
|
if (!display->initialized)
|
||||||
|
return MAKERESULT(Module_Libnx, LibnxError_NotInitialized);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 cmd_id;
|
||||||
|
u64 display_id;
|
||||||
|
} *raw;
|
||||||
|
|
||||||
|
raw = ipcPrepareHeader(&c, sizeof(*raw));
|
||||||
|
|
||||||
|
raw->magic = SFCI_MAGIC;
|
||||||
|
raw->cmd_id = 1203;
|
||||||
|
raw->display_id = display->display_id;
|
||||||
|
|
||||||
|
Result rc = serviceIpcDispatch(&g_viISystemDisplayService);
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(rc)) {
|
||||||
|
IpcParsedCommand r;
|
||||||
|
ipcParse(&r);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 result;
|
||||||
|
u32 width;
|
||||||
|
u32 height;
|
||||||
|
} *resp = r.Raw;
|
||||||
|
|
||||||
|
rc = resp->result;
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(rc)) {
|
||||||
|
if (width) *width = resp->width;
|
||||||
|
if (height) *height = resp->height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result viSetDisplayMagnification(ViDisplay *display, u32 x, u32 y, u32 width, u32 height)
|
||||||
|
{
|
||||||
|
IpcCommand c;
|
||||||
|
ipcInitialize(&c);
|
||||||
|
|
||||||
|
if (!display->initialized)
|
||||||
|
return MAKERESULT(Module_Libnx, LibnxError_NotInitialized);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 cmd_id;
|
||||||
|
u32 x;
|
||||||
|
u32 y;
|
||||||
|
u32 width;
|
||||||
|
u32 height;
|
||||||
|
u64 display_id;
|
||||||
|
} *raw;
|
||||||
|
|
||||||
|
raw = ipcPrepareHeader(&c, sizeof(*raw));
|
||||||
|
|
||||||
|
raw->magic = SFCI_MAGIC;
|
||||||
|
raw->cmd_id = 1204;
|
||||||
|
raw->display_id = display->display_id;
|
||||||
|
raw->x = x;
|
||||||
|
raw->y = y;
|
||||||
|
raw->width = width;
|
||||||
|
raw->height = height;
|
||||||
|
|
||||||
|
Result rc = serviceIpcDispatch(&g_viISystemDisplayService);
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(rc)) {
|
||||||
|
IpcParsedCommand r;
|
||||||
|
ipcParse(&r);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 result;
|
||||||
|
} *resp = r.Raw;
|
||||||
|
|
||||||
|
rc = resp->result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
Result viGetDisplayVsyncEvent(ViDisplay *display, Event *event_out)
|
Result viGetDisplayVsyncEvent(ViDisplay *display, Event *event_out)
|
||||||
{
|
{
|
||||||
IpcCommand c;
|
IpcCommand c;
|
||||||
@ -317,6 +406,166 @@ Result viGetDisplayVsyncEvent(ViDisplay *display, Event *event_out)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result viSetDisplayPowerState(ViDisplay *display, ViPowerState state)
|
||||||
|
{
|
||||||
|
IpcCommand c;
|
||||||
|
ipcInitialize(&c);
|
||||||
|
|
||||||
|
if (!display->initialized)
|
||||||
|
return MAKERESULT(Module_Libnx, LibnxError_NotInitialized);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 cmd_id;
|
||||||
|
u32 power_state;
|
||||||
|
u64 display_id;
|
||||||
|
} *raw;
|
||||||
|
|
||||||
|
raw = ipcPrepareHeader(&c, sizeof(*raw));
|
||||||
|
|
||||||
|
raw->magic = SFCI_MAGIC;
|
||||||
|
raw->cmd_id = 4205;
|
||||||
|
raw->display_id = display->display_id;
|
||||||
|
raw->power_state = state;
|
||||||
|
|
||||||
|
Result rc = serviceIpcDispatch(&g_viIManagerDisplayService);
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(rc)) {
|
||||||
|
IpcParsedCommand r;
|
||||||
|
ipcParse(&r);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 result;
|
||||||
|
} *resp = r.Raw;
|
||||||
|
|
||||||
|
rc = resp->result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result viSetDisplayAlpha(ViDisplay *display, float alpha)
|
||||||
|
{
|
||||||
|
IpcCommand c;
|
||||||
|
ipcInitialize(&c);
|
||||||
|
|
||||||
|
if (!display->initialized)
|
||||||
|
return MAKERESULT(Module_Libnx, LibnxError_NotInitialized);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 cmd_id;
|
||||||
|
float alpha;
|
||||||
|
u64 display_id;
|
||||||
|
} *raw;
|
||||||
|
|
||||||
|
raw = ipcPrepareHeader(&c, sizeof(*raw));
|
||||||
|
|
||||||
|
raw->magic = SFCI_MAGIC;
|
||||||
|
raw->cmd_id = 4201;
|
||||||
|
raw->display_id = display->display_id;
|
||||||
|
raw->alpha = alpha;
|
||||||
|
|
||||||
|
Result rc = serviceIpcDispatch(&g_viIManagerDisplayService);
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(rc)) {
|
||||||
|
IpcParsedCommand r;
|
||||||
|
ipcParse(&r);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 result;
|
||||||
|
} *resp = r.Raw;
|
||||||
|
|
||||||
|
rc = resp->result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result viGetDisplayMinimumZ(ViDisplay *display, u64 *z) {
|
||||||
|
IpcCommand c;
|
||||||
|
ipcInitialize(&c);
|
||||||
|
|
||||||
|
if (!display->initialized)
|
||||||
|
return MAKERESULT(Module_Libnx, LibnxError_NotInitialized);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 cmd_id;
|
||||||
|
u64 display_id;
|
||||||
|
} *raw;
|
||||||
|
|
||||||
|
raw = ipcPrepareHeader(&c, sizeof(*raw));
|
||||||
|
|
||||||
|
raw->magic = SFCI_MAGIC;
|
||||||
|
raw->cmd_id = 1200;
|
||||||
|
raw->display_id = display->display_id;
|
||||||
|
|
||||||
|
Result rc = serviceIpcDispatch(&g_viISystemDisplayService);
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(rc)) {
|
||||||
|
IpcParsedCommand r;
|
||||||
|
ipcParse(&r);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 result;
|
||||||
|
u64 z;
|
||||||
|
} *resp = r.Raw;
|
||||||
|
|
||||||
|
rc = resp->result;
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(rc)) {
|
||||||
|
if (z) *z = resp->z;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result viGetDisplayMaximumZ(ViDisplay *display, u64 *z) {
|
||||||
|
IpcCommand c;
|
||||||
|
ipcInitialize(&c);
|
||||||
|
|
||||||
|
if (!display->initialized)
|
||||||
|
return MAKERESULT(Module_Libnx, LibnxError_NotInitialized);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 cmd_id;
|
||||||
|
u64 display_id;
|
||||||
|
} *raw;
|
||||||
|
|
||||||
|
raw = ipcPrepareHeader(&c, sizeof(*raw));
|
||||||
|
|
||||||
|
raw->magic = SFCI_MAGIC;
|
||||||
|
raw->cmd_id = 1202;
|
||||||
|
raw->display_id = display->display_id;
|
||||||
|
|
||||||
|
Result rc = serviceIpcDispatch(&g_viISystemDisplayService);
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(rc)) {
|
||||||
|
IpcParsedCommand r;
|
||||||
|
ipcParse(&r);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 result;
|
||||||
|
u64 z;
|
||||||
|
} *resp = r.Raw;
|
||||||
|
|
||||||
|
rc = resp->result;
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(rc)) {
|
||||||
|
if (z) *z = resp->z;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
Result viCreateManagedLayer(const ViDisplay *display, ViLayerFlags layer_flags, u64 aruid, u64 *layer_id)
|
Result viCreateManagedLayer(const ViDisplay *display, ViLayerFlags layer_flags, u64 aruid, u64 *layer_id)
|
||||||
{
|
{
|
||||||
IpcCommand c;
|
IpcCommand c;
|
||||||
@ -364,6 +613,38 @@ Result viCreateManagedLayer(const ViDisplay *display, ViLayerFlags layer_flags,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result viSetContentVisibility(bool v) {
|
||||||
|
IpcCommand c;
|
||||||
|
ipcInitialize(&c);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 cmd_id;
|
||||||
|
u32 visibility;
|
||||||
|
} *raw;
|
||||||
|
|
||||||
|
raw = ipcPrepareHeader(&c, sizeof(*raw));
|
||||||
|
raw->magic = SFCI_MAGIC;
|
||||||
|
raw->cmd_id = 7000;
|
||||||
|
raw->visibility = v;
|
||||||
|
|
||||||
|
Result rc = serviceIpcDispatch(&g_viIManagerDisplayService);
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(rc)) {
|
||||||
|
IpcParsedCommand r;
|
||||||
|
ipcParse(&r);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 result;
|
||||||
|
} *resp = r.Raw;
|
||||||
|
|
||||||
|
rc = resp->result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
static Result _viOpenLayer(const ViDisplay *display, u64 layer_id, u64 aruid, u8 native_window[0x100], u64 *native_window_size)
|
static Result _viOpenLayer(const ViDisplay *display, u64 layer_id, u64 aruid, u8 native_window[0x100], u64 *native_window_size)
|
||||||
{
|
{
|
||||||
IpcCommand c;
|
IpcCommand c;
|
||||||
@ -428,12 +709,17 @@ static Result _viCreateStrayLayer(const ViDisplay *display, u32 layer_flags, u64
|
|||||||
|
|
||||||
raw = ipcPrepareHeader(&c, sizeof(*raw));
|
raw = ipcPrepareHeader(&c, sizeof(*raw));
|
||||||
raw->magic = SFCI_MAGIC;
|
raw->magic = SFCI_MAGIC;
|
||||||
raw->cmd_id = 2030;
|
raw->cmd_id = g_viServiceType < ViServiceType_System ? 2030 : 2312;
|
||||||
raw->layer_flags = layer_flags;
|
raw->layer_flags = layer_flags;
|
||||||
raw->pad = 0;
|
raw->pad = 0;
|
||||||
raw->display_id = display->display_id;
|
raw->display_id = display->display_id;
|
||||||
|
|
||||||
Result rc = serviceIpcDispatch(&g_viIApplicationDisplayService);
|
Result rc;
|
||||||
|
if (g_viServiceType < ViServiceType_System) {
|
||||||
|
rc = serviceIpcDispatch(&g_viIApplicationDisplayService);
|
||||||
|
} else {
|
||||||
|
rc = serviceIpcDispatch(&g_viISystemDisplayService);
|
||||||
|
}
|
||||||
|
|
||||||
if (R_SUCCEEDED(rc)) {
|
if (R_SUCCEEDED(rc)) {
|
||||||
IpcParsedCommand r;
|
IpcParsedCommand r;
|
||||||
@ -508,6 +794,124 @@ _bad_parcel:
|
|||||||
return MAKERESULT(Module_Libnx, LibnxError_BadInput);
|
return MAKERESULT(Module_Libnx, LibnxError_BadInput);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result viSetLayerSize(ViLayer *layer, u64 width, u64 height) {
|
||||||
|
IpcCommand c;
|
||||||
|
ipcInitialize(&c);
|
||||||
|
|
||||||
|
if (!layer->initialized)
|
||||||
|
return MAKERESULT(Module_Libnx, LibnxError_NotInitialized);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 cmd_id;
|
||||||
|
u64 layer_id;
|
||||||
|
u64 width;
|
||||||
|
u64 height;
|
||||||
|
} *raw;
|
||||||
|
|
||||||
|
raw = ipcPrepareHeader(&c, sizeof(*raw));
|
||||||
|
|
||||||
|
raw->magic = SFCI_MAGIC;
|
||||||
|
raw->cmd_id = 2203;
|
||||||
|
raw->layer_id = layer->layer_id;
|
||||||
|
raw->width = width;
|
||||||
|
raw->height = height;
|
||||||
|
|
||||||
|
Result rc = serviceIpcDispatch(&g_viISystemDisplayService);
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(rc)) {
|
||||||
|
IpcParsedCommand r;
|
||||||
|
ipcParse(&r);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 result;
|
||||||
|
} *resp = r.Raw;
|
||||||
|
|
||||||
|
rc = resp->result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result viSetLayerZ(ViLayer *layer, u64 z) {
|
||||||
|
IpcCommand c;
|
||||||
|
ipcInitialize(&c);
|
||||||
|
|
||||||
|
if (!layer->initialized)
|
||||||
|
return MAKERESULT(Module_Libnx, LibnxError_NotInitialized);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 cmd_id;
|
||||||
|
u64 layer_id;
|
||||||
|
u64 z;
|
||||||
|
} *raw;
|
||||||
|
|
||||||
|
raw = ipcPrepareHeader(&c, sizeof(*raw));
|
||||||
|
|
||||||
|
raw->magic = SFCI_MAGIC;
|
||||||
|
raw->cmd_id = 2205;
|
||||||
|
raw->layer_id = layer->layer_id;
|
||||||
|
raw->z = z;
|
||||||
|
|
||||||
|
Result rc = serviceIpcDispatch(&g_viISystemDisplayService);
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(rc)) {
|
||||||
|
IpcParsedCommand r;
|
||||||
|
ipcParse(&r);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 result;
|
||||||
|
} *resp = r.Raw;
|
||||||
|
|
||||||
|
rc = resp->result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result viSetLayerPosition(ViLayer *layer, float x, float y) {
|
||||||
|
IpcCommand c;
|
||||||
|
ipcInitialize(&c);
|
||||||
|
|
||||||
|
if (!layer->initialized)
|
||||||
|
return MAKERESULT(Module_Libnx, LibnxError_NotInitialized);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 cmd_id;
|
||||||
|
float x;
|
||||||
|
float y;
|
||||||
|
u64 layer_id;
|
||||||
|
} *raw;
|
||||||
|
|
||||||
|
raw = ipcPrepareHeader(&c, sizeof(*raw));
|
||||||
|
|
||||||
|
raw->magic = SFCI_MAGIC;
|
||||||
|
raw->cmd_id = 2201;
|
||||||
|
raw->layer_id = layer->layer_id;
|
||||||
|
raw->x = x;
|
||||||
|
raw->y = y;
|
||||||
|
|
||||||
|
Result rc = serviceIpcDispatch(&g_viISystemDisplayService);
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(rc)) {
|
||||||
|
IpcParsedCommand r;
|
||||||
|
ipcParse(&r);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 result;
|
||||||
|
} *resp = r.Raw;
|
||||||
|
|
||||||
|
rc = resp->result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
Result viCloseLayer(ViLayer *layer)
|
Result viCloseLayer(ViLayer *layer)
|
||||||
{
|
{
|
||||||
IpcCommand c;
|
IpcCommand c;
|
||||||
|
Loading…
Reference in New Issue
Block a user