Skip to content

Commit 4e7159c

Browse files
committed
VI service: major revamp, see details:
- Added viOpenDefaultDisplay. - Replaced viOpenLayer with viCreateLayer. - NativeWindow parcel data is now parsed by viCreateLayer, and the ViLayer struct contains a new igbp_binder_obj_id field. - LayerFlags/LayerId parameters replaced by weak global variables __nx_vi_layer_id/__nx_vi_stray_layer_flags. - The root vi:* session is closed on startup. - Simplified corresponding gfx code. - Misc style fixes
1 parent 180cd9b commit 4e7159c

File tree

3 files changed

+214
-186
lines changed

3 files changed

+214
-186
lines changed

nx/include/switch/services/vi.h

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ typedef struct {
1616

1717
typedef struct {
1818
u64 layer_id;
19-
bool stray_layer;
20-
bool initialized;
19+
u32 igbp_binder_obj_id;
20+
bool initialized : 1;
21+
bool stray_layer : 1;
2122
} ViLayer;
2223

2324
typedef enum {
@@ -27,7 +28,7 @@ typedef enum {
2728
ViServiceType_Manager = 2,
2829
} ViServiceType;
2930

30-
/// Used by viOpenLayer when CreateStrayLayer is used internally.
31+
/// Used by viCreateLayer when CreateStrayLayer is used internally.
3132
typedef enum {
3233
ViLayerFlags_Default = 0x1,
3334
} ViLayerFlags;
@@ -37,24 +38,32 @@ typedef enum {
3738
ViScalingMode_Default = 0x2,
3839
} ViScalingMode;
3940

40-
Result viInitialize(ViServiceType servicetype);
41+
Result viInitialize(ViServiceType service_type);
4142
void viExit(void);
4243

43-
Service* viGetSessionService(void);
4444
Service* viGetSession_IApplicationDisplayService(void);
4545
Service* viGetSession_IHOSBinderDriverRelay(void);
4646
Service* viGetSession_ISystemDisplayService(void);
4747
Service* viGetSession_IManagerDisplayService(void);
4848
Service* viGetSession_IHOSBinderDriverIndirect(void);
4949

50-
Result viOpenDisplay(const char *DisplayName, ViDisplay *display);
50+
// Display functions
51+
52+
Result viOpenDisplay(const char *display_name, ViDisplay *display);
5153
Result viCloseDisplay(ViDisplay *display);
52-
Result viCreateManagedLayer(const ViDisplay *display, u32 LayerFlags, u64 AppletResourceUserId, u64 *layer_id);
53-
Result viOpenLayer(u8 NativeWindow[0x100], u64 *NativeWindow_Size, const ViDisplay *display, ViLayer *layer, u32 LayerFlags, u64 LayerId);
54-
Result viCloseLayer(ViLayer *layer);
5554

56-
/// See ViScalingMode.
57-
Result viSetLayerScalingMode(ViLayer *layer, u32 ScalingMode);
55+
static inline Result viOpenDefaultDisplay(ViDisplay *display)
56+
{
57+
return viOpenDisplay("Default", display);
58+
}
5859

5960
Result viGetDisplayResolution(ViDisplay *display, u64 *width, u64 *height);
6061
Result viGetDisplayVsyncEvent(ViDisplay *display, Handle *handle_out);
62+
63+
// Layer functions
64+
65+
Result viCreateLayer(const ViDisplay *display, ViLayer *layer);
66+
Result viCreateManagedLayer(const ViDisplay *display, ViLayerFlags layer_flags, u64 aruid, u64 *layer_id);
67+
Result viCloseLayer(ViLayer *layer);
68+
69+
Result viSetLayerScalingMode(ViLayer *layer, ViScalingMode scaling_mode);

nx/source/display/gfx.c

Lines changed: 5 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@ static bool g_gfxInitialized = 0;
1616
static ViDisplay g_gfxDisplay;
1717
static Handle g_gfxDisplayVsyncEvent = INVALID_HANDLE;
1818
static ViLayer g_gfxLayer;
19-
static u8 g_gfxNativeWindow[0x100];
20-
static u64 g_gfxNativeWindow_Size;
21-
static s32 g_gfxNativeWindow_ID;
2219
static Binder g_gfxBinderSession;
2320
static s32 g_gfxCurrentBuffer = 0;
2421
static s32 g_gfxCurrentProducerBuffer = 0;
@@ -111,20 +108,6 @@ static BqGraphicBuffer g_gfx_BufferInitData = {
111108
}
112109
};
113110

114-
static Result _gfxGetNativeWindowID(u8 *buf, u64 size, s32 *out_ID) {
115-
u32 *bufptr = (u32*)buf;
116-
117-
//Validate ParcelData{Size|Offset}.
118-
if((u64)bufptr[1] > size || (u64)bufptr[0] > size || ((u64)bufptr[1])+((u64)bufptr[0]) > size) return MAKERESULT(Module_Libnx, LibnxError_BadInput);
119-
if(bufptr[0] < 0xc) return MAKERESULT(Module_Libnx, LibnxError_BadInput);
120-
//bufptr = start of ParcelData
121-
bufptr = (u32*)&buf[bufptr[1]];
122-
123-
*out_ID = (s32)bufptr[2];
124-
125-
return 0;
126-
}
127-
128111
static Result _gfxDequeueBuffer(void) {
129112
Result rc=0;
130113
BqFence *fence = &g_gfx_DequeueBuffer_fence;
@@ -166,13 +149,12 @@ static Result _gfxQueueBuffer(s32 buf) {
166149
return rc;
167150
}
168151

169-
static Result _gfxInit(ViServiceType servicetype, const char *DisplayName, u32 LayerFlags, u64 LayerId) {
152+
Result gfxInitDefault(void) {
170153
Result rc=0;
171154
u32 i=0;
172155

173156
if(g_gfxInitialized)return 0;
174157

175-
g_gfxNativeWindow_ID = 0;
176158
g_gfxDisplayVsyncEvent = INVALID_HANDLE;
177159
g_gfxCurrentBuffer = -1;
178160
g_gfxCurrentProducerBuffer = -1;
@@ -224,20 +206,18 @@ static Result _gfxInit(ViServiceType servicetype, const char *DisplayName, u32 L
224206
return rc;
225207
}
226208

227-
rc = viInitialize(servicetype);
209+
rc = viInitialize(ViServiceType_Default);
228210

229-
if (R_SUCCEEDED(rc)) rc = viOpenDisplay(DisplayName, &g_gfxDisplay);
211+
if (R_SUCCEEDED(rc)) rc = viOpenDefaultDisplay(&g_gfxDisplay);
230212

231213
if (R_SUCCEEDED(rc)) rc = viGetDisplayVsyncEvent(&g_gfxDisplay, &g_gfxDisplayVsyncEvent);
232214

233-
if (R_SUCCEEDED(rc)) rc = viOpenLayer(g_gfxNativeWindow, &g_gfxNativeWindow_Size, &g_gfxDisplay, &g_gfxLayer, LayerFlags, LayerId);
215+
if (R_SUCCEEDED(rc)) rc = viCreateLayer(&g_gfxDisplay, &g_gfxLayer);
234216

235217
if (R_SUCCEEDED(rc)) rc = viSetLayerScalingMode(&g_gfxLayer, ViScalingMode_Default);
236218

237-
if (R_SUCCEEDED(rc)) rc = _gfxGetNativeWindowID(g_gfxNativeWindow, g_gfxNativeWindow_Size, &g_gfxNativeWindow_ID);
238-
239219
if (R_SUCCEEDED(rc)) {
240-
binderCreate(&g_gfxBinderSession, viGetSession_IHOSBinderDriverRelay()->handle, g_gfxNativeWindow_ID);
220+
binderCreate(&g_gfxBinderSession, viGetSession_IHOSBinderDriverRelay()->handle, g_gfxLayer.igbp_binder_obj_id);
241221
rc = binderInitSession(&g_gfxBinderSession, 0x0f);
242222
}
243223

@@ -308,7 +288,6 @@ static Result _gfxInit(ViServiceType servicetype, const char *DisplayName, u32 L
308288
free(g_gfxFramebufLinear);
309289
g_gfxFramebufLinear = NULL;
310290

311-
g_gfxNativeWindow_ID = 0;
312291
g_gfxCurrentBuffer = 0;
313292
g_gfxCurrentProducerBuffer = -1;
314293
g_gfx_ProducerConnected = 0;
@@ -327,10 +306,6 @@ static Result _gfxInit(ViServiceType servicetype, const char *DisplayName, u32 L
327306
return rc;
328307
}
329308

330-
Result gfxInitDefault(void) {
331-
return _gfxInit(ViServiceType_Default, "Default", ViLayerFlags_Default, 0);
332-
}
333-
334309
void gfxExit(void)
335310
{
336311
u32 i = 0;
@@ -365,7 +340,6 @@ void gfxExit(void)
365340
g_gfxFramebufLinear = NULL;
366341

367342
g_gfxInitialized = 0;
368-
g_gfxNativeWindow_ID = 0;
369343

370344
g_gfxCurrentBuffer = 0;
371345
g_gfxCurrentProducerBuffer = -1;

0 commit comments

Comments
 (0)