Use the output buffer value from gfxproducerDequeueBuffer() with gfxproducer calls. Set g_gfxCurrentBuffer in _gfxDequeueBuffer() with the output buffer value. Removed a comment.

This commit is contained in:
yellows8 2017-11-18 17:35:06 -05:00
parent ee3a74fa60
commit fbce1e8029
3 changed files with 19 additions and 8 deletions

View File

@ -2,7 +2,7 @@ Result gfxproducerInitialize(binderSession *session);
void gfxproducerExit(); void gfxproducerExit();
Result gfxproducerRequestBuffer(s32 bufferIdx); Result gfxproducerRequestBuffer(s32 bufferIdx);
Result gfxproducerDequeueBuffer(bool async, u32 width, u32 height, s32 format, u32 usage); Result gfxproducerDequeueBuffer(bool async, u32 width, u32 height, s32 format, u32 usage, s32 *buf);
Result gfxproducerQueueBuffer(s32 buf, u8 input[0x5c]); Result gfxproducerQueueBuffer(s32 buf, u8 input[0x5c]);
Result gfxproducerQuery(s32 what, s32* value); Result gfxproducerQuery(s32 what, s32* value);
Result gfxproducerConnect(s32 api, bool producerControlledByApp); Result gfxproducerConnect(s32 api, bool producerControlledByApp);

View File

@ -10,6 +10,7 @@ static u64 g_gfxNativeWindow_Size;
static s32 g_gfxNativeWindow_ID; static s32 g_gfxNativeWindow_ID;
static binderSession g_gfxBinderSession; static binderSession g_gfxBinderSession;
static s32 g_gfxCurrentBuffer = 0; static s32 g_gfxCurrentBuffer = 0;
static s32 g_gfxCurrentProducerBuffer = 0;
static u8 *g_gfxFramebuf; static u8 *g_gfxFramebuf;
static size_t g_gfxFramebufSize; static size_t g_gfxFramebufSize;
static size_t g_gfxFramebufSingleSize = 0x3c0000; static size_t g_gfxFramebufSingleSize = 0x3c0000;
@ -23,7 +24,7 @@ static u32 g_gfxQueueBufferData[0x5c>>2] = {
0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x2,
0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x1, 0x1,
0x42, 0x42,
0x13f4, //Increased by 6/7 each time. 0x13f4,
0xffffffff, 0x0, 0xffffffff, 0x0,
0xffffffff, 0x0, 0xffffffff, 0x0}; 0xffffffff, 0x0, 0xffffffff, 0x0};
@ -43,7 +44,13 @@ static Result _gfxGetNativeWindowID(u8 *buf, u64 size, s32 *out_ID) {
} }
static Result _gfxDequeueBuffer() { static Result _gfxDequeueBuffer() {
return gfxproducerDequeueBuffer(1, 1280, 720, 0, 0x300); Result rc=0;
rc = gfxproducerDequeueBuffer(1, 1280, 720, 0, 0x300, &g_gfxCurrentProducerBuffer);
if (R_SUCCEEDED(rc)) g_gfxCurrentBuffer = g_gfxCurrentProducerBuffer & 1;
return rc;
} }
static Result _gfxQueueBuffer(s32 buf) { static Result _gfxQueueBuffer(s32 buf) {
@ -72,6 +79,7 @@ static Result _gfxInit(viServiceType servicetype, const char *DisplayName, u32 L
g_gfxNativeWindow_ID = 0; g_gfxNativeWindow_ID = 0;
g_gfxDisplayVsyncEvent = INVALID_HANDLE; g_gfxDisplayVsyncEvent = INVALID_HANDLE;
g_gfxCurrentBuffer = 0; g_gfxCurrentBuffer = 0;
g_gfxCurrentProducerBuffer = 0;
g_gfxFramebuf = NULL; g_gfxFramebuf = NULL;
g_gfxFramebufSize = 0; g_gfxFramebufSize = 0;
@ -106,12 +114,12 @@ static Result _gfxInit(viServiceType servicetype, const char *DisplayName, u32 L
rc = _gfxDequeueBuffer(); rc = _gfxDequeueBuffer();
if (R_FAILED(rc)) break; if (R_FAILED(rc)) break;
rc = gfxproducerRequestBuffer(i); rc = gfxproducerRequestBuffer(g_gfxCurrentProducerBuffer);
if (R_FAILED(rc)) break; if (R_FAILED(rc)) break;
//Officially, nvioctlNvmap_FromID() and nvioctlChannel_SubmitGPFIFO() are used here. //Officially, nvioctlNvmap_FromID() and nvioctlChannel_SubmitGPFIFO() are used here.
rc = _gfxQueueBuffer(i); rc = _gfxQueueBuffer(g_gfxCurrentProducerBuffer);
if (R_FAILED(rc)) break; if (R_FAILED(rc)) break;
} }
} }
@ -140,6 +148,7 @@ static Result _gfxInit(viServiceType servicetype, const char *DisplayName, u32 L
g_gfxNativeWindow_ID = 0; g_gfxNativeWindow_ID = 0;
g_gfxCurrentBuffer = 0; g_gfxCurrentBuffer = 0;
g_gfxCurrentProducerBuffer = 0;
g_gfxFramebuf = NULL; g_gfxFramebuf = NULL;
g_gfxFramebufSize = 0; g_gfxFramebufSize = 0;
} }
@ -197,6 +206,7 @@ void gfxExit(void) {
g_gfxNativeWindow_ID = 0; g_gfxNativeWindow_ID = 0;
g_gfxCurrentBuffer = 0; g_gfxCurrentBuffer = 0;
g_gfxCurrentProducerBuffer = 0;
g_gfxFramebuf = NULL; g_gfxFramebuf = NULL;
g_gfxFramebufSize = 0; g_gfxFramebufSize = 0;
} }
@ -210,8 +220,7 @@ void gfxWaitForVsync() {
void gfxSwapBuffers() { void gfxSwapBuffers() {
Result rc=0; Result rc=0;
rc = _gfxQueueBuffer(g_gfxCurrentBuffer); rc = _gfxQueueBuffer(g_gfxCurrentProducerBuffer);
g_gfxCurrentBuffer ^= 1;
if (R_SUCCEEDED(rc)) rc = _gfxDequeueBuffer(); if (R_SUCCEEDED(rc)) rc = _gfxDequeueBuffer();

View File

@ -55,7 +55,7 @@ Result gfxproducerRequestBuffer(s32 bufferIdx) {
return 0; return 0;
} }
Result gfxproducerDequeueBuffer(bool async, u32 width, u32 height, s32 format, u32 usage) { Result gfxproducerDequeueBuffer(bool async, u32 width, u32 height, s32 format, u32 usage, s32 *buf) {
Result rc; Result rc;
parcelContext parcel, parcel_reply; parcelContext parcel, parcel_reply;
@ -77,6 +77,8 @@ Result gfxproducerDequeueBuffer(bool async, u32 width, u32 height, s32 format, u
//TODO: parse reply //TODO: parse reply
*buf = parcelReadInt32(&parcel_reply);
return 0; return 0;
} }