瀏覽代碼

Batching - Don't join items with invalid shaders

When users create an invalid shader, the shader->valid flag is set to false. Batching previously assumes that shaders are valid, and this can result in primitives with invalid shader being joined, causing visual errors.

This PR prevents joining items that have invalid shaders.
lawnjelly 4 年之前
父節點
當前提交
6c2cc01f73
共有 2 個文件被更改,包括 12 次插入0 次删除
  1. 6 0
      drivers/gles2/rasterizer_canvas_gles2.cpp
  2. 6 0
      drivers/gles3/rasterizer_canvas_gles3.cpp

+ 6 - 0
drivers/gles2/rasterizer_canvas_gles2.cpp

@@ -1356,6 +1356,12 @@ bool RasterizerCanvasGLES2::try_join_item(Item *p_ci, RenderItemState &r_ris, bo
 		if (material_ptr) {
 		if (material_ptr) {
 			shader_ptr = material_ptr->shader;
 			shader_ptr = material_ptr->shader;
 
 
+			// special case, if the user has made an error in the shader code
+			if (shader_ptr && !shader_ptr->valid) {
+				join = false;
+				r_batch_break = true;
+			}
+
 			if (shader_ptr && shader_ptr->mode != VS::SHADER_CANVAS_ITEM) {
 			if (shader_ptr && shader_ptr->mode != VS::SHADER_CANVAS_ITEM) {
 				shader_ptr = NULL; // not a canvas item shader, don't use.
 				shader_ptr = NULL; // not a canvas item shader, don't use.
 			}
 			}

+ 6 - 0
drivers/gles3/rasterizer_canvas_gles3.cpp

@@ -1754,6 +1754,12 @@ bool RasterizerCanvasGLES3::try_join_item(Item *p_ci, RenderItemState &r_ris, bo
 		if (material_ptr) {
 		if (material_ptr) {
 			shader_ptr = material_ptr->shader;
 			shader_ptr = material_ptr->shader;
 
 
+			// special case, if the user has made an error in the shader code
+			if (shader_ptr && !shader_ptr->valid) {
+				join = false;
+				r_batch_break = true;
+			}
+
 			if (shader_ptr && shader_ptr->mode != VS::SHADER_CANVAS_ITEM) {
 			if (shader_ptr && shader_ptr->mode != VS::SHADER_CANVAS_ITEM) {
 				shader_ptr = NULL; // not a canvas item shader, don't use.
 				shader_ptr = NULL; // not a canvas item shader, don't use.
 			}
 			}