Merge pull request #7978 from jpark37/dxgi-display-sdr-on-hdr

libobs-d3d11,win-capture: Add Force SDR for DXGI duplicator
This commit is contained in:
Jim
2023-03-20 01:43:14 -07:00
committed by GitHub
9 changed files with 158 additions and 90 deletions
@@ -265,10 +265,11 @@ static void log_settings(struct duplicator_capture *capture,
"\tmethod: %s\n"
"\tid: %s\n"
"\talt_id: %s\n"
"\tsetting_id: %s",
"\tsetting_id: %s\n"
"\tforce SDR: %s",
monitor, width, height, capture->capture_cursor ? "true" : "false",
get_method_name(capture->method), capture->id, capture->alt_id,
capture->monitor_id);
capture->monitor_id, capture->force_sdr ? "true" : "false");
}
static enum display_capture_method
@@ -734,18 +735,32 @@ static void duplicator_capture_render(void *data, gs_effect_t *unused)
const char *tech_name = "Draw";
float multiplier = 1.f;
const enum gs_color_space current_space = gs_get_color_space();
if (gs_texture_get_color_format(texture) == GS_RGBA16F) {
switch (current_space) {
case GS_CS_SRGB:
case GS_CS_SRGB_16F:
tech_name = "DrawMultiplyTonemap";
multiplier =
80.f / obs_get_video_sdr_white_level();
break;
case GS_CS_709_EXTENDED:
if (gs_duplicator_get_color_space(capture->duplicator) ==
GS_CS_709_SCRGB) {
if (capture->force_sdr) {
tech_name = "DrawMultiply";
multiplier =
80.f / obs_get_video_sdr_white_level();
const float target_nits =
(current_space == GS_CS_709_SCRGB)
? obs_get_video_sdr_white_level()
: 80.f;
multiplier = target_nits /
gs_duplicator_get_sdr_white_level(
capture->duplicator);
} else {
switch (current_space) {
case GS_CS_SRGB:
case GS_CS_SRGB_16F:
tech_name = "DrawMultiplyTonemap";
multiplier =
80.f /
obs_get_video_sdr_white_level();
break;
case GS_CS_709_EXTENDED:
tech_name = "DrawMultiply";
multiplier =
80.f /
obs_get_video_sdr_white_level();
}
}
} else if (current_space == GS_CS_709_SCRGB) {
tech_name = "DrawMultiply";
@@ -844,9 +859,6 @@ static void update_settings_visibility(obs_properties_t *props,
obs_property_t *p = obs_properties_get(props, "cursor");
obs_property_set_visible(p, dxgi_options || wgc_cursor_toggle);
p = obs_properties_get(props, "force_sdr");
obs_property_set_visible(p, wgc_options);
pthread_mutex_unlock(&capture->update_mutex);
}
@@ -909,17 +921,9 @@ duplicator_capture_get_color_space(void *data, size_t count,
capture->exports.winrt_capture_get_color_space(
capture->capture_winrt);
}
} else {
if (capture->duplicator) {
gs_texture_t *const texture =
gs_duplicator_get_texture(capture->duplicator);
if (texture) {
capture_space = (gs_texture_get_color_format(
texture) == GS_RGBA16F)
? GS_CS_709_EXTENDED
: GS_CS_SRGB;
}
}
} else if (capture->duplicator && !capture->force_sdr) {
capture_space =
gs_duplicator_get_color_space(capture->duplicator);
}
enum gs_color_space space = capture_space;
+5 -2
View File
@@ -181,9 +181,12 @@ static void log_settings(struct window_capture *wc, obs_data_t *s)
"[window-capture: '%s'] update settings:\n"
"\texecutable: %s\n"
"\tmethod selected: %s\n"
"\tmethod chosen: %s\n",
"\tmethod chosen: %s\n"
"\tforce SDR: %s",
obs_source_get_name(wc->source), wc->executable,
get_method_name(method), get_method_name(wc->method));
get_method_name(method), get_method_name(wc->method),
(wc->force_sdr && (wc->method == METHOD_WGC)) ? "true"
: "false");
blog(LOG_DEBUG, "\tclass: %s", wc->class);
}
}