/** * Create some uniform storage for a program. * * \param prog Program to get some storage * \param num_storage Total number of storage slots * \param index_to_set Storage slot that will actually get a value * \param name Name for the actual storage slot * \param type Type for the elements of the actual storage slot * \param array_size Size for the array of the actual storage slot. This * should be zero for non-arrays. */ static unsigned establish_uniform_storage(struct gl_shader_program *prog, unsigned num_storage, unsigned index_to_set, const char *name, const glsl_type *type, unsigned array_size) { const unsigned elements = MAX2(1, array_size); const unsigned data_components = elements * type->components(); const unsigned total_components = MAX2(17, (data_components + type->components())); const unsigned red_zone_components = total_components - data_components; prog->UniformHash = new string_to_uint_map; prog->UniformStorage = rzalloc_array(prog, struct gl_uniform_storage, num_storage); prog->NumUniformStorage = num_storage; prog->UniformStorage[index_to_set].name = (char *) name; prog->UniformStorage[index_to_set].type = type; prog->UniformStorage[index_to_set].array_elements = array_size; for (int sh = 0; sh < MESA_SHADER_STAGES; sh++) { prog->UniformStorage[index_to_set].opaque[sh].index = ~0; prog->UniformStorage[index_to_set].opaque[sh].active = false; } prog->UniformStorage[index_to_set].num_driver_storage = 0; prog->UniformStorage[index_to_set].driver_storage = NULL; prog->UniformStorage[index_to_set].storage = rzalloc_array(prog, union gl_constant_value, total_components); fill_storage_array_with_sentinels(prog->UniformStorage[index_to_set].storage, data_components, red_zone_components); prog->UniformHash->put(index_to_set, prog->UniformStorage[index_to_set].name); for (unsigned i = 0; i < num_storage; i++) { if (i == index_to_set) continue; prog->UniformStorage[i].name = (char *) "invalid slot"; prog->UniformStorage[i].type = glsl_type::void_type; prog->UniformStorage[i].array_elements = 0; for (int sh = 0; sh < MESA_SHADER_STAGES; sh++) { prog->UniformStorage[i].opaque[sh].index = ~0; prog->UniformStorage[i].opaque[sh].active = false; } prog->UniformStorage[i].num_driver_storage = 0; prog->UniformStorage[i].driver_storage = NULL; prog->UniformStorage[i].storage = NULL; } return red_zone_components; }
/** * Create some uniform storage for a program. * * \param prog Program to get some storage * \param num_storage Total number of storage slots * \param index_to_set Storage slot that will actually get a value * \param name Name for the actual storage slot * \param type Type for the elements of the actual storage slot * \param array_size Size for the array of the actual storage slot. This * should be zero for non-arrays. */ static unsigned establish_uniform_storage(struct gl_shader_program *prog, unsigned num_storage, unsigned index_to_set, const char *name, const glsl_type *type, unsigned array_size) { const unsigned elements = MAX2(1, array_size); const unsigned data_components = elements * type->components(); const unsigned total_components = MAX2(17, (data_components + type->components())); const unsigned red_zone_components = total_components - data_components; prog->UniformStorage = rzalloc_array(prog, struct gl_uniform_storage, num_storage); prog->NumUserUniformStorage = num_storage; prog->UniformStorage[index_to_set].name = (char *) name; prog->UniformStorage[index_to_set].type = type; prog->UniformStorage[index_to_set].array_elements = array_size; prog->UniformStorage[index_to_set].initialized = false; prog->UniformStorage[index_to_set].sampler = ~0; prog->UniformStorage[index_to_set].num_driver_storage = 0; prog->UniformStorage[index_to_set].driver_storage = NULL; prog->UniformStorage[index_to_set].storage = rzalloc_array(prog, union gl_constant_value, total_components); fill_storage_array_with_sentinels(prog->UniformStorage[index_to_set].storage, data_components, red_zone_components); for (unsigned i = 0; i < num_storage; i++) { if (i == index_to_set) continue; prog->UniformStorage[i].name = (char *) "invalid slot"; prog->UniformStorage[i].type = glsl_type::void_type; prog->UniformStorage[i].array_elements = 0; prog->UniformStorage[i].initialized = false; prog->UniformStorage[i].sampler = ~0; prog->UniformStorage[i].num_driver_storage = 0; prog->UniformStorage[i].driver_storage = NULL; prog->UniformStorage[i].storage = NULL; } return red_zone_components; }