Got rid of SDL

This commit is contained in:
CharlesThobe 2021-12-16 19:55:30 +02:00
parent c9d1275ce9
commit 4dc4854935
4 changed files with 240 additions and 2 deletions

View File

@ -21,4 +21,4 @@ set_property(TARGET chdman PROPERTY CXX_STANDARD 17)
#target_link_libraries(ocore_sdl PRIVATE SDL2)
target_link_libraries(chdman PRIVATE utils expat 7z ocore_sdl zlib flac utf8proc
dl rt SDL2 m pthread util)
dl rt m pthread util)

View File

@ -18,7 +18,7 @@ ${CMAKE_SOURCE_DIR}/src/osd/osdsync.cpp
${CMAKE_SOURCE_DIR}/src/osd/osdsync.h
${CMAKE_SOURCE_DIR}/src/osd/modules/osdmodule.cpp
${CMAKE_SOURCE_DIR}/src/osd/modules/osdmodule.h
${CMAKE_SOURCE_DIR}/src/osd/modules/lib/osdlib_unix.cpp
${CMAKE_SOURCE_DIR}/src/osd/modules/lib/osdlib_unix_mod.cpp
${CMAKE_SOURCE_DIR}/src/osd/modules/lib/osdlib.h
${CMAKE_SOURCE_DIR}/src/osd/modules/file/posixdir.cpp
${CMAKE_SOURCE_DIR}/src/osd/modules/file/posixfile.cpp

View File

@ -0,0 +1,235 @@
// license:BSD-3-Clause
// copyright-holders:Olivier Galibert, R. Belmont
//============================================================
//
// sdlos_*.c - OS specific low level code
//
// SDLMAME by Olivier Galibert and R. Belmont
//
//============================================================
// MAME headers
#include "osdcore.h"
#include "osdlib.h"
#include <SDL2/SDL.h>
#include <csignal>
#include <cstdio>
#include <cstdlib>
#include <iomanip>
#include <memory>
#include <dlfcn.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <unistd.h>
//============================================================
// osd_getenv
//============================================================
const char *osd_getenv(const char *name)
{
return getenv(name);
}
//============================================================
// osd_setenv
//============================================================
int osd_setenv(const char *name, const char *value, int overwrite)
{
return setenv(name, value, overwrite);
}
//============================================================
// osd_process_kill
//============================================================
void osd_process_kill()
{
kill(getpid(), SIGKILL);
}
//============================================================
// osd_break_into_debugger
//============================================================
void osd_break_into_debugger(const char *message)
{
#ifdef MAME_DEBUG
printf("MAME exception: %s\n", message);
printf("Attempting to fall into debugger\n");
kill(getpid(), SIGTRAP);
#else
printf("Ignoring MAME exception: %s\n", message);
#endif
}
#ifdef SDLMAME_ANDROID
std::string osd_get_clipboard_text()
{
return std::string();
}
#else
//============================================================
// osd_get_clipboard_text
//============================================================
/*std::string osd_get_clipboard_text()
{
std::string result;
if (SDL_HasClipboardText())
{
char *temp = SDL_GetClipboardText();
result.assign(temp);
SDL_free(temp);
}
return result;
}*/
#endif
//============================================================
// osd_getpid
//============================================================
int osd_getpid()
{
return getpid();
}
namespace osd {
namespace {
class dynamic_module_posix_impl : public dynamic_module
{
public:
dynamic_module_posix_impl(std::vector<std::string> &&libraries) : m_libraries(std::move(libraries))
{
}
virtual ~dynamic_module_posix_impl() override
{
if (m_module)
dlclose(m_module);
}
protected:
virtual generic_fptr_t get_symbol_address(char const *symbol) override
{
/*
* given a list of libraries, if a first symbol is successfully loaded from
* one of them, all additional symbols will be loaded from the same library
*/
if (m_module)
return reinterpret_cast<generic_fptr_t>(dlsym(m_module, symbol));
for (auto const &library : m_libraries)
{
void *const module = dlopen(library.c_str(), RTLD_LAZY);
if (module != nullptr)
{
generic_fptr_t const function = reinterpret_cast<generic_fptr_t>(dlsym(module, symbol));
if (function)
{
m_module = module;
return function;
}
else
{
dlclose(module);
}
}
}
return nullptr;
}
private:
std::vector<std::string> m_libraries;
void * m_module = nullptr;
};
} // anonymous namespace
bool invalidate_instruction_cache(void const *start, std::size_t size)
{
#if !defined(SDLMAME_EMSCRIPTEN)
char const *const begin(reinterpret_cast<char const *>(start));
char const *const end(begin + size);
__builtin___clear_cache(const_cast<char *>(begin), const_cast<char *>(end));
#endif
return true;
}
void *virtual_memory_allocation::do_alloc(std::initializer_list<std::size_t> blocks, unsigned intent, std::size_t &size, std::size_t &page_size)
{
long const p(sysconf(_SC_PAGE_SIZE));
if (0 >= p)
return nullptr;
std::size_t s(0);
for (std::size_t b : blocks)
s += (b + p - 1) / p;
s *= p;
if (!s)
return nullptr;
#if defined __NetBSD__
int req((NONE == intent) ? PROT_NONE : 0);
if (intent & READ)
req |= PROT_READ;
if (intent & WRITE)
req |= PROT_WRITE;
if (intent & EXECUTE)
req |= PROT_EXEC;
int const prot(PROT_MPROTECT(req));
#else
int const prot(PROT_NONE);
#endif
#if defined(SDLMAME_BSD) || defined(SDLMAME_MACOSX) || defined(SDLMAME_EMSCRIPTEN)
int const fd(-1);
#else
// TODO: portable applications are supposed to use -1 for anonymous mappings - detect whatever requires 0 specifically
int const fd(0);
#endif
void *const result(mmap(nullptr, s, prot, MAP_ANON | MAP_SHARED, fd, 0));
if (result == (void *)-1)
return nullptr;
size = s;
page_size = p;
return result;
}
void virtual_memory_allocation::do_free(void *start, std::size_t size)
{
munmap(reinterpret_cast<char *>(start), size);
}
bool virtual_memory_allocation::do_set_access(void *start, std::size_t size, unsigned access)
{
int prot((NONE == access) ? PROT_NONE : 0);
if (access & READ)
prot |= PROT_READ;
if (access & WRITE)
prot |= PROT_WRITE;
if (access & EXECUTE)
prot |= PROT_EXEC;
return mprotect(reinterpret_cast<char *>(start), size, prot) == 0;
}
dynamic_module::ptr dynamic_module::open(std::vector<std::string> &&names)
{
return std::make_unique<dynamic_module_posix_impl>(std::move(names));
}
} // namespace osd

View File

@ -0,0 +1,3 @@
[1/3] Building CXX object cmake_subdirs/ocore_sdl/CMakeFiles/ocore_sdl.dir/__/__/src/osd/modules/lib/osdlib_unix_mod.cpp.o
[2/3] Linking CXX static library cmake_subdirs/ocore_sdl/libocore_sdl.a
[3/3] Linking CXX executable chdman