+void
+_mesa_reference_shader_program_data(struct gl_context *ctx,
+ struct gl_shader_program_data **ptr,
+ struct gl_shader_program_data *data)
+{
+ if (*ptr == data)
+ return;
+
+ if (*ptr) {
+ struct gl_shader_program_data *oldData = *ptr;
+
+ assert(oldData->RefCount > 0);
+
+ if (p_atomic_dec_zero(&oldData->RefCount)) {
+ assert(ctx);
+ assert(oldData->NumUniformStorage == 0 ||
+ oldData->UniformStorage);
+
+ for (unsigned i = 0; i < oldData->NumUniformStorage; ++i)
+ _mesa_uniform_detach_all_driver_storage(&oldData->UniformStorage[i]);
+
+ ralloc_free(oldData);
+ }
+
+ *ptr = NULL;
+ }
+
+ if (data)
+ p_atomic_inc(&data->RefCount);
+
+ *ptr = data;
+}