Packages
3D rendering on the graphics card for the BEAM: Metal on macOS, Vulkan on Linux and Windows, driven by a scene described from Elixir.
Current section
Files
Jump to
Current section
Files
cauldron_gpu
Makefile.win
Makefile.win
!IFNDEF PRIV_DIR
PRIV_DIR = priv
!ENDIF
OUT = $(PRIV_DIR:/=\)
BUILD = _build\native\windows
!IF !DEFINED(VULKAN_INCLUDE) && DEFINED(VULKAN_SDK)
VULKAN_INCLUDE = $(VULKAN_SDK)\Include
!ENDIF
!IF DEFINED(CAULDRON_GPU_SKIP)
NATIVE_READY = no
SKIP_REASON = setup chose software drawing
!ELSEIF !DEFINED(VULKAN_INCLUDE) || !DEFINED(SDL3_DIR)
NATIVE_READY = no
SKIP_REASON = Vulkan's headers or SDL3 were not found
!ELSEIF !EXIST("$(VULKAN_INCLUDE)\vulkan\vulkan.hpp") || !EXIST("$(SDL3_DIR)\include\SDL3\SDL.h")
NATIVE_READY = no
SKIP_REASON = VULKAN_INCLUDE or SDL3_DIR does not hold the headers
!ELSE
NATIVE_READY = yes
!ENDIF
!IF "$(NATIVE_READY)" == "yes"
CXXFLAGS = /nologo /std:c++20 /O2 /EHsc /MD /W4 /DCG_HAVE_VULKAN /DNOMINMAX /DWIN32_LEAN_AND_MEAN \
/I"$(ERTS_INCLUDE_DIR)" /I"$(SDL3_DIR)\include" /I"$(VULKAN_INCLUDE)" /Ic_src\vulkan\vma
LIBS = "$(SDL3_DIR)\lib\x64\SDL3.lib"
all: $(OUT) $(BUILD) objects $(OUT)\cauldron_gpu.dll $(OUT)\cauldron_gpu_host.exe runtime
$(OUT):
if not exist $(OUT) mkdir $(OUT)
$(BUILD):
if not exist $(BUILD)\core mkdir $(BUILD)\core
if not exist $(BUILD)\vulkan mkdir $(BUILD)\vulkan
if not exist $(BUILD)\host mkdir $(BUILD)\host
objects:
cl $(CXXFLAGS) /c c_src\core\*.cpp /Fo"$(BUILD)\core\\"
cl $(CXXFLAGS) /w /c c_src\vulkan\vma.cpp /Fo"$(BUILD)\vulkan\vma.obj"
cl $(CXXFLAGS) /c c_src\vulkan\backend.cpp c_src\vulkan\accel.cpp c_src\vulkan\barriers.cpp c_src\vulkan\bindless.cpp \
c_src\vulkan\commands.cpp c_src\vulkan\device.cpp c_src\vulkan\dispatch.cpp c_src\vulkan\formats.cpp c_src\vulkan\frames.cpp \
c_src\vulkan\instance.cpp c_src\vulkan\pipelines.cpp c_src\vulkan\resources.cpp c_src\vulkan\swapchain.cpp \
c_src\vulkan\timing.cpp c_src\vulkan\upscaler.cpp /Fo"$(BUILD)\vulkan\\"
cl $(CXXFLAGS) /c c_src\host\*.cpp /Fo"$(BUILD)\host\\"
$(OUT)\cauldron_gpu.dll: objects
link /nologo /DLL /OUT:$@ $(BUILD)\core\*.obj $(BUILD)\vulkan\*.obj $(LIBS) delayimp.lib /DELAYLOAD:SDL3.dll
$(OUT)\cauldron_gpu_host.exe: objects
if exist $(BUILD)\nif.obj del /Q $(BUILD)\nif.obj
move /Y $(BUILD)\core\nif.obj $(BUILD)\nif.obj
link /nologo /OUT:$@ $(BUILD)\core\*.obj $(BUILD)\vulkan\*.obj $(BUILD)\host\*.obj $(LIBS)
move /Y $(BUILD)\nif.obj $(BUILD)\core\nif.obj
runtime:
copy /Y "$(SDL3_DIR)\lib\x64\SDL3.dll" $(OUT)\SDL3.dll
!ELSE
all:
!IF DEFINED(CAULDRON_GPU_SKIP)
if exist $(OUT)\cauldron_gpu.dll del /Q $(OUT)\cauldron_gpu.dll
if exist $(OUT)\cauldron_gpu_host.exe del /Q $(OUT)\cauldron_gpu_host.exe
!ENDIF
@echo cauldron_gpu: $(SKIP_REASON), so the renderer was not built; games draw in software, and mix cauldron_gpu.setup sets it up
!ENDIF
clean:
if exist $(BUILD) rmdir /S /Q $(BUILD)
if exist $(OUT)\cauldron_gpu.* del /Q $(OUT)\cauldron_gpu.*
if exist $(OUT)\cauldron_gpu_host.* del /Q $(OUT)\cauldron_gpu_host.*
if exist $(OUT)\SDL3.dll del /Q $(OUT)\SDL3.dll