SDL: Metal: remove RenderCopy and RenderCopyEx from back-end

From d3655eaf942aeac2a82c3d02f8664d0af4d50ae5 Mon Sep 17 00:00:00 2001
From: Sylvain <[EMAIL REDACTED]>
Date: Mon, 20 Sep 2021 17:09:44 +0200
Subject: [PATCH] Metal: remove RenderCopy and RenderCopyEx from back-end

---
 src/render/metal/SDL_render_metal.m | 146 +---------------------------
 1 file changed, 2 insertions(+), 144 deletions(-)

diff --git a/src/render/metal/SDL_render_metal.m b/src/render/metal/SDL_render_metal.m
index ca6ff2a196..eb9949a0a0 100644
--- a/src/render/metal/SDL_render_metal.m
+++ b/src/render/metal/SDL_render_metal.m
@@ -1191,134 +1191,6 @@ - (void)dealloc
     return 0;
 }
 
-static int
-METAL_QueueCopy(SDL_Renderer * renderer, SDL_RenderCommand *cmd, SDL_Texture * texture,
-                const SDL_Rect * srcrect, const SDL_FRect * dstrect)
-{
-    const float texw = (float) texture->w;
-    const float texh = (float) texture->h;
-    const int color = (cmd->data.draw.r << 0) | (cmd->data.draw.g << 8) | (cmd->data.draw.b << 16) | (cmd->data.draw.a << 24);
-    // !!! FIXME: use an index buffer
-    const size_t vertlen = 4 * (2 * sizeof (float) + sizeof (int) + 2 * sizeof (float));
-    float *verts = (float *) SDL_AllocateRenderVertices(renderer, vertlen, DEVICE_ALIGN(8), &cmd->data.draw.first);
-    if (!verts) {
-        return -1;
-    }
-
-    cmd->data.draw.count = 1;
-
-    /* Interleaved positions and texture coordinates */
-    *(verts++) = dstrect->x;
-    *(verts++) = dstrect->y + dstrect->h;
-    *((int *)verts++) = color;
-    *(verts++) = normtex(srcrect->x, texw);
-    *(verts++) = normtex(srcrect->y + srcrect->h, texh);
-
-    *(verts++) = dstrect->x;
-    *(verts++) = dstrect->y;
-    *((int *)verts++) = color;
-    *(verts++) = normtex(srcrect->x, texw);
-    *(verts++) = normtex(srcrect->y, texh);
-
-    *(verts++) = dstrect->x + dstrect->w;
-    *(verts++) = dstrect->y + dstrect->h;
-    *((int *)verts++) = color;
-    *(verts++) = normtex(srcrect->x + srcrect->w, texw);
-    *(verts++) = normtex(srcrect->y + srcrect->h, texh);
-
-    *(verts++) = dstrect->x + dstrect->w;
-    *(verts++) = dstrect->y;
-    *((int *)verts++) = color;
-    *(verts++) = normtex(srcrect->x + srcrect->w, texw);
-    *(verts++) = normtex(srcrect->y, texh);
-
-    return 0;
-}
-
-static int
-METAL_QueueCopyEx(SDL_Renderer * renderer, SDL_RenderCommand *cmd, SDL_Texture * texture,
-                  const SDL_Rect * srcquad, const SDL_FRect * dstrect,
-                  const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip)
-{
-    const int color = (cmd->data.draw.r << 0) | (cmd->data.draw.g << 8) | (cmd->data.draw.b << 16) | (cmd->data.draw.a << 24);
-    const float texw = (float) texture->w;
-    const float texh = (float) texture->h;
-    const float rads = (float)(M_PI * (float) angle / 180.0f);
-    const float c = cosf(rads), s = sinf(rads);
-    float minu, maxu, minv, maxv;
-    const size_t vertlen = 16 * sizeof (float) + 4 * (2 * sizeof (float) + sizeof (int) + 2 * sizeof (float));
-    float *verts;
-
-    // cheat and store this offset in (count) because it needs to be aligned in ways other fields don't and we aren't using count otherwise.
-    verts = (float *) SDL_AllocateRenderVertices(renderer, vertlen, CONSTANT_ALIGN(16), &cmd->data.draw.count);
-    if (!verts) {
-        return -1;
-    }
-
-    // transform matrix
-    SDL_memset(verts, '\0', sizeof (*verts) * 16);
-    verts[10] = verts[15] = 1.0f;
-    // rotation
-    verts[0] = c;
-    verts[1] = s;
-    verts[4] = -s;
-    verts[5] = c;
-
-    // translation
-    verts[12] = dstrect->x + center->x;
-    verts[13] = dstrect->y + center->y;
-
-    // rest of the vertices don't need the aggressive alignment. Pack them in.
-    verts = (float *) SDL_AllocateRenderVertices(renderer, vertlen, DEVICE_ALIGN(8), &cmd->data.draw.first);
-    if (!verts) {
-        return -1;
-    }
-
-    minu = normtex(srcquad->x, texw);
-    maxu = normtex(srcquad->x + srcquad->w, texw);
-    minv = normtex(srcquad->y, texh);
-    maxv = normtex(srcquad->y + srcquad->h, texh);
-
-    if (flip & SDL_FLIP_HORIZONTAL) {
-        float tmp = maxu;
-        maxu = minu;
-        minu = tmp;
-    }
-    if (flip & SDL_FLIP_VERTICAL) {
-        float tmp = maxv;
-        maxv = minv;
-        minv = tmp;
-    }
-
-    /* Interleaved positions and texture coordinates */
-    *(verts++) = -center->x;
-    *(verts++) = dstrect->h - center->y;
-    *((int *)verts++) = color;
-    *(verts++) = minu;
-    *(verts++) = maxv;
-
-    *(verts++) = -center->x;
-    *(verts++) = -center->y;
-    *((int *)verts++) = color;
-    *(verts++) = minu;
-    *(verts++) = minv;
-
-    *(verts++) = dstrect->w - center->x;
-    *(verts++) = dstrect->h - center->y;
-    *((int *)verts++) = color;
-    *(verts++) = maxu;
-    *(verts++) = maxv;
-
-    *(verts++) = dstrect->w - center->x;
-    *(verts++) = -center->y;
-    *((int *)verts++) = color;
-    *(verts++) = maxu;
-    *(verts++) = minv;
-
-    return 0;
-}
-
-#if SDL_HAVE_RENDER_GEOMETRY
 static int
 METAL_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
         const float *xy, int xy_stride, const int *color, int color_stride, const float *uv, int uv_stride,
