mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 22:49:01 +08:00
[ios] Using SIMD to replace vector_float types can boost CPU performance on mid-range models.
This commit is contained in:
parent
b9abc0c5b9
commit
7629d7dd35
@ -1,5 +1,6 @@
|
|||||||
import SpineShadersStructs
|
import SpineShadersStructs
|
||||||
import Foundation
|
import Foundation
|
||||||
|
import simd
|
||||||
|
|
||||||
extension RenderCommand {
|
extension RenderCommand {
|
||||||
func getVertices() -> [SpineVertex] {
|
func getVertices() -> [SpineVertex] {
|
||||||
@ -13,20 +14,15 @@ extension RenderCommand {
|
|||||||
vertices.reserveCapacity(indices.count)
|
vertices.reserveCapacity(indices.count)
|
||||||
for i in 0..<indices.count {
|
for i in 0..<indices.count {
|
||||||
let index = Int(indices[i])
|
let index = Int(indices[i])
|
||||||
|
|
||||||
let xIndex = 2 * index
|
let xIndex = 2 * index
|
||||||
let yIndex = xIndex + 1
|
let yIndex = xIndex + 1
|
||||||
|
let position = SIMD2<Float>(positions[xIndex], positions[yIndex])
|
||||||
let positionX = positions[xIndex]
|
let uv = SIMD2<Float>(uvs[xIndex], uvs[yIndex])
|
||||||
let positionY = positions[yIndex]
|
|
||||||
let uvX = uvs[xIndex]
|
|
||||||
let uvY = uvs[yIndex]
|
|
||||||
let color = extractRGBA(from: colors[index])
|
let color = extractRGBA(from: colors[index])
|
||||||
|
|
||||||
let vertex = SpineVertex(
|
let vertex = SpineVertex(
|
||||||
position: vector_float2(positionX, positionY),
|
position: position,
|
||||||
color: color,
|
color: color,
|
||||||
uv: vector_float2(uvX, uvY)
|
uv: uv
|
||||||
)
|
)
|
||||||
vertices.append(vertex)
|
vertices.append(vertex)
|
||||||
}
|
}
|
||||||
@ -34,15 +30,14 @@ extension RenderCommand {
|
|||||||
return vertices
|
return vertices
|
||||||
}
|
}
|
||||||
|
|
||||||
private func extractRGBA(from color: Int32) -> vector_float4 {
|
private func extractRGBA(from color: Int32) -> SIMD4<Float> {
|
||||||
guard color != -1 else {
|
guard color != -1 else {
|
||||||
return vector_float4(1.0, 1.0, 1.0, 1.0)
|
return SIMD4<Float>(1.0, 1.0, 1.0, 1.0)
|
||||||
}
|
}
|
||||||
let alpha = (color >> 24) & 0xFF
|
let alpha = Float((color >> 24) & 0xFF) / 255.0
|
||||||
let red = (color >> 16) & 0xFF
|
let red = Float((color >> 16) & 0xFF) / 255.0
|
||||||
let green = (color >> 8) & 0xFF
|
let green = Float((color >> 8) & 0xFF) / 255.0
|
||||||
let blue = color & 0xFF
|
let blue = Float(color & 0xFF) / 255.0
|
||||||
|
return SIMD4<Float>(red, green, blue, alpha)
|
||||||
return vector_float4(Float(red)/255, Float(green)/255, Float(blue)/255, (Float(alpha)/255))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#include <metal_stdlib>
|
#include <metal_stdlib>
|
||||||
|
#include <simd/simd.h>
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
|
|
||||||
typedef enum SpineVertexInputIndex {
|
typedef enum SpineVertexInputIndex {
|
||||||
@ -13,21 +13,21 @@ typedef enum SpineTextureIndex {
|
|||||||
} SpineTextureIndex;
|
} SpineTextureIndex;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
vector_float2 position;
|
simd_float2 position;
|
||||||
vector_float4 color;
|
simd_float4 color;
|
||||||
vector_float2 uv;
|
simd_float2 uv;
|
||||||
} SpineVertex;
|
} SpineVertex;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
vector_float2 translation;
|
simd_float2 translation;
|
||||||
vector_float2 scale;
|
simd_float2 scale;
|
||||||
vector_float2 offset;
|
simd_float2 offset;
|
||||||
} SpineTransform;
|
} SpineTransform;
|
||||||
|
|
||||||
struct RasterizerData {
|
struct RasterizerData {
|
||||||
float4 position [[position]];
|
simd_float4 position [[position]];
|
||||||
float4 color;
|
simd_float4 color;
|
||||||
float2 textureCoordinate;
|
simd_float2 textureCoordinate;
|
||||||
};
|
};
|
||||||
|
|
||||||
vertex RasterizerData
|
vertex RasterizerData
|
||||||
@ -38,11 +38,11 @@ vertexShader(uint vertexID [[vertex_id]],
|
|||||||
{
|
{
|
||||||
RasterizerData out;
|
RasterizerData out;
|
||||||
|
|
||||||
float2 pixelSpacePosition = vertices[vertexID].position.xy;
|
simd_float2 pixelSpacePosition = vertices[vertexID].position.xy;
|
||||||
|
|
||||||
vector_float2 viewportSize = vector_float2(*viewportSizePointer);
|
simd_float2 viewportSize = simd_float2(*viewportSizePointer);
|
||||||
|
|
||||||
out.position = vector_float4(0.0, 0.0, 0.0, 1.0);
|
out.position = simd_float4(0.0, 0.0, 0.0, 1.0);
|
||||||
|
|
||||||
out.position.xy = pixelSpacePosition;
|
out.position.xy = pixelSpacePosition;
|
||||||
out.position.xy *= transform->scale;
|
out.position.xy *= transform->scale;
|
||||||
@ -57,7 +57,7 @@ vertexShader(uint vertexID [[vertex_id]],
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
fragment float4
|
fragment simd_float4
|
||||||
fragmentShader(RasterizerData in [[stage_in]],
|
fragmentShader(RasterizerData in [[stage_in]],
|
||||||
texture2d<half> colorTexture [[ texture(SpineTextureIndexBaseColor) ]])
|
texture2d<half> colorTexture [[ texture(SpineTextureIndexBaseColor) ]])
|
||||||
{
|
{
|
||||||
@ -66,5 +66,5 @@ fragmentShader(RasterizerData in [[stage_in]],
|
|||||||
|
|
||||||
const half4 colorSample = colorTexture.sample(textureSampler, in.textureCoordinate);
|
const half4 colorSample = colorTexture.sample(textureSampler, in.textureCoordinate);
|
||||||
|
|
||||||
return float4(colorSample) * in.color;
|
return simd_float4(colorSample) * in.color;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,9 +14,9 @@ typedef enum SpineTextureIndex {
|
|||||||
} SpineTextureIndex;
|
} SpineTextureIndex;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
vector_float2 position;
|
simd_float2 position;
|
||||||
vector_float4 color;
|
simd_float4 color;
|
||||||
vector_float2 uv;
|
simd_float2 uv;
|
||||||
} SpineVertex;
|
} SpineVertex;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user