Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Forbid passing multiview sampler to the custom function in shaders #72300

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions drivers/gles3/rasterizer_gles3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,11 @@ void RasterizerGLES3::finalize() {
memdelete(config);
}

RasterizerGLES3 *RasterizerGLES3::singleton = nullptr;

RasterizerGLES3::RasterizerGLES3() {
singleton = this;

#ifdef GLAD_ENABLED
if (!gladLoaderLoadGL()) {
ERR_PRINT("Error initializing GLAD");
Expand Down
2 changes: 2 additions & 0 deletions drivers/gles3/rasterizer_gles3.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ class RasterizerGLES3 : public RendererCompositor {
GLES3::CopyEffects *copy_effects = nullptr;
RasterizerCanvasGLES3 *canvas = nullptr;
RasterizerSceneGLES3 *scene = nullptr;
static RasterizerGLES3 *singleton;

void _blit_render_target_to_screen(RID p_render_target, DisplayServer::WindowID p_screen, const Rect2 &p_screen_rect, uint32_t p_layer, bool p_first = true);

Expand Down Expand Up @@ -107,6 +108,7 @@ class RasterizerGLES3 : public RendererCompositor {
_ALWAYS_INLINE_ double get_frame_delta_time() const { return delta; }
_ALWAYS_INLINE_ double get_total_time() const { return time_total; }

static RasterizerGLES3 *get_singleton() { return singleton; }
RasterizerGLES3();
~RasterizerGLES3();
};
Expand Down
3 changes: 2 additions & 1 deletion drivers/gles3/storage/material_storage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
#include "texture_storage.h"

#include "drivers/gles3/rasterizer_canvas_gles3.h"
#include "drivers/gles3/rasterizer_gles3.h"

using namespace GLES3;

Expand Down Expand Up @@ -1721,7 +1722,7 @@ MaterialStorage::MaterialStorage() {
actions.default_filter = ShaderLanguage::FILTER_LINEAR_MIPMAP;
actions.default_repeat = ShaderLanguage::REPEAT_ENABLE;

actions.check_multiview_samplers = true;
actions.check_multiview_samplers = RasterizerGLES3::get_singleton()->is_xr_enabled();
actions.global_buffer_array_variable = "global_shader_uniforms";

shaders.compiler_scene.initialize(actions);
Expand Down
4 changes: 4 additions & 0 deletions servers/rendering/renderer_compositor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
#include "core/string/print_string.h"
#include "servers/xr_server.h"

RendererCompositor *RendererCompositor::singleton = nullptr;

RendererCompositor *(*RendererCompositor::_create_func)() = nullptr;
bool RendererCompositor::low_end = false;

Expand All @@ -47,6 +49,8 @@ bool RendererCompositor::is_xr_enabled() const {
}

RendererCompositor::RendererCompositor() {
singleton = this;

if (XRServer::get_xr_mode() == XRServer::XRMODE_DEFAULT) {
xr_enabled = GLOBAL_GET("xr/shaders/enabled");
} else {
Expand Down
2 changes: 2 additions & 0 deletions servers/rendering/renderer_compositor.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ struct BlitToScreen {
class RendererCompositor {
private:
bool xr_enabled = false;
static RendererCompositor *singleton;

protected:
static RendererCompositor *(*_create_func)();
Expand Down Expand Up @@ -107,6 +108,7 @@ class RendererCompositor {
static bool is_low_end() { return low_end; };
virtual bool is_xr_enabled() const;

static RendererCompositor *get_singleton() { return singleton; }
RendererCompositor();
virtual ~RendererCompositor() {}
};
Expand Down
4 changes: 2 additions & 2 deletions servers/rendering/renderer_rd/effects/copy_effects.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ CopyEffects::CopyEffects(bool p_prefer_raster_effects) {

copy_to_fb.shader.initialize(copy_modes);

if (!RendererCompositorRD::singleton->is_xr_enabled()) {
if (!RendererCompositorRD::get_singleton()->is_xr_enabled()) {
copy_to_fb.shader.set_variant_enabled(COPY_TO_FB_MULTIVIEW, false);
copy_to_fb.shader.set_variant_enabled(COPY_TO_FB_MULTIVIEW_WITH_DEPTH, false);
}
Expand Down Expand Up @@ -266,7 +266,7 @@ CopyEffects::CopyEffects(bool p_prefer_raster_effects) {

specular_merge.shader.initialize(specular_modes);

if (!RendererCompositorRD::singleton->is_xr_enabled()) {
if (!RendererCompositorRD::get_singleton()->is_xr_enabled()) {
specular_merge.shader.set_variant_enabled(SPECULAR_MERGE_ADD_MULTIVIEW, false);
specular_merge.shader.set_variant_enabled(SPECULAR_MERGE_SSR_MULTIVIEW, false);
specular_merge.shader.set_variant_enabled(SPECULAR_MERGE_ADDITIVE_ADD_MULTIVIEW, false);
Expand Down
2 changes: 1 addition & 1 deletion servers/rendering/renderer_rd/effects/tone_mapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ ToneMapper::ToneMapper() {

tonemap.shader.initialize(tonemap_modes);

if (!RendererCompositorRD::singleton->is_xr_enabled()) {
if (!RendererCompositorRD::get_singleton()->is_xr_enabled()) {
tonemap.shader.set_variant_enabled(TONEMAP_MODE_NORMAL_MULTIVIEW, false);
tonemap.shader.set_variant_enabled(TONEMAP_MODE_BICUBIC_GLOW_FILTER_MULTIVIEW, false);
tonemap.shader.set_variant_enabled(TONEMAP_MODE_1D_LUT_MULTIVIEW, false);
Expand Down
2 changes: 1 addition & 1 deletion servers/rendering/renderer_rd/effects/vrs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ VRS::VRS() {

vrs_shader.shader.initialize(vrs_modes);

if (!RendererCompositorRD::singleton->is_xr_enabled()) {
if (!RendererCompositorRD::get_singleton()->is_xr_enabled()) {
vrs_shader.shader.set_variant_enabled(VRS_MULTIVIEW, false);
}

Expand Down
4 changes: 2 additions & 2 deletions servers/rendering/renderer_rd/environment/sky.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ void SkyRD::ReflectionData::update_reflection_data(int p_size, int p_mipmaps, bo
int mipmaps = p_mipmaps;
uint32_t w = p_size, h = p_size;

EffectsRD *effects = RendererCompositorRD::singleton->get_effects();
EffectsRD *effects = RendererCompositorRD::get_singleton()->get_effects();
ERR_FAIL_NULL_MSG(effects, "Effects haven't been initialized");
bool prefer_raster_effects = effects->get_prefer_raster_effects();

Expand Down Expand Up @@ -756,7 +756,7 @@ void SkyRD::init() {

sky_shader.shader.initialize(sky_modes, defines);

if (!RendererCompositorRD::singleton->is_xr_enabled()) {
if (!RendererCompositorRD::get_singleton()->is_xr_enabled()) {
sky_shader.shader.set_variant_enabled(SKY_VERSION_BACKGROUND_MULTIVIEW, false);
sky_shader.shader.set_variant_enabled(SKY_VERSION_HALF_RES_MULTIVIEW, false);
sky_shader.shader.set_variant_enabled(SKY_VERSION_QUARTER_RES_MULTIVIEW, false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -504,7 +504,7 @@ void SceneShaderForwardClustered::init(const String p_defines) {

shader.initialize(shader_versions, p_defines);

if (!RendererCompositorRD::singleton->is_xr_enabled()) {
if (!RendererCompositorRD::get_singleton()->is_xr_enabled()) {
shader.set_variant_enabled(SHADER_VERSION_DEPTH_PASS_MULTIVIEW, false);
shader.set_variant_enabled(SHADER_VERSION_DEPTH_PASS_WITH_NORMAL_AND_ROUGHNESS_MULTIVIEW, false);
shader.set_variant_enabled(SHADER_VERSION_DEPTH_PASS_WITH_NORMAL_AND_ROUGHNESS_AND_VOXEL_GI_MULTIVIEW, false);
Expand Down Expand Up @@ -730,7 +730,7 @@ void SceneShaderForwardClustered::init(const String p_defines) {
actions.global_buffer_array_variable = "global_shader_uniforms.data";
actions.instance_uniform_index_variable = "instances.data[instance_index_interp].instance_uniforms_ofs";

actions.check_multiview_samplers = true; // make sure we check sampling multiview textures
actions.check_multiview_samplers = RendererCompositorRD::get_singleton()->is_xr_enabled(); // Make sure we check sampling multiview textures.

compiler.initialize(actions);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -421,7 +421,7 @@ void SceneShaderForwardMobile::init(const String p_defines) {

shader.initialize(shader_versions, p_defines);

if (!RendererCompositorRD::singleton->is_xr_enabled()) {
if (!RendererCompositorRD::get_singleton()->is_xr_enabled()) {
shader.set_variant_enabled(SHADER_VERSION_COLOR_PASS_MULTIVIEW, false);
shader.set_variant_enabled(SHADER_VERSION_LIGHTMAP_COLOR_PASS_MULTIVIEW, false);
shader.set_variant_enabled(SHADER_VERSION_SHADOW_PASS_MULTIVIEW, false);
Expand Down Expand Up @@ -610,7 +610,7 @@ void SceneShaderForwardMobile::init(const String p_defines) {
actions.instance_uniform_index_variable = "draw_call.instance_uniforms_ofs";

actions.apply_luminance_multiplier = true; // apply luminance multiplier to screen texture
actions.check_multiview_samplers = true; // make sure we check sampling multiview textures
actions.check_multiview_samplers = RendererCompositorRD::get_singleton()->is_xr_enabled(); // Make sure we check sampling multiview textures.

compiler.initialize(actions);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -919,7 +919,7 @@ void RendererCanvasRenderRD::_render_item(RD::DrawListID p_draw_list, RID p_rend
} break;
case Item::Command::TYPE_ANIMATION_SLICE: {
const Item::CommandAnimationSlice *as = static_cast<const Item::CommandAnimationSlice *>(c);
double current_time = RendererCompositorRD::singleton->get_total_time();
double current_time = RendererCompositorRD::get_singleton()->get_total_time();
double local_time = Math::fposmod(current_time - as->offset, as->animation_length);
skipping = !(local_time >= as->slice_begin && local_time < as->slice_end);

Expand Down
3 changes: 2 additions & 1 deletion servers/rendering/renderer_rd/renderer_compositor_rd.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ class RendererCompositorRD : public RendererCompositor {
double delta = 0.0;

static uint64_t frame;
static RendererCompositorRD *singleton;

public:
RendererUtilities *get_utilities() { return utilities; };
Expand Down Expand Up @@ -145,7 +146,7 @@ class RendererCompositorRD : public RendererCompositor {
low_end = false;
}

static RendererCompositorRD *singleton;
static RendererCompositorRD *get_singleton() { return singleton; }
RendererCompositorRD();
~RendererCompositorRD();
};
Expand Down
10 changes: 5 additions & 5 deletions servers/rendering/renderer_rd/storage_rd/particles_storage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -774,7 +774,7 @@ void ParticlesStorage::_particles_process(Particles *p_particles, double p_delta

p_particles->phase = new_phase;

frame_params.time = RendererCompositorRD::singleton->get_total_time();
frame_params.time = RendererCompositorRD::get_singleton()->get_total_time();
frame_params.delta = p_delta * p_particles->speed_scale;
frame_params.random_seed = p_particles->random_seed;
frame_params.explosiveness = p_particles->explosiveness;
Expand Down Expand Up @@ -1228,7 +1228,7 @@ void ParticlesStorage::particles_set_view_axis(RID p_particles, const Vector3 &p
RD::get_singleton()->compute_list_dispatch_threads(compute_list, particles->amount, 1, 1);

RD::get_singleton()->compute_list_end();
RendererCompositorRD::singleton->get_effects()->sort_buffer(particles->particles_sort_uniform_set, particles->amount);
RendererCompositorRD::get_singleton()->get_effects()->sort_buffer(particles->particles_sort_uniform_set, particles->amount);
}

if (particles->trails_enabled && particles->trail_bind_poses.size() > 1) {
Expand Down Expand Up @@ -1341,7 +1341,7 @@ void ParticlesStorage::update_particles() {
particles->inactive = false;
particles->inactive_time = 0;
} else {
particles->inactive_time += particles->speed_scale * RendererCompositorRD::singleton->get_frame_delta_time();
particles->inactive_time += particles->speed_scale * RendererCompositorRD::get_singleton()->get_frame_delta_time();
if (particles->inactive_time > particles->lifetime * 1.2) {
particles->inactive = true;
continue;
Expand Down Expand Up @@ -1442,7 +1442,7 @@ void ParticlesStorage::update_particles() {
frame_time = 1.0 / fixed_fps;
decr = frame_time;
}
double delta = RendererCompositorRD::singleton->get_frame_delta_time();
double delta = RendererCompositorRD::get_singleton()->get_frame_delta_time();
if (delta > 0.1) { //avoid recursive stalls if fps goes below 10
delta = 0.1;
} else if (delta <= 0.0) { //unlikely but..
Expand All @@ -1461,7 +1461,7 @@ void ParticlesStorage::update_particles() {
if (zero_time_scale) {
_particles_process(particles, 0.0);
} else {
_particles_process(particles, RendererCompositorRD::singleton->get_frame_delta_time());
_particles_process(particles, RendererCompositorRD::get_singleton()->get_frame_delta_time());
}
}

Expand Down
19 changes: 17 additions & 2 deletions servers/rendering/shader_language.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
#include "core/os/os.h"
#include "core/string/print_string.h"
#include "core/templates/local_vector.h"
#include "servers/rendering/renderer_compositor.h"
#include "servers/rendering_server.h"
#include "shader_types.h"

Expand Down Expand Up @@ -3055,7 +3056,7 @@ const ShaderLanguage::BuiltinFuncConstArgs ShaderLanguage::builtin_func_const_ar

bool ShaderLanguage::is_const_suffix_lut_initialized = false;

bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionInfo &p_function_info, OperatorNode *p_func, DataType *r_ret_type, StringName *r_ret_type_str) {
bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionInfo &p_function_info, OperatorNode *p_func, DataType *r_ret_type, StringName *r_ret_type_str, bool *r_is_custom_function) {
ERR_FAIL_COND_V(p_func->op != OP_CALL && p_func->op != OP_CONSTRUCT, false);

Vector<DataType> args;
Expand Down Expand Up @@ -3479,6 +3480,9 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI
}
}

if (r_is_custom_function) {
clayjohn marked this conversation as resolved.
Show resolved Hide resolved
*r_is_custom_function = true;
}
return true;
}
}
Expand Down Expand Up @@ -5251,7 +5255,8 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons
return nullptr;
}

if (!_validate_function_call(p_block, p_function_info, func, &func->return_cache, &func->struct_name)) {
bool is_custom_func = false;
if (!_validate_function_call(p_block, p_function_info, func, &func->return_cache, &func->struct_name, &is_custom_func)) {
_set_error(vformat(RTR("No matching function found for: '%s'."), String(funcname->name)));
return nullptr;
}
Expand Down Expand Up @@ -5391,6 +5396,16 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons
//being sampler, this either comes from a uniform
ShaderNode::Uniform *u = &shader->uniforms[varname];
ERR_CONTINUE(u->type != call_function->arguments[i].type); //this should have been validated previously

if (RendererCompositor::get_singleton()->is_xr_enabled() && is_custom_func) {
ShaderNode::Uniform::Hint hint = u->hint;

if (hint == ShaderNode::Uniform::HINT_DEPTH_TEXTURE || hint == ShaderNode::Uniform::HINT_SCREEN_TEXTURE || hint == ShaderNode::Uniform::HINT_NORMAL_ROUGHNESS_TEXTURE) {
_set_error(vformat(RTR("Unable to pass a multiview texture sampler as a parameter to custom function. Consider to sample it in the main function and then pass the vector result to it."), get_uniform_hint_name(hint)));
return nullptr;
}
}

//propagate
if (!_propagate_function_call_sampler_uniform_settings(name, i, u->filter, u->repeat)) {
return nullptr;
Expand Down
2 changes: 1 addition & 1 deletion servers/rendering/shader_language.h
Original file line number Diff line number Diff line change
Expand Up @@ -1088,7 +1088,7 @@ class ShaderLanguage {
bool _compare_datatypes(DataType p_datatype_a, String p_datatype_name_a, int p_array_size_a, DataType p_datatype_b, String p_datatype_name_b, int p_array_size_b);
bool _compare_datatypes_in_nodes(Node *a, Node *b);

bool _validate_function_call(BlockNode *p_block, const FunctionInfo &p_function_info, OperatorNode *p_func, DataType *r_ret_type, StringName *r_ret_type_str);
bool _validate_function_call(BlockNode *p_block, const FunctionInfo &p_function_info, OperatorNode *p_func, DataType *r_ret_type, StringName *r_ret_type_str, bool *r_is_custom_function = nullptr);
bool _parse_function_arguments(BlockNode *p_block, const FunctionInfo &p_function_info, OperatorNode *p_func, int *r_complete_arg = nullptr);
bool _propagate_function_call_sampler_uniform_settings(StringName p_name, int p_argument, TextureFilter p_filter, TextureRepeat p_repeat);
bool _propagate_function_call_sampler_builtin_reference(StringName p_name, int p_argument, const StringName &p_builtin);
Expand Down