Mercurial > sdl-ios-xcode
comparison src/video/ps3/SDL_ps3render.c @ 3150:0cf7bff804ad gsoc2009_ps3
Code reviewed and added SPE API documentation.
author | Martin Lowinski <martin@goldtopf.org> |
---|---|
date | Sun, 19 Jul 2009 11:31:47 +0000 |
parents | 104786a909a2 |
children | 7f3341cccf42 |
comparison
equal
deleted
inserted
replaced
3149:b143d794bff1 | 3150:0cf7bff804ad |
---|---|
72 SDL_PS3_CreateRenderer, | 72 SDL_PS3_CreateRenderer, |
73 { | 73 { |
74 "ps3", | 74 "ps3", |
75 (SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTVSYNC | | 75 (SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTVSYNC | |
76 SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTDISCARD | | 76 SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTDISCARD | |
77 SDL_RENDERER_ACCELERATED) | 77 SDL_RENDERER_ACCELERATED), |
78 (SDL_TEXTUREMODULATE_NONE), | |
79 (SDL_BLENDMODE_NONE), | |
80 /* We use bilinear scaling on the SPE for YV12 & IYUV | |
81 * (width and height % 8 = 0) */ | |
82 (SDL_TEXTURESCALEMODE_SLOW) | |
78 } | 83 } |
79 }; | 84 }; |
80 | 85 |
81 typedef struct | 86 typedef struct |
82 { | 87 { |
83 int current_screen; | 88 int current_screen; |
84 SDL_Surface *screen; | 89 SDL_Surface *screen; |
85 SDL_VideoDisplay *display; | 90 SDL_VideoDisplay *display; |
91 /* adress of the centered image in the framebuffer (double buffered) */ | |
86 uint8_t *center[2]; | 92 uint8_t *center[2]; |
87 | 93 |
88 /* width of input (bounded by writeable width) */ | 94 /* width of input (bounded by writeable width) */ |
89 unsigned int bounded_width; | 95 unsigned int bounded_width; |
90 /* height of input (bounded by writeable height) */ | 96 /* height of input (bounded by writeable height) */ |
113 volatile struct scale_parms_t * scaler_parms __attribute__((aligned(128))); | 119 volatile struct scale_parms_t * scaler_parms __attribute__((aligned(128))); |
114 } SDL_PS3_RenderData; | 120 } SDL_PS3_RenderData; |
115 | 121 |
116 typedef struct | 122 typedef struct |
117 { | 123 { |
118 //SDL_PixelFormat * format; | |
119 int pitch; | 124 int pitch; |
120 volatile void *pixels;// __attribute__((aligned(128))); we don't need alignment here | 125 /* Image data */ |
126 volatile void *pixels; | |
127 /* Use software renderer for not supported formats */ | |
121 SDL_SW_YUVTexture *yuv; | 128 SDL_SW_YUVTexture *yuv; |
122 /* Can we use the SPE to process this texture? */ | 129 /* Can we use the SPE to process this texture? */ |
123 unsigned int accelerated; | 130 unsigned int accelerated; |
124 } PS3_TextureData; | 131 } PS3_TextureData; |
125 | 132 |
153 SDL_OutOfMemory(); | 160 SDL_OutOfMemory(); |
154 return NULL; | 161 return NULL; |
155 } | 162 } |
156 SDL_zerop(data); | 163 SDL_zerop(data); |
157 | 164 |
158 #if 1 | |
159 renderer->CreateTexture = PS3_CreateTexture; | 165 renderer->CreateTexture = PS3_CreateTexture; |
160 renderer->DestroyTexture = PS3_DestroyTexture; | 166 renderer->DestroyTexture = PS3_DestroyTexture; |
161 renderer->QueryTexturePixels = PS3_QueryTexturePixels; | 167 renderer->QueryTexturePixels = PS3_QueryTexturePixels; |
162 renderer->UpdateTexture = PS3_UpdateTexture; | 168 renderer->UpdateTexture = PS3_UpdateTexture; |
163 renderer->LockTexture = PS3_LockTexture; | 169 renderer->LockTexture = PS3_LockTexture; |
164 renderer->UnlockTexture = PS3_UnlockTexture; | 170 renderer->UnlockTexture = PS3_UnlockTexture; |
165 #endif | |
166 renderer->ActivateRenderer = SDL_PS3_ActivateRenderer; | 171 renderer->ActivateRenderer = SDL_PS3_ActivateRenderer; |
167 renderer->RenderPoint = SDL_PS3_RenderPoint; | 172 renderer->RenderPoint = SDL_PS3_RenderPoint; |
168 renderer->RenderLine = SDL_PS3_RenderLine; | 173 renderer->RenderLine = SDL_PS3_RenderLine; |
169 renderer->RenderFill = SDL_PS3_RenderFill; | 174 renderer->RenderFill = SDL_PS3_RenderFill; |
170 renderer->RenderCopy = SDL_PS3_RenderCopy; | 175 renderer->RenderCopy = SDL_PS3_RenderCopy; |
226 SDL_PS3_DestroyRenderer(renderer); | 231 SDL_PS3_DestroyRenderer(renderer); |
227 SDL_OutOfMemory(); | 232 SDL_OutOfMemory(); |
228 return NULL; | 233 return NULL; |
229 } | 234 } |
230 | 235 |
236 /* Set up the SPE scaler */ | |
231 data->scaler_thread_data->program = bilin_scaler_spu; | 237 data->scaler_thread_data->program = bilin_scaler_spu; |
232 data->scaler_thread_data->program_name = "bilin_scaler_spu"; | 238 data->scaler_thread_data->program_name = "bilin_scaler_spu"; |
233 data->scaler_thread_data->keepalive = 0; | 239 data->scaler_thread_data->keepalive = 0; |
234 data->scaler_thread_data->booted = 0; | 240 data->scaler_thread_data->booted = 0; |
235 | 241 |
242 /* Set up the SPE converter */ | |
236 data->converter_thread_data->program = yuv2rgb_spu; | 243 data->converter_thread_data->program = yuv2rgb_spu; |
237 data->converter_thread_data->program_name = "yuv2rgb_spu"; | 244 data->converter_thread_data->program_name = "yuv2rgb_spu"; |
238 data->converter_thread_data->keepalive = 1; | 245 data->converter_thread_data->keepalive = 1; |
239 data->converter_thread_data->booted = 0; | 246 data->converter_thread_data->booted = 0; |
240 | 247 |
275 return -1; | 282 return -1; |
276 } | 283 } |
277 /* but align pixels */ | 284 /* but align pixels */ |
278 SDL_free(data->yuv->pixels); | 285 SDL_free(data->yuv->pixels); |
279 data->yuv->pixels = (Uint8 *)memalign(16, texture->w * texture->h * 2); | 286 data->yuv->pixels = (Uint8 *)memalign(16, texture->w * texture->h * 2); |
287 if (!data->yuv->pixels) { | |
288 SDL_OutOfMemory(); | |
289 return -1; | |
290 } | |
280 | 291 |
281 /* Redo: Find the pitch and offset values for the overlay */ | 292 /* Redo: Find the pitch and offset values for the overlay */ |
282 SDL_SW_YUVTexture *swdata = (SDL_SW_YUVTexture *) data->yuv; | 293 SDL_SW_YUVTexture *swdata = (SDL_SW_YUVTexture *) data->yuv; |
283 switch (texture->format) { | 294 switch (texture->format) { |
284 case SDL_PIXELFORMAT_YV12: | 295 case SDL_PIXELFORMAT_YV12: |
495 SDL_Window *window = SDL_GetWindowFromID(renderer->window); | 506 SDL_Window *window = SDL_GetWindowFromID(renderer->window); |
496 SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window); | 507 SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window); |
497 PS3_TextureData *txdata = (PS3_TextureData *) texture->driverdata; | 508 PS3_TextureData *txdata = (PS3_TextureData *) texture->driverdata; |
498 SDL_VideoData *devdata = display->device->driverdata; | 509 SDL_VideoData *devdata = display->device->driverdata; |
499 | 510 |
511 /* Debug info */ | |
500 deprintf(1, "srcrect->w = %u\n", srcrect->w); | 512 deprintf(1, "srcrect->w = %u\n", srcrect->w); |
501 deprintf(1, "srcrect->h = %u\n", srcrect->h); | 513 deprintf(1, "srcrect->h = %u\n", srcrect->h); |
502 deprintf(1, "srcrect->x = %u\n", srcrect->x); | 514 deprintf(1, "srcrect->x = %u\n", srcrect->x); |
503 deprintf(1, "srcrect->y = %u\n", srcrect->y); | 515 deprintf(1, "srcrect->y = %u\n", srcrect->y); |
504 deprintf(1, "dstrect->w = %u\n", dstrect->w); | 516 deprintf(1, "dstrect->w = %u\n", dstrect->w); |
505 deprintf(1, "dstrect->h = %u\n", dstrect->h); | 517 deprintf(1, "dstrect->h = %u\n", dstrect->h); |
506 deprintf(1, "dstrect->x = %u\n", dstrect->x); | 518 deprintf(1, "dstrect->x = %u\n", dstrect->x); |
507 deprintf(1, "dstrect->y = %u\n", dstrect->y); | 519 deprintf(1, "dstrect->y = %u\n", dstrect->y); |
508 | |
509 deprintf(1, "texture->w = %u\n", texture->w); | 520 deprintf(1, "texture->w = %u\n", texture->w); |
510 deprintf(1, "texture->h = %u\n", texture->h); | 521 deprintf(1, "texture->h = %u\n", texture->h); |
511 | 522 |
512 if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) { | 523 if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) { |
513 deprintf(1, "SDL_ISPIXELFORMAT_FOURCC = true\n"); | 524 deprintf(1, "SDL_ISPIXELFORMAT_FOURCC = true\n"); |
575 | 586 |
576 /* Convert YUV texture to RGB */ | 587 /* Convert YUV texture to RGB */ |
577 SPE_SendMsg(data->converter_thread_data, SPU_START); | 588 SPE_SendMsg(data->converter_thread_data, SPU_START); |
578 SPE_SendMsg(data->converter_thread_data, (unsigned int)data->converter_thread_data->argp); | 589 SPE_SendMsg(data->converter_thread_data, (unsigned int)data->converter_thread_data->argp); |
579 | 590 |
591 /* We can probably move that to RenderPresent() */ | |
580 SPE_WaitForMsg(data->converter_thread_data, SPU_FIN); | 592 SPE_WaitForMsg(data->converter_thread_data, SPU_FIN); |
581 if (scaler_out) { | 593 if (scaler_out) { |
582 free(scaler_out); | 594 free(scaler_out); |
583 } | 595 } |
584 } else { | 596 } else { |
623 (SDL_PS3_RenderData *) renderer->driverdata; | 635 (SDL_PS3_RenderData *) renderer->driverdata; |
624 SDL_Window *window = SDL_GetWindowFromID(renderer->window); | 636 SDL_Window *window = SDL_GetWindowFromID(renderer->window); |
625 SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window); | 637 SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window); |
626 SDL_VideoData *devdata = display->device->driverdata; | 638 SDL_VideoData *devdata = display->device->driverdata; |
627 | 639 |
628 #if 0 | |
629 /* Send the data to the display */ | |
630 if (SDL_getenv("SDL_VIDEO_PS3_SAVE_FRAMES")) { | |
631 char file[128]; | |
632 SDL_snprintf(file, sizeof(file), "SDL_window%d-%8.8d.bmp", | |
633 renderer->window, ++frame_number); | |
634 SDL_SaveBMP(data->screen[data->current_screen], file); | |
635 } | |
636 #endif | |
637 | |
638 /* Send the data to the screen */ | 640 /* Send the data to the screen */ |
639 /* Get screeninfo */ | 641 /* Get screeninfo */ |
640 struct fb_fix_screeninfo fb_finfo; | 642 struct fb_fix_screeninfo fb_finfo; |
641 if (ioctl(devdata->fbdev, FBIOGET_FSCREENINFO, &fb_finfo)) { | 643 if (ioctl(devdata->fbdev, FBIOGET_FSCREENINFO, &fb_finfo)) { |
642 SDL_SetError("[PS3] Can't get fixed screeninfo"); | 644 SDL_SetError("[PS3] Can't get fixed screeninfo"); |
643 } | 645 } |
644 struct fb_var_screeninfo fb_vinfo; | 646 struct fb_var_screeninfo fb_vinfo; |
645 if (ioctl(devdata->fbdev, FBIOGET_VSCREENINFO, &fb_vinfo)) { | 647 if (ioctl(devdata->fbdev, FBIOGET_VSCREENINFO, &fb_vinfo)) { |
646 SDL_SetError("[PS3] Can't get VSCREENINFO"); | 648 SDL_SetError("[PS3] Can't get VSCREENINFO"); |
647 } | 649 } |
650 | |
648 /* 16 and 15 bpp is reported as 16 bpp */ | 651 /* 16 and 15 bpp is reported as 16 bpp */ |
649 //txdata->bpp = fb_vinfo.bits_per_pixel; | 652 //txdata->bpp = fb_vinfo.bits_per_pixel; |
650 //if (txdata->bpp == 16) | 653 //if (txdata->bpp == 16) |
651 // txdata->bpp = fb_vinfo.red.length + fb_vinfo.green.length + fb_vinfo.blue.length; | 654 // txdata->bpp = fb_vinfo.red.length + fb_vinfo.green.length + fb_vinfo.blue.length; |
652 | 655 |
671 devdata->fb_parms->bounded_input_width = data->bounded_width; | 674 devdata->fb_parms->bounded_input_width = data->bounded_width; |
672 //devdata->fb_parms->fb_pixel_size = txdata->bpp / 8; | 675 //devdata->fb_parms->fb_pixel_size = txdata->bpp / 8; |
673 devdata->fb_parms->fb_pixel_size = 4;//SDL_BYTESPERPIXEL(window->format); | 676 devdata->fb_parms->fb_pixel_size = 4;//SDL_BYTESPERPIXEL(window->format); |
674 | 677 |
675 deprintf(3, "[PS3->SPU] fb_thread_data->argp = 0x%x\n", devdata->fb_thread_data->argp); | 678 deprintf(3, "[PS3->SPU] fb_thread_data->argp = 0x%x\n", devdata->fb_thread_data->argp); |
676 | 679 |
677 /* Copying.. */ | 680 /* Copying.. */ |
678 SPE_SendMsg(devdata->fb_thread_data, SPU_START); | 681 SPE_SendMsg(devdata->fb_thread_data, SPU_START); |
679 SPE_SendMsg(devdata->fb_thread_data, (unsigned int)devdata->fb_thread_data->argp); | 682 SPE_SendMsg(devdata->fb_thread_data, (unsigned int)devdata->fb_thread_data->argp); |
680 | 683 |
681 SPE_WaitForMsg(devdata->fb_thread_data, SPU_FIN); | 684 SPE_WaitForMsg(devdata->fb_thread_data, SPU_FIN); |
682 | 685 |
683 /* Wait for vsync */ | 686 /* Wait for vsync */ |
684 if (renderer->info.flags & SDL_RENDERER_PRESENTVSYNC) { | 687 if (renderer->info.flags & SDL_RENDERER_PRESENTVSYNC) { |
685 unsigned long crt = 0; | 688 unsigned long crt = 0; |
711 if (data->screen) { | 714 if (data->screen) { |
712 SDL_FreeSurface(data->screen); | 715 SDL_FreeSurface(data->screen); |
713 } | 716 } |
714 } | 717 } |
715 | 718 |
716 /* Shutdown SPE and related resources */ | 719 /* Shutdown SPE and release related resources */ |
717 if (data->scaler_thread_data) { | 720 if (data->scaler_thread_data) { |
718 free((void *)data->scaler_thread_data); | 721 free((void *)data->scaler_thread_data); |
719 } | 722 } |
720 if (data->scaler_parms) { | 723 if (data->scaler_parms) { |
721 free((void *)data->scaler_parms); | 724 free((void *)data->scaler_parms); |