MacOS: Enable support for EDR rendering #105662

Merged
Brecht Van Lommel merged 26 commits from Jason-Fielder/blender:macos_EDR_support into main 2023-08-09 14:25:23 +02:00
10 changed files with 32 additions and 17 deletions
Showing only changes of commit dbb21dee2f - Show all commits

View File

@ -75,6 +75,7 @@ class RENDER_PT_color_management(RenderButtonsPanel, Panel):
col = flow.column()
col.prop(view, "exposure")
col.prop(view, "gamma")
col.prop(view, "use_hdr_view")
col.separator()
brecht marked this conversation as resolved Outdated

It's a bit of a hack as we can't automatically check for this in general, but I think graying it out for Filmic will help avoid some confusion:

if gpu.capabilities.hdr_support_get():
    sub = col.row()
    sub.active = view.view_transfrom != "Filmic"
    sub.prop(view, "use_hdr_view")
It's a bit of a hack as we can't automatically check for this in general, but I think graying it out for Filmic will help avoid some confusion: ``` if gpu.capabilities.hdr_support_get(): sub = col.row() sub.active = view.view_transfrom != "Filmic" sub.prop(view, "use_hdr_view") ```

View File

@ -759,9 +759,6 @@ class USERPREF_PT_viewport_quality(ViewportPanel, CenterAlignMixIn, Panel):
col.prop(system, "use_overlay_smooth_wire", text="Overlay")
col.prop(system, "use_edit_mode_smooth_wire", text="Edit Mode")
col = layout.column(heading="Viewport Colorspace")
col.prop(system, "use_hdr", text="High Dynamic Range")
brecht marked this conversation as resolved Outdated

Only show when gpu.platform.backend_type_get() == 'METAL' or introduce gpu.capabilities.hdr_support_get()

Only show when `gpu.platform.backend_type_get() == 'METAL'` or introduce `gpu.capabilities.hdr_support_get()`
class USERPREF_PT_viewport_textures(ViewportPanel, CenterAlignMixIn, Panel):
bl_label = "Textures"

View File

