Skip to content

Commit f4e4d58

Browse files
committed
Use destiny to create the different slices
1 parent 3183281 commit f4e4d58

File tree

1 file changed

+51
-111
lines changed

1 file changed

+51
-111
lines changed

src/render/psp/SDL_render_psp.c

Lines changed: 51 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,13 @@
2424

2525
#include "../SDL_sysrender.h"
2626
#include "SDL_hints.h"
27+
#include "SDL_render_psp.h"
2728

2829
#include <pspgu.h>
2930
#include <pspintrman.h>
30-
#include "SDL_render_psp.h"
31+
#include <vram.h>
32+
#include <psputils.h>
33+
#include <pspdisplay.h>
3134

3235
static unsigned int __attribute__((aligned(16))) list[262144];
3336

@@ -41,6 +44,7 @@ typedef struct
4144
{
4245
void *frontbuffer; /**< main screen buffer */
4346
void *backbuffer; /**< buffer presented to display */
47+
uint8_t drawBufferFormat; /**< GU_PSM_8888 or GU_PSM_5650 or GU_PSM_4444 */
4448
uint64_t drawColor;
4549
PSP_BlendInfo blendInfo; /**< current blend info */
4650
uint8_t vsync; /* 0 (Disabled), 1 (Enabled), 2 (Dynamic) */
@@ -90,25 +94,6 @@ typedef struct
9094
int height;
9195
} SliceSize;
9296

93-
typedef enum
94-
{
95-
SLICE_PIXEL_BITS_32,
96-
SLICE_PIXEL_BITS_16,
97-
SLICE_PIXEL_BITS_COUNT
98-
} SlicePixelBits;
99-
100-
#define SLICE_VALUES_COUNT 3
101-
typedef struct
102-
{
103-
SlicePixelBits pixelBits;
104-
SliceSize sizes[SLICE_VALUES_COUNT];
105-
SliceSize condition;
106-
} SliceInfo;
107-
108-
static SliceInfo sliceInfo[SLICE_PIXEL_BITS_COUNT] = {
109-
{ SLICE_PIXEL_BITS_32, { { 128, 16 }, { 64, 32 }, { 32, 64 } }, { 32, 16 } },
110-
{ SLICE_PIXEL_BITS_16, { { 128, 32 }, { 64, 64 }, { 32, 128 } }, { 32, 32 } }
111-
};
11297

11398
int SDL_PSP_RenderGetProp(SDL_Renderer *r, enum SDL_PSP_RenderProps which, void** out)
11499
{
@@ -127,7 +112,6 @@ int SDL_PSP_RenderGetProp(SDL_Renderer *r, enum SDL_PSP_RenderProps which, void*
127112
}
128113
return -1;
129114
}
130-
131115
static int vsync_sema_id = 0;
132116

133117
/* PRIVATE METHODS */
@@ -203,94 +187,69 @@ static inline int calculateNextPow2(int value)
203187
return i;
204188
}
205189

