diff --git a/SConstruct b/SConstruct index 404cc4491f..9379278f6e 100644 --- a/SConstruct +++ b/SConstruct @@ -1,6 +1,7 @@ import os import subprocess import sys +import platform AddOption('--test', action='store_true', @@ -11,6 +12,8 @@ AddOption('--asan', help='turn on ASAN') arch = subprocess.check_output(["uname", "-m"], encoding='utf8').rstrip() +if platform.system() == "Darwin": + arch = "Darwin" if arch == "aarch64": lenv = { @@ -48,20 +51,33 @@ else: "#phonelibs/zmq/x64/include", "#external/tensorflow/include", ] - libpath = [ - "#phonelibs/capnp-cpp/x64/lib", - "#phonelibs/capnp-c/x64/lib", - "#phonelibs/yaml-cpp/x64/lib", - "#phonelibs/snpe/x86_64-linux-clang", - "#phonelibs/zmq/x64/lib", - "#phonelibs/libyuv/x64/lib", - "#external/zmq/lib", - "#external/tensorflow/lib", - "#cereal", - "#selfdrive/common", - "/usr/lib", - "/usr/local/lib", - ] + + if arch == "Darwin": + libpath = [ + "#phonelibs/capnp-cpp/mac/lib", + "#phonelibs/capnp-c/mac/lib", + "#phonelibs/yaml-cpp/mac/lib", + "#phonelibs/libyuv/mac/lib", + "#cereal", + "#selfdrive/common", + "/usr/local/lib", + "/System/Library/Frameworks/OpenGL.framework/Libraries", + ] + else: + libpath = [ + "#phonelibs/capnp-cpp/x64/lib", + "#phonelibs/capnp-c/x64/lib", + "#phonelibs/yaml-cpp/x64/lib", + "#phonelibs/snpe/x86_64-linux-clang", + "#phonelibs/zmq/x64/lib", + "#phonelibs/libyuv/x64/lib", + "#external/zmq/lib", + "#external/tensorflow/lib", + "#cereal", + "#selfdrive/common", + "/usr/lib", + "/usr/local/lib", + ] rpath = ["phonelibs/capnp-cpp/x64/lib", "external/tensorflow/lib", @@ -195,8 +211,10 @@ SConscript(['common/SConscript']) SConscript(['common/kalman/SConscript']) SConscript(['phonelibs/SConscript']) -SConscript(['selfdrive/modeld/SConscript']) -SConscript(['selfdrive/camerad/SConscript']) +if arch != "Darwin": + SConscript(['selfdrive/camerad/SConscript']) + SConscript(['selfdrive/modeld/SConscript']) + SConscript(['selfdrive/controls/lib/cluster/SConscript']) SConscript(['selfdrive/controls/lib/lateral_mpc/SConscript']) SConscript(['selfdrive/controls/lib/longitudinal_mpc/SConscript']) diff --git a/common/clock.pyx b/common/clock.pyx index fd9b669e99..654d53f8f0 100644 --- a/common/clock.pyx +++ b/common/clock.pyx @@ -1,6 +1,12 @@ -from posix.time cimport clock_gettime, timespec, CLOCK_BOOTTIME, CLOCK_MONOTONIC_RAW +from posix.time cimport clock_gettime, timespec, CLOCK_MONOTONIC_RAW, clockid_t -cdef double readclock(int clock_id): +IF UNAME_SYSNAME == "Darwin": + # Darwin doesn't have a CLOCK_BOOTTIME + CLOCK_BOOTTIME = CLOCK_MONOTONIC_RAW +ELSE: + from posix.time cimport CLOCK_BOOTTIME + +cdef double readclock(clockid_t clock_id): cdef timespec ts cdef double current @@ -8,9 +14,9 @@ cdef double readclock(int clock_id): current = ts.tv_sec + (ts.tv_nsec / 1000000000.) return current - def monotonic_time(): return readclock(CLOCK_MONOTONIC_RAW) def sec_since_boot(): return readclock(CLOCK_BOOTTIME) + diff --git a/selfdrive/boardd/boardd_setup.py b/selfdrive/boardd/boardd_setup.py index f987c7aa29..1da81997c3 100644 --- a/selfdrive/boardd/boardd_setup.py +++ b/selfdrive/boardd/boardd_setup.py @@ -1,4 +1,5 @@ import subprocess +import platform from distutils.core import Extension, setup from Cython.Build import cythonize @@ -10,14 +11,24 @@ import os PHONELIBS = os.path.join(BASEDIR, 'phonelibs') ARCH = subprocess.check_output(["uname", "-m"], encoding='utf8').rstrip() -ARCH_DIR = 'x64' if ARCH == "x86_64" else 'aarch64' + +if ARCH == "x86_64": + if platform.system() == "Darwin": + libraries = ['can_list_to_can_capnp', 'capnp', 'kj'] + ARCH_DIR = 'mac' + else: + libraries = [':libcan_list_to_can_capnp.a', ':libcapnp.a', ':libkj.a'] + ARCH_DIR = 'x64' +else: + libraries = [':libcan_list_to_can_capnp.a', 'capnp', 'kj'] + ARCH_DIR = 'aarch64' setup(name='Boardd API Implementation', cmdclass={'build_ext': BuildExtWithoutPlatformSuffix}, ext_modules=cythonize( Extension( "boardd_api_impl", - libraries=[':libcan_list_to_can_capnp.a', ':libcapnp.a', ':libkj.a'] if ARCH == "x86_64" else [':libcan_list_to_can_capnp.a', 'capnp', 'kj'], + libraries=libraries, library_dirs=[ './', PHONELIBS + '/capnp-cpp/' + ARCH_DIR + '/lib/', diff --git a/selfdrive/common/framebuffer.h b/selfdrive/common/framebuffer.h index 52c60d8ec7..45920b8e42 100644 --- a/selfdrive/common/framebuffer.h +++ b/selfdrive/common/framebuffer.h @@ -1,8 +1,6 @@ #ifndef FRAMEBUFFER_H #define FRAMEBUFFER_H -#include - #ifdef __cplusplus extern "C" { #endif diff --git a/selfdrive/common/glutil.c b/selfdrive/common/glutil.c index d118dd8af6..e208891e2b 100644 --- a/selfdrive/common/glutil.c +++ b/selfdrive/common/glutil.c @@ -1,8 +1,6 @@ #include #include -#include - #include "glutil.h" GLuint load_shader(GLenum shaderType, const char *src) { diff --git a/selfdrive/common/glutil.h b/selfdrive/common/glutil.h index 68d6cfa630..d907b09e78 100644 --- a/selfdrive/common/glutil.h +++ b/selfdrive/common/glutil.h @@ -1,8 +1,21 @@ #ifndef COMMON_GLUTIL_H #define COMMON_GLUTIL_H -#include +#ifdef __APPLE__ + #include +#else + #include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + GLuint load_shader(GLenum shaderType, const char *src); GLuint load_program(const char *vert_src, const char *frag_src); +#ifdef __cplusplus +} +#endif + #endif diff --git a/selfdrive/common/util.h b/selfdrive/common/util.h index b3ca916941..ed0c88f2c8 100644 --- a/selfdrive/common/util.h +++ b/selfdrive/common/util.h @@ -3,6 +3,10 @@ #include +#ifndef sighandler_t +typedef void (*sighandler_t)(int sig); +#endif + #ifndef __cplusplus #define min(a,b) \ diff --git a/selfdrive/common/visionimg.h b/selfdrive/common/visionimg.h index 1cc0cb0ac1..e5eb78766a 100644 --- a/selfdrive/common/visionimg.h +++ b/selfdrive/common/visionimg.h @@ -2,11 +2,16 @@ #define VISIONIMG_H #include "common/visionbuf.h" +#include "common/glutil.h" -#include +#ifdef QCOM #include #include #undef Status +#else +typedef int EGLImageKHR; +typedef void *EGLClientBuffer; +#endif #ifdef __cplusplus extern "C" { diff --git a/selfdrive/locationd/paramsd.cc b/selfdrive/locationd/paramsd.cc index 6109c271c3..aa7e299a72 100644 --- a/selfdrive/locationd/paramsd.cc +++ b/selfdrive/locationd/paramsd.cc @@ -20,6 +20,7 @@ #include "locationd_yawrate.h" #include "params_learner.h" +#include "common/util.h" void sigpipe_handler(int sig) { LOGE("SIGPIPE received"); diff --git a/selfdrive/locationd/ubloxd_main.cc b/selfdrive/locationd/ubloxd_main.cc index 497b69820c..6554ba7794 100644 --- a/selfdrive/locationd/ubloxd_main.cc +++ b/selfdrive/locationd/ubloxd_main.cc @@ -19,6 +19,7 @@ #include #include "cereal/gen/cpp/log.capnp.h" +#include "common/util.h" #include "common/params.h" #include "common/swaglog.h" #include "common/timing.h" diff --git a/selfdrive/ui/SConscript b/selfdrive/ui/SConscript index ad96cb0a4d..5dbf8016dd 100644 --- a/selfdrive/ui/SConscript +++ b/selfdrive/ui/SConscript @@ -1,15 +1,17 @@ Import('env', 'arch', 'common', 'messaging', 'gpucommon', 'visionipc', 'cereal') src = ['ui.cc', 'paint.cc', '#phonelibs/nanovg/nanovg.c'] -libs = [common, 'zmq', 'czmq', 'capnp', 'capnp_c', 'm', cereal, 'json', messaging, 'OpenCL', gpucommon, visionipc] +libs = [common, 'zmq', 'czmq', 'capnp', 'capnp_c', 'm', cereal, 'json', messaging, gpucommon, visionipc] if arch == "aarch64": src += ['sound.cc', 'slplay.c'] - libs += ['EGL', 'GLESv3', 'gnustl_shared', 'log', 'utils', 'gui', 'hardware', 'ui', 'CB', 'gsl', 'adreno_utils', 'OpenSLES', 'cutils', 'uuid'] + libs += ['EGL', 'GLESv3', 'gnustl_shared', 'log', 'utils', 'gui', 'hardware', 'ui', 'CB', 'gsl', 'adreno_utils', 'OpenSLES', 'cutils', 'uuid', 'OpenCL'] + linkflags = ['-Wl,-rpath=/system/lib64,-rpath=/system/comma/usr/lib'] else: src += ['linux.cc'] - libs += ['EGL', 'pthread', 'X11-xcb', 'xcb', 'X11', 'glfw'] + libs += ['pthread', 'glfw'] + linkflags = [] env.Program('_ui', src, - LINKFLAGS=['-Wl,-rpath=/system/lib64,-rpath=/system/comma/usr/lib'], + LINKFLAGS=linkflags, LIBS=libs) diff --git a/selfdrive/ui/linux.cc b/selfdrive/ui/linux.cc index 62531e356d..14ecfd6190 100644 --- a/selfdrive/ui/linux.cc +++ b/selfdrive/ui/linux.cc @@ -6,19 +6,18 @@ #include "ui.hpp" +#ifndef __APPLE__ #define GLFW_INCLUDE_ES2 +#else +#define GLFW_INCLUDE_GLCOREARB +#endif + #define GLFW_INCLUDE_GLEXT #include typedef struct FramebufferState FramebufferState; typedef struct TouchState TouchState; -#define FALSE 0 -#define TRUE 1 - -#include -#include - extern "C" { FramebufferState* framebuffer_init( @@ -90,7 +89,7 @@ GLuint visionimg_to_gl(const VisionImg *img, EGLImageKHR *pkhr, void **pph) { glBindTexture(GL_TEXTURE_2D, texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, *pph); glGenerateMipmap(GL_TEXTURE_2D); - *pkhr = (EGLImageKHR *)1; // not NULL + *pkhr = (EGLImageKHR)1; // not NULL return texture; } diff --git a/selfdrive/ui/paint.cc b/selfdrive/ui/paint.cc index 0728a5eab3..d1a511f17a 100644 --- a/selfdrive/ui/paint.cc +++ b/selfdrive/ui/paint.cc @@ -951,7 +951,7 @@ static const mat4 full_to_wide_frame_transform = {{ void ui_nvg_init(UIState *s) { // init drawing - s->vg = nvgCreateGLES3(NVG_ANTIALIAS | NVG_STENCIL_STROKES | NVG_DEBUG); + s->vg = nvgCreate(NVG_ANTIALIAS | NVG_STENCIL_STROKES | NVG_DEBUG); assert(s->vg); s->font_courbd = nvgCreateFont(s->vg, "courbd", "../assets/fonts/courbd.ttf"); diff --git a/selfdrive/ui/ui.hpp b/selfdrive/ui/ui.hpp index e520f6eae4..b418a2ac29 100644 --- a/selfdrive/ui/ui.hpp +++ b/selfdrive/ui/ui.hpp @@ -1,13 +1,24 @@ #ifndef _UI_H #define _UI_H +#ifdef __APPLE__ +#include +#define NANOVG_GL3_IMPLEMENTATION +#define nvgCreate nvgCreateGL3 +#else #include #include +#define NANOVG_GLES3_IMPLEMENTATION +#define nvgCreate nvgCreateGLES3 +#endif + +#include #include "nanovg.h" #include "common/mat.h" #include "common/visionipc.h" +#include "common/visionimg.h" #include "common/framebuffer.h" #include "common/modeldata.h" #include "messaging.hpp" @@ -141,8 +152,6 @@ typedef struct UIState { // framebuffer FramebufferState *fb; int fb_w, fb_h; - EGLDisplay display; - EGLSurface surface; // NVG NVGcontext *vg;