@@ -395,6 +395,7 @@ static void vout_flip(const void *vram, int stride, int bgr24,
395
395
#ifdef _3DS
396
396
static u32 mapped_addrs [8 ];
397
397
static u32 mapped_ram , mapped_ram_src ;
398
+ static void * vram_mem ;
398
399
399
400
// http://3dbrew.org/wiki/Memory_layout#ARM11_User-land_memory_regions
400
401
static void * pl_3ds_mmap (unsigned long addr , size_t size ,
@@ -404,6 +405,9 @@ static void *pl_3ds_mmap(unsigned long addr, size_t size,
404
405
* can_retry_addr = 0 ;
405
406
(void )addr ;
406
407
408
+ if (tag == MAP_TAG_VRAM && vram_mem )
409
+ return vram_mem ;
410
+
407
411
if (__ctr_svchax ) do
408
412
{
409
413
// idea from fbalpha2012_neogeo
@@ -474,6 +478,9 @@ static void pl_3ds_munmap(void *ptr, size_t size, enum psxMapTag tag)
474
478
{
475
479
(void )tag ;
476
480
481
+ if (ptr && ptr == vram_mem )
482
+ return ;
483
+
477
484
if (ptr && __ctr_svchax )
478
485
{
479
486
size_t i ;
@@ -497,6 +504,26 @@ static void pl_3ds_munmap(void *ptr, size_t size, enum psxMapTag tag)
497
504
498
505
free (ptr );
499
506
}
507
+
508
+ // debug
509
+ static int ctr_get_tlbe_k (u32 ptr )
510
+ {
511
+ u32 tlb_base = -1 , tlb_ctl = -1 , * l1 ;
512
+ s32 tlb_mask = 0xffffc000 ;
513
+
514
+ asm volatile ("mrc p15, 0, %0, c2, c0, 0" : "=r" (tlb_base ));
515
+ asm volatile ("mrc p15, 0, %0, c2, c0, 2" : "=r" (tlb_ctl ));
516
+ tlb_mask >>= tlb_ctl & 7 ;
517
+ l1 = (u32 * )((tlb_base & tlb_mask ) | 0xe0000000 );
518
+ return l1 [ptr >> 20 ];
519
+ }
520
+
521
+ static int ctr_get_tlbe (void * ptr )
522
+ {
523
+ if (svcConvertVAToPA ((void * )0xe0000000 , 0 ) != 0x20000000 )
524
+ return -1 ;
525
+ return svcCustomBackdoor (ctr_get_tlbe_k , ptr , NULL , NULL );
526
+ }
500
527
#endif
501
528
502
529
#ifdef HAVE_LIBNX
@@ -628,8 +655,9 @@ static void log_mem_usage(void)
628
655
if (__ctr_svchax )
629
656
svcGetSystemInfo (& mem_used , 0 , 1 );
630
657
631
- SysPrintf ("mem: %d/%d heap: %d linear: %d stack: %d exe: %d\n" , (int )mem_used , app_memory ,
632
- __heap_size , __linear_heap_size , __stacksize__ , (int )& __end__ - 0x100000 );
658
+ SysPrintf ("mem: %d/%d heap: %d linear: %d/%d stack: %d exe: %d\n" ,
659
+ (int )mem_used , app_memory , __heap_size , __linear_heap_size - linearSpaceFree (),
660
+ __linear_heap_size , __stacksize__ , (int )& __end__ - 0x100000 );
633
661
#endif
634
662
}
635
663
@@ -3577,7 +3605,16 @@ void retro_init(void)
3577
3605
}
3578
3606
3579
3607
#ifdef _3DS
3580
- vout_buf = linearMemAlign (VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT * 2 , 0x80 );
3608
+ // Place psx vram in linear mem to take advantage of it's supersection mapping.
3609
+ // The emu allocs 2x (0x201000 to be exact) but doesn't really need that much,
3610
+ // so place vout_buf below to also act as an overdraw guard.
3611
+ vram_mem = linearMemAlign (1024 * 1024 + 4096 + VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT * 2 , 4096 );
3612
+ if (vram_mem ) {
3613
+ vout_buf = (char * )vram_mem + 1024 * 1024 + 4096 ;
3614
+ if (__ctr_svchax )
3615
+ SysPrintf ("vram: %p PA %08x tlb %08x\n" , vram_mem ,
3616
+ svcConvertVAToPA (vram_mem , 0 ), ctr_get_tlbe (vram_mem ));
3617
+ }
3581
3618
#elif defined(_POSIX_C_SOURCE ) && (_POSIX_C_SOURCE >= 200112L ) && P_HAVE_POSIX_MEMALIGN
3582
3619
if (posix_memalign (& vout_buf , 16 , VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT * 2 ) != 0 )
3583
3620
vout_buf = NULL ;
@@ -3635,7 +3672,8 @@ void retro_deinit(void)
3635
3672
}
3636
3673
SysClose ();
3637
3674
#ifdef _3DS
3638
- linearFree (vout_buf );
3675
+ linearFree (vram_mem );
3676
+ vram_mem = NULL ;
3639
3677
#else
3640
3678
free (vout_buf );
3641
3679
#endif
0 commit comments