SDL: Create function for calculate the proper slice size

From 093689094cf9d8af05b0a28ddc3975d20ac88cf8 Mon Sep 17 00:00:00 2001
From: Francisco Javier Trujillo Mata <[EMAIL REDACTED]>
Date: Sat, 28 Jan 2023 01:36:15 +0100
Subject: [PATCH] Create function for calculate the proper slice size

---
 src/render/psp/SDL_render_psp.c | 92 +++++++++++++++++++++++++++++++--
 1 file changed, 89 insertions(+), 3 deletions(-)

diff --git a/src/render/psp/SDL_render_psp.c b/src/render/psp/SDL_render_psp.c
index cb40ecea7a180..ce147c24e2a3b 100644
--- a/src/render/psp/SDL_render_psp.c
+++ b/src/render/psp/SDL_render_psp.c
@@ -68,20 +68,52 @@ typedef struct
 typedef struct
 {
     float x, y, z;
-} VertV;
+} __attribute__ ((packed)) VertV;
 
 typedef struct
 {
     SDL_Color col;
     float x, y, z;
-} VertCV;
+} __attribute__ ((packed)) VertCV;
 
 typedef struct
 {
     float u, v;
     SDL_Color col;
     float x, y, z;
-} VertTCV;
+} __attribute__ ((packed)) VertTCV;
+
+typedef struct
+{
+    float u, v;
+    float x, y, z;
+} __attribute__ ((packed)) VertTV;
+
+typedef struct
+{
+    int width;
+    int height;
+} SliceSize;
+
+typedef enum
+{
+    SLICE_PIXEL_BITS_32,
+    SLICE_PIXEL_BITS_16,
+    SLICE_PIXEL_BITS_COUNT
+}  SlicePixelBits;
+
+#define SLICE_VALUES_COUNT 3
+typedef struct
+{
+    SlicePixelBits pixelBits;
+    SliceSize sizes[SLICE_VALUES_COUNT];
+    SliceSize condition; 
+} SliceInfo;
+
+static SliceInfo sliceInfo[SLICE_PIXEL_BITS_COUNT] = {
+    { SLICE_PIXEL_BITS_32, { { 128, 16 }, { 64, 32 }, { 32, 64 } }, { 32, 16 } },
+    { SLICE_PIXEL_BITS_16, { { 128, 32 }, { 64, 64 }, { 32, 128 } }, { 32, 32 } }
+};
 
 static int vsync_sema_id = 0;
 
@@ -158,6 +190,60 @@ static int calculateNextPow2(int value)
     return i;
 }
 
+static int calculateBestSliceSizeForTexture(SDL_Texture *texture, SliceSize *uvSize, SliceSize *sliceSize, SliceSize *sliceDimension) {
+    int i;
+    uint8_t horizontalSlices, verticalSlices;
+    int pixelBits = 0;
+    int pixelSize = SDL_BYTESPERPIXEL(texture->format);
+    SliceInfo *sliceInfoPtr = NULL;
+    SliceSize *foundSlizeSize = NULL;
+
+    switch (pixelSize) {
+        case 4:
+            sliceInfoPtr = &sliceInfo[SLICE_PIXEL_BITS_32];
+            break;
+        case 2:
+            sliceInfoPtr = &sliceInfo[SLICE_PIXEL_BITS_16];
+            break;
+        default:
+            return -1;
+    }
+
+    if (sliceInfoPtr->condition.width > uvSize->width && sliceInfoPtr->condition.height > uvSize->height) {
+        sliceSize->width = uvSize->width;
+        sliceSize->height = uvSize->height;
+        sliceDimension->width = 1;
+        sliceDimension->height = 1;
+        return 0;
+    }
+
+    if (uvSize->width >= uvSize->height) {
+        for (i = 0; i < SLICE_VALUES_COUNT; i++) {
+            if (uvSize->width >= sliceInfoPtr->sizes[i].width) {
+                foundSlizeSize = &sliceInfoPtr->sizes[i];
+                break;
+            }
+        }
+    } else {
+        for (i = SLICE_VALUES_COUNT - 1; i >= 0; i--) {
+            if (uvSize->height >= sliceInfoPtr->sizes[i].height) {
+                foundSlizeSize = &sliceInfoPtr->sizes[i];
+                break;
+            }
+        }
+    }
+
+    if (foundSlizeSize == NULL)
+        return -1;
+    
+    sliceSize->width = foundSlizeSize->width;
+    sliceSize->height = foundSlizeSize->height;
+    sliceDimension->width = ((texture->w % foundSlizeSize->width == 0) ? 0 : 1) + (texture->w / foundSlizeSize->width);
+    sliceDimension->height = ((texture->h % foundSlizeSize->height == 0) ? 0 : 1) + (texture->h / foundSlizeSize->height);
+
+    return 0;
+}
+
 static void PSP_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event)
 {
 }