mirror of
https://github.com/ScrelliCopter/NeHe-SDL_GPU.git
synced 2025-06-19 21:49:17 +10:00
swift: Linux Support
This commit is contained in:
@@ -2,6 +2,19 @@
|
|||||||
|
|
||||||
import PackageDescription
|
import PackageDescription
|
||||||
|
|
||||||
|
func resources(shaders: [String], data: [String] = []) -> [PackageDescription.Resource] {
|
||||||
|
shaders.flatMap { name in
|
||||||
|
#if os(macOS)
|
||||||
|
[ .process("../../../data/shaders/\(name).metallib") ]
|
||||||
|
#else
|
||||||
|
[
|
||||||
|
.process("../../../data/shaders/\(name).vtx.spv"),
|
||||||
|
.process("../../../data/shaders/\(name).frg.spv"),
|
||||||
|
]
|
||||||
|
#endif
|
||||||
|
} + data.map { resource in .process("../../../data/\(resource)") }
|
||||||
|
}
|
||||||
|
|
||||||
let package = Package(
|
let package = Package(
|
||||||
name: "NeHe-SDL_GPU",
|
name: "NeHe-SDL_GPU",
|
||||||
products: [
|
products: [
|
||||||
@@ -18,38 +31,34 @@ let package = Package(
|
|||||||
],
|
],
|
||||||
dependencies: [
|
dependencies: [
|
||||||
.package(url: "https://github.com/GayPizzaSpecifications/SDL3Swift.git", branch: "main"),
|
.package(url: "https://github.com/GayPizzaSpecifications/SDL3Swift.git", branch: "main"),
|
||||||
|
.package(url: "https://github.com/keyvariable/kvSIMD.swift.git", .upToNextMajor(from: "1.1.0")),
|
||||||
],
|
],
|
||||||
targets: [
|
targets: [
|
||||||
.target(
|
.target(
|
||||||
name: "NeHe",
|
name: "NeHe",
|
||||||
dependencies: [ .product(name: "SDLSwift", package: "SDL3Swift") ],
|
dependencies: [
|
||||||
|
.product(name: "SDLSwift", package: "SDL3Swift"),
|
||||||
|
.product(name: "kvSIMD", package: "kvSIMD.swift"),
|
||||||
|
],
|
||||||
path: "src/swift/NeHe"),
|
path: "src/swift/NeHe"),
|
||||||
.executableTarget(name: "Lesson1", dependencies: [ "NeHe" ], path: "src/swift/Lesson1"),
|
.executableTarget(name: "Lesson1", dependencies: [ "NeHe" ], path: "src/swift/Lesson1"),
|
||||||
.executableTarget(name: "Lesson2", dependencies: [ "NeHe" ], path: "src/swift/Lesson2", resources: [
|
.executableTarget(name: "Lesson2", dependencies: [ "NeHe" ], path: "src/swift/Lesson2", resources:
|
||||||
.process("../../../data/shaders/lesson2.metallib") ]),
|
resources(shaders: [ "lesson2" ])),
|
||||||
.executableTarget(name: "Lesson3", dependencies: [ "NeHe" ], path: "src/swift/Lesson3", resources: [
|
.executableTarget(name: "Lesson3", dependencies: [ "NeHe" ], path: "src/swift/Lesson3", resources:
|
||||||
.process("../../../data/shaders/lesson3.metallib") ]),
|
resources(shaders: [ "lesson3" ])),
|
||||||
.executableTarget(name: "Lesson4", dependencies: [ "NeHe" ], path: "src/swift/Lesson4", resources: [
|
.executableTarget(name: "Lesson4", dependencies: [ "NeHe" ], path: "src/swift/Lesson4", resources:
|
||||||
.process("../../../data/shaders/lesson3.metallib") ]),
|
resources(shaders: [ "lesson3" ])),
|
||||||
.executableTarget(name: "Lesson5", dependencies: [ "NeHe" ], path: "src/swift/Lesson5", resources: [
|
.executableTarget(name: "Lesson5", dependencies: [ "NeHe" ], path: "src/swift/Lesson5", resources:
|
||||||
.process("../../../data/shaders/lesson3.metallib") ]),
|
resources(shaders: [ "lesson3" ])),
|
||||||
.executableTarget(name: "Lesson6", dependencies: [ "NeHe" ], path: "src/swift/Lesson6", resources: [
|
.executableTarget(name: "Lesson6", dependencies: [ "NeHe" ], path: "src/swift/Lesson6", resources:
|
||||||
.process("../../../data/shaders/lesson6.metallib"),
|
resources(shaders: [ "lesson6" ], data: [ "NeHe.bmp" ])),
|
||||||
.process("../../../data/NeHe.bmp") ]),
|
.executableTarget(name: "Lesson7", dependencies: [ "NeHe" ], path: "src/swift/Lesson7", resources:
|
||||||
.executableTarget(name: "Lesson7", dependencies: [ "NeHe" ], path: "src/swift/Lesson7", resources: [
|
resources(shaders: [ "lesson6", "lesson7" ], data: [ "Crate.bmp" ])),
|
||||||
.process("../../../data/shaders/lesson6.metallib"),
|
.executableTarget(name: "Lesson8", dependencies: [ "NeHe" ], path: "src/swift/Lesson8", resources:
|
||||||
.process("../../../data/shaders/lesson7.metallib"),
|
resources(shaders: [ "lesson7", "lesson8" ], data: [ "Glass.bmp" ])),
|
||||||
.process("../../../data/Crate.bmp") ]),
|
.executableTarget(name: "Lesson9", dependencies: [ "NeHe" ], path: "src/swift/Lesson9", resources:
|
||||||
.executableTarget(name: "Lesson8", dependencies: [ "NeHe" ], path: "src/swift/Lesson8", resources: [
|
resources(shaders: [ "lesson9" ], data: [ "Star.bmp" ])),
|
||||||
.process("../../../data/shaders/lesson7.metallib"),
|
.executableTarget(name: "Lesson10", dependencies: [ "NeHe" ], path: "src/swift/Lesson10", resources:
|
||||||
.process("../../../data/shaders/lesson8.metallib"),
|
resources(shaders: [ "lesson6" ], data: [ "Mud.bmp", "World.txt" ])),
|
||||||
.process("../../../data/Glass.bmp") ]),
|
]
|
||||||
.executableTarget(name: "Lesson9", dependencies: [ "NeHe" ], path: "src/swift/Lesson9", resources: [
|
|
||||||
.process("../../../data/shaders/lesson9.metallib"),
|
|
||||||
.process("../../../data/Star.bmp") ]),
|
|
||||||
.executableTarget(name: "Lesson10", dependencies: [ "NeHe" ], path: "src/swift/Lesson10", resources: [
|
|
||||||
.process("../../../data/shaders/lesson6.metallib"),
|
|
||||||
.process("../../../data/Mud.bmp"),
|
|
||||||
.process("../../../data/World.txt") ]),
|
|
||||||
],
|
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ struct Lesson10: AppDelegate
|
|||||||
var samplers = [OpaquePointer?](repeating: nil, count: 3)
|
var samplers = [OpaquePointer?](repeating: nil, count: 3)
|
||||||
var texture: OpaquePointer? = nil
|
var texture: OpaquePointer? = nil
|
||||||
|
|
||||||
var projection: matrix_float4x4 = .init(1.0)
|
var projection: simd_float4x4 = .init(1.0)
|
||||||
|
|
||||||
var blending = false
|
var blending = false
|
||||||
var filter = 0
|
var filter = 0
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ struct Lesson2: AppDelegate
|
|||||||
var pso: OpaquePointer? = nil
|
var pso: OpaquePointer? = nil
|
||||||
var vtxBuffer: OpaquePointer? = nil
|
var vtxBuffer: OpaquePointer? = nil
|
||||||
var idxBuffer: OpaquePointer? = nil
|
var idxBuffer: OpaquePointer? = nil
|
||||||
var projection: matrix_float4x4 = .init(1.0)
|
var projection: simd_float4x4 = .init(1.0)
|
||||||
|
|
||||||
mutating func `init`(ctx: inout NeHeContext) throws(NeHeError)
|
mutating func `init`(ctx: inout NeHeContext) throws(NeHeError)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ struct Lesson3: AppDelegate
|
|||||||
var pso: OpaquePointer? = nil
|
var pso: OpaquePointer? = nil
|
||||||
var vtxBuffer: OpaquePointer? = nil
|
var vtxBuffer: OpaquePointer? = nil
|
||||||
var idxBuffer: OpaquePointer? = nil
|
var idxBuffer: OpaquePointer? = nil
|
||||||
var projection: matrix_float4x4 = .init(1.0)
|
var projection: simd_float4x4 = .init(1.0)
|
||||||
|
|
||||||
mutating func `init`(ctx: inout NeHeContext) throws(NeHeError)
|
mutating func `init`(ctx: inout NeHeContext) throws(NeHeError)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ struct Lesson4: AppDelegate
|
|||||||
var pso: OpaquePointer? = nil
|
var pso: OpaquePointer? = nil
|
||||||
var vtxBuffer: OpaquePointer? = nil
|
var vtxBuffer: OpaquePointer? = nil
|
||||||
var idxBuffer: OpaquePointer? = nil
|
var idxBuffer: OpaquePointer? = nil
|
||||||
var projection: matrix_float4x4 = .init(1.0)
|
var projection: simd_float4x4 = .init(1.0)
|
||||||
|
|
||||||
var rotTri: Float = 0.0, rotQuad: Float = 0.0
|
var rotTri: Float = 0.0, rotQuad: Float = 0.0
|
||||||
|
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ struct Lesson5: AppDelegate
|
|||||||
var pso: OpaquePointer? = nil
|
var pso: OpaquePointer? = nil
|
||||||
var vtxBuffer: OpaquePointer? = nil
|
var vtxBuffer: OpaquePointer? = nil
|
||||||
var idxBuffer: OpaquePointer? = nil
|
var idxBuffer: OpaquePointer? = nil
|
||||||
var projection: matrix_float4x4 = .init(1.0)
|
var projection: simd_float4x4 = .init(1.0)
|
||||||
|
|
||||||
var rotTri: Float = 0.0, rotQuad: Float = 0.0
|
var rotTri: Float = 0.0, rotQuad: Float = 0.0
|
||||||
|
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ struct Lesson6: AppDelegate
|
|||||||
var idxBuffer: OpaquePointer? = nil
|
var idxBuffer: OpaquePointer? = nil
|
||||||
var sampler: OpaquePointer? = nil
|
var sampler: OpaquePointer? = nil
|
||||||
var texture: OpaquePointer? = nil
|
var texture: OpaquePointer? = nil
|
||||||
var projection: matrix_float4x4 = .init(1.0)
|
var projection: simd_float4x4 = .init(1.0)
|
||||||
|
|
||||||
var rot: SIMD3<Float> = .init(repeating: 0.0)
|
var rot: SIMD3<Float> = .init(repeating: 0.0)
|
||||||
|
|
||||||
@@ -217,7 +217,7 @@ struct Lesson6: AppDelegate
|
|||||||
|
|
||||||
// Push shader uniforms
|
// Push shader uniforms
|
||||||
var modelViewProj = self.projection * model
|
var modelViewProj = self.projection * model
|
||||||
SDL_PushGPUVertexUniformData(cmd, 0, &modelViewProj, UInt32(MemoryLayout<matrix_float4x4>.size))
|
SDL_PushGPUVertexUniformData(cmd, 0, &modelViewProj, UInt32(MemoryLayout<simd_float4x4>.size))
|
||||||
|
|
||||||
// Draw textured cube
|
// Draw textured cube
|
||||||
SDL_DrawGPUIndexedPrimitives(pass, UInt32(Self.indices.count), 1, 0, 0, 0)
|
SDL_DrawGPUIndexedPrimitives(pass, UInt32(Self.indices.count), 1, 0, 0, 0)
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ struct Lesson7: AppDelegate
|
|||||||
var idxBuffer: OpaquePointer? = nil
|
var idxBuffer: OpaquePointer? = nil
|
||||||
var samplers = [OpaquePointer?](repeating: nil, count: 3)
|
var samplers = [OpaquePointer?](repeating: nil, count: 3)
|
||||||
var texture: OpaquePointer? = nil
|
var texture: OpaquePointer? = nil
|
||||||
var projection: matrix_float4x4 = .init(1.0)
|
var projection: simd_float4x4 = .init(1.0)
|
||||||
|
|
||||||
struct Light { let ambient: SIMD4<Float>, diffuse: SIMD4<Float>, position: SIMD4<Float> }
|
struct Light { let ambient: SIMD4<Float>, diffuse: SIMD4<Float>, position: SIMD4<Float> }
|
||||||
|
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ struct Lesson8: AppDelegate
|
|||||||
var idxBuffer: OpaquePointer? = nil
|
var idxBuffer: OpaquePointer? = nil
|
||||||
var samplers = [OpaquePointer?](repeating: nil, count: 3)
|
var samplers = [OpaquePointer?](repeating: nil, count: 3)
|
||||||
var texture: OpaquePointer? = nil
|
var texture: OpaquePointer? = nil
|
||||||
var projection: matrix_float4x4 = .init(1.0)
|
var projection: simd_float4x4 = .init(1.0)
|
||||||
|
|
||||||
struct Light { let ambient: SIMD4<Float>, diffuse: SIMD4<Float>, position: SIMD4<Float> }
|
struct Light { let ambient: SIMD4<Float>, diffuse: SIMD4<Float>, position: SIMD4<Float> }
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ struct Lesson9: AppDelegate
|
|||||||
|
|
||||||
struct Instance
|
struct Instance
|
||||||
{
|
{
|
||||||
let model: matrix_float4x4
|
let model: simd_float4x4
|
||||||
let color: SIMD4<Float>
|
let color: SIMD4<Float>
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,7 +85,7 @@ struct Lesson9: AppDelegate
|
|||||||
var sampler: OpaquePointer? = nil
|
var sampler: OpaquePointer? = nil
|
||||||
var texture: OpaquePointer? = nil
|
var texture: OpaquePointer? = nil
|
||||||
|
|
||||||
var projection: matrix_float4x4 = .init(1.0)
|
var projection: simd_float4x4 = .init(1.0)
|
||||||
|
|
||||||
var twinkle = false
|
var twinkle = false
|
||||||
var stars: [Star] = []
|
var stars: [Star] = []
|
||||||
@@ -240,7 +240,7 @@ struct Lesson9: AppDelegate
|
|||||||
var instanceIDX = 0
|
var instanceIDX = 0
|
||||||
for (starIDX, star) in self.stars.enumerated()
|
for (starIDX, star) in self.stars.enumerated()
|
||||||
{
|
{
|
||||||
var model = matrix_float4x4.translation(.init(0.0, 0.0, self.zoom))
|
var model = simd_float4x4.translation(.init(0.0, 0.0, self.zoom))
|
||||||
model.rotate(angle: self.tilt, axis: .init(1.0, 0.0, 0.0))
|
model.rotate(angle: self.tilt, axis: .init(1.0, 0.0, 0.0))
|
||||||
model.rotate(angle: star.angle, axis: .init(0.0, 1.0, 0.0))
|
model.rotate(angle: star.angle, axis: .init(0.0, 1.0, 0.0))
|
||||||
model.translate(.init(star.distance, 0.0, 0.0))
|
model.translate(.init(star.distance, 0.0, 0.0))
|
||||||
@@ -305,7 +305,7 @@ struct Lesson9: AppDelegate
|
|||||||
SDL_BindGPUVertexStorageBuffers(renderPass, 0, &self.instanceBuffer, 1)
|
SDL_BindGPUVertexStorageBuffers(renderPass, 0, &self.instanceBuffer, 1)
|
||||||
|
|
||||||
// Push shader uniforms
|
// Push shader uniforms
|
||||||
SDL_PushGPUVertexUniformData(cmd, 0, &self.projection, UInt32(MemoryLayout<matrix_float4x4>.size))
|
SDL_PushGPUVertexUniformData(cmd, 0, &self.projection, UInt32(MemoryLayout<simd_float4x4>.size))
|
||||||
|
|
||||||
// Draw star instances
|
// Draw star instances
|
||||||
SDL_DrawGPUIndexedPrimitives(renderPass, UInt32(Self.indices.count), UInt32(numInstances), 0, 0, 0)
|
SDL_DrawGPUIndexedPrimitives(renderPass, UInt32(Self.indices.count), UInt32(numInstances), 0, 0, 0)
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
* SPDX-License-Identifier: Zlib
|
* SPDX-License-Identifier: Zlib
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import Foundation
|
||||||
import simd
|
import simd
|
||||||
|
|
||||||
public extension simd_float4x4
|
public extension simd_float4x4
|
||||||
|
|||||||
@@ -135,9 +135,9 @@ public extension NeHeContext
|
|||||||
info.format = SDL_GPU_SHADERFORMAT_SPIRV
|
info.format = SDL_GPU_SHADERFORMAT_SPIRV
|
||||||
return (
|
return (
|
||||||
try loadShader(bundle.url(forResource: name, withExtension: "vtx.spv"),
|
try loadShader(bundle.url(forResource: name, withExtension: "vtx.spv"),
|
||||||
info, SDL_GPU_SHADERSTAGE_VERTEX, "main"),
|
info, SDL_GPU_SHADERSTAGE_VERTEX, "VertexMain"),
|
||||||
try loadShader(bundle.url(forResource: name, withExtension: "frg.spv"),
|
try loadShader(bundle.url(forResource: name, withExtension: "frg.spv"),
|
||||||
info, SDL_GPU_SHADERSTAGE_FRAGMENT, "main"))
|
info, SDL_GPU_SHADERSTAGE_FRAGMENT, "FragmentMain"))
|
||||||
}
|
}
|
||||||
else if availableFormats & SDL_GPU_SHADERFORMAT_DXIL == SDL_GPU_SHADERFORMAT_DXIL
|
else if availableFormats & SDL_GPU_SHADERFORMAT_DXIL == SDL_GPU_SHADERFORMAT_DXIL
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user