From 5dd43ad674da23a86067f6b484d9467d15573b5b Mon Sep 17 00:00:00 2001 From: Hyenadae Date: Sat, 16 May 2020 15:30:27 -0400 Subject: [PATCH] OSX_BUILD cleaned commit --- Makefile | 42 +++++++++++++------- include/PR/os_libc.h | 5 +++ lib/src/ldiv.c | 2 + lib/src/math/cosf.c | 3 ++ src/pc/gfx/gfx_opengl.c | 30 +++++++++++--- src/pc/gfx/gfx_sdl2.c | 24 ++++++----- tools/Makefile | 9 ++++- tools/n64graphics_ci_dir/exoquant/exoquant.c | 6 ++- 8 files changed, 89 insertions(+), 32 deletions(-) diff --git a/Makefile b/Makefile index 91049539..19f42e56 100644 --- a/Makefile +++ b/Makefile @@ -22,8 +22,9 @@ TARGET_N64 = 0 # Build and optimize for Raspberry Pi(s) TARGET_RPI ?= 0 -# Compiler to use (ido or gcc) -COMPILER ?= ido + +# Makeflag to enable OSX fixes +OSX_BUILD ?= 0 # Disable better camera by default BETTERCAMERA ?= 0 @@ -141,6 +142,10 @@ ifeq ($(TARGET_RPI),1) # Define RPi to change SDL2 title & GLES2 hints VERSION_CFLAGS += -DUSE_GLES endif +ifeq ($(OSX_BUILD),1) # Modify GFX & SDL2 for OSX GL + VERSION_CFLAGS += -DOSX_BUILD +endif + VERSION_ASFLAGS := --defsym AVOID_UB=1 COMPARE := 0 @@ -167,7 +172,7 @@ endif endif # Make tools if out of date -DUMMY != make -s -C tools >&2 || echo FAIL +DUMMY != make -C tools >&2 || echo FAIL ifeq ($(DUMMY),FAIL) $(error Failed to build tools) endif @@ -228,10 +233,6 @@ GODDARD_SRC_DIRS := src/goddard src/goddard/dynlists MIPSISET := -mips2 MIPSBIT := -32 -ifeq ($(COMPILER),gcc) - MIPSISET := -mips3 -endif - ifeq ($(VERSION),eu) OPT_FLAGS := -O2 else @@ -250,9 +251,8 @@ ifeq ($(TARGET_WEB),1) endif # Use a default opt flag for gcc, then override if RPi -ifeq ($(COMPILER),gcc) -OPT_FLAGS := -O2 # Breaks sound on x86? -endif +# OPT_FLAGS := -O2 # -O2 opt breaks sound on x86? + ifeq ($(TARGET_RPI),1) machine = $(shell sh -c 'uname -m 2>/dev/null || echo unknown') @@ -415,6 +415,10 @@ ENDIAN_BITWIDTH := $(BUILD_DIR)/endian-and-bitwidth AS := as +ifeq ($(OSX_BUILD),1) +AS := i686-w64-mingw32-as +endif + ifneq ($(TARGET_WEB),1) # As in, not-web PC port CC := $(CROSS)gcc CXX := $(CROSS)g++ @@ -431,11 +435,19 @@ endif ifeq ($(WINDOWS_BUILD),1) # fixes compilation in MXE on Linux and WSL CPP := cpp -P OBJCOPY := objcopy + OBJDUMP := $(CROSS)objdump else +ifeq ($(OSX_BUILD),1) + CPP := cpp-9 -P + OBJDUMP := i686-w64-mingw32-objdump + OBJCOPY := i686-w64-mingw32-objcopy +else # Linux & other builds CPP := $(CROSS)cpp -P OBJCOPY := $(CROSS)objcopy + OBJDUMP := $(CROSS)objdump endif -OBJDUMP := $(CROSS)objdump +endif + PYTHON := python3 SDLCONFIG := $(CROSS)sdl2-config @@ -498,9 +510,12 @@ else ifeq ($(TARGET_RPI),1) # Linux / Other builds below LDFLAGS := $(OPT_FLAGS) -lm -lGLESv2 `$(SDLCONFIG) --libs` -no-pie else +ifeq ($(OSX_BUILD),1) +LDFLAGS := -lm -framework OpenGL `$(SDLCONFIG) --libs` -no-pie -lpthread `pkg-config --libs libusb-1.0 glfw3 glew` +else LDFLAGS := $(BITS) -march=$(TARGET_ARCH) -lm -lGL `$(SDLCONFIG) --libs` -no-pie -lpthread endif - +endif # End of LDFLAGS # Prevent a crash with -sopt export LANG := C @@ -711,7 +726,6 @@ $(BUILD_DIR)/assets/mario_anim_data.c: $(wildcard assets/anims/*.inc.c) $(BUILD_DIR)/assets/demo_data.c: assets/demo_data.json $(wildcard assets/demos/*.bin) $(PYTHON) tools/demo_data_converter.py assets/demo_data.json $(VERSION_CFLAGS) > $@ -ifeq ($(COMPILER),ido) # Source code $(BUILD_DIR)/levels/%/leveldata.o: OPT_FLAGS := -g $(BUILD_DIR)/actors/%.o: OPT_FLAGS := -g @@ -753,8 +767,6 @@ $(BUILD_DIR)/src/audio/%.acpp: src/audio/%.c $(BUILD_DIR)/src/audio/%.copt: $(BUILD_DIR)/src/audio/%.acpp $(QEMU_IRIX) -silent -L $(IRIX_ROOT) $(IRIX_ROOT)/usr/lib/copt -signed -I=$< -CMP=$@ -cp=i -scalaroptimize=1 endif -endif - # Rebuild files with 'GLOBAL_ASM' if the NON_MATCHING flag changes. $(GLOBAL_ASM_O_FILES): $(GLOBAL_ASM_DEP).$(NON_MATCHING) diff --git a/include/PR/os_libc.h b/include/PR/os_libc.h index 94111c0b..987abefe 100644 --- a/include/PR/os_libc.h +++ b/include/PR/os_libc.h @@ -3,8 +3,13 @@ #include "ultratypes.h" +#ifdef OSX_BUILD +#include // OSX doesn't like it not being included? +#else + // Old deprecated functions from strings.h, replaced by memcpy/memset. extern void bcopy(const void *, void *, size_t); extern void bzero(void *, size_t); +#endif #endif /* !_OS_LIBC_H_ */ diff --git a/lib/src/ldiv.c b/lib/src/ldiv.c index 01b04be2..b7c28efa 100644 --- a/lib/src/ldiv.c +++ b/lib/src/ldiv.c @@ -1,6 +1,7 @@ #include "libultra_internal.h" #include +#ifndef OSX_BUILD lldiv_t lldiv(long long num, long long denom) { lldiv_t ret; @@ -13,6 +14,7 @@ lldiv_t lldiv(long long num, long long denom) { return ret; } +#endif // OSX_BUILD cannot use this ldiv_t ldiv(long num, long denom) { ldiv_t ret; diff --git a/lib/src/math/cosf.c b/lib/src/math/cosf.c index 2b01c12a..f1130b44 100644 --- a/lib/src/math/cosf.c +++ b/lib/src/math/cosf.c @@ -33,6 +33,7 @@ static const du pilo = { static const fu zero = {0.0}; extern const fu NAN; +#ifndef OSX_BUILD float cosf(float x) { double dx; // double x @@ -92,3 +93,5 @@ float cosf(float x) return zero.f; } +#endif // OSX_BUILD cannot use this + diff --git a/src/pc/gfx/gfx_opengl.c b/src/pc/gfx/gfx_opengl.c index b7067e91..1e323a1a 100644 --- a/src/pc/gfx/gfx_opengl.c +++ b/src/pc/gfx/gfx_opengl.c @@ -18,12 +18,19 @@ #include #define GL_GLEXT_PROTOTYPES 1 #include + #else #include #define GL_GLEXT_PROTOTYPES 1 + +#ifdef OSX_BUILD +#include +#else #include #endif +#endif + #include "gfx_cc.h" #include "gfx_rendering_api.h" @@ -49,7 +56,7 @@ static bool gfx_opengl_z_is_from_0_to_1(void) { static void gfx_opengl_vertex_array_set_attribs(struct ShaderProgram *prg) { size_t num_floats = prg->num_floats; size_t pos = 0; - + for (int i = 0; i < prg->num_attribs; i++) { glEnableVertexAttribArray(prg->attrib_locations[i]); glVertexAttribPointer(prg->attrib_locations[i], prg->attrib_sizes[i], GL_FLOAT, GL_FALSE, num_floats * sizeof(float), (void *)(pos * sizeof(float))); @@ -179,15 +186,19 @@ static struct ShaderProgram *gfx_opengl_create_and_load_new_shader(uint32_t shad bool do_multiply[2] = {c[0][1] == 0 && c[0][3] == 0, c[1][1] == 0 && c[1][3] == 0}; bool do_mix[2] = {c[0][1] == c[0][3], c[1][1] == c[1][3]}; bool color_alpha_same = (shader_id & 0xfff) == ((shader_id >> 12) & 0xfff); - + char vs_buf[1024]; char fs_buf[1024]; size_t vs_len = 0; size_t fs_len = 0; size_t num_floats = 4; - + // Vertex shader +#ifdef OSX_BUILD + append_line(vs_buf, &vs_len, ""); +#else append_line(vs_buf, &vs_len, "#version 100"); +#endif append_line(vs_buf, &vs_len, "attribute vec4 aVtxPos;"); if (used_textures[0] || used_textures[1]) { append_line(vs_buf, &vs_len, "attribute vec2 aTexCoord;"); @@ -216,10 +227,15 @@ static struct ShaderProgram *gfx_opengl_create_and_load_new_shader(uint32_t shad } append_line(vs_buf, &vs_len, "gl_Position = aVtxPos;"); append_line(vs_buf, &vs_len, "}"); - + // Fragment shader +#ifdef OSX_BUILD + append_line(fs_buf, &fs_len, ""); +#else append_line(fs_buf, &fs_len, "#version 100"); append_line(fs_buf, &fs_len, "precision mediump float;"); +#endif + if (used_textures[0] || used_textures[1]) { append_line(fs_buf, &fs_len, "varying vec2 vTexCoord;"); } @@ -464,7 +480,11 @@ static void gfx_opengl_init(void) { #if FOR_WINDOWS glewInit(); #endif - + +#ifdef OSX_BUILD + glewInit(); +#endif + glGenBuffers(1, &opengl_vbo); glBindBuffer(GL_ARRAY_BUFFER, opengl_vbo); diff --git a/src/pc/gfx/gfx_sdl2.c b/src/pc/gfx/gfx_sdl2.c index e7018476..309de78b 100644 --- a/src/pc/gfx/gfx_sdl2.c +++ b/src/pc/gfx/gfx_sdl2.c @@ -13,9 +13,15 @@ #else #include #define GL_GLEXT_PROTOTYPES 1 + +#ifdef OSX_BUILD +#include +#else #include #endif +#endif // End of OS-Specific GL defines + #include "gfx_window_manager_api.h" #include "gfx_screen_config.h" #include "../configfile.h" @@ -30,7 +36,7 @@ static bool cur_fullscreen; static uint32_t cur_width, cur_height; const SDL_Scancode windows_scancode_table[] = -{ +{ /* 0 1 2 3 4 5 6 7 */ /* 8 9 A B C D E F */ SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_ESCAPE, SDL_SCANCODE_1, SDL_SCANCODE_2, SDL_SCANCODE_3, SDL_SCANCODE_4, SDL_SCANCODE_5, SDL_SCANCODE_6, /* 0 */ @@ -53,7 +59,7 @@ const SDL_Scancode windows_scancode_table[] = SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_F13, SDL_SCANCODE_F14, SDL_SCANCODE_F15, SDL_SCANCODE_F16, /* 6 */ SDL_SCANCODE_F17, SDL_SCANCODE_F18, SDL_SCANCODE_F19, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, /* 6 */ - + SDL_SCANCODE_INTERNATIONAL2, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_INTERNATIONAL1, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, /* 7 */ SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_INTERNATIONAL4, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_INTERNATIONAL5, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_INTERNATIONAL3, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN /* 7 */ }; @@ -98,16 +104,16 @@ static void gfx_sdl_init(void) { Uint32 window_flags = 0; SDL_Init(SDL_INIT_VIDEO); - + SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); #ifdef USE_GLES SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); // These attributes allow for hardware acceleration on RPis. - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); #endif - + //SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); //SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4); @@ -122,9 +128,9 @@ static void gfx_sdl_init(void) { } SDL_DisplayMode sdl_displaymode; - SDL_GetCurrentDisplayMode(0, &sdl_displaymode); + SDL_GetCurrentDisplayMode(0, &sdl_displaymode); - const char* window_title = + const char* window_title = #ifndef USE_GLES "Super Mario 64 PC port (OpenGL)"; #else @@ -140,10 +146,10 @@ static void gfx_sdl_init(void) { DESIRED_SCREEN_WIDTH, DESIRED_SCREEN_HEIGHT, window_flags); SDL_ShowCursor(SDL_ENABLE); } - + SDL_GL_CreateContext(wnd); SDL_GL_SetSwapInterval(1); // We have a double buffered GL context, it makes no sense to want tearing. - + for (size_t i = 0; i < sizeof(windows_scancode_table) / sizeof(SDL_Scancode); i++) { inverted_scancode_table[windows_scancode_table[i]] = i; } diff --git a/tools/Makefile b/tools/Makefile index 467b8d4c..1809ab92 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -1,5 +1,10 @@ +UNAME := $(shell uname) +ifeq ($(UNAME),Darwin) + OSX_BUILD := -DOSX_BUILD +endif + CC := gcc -CFLAGS := -Llib -Iinclude -I . -Wall -Wextra -Wno-unused-parameter -pedantic -std=c99 -O3 -s +CFLAGS := -Llib -Iinclude -I . -Wall -Wextra -Wno-unused-parameter $(OSX_BUILD) -pedantic -std=c99 -O3 -s PROGRAMS := n64graphics n64graphics_ci mio0 n64cksum textconv patch_libultra_math iplfontutil aifc_decode aiff_extract_codebook vadpcm_enc tabledesign extract_data_for_mio skyconv n64graphics_SOURCES := n64graphics.c utils.c @@ -43,7 +48,7 @@ clean: define COMPILE $(1): $($1_SOURCES) - $(CC) $(CFLAGS) $$^ -lm -o $$@ $($1_CFLAGS) + $(CC) $(CFLAGS) $(OSX_BUILD) $$^ -lm -o $$@ $($1_CFLAGS) endef $(foreach p,$(PROGRAMS),$(eval $(call COMPILE,$(p)))) diff --git a/tools/n64graphics_ci_dir/exoquant/exoquant.c b/tools/n64graphics_ci_dir/exoquant/exoquant.c index 9f33c066..a70bc038 100644 --- a/tools/n64graphics_ci_dir/exoquant/exoquant.c +++ b/tools/n64graphics_ci_dir/exoquant/exoquant.c @@ -23,7 +23,11 @@ SOFTWARE. */ #include "exoquant.h" + +#ifndef OSX_BUILD // OSX build cannot have malloc defined #include +#endif + #include #include #include @@ -705,4 +709,4 @@ exq_float exq_sort_by_dir(const exq_histogram *pHist) pHist->color.g * exq_sort_dir.g + pHist->color.b * exq_sort_dir.b + pHist->color.a * exq_sort_dir.a; -} \ No newline at end of file +}