Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 88 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ if(AUDIO_BACKEND STREQUAL "")
set(AUDIO_BACKEND "openal")
elseif(PLATFORM STREQUAL "ps2")
set(AUDIO_BACKEND "ps2")
elseif(PLATFORM STREQUAL "libretro")
set(AUDIO_BACKEND "miniaudio")
else()
set(AUDIO_BACKEND "miniaudio")
endif()
Expand Down Expand Up @@ -104,6 +106,8 @@ file(GLOB PLATFORM_SOURCES src/${PLATFORM}/*.c)

if(PLATFORM STREQUAL "android")
add_library(butterscotch SHARED ${SOURCES} ${PLATFORM_SOURCES} ${AUDIO_SOURCES})
elseif(PLATFORM STREQUAL "libretro")
add_library(butterscotch MODULE ${SOURCES} ${PLATFORM_SOURCES} ${AUDIO_SOURCES})
else()
add_executable(butterscotch ${SOURCES} ${PLATFORM_SOURCES} ${AUDIO_SOURCES})
endif()
Expand Down Expand Up @@ -684,6 +688,90 @@ elseif(PLATFORM STREQUAL "ps3")
# mojoal calls SDL atomics/threads, so SDL2 must link after it (static link order)
target_link_libraries(mojoal PUBLIC ${SDL2_LIBRARIES})
target_link_libraries(butterscotch PRIVATE ${SDL2_LIBRARIES} m gcm_sys rsx sysutil io audio rt lv2 io audio bzip2 stb_ds sha1 ps3gl mojoal stb_vorbis)
elseif(PLATFORM STREQUAL "libretro")
# bzip2 needs -fPIC for linking into shared library
set_target_properties(bzip2 PROPERTIES POSITION_INDEPENDENT_CODE ON)
set_target_properties(sha1 PROPERTIES POSITION_INDEPENDENT_CODE ON)

if(ENABLE_SW_RENDERER)
target_sources(butterscotch PRIVATE
src/sw/sw_renderer.c
src/desktop/stb_impl.c
)
target_include_directories(butterscotch PRIVATE
${CMAKE_SOURCE_DIR}/src/sw
)
else()
target_sources(butterscotch PRIVATE
src/gl/gl_renderer.c
src/gl_common/gl_common.c
src/libretro/libretro-common/glsm/glsm.c
src/libretro/libretro-common/glsym/rglgen.c
)

if(USING_GLES)
target_sources(butterscotch PRIVATE src/libretro/libretro-common/glsym/glsym_es3.c)
target_compile_definitions(butterscotch PRIVATE HAVE_OPENGLES HAVE_OPENGLES3)
find_library(GLES2_LIB GLESv2)
target_link_libraries(butterscotch PRIVATE ${GLES2_LIB})
target_compile_definitions(butterscotch PRIVATE GLclampd=GLclampf)
else()
target_sources(butterscotch PRIVATE src/libretro/libretro-common/glsym/glsym_gl.c)
target_compile_definitions(butterscotch PRIVATE HAVE_OPENGL)
find_package(OpenGL REQUIRED)
target_link_libraries(butterscotch PRIVATE OpenGL::GL)
endif()

set_source_files_properties(
src/libretro/libretro-common/glsm/glsm.c
PROPERTIES COMPILE_OPTIONS "-w"
)
target_include_directories(butterscotch PRIVATE
${CMAKE_SOURCE_DIR}/src/gl
${CMAKE_SOURCE_DIR}/src/gl_common
)

endif()
target_sources(butterscotch PRIVATE
src/image/image_decoder.c
src/desktop/stb_impl.c
)

target_include_directories(butterscotch PRIVATE
${CMAKE_SOURCE_DIR}/src/image
${CMAKE_SOURCE_DIR}/src/desktop
${CMAKE_SOURCE_DIR}/src/libretro
${CMAKE_SOURCE_DIR}/src/libretro/libretro-common/include
vendor/stb/image
vendor/stb/vorbis
)

# Rename output to butterscotch_libretro.so
set_target_properties(butterscotch PROPERTIES
PREFIX ""
OUTPUT_NAME "butterscotch_libretro"
)

# Version script for symbol visibility
target_link_options(butterscotch PRIVATE
-Wl,--version-script=${CMAKE_SOURCE_DIR}/src/libretro/link.T
-Wl,--no-undefined
)

# Libraries
find_library(DL_LIB dl)
find_library(ATOMIC_LIB atomic)

target_link_libraries(butterscotch PRIVATE bzip2 stb_ds sha1 m ${DL_LIB} ${AUDIO_LIBRARIES})
if(ATOMIC_LIB)
target_link_libraries(butterscotch PRIVATE ${ATOMIC_LIB})
endif()

target_compile_definitions(butterscotch PRIVATE
_GNU_SOURCE
_FILE_OFFSET_BITS=64
HAVE_LIBRETRO
)
else()
message(FATAL_ERROR "Unknown platform! ${PLATFORM}")
endif()
4 changes: 2 additions & 2 deletions src/gl/gl_renderer.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ static const char* baseFragmentShader =
// ===[ Runtime OpenGL extension checks ]===

static bool hasFBO() {
#if !defined(__EMSCRIPTEN__) && !defined(__ANDROID__)
#if !defined(__EMSCRIPTEN__) && !defined(__ANDROID__) && !defined(HAVE_LIBRETRO)
return glGenFramebuffers;
#else
return true;
Expand Down Expand Up @@ -279,7 +279,7 @@ static void glInit(Renderer* renderer, DataWin* dataWin) {
abort();
}

#if !defined(__EMSCRIPTEN__) && !defined(__ANDROID__)
#if !defined(__EMSCRIPTEN__) && !defined(__ANDROID__) && !defined(HAVE_LIBRETRO)
gl_init_wrappers();
#endif

Expand Down
2 changes: 1 addition & 1 deletion src/gl_common/gl_wrappers.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#if !defined(_BS_GL_WRAPPERS_H_) && !defined(__EMSCRIPTEN__) && !defined(PLATFORM_PS3) && !defined(__ANDROID__)
#if !defined(_BS_GL_WRAPPERS_H_) && !defined(__EMSCRIPTEN__) && !defined(PLATFORM_PS3) && !defined(__ANDROID__) && !defined(HAVE_LIBRETRO)
#define _BS_GL_WRAPPERS_H_

static inline void gl_init_wrappers(void) {
Expand Down
7 changes: 7 additions & 0 deletions src/libretro/glad/glad.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#include <glsm/glsmsym.h>
#define glDeleteFramebuffersEXT glDeleteFramebuffers
#define glFramebufferTexture2DEXT glFramebufferTexture2D
#define glBindFramebufferEXT glBindFramebuffer
#define glGenFramebuffersEXT glGenFramebuffers
#define glDeleteVertexArraysOES glDeleteVertexArrays
#define glGenVertexArraysOES glGenVertexArrays
Loading