int main(int argc, const char* argv[]) { padInfo padinfo; padData paddata; s32 status; u32 joinstatus; displayData vdat; char filename[64]; int picturecount = 0; atexit(appCleanup); sysUtilRegisterCallback(SYSUTIL_EVENT_SLOT0, eventHandle, NULL); init_screen(&vdat); printf("screen res: %dx%d buffers: %p %p\n", vdat.res.width, vdat.res.height, vdat.buffer[0], vdat.buffer[1]); ioPadInit(7); sysSpuImage image; u32 group_id; sysSpuThreadAttribute attr = { ptr2ea("mythread"), 8+1, SPU_THREAD_ATTR_NONE }; sysSpuThreadGroupAttribute grpattr = { 7+1, ptr2ea("mygroup"), 0, 0 }; sysSpuThreadArgument arg[6]; u32 cause; int i, j; volatile spustr_t *spu = memalign(16, 6*sizeof(spustr_t)); printf("Initializing 6 SPUs... "); status = sysSpuInitialize(6, 0); printf("%08x\n", status); printf("Loading ELF image... "); status = sysSpuImageImport(&image, spu_bin, 0); printf("%08x\n", status); printf("Creating thread group... "); status = sysSpuThreadGroupCreate(&group_id, 6, 100, &grpattr); printf("%08x\n", status); printf("group id = %d\n", group_id); /* create 6 spu threads */ for (i = 0; i < 6; i++) { /* Populate the data structure for the SPU */ spu[i].rank = i; spu[i].count = 6; spu[i].sync = 0; spu[i].width = vdat.res.width; spu[i].height = vdat.res.height; spu[i].zoom = 1.0f; spu[i].xc = -0.5f; spu[i].yc = 0.f; /* The first argument of the main function for the SPU program is the * address of its dedicated structure, so it can fetch its contents via DMA */ arg[i].arg0 = ptr2ea(&spu[i]); printf("Creating SPU thread... "); status = sysSpuThreadInitialize((u32*)&spu[i].id, group_id, i, &image, &attr, &arg[i]); printf("%08x\n", status); printf("thread id = %d\n", spu[i].id); printf("Configuring SPU... %08x\n", sysSpuThreadSetConfiguration(spu[i].id, SPU_SIGNAL1_OVERWRITE|SPU_SIGNAL2_OVERWRITE)); } printf("Starting SPU thread group... "); status = sysSpuThreadGroupStart(group_id); printf("%08x\n", status); /* Now all the SPU threads have been started. For the moment they are blocked * waiting for a value in their signal notification register 1 (the * spu_read_signal1() call in SPU program). */ int quit = 0; uint32_t scr_ea; while (!quit) { /* Check the pads. */ ioPadGetInfo(&padinfo); for (i=0; i<MAX_PADS; i++) { if (padinfo.status[i]) { ioPadGetData(i, &paddata); if (paddata.BTN_CROSS) quit = 1; int ah = center0(paddata.ANA_L_H); int av = center0(paddata.ANA_L_V); int az = center0(paddata.ANA_R_V); for (j = 0; j < 6; j++) { spu[j].xc += ah*0.001f*spu[j].zoom; spu[j].yc += av*0.001f*spu[j].zoom; spu[j].zoom *= (1.f + az*0.0005f); if (spu[j].zoom < 0.0001) spu[j].zoom = 0.0001; } if (paddata.BTN_SQUARE) { sprintf(filename, "/dev_usb/mandel%04d.bmp", ++picturecount); export_bmp(filename, vdat.buffer[vdat.curr_fb], vdat.res.width, vdat.res.height); } if (paddata.BTN_START) { for (j = 0; j < 6; j++) { spu[j].xc = -.5f; spu[j].yc = 0.f; spu[j].zoom = 1.f; } } } } waitFlip(); /* Wait for the last flip to finish, so we can draw to the old buffer */ #if 0 /* test code */ int x, y; u32 *p=vdat.buffer[vdat.curr_fb]; u32 c = 0x01010101 * (vdat.framecnt&0xff); for (y=0; y<1080; ++y) { for (x=0; x<1920; ++x) { *p++ = c; } } #endif scr_ea = ptr2ea(vdat.buffer[vdat.curr_fb]); for (i = 0; i < 6; i++) { spu[i].sync = 0; status = sysSpuThreadWriteSignal(spu[i].id, 0, scr_ea); assert(status == 0); } for (i = 0; i < 6; i++) { while (spu[i].sync == 0); } flip(&vdat); /* Flip buffer onto screen */ sysUtilCheckCallback(); } for (i = 0; i < 6; i++) { status = sysSpuThreadWriteSignal(spu[i].id, 0, 0); assert(status == 0); } printf("Joining SPU thread group... "); status = sysSpuThreadGroupJoin(group_id, &cause, &joinstatus); printf("%08x\n", status); printf("cause=%d status=%d\n", cause, joinstatus); printf("Closing image... %08x\n", sysSpuImageClose(&image)); free((void*)spu); return 0; }
int main(int argc,char *argv[]) { u32 *array; u32 group_id; spustr_t *spu; sysSpuImage image; u32 cause,status,i; sysSpuThreadArgument arg[6]; sysSpuThreadGroupAttribute grpattr = { 7+1, ptr2ea("mygroup"), 0, 0 }; sysSpuThreadAttribute attr = { ptr2ea("mythread"), 8+1, SPU_THREAD_ATTR_NONE }; printf("spuchain starting....\n"); sysSpuInitialize(6,0); sysSpuImageImport(&image,spu_bin,0); sysSpuThreadGroupCreate(&group_id,6,100,&grpattr); spu = (spustr_t*)memalign(128,6*sizeof(spustr_t)); array = (u32*)memalign(128,4*sizeof(u32)); 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].arg0 = ptr2ea(&spu[i]); printf("Creating SPU thread... "); sysSpuThreadInitialize(&spu[i].id,group_id,i,&image,&attr,&arg[i]); printf("%08x\n",spu[i].id); sysSpuThreadSetConfiguration(spu[i].id,(SPU_SIGNAL1_OVERWRITE | SPU_SIGNAL2_OVERWRITE)); } printf("Starting SPU thread group....\n"); sysSpuThreadGroupStart(group_id); printf("Initial array: "); for(i=0;i<4;i++) { array[i] = (i + 1); printf(" %d",array[i]); } printf("\n"); /* Send signal notification to SPU 0 */ printf("sending signal.... \n"); sysSpuThreadWriteSignal(spu[0].id,0,1); /* Wait for SPU 5 to return */ while(spu[5].sync==0); printf("Output array: "); for(i=0;i<4;i++) printf(" %d",array[i]); printf("\n"); printf("Joining SPU thread group....\n"); sysSpuThreadGroupJoin(group_id,&cause,&status); sysSpuImageClose(&image); free(array); free(spu); return 0; }