|
@@ -229,6 +229,7 @@ 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;
|
|
|
}
|
|
|
}
|
|
@@ -328,6 +329,7 @@ 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?");
|
|
@@ -349,6 +351,7 @@ 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;
|
|
|
}
|
|
|
|
|
@@ -403,6 +406,7 @@ 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?");
|
|
@@ -425,6 +429,7 @@ 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;
|
|
|
}
|
|
|
|
|
@@ -452,6 +457,7 @@ 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?");
|
|
@@ -476,6 +482,7 @@ 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);
|
|
@@ -519,6 +526,10 @@ ShaderGLES2::Version *ShaderGLES2::get_current_version() {
|
|
|
glUseProgram(0);
|
|
|
v.ok = true;
|
|
|
|
|
|
+ if (cc) {
|
|
|
+ cc->versions.insert(conditional_version.version);
|
|
|
+ }
|
|
|
+
|
|
|
return &v;
|
|
|
}
|
|
|
|
|
@@ -683,9 +694,26 @@ 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)
|
|
|
- conditional_version.code_version = 0;
|
|
|
+ conditional_version.code_version = 0; //do not keep using a version that is going away
|
|
|
+
|
|
|
+ VersionKey key;
|
|
|
+ key.code_version = p_code_id;
|
|
|
+ for (Set<uint32_t>::Element *E = custom_code_map[p_code_id].versions.front(); E; E = E->next()) {
|
|
|
+ key.version = E->get();
|
|
|
+ ERR_CONTINUE(!version_map.has(key));
|
|
|
+ Version &v = version_map[key];
|
|
|
+
|
|
|
+ glDeleteShader(v.vert_id);
|
|
|
+ glDeleteShader(v.frag_id);
|
|
|
+ glDeleteProgram(v.id);
|
|
|
+ memdelete_arr(v.uniform_location);
|
|
|
+ v.id = 0;
|
|
|
+
|
|
|
+ version_map.erase(key);
|
|
|
+ }
|
|
|
|
|
|
custom_code_map.erase(p_code_id);
|
|
|
}
|