@ -6680,6 +6680,9 @@ void uiTemplateColormanagedViewSettings(uiLayout *layout,
uiItemR(col, &view_transform_ptr, "exposure", 0, nullptr, ICON_NONE);
uiItemR(col, &view_transform_ptr, "gamma", 0, nullptr, ICON_NONE);
col = uiLayoutColumn(layout, false);
uiItemR(col, &view_transform_ptr, "use_hdr_view", 0, nullptr, ICON_NONE);
col = uiLayoutColumn(layout, false);
uiItemR(col, &view_transform_ptr, "use_curve_mapping", 0, nullptr, ICON_NONE);
if (view_settings->flag & COLORMANAGE_VIEW_USE_CURVES) {

View File

@ -676,8 +676,9 @@ static bool ed_preview_draw_rect(ScrArea *area, int split, int first, rcti *rect
if (rres.rectx && rres.recty) {
/* High dynamic range preview. */
if (U.gpu_flag & USER_GPU_FLAG_HDR_ENABLED) {
/*Use floating point texture for material preview if High Dynamic Range enabled. */
Scene *scene = RE_GetScene(re);
brecht marked this conversation as resolved Outdated

In main it now always draws a float buffer, so this change can be removed.

In main it now always draws a float buffer, so this change can be removed.
if (scene && ((scene->view_settings.flag & COLORMANAGE_VIEW_USE_HDR) != 0)) {
float *rect_float = static_cast<float *>(MEM_mallocN(
rres.rectx * rres.recty * sizeof(float) * 4, "ed_preview_draw_rect_float"));
float fx = rect->xmin + offx;

View File

@ -455,7 +455,8 @@ static void gpu_viewport_draw_colormanaged(GPUViewport *viewport,
GPU_batch_program_set_builtin(batch, GPU_SHADER_2D_IMAGE_OVERLAYS_MERGE);
GPU_batch_uniform_1i(batch, "overlay", do_overlay_merge);
GPU_batch_uniform_1i(batch, "display_transform", display_colorspace);
GPU_batch_uniform_1i(batch, "use_extended", U.gpu_flag & USER_GPU_FLAG_HDR_ENABLED);
GPU_batch_uniform_1i(
batch, "use_extended", viewport->view_settings.flag & COLORMANAGE_VIEW_USE_HDR);
}
GPU_texture_bind(color, 0);

View File

@ -4075,8 +4075,7 @@ bool IMB_colormanagement_setup_glsl_draw_from_space(
const float gamma = applied_view_settings->gamma;
const float scale = (exposure == 0.0f) ? 1.0f : powf(2.0f, exposure);
const float exponent = (gamma == 1.0f) ? 1.0f : 1.0f / max_ff(FLT_EPSILON, gamma);
const bool use_extended = U.gpu_flag & USER_GPU_FLAG_HDR_ENABLED;
;
const bool use_extended = (applied_view_settings->flag & COLORMANAGE_VIEW_USE_HDR) != 0;
OCIO_ConstConfigRcPtr *config = OCIO_getCurrentConfig();

View File

@ -207,6 +207,7 @@ typedef struct ColorManagedColorspaceSettings {
/** #ColorManagedViewSettings.flag */
enum {
COLORMANAGE_VIEW_USE_CURVES = (1 << 0),
COLORMANAGE_VIEW_USE_HDR = (1 << 1),
};
#ifdef __cplusplus

View File

@ -1182,7 +1182,6 @@ typedef enum eUserpref_GPU_Flag {
USER_GPU_FLAG_NO_EDIT_MODE_SMOOTH_WIRE = (1 << 1),
USER_GPU_FLAG_OVERLAY_SMOOTH_WIRE = (1 << 2),
USER_GPU_FLAG_SUBDIVISION_EVALUATION = (1 << 3),
USER_GPU_FLAG_HDR_ENABLED = (1 << 4)
} eUserpref_GPU_Flag;
/** #UserDef.tablet_api */

View File

@ -508,6 +508,18 @@ static void rna_ColorManagedViewSettings_look_set(PointerRNA *ptr, int value)
}
}
static void rna_ColorManagedViewSettings_use_hdr_set(PointerRNA *ptr, bool value)
brecht marked this conversation as resolved Outdated

This function can be removed. RNA will generate similar code.
We only add these functions when the RNA default behavior needs to be 'overloaded'

This function can be removed. RNA will generate similar code. We only add these functions when the RNA default behavior needs to be 'overloaded'
{
ColorManagedViewSettings *view_settings = (ColorManagedViewSettings *)ptr->data;
if (value) {
view_settings->flag |= COLORMANAGE_VIEW_USE_HDR;
}
else {
view_settings->flag &= ~COLORMANAGE_VIEW_USE_HDR;
}
}
static const EnumPropertyItem *rna_ColorManagedViewSettings_look_itemf(bContext *UNUSED(C),
PointerRNA *ptr,
PropertyRNA *UNUSED(prop),
@ -1275,6 +1287,15 @@ static void rna_def_colormanage(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Use Curves", "Use RGB curved for pre-display transformation");
RNA_def_property_update(prop, NC_WINDOW, "rna_ColorManagement_update");
prop = RNA_def_property(srna, "use_hdr_view", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", COLORMANAGE_VIEW_USE_HDR);
RNA_def_property_boolean_funcs(prop, NULL, "rna_ColorManagedViewSettings_use_hdr_set");
RNA_def_property_ui_text(prop,
"High Dynamic Range",
"Enable high dynamic range with extended colorspace in viewport, "
"uncapping display brightness for rendered content.");
brecht marked this conversation as resolved Outdated

Can we extend this tooltip with some more info?

Enable high dynamic range display in rendered viewport, uncapping display brightness. This requires a monitor with HDR support and a view transform designed for HDR.
Can we extend this tooltip with some more info? ``` Enable high dynamic range display in rendered viewport, uncapping display brightness. This requires a monitor with HDR support and a view transform designed for HDR. ```
RNA_def_property_update(prop, NC_WINDOW, "rna_ColorManagement_update");
/* ** Color-space ** */
srna = RNA_def_struct(brna, "ColorManagedInputColorspaceSettings", NULL);
RNA_def_struct_path_func(srna, "rna_ColorManagedInputColorspaceSettings_path");

View File

@ -5676,14 +5676,6 @@ static void rna_def_userdef_system(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, 0, "rna_userdef_update");
prop = RNA_def_property(srna, "use_hdr", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gpu_flag", USER_GPU_FLAG_HDR_ENABLED);
RNA_def_property_ui_text(prop,
"Viewport High Dynamic Range",
"Enable high dynamic range with extended colorspace in viewport, "
"uncapping display brightness for rendered content.");
RNA_def_property_update(prop, 0, "rna_userdef_dpi_update");
prop = RNA_def_property(srna, "solid_lights", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "light_param", "");
RNA_def_property_struct_type(prop, "UserSolidLight");