Path: blob/master/servers/rendering/renderer_rd/effects/tone_mapper.cpp
22517 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;158tonemap.push_constant.output_max_value = MAX(p_settings.max_value, 1.0f);159160tonemap.push_constant.flags |= p_settings.use_color_correction ? TONEMAP_FLAG_USE_COLOR_CORRECTION : 0;161162tonemap.push_constant.flags |= p_settings.use_fxaa ? TONEMAP_FLAG_USE_FXAA : 0;163if (p_settings.debanding_mode == TonemapSettings::DEBANDING_MODE_8_BIT) {164tonemap.push_constant.flags |= TONEMAP_FLAG_USE_8_BIT_DEBANDING;165}166tonemap.push_constant.pixel_size[0] = 1.0 / p_settings.texture_size.x;167tonemap.push_constant.pixel_size[1] = 1.0 / p_settings.texture_size.y;168169tonemap.push_constant.flags |= p_settings.convert_to_srgb ? TONEMAP_FLAG_CONVERT_TO_SRGB : 0;170171if (p_settings.view_count > 1) {172// Use USE_MULTIVIEW versions173mode += 4;174}175176RID default_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);177RID default_mipmap_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);178179RD::Uniform u_source_color(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_source_color }));180181RD::Uniform u_exposure_texture;182u_exposure_texture.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;183u_exposure_texture.binding = 0;184u_exposure_texture.append_id(default_sampler);185u_exposure_texture.append_id(p_settings.exposure_texture);186187RD::Uniform u_glow_texture;188u_glow_texture.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;189u_glow_texture.binding = 0;190u_glow_texture.append_id(default_mipmap_sampler);191u_glow_texture.append_id(p_settings.glow_texture);192193RD::Uniform u_glow_map;194u_glow_map.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;195u_glow_map.binding = 1;196u_glow_map.append_id(default_mipmap_sampler);197u_glow_map.append_id(p_settings.glow_map);198199RD::Uniform u_color_correction_texture;200u_color_correction_texture.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;201u_color_correction_texture.binding = 0;202u_color_correction_texture.append_id(default_sampler);203u_color_correction_texture.append_id(p_settings.color_correction_texture);204205RID shader = tonemap.shader.version_get_shader(tonemap.shader_version, mode);206ERR_FAIL_COND(shader.is_null());207208RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(p_dst_framebuffer);209RD::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()));210RD::get_singleton()->draw_list_bind_uniform_set(draw_list, uniform_set_cache->get_cache(shader, 0, u_source_color), 0);211RD::get_singleton()->draw_list_bind_uniform_set(draw_list, uniform_set_cache->get_cache(shader, 1, u_exposure_texture), 1);212RD::get_singleton()->draw_list_bind_uniform_set(draw_list, uniform_set_cache->get_cache(shader, 2, u_glow_texture, u_glow_map), 2);213RD::get_singleton()->draw_list_bind_uniform_set(draw_list, uniform_set_cache->get_cache(shader, 3, u_color_correction_texture), 3);214215RD::get_singleton()->draw_list_set_push_constant(draw_list, &tonemap.push_constant, sizeof(TonemapPushConstant));216RD::get_singleton()->draw_list_draw(draw_list, false, 1u, 3u);217RD::get_singleton()->draw_list_end();218}219220void ToneMapper::tonemapper_mobile(RID p_source_color, RID p_dst_framebuffer, const TonemapSettings &p_settings) {221ERR_FAIL_COND_MSG(!using_mobile_version, "Can't use the mobile version of the tonemapper with the clustered renderer.");222UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton();223ERR_FAIL_NULL(uniform_set_cache);224MaterialStorage *material_storage = MaterialStorage::get_singleton();225ERR_FAIL_NULL(material_storage);226227memset(&tonemap_mobile.push_constant, 0, sizeof(TonemapPushConstantMobile));228229tonemap_mobile.push_constant.bcs[0] = p_settings.brightness;230tonemap_mobile.push_constant.bcs[1] = p_settings.contrast;231tonemap_mobile.push_constant.bcs[2] = p_settings.saturation;232233tonemap_mobile.push_constant.src_pixel_size[0] = 1.0 / p_settings.texture_size.x;234tonemap_mobile.push_constant.src_pixel_size[1] = 1.0 / p_settings.texture_size.y;235tonemap_mobile.push_constant.dest_pixel_size[0] = 1.0 / p_settings.dest_texture_size.x;236tonemap_mobile.push_constant.dest_pixel_size[1] = 1.0 / p_settings.dest_texture_size.y;237tonemap_mobile.push_constant.glow_intensity = p_settings.glow_intensity;238tonemap_mobile.push_constant.glow_map_strength = p_settings.glow_map_strength;239240tonemap_mobile.push_constant.exposure = p_settings.exposure;241tonemap_mobile.push_constant.white = p_settings.white;242tonemap_mobile.push_constant.luminance_multiplier = p_settings.luminance_multiplier;243tonemap_mobile.push_constant.output_max_value = MAX(p_settings.max_value, 1.0f);244245tonemap_mobile.push_constant.tonemapper_params[0] = p_settings.tonemapper_params[0];246tonemap_mobile.push_constant.tonemapper_params[1] = p_settings.tonemapper_params[1];247tonemap_mobile.push_constant.tonemapper_params[2] = p_settings.tonemapper_params[2];248tonemap_mobile.push_constant.tonemapper_params[3] = p_settings.tonemapper_params[3];249250uint32_t spec_constant = 0;251spec_constant |= p_settings.use_bcs ? TONEMAP_MOBILE_FLAG_USE_BCS : 0;252spec_constant |= p_settings.use_glow ? TONEMAP_MOBILE_FLAG_USE_GLOW : 0;253spec_constant |= p_settings.glow_map_strength > 0.01 ? TONEMAP_MOBILE_FLAG_USE_GLOW_MAP : 0;254spec_constant |= p_settings.use_color_correction ? TONEMAP_MOBILE_FLAG_USE_COLOR_CORRECTION : 0;255spec_constant |= p_settings.use_fxaa ? TONEMAP_MOBILE_FLAG_USE_FXAA : 0;256spec_constant |= p_settings.debanding_mode == TonemapSettings::DEBANDING_MODE_8_BIT ? TONEMAP_MOBILE_FLAG_USE_8_BIT_DEBANDING : 0;257spec_constant |= p_settings.debanding_mode == TonemapSettings::DEBANDING_MODE_10_BIT ? TONEMAP_MOBILE_FLAG_USE_10_BIT_DEBANDING : 0;258spec_constant |= p_settings.convert_to_srgb ? TONEMAP_MOBILE_FLAG_CONVERT_TO_SRGB : 0;259spec_constant |= p_settings.tonemap_mode == RS::ENV_TONE_MAPPER_LINEAR ? TONEMAP_MOBILE_FLAG_TONEMAPPER_LINEAR : 0;260spec_constant |= p_settings.tonemap_mode == RS::ENV_TONE_MAPPER_REINHARD ? TONEMAP_MOBILE_FLAG_TONEMAPPER_REINHARD : 0;261spec_constant |= p_settings.tonemap_mode == RS::ENV_TONE_MAPPER_FILMIC ? TONEMAP_MOBILE_FLAG_TONEMAPPER_FILMIC : 0;262spec_constant |= p_settings.tonemap_mode == RS::ENV_TONE_MAPPER_ACES ? TONEMAP_MOBILE_FLAG_TONEMAPPER_ACES : 0;263spec_constant |= p_settings.tonemap_mode == RS::ENV_TONE_MAPPER_AGX ? TONEMAP_MOBILE_FLAG_TONEMAPPER_AGX : 0;264spec_constant |= p_settings.glow_mode == RS::ENV_GLOW_BLEND_MODE_ADDITIVE ? TONEMAP_MOBILE_FLAG_GLOW_MODE_ADD : 0;265spec_constant |= p_settings.glow_mode == RS::ENV_GLOW_BLEND_MODE_SCREEN ? TONEMAP_MOBILE_FLAG_GLOW_MODE_SCREEN : 0;266spec_constant |= p_settings.glow_mode == RS::ENV_GLOW_BLEND_MODE_SOFTLIGHT ? TONEMAP_MOBILE_FLAG_GLOW_MODE_SOFTLIGHT : 0;267spec_constant |= p_settings.glow_mode == RS::ENV_GLOW_BLEND_MODE_REPLACE ? TONEMAP_MOBILE_FLAG_GLOW_MODE_REPLACE : 0;268spec_constant |= p_settings.glow_mode == RS::ENV_GLOW_BLEND_MODE_MIX ? TONEMAP_MOBILE_FLAG_GLOW_MODE_MIX : 0;269270int mode = p_settings.use_1d_color_correction ? TONEMAP_MOBILE_MODE_1D_LUT : TONEMAP_MOBILE_MODE_NORMAL;271272if (p_settings.view_count > 1) {273// Use USE_MULTIVIEW versions274mode += 4;275}276277RID default_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);278RID default_mipmap_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);279280RD::Uniform u_source_color(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_source_color }));281282RD::Uniform u_glow_texture;283u_glow_texture.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;284u_glow_texture.binding = 1;285u_glow_texture.append_id(default_mipmap_sampler);286u_glow_texture.append_id(p_settings.glow_texture);287288RD::Uniform u_glow_map;289u_glow_map.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;290u_glow_map.binding = 2;291u_glow_map.append_id(default_mipmap_sampler);292u_glow_map.append_id(p_settings.glow_map);293294RD::Uniform u_color_correction_texture;295u_color_correction_texture.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;296u_color_correction_texture.binding = 3;297u_color_correction_texture.append_id(default_sampler);298u_color_correction_texture.append_id(p_settings.color_correction_texture);299300RID shader = tonemap_mobile.shader.version_get_shader(tonemap_mobile.shader_version, mode);301ERR_FAIL_COND(shader.is_null());302303RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(p_dst_framebuffer);304RD::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));305RD::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);306RD::get_singleton()->draw_list_set_push_constant(draw_list, &tonemap_mobile.push_constant, sizeof(TonemapPushConstantMobile));307RD::get_singleton()->draw_list_draw(draw_list, false, 1u, 3u);308RD::get_singleton()->draw_list_end();309}310311void ToneMapper::tonemapper_subpass(RD::DrawListID p_subpass_draw_list, RID p_source_color, RD::FramebufferFormatID p_dst_format_id, const TonemapSettings &p_settings) {312UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton();313ERR_FAIL_NULL(uniform_set_cache);314MaterialStorage *material_storage = MaterialStorage::get_singleton();315ERR_FAIL_NULL(material_storage);316317ERR_FAIL_COND_MSG(p_settings.use_glow, "Glow is not supported when using subpasses.");318319memset(&tonemap_mobile.push_constant, 0, sizeof(TonemapPushConstantMobile));320321tonemap_mobile.push_constant.bcs[0] = p_settings.brightness;322tonemap_mobile.push_constant.bcs[1] = p_settings.contrast;323tonemap_mobile.push_constant.bcs[2] = p_settings.saturation;324325tonemap_mobile.push_constant.src_pixel_size[0] = 1.0 / p_settings.texture_size.x;326tonemap_mobile.push_constant.src_pixel_size[1] = 1.0 / p_settings.texture_size.y;327tonemap_mobile.push_constant.glow_intensity = p_settings.glow_intensity;328tonemap_mobile.push_constant.glow_map_strength = p_settings.glow_map_strength;329330tonemap_mobile.push_constant.exposure = p_settings.exposure;331tonemap_mobile.push_constant.white = p_settings.white;332tonemap_mobile.push_constant.luminance_multiplier = p_settings.luminance_multiplier;333334tonemap_mobile.push_constant.tonemapper_params[0] = p_settings.tonemapper_params[0];335tonemap_mobile.push_constant.tonemapper_params[1] = p_settings.tonemapper_params[1];336tonemap_mobile.push_constant.tonemapper_params[2] = p_settings.tonemapper_params[2];337tonemap_mobile.push_constant.tonemapper_params[3] = p_settings.tonemapper_params[3];338339uint32_t spec_constant = TONEMAP_MOBILE_ADRENO_BUG;340spec_constant |= p_settings.use_bcs ? TONEMAP_MOBILE_FLAG_USE_BCS : 0;341//spec_constant |= p_settings.use_glow ? TONEMAP_MOBILE_FLAG_USE_GLOW : 0;342//spec_constant |= p_settings.glow_map_strength > 0.01 ? TONEMAP_MOBILE_FLAG_USE_GLOW_MAP : 0;343//spec_constant |= p_settings.use_color_correction ? TONEMAP_MOBILE_FLAG_USE_COLOR_CORRECTION : 0;344//spec_constant |= p_settings.use_fxaa ? TONEMAP_MOBILE_FLAG_USE_FXAA : 0;345spec_constant |= p_settings.debanding_mode == TonemapSettings::DEBANDING_MODE_8_BIT ? TONEMAP_MOBILE_FLAG_USE_8_BIT_DEBANDING : 0;346spec_constant |= p_settings.convert_to_srgb ? TONEMAP_MOBILE_FLAG_CONVERT_TO_SRGB : 0;347spec_constant |= p_settings.tonemap_mode == RS::ENV_TONE_MAPPER_LINEAR ? TONEMAP_MOBILE_FLAG_TONEMAPPER_LINEAR : 0;348spec_constant |= p_settings.tonemap_mode == RS::ENV_TONE_MAPPER_REINHARD ? TONEMAP_MOBILE_FLAG_TONEMAPPER_REINHARD : 0;349spec_constant |= p_settings.tonemap_mode == RS::ENV_TONE_MAPPER_FILMIC ? TONEMAP_MOBILE_FLAG_TONEMAPPER_FILMIC : 0;350spec_constant |= p_settings.tonemap_mode == RS::ENV_TONE_MAPPER_ACES ? TONEMAP_MOBILE_FLAG_TONEMAPPER_ACES : 0;351spec_constant |= p_settings.tonemap_mode == RS::ENV_TONE_MAPPER_AGX ? TONEMAP_MOBILE_FLAG_TONEMAPPER_AGX : 0;352//spec_constant |= p_settings.glow_mode == RS::ENV_GLOW_BLEND_MODE_ADDITIVE ? TONEMAP_MOBILE_FLAG_GLOW_MODE_ADD : 0;353//spec_constant |= p_settings.glow_mode == RS::ENV_GLOW_BLEND_MODE_SCREEN ? TONEMAP_MOBILE_FLAG_GLOW_MODE_SCREEN : 0;354//spec_constant |= p_settings.glow_mode == RS::ENV_GLOW_BLEND_MODE_SOFTLIGHT ? TONEMAP_MOBILE_FLAG_GLOW_MODE_SOFTLIGHT : 0;355//spec_constant |= p_settings.glow_mode == RS::ENV_GLOW_BLEND_MODE_REPLACE ? TONEMAP_MOBILE_FLAG_GLOW_MODE_REPLACE : 0;356//spec_constant |= p_settings.glow_mode == RS::ENV_GLOW_BLEND_MODE_MIX ? TONEMAP_MOBILE_FLAG_GLOW_MODE_MIX : 0;357358int mode = p_settings.use_1d_color_correction ? TONEMAP_MOBILE_MODE_SUBPASS_1D_LUT : TONEMAP_MOBILE_MODE_SUBPASS;359if (p_settings.view_count > 1) {360// Use USE_MULTIVIEW versions361mode += 4;362}363364RID default_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);365RID default_mipmap_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);366367RD::Uniform u_source_color;368u_source_color.uniform_type = RD::UNIFORM_TYPE_INPUT_ATTACHMENT;369u_source_color.binding = 0;370u_source_color.append_id(p_source_color);371372RD::Uniform u_glow_texture;373u_glow_texture.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;374u_glow_texture.binding = 1;375u_glow_texture.append_id(default_mipmap_sampler);376u_glow_texture.append_id(p_settings.glow_texture);377378RD::Uniform u_glow_map;379u_glow_map.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;380u_glow_map.binding = 2;381u_glow_map.append_id(default_mipmap_sampler);382u_glow_map.append_id(p_settings.glow_map);383384RD::Uniform u_color_correction_texture;385u_color_correction_texture.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE;386u_color_correction_texture.binding = 3;387u_color_correction_texture.append_id(default_sampler);388u_color_correction_texture.append_id(p_settings.color_correction_texture);389390RID shader = tonemap_mobile.shader.version_get_shader(tonemap_mobile.shader_version, mode);391ERR_FAIL_COND(shader.is_null());392393RD::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));394RD::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);395RD::get_singleton()->draw_list_set_push_constant(p_subpass_draw_list, &tonemap_mobile.push_constant, sizeof(TonemapPushConstantMobile));396RD::get_singleton()->draw_list_draw(p_subpass_draw_list, false, 1u, 3u);397}398399400