53 lines
1.0 KiB
Odin
53 lines
1.0 KiB
Odin
package engine
|
|
|
|
import "core:fmt"
|
|
import "core:os"
|
|
import sdl "vendor:sdl3"
|
|
|
|
choose_shader_runtime :: proc(device: ^sdl.GPUDevice) -> (Shader_Runtime, bool) {
|
|
supported := sdl.GetGPUShaderFormats(device)
|
|
|
|
if .MSL in supported {
|
|
return {
|
|
backend = .Metal_MSL,
|
|
format = {.MSL},
|
|
shader_dir = "shaders/metal",
|
|
entrypoint = "main",
|
|
},
|
|
true
|
|
|
|
}
|
|
if .DXIL in supported {
|
|
return {
|
|
backend = .DSD12_DXIL,
|
|
format = {.DXIL},
|
|
shader_dir = "shaders/d3d12",
|
|
entrypoint = "main",
|
|
},
|
|
true
|
|
|
|
}
|
|
if .SPIRV in supported {
|
|
return {
|
|
backend = .Vulkan_SPIRV,
|
|
format = {.SPIRV},
|
|
shader_dir = "shaders/vulkan",
|
|
entrypoint = "main",
|
|
},
|
|
true
|
|
}
|
|
|
|
fmt.eprintfln("No supported shader format from device {got %v}", supported)
|
|
return {}, false
|
|
}
|
|
|
|
load_shader_blob :: proc(path: string) -> ([]u8, bool) {
|
|
data, err := os.read_entire_file(path, context.allocator)
|
|
if err != nil {
|
|
fmt.eprintfln("failed to read shader %s: %v", path, err)
|
|
return nil, false
|
|
}
|
|
|
|
return data, true
|
|
}
|