Skip to content
Open
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
2 changes: 2 additions & 0 deletions drivers/d3d12/rendering_device_driver_d3d12.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6198,6 +6198,8 @@ bool RenderingDeviceDriverD3D12::has_feature(Features p_feature) {
return true;
case SUPPORTS_VULKAN_MEMORY_MODEL:
return false;
case SUPPORTS_POINT_SIZE:
return false;
default:
return false;
}
Expand Down
2 changes: 2 additions & 0 deletions drivers/metal/rendering_device_driver_metal.mm
Original file line number Diff line number Diff line change
Expand Up @@ -2567,6 +2567,8 @@ static void update_uniform_info(const RenderingShaderContainerMetal::UniformData
return device_properties->features.supports_native_image_atomics;
case SUPPORTS_VULKAN_MEMORY_MODEL:
return true;
case SUPPORTS_POINT_SIZE:
return true;
default:
return false;
}
Expand Down
2 changes: 2 additions & 0 deletions drivers/vulkan/rendering_device_driver_vulkan.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6196,6 +6196,8 @@ bool RenderingDeviceDriverVulkan::has_feature(Features p_feature) {
#endif
case SUPPORTS_VULKAN_MEMORY_MODEL:
return vulkan_memory_model_support && vulkan_memory_model_device_scope_support;
case SUPPORTS_POINT_SIZE:
return true;
default:
return false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -484,6 +484,7 @@ void RenderForwardClustered::_render_list_template(RenderingDevice::DrawListID p
pipeline_key.framebuffer_format_id = framebuffer_format;
pipeline_key.wireframe = p_params->force_wireframe;
pipeline_key.ubershader = 0;
pipeline_key.emulate_point_size = shader->uses_point_size && scene_shader.emulate_point_size;

const RD::PolygonCullMode cull_mode = shader->get_cull_mode_from_cull_variant(cull_variant);
RID vertex_array_rd;
Expand All @@ -497,9 +498,9 @@ void RenderForwardClustered::_render_list_template(RenderingDevice::DrawListID p
bool pipeline_motion_vectors = pipeline_key.color_pass_flags & SceneShaderForwardClustered::PIPELINE_COLOR_PASS_FLAG_MOTION_VECTORS;
uint64_t input_mask = shader->get_vertex_input_mask(pipeline_key.version, pipeline_key.color_pass_flags, pipeline_key.ubershader);
if (surf->owner->mesh_instance.is_valid()) {
mesh_storage->mesh_instance_surface_get_vertex_arrays_and_format(surf->owner->mesh_instance, surf->surface_index, input_mask, pipeline_motion_vectors, vertex_array_rd, vertex_format);
mesh_storage->mesh_instance_surface_get_vertex_arrays_and_format(surf->owner->mesh_instance, surf->surface_index, input_mask, pipeline_motion_vectors, pipeline_key.emulate_point_size, vertex_array_rd, vertex_format);
} else {
mesh_storage->mesh_surface_get_vertex_arrays_and_format(mesh_surface, input_mask, pipeline_motion_vectors, vertex_array_rd, vertex_format);
mesh_storage->mesh_surface_get_vertex_arrays_and_format(mesh_surface, input_mask, pipeline_motion_vectors, pipeline_key.emulate_point_size, vertex_array_rd, vertex_format);
}

pipeline_key.vertex_format_id = vertex_format;
Expand Down Expand Up @@ -534,7 +535,11 @@ void RenderForwardClustered::_render_list_template(RenderingDevice::DrawListID p
}

if (pipeline_valid) {
index_array_rd = mesh_storage->mesh_surface_get_index_array(mesh_surface, element_info.lod_index);
if (!pipeline_key.emulate_point_size) {
index_array_rd = mesh_storage->mesh_surface_get_index_array(mesh_surface, element_info.lod_index);
} else {
index_array_rd = RID();
}

if (prev_vertex_array_rd != vertex_array_rd) {
RD::get_singleton()->draw_list_bind_vertex_array(draw_list, vertex_array_rd);
Expand Down Expand Up @@ -592,7 +597,14 @@ void RenderForwardClustered::_render_list_template(RenderingDevice::DrawListID p
instance_count /= surf->owner->trail_steps;
}

if (bool(surf->owner->base_flags & INSTANCE_DATA_FLAG_MULTIMESH_INDIRECT)) {
bool indirect = bool(surf->owner->base_flags & INSTANCE_DATA_FLAG_MULTIMESH_INDIRECT);

if (pipeline_key.emulate_point_size) {
if (indirect) {
WARN_PRINT("Indirect draws are not supported when emulating point size.");
}
RD::get_singleton()->draw_list_draw(draw_list, false, mesh_storage->mesh_surface_get_vertex_count(mesh_surface), instance_count * 6);
} else if (indirect) {
RD::get_singleton()->draw_list_draw_indirect(draw_list, index_array_rd.is_valid(), mesh_storage->_multimesh_get_command_buffer_rd_rid(surf->owner->data->base), surf->surface_index * sizeof(uint32_t) * mesh_storage->INDIRECT_MULTIMESH_COMMAND_STRIDE, 1, 0);
} else {
RD::get_singleton()->draw_list_draw(draw_list, index_array_rd.is_valid(), instance_count);
Expand Down Expand Up @@ -4517,7 +4529,7 @@ void RenderForwardClustered::_mesh_compile_pipeline_for_surface(SceneShaderForwa
RendererRD::MeshStorage *mesh_storage = RendererRD::MeshStorage::get_singleton();
uint64_t input_mask = p_shader->get_vertex_input_mask(r_pipeline_key.version, r_pipeline_key.color_pass_flags, p_ubershader);
bool pipeline_motion_vectors = r_pipeline_key.color_pass_flags & SceneShaderForwardClustered::PIPELINE_COLOR_PASS_FLAG_MOTION_VECTORS;
r_pipeline_key.vertex_format_id = mesh_storage->mesh_surface_get_vertex_format(p_mesh_surface, input_mask, p_instanced_surface, pipeline_motion_vectors);
r_pipeline_key.vertex_format_id = mesh_storage->mesh_surface_get_vertex_format(p_mesh_surface, input_mask, p_instanced_surface, pipeline_motion_vectors, r_pipeline_key.emulate_point_size);
r_pipeline_key.ubershader = p_ubershader;

p_shader->pipeline_hash_map.compile_pipeline(r_pipeline_key, r_pipeline_key.hash(), p_source, p_ubershader);
Expand All @@ -4540,6 +4552,7 @@ void RenderForwardClustered::_mesh_compile_pipelines_for_surface(const SurfacePi
pipeline_key.cull_mode = RD::POLYGON_CULL_DISABLED;
pipeline_key.primitive_type = mesh_storage->mesh_surface_get_primitive(p_surface.mesh_surface);
pipeline_key.wireframe = false;
pipeline_key.emulate_point_size = p_surface.shader->uses_point_size && scene_shader.emulate_point_size;

// Grab the shader and surface used for most passes.
const uint32_t multiview_iterations = multiview_enabled ? 2 : 1;
Expand Down Expand Up @@ -4638,6 +4651,7 @@ void RenderForwardClustered::_mesh_compile_pipelines_for_surface(const SurfacePi
pipeline_key.primitive_type = mesh_storage->mesh_surface_get_primitive(p_surface.mesh_surface_shadow);
pipeline_key.version = SceneShaderForwardClustered::PIPELINE_VERSION_DEPTH_PASS;
pipeline_key.framebuffer_format_id = _get_depth_framebuffer_format_for_pipeline(buffers_can_be_storage, RD::TextureSamples(p_global.texture_samples), false, false);
pipeline_key.emulate_point_size = p_surface.shader_shadow->uses_point_size && scene_shader.emulate_point_size;
_mesh_compile_pipeline_for_surface(p_surface.shader_shadow, p_surface.mesh_surface_shadow, true, p_surface.instanced, p_source, pipeline_key, r_pipeline_pairs);

if (p_global.use_shadow_dual_paraboloid) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -411,7 +411,12 @@ void SceneShaderForwardClustered::ShaderData::_create_pipeline(PipelineKey p_pip
RD::RENDER_PRIMITIVE_TRIANGLE_STRIPS,
};

RD::RenderPrimitive primitive_rd = uses_point_size ? RD::RENDER_PRIMITIVE_POINTS : primitive_rd_table[p_pipeline_key.primitive_type];
RD::RenderPrimitive primitive_rd;
if (uses_point_size) {
primitive_rd = p_pipeline_key.emulate_point_size ? RD::RENDER_PRIMITIVE_TRIANGLES : RD::RENDER_PRIMITIVE_POINTS;
} else {
primitive_rd = primitive_rd_table[p_pipeline_key.primitive_type];
}

RD::PipelineRasterizationState raster_state;
raster_state.cull_mode = p_pipeline_key.cull_mode;
Expand Down Expand Up @@ -479,6 +484,13 @@ void SceneShaderForwardClustered::ShaderData::_create_pipeline(PipelineKey p_pip

sc.constant_id = 1;
sc.int_value = p_pipeline_key.shader_specialization.packed_1;
sc.type = RD::PIPELINE_SPECIALIZATION_CONSTANT_TYPE_INT;
specialization_constants.push_back(sc);

sc = {}; // Sanitize value bits. "bool_value" only assigns 8 bits and keeps the remaining bits intact.
sc.constant_id = 2;
sc.bool_value = p_pipeline_key.emulate_point_size;
sc.type = RD::PIPELINE_SPECIALIZATION_CONSTANT_TYPE_BOOL;
specialization_constants.push_back(sc);

RID shader_rid = get_shader_variant(p_pipeline_key.version, p_pipeline_key.color_pass_flags, p_pipeline_key.ubershader);
Expand Down Expand Up @@ -621,6 +633,8 @@ SceneShaderForwardClustered::~SceneShaderForwardClustered() {
void SceneShaderForwardClustered::init(const String p_defines) {
RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();

emulate_point_size = !RD::get_singleton()->has_feature(RD::SUPPORTS_POINT_SIZE);

{
Vector<ShaderRD::VariantDefine> shader_versions;
for (uint32_t ubershader = 0; ubershader < 2; ubershader++) {
Expand Down Expand Up @@ -701,9 +715,9 @@ void SceneShaderForwardClustered::init(const String p_defines) {
actions.renames["UV"] = "uv_interp";
actions.renames["UV2"] = "uv2_interp";
actions.renames["COLOR"] = "color_interp";
actions.renames["POINT_SIZE"] = "gl_PointSize";
actions.renames["INSTANCE_ID"] = "gl_InstanceIndex";
actions.renames["VERTEX_ID"] = "gl_VertexIndex";
actions.renames["POINT_SIZE"] = "point_size";
actions.renames["INSTANCE_ID"] = "INSTANCE_INDEX";
actions.renames["VERTEX_ID"] = "VERTEX_INDEX";
actions.renames["Z_CLIP_SCALE"] = "z_clip_scale";

actions.renames["ALPHA_SCISSOR_THRESHOLD"] = "alpha_scissor_threshold";
Expand Down Expand Up @@ -748,7 +762,7 @@ void SceneShaderForwardClustered::init(const String p_defines) {
actions.renames["AO"] = "ao";
actions.renames["AO_LIGHT_AFFECT"] = "ao_light_affect";
actions.renames["EMISSION"] = "emission";
actions.renames["POINT_COORD"] = "gl_PointCoord";
actions.renames["POINT_COORD"] = "point_coord";
actions.renames["INSTANCE_CUSTOM"] = "instance_custom";
actions.renames["SCREEN_UV"] = "screen_uv";
actions.renames["DEPTH"] = "gl_FragDepth";
Expand Down Expand Up @@ -829,6 +843,9 @@ void SceneShaderForwardClustered::init(const String p_defines) {

actions.usage_defines["MODEL_MATRIX"] = "#define MODEL_MATRIX_USED\n";

actions.usage_defines["POINT_SIZE"] = "#define POINT_SIZE_USED\n";
actions.usage_defines["POINT_COORD"] = "#define POINT_COORD_USED\n";

actions.render_mode_defines["skip_vertex_transform"] = "#define SKIP_TRANSFORM_USED\n";
actions.render_mode_defines["world_vertex_coords"] = "#define VERTEX_WORLD_COORDS_USED\n";
actions.render_mode_defines["ensure_correct_normals"] = "#define ENSURE_CORRECT_NORMALS\n";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,7 @@ class SceneShaderForwardClustered {
ShaderSpecialization shader_specialization = {};
uint32_t wireframe = false;
uint32_t ubershader = false;
bool emulate_point_size = false;

uint32_t hash() const {
uint32_t h = hash_murmur3_one_64(vertex_format_id);
Expand All @@ -208,6 +209,7 @@ class SceneShaderForwardClustered {
h = hash_murmur3_one_32(shader_specialization.packed_2, h);
h = hash_murmur3_one_32(wireframe, h);
h = hash_murmur3_one_32(ubershader, h);
h = hash_murmur3_one_32(emulate_point_size, h);
return hash_fmix32(h);
}
};
Expand Down Expand Up @@ -342,6 +344,7 @@ class SceneShaderForwardClustered {

SceneForwardClusteredShaderRD shader;
ShaderCompiler compiler;
bool emulate_point_size = false;

RID default_shader;
RID default_material;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2393,6 +2393,7 @@ void RenderForwardMobile::_render_list_template(RenderingDevice::DrawListID p_dr
pipeline_key.wireframe = p_params->force_wireframe;
pipeline_key.render_pass = p_params->subpass;
pipeline_key.ubershader = 0;
pipeline_key.emulate_point_size = shader->uses_point_size && scene_shader.emulate_point_size;

const RD::PolygonCullMode cull_mode = shader->get_cull_mode_from_cull_variant(cull_variant);
RD::VertexFormatID vertex_format = -1;
Expand All @@ -2405,9 +2406,9 @@ void RenderForwardMobile::_render_list_template(RenderingDevice::DrawListID p_dr
// Skeleton and blend shape.
uint64_t input_mask = shader->get_vertex_input_mask(pipeline_key.version, pipeline_key.ubershader);
if (surf->owner->mesh_instance.is_valid()) {
mesh_storage->mesh_instance_surface_get_vertex_arrays_and_format(surf->owner->mesh_instance, surf->surface_index, input_mask, p_pass_mode == PASS_MODE_MOTION_VECTORS, vertex_array_rd, vertex_format);
mesh_storage->mesh_instance_surface_get_vertex_arrays_and_format(surf->owner->mesh_instance, surf->surface_index, input_mask, p_pass_mode == PASS_MODE_MOTION_VECTORS, pipeline_key.emulate_point_size, vertex_array_rd, vertex_format);
} else {
mesh_storage->mesh_surface_get_vertex_arrays_and_format(mesh_surface, input_mask, p_pass_mode == PASS_MODE_MOTION_VECTORS, vertex_array_rd, vertex_format);
mesh_storage->mesh_surface_get_vertex_arrays_and_format(mesh_surface, input_mask, p_pass_mode == PASS_MODE_MOTION_VECTORS, pipeline_key.emulate_point_size, vertex_array_rd, vertex_format);
}

pipeline_key.vertex_format_id = vertex_format;
Expand Down Expand Up @@ -2442,7 +2443,11 @@ void RenderForwardMobile::_render_list_template(RenderingDevice::DrawListID p_dr
}

if (pipeline_valid) {
index_array_rd = mesh_storage->mesh_surface_get_index_array(mesh_surface, element_info.lod_index);
if (!pipeline_key.emulate_point_size) {
index_array_rd = mesh_storage->mesh_surface_get_index_array(mesh_surface, element_info.lod_index);
} else {
index_array_rd = RID();
}

if (prev_vertex_array_rd != vertex_array_rd) {
RD::get_singleton()->draw_list_bind_vertex_array(draw_list, vertex_array_rd);
Expand Down Expand Up @@ -2500,7 +2505,14 @@ void RenderForwardMobile::_render_list_template(RenderingDevice::DrawListID p_dr
instance_count /= surf->owner->trail_steps;
}

if (bool(surf->owner->base_flags & INSTANCE_DATA_FLAG_MULTIMESH_INDIRECT)) {
bool indirect = bool(surf->owner->base_flags & INSTANCE_DATA_FLAG_MULTIMESH_INDIRECT);

if (pipeline_key.emulate_point_size) {
if (indirect) {
WARN_PRINT("Indirect draws are not supported when emulating point size.");
}
RD::get_singleton()->draw_list_draw(draw_list, false, mesh_storage->mesh_surface_get_vertex_count(mesh_surface), instance_count * 6);
} else if (indirect) {
RD::get_singleton()->draw_list_draw_indirect(draw_list, index_array_rd.is_valid(), mesh_storage->_multimesh_get_command_buffer_rd_rid(surf->owner->data->base), surf->surface_index * sizeof(uint32_t) * mesh_storage->INDIRECT_MULTIMESH_COMMAND_STRIDE, 1, 0);
} else {
RD::get_singleton()->draw_list_draw(draw_list, index_array_rd.is_valid(), instance_count);
Expand Down Expand Up @@ -3132,7 +3144,7 @@ static RD::FramebufferFormatID _get_shadow_atlas_framebuffer_format_for_pipeline
void RenderForwardMobile::_mesh_compile_pipeline_for_surface(SceneShaderForwardMobile::ShaderData *p_shader, void *p_mesh_surface, bool p_instanced_surface, RS::PipelineSource p_source, SceneShaderForwardMobile::ShaderData::PipelineKey &r_pipeline_key, Vector<ShaderPipelinePair> *r_pipeline_pairs) {
RendererRD::MeshStorage *mesh_storage = RendererRD::MeshStorage::get_singleton();
uint64_t input_mask = p_shader->get_vertex_input_mask(r_pipeline_key.version, true);
r_pipeline_key.vertex_format_id = mesh_storage->mesh_surface_get_vertex_format(p_mesh_surface, input_mask, p_instanced_surface, false);
r_pipeline_key.vertex_format_id = mesh_storage->mesh_surface_get_vertex_format(p_mesh_surface, input_mask, p_instanced_surface, false, r_pipeline_key.emulate_point_size);
r_pipeline_key.ubershader = true;
p_shader->pipeline_hash_map.compile_pipeline(r_pipeline_key, r_pipeline_key.hash(), p_source, r_pipeline_key.ubershader);

Expand All @@ -3149,6 +3161,7 @@ void RenderForwardMobile::_mesh_compile_pipelines_for_surface(const SurfacePipel
pipeline_key.cull_mode = RD::POLYGON_CULL_DISABLED;
pipeline_key.primitive_type = mesh_storage->mesh_surface_get_primitive(p_surface.mesh_surface);
pipeline_key.wireframe = false;
pipeline_key.emulate_point_size = p_surface.shader->uses_point_size && scene_shader.emulate_point_size;

const bool multiview_enabled = p_global.use_multiview && scene_shader.is_multiview_shader_group_enabled();
const bool buffers_can_be_storage = _render_buffers_can_be_storage();
Expand Down Expand Up @@ -3200,6 +3213,8 @@ void RenderForwardMobile::_mesh_compile_pipelines_for_surface(const SurfacePipel
return;
}

pipeline_key.emulate_point_size = p_surface.shader_shadow->uses_point_size && scene_shader.emulate_point_size;

if (p_global.use_shadow_cubemaps) {
pipeline_key.version = SceneShaderForwardMobile::SHADER_VERSION_SHADOW_PASS;
pipeline_key.framebuffer_format_id = _get_shadow_cubemap_framebuffer_format_for_pipeline();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -366,7 +366,12 @@ void SceneShaderForwardMobile::ShaderData::_create_pipeline(PipelineKey p_pipeli
depth_stencil_state.back_op = op;
}

RD::RenderPrimitive primitive_rd = uses_point_size ? RD::RENDER_PRIMITIVE_POINTS : primitive_rd_table[p_pipeline_key.primitive_type];
RD::RenderPrimitive primitive_rd;
if (uses_point_size) {
primitive_rd = p_pipeline_key.emulate_point_size ? RD::RENDER_PRIMITIVE_TRIANGLES : RD::RENDER_PRIMITIVE_POINTS;
} else {
primitive_rd = primitive_rd_table[p_pipeline_key.primitive_type];
}

RD::PipelineRasterizationState raster_state;
raster_state.cull_mode = p_pipeline_key.cull_mode;
Expand Down Expand Up @@ -430,6 +435,12 @@ void SceneShaderForwardMobile::ShaderData::_create_pipeline(PipelineKey p_pipeli
sc.type = RD::PIPELINE_SPECIALIZATION_CONSTANT_TYPE_FLOAT;
specialization_constants.push_back(sc);

sc = {}; // Sanitize value bits. "bool_value" only assigns 8 bits and keeps the remaining bits intact.
sc.constant_id = 3;
sc.bool_value = p_pipeline_key.emulate_point_size;
sc.type = RD::PIPELINE_SPECIALIZATION_CONSTANT_TYPE_BOOL;
specialization_constants.push_back(sc);

RID shader_rid = get_shader_variant(p_pipeline_key.version, p_pipeline_key.ubershader);
ERR_FAIL_COND(shader_rid.is_null());

Expand Down Expand Up @@ -559,6 +570,8 @@ void SceneShaderForwardMobile::init(const String p_defines) {
// Store whether the shader will prefer using the FP16 variant.
use_fp16 = RD::get_singleton()->has_feature(RD::SUPPORTS_HALF_FLOAT);

emulate_point_size = !RD::get_singleton()->has_feature(RD::SUPPORTS_POINT_SIZE);

// Immutable samplers : create the shadow sampler to be passed when creating the pipeline.
{
RD::SamplerState sampler;
Expand Down Expand Up @@ -636,9 +649,9 @@ void SceneShaderForwardMobile::init(const String p_defines) {
actions.renames["UV"] = "uv_interp";
actions.renames["UV2"] = "uv2_interp";
actions.renames["COLOR"] = "color_highp";
actions.renames["POINT_SIZE"] = "gl_PointSize";
actions.renames["INSTANCE_ID"] = "gl_InstanceIndex";
actions.renames["VERTEX_ID"] = "gl_VertexIndex";
actions.renames["POINT_SIZE"] = "point_size";
actions.renames["INSTANCE_ID"] = "INSTANCE_INDEX";
actions.renames["VERTEX_ID"] = "VERTEX_INDEX";
actions.renames["Z_CLIP_SCALE"] = "z_clip_scale";

actions.renames["ALPHA_SCISSOR_THRESHOLD"] = "alpha_scissor_threshold_highp";
Expand Down Expand Up @@ -683,7 +696,7 @@ void SceneShaderForwardMobile::init(const String p_defines) {
actions.renames["AO"] = "ao_highp";
actions.renames["AO_LIGHT_AFFECT"] = "ao_light_affect_highp";
actions.renames["EMISSION"] = "emission_highp";
actions.renames["POINT_COORD"] = "gl_PointCoord";
actions.renames["POINT_COORD"] = "point_coord";
actions.renames["INSTANCE_CUSTOM"] = "instance_custom";
actions.renames["SCREEN_UV"] = "screen_uv";
actions.renames["DEPTH"] = "gl_FragDepth";
Expand Down Expand Up @@ -764,6 +777,9 @@ void SceneShaderForwardMobile::init(const String p_defines) {

actions.usage_defines["MODEL_MATRIX"] = "#define MODEL_MATRIX_USED\n";

actions.usage_defines["POINT_SIZE"] = "#define POINT_SIZE_USED\n";
actions.usage_defines["POINT_COORD"] = "#define POINT_COORD_USED\n";

actions.render_mode_defines["skip_vertex_transform"] = "#define SKIP_TRANSFORM_USED\n";
actions.render_mode_defines["world_vertex_coords"] = "#define VERTEX_WORLD_COORDS_USED\n";
actions.render_mode_defines["ensure_correct_normals"] = "#define ENSURE_CORRECT_NORMALS\n";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ class SceneShaderForwardMobile {
uint32_t render_pass = 0;
uint32_t wireframe = false;
uint32_t ubershader = false;
bool emulate_point_size = false;

uint32_t hash() const {
uint32_t h = hash_murmur3_one_32(vertex_format_id);
Expand All @@ -214,6 +215,7 @@ class SceneShaderForwardMobile {
h = hash_murmur3_one_32(render_pass, h);
h = hash_murmur3_one_32(wireframe, h);
h = hash_murmur3_one_32(ubershader, h);
h = hash_murmur3_one_32(emulate_point_size, h);
return hash_fmix32(h);
}
};
Expand Down Expand Up @@ -345,6 +347,7 @@ class SceneShaderForwardMobile {
SceneForwardMobileShaderRD shader;
ShaderCompiler compiler;
bool use_fp16 = false;
bool emulate_point_size = false;

RID default_shader;
RID default_material;
Expand Down
Loading