volatile bool RenderThreadRun = true;
volatile bool RenderThreadReady = false;
Handle RenderThreadReqUpdateSignal = 0;
Handle RenderThreadConversionMutex = 0;
Thread RenderThreadHandle = NULL;
void RenderThread( void* Param ) {
gfxInitDefault( );
consoleInit( GFX_BOTTOM, NULL );
C3D_Init( C3D_DEFAULT_CMDBUF_SIZE );
C2D_Init( C2D_DEFAULT_MAX_OBJECTS );
C2D_Prepare( );
if ( CreateMainScreen( ) ) {
Init_8BPP( );
RenderThreadReady = true;
while ( RenderThreadRun ) {
svcWaitSynchronization( RenderThreadReqUpdateSignal, INT64_MAX );
svcClearEvent( RenderThreadReqUpdateSignal );
//svcWaitSynchronization( RenderThreadConversionMutex, INT64_MAX );
svcCreateMutex( &RenderThreadConversionMutex, true );
Unpack8BPP( ( const uint8_t* ) fb8bpp, MainScreenBuffer, 512 * 384 );
svcReleaseMutex( RenderThreadConversionMutex );
C3D_FrameBegin( C3D_FRAME_SYNCDRAW );
// Flush and transfer main screen to texture
GSPGPU_FlushDataCache( MainScreenBuffer, MainTextureSize );
C3D_SyncDisplayTransfer(
( uint32_t* ) MainScreenBuffer,
GX_BUFFER_DIM( MainTextureWidth, MainTextureHeight ),
ScreenSprite.image.tex->data,
GX_BUFFER_DIM( MainTextureWidth, MainTextureHeight ),
GX_TRANSFER_OUT_FORMAT( GX_TRANSFER_FMT_RGBA8 ) |
GX_TRANSFER_IN_FORMAT( GX_TRANSFER_FMT_RGBA8 ) |
GX_TRANSFER_OUT_TILED( 1 ) |
GX_TRANSFER_FLIP_VERT( 0 )
);
// Draw
C2D_TargetClear( MainRenderTarget, C2D_Color32( 0, 255, 255, 255 ) );
C2D_SceneBegin( MainRenderTarget );
C2D_DrawSprite( &ScreenSprite );
C3D_FrameEnd( 0 );
}
DestroyMainScreen( );
}
C2D_Fini( );
C3D_Fini( );
gfxExit( );
threadExit( 0 );
}
int main( void ) {
uint32_t Keys_Down = false;
uint64_t a, b = 0;
float Time = 0;
osSetSpeedupEnable( false );
APT_SetAppCpuTimeLimit( 80 );
RenderThreadHandle = threadCreate( RenderThread, NULL, 4096, 0x20, 1, false );
if ( ! RenderThreadHandle ) {
return ShowError( "Failed to create render thread" );
}
svcCreateEvent( &RenderThreadReqUpdateSignal, RESET_ONESHOT );
//svcCreateMutex( &RenderThreadConversionMutex, false );
// Wait for render thread to init and start running
while ( RenderThreadReady == false )
;
printf( "Hi!\n" );
while ( aptMainLoop( ) ) {
hidScanInput( );
Keys_Down = hidKeysDown( );
if ( Keys_Down & KEY_A ) {
a = svcGetSystemTick( );
svcSignalEvent( RenderThreadReqUpdateSignal );
svcWaitSynchronization( RenderThreadConversionMutex, INT64_MAX );
b = svcGetSystemTick( );
Time = ( b - a );
Time = ( Time / CPU_TICKS_PER_MSEC );
printf( "Conversion took %.2fms\n", Time );
}
if ( Keys_Down & KEY_START ) {
break;
}
}
svcReleaseMutex( RenderThreadConversionMutex );
svcCloseHandle( RenderThreadReqUpdateSignal );
svcCloseHandle( RenderThreadConversionMutex );
RenderThreadRun = false;
threadJoin( RenderThreadHandle, U64_MAX );
threadFree( RenderThreadHandle );
return 0;
}