s32 main(s32 argc, const char* argv[]) { printf("init_screen()\n"); init_screen(); PadInfo padinfo; PadData paddata; int i; printf("Initializing 6 SPUs... "); printf("%08x\n", lv2SpuInitialize(6, 5)); printf("ioPadInit()\n"); ioPadInit(7); printf("init_efb()\n"); init_efb(1); long frame = 0; // To keep track of how many frames we have rendered. // Ok, everything is setup. Now for the main loop. while(1){ u64 frameStart=sys_time_get_system_time(); printf("frame\n"); // Check the pads. ioPadGetInfo(&padinfo); for(i=0; i<MAX_PADS; i++){ if(padinfo.status[i]){ ioPadGetData(i, &paddata); if(paddata.BTN_CROSS){ return 0; } } } u64 afterPad=sys_time_get_system_time(); u64 afterWaitForBlit=sys_time_get_system_time(); printf("waitFlip\n"); waitFlip(); // Wait for the last flip to finish, so we can draw to the old buffer u64 afterWaitFlip=sys_time_get_system_time(); printf("drawFrame\n"); if(1) { //drawFrame(buffers[currentBuffer], frame); // Draw into the unused buffer6 drawFrame((buffer*)offscreenBuffers[0], frame); // Draw into the unused buffer } else { for(int xy=0;xy<offWidth*offHeight;xy++) { if(currentBuffer) offscreenBuffers[0][xy]=xy*2;//%offWidth; else offscreenBuffers[0][xy]=xy*2;//%offWidth; } } u64 afterDraw=sys_time_get_system_time(); printf("efbBlitToScreen\n"); efbBlitToScreen(efbD, buffers[currentBuffer]->ptr,efbBuffers[0]); efbWaitForBlit(efbD); printf("flip\n"); u64 afterBlit=sys_time_get_system_time(); flip(currentBuffer); // Flip buffer onto screen printf("currentBuffer\n"); u64 afterFlip=sys_time_get_system_time(); currentBuffer = !currentBuffer; frame++; //if(frame>4) // break; u64 padTime=afterPad-frameStart; u64 blitFlipWaitTime=afterWaitForBlit-afterPad; u64 flipWaitTime=afterWaitFlip-afterWaitForBlit; u64 drawTime=afterDraw-afterWaitFlip; u64 blitTime=afterBlit-afterDraw; u64 flipTime=afterFlip-afterBlit; u64 totalTime=afterFlip-frameStart; printf("%9ld, %9ld, %9ld, %9ld, %9ld, %9ld, %9ld\n",padTime,blitFlipWaitTime,flipWaitTime,drawTime,blitTime,flipTime,totalTime); //break; } efbShutdown(efbD); return 0; }
int main(int argc, const char* argv[]) { sysSpuImage image; u32 entry = 0; u32 segmentcount = 0; sysSpuSegment* segments; u32 group_id; Lv2SpuThreadAttributes attr = { ptr2ea("mythread"), 8+1, LV2_SPU_THREAD_ATTRIBUTE_NONE }; Lv2SpuThreadGroupAttributes grpattr = { 7+1, ptr2ea("mygroup"), 0, 0 }; Lv2SpuThreadArguments arg[6]; u32 cause, status; int i; spustr_t *spu = memalign(16, 6*sizeof(spustr_t)); uint32_t *array = memalign(16, 24*sizeof(uint32_t)); printf("Initializing 6 SPUs... "); printf("%08x\n", lv2SpuInitialize(6, 0)); printf("Getting ELF information... "); printf("%08x\n", sysSpuElfGetInformation(spu_bin, &entry, &segmentcount)); printf("\tEntry Point: %08x\n\tSegment Count: %08x\n", entry, segmentcount); size_t segmentsize = sizeof(sysSpuSegment) * segmentcount; segments = (sysSpuSegment*)malloc(segmentsize); memset(segments, 0, segmentsize); printf("Getting ELF segments... "); printf("%08x\n", sysSpuElfGetSegments(spu_bin, segments, segmentcount)); printf("Loading ELF image... "); printf("%08x\n", sysSpuImageImport(&image, spu_bin, 0)); printf("Creating thread group... "); printf("%08x\n", lv2SpuThreadGroupCreate(&group_id, 6, 100, &grpattr)); printf("group id = %d\n", group_id); /* create 6 spu threads */ for (i = 0; i < 6; i++) { spu[i].rank = i; spu[i].count = 6; spu[i].sync = 0; spu[i].array_ea = ptr2ea(array); arg[i].argument1 = ptr2ea(&spu[i]); printf("Creating SPU thread... "); printf("%08x\n", lv2SpuThreadInitialize(&spu[i].id, group_id, i, &image, &attr, &arg[i])); printf("thread id = %d\n", spu[i].id); printf("Configuring SPU... %08x\n", lv2SpuThreadSetConfiguration(spu[i].id, LV2_SPU_SIGNAL1_OVERWRITE|LV2_SPU_SIGNAL2_OVERWRITE)); } printf("Starting SPU thread group... "); printf("%08x\n", lv2SpuThreadGroupStart(group_id)); printf("Initial array: "); for (i = 0; i < 24; i++) { array[i] = i+1; printf(" %d", array[i]); } printf("\n"); /* Send signal notification to waiting spus */ for (i = 0; i < 6; i++) printf("Sending signal... %08x\n", lv2SpuThreadWriteSignal(spu[i].id, 0, 1)); printf("Waiting for SPUs to return...\n"); for (i = 0; i < 6; i++) while (spu[i].sync == 0); printf("Output array: "); for (i = 0; i < 24; i++) printf(" %d", array[i]); printf("\n"); printf("Joining SPU thread group... "); printf("%08x\n", lv2SpuThreadGroupJoin(group_id, &cause, &status)); printf("cause=%d status=%d\n", cause, status); printf("Closing image... %08x\n", sysSpuImageClose(&image)); free(array); free(spu); return 0; }