PSP: Fixed returning success for unsupported SDL_SetTextureColorMod().
Partially fixes Bugzilla #3298.
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2016 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_internal.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_SetTextureColorMod(SDL_Renderer * renderer,
54 SDL_Texture * texture);
55 static int PSP_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
56 const SDL_Rect * rect, const void *pixels,
58 static int PSP_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
59 const SDL_Rect * rect, void **pixels, int *pitch);
60 static void PSP_UnlockTexture(SDL_Renderer * renderer,
61 SDL_Texture * texture);
62 static int PSP_SetRenderTarget(SDL_Renderer * renderer,
63 SDL_Texture * texture);
64 static int PSP_UpdateViewport(SDL_Renderer * renderer);
65 static int PSP_RenderClear(SDL_Renderer * renderer);
66 static int PSP_RenderDrawPoints(SDL_Renderer * renderer,
67 const SDL_FPoint * points, int count);
68 static int PSP_RenderDrawLines(SDL_Renderer * renderer,
69 const SDL_FPoint * points, int count);
70 static int PSP_RenderFillRects(SDL_Renderer * renderer,
71 const SDL_FRect * rects, int count);
72 static int PSP_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
73 const SDL_Rect * srcrect,
74 const SDL_FRect * dstrect);
75 static int PSP_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,
76 Uint32 pixel_format, void * pixels, int pitch);
77 static int PSP_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,
78 const SDL_Rect * srcrect, const SDL_FRect * dstrect,
79 const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip);
80 static void PSP_RenderPresent(SDL_Renderer * renderer);
81 static void PSP_DestroyTexture(SDL_Renderer * renderer,
82 SDL_Texture * texture);
83 static void PSP_DestroyRenderer(SDL_Renderer * renderer);
86 SDL_RenderDriver PSP_RenderDriver = {
90 (SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE),
92 {SDL_PIXELFORMAT_ABGR8888},
97 SDL_RenderDriver PSP_RenderDriver = {
98 .CreateRenderer = PSP_CreateRenderer,
101 .flags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE,
102 .num_texture_formats = 4,
103 .texture_formats = { [0] = SDL_PIXELFORMAT_BGR565,
104 [1] = SDL_PIXELFORMAT_ABGR1555,
105 [2] = SDL_PIXELFORMAT_ABGR4444,
106 [3] = SDL_PIXELFORMAT_ABGR8888,
108 .max_texture_width = 512,
109 .max_texture_height = 512,
113 #define PSP_SCREEN_WIDTH 480
114 #define PSP_SCREEN_HEIGHT 272
116 #define PSP_FRAME_BUFFER_WIDTH 512
117 #define PSP_FRAME_BUFFER_SIZE (PSP_FRAME_BUFFER_WIDTH*PSP_SCREEN_HEIGHT)
119 static unsigned int __attribute__((aligned(16))) DisplayList[262144];
122 #define COL5650(r,g,b,a) ((r>>3) | ((g>>2)<<5) | ((b>>3)<<11))
123 #define COL5551(r,g,b,a) ((r>>3) | ((g>>3)<<5) | ((b>>3)<<10) | (a>0?0x7000:0))
124 #define COL4444(r,g,b,a) ((r>>4) | ((g>>4)<<4) | ((b>>4)<<8) | ((a>>4)<<12))
125 #define COL8888(r,g,b,a) ((r) | ((g)<<8) | ((b)<<16) | ((a)<<24))
132 SDL_bool initialized ;
133 SDL_bool displayListAvail ;
138 unsigned int currentColor;
139 int currentBlendMode;
146 void *data; /**< Image data. */
147 unsigned int size; /**< Size of data in bytes. */
148 unsigned int width; /**< Image width. */
149 unsigned int height; /**< Image height. */
150 unsigned int textureWidth; /**< Texture width (power of two). */
151 unsigned int textureHeight; /**< Texture height (power of two). */
152 unsigned int bits; /**< Image bits per pixel. */
153 unsigned int format; /**< Image format - one of ::pgePixelFormat. */
155 SDL_bool swizzled; /**< Is image swizzled. */
173 /* Return next power of 2 */
175 TextureNextPow2(unsigned int w)
190 GetScaleQuality(void)
192 const char *hint = SDL_GetHint(SDL_HINT_RENDER_SCALE_QUALITY);
194 if (!hint || *hint == '0' || SDL_strcasecmp(hint, "nearest") == 0) {
195 return GU_NEAREST; /* GU_NEAREST good for tile-map */
197 return GU_LINEAR; /* GU_LINEAR good for scaling */
202 PixelFormatToPSPFMT(Uint32 format)
205 case SDL_PIXELFORMAT_BGR565:
207 case SDL_PIXELFORMAT_ABGR1555:
209 case SDL_PIXELFORMAT_ABGR4444:
211 case SDL_PIXELFORMAT_ABGR8888:
219 StartDrawing(SDL_Renderer * renderer)
221 PSP_RenderData *data = (PSP_RenderData *) renderer->driverdata;
222 if(data->displayListAvail)
225 sceGuStart(GU_DIRECT, DisplayList);
226 data->displayListAvail = SDL_TRUE;
231 TextureSwizzle(PSP_TextureData *psp_texture)
233 if(psp_texture->swizzled)
236 int bytewidth = psp_texture->textureWidth*(psp_texture->bits>>3);
237 int height = psp_texture->size / bytewidth;
239 int rowblocks = (bytewidth>>4);
240 int rowblocksadd = (rowblocks-1)<<7;
241 unsigned int blockaddress = 0;
242 unsigned int *src = (unsigned int*) psp_texture->data;
244 unsigned char *data = NULL;
245 data = malloc(psp_texture->size);
249 for(j = 0; j < height; j++, blockaddress += 16)
253 block = (unsigned int*)&data[blockaddress];
257 for(i = 0; i < rowblocks; i++)
267 blockaddress += rowblocksadd;
270 free(psp_texture->data);
271 psp_texture->data = data;
272 psp_texture->swizzled = SDL_TRUE;
276 int TextureUnswizzle(PSP_TextureData *psp_texture)
278 if(!psp_texture->swizzled)
283 int bytewidth = psp_texture->textureWidth*(psp_texture->bits>>3);
284 int height = psp_texture->size / bytewidth;
286 int widthblocks = bytewidth/16;
287 int heightblocks = height/8;
289 int dstpitch = (bytewidth - 16)/4;
290 int dstrow = bytewidth * 8;
292 unsigned int *src = (unsigned int*) psp_texture->data;
294 unsigned char *data = NULL;
296 data = malloc(psp_texture->size);
301 sceKernelDcacheWritebackAll();
305 unsigned char *ydst = (unsigned char *)data;
307 for(blocky = 0; blocky < heightblocks; ++blocky)
309 unsigned char *xdst = ydst;
311 for(blockx = 0; blockx < widthblocks; ++blockx)
315 block = (unsigned int*)xdst;
317 for(j = 0; j < 8; ++j)
319 *(block++) = *(src++);
320 *(block++) = *(src++);
321 *(block++) = *(src++);
322 *(block++) = *(src++);
332 free(psp_texture->data);
334 psp_texture->data = data;
336 psp_texture->swizzled = SDL_FALSE;
342 PSP_CreateRenderer(SDL_Window * window, Uint32 flags)
345 SDL_Renderer *renderer;
346 PSP_RenderData *data;
348 renderer = (SDL_Renderer *) SDL_calloc(1, sizeof(*renderer));
354 data = (PSP_RenderData *) SDL_calloc(1, sizeof(*data));
356 PSP_DestroyRenderer(renderer);
362 renderer->WindowEvent = PSP_WindowEvent;
363 renderer->CreateTexture = PSP_CreateTexture;
364 renderer->SetTextureColorMod = PSP_SetTextureColorMod;
365 renderer->UpdateTexture = PSP_UpdateTexture;
366 renderer->LockTexture = PSP_LockTexture;
367 renderer->UnlockTexture = PSP_UnlockTexture;
368 renderer->SetRenderTarget = PSP_SetRenderTarget;
369 renderer->UpdateViewport = PSP_UpdateViewport;
370 renderer->RenderClear = PSP_RenderClear;
371 renderer->RenderDrawPoints = PSP_RenderDrawPoints;
372 renderer->RenderDrawLines = PSP_RenderDrawLines;
373 renderer->RenderFillRects = PSP_RenderFillRects;
374 renderer->RenderCopy = PSP_RenderCopy;
375 renderer->RenderReadPixels = PSP_RenderReadPixels;
376 renderer->RenderCopyEx = PSP_RenderCopyEx;
377 renderer->RenderPresent = PSP_RenderPresent;
378 renderer->DestroyTexture = PSP_DestroyTexture;
379 renderer->DestroyRenderer = PSP_DestroyRenderer;
380 renderer->info = PSP_RenderDriver.info;
381 renderer->info.flags = (SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE);
382 renderer->driverdata = data;
383 renderer->window = window;
385 if (data->initialized != SDL_FALSE)
387 data->initialized = SDL_TRUE;
389 if (flags & SDL_RENDERER_PRESENTVSYNC) {
390 data->vsync = SDL_TRUE;
392 data->vsync = SDL_FALSE;
395 pixelformat=PixelFormatToPSPFMT(SDL_GetWindowPixelFormat(window));
401 data->frontbuffer = (unsigned int *)(PSP_FRAME_BUFFER_SIZE<<1);
402 data->backbuffer = (unsigned int *)(0);
404 data->psm = pixelformat;
407 data->frontbuffer = (unsigned int *)(PSP_FRAME_BUFFER_SIZE<<2);
408 data->backbuffer = (unsigned int *)(0);
410 data->psm = GU_PSM_8888;
416 sceGuStart(GU_DIRECT, DisplayList);
417 sceGuDrawBuffer(data->psm, data->frontbuffer, PSP_FRAME_BUFFER_WIDTH);
418 sceGuDispBuffer(PSP_SCREEN_WIDTH, PSP_SCREEN_HEIGHT, data->backbuffer, PSP_FRAME_BUFFER_WIDTH);
421 sceGuOffset(2048 - (PSP_SCREEN_WIDTH>>1), 2048 - (PSP_SCREEN_HEIGHT>>1));
422 sceGuViewport(2048, 2048, PSP_SCREEN_WIDTH, PSP_SCREEN_HEIGHT);
424 data->frontbuffer = vabsptr(data->frontbuffer);
425 data->backbuffer = vabsptr(data->backbuffer);
428 sceGuScissor(0, 0, PSP_SCREEN_WIDTH, PSP_SCREEN_HEIGHT);
429 sceGuEnable(GU_SCISSOR_TEST);
431 /* Backface culling */
432 sceGuFrontFace(GU_CCW);
433 sceGuEnable(GU_CULL_FACE);
436 sceGuEnable(GU_TEXTURE_2D);
437 sceGuShadeModel(GU_SMOOTH);
438 sceGuTexWrap(GU_REPEAT, GU_REPEAT);
441 sceGuEnable(GU_BLEND);
442 sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_ONE_MINUS_SRC_ALPHA, 0, 0);
444 sceGuTexFilter(GU_LINEAR,GU_LINEAR);
448 sceDisplayWaitVblankStartCB();
449 sceGuDisplay(GU_TRUE);
455 PSP_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)
462 PSP_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
464 /* PSP_RenderData *renderdata = (PSP_RenderData *) renderer->driverdata; */
465 PSP_TextureData* psp_texture = (PSP_TextureData*) SDL_calloc(1, sizeof(*psp_texture));
470 psp_texture->swizzled = SDL_FALSE;
471 psp_texture->width = texture->w;
472 psp_texture->height = texture->h;
473 psp_texture->textureHeight = TextureNextPow2(texture->h);
474 psp_texture->textureWidth = TextureNextPow2(texture->w);
475 psp_texture->format = PixelFormatToPSPFMT(texture->format);
477 switch(psp_texture->format)
482 psp_texture->bits = 16;
486 psp_texture->bits = 32;
493 psp_texture->pitch = psp_texture->textureWidth * SDL_BYTESPERPIXEL(texture->format);
494 psp_texture->size = psp_texture->textureHeight*psp_texture->pitch;
495 psp_texture->data = SDL_calloc(1, psp_texture->size);
497 if(!psp_texture->data)
499 SDL_free(psp_texture);
500 return SDL_OutOfMemory();
502 texture->driverdata = psp_texture;
508 PSP_SetTextureColorMod(SDL_Renderer * renderer, SDL_Texture * texture)
510 return SDL_Unsupported();
514 TextureActivate(SDL_Texture * texture)
516 PSP_TextureData *psp_texture = (PSP_TextureData *) texture->driverdata;
517 int scaleMode = GetScaleQuality();
519 /* Swizzling is useless with small textures. */
520 if (texture->w >= 16 || texture->h >= 16)
522 TextureSwizzle(psp_texture);
525 sceGuEnable(GU_TEXTURE_2D);
526 sceGuTexWrap(GU_REPEAT, GU_REPEAT);
527 sceGuTexMode(psp_texture->format, 0, 0, psp_texture->swizzled);
528 sceGuTexFilter(scaleMode, scaleMode); /* GU_NEAREST good for tile-map */
529 /* GU_LINEAR good for scaling */
530 sceGuTexImage(0, psp_texture->textureWidth, psp_texture->textureHeight, psp_texture->textureWidth, psp_texture->data);
531 sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);
536 PSP_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
537 const SDL_Rect * rect, const void *pixels, int pitch)
539 /* PSP_TextureData *psp_texture = (PSP_TextureData *) texture->driverdata; */
542 int row, length,dpitch;
545 PSP_LockTexture(renderer, texture,rect,(void **)&dst, &dpitch);
546 length = rect->w * SDL_BYTESPERPIXEL(texture->format);
547 if (length == pitch && length == dpitch) {
548 SDL_memcpy(dst, src, length*rect->h);
550 for (row = 0; row < rect->h; ++row) {
551 SDL_memcpy(dst, src, length);
557 sceKernelDcacheWritebackAll();
562 PSP_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
563 const SDL_Rect * rect, void **pixels, int *pitch)
565 PSP_TextureData *psp_texture = (PSP_TextureData *) texture->driverdata;
568 (void *) ((Uint8 *) psp_texture->data + rect->y * psp_texture->pitch +
569 rect->x * SDL_BYTESPERPIXEL(texture->format));
570 *pitch = psp_texture->pitch;
575 PSP_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture)
577 PSP_TextureData *psp_texture = (PSP_TextureData *) texture->driverdata;
580 /* We do whole texture updates, at least for now */
585 PSP_UpdateTexture(renderer, texture, &rect, psp_texture->data, psp_texture->pitch);
589 PSP_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture)
596 PSP_UpdateViewport(SDL_Renderer * renderer)
604 PSP_SetBlendMode(SDL_Renderer * renderer, int blendMode)
606 PSP_RenderData *data = (PSP_RenderData *) renderer->driverdata;
607 if (blendMode != data-> currentBlendMode) {
609 case SDL_BLENDMODE_NONE:
610 sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);
611 sceGuDisable(GU_BLEND);
613 case SDL_BLENDMODE_BLEND:
614 sceGuTexFunc(GU_TFX_MODULATE , GU_TCC_RGBA);
615 sceGuEnable(GU_BLEND);
616 sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_ONE_MINUS_SRC_ALPHA, 0, 0 );
618 case SDL_BLENDMODE_ADD:
619 sceGuTexFunc(GU_TFX_MODULATE , GU_TCC_RGBA);
620 sceGuEnable(GU_BLEND);
621 sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_FIX, 0, 0x00FFFFFF );
623 case SDL_BLENDMODE_MOD:
624 sceGuTexFunc(GU_TFX_MODULATE , GU_TCC_RGBA);
625 sceGuEnable(GU_BLEND);
626 sceGuBlendFunc( GU_ADD, GU_FIX, GU_SRC_COLOR, 0, 0);
629 data->currentBlendMode = blendMode;
636 PSP_RenderClear(SDL_Renderer * renderer)
639 StartDrawing(renderer);
640 int color = renderer->a << 24 | renderer->b << 16 | renderer->g << 8 | renderer->r;
641 sceGuClearColor(color);
643 sceGuClear(GU_COLOR_BUFFER_BIT|GU_DEPTH_BUFFER_BIT|GU_FAST_CLEAR_BIT);
649 PSP_RenderDrawPoints(SDL_Renderer * renderer, const SDL_FPoint * points,
652 int color = renderer->a << 24 | renderer->b << 16 | renderer->g << 8 | renderer->r;
654 StartDrawing(renderer);
655 VertV* vertices = (VertV*)sceGuGetMemory(count*sizeof(VertV));
657 for (i = 0; i < count; ++i) {
658 vertices[i].x = points[i].x;
659 vertices[i].y = points[i].y;
660 vertices[i].z = 0.0f;
662 sceGuDisable(GU_TEXTURE_2D);
664 sceGuShadeModel(GU_FLAT);
665 sceGuDrawArray(GU_POINTS, GU_VERTEX_32BITF|GU_TRANSFORM_2D, count, 0, vertices);
666 sceGuShadeModel(GU_SMOOTH);
667 sceGuEnable(GU_TEXTURE_2D);
673 PSP_RenderDrawLines(SDL_Renderer * renderer, const SDL_FPoint * points,
676 int color = renderer->a << 24 | renderer->b << 16 | renderer->g << 8 | renderer->r;
678 StartDrawing(renderer);
679 VertV* vertices = (VertV*)sceGuGetMemory(count*sizeof(VertV));
681 for (i = 0; i < count; ++i) {
682 vertices[i].x = points[i].x;
683 vertices[i].y = points[i].y;
684 vertices[i].z = 0.0f;
687 sceGuDisable(GU_TEXTURE_2D);
689 sceGuShadeModel(GU_FLAT);
690 sceGuDrawArray(GU_LINE_STRIP, GU_VERTEX_32BITF|GU_TRANSFORM_2D, count, 0, vertices);
691 sceGuShadeModel(GU_SMOOTH);
692 sceGuEnable(GU_TEXTURE_2D);
698 PSP_RenderFillRects(SDL_Renderer * renderer, const SDL_FRect * rects,
701 int color = renderer->a << 24 | renderer->b << 16 | renderer->g << 8 | renderer->r;
703 StartDrawing(renderer);
705 for (i = 0; i < count; ++i) {
706 const SDL_FRect *rect = &rects[i];
707 VertV* vertices = (VertV*)sceGuGetMemory((sizeof(VertV)<<1));
708 vertices[0].x = rect->x;
709 vertices[0].y = rect->y;
710 vertices[0].z = 0.0f;
712 vertices[1].x = rect->x + rect->w;
713 vertices[1].y = rect->y + rect->h;
714 vertices[1].z = 0.0f;
716 sceGuDisable(GU_TEXTURE_2D);
718 sceGuShadeModel(GU_FLAT);
719 sceGuDrawArray(GU_SPRITES, GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertices);
720 sceGuShadeModel(GU_SMOOTH);
721 sceGuEnable(GU_TEXTURE_2D);
728 #define PI 3.14159265358979f
730 #define radToDeg(x) ((x)*180.f/PI)
731 #define degToRad(x) ((x)*PI/180.f)
733 float MathAbs(float x)
739 "vabs.s S000, S000\n"
741 : "=r"(result) : "r"(x));
746 void MathSincos(float r, float *s, float *c)
750 "vcst.s S003, VFPU_2_PI\n"
751 "vmul.s S002, S002, S003\n"
752 "vrot.p C000, S002, [s, c]\n"
755 : "=r"(*s), "=r"(*c): "r"(r));
758 void Swap(float *a, float *b)
766 PSP_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
767 const SDL_Rect * srcrect, const SDL_FRect * dstrect)
769 float x, y, width, height;
770 float u0, v0, u1, v1;
780 u1 = srcrect->x + srcrect->w;
781 v1 = srcrect->y + srcrect->h;
785 StartDrawing(renderer);
786 TextureActivate(texture);
787 PSP_SetBlendMode(renderer, renderer->blendMode);
791 sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA);
792 sceGuColor(GU_RGBA(255, 255, 255, alpha));
794 sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);
795 sceGuColor(0xFFFFFFFF);
798 if((MathAbs(u1) - MathAbs(u0)) < 64.0f)
800 VertTV* vertices = (VertTV*)sceGuGetMemory((sizeof(VertTV))<<1);
810 vertices[1].x = x + width;
811 vertices[1].y = y + height;
814 sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertices);
821 float endX = x + width;
823 float ustep = (u1 - u0)/width * slice;
828 for(start = 0, end = width; start < end; start += slice)
830 VertTV* vertices = (VertTV*)sceGuGetMemory((sizeof(VertTV))<<1);
832 float polyWidth = ((curX + slice) > endX) ? (endX - curX) : slice;
833 float sourceWidth = ((curU + ustep) > u1) ? (u1 - curU) : ustep;
835 vertices[0].u = curU;
837 vertices[0].x = curX;
844 vertices[1].u = curU;
846 vertices[1].x = curX;
847 vertices[1].y = (y + height);
850 sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertices);
855 sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);
860 PSP_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,
861 Uint32 pixel_format, void * pixels, int pitch)
869 PSP_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,
870 const SDL_Rect * srcrect, const SDL_FRect * dstrect,
871 const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip)
873 float x, y, width, height;
874 float u0, v0, u1, v1;
876 float centerx, centery;
885 u1 = srcrect->x + srcrect->w;
886 v1 = srcrect->y + srcrect->h;
893 StartDrawing(renderer);
894 TextureActivate(texture);
895 PSP_SetBlendMode(renderer, renderer->blendMode);
899 sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA);
900 sceGuColor(GU_RGBA(255, 255, 255, alpha));
902 sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);
903 sceGuColor(0xFFFFFFFF);
906 /* x += width * 0.5f; */
907 /* y += height * 0.5f; */
913 MathSincos(degToRad(angle), &s, &c);
916 /* height *= 0.5f; */
926 VertTV* vertices = (VertTV*)sceGuGetMemory(sizeof(VertTV)<<2);
930 vertices[0].x = x - cw + sh;
931 vertices[0].y = y - sw - ch;
936 vertices[1].x = x - cw - sh;
937 vertices[1].y = y - sw + ch;
942 vertices[2].x = x + cw - sh;
943 vertices[2].y = y + sw + ch;
948 vertices[3].x = x + cw + sh;
949 vertices[3].y = y + sw - ch;
952 if (flip & SDL_FLIP_HORIZONTAL) {
953 Swap(&vertices[0].v, &vertices[2].v);
954 Swap(&vertices[1].v, &vertices[3].v);
956 if (flip & SDL_FLIP_VERTICAL) {
957 Swap(&vertices[0].u, &vertices[2].u);
958 Swap(&vertices[1].u, &vertices[3].u);
961 sceGuDrawArray(GU_TRIANGLE_FAN, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 4, 0, vertices);
964 sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);
969 PSP_RenderPresent(SDL_Renderer * renderer)
971 PSP_RenderData *data = (PSP_RenderData *) renderer->driverdata;
972 if(!data->displayListAvail)
975 data->displayListAvail = SDL_FALSE;
979 /* if(data->vsync) */
980 sceDisplayWaitVblankStart();
982 data->backbuffer = data->frontbuffer;
983 data->frontbuffer = vabsptr(sceGuSwapBuffers());
988 PSP_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture)
990 PSP_RenderData *renderdata = (PSP_RenderData *) renderer->driverdata;
991 PSP_TextureData *psp_texture = (PSP_TextureData *) texture->driverdata;
999 SDL_free(psp_texture->data);
1000 SDL_free(psp_texture);
1001 texture->driverdata = NULL;
1005 PSP_DestroyRenderer(SDL_Renderer * renderer)
1007 PSP_RenderData *data = (PSP_RenderData *) renderer->driverdata;
1009 if (!data->initialized)
1012 StartDrawing(renderer);
1015 /* vfree(data->backbuffer); */
1016 /* vfree(data->frontbuffer); */
1018 data->initialized = SDL_FALSE;
1019 data->displayListAvail = SDL_FALSE;
1025 #endif /* SDL_VIDEO_RENDER_PSP */
1027 /* vi: set ts=4 sw=4 expandtab: */