@@ -1364,7 +1236,6 @@ - (void)dealloc
 
     return 0;
 }
-#endif
 
 typedef struct
 {
@@ -1611,21 +1482,13 @@ - (void)dealloc
                 break;
             }
 
-            case SDL_RENDERCMD_COPY: {
-                SetCopyState(renderer, cmd, CONSTANTS_OFFSET_IDENTITY, mtlbufvertex, &statecache);
-                [data.mtlcmdencoder drawPrimitives:MTLPrimitiveTypeTriangleStrip vertexStart:0 vertexCount:4];
+            case SDL_RENDERCMD_COPY: /* unused */
                 break;
-            }
 
-            case SDL_RENDERCMD_COPY_EX: {
-                SetCopyState(renderer, cmd, CONSTANTS_OFFSET_INVALID, mtlbufvertex, &statecache);
-                [data.mtlcmdencoder setVertexBuffer:mtlbufvertex offset:cmd->data.draw.count atIndex:3];  // transform
-                [data.mtlcmdencoder drawPrimitives:MTLPrimitiveTypeTriangleStrip vertexStart:0 vertexCount:4];
+            case SDL_RENDERCMD_COPY_EX: /* unused */ 
                 break;
-            }
 
             case SDL_RENDERCMD_GEOMETRY: {
-#if SDL_HAVE_RENDER_GEOMETRY
                 const size_t count = cmd->data.draw.count;
                 SDL_Texture *texture = cmd->data.draw.texture;
 
@@ -1636,7 +1499,6 @@ - (void)dealloc
                     SetDrawState(renderer, cmd, SDL_METAL_FRAGMENT_SOLID, CONSTANTS_OFFSET_IDENTITY, mtlbufvertex, &statecache);
                     [data.mtlcmdencoder drawPrimitives:MTLPrimitiveTypeTriangle vertexStart:0 vertexCount:count];
                 }
-#endif
                 break;
             }
 
@@ -2020,11 +1882,7 @@ - (void)dealloc
     renderer->QueueDrawPoints = METAL_QueueDrawPoints;
     renderer->QueueDrawLines = METAL_QueueDrawLines;
     renderer->QueueFillRects = METAL_QueueFillRects;
-    renderer->QueueCopy = METAL_QueueCopy;
-    renderer->QueueCopyEx = METAL_QueueCopyEx;
-#if SDL_HAVE_RENDER_GEOMETRY
     renderer->QueueGeometry = METAL_QueueGeometry;
-#endif
     renderer->RunCommandQueue = METAL_RunCommandQueue;
     renderer->RenderReadPixels = METAL_RenderReadPixels;
     renderer->RenderPresent = METAL_RenderPresent;