瀏覽代碼

Further fixes to avoid memory corruption, closes #25336

Juan Linietsky 6 年之前
父節點
當前提交
18c3ed245a

+ 1 - 1
drivers/gles2/rasterizer_storage_gles2.cpp

@@ -4631,7 +4631,7 @@ bool RasterizerStorageGLES2::free(RID p_rid) {
 
 		Shader *shader = shader_owner.get(p_rid);
 
-		if (shader->shader) {
+		if (shader->shader && shader->custom_code_id) {
 			shader->shader->free_custom_shader(shader->custom_code_id);
 		}
 

+ 3 - 8
drivers/gles2/shader_gles2.cpp

@@ -229,7 +229,6 @@ ShaderGLES2::Version *ShaderGLES2::get_current_version() {
 			glDeleteShader(v.vert_id);
 			glDeleteShader(v.frag_id);
 			glDeleteProgram(v.id);
-			memdelete_arr(v.uniform_location);
 			v.id = 0;
 		}
 	}
@@ -329,7 +328,6 @@ ShaderGLES2::Version *ShaderGLES2::get_current_version() {
 		if (iloglen < 0) {
 			glDeleteShader(v.vert_id);
 			glDeleteProgram(v.id);
-			memdelete_arr(v.uniform_location);
 			v.id = 0;
 
 			ERR_PRINT("No OpenGL vertex shader compiler log. What the frick?");
@@ -351,7 +349,6 @@ ShaderGLES2::Version *ShaderGLES2::get_current_version() {
 			Memory::free_static(ilogmem);
 			glDeleteShader(v.vert_id);
 			glDeleteProgram(v.id);
-			memdelete_arr(v.uniform_location);
 			v.id = 0;
 		}
 
@@ -406,7 +403,6 @@ ShaderGLES2::Version *ShaderGLES2::get_current_version() {
 			glDeleteShader(v.frag_id);
 			glDeleteShader(v.vert_id);
 			glDeleteProgram(v.id);
-			memdelete_arr(v.uniform_location);
 			v.id = 0;
 
 			ERR_PRINT("No OpenGL fragment shader compiler log. What the frick?");
@@ -429,7 +425,6 @@ ShaderGLES2::Version *ShaderGLES2::get_current_version() {
 			glDeleteShader(v.frag_id);
 			glDeleteShader(v.vert_id);
 			glDeleteProgram(v.id);
-			memdelete_arr(v.uniform_location);
 			v.id = 0;
 		}
 
@@ -457,7 +452,6 @@ ShaderGLES2::Version *ShaderGLES2::get_current_version() {
 			glDeleteShader(v.frag_id);
 			glDeleteShader(v.vert_id);
 			glDeleteProgram(v.id);
-			memdelete_arr(v.uniform_location);
 			v.id = 0;
 
 			ERR_PRINT("No OpenGL program link log. What the frick?");
@@ -482,7 +476,6 @@ ShaderGLES2::Version *ShaderGLES2::get_current_version() {
 		glDeleteShader(v.frag_id);
 		glDeleteShader(v.vert_id);
 		glDeleteProgram(v.id);
-		memdelete_arr(v.uniform_location);
 		v.id = 0;
 
 		ERR_FAIL_V(NULL);
@@ -696,8 +689,10 @@ void ShaderGLES2::set_custom_shader(uint32_t p_code_id) {
 void ShaderGLES2::free_custom_shader(uint32_t p_code_id) {
 
 	ERR_FAIL_COND(!custom_code_map.has(p_code_id));
-	if (conditional_version.code_version == p_code_id)
+	if (conditional_version.code_version == p_code_id) {
 		conditional_version.code_version = 0; //do not keep using a version that is going away
+		unbind();
+	}
 
 	VersionKey key;
 	key.code_version = p_code_id;

+ 1 - 1
drivers/gles3/rasterizer_storage_gles3.cpp

@@ -7486,7 +7486,7 @@ bool RasterizerStorageGLES3::free(RID p_rid) {
 		// delete the texture
 		Shader *shader = shader_owner.get(p_rid);
 
-		if (shader->shader)
+		if (shader->shader && shader->custom_code_id)
 			shader->shader->free_custom_shader(shader->custom_code_id);
 
 		if (shader->dirty_list.in_list())

+ 3 - 8
drivers/gles3/shader_gles3.cpp

@@ -204,7 +204,6 @@ ShaderGLES3::Version *ShaderGLES3::get_current_version() {
 			glDeleteShader(v.vert_id);
 			glDeleteShader(v.frag_id);
 			glDeleteProgram(v.id);
-			memdelete_arr(v.uniform_location);
 			v.id = 0;
 		}
 	}
@@ -325,7 +324,6 @@ ShaderGLES3::Version *ShaderGLES3::get_current_version() {
 
 			glDeleteShader(v.vert_id);
 			glDeleteProgram(v.id);
-			memdelete_arr(v.uniform_location);
 			v.id = 0;
 
 			ERR_PRINT("Vertex shader compilation failed with empty log");
@@ -347,7 +345,6 @@ ShaderGLES3::Version *ShaderGLES3::get_current_version() {
 			memfree(ilogmem);
 			glDeleteShader(v.vert_id);
 			glDeleteProgram(v.id);
-			memdelete_arr(v.uniform_location);
 			v.id = 0;
 		}
 
@@ -421,7 +418,6 @@ ShaderGLES3::Version *ShaderGLES3::get_current_version() {
 			glDeleteShader(v.frag_id);
 			glDeleteShader(v.vert_id);
 			glDeleteProgram(v.id);
-			memdelete_arr(v.uniform_location);
 			v.id = 0;
 			ERR_PRINT("Fragment shader compilation failed with empty log");
 		} else {
@@ -444,7 +440,6 @@ ShaderGLES3::Version *ShaderGLES3::get_current_version() {
 			glDeleteShader(v.frag_id);
 			glDeleteShader(v.vert_id);
 			glDeleteProgram(v.id);
-			memdelete_arr(v.uniform_location);
 			v.id = 0;
 		}
 
@@ -491,7 +486,6 @@ ShaderGLES3::Version *ShaderGLES3::get_current_version() {
 			glDeleteShader(v.frag_id);
 			glDeleteShader(v.vert_id);
 			glDeleteProgram(v.id);
-			memdelete_arr(v.uniform_location);
 			v.id = 0;
 			ERR_FAIL_COND_V(iloglen <= 0, NULL);
 		}
@@ -514,7 +508,6 @@ ShaderGLES3::Version *ShaderGLES3::get_current_version() {
 		glDeleteShader(v.frag_id);
 		glDeleteShader(v.vert_id);
 		glDeleteProgram(v.id);
-		memdelete_arr(v.uniform_location);
 		v.id = 0;
 
 		ERR_FAIL_V(NULL);
@@ -751,8 +744,10 @@ void ShaderGLES3::set_custom_shader(uint32_t p_code_id) {
 void ShaderGLES3::free_custom_shader(uint32_t p_code_id) {
 
 	ERR_FAIL_COND(!custom_code_map.has(p_code_id));
-	if (conditional_version.code_version == p_code_id)
+	if (conditional_version.code_version == p_code_id) {
 		conditional_version.code_version = 0; //do not keep using a version that is going away
+		unbind();
+	}
 
 	VersionKey key;
 	key.code_version = p_code_id;