Mercurial > sdl-ios-xcode
comparison src/video/nds/SDL_ndsrender.c @ 2687:5166b19b6808 gsoc2008_nds
renderer: Added a separate copy of texture pixels in system RAM, copied into VRAM during RenderPresent. Still trying to fix rendering.
author | Darren Alton <dalton@stevens.edu> |
---|---|
date | Thu, 14 Aug 2008 04:33:55 +0000 |
parents | 2190b873ff00 |
children | 71c56e900f8b |
comparison
equal
deleted
inserted
replaced
2686:e9f27fe4f2a1 | 2687:5166b19b6808 |
---|---|
107 { | 107 { |
108 enum { NDSTX_BG, NDSTX_SPR } type; | 108 enum { NDSTX_BG, NDSTX_SPR } type; |
109 int hw_index; | 109 int hw_index; |
110 struct { int hdx, hdy, vdx, vdy, pitch, bpp; } dim; | 110 struct { int hdx, hdy, vdx, vdy, pitch, bpp; } dim; |
111 u16 *vram; | 111 u16 *vram; |
112 u16 *system_ram_copy; | |
113 int size; | |
112 } NDS_TextureData; | 114 } NDS_TextureData; |
113 | 115 |
114 | 116 |
115 /* this is mainly hackish testing/debugging stuff to get cleaned up soon | 117 /* this is mainly hackish testing/debugging stuff to get cleaned up soon |
116 anything named sdlds_blah shouldn't make it into the stable version | 118 anything named sdlds_blah shouldn't make it into the stable version |
267 txdat->dim.vdx = 0; txdat->dim.vdy = 0x100; | 269 txdat->dim.vdx = 0; txdat->dim.vdy = 0x100; |
268 txdat->dim.pitch = 256 * (bpp/8); | 270 txdat->dim.pitch = 256 * (bpp/8); |
269 txdat->dim.bpp = bpp; | 271 txdat->dim.bpp = bpp; |
270 txdat->vram = (u16*)(data->sub ? | 272 txdat->vram = (u16*)(data->sub ? |
271 BG_BMP_RAM_SUB(whichbg) : BG_BMP_RAM(whichbg)); | 273 BG_BMP_RAM_SUB(whichbg) : BG_BMP_RAM(whichbg)); |
272 for(i = 0; i < 60; ++i) swiWaitForVBlank(); | 274 txdat->size = txdat->dim.pitch * texture->h; |
275 txdat->system_ram_copy = SDL_malloc(txdat->size); | |
273 } else { | 276 } else { |
274 SDL_SetError("Out of NDS backgrounds."); | 277 SDL_SetError("Out of NDS backgrounds."); |
275 printf("ran out.\n"); | 278 printf("ran out.\n"); |
276 } | 279 } |
277 } else { | 280 } else { |
318 int row; | 321 int row; |
319 size_t length; | 322 size_t length; |
320 /* IMPORTANT! copy the new pixels into the sprite or bg. */ | 323 /* IMPORTANT! copy the new pixels into the sprite or bg. */ |
321 src = (Uint8 *) pixels; | 324 src = (Uint8 *) pixels; |
322 dst = | 325 dst = |
323 (Uint8 *) txdat->vram + rect->y * txdat->dim.pitch + | 326 (Uint8 *) txdat->system_ram_copy + rect->y * txdat->dim.pitch + |
324 rect->x * (txdat->dim.bpp/8); | 327 rect->x * (txdat->dim.bpp/8); |
325 length = rect->w * (txdat->dim.bpp/8); | 328 length = rect->w * (txdat->dim.bpp/8); |
326 for (row = 0; row < rect->h; ++row) { | 329 for (row = 0; row < rect->h; ++row) { |
327 SDL_memcpy(dst, src, length); | 330 SDL_memcpy(dst, src, length); |
328 src += pitch; | 331 src += pitch; |
348 if (markDirty) { | 351 if (markDirty) { |
349 printf("wanted to mark dirty\n"); | 352 printf("wanted to mark dirty\n"); |
350 /*SDL_AddDirtyRect(&txdat->dirty, rect);*/ | 353 /*SDL_AddDirtyRect(&txdat->dirty, rect);*/ |
351 } | 354 } |
352 | 355 |
353 *pixels = (void *) ((u8 *)txdat->vram + rect->y * txdat->dim.pitch | 356 *pixels = (void *) ((u8 *)txdat->system_ram_copy + rect->y |
354 + rect->x * (txdat->dim.bpp/8)); | 357 * txdat->dim.pitch + rect->x * (txdat->dim.bpp/8)); |
355 *pitch = txdat->dim.pitch; | 358 *pitch = txdat->dim.pitch; |
356 printf(" pixels = %08x\n", (u32)*pixels); | 359 printf(" pixels = %08x\n", (u32)*pixels); |
357 printf("-NDS_LockTexture\n"); | 360 printf("-NDS_LockTexture\n"); |
358 return 0; | 361 return 0; |
359 } | 362 } |
401 NDS_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, | 404 NDS_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, |
402 const SDL_Rect * srcrect, const SDL_Rect * dstrect) | 405 const SDL_Rect * srcrect, const SDL_Rect * dstrect) |
403 { | 406 { |
404 NDS_RenderData *data = (NDS_RenderData *) renderer->driverdata; | 407 NDS_RenderData *data = (NDS_RenderData *) renderer->driverdata; |
405 NDS_TextureData *txdat = (NDS_TextureData *) texture->driverdata; | 408 NDS_TextureData *txdat = (NDS_TextureData *) texture->driverdata; |
406 // SDL_Window *window = SDL_GetWindowFromID(renderer->window); | 409 SDL_Window *window = SDL_GetWindowFromID(renderer->window); |
407 // SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window); | 410 SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window); |
408 int i; | 411 int i; |
409 int bpp = SDL_BYTESPERPIXEL(texture->format); | 412 int bpp = SDL_BYTESPERPIXEL(texture->format); |
410 int pitch = txdat->dim.pitch; | 413 int pitch = txdat->dim.pitch; |
411 printf("+NDS_RenderCopy\n"); | 414 printf("+NDS_RenderCopy\n"); |
412 if(txdat->type == NDSTX_BG) { | 415 if(txdat->type == NDSTX_BG) { |
429 | 432 |
430 static void | 433 static void |
431 NDS_RenderPresent(SDL_Renderer * renderer) | 434 NDS_RenderPresent(SDL_Renderer * renderer) |
432 { | 435 { |
433 NDS_RenderData *data = (NDS_RenderData *) renderer->driverdata; | 436 NDS_RenderData *data = (NDS_RenderData *) renderer->driverdata; |
434 /* Send the data to the display TODO */ | 437 SDL_Window *window = SDL_GetWindowFromID(renderer->window); |
435 /* shouldn't it already be there at this point? | 438 SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window); |
439 int i; | |
440 /* Send the data to the display TODO : | |
441 shouldn't it already be there at this point? | |
436 I guess set the BG's and sprites "visible" flags here. */ | 442 I guess set the BG's and sprites "visible" flags here. */ |
437 printf("+NDS_RenderPresent\n"); | 443 printf("+NDS_RenderPresent\n"); |
444 | |
445 for(i = 0; i < 64; ++i) { | |
446 SDL_Texture * tx = display->textures[i]; | |
447 NDS_TextureData * txdat = (NDS_TextureData*)tx->driverdata; | |
448 SDL_memcpy(txdat->vram, txdat->system_ram_copy, txdat->size); | |
449 } | |
438 | 450 |
439 /* vsync for NDS */ | 451 /* vsync for NDS */ |
440 if (renderer->info.flags & SDL_RENDERER_PRESENTVSYNC) { | 452 if (renderer->info.flags & SDL_RENDERER_PRESENTVSYNC) { |
441 swiWaitForVBlank(); | 453 swiWaitForVBlank(); |
442 } | 454 } |
451 SDL_SetError("Unsupported texture format"); | 463 SDL_SetError("Unsupported texture format"); |
452 } else { | 464 } else { |
453 /* free anything else allocated for texture */ | 465 /* free anything else allocated for texture */ |
454 NDS_TextureData *txdat = texture->driverdata; | 466 NDS_TextureData *txdat = texture->driverdata; |
455 /*SDL_FreeDirtyRects(&txdat->dirty);*/ | 467 /*SDL_FreeDirtyRects(&txdat->dirty);*/ |
468 SDL_free(txdat->system_ram_copy); | |
456 SDL_free(txdat); | 469 SDL_free(txdat); |
457 } | 470 } |
458 printf("-NDS_DestroyTexture\n"); | 471 printf("-NDS_DestroyTexture\n"); |
459 } | 472 } |
460 | 473 |