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);