Files

91 lines
3.3 KiB
CMake

cmake_minimum_required(VERSION 3.20)
# ---------------------------------------------------------------------------
# wpywdlss native bridge
#
# A small C++ shim that lets the Java/Fabric side talk to NVIDIA Streamline/NGX
# over Vulkan, sharing textures with Minecraft's OpenGL context via Win32
# external memory + semaphores.
#
# Phase 0 scope: bring up a Vulkan device and PROVE the interop capabilities we
# need actually exist on this machine. No NVIDIA headers required yet -- the
# Streamline/NGX integration is added in phase 2 (see STREAMLINE_SDK_DIR below).
# ---------------------------------------------------------------------------
project(wpywdlss_bridge LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
# --- JDK for jni.h ---------------------------------------------------------
# Prefer an explicit -DJAVA_HOME=... otherwise fall back to the environment.
if(NOT DEFINED JAVA_HOME)
if(DEFINED ENV{JAVA_HOME})
set(JAVA_HOME "$ENV{JAVA_HOME}")
else()
message(FATAL_ERROR "JAVA_HOME is not set and -DJAVA_HOME= was not given")
endif()
endif()
message(STATUS "JAVA_HOME = ${JAVA_HOME}")
# --- Vulkan headers + import library --------------------------------------
# Both are vendored/generated by tools/make_vulkan_lib.cmd; no LunarG SDK needed.
set(VULKAN_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/vulkan/include")
set(VULKAN_LIB_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/vulkan/lib")
if(NOT EXISTS "${VULKAN_INCLUDE_DIR}/vulkan/vulkan.h")
message(FATAL_ERROR "Vulkan headers missing at ${VULKAN_INCLUDE_DIR}/vulkan")
endif()
if(NOT EXISTS "${VULKAN_LIB_DIR}/vulkan-1.lib")
message(FATAL_ERROR "vulkan-1.lib missing. Run native/tools/make_vulkan_lib.cmd first.")
endif()
# --- optional Streamline / NGX (phase 2) ----------------------------------
# Point -DSTREAMLINE_SDK_DIR=D:/Download/streamline-sdk-v2.14.1 to enable the
# DLSS code paths. Left optional so phase 0 builds without it.
set(STREAMLINE_SDK_DIR "" CACHE PATH "Path to the extracted NVIDIA Streamline SDK")
add_library(wpywdlss_bridge SHARED
src/dlss_bridge.cpp
src/gl_probe.cpp
)
target_include_directories(wpywdlss_bridge PRIVATE
"${VULKAN_INCLUDE_DIR}"
"${JAVA_HOME}/include"
"${JAVA_HOME}/include/win32"
)
target_link_directories(wpywdlss_bridge PRIVATE "${VULKAN_LIB_DIR}")
# vulkan-1 for the compute/interop device, opengl32 for the GL side of the bridge.
target_link_libraries(wpywdlss_bridge PRIVATE vulkan-1 opengl32)
if(STREAMLINE_SDK_DIR)
message(STATUS "Streamline SDK enabled: ${STREAMLINE_SDK_DIR}")
target_include_directories(wpywdlss_bridge PRIVATE "${STREAMLINE_SDK_DIR}/include")
target_compile_definitions(wpywdlss_bridge PRIVATE WPYWDLSS_HAVE_STREAMLINE=1)
else()
message(STATUS "Streamline SDK not configured -- phase 0 (Vulkan probe) only")
endif()
target_compile_definitions(wpywdlss_bridge PRIVATE
VK_USE_PLATFORM_WIN32_KHR
WIN32_LEAN_AND_MEAN
NOMINMAX
)
# The DLL is loaded from a jar at runtime, so keep it self-contained.
set_target_properties(wpywdlss_bridge PROPERTIES
PREFIX ""
OUTPUT_NAME "wpywdlss_bridge"
)
if(MSVC)
target_compile_options(wpywdlss_bridge PRIVATE /W4 /permissive- /utf-8)
target_link_options(wpywdlss_bridge PRIVATE /INCREMENTAL:NO)
endif()