resolve github #8
This commit is contained in:
parent
19e048b56a
commit
0bcb73c48d
3 changed files with 52 additions and 2 deletions
|
@ -13,13 +13,37 @@ pkg_search_module(XKBCOMMON REQUIRED xkbcommon)
|
||||||
pkg_search_module(LIBVA REQUIRED libva)
|
pkg_search_module(LIBVA REQUIRED libva)
|
||||||
pkg_search_module(LIBVA_DRM REQUIRED libva-drm)
|
pkg_search_module(LIBVA_DRM REQUIRED libva-drm)
|
||||||
|
|
||||||
|
add_executable(kmsvnc)
|
||||||
|
set(kmsvnc_SOURCES kmsvnc.c drm.c input.c keymap.c va.c drm_master.c)
|
||||||
|
|
||||||
include(CheckIncludeFiles)
|
include(CheckIncludeFiles)
|
||||||
CHECK_INCLUDE_FILES("linux/uinput.h;linux/dma-buf.h" HAVE_LINUX_API_HEADERS)
|
CHECK_INCLUDE_FILES("linux/uinput.h;linux/dma-buf.h" HAVE_LINUX_API_HEADERS)
|
||||||
IF(NOT HAVE_LINUX_API_HEADERS)
|
IF(NOT HAVE_LINUX_API_HEADERS)
|
||||||
message(FATAL_ERROR "linux-api-headers not found")
|
message(FATAL_ERROR "linux-api-headers not found")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
add_executable(kmsvnc kmsvnc.c drm.c input.c keymap.c va.c drm_master.c)
|
include(CheckSymbolExists)
|
||||||
|
check_symbol_exists(SYS_pidfd_getfd "sys/syscall.h" HAVE_LIBC_SYS_pidfd_getfd)
|
||||||
|
IF(NOT HAVE_LIBC_SYS_pidfd_getfd)
|
||||||
|
message(WARNING "pidfd_getfd syscall not found, the --screen-blank options will be disabled")
|
||||||
|
target_compile_options(kmsvnc PUBLIC -DDISABLE_KMSVNC_SCREEN_BLANK)
|
||||||
|
list(REMOVE_ITEM kmsvnc_SOURCES drm_master.c)
|
||||||
|
ENDIF()
|
||||||
|
include(CMakePushCheckState)
|
||||||
|
cmake_push_check_state()
|
||||||
|
set(CMAKE_REQUIRED_INCLUDES ${LIBDRM_INCLUDEDIR}/libdrm) # can't do anything about that
|
||||||
|
set(CMAKE_REQUIRED_LIBRARIES ${LIBDRM_LIBRARIES})
|
||||||
|
check_symbol_exists(drmGetFormatName "xf86drm.h" HAVE_LIBDRM_drmGetFormatName)
|
||||||
|
cmake_pop_check_state()
|
||||||
|
IF(NOT HAVE_LIBDRM_drmGetFormatName)
|
||||||
|
message(WARNING "drmGetFormatName not found, format name printing will be disabled")
|
||||||
|
target_compile_options(kmsvnc PUBLIC -DDISABLE_KMSVNC_drmGetFormatName)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
|
||||||
|
target_sources(kmsvnc PUBLIC
|
||||||
|
${kmsvnc_SOURCES}
|
||||||
|
)
|
||||||
target_include_directories(kmsvnc PUBLIC
|
target_include_directories(kmsvnc PUBLIC
|
||||||
${LIBDRM_INCLUDEDIR}
|
${LIBDRM_INCLUDEDIR}
|
||||||
${LIBDRM_INCLUDEDIR}/libdrm
|
${LIBDRM_INCLUDEDIR}/libdrm
|
||||||
|
|
26
drm.c
26
drm.c
|
@ -10,7 +10,25 @@
|
||||||
|
|
||||||
#include "drm.h"
|
#include "drm.h"
|
||||||
#include "va.h"
|
#include "va.h"
|
||||||
#include "drm_master.h"
|
|
||||||
|
#ifndef DISABLE_KMSVNC_SCREEN_BLANK
|
||||||
|
#include "drm_master.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef fourcc_mod_is_vendor
|
||||||
|
#define fourcc_mod_is_vendor(modifier, vendor) \
|
||||||
|
(fourcc_mod_get_vendor(modifier) == DRM_FORMAT_MOD_VENDOR_## vendor)
|
||||||
|
#endif
|
||||||
|
#ifdef DISABLE_KMSVNC_drmGetFormatName
|
||||||
|
static char* drmGetFormatName(uint32_t data) {
|
||||||
|
char *name = "missing drmGetFormatName";
|
||||||
|
char *out = malloc(strlen(name)+1);
|
||||||
|
if (out) {
|
||||||
|
memcpy(out, name, strlen(name)+1);
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
extern struct kmsvnc_data *kmsvnc;
|
extern struct kmsvnc_data *kmsvnc;
|
||||||
|
|
||||||
|
@ -165,6 +183,7 @@ void drm_sync_noop(int drmfd)
|
||||||
|
|
||||||
void drm_cleanup() {
|
void drm_cleanup() {
|
||||||
if (kmsvnc->drm) {
|
if (kmsvnc->drm) {
|
||||||
|
#ifndef DISABLE_KMSVNC_SCREEN_BLANK
|
||||||
if (kmsvnc->drm->gamma && kmsvnc->drm->gamma->size && kmsvnc->drm->gamma->red && kmsvnc->drm->gamma->green && kmsvnc->drm->gamma->blue) {
|
if (kmsvnc->drm->gamma && kmsvnc->drm->gamma->size && kmsvnc->drm->gamma->red && kmsvnc->drm->gamma->green && kmsvnc->drm->gamma->blue) {
|
||||||
if (drmModeCrtcSetGamma(kmsvnc->drm->drm_master_fd ?: kmsvnc->drm->drm_fd, kmsvnc->drm->plane->crtc_id, kmsvnc->drm->gamma->size, kmsvnc->drm->gamma->red, kmsvnc->drm->gamma->green, kmsvnc->drm->gamma->blue)) perror("Failed to restore gamma");
|
if (drmModeCrtcSetGamma(kmsvnc->drm->drm_master_fd ?: kmsvnc->drm->drm_fd, kmsvnc->drm->plane->crtc_id, kmsvnc->drm->gamma->size, kmsvnc->drm->gamma->red, kmsvnc->drm->gamma->green, kmsvnc->drm->gamma->blue)) perror("Failed to restore gamma");
|
||||||
}
|
}
|
||||||
|
@ -176,6 +195,7 @@ void drm_cleanup() {
|
||||||
free(kmsvnc->drm->gamma);
|
free(kmsvnc->drm->gamma);
|
||||||
kmsvnc->drm->gamma = NULL;
|
kmsvnc->drm->gamma = NULL;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if (kmsvnc->drm->drm_ver) {
|
if (kmsvnc->drm->drm_ver) {
|
||||||
drmFreeVersion(kmsvnc->drm->drm_ver);
|
drmFreeVersion(kmsvnc->drm->drm_ver);
|
||||||
kmsvnc->drm->drm_ver = NULL;
|
kmsvnc->drm->drm_ver = NULL;
|
||||||
|
@ -487,6 +507,7 @@ int drm_open() {
|
||||||
if (!kmsvnc->screen_blank && drmIsMaster(drm->drm_fd)) {
|
if (!kmsvnc->screen_blank && drmIsMaster(drm->drm_fd)) {
|
||||||
if (drmDropMaster(drm->drm_fd)) fprintf(stderr, "Failed to drop master");
|
if (drmDropMaster(drm->drm_fd)) fprintf(stderr, "Failed to drop master");
|
||||||
}
|
}
|
||||||
|
#ifndef DISABLE_KMSVNC_SCREEN_BLANK
|
||||||
if (kmsvnc->screen_blank && !drmIsMaster(drm->drm_fd)) {
|
if (kmsvnc->screen_blank && !drmIsMaster(drm->drm_fd)) {
|
||||||
drm->drm_master_fd = drm_get_master_fd();
|
drm->drm_master_fd = drm_get_master_fd();
|
||||||
drm->drm_master_fd = drm->drm_master_fd > 0 ? drm->drm_master_fd : 0;
|
drm->drm_master_fd = drm->drm_master_fd > 0 ? drm->drm_master_fd : 0;
|
||||||
|
@ -494,6 +515,7 @@ int drm_open() {
|
||||||
fprintf(stderr, "not master client, master fd %d\n", drm->drm_master_fd);
|
fprintf(stderr, "not master client, master fd %d\n", drm->drm_master_fd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
drm->drm_ver = drmGetVersion(drm->drm_fd);
|
drm->drm_ver = drmGetVersion(drm->drm_fd);
|
||||||
printf("drm driver is %s\n", drm->drm_ver->name);
|
printf("drm driver is %s\n", drm->drm_ver->name);
|
||||||
|
@ -506,6 +528,7 @@ int drm_open() {
|
||||||
|
|
||||||
if (drm_refresh_planes(1)) return 1;
|
if (drm_refresh_planes(1)) return 1;
|
||||||
|
|
||||||
|
#ifndef DISABLE_KMSVNC_SCREEN_BLANK
|
||||||
if (kmsvnc->screen_blank) {
|
if (kmsvnc->screen_blank) {
|
||||||
drm->gamma = malloc(sizeof(struct kmsvnc_drm_gamma_data));
|
drm->gamma = malloc(sizeof(struct kmsvnc_drm_gamma_data));
|
||||||
if (!drm->gamma) KMSVNC_FATAL("memory allocation error at %s:%d\n", __FILE__, __LINE__);
|
if (!drm->gamma) KMSVNC_FATAL("memory allocation error at %s:%d\n", __FILE__, __LINE__);
|
||||||
|
@ -565,6 +588,7 @@ int drm_open() {
|
||||||
target_crtc = NULL;
|
target_crtc = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
drm->mfb = drmModeGetFB2(drm->drm_fd, drm->plane->fb_id);
|
drm->mfb = drmModeGetFB2(drm->drm_fd, drm->plane->fb_id);
|
||||||
if (!drm->mfb) {
|
if (!drm->mfb) {
|
||||||
|
|
2
kmsvnc.c
2
kmsvnc.c
|
@ -241,8 +241,10 @@ static struct argp_option kmsvnc_main_options[] = {
|
||||||
{"input-height", 0xff07, "0", 0, "Explicitly set input height"},
|
{"input-height", 0xff07, "0", 0, "Explicitly set input height"},
|
||||||
{"input-offx", 0xff08, "0", 0, "Set input offset of x axis on a multi display system"},
|
{"input-offx", 0xff08, "0", 0, "Set input offset of x axis on a multi display system"},
|
||||||
{"input-offy", 0xff09, "0", 0, "Set input offset of y axis on a multi display system"},
|
{"input-offy", 0xff09, "0", 0, "Set input offset of y axis on a multi display system"},
|
||||||
|
#ifndef DISABLE_KMSVNC_SCREEN_BLANK
|
||||||
{"screen-blank", 0xff0a, 0, OPTION_ARG_OPTIONAL, "Blank screen with gamma set on crtc"},
|
{"screen-blank", 0xff0a, 0, OPTION_ARG_OPTIONAL, "Blank screen with gamma set on crtc"},
|
||||||
{"screen-blank-restore-linear", 0xff0b, 0, OPTION_ARG_OPTIONAL, "Restore linear values on exit in case of messed up gamma"},
|
{"screen-blank-restore-linear", 0xff0b, 0, OPTION_ARG_OPTIONAL, "Restore linear values on exit in case of messed up gamma"},
|
||||||
|
#endif
|
||||||
{"va-byteorder-swap", 0xff0c, 0, OPTION_ARG_OPTIONAL, "Force swap vaapi image rgb byteorder"},
|
{"va-byteorder-swap", 0xff0c, 0, OPTION_ARG_OPTIONAL, "Force swap vaapi image rgb byteorder"},
|
||||||
{"wakeup", 'w', 0, OPTION_ARG_OPTIONAL, "Move mouse to wake the system up before start"},
|
{"wakeup", 'w', 0, OPTION_ARG_OPTIONAL, "Move mouse to wake the system up before start"},
|
||||||
{"disable-input", 'i', 0, OPTION_ARG_OPTIONAL, "Disable uinput"},
|
{"disable-input", 'i', 0, OPTION_ARG_OPTIONAL, "Disable uinput"},
|
||||||
|
|
Loading…
Reference in a new issue