From 80890a3b8e00f9f5f49b0088f43b5ded29f50f44 Mon Sep 17 00:00:00 2001 From: yellows8 Date: Wed, 8 Nov 2017 22:36:30 -0500 Subject: [PATCH] Fixed gfx and parcel issues. Parcel logging adjustments, etc. Changed out_parcel to parcel_reply. --- nx/include/switch/gfx/parcel.h | 2 +- nx/source/gfx/gfx.c | 12 ++++++------ nx/source/gfx/gfxproducer.c | 2 +- nx/source/gfx/parcel.c | 23 +++++++++++++---------- 4 files changed, 21 insertions(+), 18 deletions(-) diff --git a/nx/include/switch/gfx/parcel.h b/nx/include/switch/gfx/parcel.h index fdd69394..695d0077 100644 --- a/nx/include/switch/gfx/parcel.h +++ b/nx/include/switch/gfx/parcel.h @@ -12,7 +12,7 @@ typedef struct { } parcelContext; void parcelInitializeContext(parcelContext *ctx); -Result parcelTransact(binderSession *session, u32 code, parcelContext *in_parcel, parcelContext *out_parcel); +Result parcelTransact(binderSession *session, u32 code, parcelContext *in_parcel, parcelContext *reply_parcel); void* parcelWriteData(parcelContext *ctx, void* data, size_t data_size); void* parcelReadData(parcelContext *ctx, void* data, size_t data_size); diff --git a/nx/source/gfx/gfx.c b/nx/source/gfx/gfx.c index 3d50abf7..e853040d 100644 --- a/nx/source/gfx/gfx.c +++ b/nx/source/gfx/gfx.c @@ -70,7 +70,7 @@ static Result _gfxGetNativeWindowID(u8 *buf, u64 size, s32 *out_ID) { } static Result _gfxDequeueBuffer() { - return gfxproducerDequeueBuffer(1, 1280, 720, 0, 0x300); + return gfxproducerDequeueBuffer(1, 1280, 720, 0, 0x300);//reply_parcel currently contains error(s), presumably due to nv not being initialized for this. } static Result _gfxQueueBuffer(s32 buf) { @@ -94,7 +94,7 @@ static Result _gfxInit(viServiceType servicetype, const char *DisplayName, u32 L Result rc=0; s32 tmp=0; u32 i=0; - u64 *ptr64 = (u64*)g_gfxQueueBufferData; + u64 *ptr64 = (u64*)g_gfxBufferInitData; if(g_gfxInitialized)return 0; @@ -129,9 +129,9 @@ static Result _gfxInit(viServiceType servicetype, const char *DisplayName, u32 L if (R_SUCCEEDED(rc)) { for(i=0; i<2; i++) { g_gfxBufferInitData[0xa] = i; - g_gfxBufferInitData[0x20] = 0x3c0000*i; + g_gfxBufferInitData[0x21] = 0x3c0000*i; ptr64[0x170>>3] = svcGetSystemTick(); - rc = gfxproducerBufferInit(0, (u8*)g_gfxBufferInitData); + rc = gfxproducerBufferInit(i, (u8*)g_gfxBufferInitData); if (R_FAILED(rc)) break; } } @@ -141,10 +141,10 @@ static Result _gfxInit(viServiceType servicetype, const char *DisplayName, u32 L rc = _gfxDequeueBuffer(); if (R_FAILED(rc)) break; - rc = gfxproducerRequestBuffer(i); + rc = gfxproducerRequestBuffer(i);//reply_parcel currently contains an error, presumably due to _gfxDequeueBuffer() failing as mentioned above. if (R_FAILED(rc)) break; - rc = _gfxQueueBuffer(i); + rc = _gfxQueueBuffer(i);//reply_parcel currently contains the same error as gfxproducerRequestBuffer() above. if (R_FAILED(rc)) break; } } diff --git a/nx/source/gfx/gfxproducer.c b/nx/source/gfx/gfxproducer.c index 0653944d..e29f54a5 100644 --- a/nx/source/gfx/gfxproducer.c +++ b/nx/source/gfx/gfxproducer.c @@ -145,7 +145,7 @@ Result gfxproducerConnect(s32 api, bool producerControlledByApp) { rc = parcelTransact(g_gfxproducerBinderSession, CONNECT, &parcel, &parcel_reply); if (R_FAILED(rc)) return rc; - //TODO: parse reply + //TODO: parse reply (contains 32bit width and height) return 0; } diff --git a/nx/source/gfx/parcel.c b/nx/source/gfx/parcel.c index ffdc7ebb..95ca84fe 100644 --- a/nx/source/gfx/parcel.c +++ b/nx/source/gfx/parcel.c @@ -11,12 +11,11 @@ void parcelInitializeContext(parcelContext *ctx) { ctx->ParcelData_maxsize = sizeof(ctx->ParcelData); } -//outparcel is allzero with this. This is presumably invalid? -Result parcelTransact(binderSession *session, u32 code, parcelContext *in_parcel, parcelContext *out_parcel) { +Result parcelTransact(binderSession *session, u32 code, parcelContext *in_parcel, parcelContext *parcel_reply) { Result rc=0; u8 inparcel[0x400]; - static u8 outparcel[0x1000]; - size_t outparcel_size = 0x1000; + u8 outparcel[0x400]; + size_t outparcel_size = sizeof(outparcel); u32 *inparcel32 = (u32*)inparcel; u32 *outparcel32 = (u32*)outparcel; u32 ParcelDataSize = in_parcel->ParcelData_size; @@ -42,24 +41,28 @@ Result parcelTransact(binderSession *session, u32 code, parcelContext *in_parcel if((size_t)outparcel32[2] >= outparcel_size || ((size_t)outparcel32[2])+((size_t)outparcel32[3]) >= outparcel_size) return MAKERESULT(MODULE_LIBNX, LIBNX_BADINPUT); if((size_t)outparcel32[0] >= outparcel_size || (size_t)outparcel32[3] >= outparcel_size) return MAKERESULT(MODULE_LIBNX, LIBNX_BADINPUT); - memcpy(out_parcel->ParcelData, &outparcel[outparcel32[1]], outparcel32[0]); - out_parcel->ParcelData_size = outparcel32[0]; + memcpy(parcel_reply->ParcelData, &outparcel[outparcel32[1]], outparcel32[0]); + parcel_reply->ParcelData_size = outparcel32[0]; - /*memcpy(&parcel_reply_log[parcel_reply_log_size], out_parcel, outparcel_size); - parcel_reply_log_size+= outparcel_size;*/ + /*if(parcel_reply_log_size + sizeof(inparcel) + outparcel_size <= sizeof(parcel_reply_log)) { + memcpy(&parcel_reply_log[parcel_reply_log_size], inparcel, sizeof(inparcel)); + parcel_reply_log_size+= sizeof(inparcel); + memcpy(&parcel_reply_log[parcel_reply_log_size], outparcel, outparcel_size); + parcel_reply_log_size+= outparcel_size; + }*/ return 0; } void* parcelWriteData(parcelContext *ctx, void* data, size_t data_size) { - void* ptr = ctx->ParcelData; + void* ptr = &ctx->ParcelData[ctx->ParcelData_size]; if(data_size & BIT(31)) return NULL; data_size = (data_size+3) & ~3; if(ctx->ParcelData_size + data_size >= ctx->ParcelData_maxsize) return NULL; - if(data)memcpy(&ctx->ParcelData[ctx->ParcelData_size], data, data_size); + if(data)memcpy(ptr, data, data_size); ctx->ParcelData_size+= data_size; return ptr;