2 Simple DirectMedia Layer
3 Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
21 #include "SDL_config.h"
23 #if SDL_VIDEO_RENDER_PSP
25 #include "SDL_hints.h"
26 #include "../SDL_sysrender.h"
28 #include <pspkernel.h>
29 #include <pspdisplay.h>
43 /* PSP renderer implementation, based on the PGE */
46 extern int SDL_RecreateWindow(SDL_Window * window, Uint32 flags);
49 static SDL_Renderer *PSP_CreateRenderer(SDL_Window * window, Uint32 flags);
50 static void PSP_WindowEvent(SDL_Renderer * renderer,
51 const SDL_WindowEvent *event);
52 static int PSP_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);
53 static int PSP_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
54 const SDL_Rect * rect, const void *pixels,
56 static int PSP_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
57 const SDL_Rect * rect, void **pixels, int *pitch);
58 static void PSP_UnlockTexture(SDL_Renderer * renderer,
59 SDL_Texture * texture);
60 static int PSP_SetRenderTarget(SDL_Renderer * renderer,
61 SDL_Texture * texture);
62 static int PSP_UpdateViewport(SDL_Renderer * renderer);
63 static int PSP_RenderClear(SDL_Renderer * renderer);
64 static int PSP_RenderDrawPoints(SDL_Renderer * renderer,
65 const SDL_FPoint * points, int count);
66 static int PSP_RenderDrawLines(SDL_Renderer * renderer,
67 const SDL_FPoint * points, int count);
68 static int PSP_RenderFillRects(SDL_Renderer * renderer,
69 const SDL_FRect * rects, int count);
70 static int PSP_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
71 const SDL_Rect * srcrect,
72 const SDL_FRect * dstrect);
73 static int PSP_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,
74 Uint32 pixel_format, void * pixels, int pitch);
75 static int PSP_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,
76 const SDL_Rect * srcrect, const SDL_FRect * dstrect,
77 const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip);
78 static void PSP_RenderPresent(SDL_Renderer * renderer);
79 static void PSP_DestroyTexture(SDL_Renderer * renderer,
80 SDL_Texture * texture);
81 static void PSP_DestroyRenderer(SDL_Renderer * renderer);
84 SDL_RenderDriver PSP_RenderDriver = {
88 (SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE),
90 {SDL_PIXELFORMAT_ABGR8888},
95 SDL_RenderDriver PSP_RenderDriver = {
96 .CreateRenderer = PSP_CreateRenderer,
99 .flags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE,
100 .num_texture_formats = 4,
101 .texture_formats = { [0] = SDL_PIXELFORMAT_BGR565,
102 [1] = SDL_PIXELFORMAT_ABGR1555,
103 [2] = SDL_PIXELFORMAT_ABGR4444,
104 [3] = SDL_PIXELFORMAT_ABGR8888,
106 .max_texture_width = 512,
107 .max_texture_height = 512,
111 #define PSP_SCREEN_WIDTH 480
112 #define PSP_SCREEN_HEIGHT 272
114 #define PSP_FRAME_BUFFER_WIDTH 512
115 #define PSP_FRAME_BUFFER_SIZE (PSP_FRAME_BUFFER_WIDTH*PSP_SCREEN_HEIGHT)
117 static unsigned int __attribute__((aligned(16))) DisplayList[262144];
120 #define COL5650(r,g,b,a) ((r>>3) | ((g>>2)<<5) | ((b>>3)<<11))
121 #define COL5551(r,g,b,a) ((r>>3) | ((g>>3)<<5) | ((b>>3)<<10) | (a>0?0x7000:0))
122 #define COL4444(r,g,b,a) ((r>>4) | ((g>>4)<<4) | ((b>>4)<<8) | ((a>>4)<<12))
123 #define COL8888(r,g,b,a) ((r) | ((g)<<8) | ((b)<<16) | ((a)<<24))
130 SDL_bool initialized ;
131 SDL_bool displayListAvail ;
136 unsigned int currentColor;
137 int currentBlendMode;
144 void *data; /**< Image data. */
145 unsigned int size; /**< Size of data in bytes. */
146 unsigned int width; /**< Image width. */
147 unsigned int height; /**< Image height. */
148 unsigned int textureWidth; /**< Texture width (power of two). */
149 unsigned int textureHeight; /**< Texture height (power of two). */
150 unsigned int bits; /**< Image bits per pixel. */
151 unsigned int format; /**< Image format - one of ::pgePixelFormat. */
153 SDL_bool swizzled; /**< Is image swizzled. */
171 // Return next power of 2
173 TextureNextPow2(unsigned int w)
188 GetScaleQuality(void)
190 const char *hint = SDL_GetHint(SDL_HINT_RENDER_SCALE_QUALITY);
192 if (!hint || *hint == '0' || SDL_strcasecmp(hint, "nearest") == 0) {
193 return GU_NEAREST; // GU_NEAREST good for tile-map
195 return GU_LINEAR; // GU_LINEAR good for scaling
200 PixelFormatToPSPFMT(Uint32 format)
203 case SDL_PIXELFORMAT_BGR565:
205 case SDL_PIXELFORMAT_ABGR1555:
207 case SDL_PIXELFORMAT_ABGR4444:
209 case SDL_PIXELFORMAT_ABGR8888:
217 StartDrawing(SDL_Renderer * renderer)
219 PSP_RenderData *data = (PSP_RenderData *) renderer->driverdata;
220 if(data->displayListAvail)
223 sceGuStart(GU_DIRECT, DisplayList);
224 data->displayListAvail = SDL_TRUE;
229 TextureSwizzle(PSP_TextureData *psp_texture)
231 if(psp_texture->swizzled)
234 int bytewidth = psp_texture->textureWidth*(psp_texture->bits>>3);
235 int height = psp_texture->size / bytewidth;
237 int rowblocks = (bytewidth>>4);
238 int rowblocksadd = (rowblocks-1)<<7;
239 unsigned int blockaddress = 0;
240 unsigned int *src = (unsigned int*) psp_texture->data;
242 unsigned char *data = NULL;
243 data = malloc(psp_texture->size);
247 for(j = 0; j < height; j++, blockaddress += 16)
251 block = (unsigned int*)&data[blockaddress];
255 for(i = 0; i < rowblocks; i++)
265 blockaddress += rowblocksadd;
268 free(psp_texture->data);
269 psp_texture->data = data;
270 psp_texture->swizzled = SDL_TRUE;
274 int TextureUnswizzle(PSP_TextureData *psp_texture)
276 if(!psp_texture->swizzled)
281 int bytewidth = psp_texture->textureWidth*(psp_texture->bits>>3);
282 int height = psp_texture->size / bytewidth;
284 int widthblocks = bytewidth/16;
285 int heightblocks = height/8;
287 int dstpitch = (bytewidth - 16)/4;
288 int dstrow = bytewidth * 8;
290 unsigned int *src = (unsigned int*) psp_texture->data;
292 unsigned char *data = NULL;
294 data = malloc(psp_texture->size);
299 sceKernelDcacheWritebackAll();
303 unsigned char *ydst = (unsigned char *)data;
305 for(blocky = 0; blocky < heightblocks; ++blocky)
307 unsigned char *xdst = ydst;
309 for(blockx = 0; blockx < widthblocks; ++blockx)
313 block = (unsigned int*)xdst;
315 for(j = 0; j < 8; ++j)
317 *(block++) = *(src++);
318 *(block++) = *(src++);
319 *(block++) = *(src++);
320 *(block++) = *(src++);
330 free(psp_texture->data);
332 psp_texture->data = data;
334 psp_texture->swizzled = SDL_FALSE;
340 PSP_CreateRenderer(SDL_Window * window, Uint32 flags)
343 SDL_Renderer *renderer;
344 PSP_RenderData *data;
346 renderer = (SDL_Renderer *) SDL_calloc(1, sizeof(*renderer));
352 data = (PSP_RenderData *) SDL_calloc(1, sizeof(*data));
354 PSP_DestroyRenderer(renderer);
360 renderer->WindowEvent = PSP_WindowEvent;
361 renderer->CreateTexture = PSP_CreateTexture;
362 renderer->UpdateTexture = PSP_UpdateTexture;
363 renderer->LockTexture = PSP_LockTexture;
364 renderer->UnlockTexture = PSP_UnlockTexture;
365 renderer->SetRenderTarget = PSP_SetRenderTarget;
366 renderer->UpdateViewport = PSP_UpdateViewport;
367 renderer->RenderClear = PSP_RenderClear;
368 renderer->RenderDrawPoints = PSP_RenderDrawPoints;
369 renderer->RenderDrawLines = PSP_RenderDrawLines;
370 renderer->RenderFillRects = PSP_RenderFillRects;
371 renderer->RenderCopy = PSP_RenderCopy;
372 renderer->RenderReadPixels = PSP_RenderReadPixels;
373 renderer->RenderCopyEx = PSP_RenderCopyEx;
374 renderer->RenderPresent = PSP_RenderPresent;
375 renderer->DestroyTexture = PSP_DestroyTexture;
376 renderer->DestroyRenderer = PSP_DestroyRenderer;
377 renderer->info = PSP_RenderDriver.info;
378 renderer->info.flags = SDL_RENDERER_ACCELERATED;
379 renderer->driverdata = data;
380 renderer->window = window;
382 if (data->initialized != SDL_FALSE)
384 data->initialized = SDL_TRUE;
386 if (flags & SDL_RENDERER_PRESENTVSYNC) {
387 data->vsync = SDL_TRUE;
389 data->vsync = SDL_FALSE;
392 pixelformat=PixelFormatToPSPFMT(SDL_GetWindowPixelFormat(window));
398 data->frontbuffer = (unsigned int *)(PSP_FRAME_BUFFER_SIZE<<1);
399 data->backbuffer = (unsigned int *)(0);
401 data->psm = pixelformat;
404 data->frontbuffer = (unsigned int *)(PSP_FRAME_BUFFER_SIZE<<2);
405 data->backbuffer = (unsigned int *)(0);
407 data->psm = GU_PSM_8888;
413 sceGuStart(GU_DIRECT, DisplayList);
414 sceGuDrawBuffer(data->psm, data->frontbuffer, PSP_FRAME_BUFFER_WIDTH);
415 sceGuDispBuffer(PSP_SCREEN_WIDTH, PSP_SCREEN_HEIGHT, data->backbuffer, PSP_FRAME_BUFFER_WIDTH);
418 sceGuOffset(2048 - (PSP_SCREEN_WIDTH>>1), 2048 - (PSP_SCREEN_HEIGHT>>1));
419 sceGuViewport(2048, 2048, PSP_SCREEN_WIDTH, PSP_SCREEN_HEIGHT);
421 data->frontbuffer = vabsptr(data->frontbuffer);
422 data->backbuffer = vabsptr(data->backbuffer);
425 sceGuScissor(0, 0, PSP_SCREEN_WIDTH, PSP_SCREEN_HEIGHT);
426 sceGuEnable(GU_SCISSOR_TEST);
429 sceGuFrontFace(GU_CCW);
430 sceGuEnable(GU_CULL_FACE);
433 sceGuEnable(GU_TEXTURE_2D);
434 sceGuShadeModel(GU_SMOOTH);
435 sceGuTexWrap(GU_REPEAT, GU_REPEAT);
438 sceGuEnable(GU_BLEND);
439 sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_ONE_MINUS_SRC_ALPHA, 0, 0);
441 sceGuTexFilter(GU_LINEAR,GU_LINEAR);
445 sceDisplayWaitVblankStartCB();
446 sceGuDisplay(GU_TRUE);
452 PSP_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)
459 PSP_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
461 // PSP_RenderData *renderdata = (PSP_RenderData *) renderer->driverdata;
462 PSP_TextureData* psp_texture = (PSP_TextureData*) SDL_calloc(1, sizeof(*psp_texture));;
467 psp_texture->swizzled = SDL_FALSE;
468 psp_texture->width = texture->w;
469 psp_texture->height = texture->h;
470 psp_texture->textureHeight = TextureNextPow2(texture->h);
471 psp_texture->textureWidth = TextureNextPow2(texture->w);
472 psp_texture->format = PixelFormatToPSPFMT(texture->format);
474 switch(psp_texture->format)
479 psp_texture->bits = 16;
483 psp_texture->bits = 32;
490 psp_texture->pitch = psp_texture->textureWidth * SDL_BYTESPERPIXEL(texture->format);
491 psp_texture->size = psp_texture->textureHeight*psp_texture->pitch;
492 psp_texture->data = SDL_calloc(1, psp_texture->size);
494 if(!psp_texture->data)
497 SDL_free(psp_texture);
500 texture->driverdata = psp_texture;
507 TextureActivate(SDL_Texture * texture)
509 PSP_TextureData *psp_texture = (PSP_TextureData *) texture->driverdata;
510 int scaleMode = GetScaleQuality();
512 // Swizzling is useless with small textures.
513 if (texture->w >= 16 || texture->h >= 16)
515 TextureSwizzle(psp_texture);
518 sceGuEnable(GU_TEXTURE_2D);
519 sceGuTexWrap(GU_REPEAT, GU_REPEAT);
520 sceGuTexMode(psp_texture->format, 0, 0, psp_texture->swizzled);
521 sceGuTexFilter(scaleMode, scaleMode); // GU_NEAREST good for tile-map
522 // GU_LINEAR good for scaling
523 sceGuTexImage(0, psp_texture->textureWidth, psp_texture->textureHeight, psp_texture->textureWidth, psp_texture->data);
524 sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);
529 PSP_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
530 const SDL_Rect * rect, const void *pixels, int pitch)
532 // PSP_TextureData *psp_texture = (PSP_TextureData *) texture->driverdata;
535 int row, length,dpitch;
538 PSP_LockTexture(renderer, texture,rect,(void **)&dst, &dpitch);
539 length = rect->w * SDL_BYTESPERPIXEL(texture->format);
540 if (length == pitch && length == dpitch) {
541 SDL_memcpy(dst, src, length*rect->h);
543 for (row = 0; row < rect->h; ++row) {
544 SDL_memcpy(dst, src, length);
550 sceKernelDcacheWritebackAll();
555 PSP_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
556 const SDL_Rect * rect, void **pixels, int *pitch)
558 PSP_TextureData *psp_texture = (PSP_TextureData *) texture->driverdata;
561 (void *) ((Uint8 *) psp_texture->data + rect->y * psp_texture->pitch +
562 rect->x * SDL_BYTESPERPIXEL(texture->format));
563 *pitch = psp_texture->pitch;
568 PSP_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture)
570 PSP_TextureData *psp_texture = (PSP_TextureData *) texture->driverdata;
573 /* We do whole texture updates, at least for now */
578 PSP_UpdateTexture(renderer, texture, &rect, psp_texture->data, psp_texture->pitch);
582 PSP_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture)
589 PSP_UpdateViewport(SDL_Renderer * renderer)
597 PSP_SetBlendMode(SDL_Renderer * renderer, int blendMode)
599 PSP_RenderData *data = (PSP_RenderData *) renderer->driverdata;
600 if (blendMode != data-> currentBlendMode) {
602 case SDL_BLENDMODE_NONE:
603 sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);
604 sceGuDisable(GU_BLEND);
606 case SDL_BLENDMODE_BLEND:
607 sceGuTexFunc(GU_TFX_MODULATE , GU_TCC_RGBA);
608 sceGuEnable(GU_BLEND);
609 sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_ONE_MINUS_SRC_ALPHA, 0, 0 );
611 case SDL_BLENDMODE_ADD:
612 sceGuTexFunc(GU_TFX_MODULATE , GU_TCC_RGBA);
613 sceGuEnable(GU_BLEND);
614 sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_FIX, 0, 0x00FFFFFF );
616 case SDL_BLENDMODE_MOD:
617 sceGuTexFunc(GU_TFX_MODULATE , GU_TCC_RGBA);
618 sceGuEnable(GU_BLEND);
619 sceGuBlendFunc( GU_ADD, GU_FIX, GU_SRC_COLOR, 0, 0);
622 data->currentBlendMode = blendMode;
629 PSP_RenderClear(SDL_Renderer * renderer)
632 StartDrawing(renderer);
633 int color = renderer->a << 24 | renderer->b << 16 | renderer->g << 8 | renderer->r;
634 sceGuClearColor(color);
636 sceGuClear(GU_COLOR_BUFFER_BIT|GU_DEPTH_BUFFER_BIT|GU_FAST_CLEAR_BIT);
642 PSP_RenderDrawPoints(SDL_Renderer * renderer, const SDL_FPoint * points,
645 int color = renderer->a << 24 | renderer->b << 16 | renderer->g << 8 | renderer->r;
647 StartDrawing(renderer);
648 VertV* vertices = (VertV*)sceGuGetMemory(count*sizeof(VertV));
650 for (i = 0; i < count; ++i) {
651 vertices[i].x = points[i].x;
652 vertices[i].y = points[i].y;
653 vertices[i].z = 0.0f;
655 sceGuDisable(GU_TEXTURE_2D);
657 sceGuShadeModel(GU_FLAT);
658 sceGuDrawArray(GU_POINTS, GU_VERTEX_32BITF|GU_TRANSFORM_2D, count, 0, vertices);
659 sceGuShadeModel(GU_SMOOTH);
660 sceGuEnable(GU_TEXTURE_2D);
666 PSP_RenderDrawLines(SDL_Renderer * renderer, const SDL_FPoint * points,
669 int color = renderer->a << 24 | renderer->b << 16 | renderer->g << 8 | renderer->r;
671 StartDrawing(renderer);
672 VertV* vertices = (VertV*)sceGuGetMemory(count*sizeof(VertV));
674 for (i = 0; i < count; ++i) {
675 vertices[i].x = points[i].x;
676 vertices[i].y = points[i].y;
677 vertices[i].z = 0.0f;
680 sceGuDisable(GU_TEXTURE_2D);
682 sceGuShadeModel(GU_FLAT);
683 sceGuDrawArray(GU_LINE_STRIP, GU_VERTEX_32BITF|GU_TRANSFORM_2D, count, 0, vertices);
684 sceGuShadeModel(GU_SMOOTH);
685 sceGuEnable(GU_TEXTURE_2D);
691 PSP_RenderFillRects(SDL_Renderer * renderer, const SDL_FRect * rects,
694 int color = renderer->a << 24 | renderer->b << 16 | renderer->g << 8 | renderer->r;
696 StartDrawing(renderer);
698 for (i = 0; i < count; ++i) {
699 const SDL_FRect *rect = &rects[i];
700 VertV* vertices = (VertV*)sceGuGetMemory((sizeof(VertV)<<1));
701 vertices[0].x = rect->x;
702 vertices[0].y = rect->y;
703 vertices[0].z = 0.0f;
705 vertices[1].x = rect->x + rect->w;
706 vertices[1].y = rect->y + rect->h;
707 vertices[1].z = 0.0f;
709 sceGuDisable(GU_TEXTURE_2D);
711 sceGuShadeModel(GU_FLAT);
712 sceGuDrawArray(GU_SPRITES, GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertices);
713 sceGuShadeModel(GU_SMOOTH);
714 sceGuEnable(GU_TEXTURE_2D);
721 #define PI 3.14159265358979f
723 #define radToDeg(x) ((x)*180.f/PI)
724 #define degToRad(x) ((x)*PI/180.f)
726 float MathAbs(float x)
732 "vabs.s S000, S000\n"
734 : "=r"(result) : "r"(x));
739 void MathSincos(float r, float *s, float *c)
743 "vcst.s S003, VFPU_2_PI\n"
744 "vmul.s S002, S002, S003\n"
745 "vrot.p C000, S002, [s, c]\n"
748 : "=r"(*s), "=r"(*c): "r"(r));
751 void Swap(float *a, float *b)
759 PSP_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
760 const SDL_Rect * srcrect, const SDL_FRect * dstrect)
762 float x, y, width, height;
763 float u0, v0, u1, v1;
773 u1 = srcrect->x + srcrect->w;
774 v1 = srcrect->y + srcrect->h;
778 StartDrawing(renderer);
779 TextureActivate(texture);
780 PSP_SetBlendMode(renderer, renderer->blendMode);
784 sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA);
785 sceGuColor(GU_RGBA(255, 255, 255, alpha));
787 sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);
788 sceGuColor(0xFFFFFFFF);
791 if((MathAbs(u1) - MathAbs(u0)) < 64.0f)
793 VertTV* vertices = (VertTV*)sceGuGetMemory((sizeof(VertTV))<<1);
803 vertices[1].x = x + width;
804 vertices[1].y = y + height;
807 sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertices);
814 float endX = x + width;
816 float ustep = (u1 - u0)/width * slice;
821 for(start = 0, end = width; start < end; start += slice)
823 VertTV* vertices = (VertTV*)sceGuGetMemory((sizeof(VertTV))<<1);
825 float polyWidth = ((curX + slice) > endX) ? (endX - curX) : slice;
826 float sourceWidth = ((curU + ustep) > u1) ? (u1 - curU) : ustep;
828 vertices[0].u = curU;
830 vertices[0].x = curX;
837 vertices[1].u = curU;
839 vertices[1].x = curX;
840 vertices[1].y = (y + height);
843 sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertices);
848 sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);
853 PSP_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,
854 Uint32 pixel_format, void * pixels, int pitch)
862 PSP_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,
863 const SDL_Rect * srcrect, const SDL_FRect * dstrect,
864 const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip)
866 float x, y, width, height;
867 float u0, v0, u1, v1;
869 float centerx, centery;
878 u1 = srcrect->x + srcrect->w;
879 v1 = srcrect->y + srcrect->h;
886 StartDrawing(renderer);
887 TextureActivate(texture);
888 PSP_SetBlendMode(renderer, renderer->blendMode);
892 sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA);
893 sceGuColor(GU_RGBA(255, 255, 255, alpha));
895 sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);
896 sceGuColor(0xFFFFFFFF);
899 // x += width * 0.5f;
900 // y += height * 0.5f;
906 MathSincos(degToRad(angle), &s, &c);
919 VertTV* vertices = (VertTV*)sceGuGetMemory(sizeof(VertTV)<<2);
923 vertices[0].x = x - cw + sh;
924 vertices[0].y = y - sw - ch;
929 vertices[1].x = x - cw - sh;
930 vertices[1].y = y - sw + ch;
935 vertices[2].x = x + cw - sh;
936 vertices[2].y = y + sw + ch;
941 vertices[3].x = x + cw + sh;
942 vertices[3].y = y + sw - ch;
945 if (flip & SDL_FLIP_HORIZONTAL) {
946 Swap(&vertices[0].v, &vertices[2].v);
947 Swap(&vertices[1].v, &vertices[3].v);
949 if (flip & SDL_FLIP_VERTICAL) {
950 Swap(&vertices[0].u, &vertices[2].u);
951 Swap(&vertices[1].u, &vertices[3].u);
954 sceGuDrawArray(GU_TRIANGLE_FAN, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 4, 0, vertices);
957 sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);
962 PSP_RenderPresent(SDL_Renderer * renderer)
964 PSP_RenderData *data = (PSP_RenderData *) renderer->driverdata;
965 if(!data->displayListAvail)
968 data->displayListAvail = SDL_FALSE;
973 sceDisplayWaitVblankStart();
975 data->backbuffer = data->frontbuffer;
976 data->frontbuffer = vabsptr(sceGuSwapBuffers());
981 PSP_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture)
983 PSP_RenderData *renderdata = (PSP_RenderData *) renderer->driverdata;
984 PSP_TextureData *psp_texture = (PSP_TextureData *) texture->driverdata;
992 if(psp_texture->data != 0)
994 free(psp_texture->data);
997 texture->driverdata = NULL;
1001 PSP_DestroyRenderer(SDL_Renderer * renderer)
1003 PSP_RenderData *data = (PSP_RenderData *) renderer->driverdata;
1005 if (!data->initialized)
1008 StartDrawing(renderer);
1011 // vfree(data->backbuffer);
1012 // vfree(data->frontbuffer);
1014 data->initialized = SDL_FALSE;
1015 data->displayListAvail = SDL_FALSE;
1021 #endif /* SDL_VIDEO_RENDER_PSP */
1023 /* vi: set ts=4 sw=4 expandtab: */