Further fixes to avoid memory corruption, closes #25336
This commit is contained in:
parent
1365bed8ed
commit
18c3ed245a
@ -4631,7 +4631,7 @@ bool RasterizerStorageGLES2::free(RID p_rid) {
|
|||||||
|
|
||||||
Shader *shader = shader_owner.get(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);
|
shader->shader->free_custom_shader(shader->custom_code_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -229,7 +229,6 @@ ShaderGLES2::Version *ShaderGLES2::get_current_version() {
|
|||||||
glDeleteShader(v.vert_id);
|
glDeleteShader(v.vert_id);
|
||||||
glDeleteShader(v.frag_id);
|
glDeleteShader(v.frag_id);
|
||||||
glDeleteProgram(v.id);
|
glDeleteProgram(v.id);
|
||||||
memdelete_arr(v.uniform_location);
|
|
||||||
v.id = 0;
|
v.id = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -329,7 +328,6 @@ ShaderGLES2::Version *ShaderGLES2::get_current_version() {
|
|||||||
if (iloglen < 0) {
|
if (iloglen < 0) {
|
||||||
glDeleteShader(v.vert_id);
|
glDeleteShader(v.vert_id);
|
||||||
glDeleteProgram(v.id);
|
glDeleteProgram(v.id);
|
||||||
memdelete_arr(v.uniform_location);
|
|
||||||
v.id = 0;
|
v.id = 0;
|
||||||
|
|
||||||
ERR_PRINT("No OpenGL vertex shader compiler log. What the frick?");
|
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);
|
Memory::free_static(ilogmem);
|
||||||
glDeleteShader(v.vert_id);
|
glDeleteShader(v.vert_id);
|
||||||
glDeleteProgram(v.id);
|
glDeleteProgram(v.id);
|
||||||
memdelete_arr(v.uniform_location);
|
|
||||||
v.id = 0;
|
v.id = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -406,7 +403,6 @@ ShaderGLES2::Version *ShaderGLES2::get_current_version() {
|
|||||||
glDeleteShader(v.frag_id);
|
glDeleteShader(v.frag_id);
|
||||||
glDeleteShader(v.vert_id);
|
glDeleteShader(v.vert_id);
|
||||||
glDeleteProgram(v.id);
|
glDeleteProgram(v.id);
|
||||||
memdelete_arr(v.uniform_location);
|
|
||||||
v.id = 0;
|
v.id = 0;
|
||||||
|
|
||||||
ERR_PRINT("No OpenGL fragment shader compiler log. What the frick?");
|
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.frag_id);
|
||||||
glDeleteShader(v.vert_id);
|
glDeleteShader(v.vert_id);
|
||||||
glDeleteProgram(v.id);
|
glDeleteProgram(v.id);
|
||||||
memdelete_arr(v.uniform_location);
|
|
||||||
v.id = 0;
|
v.id = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -457,7 +452,6 @@ ShaderGLES2::Version *ShaderGLES2::get_current_version() {
|
|||||||
glDeleteShader(v.frag_id);
|
glDeleteShader(v.frag_id);
|
||||||
glDeleteShader(v.vert_id);
|
glDeleteShader(v.vert_id);
|
||||||
glDeleteProgram(v.id);
|
glDeleteProgram(v.id);
|
||||||
memdelete_arr(v.uniform_location);
|
|
||||||
v.id = 0;
|
v.id = 0;
|
||||||
|
|
||||||
ERR_PRINT("No OpenGL program link log. What the frick?");
|
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.frag_id);
|
||||||
glDeleteShader(v.vert_id);
|
glDeleteShader(v.vert_id);
|
||||||
glDeleteProgram(v.id);
|
glDeleteProgram(v.id);
|
||||||
memdelete_arr(v.uniform_location);
|
|
||||||
v.id = 0;
|
v.id = 0;
|
||||||
|
|
||||||
ERR_FAIL_V(NULL);
|
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) {
|
void ShaderGLES2::free_custom_shader(uint32_t p_code_id) {
|
||||||
|
|
||||||
ERR_FAIL_COND(!custom_code_map.has(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
|
conditional_version.code_version = 0; //do not keep using a version that is going away
|
||||||
|
unbind();
|
||||||
|
}
|
||||||
|
|
||||||
VersionKey key;
|
VersionKey key;
|
||||||
key.code_version = p_code_id;
|
key.code_version = p_code_id;
|
||||||
|
@ -7486,7 +7486,7 @@ bool RasterizerStorageGLES3::free(RID p_rid) {
|
|||||||
// delete the texture
|
// delete the texture
|
||||||
Shader *shader = shader_owner.get(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);
|
shader->shader->free_custom_shader(shader->custom_code_id);
|
||||||
|
|
||||||
if (shader->dirty_list.in_list())
|
if (shader->dirty_list.in_list())
|
||||||
|
@ -204,7 +204,6 @@ ShaderGLES3::Version *ShaderGLES3::get_current_version() {
|
|||||||
glDeleteShader(v.vert_id);
|
glDeleteShader(v.vert_id);
|
||||||
glDeleteShader(v.frag_id);
|
glDeleteShader(v.frag_id);
|
||||||
glDeleteProgram(v.id);
|
glDeleteProgram(v.id);
|
||||||
memdelete_arr(v.uniform_location);
|
|
||||||
v.id = 0;
|
v.id = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -325,7 +324,6 @@ ShaderGLES3::Version *ShaderGLES3::get_current_version() {
|
|||||||
|
|
||||||
glDeleteShader(v.vert_id);
|
glDeleteShader(v.vert_id);
|
||||||
glDeleteProgram(v.id);
|
glDeleteProgram(v.id);
|
||||||
memdelete_arr(v.uniform_location);
|
|
||||||
v.id = 0;
|
v.id = 0;
|
||||||
|
|
||||||
ERR_PRINT("Vertex shader compilation failed with empty log");
|
ERR_PRINT("Vertex shader compilation failed with empty log");
|
||||||
@ -347,7 +345,6 @@ ShaderGLES3::Version *ShaderGLES3::get_current_version() {
|
|||||||
memfree(ilogmem);
|
memfree(ilogmem);
|
||||||
glDeleteShader(v.vert_id);
|
glDeleteShader(v.vert_id);
|
||||||
glDeleteProgram(v.id);
|
glDeleteProgram(v.id);
|
||||||
memdelete_arr(v.uniform_location);
|
|
||||||
v.id = 0;
|
v.id = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -421,7 +418,6 @@ ShaderGLES3::Version *ShaderGLES3::get_current_version() {
|
|||||||
glDeleteShader(v.frag_id);
|
glDeleteShader(v.frag_id);
|
||||||
glDeleteShader(v.vert_id);
|
glDeleteShader(v.vert_id);
|
||||||
glDeleteProgram(v.id);
|
glDeleteProgram(v.id);
|
||||||
memdelete_arr(v.uniform_location);
|
|
||||||
v.id = 0;
|
v.id = 0;
|
||||||
ERR_PRINT("Fragment shader compilation failed with empty log");
|
ERR_PRINT("Fragment shader compilation failed with empty log");
|
||||||
} else {
|
} else {
|
||||||
@ -444,7 +440,6 @@ ShaderGLES3::Version *ShaderGLES3::get_current_version() {
|
|||||||
glDeleteShader(v.frag_id);
|
glDeleteShader(v.frag_id);
|
||||||
glDeleteShader(v.vert_id);
|
glDeleteShader(v.vert_id);
|
||||||
glDeleteProgram(v.id);
|
glDeleteProgram(v.id);
|
||||||
memdelete_arr(v.uniform_location);
|
|
||||||
v.id = 0;
|
v.id = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -491,7 +486,6 @@ ShaderGLES3::Version *ShaderGLES3::get_current_version() {
|
|||||||
glDeleteShader(v.frag_id);
|
glDeleteShader(v.frag_id);
|
||||||
glDeleteShader(v.vert_id);
|
glDeleteShader(v.vert_id);
|
||||||
glDeleteProgram(v.id);
|
glDeleteProgram(v.id);
|
||||||
memdelete_arr(v.uniform_location);
|
|
||||||
v.id = 0;
|
v.id = 0;
|
||||||
ERR_FAIL_COND_V(iloglen <= 0, NULL);
|
ERR_FAIL_COND_V(iloglen <= 0, NULL);
|
||||||
}
|
}
|
||||||
@ -514,7 +508,6 @@ ShaderGLES3::Version *ShaderGLES3::get_current_version() {
|
|||||||
glDeleteShader(v.frag_id);
|
glDeleteShader(v.frag_id);
|
||||||
glDeleteShader(v.vert_id);
|
glDeleteShader(v.vert_id);
|
||||||
glDeleteProgram(v.id);
|
glDeleteProgram(v.id);
|
||||||
memdelete_arr(v.uniform_location);
|
|
||||||
v.id = 0;
|
v.id = 0;
|
||||||
|
|
||||||
ERR_FAIL_V(NULL);
|
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) {
|
void ShaderGLES3::free_custom_shader(uint32_t p_code_id) {
|
||||||
|
|
||||||
ERR_FAIL_COND(!custom_code_map.has(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
|
conditional_version.code_version = 0; //do not keep using a version that is going away
|
||||||
|
unbind();
|
||||||
|
}
|
||||||
|
|
||||||
VersionKey key;
|
VersionKey key;
|
||||||
key.code_version = p_code_id;
|
key.code_version = p_code_id;
|
||||||
|
Loading…
Reference in New Issue
Block a user