diff --git a/CMakeLists.txt b/CMakeLists.txt index 8364b3d7..faa0596b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,6 +49,7 @@ SET(obs-stream-effects_HEADERS "${PROJECT_BINARY_DIR}/source/version.h" "${PROJECT_SOURCE_DIR}/source/strings.h" "${PROJECT_SOURCE_DIR}/source/util-math.h" + "${PROJECT_SOURCE_DIR}/source/util-memory.h" ) SET(obs-stream-effects_SOURCES "${PROJECT_SOURCE_DIR}/source/plugin.cpp" @@ -67,6 +68,7 @@ SET(obs-stream-effects_SOURCES "${PROJECT_SOURCE_DIR}/source/gs-vertexbuffer.cpp" "${PROJECT_SOURCE_DIR}/source/gs-mipmapper.cpp" "${PROJECT_SOURCE_DIR}/source/util-math.cpp" + "${PROJECT_SOURCE_DIR}/source/util-memory.cpp" ) SET(obs-stream-effects_LOCALE "${PROJECT_SOURCE_DIR}/data/locale/en-US.ini" diff --git a/source/util-memory.cpp b/source/util-memory.cpp new file mode 100644 index 00000000..d472fb57 --- /dev/null +++ b/source/util-memory.cpp @@ -0,0 +1,47 @@ +/* +* Modern effects for a modern Streamer +* Copyright (C) 2017 Michael Fabian Dirks +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +*/ + +#include "util-memory.h" +#include + +inline size_t aligned_offset(size_t align, size_t size) { + return ((size / align) + 1) * align; +} + +void* util::aligned_malloc(size_t align, size_t size) { + // Ensure that we have space for the pointer and the data. + size_t asize = aligned_offset(align, size + sizeof(void*)); + + // Allocate memory and store integer representation of pointer. + void* ptr = malloc(asize); + + // Calculate actual aligned position + intptr_t ptr_off = aligned_offset(align, reinterpret_cast(ptr)+sizeof(void*)); + + // Store actual pointer at ptr_off - sizeof(void*). + *reinterpret_cast(ptr_off - sizeof(void*)) = reinterpret_cast(ptr); + + // Return aligned pointer + return reinterpret_cast(ptr_off); +} + +void util::free_aligned(void* mem) { + void* ptr = reinterpret_cast(*reinterpret_cast(static_cast(mem)-sizeof(void*))); + free(ptr); +} diff --git a/source/util-memory.h b/source/util-memory.h new file mode 100644 index 00000000..a7e65831 --- /dev/null +++ b/source/util-memory.h @@ -0,0 +1,25 @@ +/* + * Modern effects for a modern Streamer + * Copyright (C) 2017 Michael Fabian Dirks + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#pragma once + +namespace util { + void* aligned_malloc(size_t align, size_t size); + void free_aligned(void* mem); +}; \ No newline at end of file