void gfxInit() { gspInit(); gfxSharedMemory=(u8*)0x10002000; GSPGPU_AcquireRight(NULL, 0x0); //setup our gsp shared mem section svcCreateEvent(&gspEvent, 0x0); GSPGPU_RegisterInterruptRelayQueue(NULL, gspEvent, 0x1, &gspSharedMemHandle, &gfxThreadID); svcMapMemoryBlock(gspSharedMemHandle, (u32)gfxSharedMemory, 0x3, 0x10000000); // default gspHeap configuration : // topleft1 0x00000000-0x00046500 // topleft2 0x00046500-0x0008CA00 // bottom1 0x0008CA00-0x000C4E00 // bottom2 0x000C4E00-0x000FD200 // if 3d enabled : // topright1 0x000FD200-0x00143700 // topright2 0x00143700-0x00189C00 gfxTopLeftFramebuffers[0]=linearAlloc(0x46500); gfxTopLeftFramebuffers[1]=linearAlloc(0x46500); gfxBottomFramebuffers[0]=linearAlloc(0x38400); gfxBottomFramebuffers[1]=linearAlloc(0x38400); gfxTopRightFramebuffers[0]=linearAlloc(0x46500); gfxTopRightFramebuffers[1]=linearAlloc(0x46500); enable3d=false; //initialize framebuffer info structures gfxSetFramebufferInfo(GFX_TOP, 0); gfxSetFramebufferInfo(GFX_BOTTOM, 0); //GSP shared mem : 0x2779F000 gxCmdBuf=(u32*)(gfxSharedMemory+0x800+gfxThreadID*0x200); currentBuffer[0]=0; currentBuffer[1]=0; // Initialize event handler and wait for VBlank gspInitEventHandler(gspEvent, (vu8*)gfxSharedMemory, gfxThreadID); gspWaitForVBlank(); GSPGPU_SetLcdForceBlack(NULL, 0x0); }
void gfxInit(GSPGPU_FramebufferFormats topFormat, GSPGPU_FramebufferFormats bottomFormat, bool vrambuffers) { void *(*screenAlloc)(size_t); if (vrambuffers) { screenAlloc=vramAlloc; screenFree=vramFree; } else { screenAlloc=linearAlloc; screenFree=linearFree; } gspInit(); gfxSharedMemory=(u8*)mappableAlloc(0x1000); GSPGPU_AcquireRight(0x0); //setup our gsp shared mem section svcCreateEvent(&gspEvent, 0x0); GSPGPU_RegisterInterruptRelayQueue(gspEvent, 0x1, &gspSharedMemHandle, &gfxThreadID); svcMapMemoryBlock(gspSharedMemHandle, (u32)gfxSharedMemory, 0x3, 0x10000000); // default gspHeap configuration : // topleft1 0x00000000-0x00046500 // topleft2 0x00046500-0x0008CA00 // bottom1 0x0008CA00-0x000C4E00 // bottom2 0x000C4E00-0x000FD200 // if 3d enabled : // topright1 0x000FD200-0x00143700 // topright2 0x00143700-0x00189C00 u32 topSize = 400 * 240 * __get_bytes_per_pixel(topFormat); u32 bottomSize = 320 * 240 * __get_bytes_per_pixel(bottomFormat); gfxTopLeftFramebuffers[0]=screenAlloc(topSize); gfxTopLeftFramebuffers[1]=screenAlloc(topSize); gfxBottomFramebuffers[0]=screenAlloc(bottomSize); gfxBottomFramebuffers[1]=screenAlloc(bottomSize); gfxTopRightFramebuffers[0]=screenAlloc(topSize); gfxTopRightFramebuffers[1]=screenAlloc(topSize); enable3d=false; //set requested modes gfxSetScreenFormat(GFX_TOP,topFormat); gfxSetScreenFormat(GFX_BOTTOM,bottomFormat); //initialize framebuffer info structures gfxSetFramebufferInfo(GFX_TOP, 0); gfxSetFramebufferInfo(GFX_BOTTOM, 0); //GSP shared mem : 0x2779F000 gxCmdBuf=(u32*)(gfxSharedMemory+0x800+gfxThreadID*0x200); currentBuffer[0]=0; currentBuffer[1]=0; // Initialize event handler and wait for VBlank gspInitEventHandler(gspEvent, (vu8*) gfxSharedMemory, gfxThreadID); gspWaitForVBlank(); GSPGPU_SetLcdForceBlack(0x0); }
D3DSDevice D3DSDevice::CreateDevice( GSPGPU_FramebufferFormats FBFormatTop, GSPGPU_FramebufferFormats FBFormatBottom, bool bVRamBuffers, bool bEnable3D ) { D3DSDevice device; device.m_b3DEnabled = bEnable3D; device.m_FBFormatTop = FBFormatTop; device.m_FBFormatBottom = FBFormatBottom; // select allocator void* (*allocator)(size_t); if (bVRamBuffers) { allocator = vramAlloc; device.dealloc = vramFree; } else { allocator = linearAlloc; device.dealloc = linearFree; } gspInit(); device.m_pSharedMemory = (u8*) mappableAlloc( 0x1000 ); GSPGPU_AcquireRight( 0x0 ); // create shared memory svcCreateEvent( &device.m_hGSPEvent, 0x0 ); GSPGPU_RegisterInterruptRelayQueue( device.m_hGSPEvent, 0x1, &device.m_hGSPSharedMemory, &device.m_ThreadId ); svcMapMemoryBlock( device.m_hGSPSharedMemory, (u32)device.m_pSharedMemory, (MemPerm)(MEMPERM_READ|MEMPERM_WRITE), MEMPERM_DONTCARE ); // allocate framebuffers... u32 bytes_top = 400 * 240 * D3DSDevice::GetBytesPerPixel( FBFormatTop ); u32 bytes_bottom = 320 * 240 * D3DSDevice::GetBytesPerPixel( FBFormatBottom ); device.m_FBBottom[0] = (u8*) allocator( bytes_bottom ); device.m_FBBottom[1] = (u8*) allocator( bytes_bottom ); device.m_FBTop[ 0 ] = (u8*) allocator( bytes_top ); device.m_FBTop[ 1 ] = (u8*) allocator( bytes_top ); if (device.m_b3DEnabled) { device.m_FBTop[ 2 ] = (u8*) allocator( bytes_top ); device.m_FBTop[ 3 ] = (u8*) allocator( bytes_top ); } device.SetFramebufferInfo( D3DS_SCREEN_TOP, 0 ); device.SetFramebufferInfo( D3DS_SCREEN_BOTTOM, 0 ); gxCmdBuf = (u32*) (device.m_pSharedMemory + 0x800 + device.m_ThreadId*0x200 ); gspInitEventHandler( device.m_hGSPEvent, (vu8*)device.m_pSharedMemory, device.m_ThreadId ); gspWaitForVBlank(); GSPGPU_SetLcdForceBlack( 0x0 ); return device; }