Path: blob/master/servers/rendering/renderer_rd/effects/tone_mapper.cpp
20897 views
/**************************************************************************/1/* tone_mapper.cpp */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#include "tone_mapper.h"31#include "servers/rendering/renderer_rd/renderer_compositor_rd.h"32#include "servers/rendering/renderer_rd/storage_rd/material_storage.h"33#include "servers/rendering/renderer_rd/uniform_set_cache_rd.h"3435using namespace RendererRD;3637ToneMapper::ToneMapper(bool p_use_mobile_version) {38using_mobile_version = p_use_mobile_version;39if (using_mobile_version) {40// Initialize tonemapper41Vector<String> tonemap_modes;42tonemap_modes.push_back("\n");43tonemap_modes.push_back("\n#define USE_1D_LUT\n");44tonemap_modes.push_back("\n#define SUBPASS\n");45tonemap_modes.push_back("\n#define SUBPASS\n#define USE_1D_LUT\n");4647// multiview versions of our shaders48tonemap_modes.push_back("\n#define USE_MULTIVIEW\n");49tonemap_modes.push_back("\n#define USE_MULTIVIEW\n#define USE_1D_LUT\n");50tonemap_modes.push_back("\n#define USE_MULTIVIEW\n#define SUBPASS\n");51tonemap_modes.push_back("\n#define USE_MULTIVIEW\n#define SUBPASS\n#define USE_1D_LUT\n");5253tonemap_mobile.shader.initialize(tonemap_modes);5455if (!RendererCompositorRD::get_singleton()->is_xr_enabled()) {56tonemap_mobile.shader.set_variant_enabled(TONEMAP_MOBILE_MODE_NORMAL_MULTIVIEW, false);57tonemap_mobile.shader.set_variant_enabled(TONEMAP_MOBILE_MODE_1D_LUT_MULTIVIEW, false);58tonemap_mobile.shader.set_variant_enabled(TONEMAP_MOBILE_MODE_SUBPASS_MULTIVIEW, false);59tonemap_mobile.shader.set_variant_enabled(TONEMAP_MOBILE_MODE_SUBPASS_1D_LUT_MULTIVIEW, false);60}6162tonemap_mobile.shader_version = tonemap_mobile.shader.version_create();6364for (int i = 0; i < TONEMAP_MODE_MAX; i++) {65if (tonemap_mobile.shader.is_variant_enabled(i)) {66tonemap_mobile.pipelines[i].setup(tonemap_mobile.shader.version_get_shader(tonemap_mobile.shader_version, i), RD::RENDER_PRIMITIVE_TRIANGLES, RD::PipelineRasterizationState(), RD::PipelineMultisampleState(), RD::PipelineDepthStencilState(), RD::PipelineColorBlendState::create_disabled(), 0);67} else {68tonemap_mobile.pipelines[i].clear();69}70}7172} else {73// Initialize tonemapper74Vector<String> tonemap_modes;75tonemap_modes.push_back("\n");76tonemap_modes.push_back("\n#define USE_GLOW_FILTER_BICUBIC\n");77tonemap_modes.push_back("\n#define USE_1D_LUT\n");78tonemap_modes.push_back("\n#define USE_GLOW_FILTER_BICUBIC\n#define USE_1D_LUT\n");7980// multiview versions of our shaders81tonemap_modes.push_back("\n#define USE_MULTIVIEW\n");82tonemap_modes.push_back("\n#define USE_MULTIVIEW\n#define USE_GLOW_FILTER_BICUBIC\n");83tonemap_modes.push_back("\n#define USE_MULTIVIEW\n#define USE_1D_LUT\n");84tonemap_modes.push_back("\n#define USE_MULTIVIEW\n#define USE_GLOW_FILTER_BICUBIC\n#define USE_1D_LUT\n");8586tonemap.shader.initialize(tonemap_modes);8788if (!RendererCompositorRD::get_singleton()->is_xr_enabled()) {89tonemap.shader.set_variant_enabled(TONEMAP_MODE_NORMAL_MULTIVIEW, false);90tonemap.shader.set_variant_enabled(TONEMAP_MODE_BICUBIC_GLOW_FILTER_MULTIVIEW, false);91tonemap.shader.set_variant_enabled(TONEMAP_MODE_1D_LUT_MULTIVIEW, false);92tonemap.shader.set_variant_enabled(TONEMAP_MODE_BICUBIC_GLOW_FILTER_1D_LUT_MULTIVIEW, false);93}9495tonemap.shader_version = tonemap.shader.version_create();9697for (int i = 0; i < TONEMAP_MODE_MAX; i++) {98if (tonemap.shader.is_variant_enabled(i)) {99tonemap.pipelines[i].setup(tonemap.shader.version_get_shader(tonemap.shader_version, i), RD::RENDER_PRIMITIVE_TRIANGLES, RD::PipelineRasterizationState(), RD::PipelineMultisampleState(), RD::PipelineDepthStencilState(), RD::PipelineColorBlendState::create_disabled(), 0);100} else {101tonemap.pipelines[i].clear();102}103}104}105}106107ToneMapper::~ToneMapper() {108if (using_mobile_version) {109tonemap_mobile.shader.version_free(tonemap_mobile.shader_version);110} else {111tonemap.shader.version_free(tonemap.shader_version);112}113}114115void ToneMapper::tonemapper(RID p_source_color, RID p_dst_framebuffer, const TonemapSettings &p_settings) {116ERR_FAIL_COND_MSG(using_mobile_version, "Can't use the non mobile version of the tonemapper with the Mobile renderer.");117UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton();118ERR_FAIL_NULL(uniform_set_cache);119MaterialStorage *material_storage = MaterialStorage::get_singleton();120ERR_FAIL_NULL(material_storage);121122memset(&tonemap.push_constant, 0, sizeof(TonemapPushConstant));123124tonemap.push_constant.flags |= p_settings.use_bcs ? TONEMAP_FLAG_USE_BCS : 0;125tonemap.push_constant.bcs[0] = p_settings.brightness;126tonemap.push_constant.bcs[1] = p_settings.contrast;127tonemap.push_constant.bcs[2] = p_settings.saturation;128129tonemap.push_constant.flags |= p_settings.use_glow ? TONEMAP_FLAG_USE_GLOW : 0;130tonemap.push_constant.glow_intensity = p_settings.glow_intensity;131tonemap.push_constant.glow_map_strength = p_settings.glow_map_strength;132tonemap.push_constant.glow_levels[0] = p_settings.glow_levels[0]; // clean this up to just pass by pointer or something133tonemap.push_constant.glow_levels[1] = p_settings.glow_levels[1];134tonemap.push_constant.glow_levels[2] = p_settings.glow_levels[2];135tonemap.push_constant.glow_levels[3] = p_settings.glow_levels[3];136tonemap.push_constant.glow_levels[4] = p_settings.glow_levels[4];137tonemap.push_constant.glow_levels[5] = p_settings.glow_levels[5];138tonemap.push_constant.glow_levels[6] = p_settings.glow_levels[6];139tonemap.push_constant.glow_texture_size[0] = p_settings.glow_texture_size.x;140tonemap.push_constant.glow_texture_size[1] = p_settings.glow_texture_size.y;141tonemap.push_constant.glow_mode = p_settings.glow_mode;142143int mode = p_settings.glow_use_bicubic_upscale ? TONEMAP_MODE_BICUBIC_GLOW_FILTER : TONEMAP_MODE_NORMAL;144if (p_settings.use_1d_color_correction) {145mode += 2;146}147148tonemap.push_constant.tonemapper = p_settings.tonemap_mode;149tonemap.push_constant.tonemapper_params[0] = p_settings.tonemapper_params[0];150tonemap.push_constant.tonemapper_params[1] = p_settings.tonemapper_params[1];151tonemap.push_constant.tonemapper_params[2] = p_settings.tonemapper_params[2];152tonemap.push_constant.tonemapper_params[3] = p_settings.tonemapper_params[3];153tonemap.push_constant.flags |= p_settings.use_auto_exposure ? TONEMAP_FLAG_USE_AUTO_EXPOSURE : 0;154tonemap.push_constant.exposure = p_settings.exposure;155tonemap.push_constant.white = p_settings.white;156tonemap.push_constant.auto_exposure_scale = p_settings.auto_exposure_scale;157tonemap.push_constant.luminance_multiplier = p_settings.luminance_multiplier;158159tonemap.push_constant.flags |= p_settings.use_color_correction ? TONEMAP_FLAG_USE_COLOR_CORRECTION : 0;160161tonemap.push_constant.flags |= p_settings.use_fxaa ? TONEMAP_FLAG_USE_FXAA : 0;162if (p_settings.debanding_mode == TonemapSettings::DEBANDING_MODE_8_BIT) {163tonemap.push_constant.flags |= TONEMAP_FLAG_USE_8_BIT_DEBANDING;164}165tonemap.push_constant.pixel_size[0] = 1.0 / p_settings.texture_size.x;166tonemap.push_constant.pixel_size[1] = 1.0 / p_settings.texture_size.y;167168tonemap.push_constant.flags |= p_settings.convert_to_srgb ? TONEMAP_FLAG_CONVERT_TO_SRGB : 0;169170if (p_settings.view_count > 1) {171// Use USE_MULTIVIEW versions172mode += 4;173}174175RID default_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);176RID default_mipmap_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);177178RD::Uniform u_source_color(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_source_color }));179180RD::Uniform u_exposure_texture;181u_exposure_texture.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;182u_exposure_texture.binding = 0;183u_exposure_texture.append_id(default_sampler);184u_exposure_texture.append_id(p_settings.exposure_texture);185186RD::Uniform u_glow_texture;187u_glow_texture.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;188u_glow_texture.binding = 0;189u_glow_texture.append_id(default_mipmap_sampler);190u_glow_texture.append_id(p_settings.glow_texture);191192RD::Uniform u_glow_map;193u_glow_map.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;194u_glow_map.binding = 1;195u_glow_map.append_id(default_mipmap_sampler);196u_glow_map.append_id(p_settings.glow_map);197198RD::Uniform u_color_correction_texture;199u_color_correction_texture.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;200u_color_correction_texture.binding = 0;201u_color_correction_texture.append_id(default_sampler);202u_color_correction_texture.append_id(p_settings.color_correction_texture);203204RID shader = tonemap.shader.version_get_shader(tonemap.shader_version, mode);205ERR_FAIL_COND(shader.is_null());206207RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(p_dst_framebuffer);208RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, tonemap.pipelines[mode].get_render_pipeline(RD::INVALID_ID, RD::get_singleton()->framebuffer_get_format(p_dst_framebuffer), false, RD::get_singleton()->draw_list_get_current_pass()));209RD::get_singleton()->draw_list_bind_uniform_set(draw_list, uniform_set_cache->get_cache(shader, 0, u_source_color), 0);210RD::get_singleton()->draw_list_bind_uniform_set(draw_list, uniform_set_cache->get_cache(shader, 1, u_exposure_texture), 1);211RD::get_singleton()->draw_list_bind_uniform_set(draw_list, uniform_set_cache->get_cache(shader, 2, u_glow_texture, u_glow_map), 2);212RD::get_singleton()->draw_list_bind_uniform_set(draw_list, uniform_set_cache->get_cache(shader, 3, u_color_correction_texture), 3);213214RD::get_singleton()->draw_list_set_push_constant(draw_list, &tonemap.push_constant, sizeof(TonemapPushConstant));215RD::get_singleton()->draw_list_draw(draw_list, false, 1u, 3u);216RD::get_singleton()->draw_list_end();217}218219void ToneMapper::tonemapper_mobile(RID p_source_color, RID p_dst_framebuffer, const TonemapSettings &p_settings) {220ERR_FAIL_COND_MSG(!using_mobile_version, "Can't use the mobile version of the tonemapper with the clustered renderer.");221UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton();222ERR_FAIL_NULL(uniform_set_cache);223MaterialStorage *material_storage = MaterialStorage::get_singleton();224ERR_FAIL_NULL(material_storage);225226memset(&tonemap_mobile.push_constant, 0, sizeof(TonemapPushConstantMobile));227228tonemap_mobile.push_constant.bcs[0] = p_settings.brightness;229tonemap_mobile.push_constant.bcs[1] = p_settings.contrast;230tonemap_mobile.push_constant.bcs[2] = p_settings.saturation;231232tonemap_mobile.push_constant.src_pixel_size[0] = 1.0 / p_settings.texture_size.x;233tonemap_mobile.push_constant.src_pixel_size[1] = 1.0 / p_settings.texture_size.y;234tonemap_mobile.push_constant.dest_pixel_size[0] = 1.0 / p_settings.dest_texture_size.x;235tonemap_mobile.push_constant.dest_pixel_size[1] = 1.0 / p_settings.dest_texture_size.y;236tonemap_mobile.push_constant.glow_intensity = p_settings.glow_intensity;237tonemap_mobile.push_constant.glow_map_strength = p_settings.glow_map_strength;238239tonemap_mobile.push_constant.exposure = p_settings.exposure;240tonemap_mobile.push_constant.white = p_settings.white;241tonemap_mobile.push_constant.luminance_multiplier = p_settings.luminance_multiplier;242243tonemap_mobile.push_constant.tonemapper_params[0] = p_settings.tonemapper_params[0];244tonemap_mobile.push_constant.tonemapper_params[1] = p_settings.tonemapper_params[1];245tonemap_mobile.push_constant.tonemapper_params[2] = p_settings.tonemapper_params[2];246tonemap_mobile.push_constant.tonemapper_params[3] = p_settings.tonemapper_params[3];247248uint32_t spec_constant = 0;249spec_constant |= p_settings.use_bcs ? TONEMAP_MOBILE_FLAG_USE_BCS : 0;250spec_constant |= p_settings.use_glow ? TONEMAP_MOBILE_FLAG_USE_GLOW : 0;251spec_constant |= p_settings.glow_map_strength > 0.01 ? TONEMAP_MOBILE_FLAG_USE_GLOW_MAP : 0;252spec_constant |= p_settings.use_color_correction ? TONEMAP_MOBILE_FLAG_USE_COLOR_CORRECTION : 0;253spec_constant |= p_settings.use_fxaa ? TONEMAP_MOBILE_FLAG_USE_FXAA : 0;254spec_constant |= p_settings.debanding_mode == TonemapSettings::DEBANDING_MODE_8_BIT ? TONEMAP_MOBILE_FLAG_USE_8_BIT_DEBANDING : 0;255spec_constant |= p_settings.debanding_mode == TonemapSettings::DEBANDING_MODE_10_BIT ? TONEMAP_MOBILE_FLAG_USE_10_BIT_DEBANDING : 0;256spec_constant |= p_settings.convert_to_srgb ? TONEMAP_MOBILE_FLAG_CONVERT_TO_SRGB : 0;257spec_constant |= p_settings.tonemap_mode == RS::ENV_TONE_MAPPER_LINEAR ? TONEMAP_MOBILE_FLAG_TONEMAPPER_LINEAR : 0;258spec_constant |= p_settings.tonemap_mode == RS::ENV_TONE_MAPPER_REINHARD ? TONEMAP_MOBILE_FLAG_TONEMAPPER_REINHARD : 0;259spec_constant |= p_settings.tonemap_mode == RS::ENV_TONE_MAPPER_FILMIC ? TONEMAP_MOBILE_FLAG_TONEMAPPER_FILMIC : 0;260spec_constant |= p_settings.tonemap_mode == RS::ENV_TONE_MAPPER_ACES ? TONEMAP_MOBILE_FLAG_TONEMAPPER_ACES : 0;261spec_constant |= p_settings.tonemap_mode == RS::ENV_TONE_MAPPER_AGX ? TONEMAP_MOBILE_FLAG_TONEMAPPER_AGX : 0;262spec_constant |= p_settings.glow_mode == RS::ENV_GLOW_BLEND_MODE_ADDITIVE ? TONEMAP_MOBILE_FLAG_GLOW_MODE_ADD : 0;263spec_constant |= p_settings.glow_mode == RS::ENV_GLOW_BLEND_MODE_SCREEN ? TONEMAP_MOBILE_FLAG_GLOW_MODE_SCREEN : 0;264spec_constant |= p_settings.glow_mode == RS::ENV_GLOW_BLEND_MODE_SOFTLIGHT ? TONEMAP_MOBILE_FLAG_GLOW_MODE_SOFTLIGHT : 0;265spec_constant |= p_settings.glow_mode == RS::ENV_GLOW_BLEND_MODE_REPLACE ? TONEMAP_MOBILE_FLAG_GLOW_MODE_REPLACE : 0;266spec_constant |= p_settings.glow_mode == RS::ENV_GLOW_BLEND_MODE_MIX ? TONEMAP_MOBILE_FLAG_GLOW_MODE_MIX : 0;267268int mode = p_settings.use_1d_color_correction ? TONEMAP_MOBILE_MODE_1D_LUT : TONEMAP_MOBILE_MODE_NORMAL;269270if (p_settings.view_count > 1) {271// Use USE_MULTIVIEW versions272mode += 4;273}274275RID default_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);276RID default_mipmap_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);277278RD::Uniform u_source_color(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_source_color }));279280RD::Uniform u_glow_texture;281u_glow_texture.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;282u_glow_texture.binding = 1;283u_glow_texture.append_id(default_mipmap_sampler);284u_glow_texture.append_id(p_settings.glow_texture);285286RD::Uniform u_glow_map;287u_glow_map.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;288u_glow_map.binding = 2;289u_glow_map.append_id(default_mipmap_sampler);290u_glow_map.append_id(p_settings.glow_map);291292RD::Uniform u_color_correction_texture;293u_color_correction_texture.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;294u_color_correction_texture.binding = 3;295u_color_correction_texture.append_id(default_sampler);296u_color_correction_texture.append_id(p_settings.color_correction_texture);297298RID shader = tonemap_mobile.shader.version_get_shader(tonemap_mobile.shader_version, mode);299ERR_FAIL_COND(shader.is_null());300301RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(p_dst_framebuffer);302RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, tonemap_mobile.pipelines[mode].get_render_pipeline(RD::INVALID_ID, RD::get_singleton()->framebuffer_get_format(p_dst_framebuffer), false, RD::get_singleton()->draw_list_get_current_pass(), spec_constant));303RD::get_singleton()->draw_list_bind_uniform_set(draw_list, uniform_set_cache->get_cache(shader, 0, u_source_color, u_glow_texture, u_glow_map, u_color_correction_texture), 0);304RD::get_singleton()->draw_list_set_push_constant(draw_list, &tonemap_mobile.push_constant, sizeof(TonemapPushConstantMobile));305RD::get_singleton()->draw_list_draw(draw_list, false, 1u, 3u);306RD::get_singleton()->draw_list_end();307}308309void ToneMapper::tonemapper_subpass(RD::DrawListID p_subpass_draw_list, RID p_source_color, RD::FramebufferFormatID p_dst_format_id, const TonemapSettings &p_settings) {310UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton();311ERR_FAIL_NULL(uniform_set_cache);312MaterialStorage *material_storage = MaterialStorage::get_singleton();313ERR_FAIL_NULL(material_storage);314315ERR_FAIL_COND_MSG(p_settings.use_glow, "Glow is not supported when using subpasses.");316317memset(&tonemap_mobile.push_constant, 0, sizeof(TonemapPushConstantMobile));318319tonemap_mobile.push_constant.bcs[0] = p_settings.brightness;320tonemap_mobile.push_constant.bcs[1] = p_settings.contrast;321tonemap_mobile.push_constant.bcs[2] = p_settings.saturation;322323tonemap_mobile.push_constant.src_pixel_size[0] = 1.0 / p_settings.texture_size.x;324tonemap_mobile.push_constant.src_pixel_size[1] = 1.0 / p_settings.texture_size.y;325tonemap_mobile.push_constant.glow_intensity = p_settings.glow_intensity;326tonemap_mobile.push_constant.glow_map_strength = p_settings.glow_map_strength;327328tonemap_mobile.push_constant.exposure = p_settings.exposure;329tonemap_mobile.push_constant.white = p_settings.white;330tonemap_mobile.push_constant.luminance_multiplier = p_settings.luminance_multiplier;331332tonemap_mobile.push_constant.tonemapper_params[0] = p_settings.tonemapper_params[0];333tonemap_mobile.push_constant.tonemapper_params[1] = p_settings.tonemapper_params[1];334tonemap_mobile.push_constant.tonemapper_params[2] = p_settings.tonemapper_params[2];335tonemap_mobile.push_constant.tonemapper_params[3] = p_settings.tonemapper_params[3];336337uint32_t spec_constant = TONEMAP_MOBILE_ADRENO_BUG;338spec_constant |= p_settings.use_bcs ? TONEMAP_MOBILE_FLAG_USE_BCS : 0;339//spec_constant |= p_settings.use_glow ? TONEMAP_MOBILE_FLAG_USE_GLOW : 0;340//spec_constant |= p_settings.glow_map_strength > 0.01 ? TONEMAP_MOBILE_FLAG_USE_GLOW_MAP : 0;341//spec_constant |= p_settings.use_color_correction ? TONEMAP_MOBILE_FLAG_USE_COLOR_CORRECTION : 0;342//spec_constant |= p_settings.use_fxaa ? TONEMAP_MOBILE_FLAG_USE_FXAA : 0;343spec_constant |= p_settings.debanding_mode == TonemapSettings::DEBANDING_MODE_8_BIT ? TONEMAP_MOBILE_FLAG_USE_8_BIT_DEBANDING : 0;344spec_constant |= p_settings.convert_to_srgb ? TONEMAP_MOBILE_FLAG_CONVERT_TO_SRGB : 0;345spec_constant |= p_settings.tonemap_mode == RS::ENV_TONE_MAPPER_LINEAR ? TONEMAP_MOBILE_FLAG_TONEMAPPER_LINEAR : 0;346spec_constant |= p_settings.tonemap_mode == RS::ENV_TONE_MAPPER_REINHARD ? TONEMAP_MOBILE_FLAG_TONEMAPPER_REINHARD : 0;347spec_constant |= p_settings.tonemap_mode == RS::ENV_TONE_MAPPER_FILMIC ? TONEMAP_MOBILE_FLAG_TONEMAPPER_FILMIC : 0;348spec_constant |= p_settings.tonemap_mode == RS::ENV_TONE_MAPPER_ACES ? TONEMAP_MOBILE_FLAG_TONEMAPPER_ACES : 0;349spec_constant |= p_settings.tonemap_mode == RS::ENV_TONE_MAPPER_AGX ? TONEMAP_MOBILE_FLAG_TONEMAPPER_AGX : 0;350//spec_constant |= p_settings.glow_mode == RS::ENV_GLOW_BLEND_MODE_ADDITIVE ? TONEMAP_MOBILE_FLAG_GLOW_MODE_ADD : 0;351//spec_constant |= p_settings.glow_mode == RS::ENV_GLOW_BLEND_MODE_SCREEN ? TONEMAP_MOBILE_FLAG_GLOW_MODE_SCREEN : 0;352//spec_constant |= p_settings.glow_mode == RS::ENV_GLOW_BLEND_MODE_SOFTLIGHT ? TONEMAP_MOBILE_FLAG_GLOW_MODE_SOFTLIGHT : 0;353//spec_constant |= p_settings.glow_mode == RS::ENV_GLOW_BLEND_MODE_REPLACE ? TONEMAP_MOBILE_FLAG_GLOW_MODE_REPLACE : 0;354//spec_constant |= p_settings.glow_mode == RS::ENV_GLOW_BLEND_MODE_MIX ? TONEMAP_MOBILE_FLAG_GLOW_MODE_MIX : 0;355356int mode = p_settings.use_1d_color_correction ? TONEMAP_MOBILE_MODE_SUBPASS_1D_LUT : TONEMAP_MOBILE_MODE_SUBPASS;357if (p_settings.view_count > 1) {358// Use USE_MULTIVIEW versions359mode += 4;360}361362RID default_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);363RID default_mipmap_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);364365RD::Uniform u_source_color;366u_source_color.uniform_type = RD::UNIFORM_TYPE_INPUT_ATTACHMENT;367u_source_color.binding = 0;368u_source_color.append_id(p_source_color);369370RD::Uniform u_glow_texture;371u_glow_texture.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;372u_glow_texture.binding = 1;373u_glow_texture.append_id(default_mipmap_sampler);374u_glow_texture.append_id(p_settings.glow_texture);375376RD::Uniform u_glow_map;377u_glow_map.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;378u_glow_map.binding = 2;379u_glow_map.append_id(default_mipmap_sampler);380u_glow_map.append_id(p_settings.glow_map);381382RD::Uniform u_color_correction_texture;383u_color_correction_texture.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;384u_color_correction_texture.binding = 3;385u_color_correction_texture.append_id(default_sampler);386u_color_correction_texture.append_id(p_settings.color_correction_texture);387388RID shader = tonemap_mobile.shader.version_get_shader(tonemap_mobile.shader_version, mode);389ERR_FAIL_COND(shader.is_null());390391RD::get_singleton()->draw_list_bind_render_pipeline(p_subpass_draw_list, tonemap_mobile.pipelines[mode].get_render_pipeline(RD::INVALID_ID, p_dst_format_id, false, RD::get_singleton()->draw_list_get_current_pass(), spec_constant));392RD::get_singleton()->draw_list_bind_uniform_set(p_subpass_draw_list, uniform_set_cache->get_cache(shader, 0, u_source_color, u_glow_texture, u_glow_map, u_color_correction_texture), 0);393RD::get_singleton()->draw_list_set_push_constant(p_subpass_draw_list, &tonemap_mobile.push_constant, sizeof(TonemapPushConstantMobile));394RD::get_singleton()->draw_list_draw(p_subpass_draw_list, false, 1u, 3u);395}396397398