From 75ed160122bc923731ae1d005d789608a4cdb2fb Mon Sep 17 00:00:00 2001 From: dec05eba Date: Fri, 7 Apr 2023 05:31:46 +0200 Subject: Implement kms vaapi capture --- include/capture/kms_vaapi.h | 18 ++++++++++++++++++ include/kms/kms_client.h | 21 +++++++++++++++++++++ include/kms/kms_shared.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ include/library_loader.h | 31 +++---------------------------- include/time.h | 6 ------ include/utils.h | 26 ++++++++++++++++++++++++++ 6 files changed, 113 insertions(+), 34 deletions(-) create mode 100644 include/capture/kms_vaapi.h create mode 100644 include/kms/kms_client.h create mode 100644 include/kms/kms_shared.h delete mode 100644 include/time.h create mode 100644 include/utils.h (limited to 'include') diff --git a/include/capture/kms_vaapi.h b/include/capture/kms_vaapi.h new file mode 100644 index 0000000..5cf8606 --- /dev/null +++ b/include/capture/kms_vaapi.h @@ -0,0 +1,18 @@ +#ifndef GSR_CAPTURE_KMS_VAAPI_H +#define GSR_CAPTURE_KMS_VAAPI_H + +#include "capture.h" +#include "../vec2.h" +#include + +typedef struct _XDisplay Display; + +typedef struct { + Display *dpy; + const char *display_to_capture; /* if this is "screen", then the entire x11 screen is captured (all displays). A copy is made of this */ + const char *program_dir; /* ref */ +} gsr_capture_kms_vaapi_params; + +gsr_capture* gsr_capture_kms_vaapi_create(const gsr_capture_kms_vaapi_params *params); + +#endif /* GSR_CAPTURE_KMS_VAAPI_H */ diff --git a/include/kms/kms_client.h b/include/kms/kms_client.h new file mode 100644 index 0000000..bb4325b --- /dev/null +++ b/include/kms/kms_client.h @@ -0,0 +1,21 @@ +#ifndef GSR_KMS_CLIENT_H +#define GSR_KMS_CLIENT_H + +#include "kms_shared.h" +#include + +typedef struct { + pid_t kms_server_pid; + int socket_fd; + int client_fd; + char socket_path[27]; + char *card_path; +} gsr_kms_client; + +/* |card_path| should be a path to card, for example /dev/dri/card0 */ +int gsr_kms_client_init(gsr_kms_client *self, const char *card_path, const char *program_dir); +void gsr_kms_client_deinit(gsr_kms_client *self); + +int gsr_kms_client_get_kms(gsr_kms_client *self, gsr_kms_response *response); + +#endif /* #define GSR_KMS_CLIENT_H */ diff --git a/include/kms/kms_shared.h b/include/kms/kms_shared.h new file mode 100644 index 0000000..f63c2f3 --- /dev/null +++ b/include/kms/kms_shared.h @@ -0,0 +1,45 @@ +#ifndef GSR_KMS_SHARED_H +#define GSR_KMS_SHARED_H + +#include + +typedef enum { + KMS_REQUEST_TYPE_GET_KMS +} gsr_kms_request_type; + +typedef enum { + KMS_RESULT_OK, + KMS_RESULT_INVALID_REQUEST, + KMS_RESULT_FAILED_TO_OPEN_CARD, + KMS_RESULT_INSUFFICIENT_PERMISSIONS, + KMS_RESULT_FAILED_TO_GET_KMS, + KMS_RESULT_NO_KMS_AVAILABLE, + KMS_RESULT_FAILED_TO_SEND +} gsr_kms_result; + +typedef struct { + int type; /* gsr_kms_request_type */ + union { + char card_path[255]; + } data; +} gsr_kms_request; + +typedef struct { + int fd; + uint32_t width; + uint32_t height; + uint32_t pitch; + uint32_t offset; + uint32_t pixel_format; + uint64_t modifier; +} gsr_kms_response_fd; + +typedef struct { + int result; /* gsr_kms_result */ + union { + char err_msg[128]; + gsr_kms_response_fd fd; + } data; +} gsr_kms_response; + +#endif /* #define GSR_KMS_SHARED_H */ diff --git a/include/library_loader.h b/include/library_loader.h index 1622521..47bc9f0 100644 --- a/include/library_loader.h +++ b/include/library_loader.h @@ -1,42 +1,17 @@ #ifndef GSR_LIBRARY_LOADER_H #define GSR_LIBRARY_LOADER_H -#include #include -#include typedef struct { void **func; const char *name; } dlsym_assign; -static void* dlsym_print_fail(void *handle, const char *name, bool required) { - dlerror(); - void *sym = dlsym(handle, name); - char *err_str = dlerror(); - - if(!sym) - fprintf(stderr, "%s: dlsym(handle, \"%s\") failed, error: %s\n", required ? "error" : "warning", name, err_str ? err_str : "(null)"); - - return sym; -} - +void* dlsym_print_fail(void *handle, const char *name, bool required); /* |dlsyms| should be null terminated */ -static bool dlsym_load_list(void *handle, const dlsym_assign *dlsyms) { - bool success = true; - for(int i = 0; dlsyms[i].func; ++i) { - *dlsyms[i].func = dlsym_print_fail(handle, dlsyms[i].name, true); - if(!*dlsyms[i].func) - success = false; - } - return success; -} - +bool dlsym_load_list(void *handle, const dlsym_assign *dlsyms); /* |dlsyms| should be null terminated */ -static void dlsym_load_list_optional(void *handle, const dlsym_assign *dlsyms) { - for(int i = 0; dlsyms[i].func; ++i) { - *dlsyms[i].func = dlsym_print_fail(handle, dlsyms[i].name, false); - } -} +void dlsym_load_list_optional(void *handle, const dlsym_assign *dlsyms); #endif /* GSR_LIBRARY_LOADER_H */ diff --git a/include/time.h b/include/time.h deleted file mode 100644 index 150c655..0000000 --- a/include/time.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef GSR_TIME_H -#define GSR_TIME_H - -double clock_get_monotonic_seconds(); - -#endif /* GSR_TIME_H */ diff --git a/include/utils.h b/include/utils.h new file mode 100644 index 0000000..f4925e5 --- /dev/null +++ b/include/utils.h @@ -0,0 +1,26 @@ +#ifndef GSR_UTILS_H +#define GSR_UTILS_H + +#include "vec2.h" +#include +#include + +typedef struct { + vec2i pos; + vec2i size; +} gsr_monitor; + +typedef struct { + const char *name; + int name_len; + gsr_monitor *monitor; + bool found_monitor; +} get_monitor_by_name_userdata; + +double clock_get_monotonic_seconds(void); + +typedef void (*active_monitor_callback)(const XRROutputInfo *output_info, const XRRCrtcInfo *crt_info, const XRRModeInfo *mode_info, void *userdata); +void for_each_active_monitor_output(Display *display, active_monitor_callback callback, void *userdata); +bool get_monitor_by_name(Display *display, const char *name, gsr_monitor *monitor); + +#endif /* GSR_UTILS_H */ -- cgit v1.2.3