206-
static inline int calculateBestSliceSizeForTexture(SDL_Texture *texture, SliceSize *uvSize, SliceSize *sliceSize, SliceSize *sliceDimension) {
207-
int i;
208-
uint8_t horizontalSlices, verticalSlices;
209-
int pixelBits = 0;
210-
int pixelSize = SDL_BYTESPERPIXEL(texture->format);
211-
SliceInfo *sliceInfoPtr = NULL;
212-
SliceSize *foundSlizeSize = NULL;
213-
214-
switch (pixelSize) {
215-
case 4:
216-
sliceInfoPtr = &sliceInfo[SLICE_PIXEL_BITS_32];
217-
break;
218-
case 2:
219-
sliceInfoPtr = &sliceInfo[SLICE_PIXEL_BITS_16];
220-
break;
221-
default:
222-
return -1;
223-
}
224-
225-
if (sliceInfoPtr->condition.width > uvSize->width && sliceInfoPtr->condition.height > uvSize->height) {
226-
sliceSize->width = uvSize->width;
227-
sliceSize->height = uvSize->height;
228-
sliceDimension->width = 1;
229-
sliceDimension->height = 1;
230-
return 0;
231-
}
190+
static inline int calculateBestSliceSizeForSprite(SDL_Renderer *renderer, const SDL_FRect *dstrect, SliceSize *sliceSize, SliceSize *sliceDimension) {
191+
PSP_RenderData *data = (PSP_RenderData *)renderer->driverdata;
232192

233-
if (uvSize->width >= uvSize->height) {
234-
for (i = 0; i < SLICE_VALUES_COUNT; i++) {
235-
if (uvSize->width >= sliceInfoPtr->sizes[i].width) {
236-
foundSlizeSize = &sliceInfoPtr->sizes[i];
237-
break;
238-
}
239-
}
240-
} else {
241-
for (i = SLICE_VALUES_COUNT - 1; i >= 0; i--) {
242-
if (uvSize->height >= sliceInfoPtr->sizes[i].height) {
243-
foundSlizeSize = &sliceInfoPtr->sizes[i];
244-
break;
245-
}
246-
}
247-
}
193+
// We split in blocks of (64 x destiny height) when 16 bits per color
194+
// or (32 x destiny height) when 32 bits per color
248195

249-
if (foundSlizeSize == NULL)
196+
switch (data->drawBufferFormat) {
197+
case GU_PSM_5650:
198+
case GU_PSM_5551:
199+
case GU_PSM_4444:
200+
sliceSize->width = 64;
201+
break;
202+
case GU_PSM_8888:
203+
sliceSize->width = 32;
204+
break;
205+
default:
250206
return -1;
207+
}
208+
sliceSize->height = dstrect->h;
251209

252-
sliceSize->width = foundSlizeSize->width;
253-
sliceSize->height = foundSlizeSize->height;
254-
sliceDimension->width = ((uvSize->width % foundSlizeSize->width == 0) ? 0 : 1) + (uvSize->width / foundSlizeSize->width);
255-
sliceDimension->height = ((uvSize->height % foundSlizeSize->height == 0) ? 0 : 1) + (uvSize->height / foundSlizeSize->height);
210+
sliceDimension->width = SDL_ceilf(dstrect->w / sliceSize->width);
211+
sliceDimension->height = SDL_ceilf(dstrect->h / sliceSize->height);
256212

257213
return 0;
258214
}
259215

260216
static inline void fillSpriteVertices(VertTV *vertices, SliceSize *dimensions, SliceSize *sliceSize,
261217
const SDL_Rect *srcrect, const SDL_FRect *dstrect) {
262218
int i, j;
263-
int remainingWidth = srcrect->w % sliceSize->width;
264-
int remainingHeight = srcrect->h % sliceSize->height;
219+
int remainingWidth = (int)dstrect->w % sliceSize->width;
220+
int remainingHeight = (int)dstrect->h % sliceSize->height;
265221
int hasRemainingWidth = remainingWidth > 0;
266222
int hasRemainingHeight = remainingHeight > 0;
267-
float dstrectRateWidth = (float)(abs(dstrect->w - dimensions->width)) / (float)(abs(srcrect->w - dimensions->width));
268-
float dstrectRateHeight = (float)(abs(dstrect->h - dimensions->height)) / (float)(abs(srcrect->h - dimensions->height));
223+
float srcrectRateWidth = (float)(abs(srcrect->w - dimensions->width)) / (float)(abs(dstrect->w - dimensions->width));
224+
float srcrectRateHeight = (float)(abs(srcrect->h - dimensions->height)) / (float)(abs(dstrect->h - dimensions->height));
225+
float srcWidth = sliceSize->width * srcrectRateWidth;
226+
float srcHeight = sliceSize->height * srcrectRateHeight;
227+
float remainingSrcWidth = remainingWidth * srcrectRateWidth;
228+
float remainingSrcHeight = remainingHeight * srcrectRateHeight;
269229

270-
int verticesCount = dimensions->width * dimensions->height * 2;
271230
for (i = 0; i < dimensions->width; i++) {
272231
for (j = 0; j < dimensions->height; j++) {
273232
uint8_t currentIndex = (i * dimensions->height + j) * 2;
274-
vertices[currentIndex].u = srcrect->x + i * sliceSize->width;
275-
vertices[currentIndex].v = srcrect->y + j * sliceSize->height;
276-
vertices[currentIndex].x = dstrect->x + i * sliceSize->width * dstrectRateWidth;
277-
vertices[currentIndex].y = dstrect->y + j * sliceSize->height * dstrectRateHeight;
233+
vertices[currentIndex].u = srcrect->x + i * srcWidth;
234+
vertices[currentIndex].v = srcrect->y + j * srcHeight;
235+
vertices[currentIndex].x = dstrect->x + i * sliceSize->width;
236+
vertices[currentIndex].y = dstrect->y + j * sliceSize->height;
278237
vertices[currentIndex].z = 0;
279238

280239
if (i == dimensions->width - 1 && hasRemainingWidth) {
281-
vertices[currentIndex + 1].u = srcrect->x + i * sliceSize->width + remainingWidth;
282-
vertices[currentIndex + 1].x = dstrect->x + i * (sliceSize->width * dstrectRateWidth) + remainingWidth * dstrectRateWidth;
240+
vertices[currentIndex + 1].u = vertices[currentIndex].u + remainingSrcWidth;
241+
vertices[currentIndex + 1].x = vertices[currentIndex].x + remainingWidth;
283242
} else {
284-
vertices[currentIndex + 1].u = (srcrect->x + (i +1) * sliceSize->width);
285-
vertices[currentIndex + 1].x = dstrect->x + (i + 1) * sliceSize->width * dstrectRateWidth;
243+
vertices[currentIndex + 1].u = vertices[currentIndex].u + srcWidth;
244+
vertices[currentIndex + 1].x = vertices[currentIndex].x + sliceSize->width;
286245
}
287246

288247
if (j == dimensions->height - 1 && hasRemainingHeight) {
289-
vertices[currentIndex + 1].v = srcrect->y + j * sliceSize->height + remainingHeight;
290-
vertices[currentIndex + 1].y = dstrect->y + j * sliceSize->height * dstrectRateHeight + remainingHeight * dstrectRateHeight;
248+
vertices[currentIndex + 1].v = vertices[currentIndex].v + remainingSrcHeight;
249+
vertices[currentIndex + 1].y = vertices[currentIndex].y + remainingHeight;
291250
} else {
292-
vertices[currentIndex + 1].v = (srcrect->y + (j + 1) * sliceSize->height);
293-
vertices[currentIndex + 1].y = dstrect->y + (j + 1) * sliceSize->height * dstrectRateHeight;
251+
vertices[currentIndex + 1].v = vertices[currentIndex].v + srcHeight;
252+
vertices[currentIndex + 1].y = vertices[currentIndex].y + sliceSize->height;
294253
}
295254

296255
vertices[currentIndex + 1].z = 0;
@@ -344,7 +303,6 @@ static int PSP_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture,
344303
static void PSP_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
345304
{
346305
PSP_Texture *psp_texture = (PSP_Texture *)texture->driverdata;
347-
PSP_RenderData *data = (PSP_RenderData *)renderer->driverdata;
348306

349307
sceKernelDcacheWritebackRange(psp_texture->data, psp_texture->size);
350308
}
@@ -396,7 +354,6 @@ static int PSP_QueueSetViewport(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
396354

397355
static int PSP_QueueDrawPoints(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
398356
{
399-
PSP_RenderData *data = (PSP_RenderData *)renderer->driverdata;
400357
VertV *verts = (VertV *)SDL_AllocateRenderVertices(renderer, count * sizeof(VertV), 4, &cmd->data.draw.first);
401358
int i;
402359

@@ -422,7 +379,6 @@ static int PSP_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL
422379
{
423380
int i;
424381
int count = indices ? num_indices : num_vertices;
425-
PSP_RenderData *data = (PSP_RenderData *)renderer->driverdata;
426382

427383
cmd->data.draw.count = count;
428384
size_indices = indices ? size_indices : 0;
@@ -535,25 +491,14 @@ static int PSP_QueueCopy(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Tex
535491
{
536492
VertTV *verts;
537493
uint8_t verticesCount;
538-
const float x = dstrect->x;
539-
const float y = dstrect->y;
540-
const float width = dstrect->w;
541-
const float height = dstrect->h;
542494

543-
const float u0 = srcrect->x;
544-
const float v0 = srcrect->y;
545-
const float u1 = srcrect->x + srcrect->w;
546-
const float v1 = srcrect->y + srcrect->h;
547-
548-
SliceSize sliceSize, sliceDimension, uvSize;
495+
SliceSize sliceSize, sliceDimension;
549496

550497
// In this function texture must be created
551498
if (!texture)
552499
return -1;
553500

554-
uvSize.width = abs(u1 - u0);
555-
uvSize.height = abs(v1 - v0);
556-
if (calculateBestSliceSizeForTexture(texture, &uvSize, &sliceSize, &sliceDimension))
501+
if (calculateBestSliceSizeForSprite(renderer, dstrect, &sliceSize, &sliceDimension))
557502
return -1;
558503

559504
verticesCount = sliceDimension.width * sliceDimension.height * 2;
@@ -570,7 +515,6 @@ static int PSP_QueueCopy(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Tex
570515

571516
static int PSP_RenderSetViewPort(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
572517
{
573-
PSP_RenderData *data = (PSP_RenderData *)renderer->driverdata;
574518
const SDL_Rect *viewport = &cmd->data.viewport.rect;
575519

576520
sceGuOffset(2048 - (viewport->w >> 1), 2048 - (viewport->h >> 1));
@@ -635,8 +579,6 @@ static void PSP_SetBlendMode(PSP_RenderData *data, PSP_BlendInfo blendInfo)
635579

636580
static inline int PSP_RenderSetClipRect(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
637581
{
638-
PSP_RenderData *data = (PSP_RenderData *)renderer->driverdata;
639-
640582
const SDL_Rect *rect = &cmd->data.cliprect.rect;
641583

642584
if (cmd->data.cliprect.enabled) {
@@ -653,8 +595,6 @@ static inline int PSP_RenderSetDrawColor(SDL_Renderer *renderer, SDL_RenderComma
653595
{
654596
uint8_t colorR, colorG, colorB, colorA;
655597

656-
PSP_RenderData *data = (PSP_RenderData *)renderer->driverdata;
657-
658598
colorR = cmd->data.color.r;
659599
colorG = cmd->data.color.g;
660600
colorB = cmd->data.color.b;
@@ -668,8 +608,6 @@ static inline int PSP_RenderClear(SDL_Renderer *renderer, SDL_RenderCommand *cmd
668608
{
669609
uint8_t colorR, colorG, colorB, colorA;
670610

671-
PSP_RenderData *data = (PSP_RenderData *)renderer->driverdata;
672-
673611
colorR = cmd->data.color.r;
674612
colorG = cmd->data.color.g;
675613
colorB = cmd->data.color.b;
@@ -763,6 +701,7 @@ static inline int PSP_RenderPoints(SDL_Renderer *renderer, void *vertices, SDL_R
763701
static inline int PSP_RenderCopy(SDL_Renderer *renderer, void *vertices, SDL_RenderCommand *cmd)
764702
{
765703
PSP_RenderData *data = (PSP_RenderData *)renderer->driverdata;
704+
PSP_Texture *psp_tex = (PSP_Texture *)cmd->data.draw.texture->driverdata;
766705
const size_t count = cmd->data.draw.count;
767706
const VertTV *verts = (VertTV *)(vertices + cmd->data.draw.first);
768707
PSP_BlendInfo blendInfo = {
@@ -772,8 +711,6 @@ static inline int PSP_RenderCopy(SDL_Renderer *renderer, void *vertices, SDL_Ren
772711

773712
PSP_SetBlendMode(data, blendInfo);
774713

775-
PSP_Texture *psp_tex = (PSP_Texture *)cmd->data.draw.texture->driverdata;
776-
777714
sceGuTexMode(psp_tex->format, 0, 0, GU_FALSE);
778715
sceGuTexImage(0, psp_tex->textureWidth, psp_tex->textureHeight, psp_tex->width, psp_tex->data);
779716
sceGuTexFilter(psp_tex->filter, psp_tex->filter);
@@ -948,15 +885,18 @@ static int PSP_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, Uint32
948885
// flush cache so that no stray data remains
949886
sceKernelDcacheWritebackAll();
950887

888+
// Forcing for now using GU_PSM_4444
889+
data->drawBufferFormat = GU_PSM_4444;
890+
951891
/* Specific GU init */
952-
bufferSize = getMemorySize(PSP_FRAME_BUFFER_WIDTH, PSP_SCREEN_HEIGHT, GU_PSM_4444);
892+
bufferSize = getMemorySize(PSP_FRAME_BUFFER_WIDTH, PSP_SCREEN_HEIGHT, data->drawBufferFormat);
953893
doublebuffer = vramalloc(bufferSize * 2);
954894
data->backbuffer = doublebuffer;
955895
data->frontbuffer = ((uint8_t *)doublebuffer) + bufferSize;
956896

957897
sceGuInit();
958898
sceGuStart(GU_DIRECT, list);
959-
sceGuDrawBuffer(GU_PSM_4444, vrelptr(data->frontbuffer), PSP_FRAME_BUFFER_WIDTH);
899+
sceGuDrawBuffer(data->drawBufferFormat, vrelptr(data->frontbuffer), PSP_FRAME_BUFFER_WIDTH);
960900
sceGuDispBuffer(PSP_SCREEN_WIDTH, PSP_SCREEN_HEIGHT, vrelptr(data->backbuffer), PSP_FRAME_BUFFER_WIDTH);
961901

962902
sceGuOffset(2048 - (PSP_SCREEN_WIDTH >> 1), 2048 - (PSP_SCREEN_HEIGHT >> 1));

0 commit comments

Comments
 (0)