diff options
-rw-r--r-- | CMakeLists.txt | 9 | ||||
-rw-r--r-- | config.h.in | 1 | ||||
-rw-r--r-- | kms++/CMakeLists.txt | 7 | ||||
-rw-r--r-- | kms++/inc/kms++/omap/omapframebuffer.h | 5 | ||||
-rw-r--r-- | kms++/src/omap/omapcard.cpp | 6 | ||||
-rw-r--r-- | kms++/src/omap/omapframebuffer.cpp | 54 | ||||
-rw-r--r-- | py/pykms/CMakeLists.txt | 3 | ||||
-rw-r--r-- | py/pykms/pykms.cpp | 6 |
8 files changed, 42 insertions, 49 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 57088bc..73b610e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,7 @@ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) include(CheckCXXCompilerFlag) +include(CheckSymbolExists) IF(NOT CMAKE_BUILD_TYPE) message(STATUS "Setting build type to 'Release' as none was specified.") @@ -66,10 +67,7 @@ endif() find_package(PkgConfig REQUIRED) pkg_check_modules(LIBDRM libdrm>=2.4.64 REQUIRED) -pkg_check_modules(LIBDRM_OMAP libdrm_omap) -if(LIBDRM_OMAP_FOUND) - add_definitions(-DHAS_LIBDRM_OMAP) -endif() +check_symbol_exists(DRM_IOCTL_OMAP_GEM_NEW "stdint.h;drm/omap_drm.h" HAVE_OMAP_DRM) enable_testing() @@ -86,3 +84,6 @@ if(KMSXX_ENABLE_PYTHON) endif() add_custom_target(docs SOURCES "README.md") + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in + ${CMAKE_CURRENT_BINARY_DIR}/config.h) diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..641d4bb --- /dev/null +++ b/config.h.in @@ -0,0 +1 @@ +#cmakedefine HAVE_OMAP_DRM 1 diff --git a/kms++/CMakeLists.txt b/kms++/CMakeLists.txt index 10352a2..66b4286 100644 --- a/kms++/CMakeLists.txt +++ b/kms++/CMakeLists.txt @@ -1,13 +1,10 @@ include_directories(${LIBDRM_INCLUDE_DIRS}) link_directories(${LIBDRM_LIBRARY_DIRS}) -include_directories(${LIBDRM_OMAP_INCLUDE_DIRS}) -link_directories(${LIBDRM_OMAP_LIBRARY_DIRS}) - file(GLOB SRCS "src/*.cpp" "src/*.h") file(GLOB PUB_HDRS "inc/kms++/*.h") -if(LIBDRM_OMAP_FOUND) +if(HAVE_OMAP_DRM) file(GLOB OMAP_SRCS "src/omap/*.cpp" "src/omap/*.h") file(GLOB OMAP_PUB_HDRS "inc/kms++/omap/*.h") @@ -22,7 +19,7 @@ target_include_directories(kms++ PUBLIC $<INSTALL_INTERFACE:include> PRIVATE src) -target_link_libraries(kms++ ${LIBDRM_LIBRARIES} ${LIBDRM_OMAP_LIBRARIES}) +target_link_libraries(kms++ ${LIBDRM_LIBRARIES}) set_target_properties(kms++ PROPERTIES PUBLIC_HEADER "${PUB_HDRS}") diff --git a/kms++/inc/kms++/omap/omapframebuffer.h b/kms++/inc/kms++/omap/omapframebuffer.h index 16d6cf8..9b628f4 100644 --- a/kms++/inc/kms++/omap/omapframebuffer.h +++ b/kms++/inc/kms++/omap/omapframebuffer.h @@ -3,8 +3,6 @@ #include <kms++/mappedframebuffer.h> #include <kms++/pixelformats.h> -struct omap_bo; - namespace kms { class OmapCard; @@ -30,10 +28,7 @@ public: int prime_fd(unsigned plane); private: - OmapCard& m_omap_card; - struct FramebufferPlane { - struct omap_bo* omap_bo; uint32_t handle; int prime_fd; uint32_t size; diff --git a/kms++/src/omap/omapcard.cpp b/kms++/src/omap/omapcard.cpp index e811b6d..7b78cde 100644 --- a/kms++/src/omap/omapcard.cpp +++ b/kms++/src/omap/omapcard.cpp @@ -1,10 +1,6 @@ #include <kms++/omap/omapcard.h> -extern "C" { -#include <omap_drmif.h> -} - using namespace std; namespace kms @@ -18,12 +14,10 @@ OmapCard::OmapCard() OmapCard::OmapCard(const string& device) : Card(device) { - m_omap_dev = omap_device_new(fd()); } OmapCard::~OmapCard() { - omap_device_del(m_omap_dev); } } diff --git a/kms++/src/omap/omapframebuffer.cpp b/kms++/src/omap/omapframebuffer.cpp index e1e2234..312552c 100644 --- a/kms++/src/omap/omapframebuffer.cpp +++ b/kms++/src/omap/omapframebuffer.cpp @@ -9,14 +9,11 @@ #include <drm_fourcc.h> #include <drm.h> #include <drm_mode.h> +#include <drm/omap_drm.h> #include <kms++/kms++.h> #include <kms++/omap/omapkms++.h> -extern "C" { -#include <omap_drmif.h> -} - using namespace std; namespace kms @@ -28,7 +25,7 @@ OmapFramebuffer::OmapFramebuffer(OmapCard& card, uint32_t width, uint32_t height } OmapFramebuffer::OmapFramebuffer(OmapCard& card, uint32_t width, uint32_t height, PixelFormat format) - : MappedFramebuffer(card, width, height), m_omap_card(card), m_format(format) + : MappedFramebuffer(card, width, height), m_format(format) { Create(); } @@ -48,20 +45,19 @@ void OmapFramebuffer::Create() const PixelFormatPlaneInfo& pi = format_info.planes[i]; FramebufferPlane& plane = m_planes[i]; - uint32_t flags = OMAP_BO_SCANOUT | OMAP_BO_WC; - - uint32_t size = width() * height() * pi.bitspp / 8; - - struct omap_bo* bo = omap_bo_new(m_omap_card.dev(), size, flags); - if (!bo) - throw invalid_argument(string("omap_bo_new failed: ") + strerror(errno)); - - uint32_t stride = width() * pi.bitspp / 8; - - plane.omap_bo = bo; - plane.handle = omap_bo_handle(bo); + uint32_t stride = (width() * pi.bitspp + 7) / 8; + uint32_t size = stride * height(); + struct drm_omap_gem_new creq = { + .size = { .bytes = size }, + .flags = OMAP_BO_SCANOUT | OMAP_BO_WC, + }; + int r = drmIoctl(card().fd(), DRM_IOCTL_OMAP_GEM_NEW, &creq); + if (r) + throw invalid_argument(string("DRM_IOCTL_OMAP_GEM_NEW failed: ") + strerror(errno)); + + plane.handle = creq.handle; plane.stride = stride; - plane.size = omap_bo_size(bo); + plane.size = size; plane.offset = 0; plane.map = 0; plane.prime_fd = -1; @@ -91,7 +87,8 @@ void OmapFramebuffer::Destroy() if (plane.map) munmap(plane.map, plane.size); - omap_bo_del(plane.omap_bo); + struct drm_gem_close dreq = { .handle = plane.handle }; + drmIoctl(card().fd(), DRM_IOCTL_GEM_CLOSE, &dreq); if (plane.prime_fd >= 0) ::close(plane.prime_fd); @@ -105,7 +102,13 @@ uint8_t* OmapFramebuffer::map(unsigned plane) if (p.map) return p.map; - p.map = (uint8_t*)omap_bo_map(p.omap_bo); + struct drm_omap_gem_info mreq = { .handle = p.handle }; + int r = drmIoctl(card().fd(), DRM_IOCTL_OMAP_GEM_INFO, &mreq); + if (r) + throw invalid_argument(string("DRM_IOCTL_OMAP_GEM_INFO failed: ") + strerror(errno)); + + p.map = (uint8_t *)mmap(0, p.size, PROT_READ | PROT_WRITE, MAP_SHARED, + card().fd(), mreq.offset); if (p.map == MAP_FAILED) throw invalid_argument(string("mmap failed: ") + strerror(errno)); @@ -119,13 +122,12 @@ int OmapFramebuffer::prime_fd(unsigned int plane) if (p.prime_fd >= 0) return p.prime_fd; - int fd = omap_bo_dmabuf(p.omap_bo); - if (fd < 0) - throw std::runtime_error("omap_bo_dmabuf failed\n"); - - p.prime_fd = fd; + int r = drmPrimeHandleToFD(card().fd(), p.handle, DRM_CLOEXEC | O_RDWR, + &p.prime_fd); + if (r) + throw std::runtime_error("drmPrimeHandleToFD failed"); - return fd; + return p.prime_fd; } } diff --git a/py/pykms/CMakeLists.txt b/py/pykms/CMakeLists.txt index 505c0c3..56a9c35 100644 --- a/py/pykms/CMakeLists.txt +++ b/py/pykms/CMakeLists.txt @@ -1,3 +1,4 @@ +include_directories(${PROJECT_BINARY_DIR}) # for config.h include_directories(${LIBDRM_INCLUDE_DIRS}) link_directories(${LIBDRM_LIBRARY_DIRS}) @@ -12,7 +13,7 @@ include_directories(${PROJECT_SOURCE_DIR}/ext/pybind11/include) set(SRCS pykms.cpp pykmsbase.cpp pykmsutil.cpp pyvid.cpp) -if(LIBDRM_OMAP_FOUND) +if(HAVE_OMAP_DRM) set(SRCS ${SRCS} pykmsomap.cpp) endif() diff --git a/py/pykms/pykms.cpp b/py/pykms/pykms.cpp index 7752f19..819093e 100644 --- a/py/pykms/pykms.cpp +++ b/py/pykms/pykms.cpp @@ -2,6 +2,8 @@ #include <pybind11/stl.h> #include <kms++/kms++.h> +#include "config.h" + namespace py = pybind11; using namespace kms; @@ -11,7 +13,7 @@ void init_pykmstest(py::module &m); void init_pykmsbase(py::module &m); void init_pyvid(py::module &m); -#if HAS_LIBDRM_OMAP +#if HAVE_OMAP_DRM void init_pykmsomap(py::module &m); #endif @@ -29,7 +31,7 @@ PYBIND11_PLUGIN(pykms) { init_pyvid(m); -#if HAS_LIBDRM_OMAP +#if HAVE_OMAP_DRM init_pykmsomap(m); #endif return m.ptr(); |