aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/capture/kms.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/capture/kms.c')
-rw-r--r--src/capture/kms.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/capture/kms.c b/src/capture/kms.c
index 039609b..c732993 100644
--- a/src/capture/kms.c
+++ b/src/capture/kms.c
@@ -2,6 +2,7 @@
#include "../../include/utils.h"
#include "../../include/color_conversion.h"
#include "../../include/cursor.h"
+#include "../../include/kde_night_light.h"
#include "../../include/window/window.h"
#include <stdlib.h>
@@ -56,6 +57,9 @@ typedef struct {
uint32_t gamma_lut_property_id;
uint64_t gamma_lut_blob_id;
+ gsr_kde_night_light *kde_night_light;
+ bool night_light_message_shown;
+
bool is_x11;
//int drm_fd;
@@ -94,6 +98,11 @@ static void gsr_capture_kms_stop(gsr_capture_kms *self) {
self->drm_card_fd = -1;
}
+ if(self->kde_night_light) {
+ gsr_kde_night_light_destroy(self->kde_night_light);
+ self->kde_night_light = NULL;
+ }
+
// if(self->drm_fd > 0) {
// close(self->drm_fd);
// self->drm_fd = -1;
@@ -172,6 +181,8 @@ static int gsr_capture_kms_start(gsr_capture *cap, gsr_capture_metadata *capture
self->is_x11 = gsr_window_get_display_server(self->params.egl->window) == GSR_DISPLAY_SERVER_X11;
const gsr_connection_type connection_type = self->is_x11 ? GSR_CONNECTION_X11 : GSR_CONNECTION_DRM;
+ if(!self->is_x11)
+ self->kde_night_light = gsr_kde_night_light_create();
MonitorCallbackUserdata monitor_callback_userdata = {
&self->monitor_id,
@@ -388,9 +399,25 @@ static void gsr_capture_kms_update_gamma_lut(gsr_capture_kms *self, gsr_color_co
drmModeFreePropertyBlob(blob);
}
+static void gsr_capture_kms_update_night_light(gsr_capture_kms *self, gsr_color_conversion *color_conversion, bool plane_is_hdr) {
+ float night_light_matrix[9];
+ if(!self->kde_night_light || !gsr_kde_night_light_get_inverse_matrix(self->kde_night_light, night_light_matrix)) {
+ gsr_color_conversion_set_night_light_matrix(color_conversion, NULL, false);
+ return;
+ }
+
+ gsr_color_conversion_set_night_light_matrix(color_conversion, night_light_matrix, plane_is_hdr);
+
+ if(!self->night_light_message_shown) {
+ self->night_light_message_shown = true;
+ fprintf(stderr, "gsr info: gsr_capture_kms_update_night_light: night light is active, removing the night light tint from the capture\n");
+ }
+}
+
static void gsr_capture_kms_update_hdr_to_sdr_tone_mapping(gsr_capture_kms *self, gsr_color_conversion *color_conversion, const gsr_kms_response_item *drm_fd) {
const bool plane_is_hdr = drm_plane_is_hdr(drm_fd);
gsr_color_conversion_enable_gamma_lut(color_conversion, plane_is_hdr && self->gamma_lut_blob_id != 0);
+ gsr_capture_kms_update_night_light(self, color_conversion, plane_is_hdr);
const bool tone_map_hdr_to_sdr = !self->params.hdr && plane_is_hdr;
if(!tone_map_hdr_to_sdr) {
@@ -902,6 +929,7 @@ static int gsr_capture_kms_capture(gsr_capture *cap, gsr_capture_metadata *captu
gsr_color_conversion_set_hdr_to_sdr_tone_mapping(color_conversion, false, 0.0f, 0.0f);
gsr_color_conversion_enable_gamma_lut(color_conversion, false);
+ gsr_color_conversion_set_night_light_matrix(color_conversion, NULL, false);
//self->params.egl->glFlush();
//self->params.egl->glFinish();