@@ -687,6 +687,8 @@ void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_cou
687
687
688
688
state.current_tex = RID ();
689
689
690
+ const uint64_t base_specialization = GLES3::Config::get_singleton ()->float_texture_supported ? 0 : CanvasShaderGLES3::USE_RGBA_SHADOWS;
691
+
690
692
for (uint32_t i = 0 ; i <= state.current_batch_index ; i++) {
691
693
// Skipping when there is no instances.
692
694
if (state.canvas_instance_batches [i].instance_count == 0 ) {
@@ -705,10 +707,9 @@ void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_cou
705
707
}
706
708
707
709
GLES3::CanvasMaterialData *material_data = state.canvas_instance_batches [i].material_data ;
708
- CanvasShaderGLES3::ShaderVariant variant = state.canvas_instance_batches [i].shader_variant ;
709
- uint64_t specialization = 0 ;
710
- specialization |= uint64_t (state.canvas_instance_batches [i].lights_disabled );
711
- specialization |= uint64_t (!GLES3::Config::get_singleton ()->float_texture_supported ) << 1 ;
710
+ CanvasShaderGLES3::ShaderVariant variant = CanvasShaderGLES3::MODE_DEFAULT;
711
+ uint64_t specialization = state.canvas_instance_batches [i].specialization ;
712
+ specialization |= base_specialization;
712
713
RID shader_version = data.canvas_shader_default_version ;
713
714
714
715
if (material_data) {
@@ -810,6 +811,7 @@ void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_cou
810
811
811
812
void RasterizerCanvasGLES3::_record_item_commands (const Item *p_item, RID p_render_target, const Transform2D &p_canvas_transform_inverse, Item *¤t_clip, GLES3::CanvasShaderData::BlendMode p_blend_mode, Light *p_lights, uint32_t &r_index, bool &r_batch_broken, bool &r_sdf_used, const Point2 &p_repeat_offset) {
812
813
RenderingServer::CanvasItemTextureFilter texture_filter = p_item->texture_filter == RS::CANVAS_ITEM_TEXTURE_FILTER_DEFAULT ? state.default_filter : p_item->texture_filter ;
814
+ const uint64_t specialization_command_mask = ~(CanvasShaderGLES3::USE_NINEPATCH | CanvasShaderGLES3::USE_PRIMITIVE | CanvasShaderGLES3::USE_ATTRIBUTES | CanvasShaderGLES3::USE_INSTANCING);
813
815
814
816
if (texture_filter != state.canvas_instance_batches [state.current_batch_index ].filter ) {
815
817
_new_batch (r_batch_broken);
@@ -868,9 +870,9 @@ void RasterizerCanvasGLES3::_record_item_commands(const Item *p_item, RID p_rend
868
870
869
871
bool lights_disabled = light_count == 0 && !state.using_directional_lights ;
870
872
871
- if (lights_disabled != state.canvas_instance_batches [state.current_batch_index ].lights_disabled ) {
873
+ if (lights_disabled != bool ( state.canvas_instance_batches [state.current_batch_index ].specialization & CanvasShaderGLES3::DISABLE_LIGHTING) ) {
872
874
_new_batch (r_batch_broken);
873
- state.canvas_instance_batches [state.current_batch_index ].lights_disabled = lights_disabled ;
875
+ state.canvas_instance_batches [state.current_batch_index ].specialization ^= CanvasShaderGLES3::DISABLE_LIGHTING ;
874
876
}
875
877
876
878
const Item::Command *c = p_item->commands ;
@@ -936,7 +938,7 @@ void RasterizerCanvasGLES3::_record_item_commands(const Item *p_item, RID p_rend
936
938
state.canvas_instance_batches [state.current_batch_index ].tex = rect->texture ;
937
939
state.canvas_instance_batches [state.current_batch_index ].command_type = Item::Command::TYPE_RECT;
938
940
state.canvas_instance_batches [state.current_batch_index ].command = c;
939
- state.canvas_instance_batches [state.current_batch_index ].shader_variant = CanvasShaderGLES3::MODE_QUAD ;
941
+ state.canvas_instance_batches [state.current_batch_index ].specialization &= specialization_command_mask ;
940
942
}
941
943
942
944
_prepare_canvas_texture (rect->texture , state.canvas_instance_batches [state.current_batch_index ].filter , state.canvas_instance_batches [state.current_batch_index ].repeat , r_index, texpixel_size);
@@ -1026,7 +1028,8 @@ void RasterizerCanvasGLES3::_record_item_commands(const Item *p_item, RID p_rend
1026
1028
state.canvas_instance_batches [state.current_batch_index ].tex = np->texture ;
1027
1029
state.canvas_instance_batches [state.current_batch_index ].command_type = Item::Command::TYPE_NINEPATCH;
1028
1030
state.canvas_instance_batches [state.current_batch_index ].command = c;
1029
- state.canvas_instance_batches [state.current_batch_index ].shader_variant = CanvasShaderGLES3::MODE_NINEPATCH;
1031
+ state.canvas_instance_batches [state.current_batch_index ].specialization &= specialization_command_mask;
1032
+ state.canvas_instance_batches [state.current_batch_index ].specialization |= CanvasShaderGLES3::USE_NINEPATCH;
1030
1033
}
1031
1034
1032
1035
_prepare_canvas_texture (np->texture , state.canvas_instance_batches [state.current_batch_index ].filter , state.canvas_instance_batches [state.current_batch_index ].repeat , r_index, texpixel_size);
@@ -1092,7 +1095,8 @@ void RasterizerCanvasGLES3::_record_item_commands(const Item *p_item, RID p_rend
1092
1095
state.canvas_instance_batches [state.current_batch_index ].tex = polygon->texture ;
1093
1096
state.canvas_instance_batches [state.current_batch_index ].command_type = Item::Command::TYPE_POLYGON;
1094
1097
state.canvas_instance_batches [state.current_batch_index ].command = c;
1095
- state.canvas_instance_batches [state.current_batch_index ].shader_variant = CanvasShaderGLES3::MODE_ATTRIBUTES;
1098
+ state.canvas_instance_batches [state.current_batch_index ].specialization &= specialization_command_mask;
1099
+ state.canvas_instance_batches [state.current_batch_index ].specialization |= CanvasShaderGLES3::USE_ATTRIBUTES;
1096
1100
1097
1101
_prepare_canvas_texture (polygon->texture , state.canvas_instance_batches [state.current_batch_index ].filter , state.canvas_instance_batches [state.current_batch_index ].repeat , r_index, texpixel_size);
1098
1102
@@ -1119,7 +1123,8 @@ void RasterizerCanvasGLES3::_record_item_commands(const Item *p_item, RID p_rend
1119
1123
state.canvas_instance_batches [state.current_batch_index ].primitive_points = primitive->point_count ;
1120
1124
state.canvas_instance_batches [state.current_batch_index ].command_type = Item::Command::TYPE_PRIMITIVE;
1121
1125
state.canvas_instance_batches [state.current_batch_index ].command = c;
1122
- state.canvas_instance_batches [state.current_batch_index ].shader_variant = CanvasShaderGLES3::MODE_PRIMITIVE;
1126
+ state.canvas_instance_batches [state.current_batch_index ].specialization &= specialization_command_mask;
1127
+ state.canvas_instance_batches [state.current_batch_index ].specialization |= CanvasShaderGLES3::USE_PRIMITIVE;
1123
1128
}
1124
1129
1125
1130
_prepare_canvas_texture (state.canvas_instance_batches [state.current_batch_index ].tex , state.canvas_instance_batches [state.current_batch_index ].filter , state.canvas_instance_batches [state.current_batch_index ].repeat , r_index, texpixel_size);
@@ -1164,7 +1169,8 @@ void RasterizerCanvasGLES3::_record_item_commands(const Item *p_item, RID p_rend
1164
1169
_new_batch (r_batch_broken);
1165
1170
1166
1171
Color modulate (1 , 1 , 1 , 1 );
1167
- state.canvas_instance_batches [state.current_batch_index ].shader_variant = CanvasShaderGLES3::MODE_ATTRIBUTES;
1172
+ state.canvas_instance_batches [state.current_batch_index ].specialization &= specialization_command_mask;
1173
+ state.canvas_instance_batches [state.current_batch_index ].specialization |= CanvasShaderGLES3::USE_ATTRIBUTES;
1168
1174
if (c->type == Item::Command::TYPE_MESH) {
1169
1175
const Item::CommandMesh *m = static_cast <const Item::CommandMesh *>(c);
1170
1176
state.canvas_instance_batches [state.current_batch_index ].tex = m->texture ;
@@ -1174,7 +1180,7 @@ void RasterizerCanvasGLES3::_record_item_commands(const Item *p_item, RID p_rend
1174
1180
} else if (c->type == Item::Command::TYPE_MULTIMESH) {
1175
1181
const Item::CommandMultiMesh *mm = static_cast <const Item::CommandMultiMesh *>(c);
1176
1182
state.canvas_instance_batches [state.current_batch_index ].tex = mm->texture ;
1177
- state.canvas_instance_batches [state.current_batch_index ].shader_variant = CanvasShaderGLES3::MODE_INSTANCED ;
1183
+ state.canvas_instance_batches [state.current_batch_index ].specialization | = CanvasShaderGLES3::USE_INSTANCING ;
1178
1184
1179
1185
if (GLES3::MeshStorage::get_singleton ()->multimesh_uses_colors (mm->multimesh )) {
1180
1186
state.instance_data_array [r_index].flags |= FLAGS_INSTANCING_HAS_COLORS;
@@ -1189,7 +1195,7 @@ void RasterizerCanvasGLES3::_record_item_commands(const Item *p_item, RID p_rend
1189
1195
const Item::CommandParticles *pt = static_cast <const Item::CommandParticles *>(c);
1190
1196
RID particles = pt->particles ;
1191
1197
state.canvas_instance_batches [state.current_batch_index ].tex = pt->texture ;
1192
- state.canvas_instance_batches [state.current_batch_index ].shader_variant = CanvasShaderGLES3::MODE_INSTANCED ;
1198
+ state.canvas_instance_batches [state.current_batch_index ].specialization | = CanvasShaderGLES3::USE_INSTANCING ;
1193
1199
state.instance_data_array [r_index].flags |= FLAGS_INSTANCING_HAS_COLORS;
1194
1200
state.instance_data_array [r_index].flags |= FLAGS_INSTANCING_HAS_CUSTOM_DATA;
1195
1201
0 commit comments