コード例 #1
0
/**
 * 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;
}