Cycles: Simplify code around maximum OpenCL info size allocation

This commit is contained in:
Sergey Sharybin 2017-04-28 15:15:15 +02:00
parent 407fd66d0a
commit f8d0b27d9d
2 changed files with 15 additions and 9 deletions

@ -196,9 +196,18 @@ ImageDataType ImageManager::get_image_metadata(const string& filename,
} }
} }
int ImageManager::max_flattened_slot(ImageDataType type)
{
if(tex_num_images[type] == 0) {
/* No textures for the type, no slots needs allocation. */
return 0;
}
return type_index_to_flattened_slot(tex_num_images[type], type);
}
/* The lower three bits of a device texture slot number indicate its type. /* The lower three bits of a device texture slot number indicate its type.
* These functions convert the slot ids from ImageManager "images" ones * These functions convert the slot ids from ImageManager "images" ones
* to device ones and vice versa. * to device ones and vice verse.
* *
* There are special cases for CUDA Fermi, since there we have only 90 image texture * There are special cases for CUDA Fermi, since there we have only 90 image texture
* slots available and should keep the flattended numbers in the 0-89 range. * slots available and should keep the flattended numbers in the 0-89 range.
@ -1084,14 +1093,10 @@ void ImageManager::device_pack_images(Device *device,
/* TODO(sergey): This will over-allocate a bit, but this is constant memory /* TODO(sergey): This will over-allocate a bit, but this is constant memory
* so should be fine for a short term. * so should be fine for a short term.
*/ */
size_t info_size = max4(type_index_to_flattened_slot(tex_num_images[IMAGE_DATA_TYPE_FLOAT4], const size_t info_size = max4(max_flattened_slot(IMAGE_DATA_TYPE_FLOAT4),
IMAGE_DATA_TYPE_FLOAT4), max_flattened_slot(IMAGE_DATA_TYPE_BYTE4),
type_index_to_flattened_slot(tex_num_images[IMAGE_DATA_TYPE_BYTE4], max_flattened_slot(IMAGE_DATA_TYPE_FLOAT),
IMAGE_DATA_TYPE_BYTE4), max_flattened_slot(IMAGE_DATA_TYPE_BYTE));
type_index_to_flattened_slot(tex_num_images[IMAGE_DATA_TYPE_FLOAT],
IMAGE_DATA_TYPE_FLOAT),
type_index_to_flattened_slot(tex_num_images[IMAGE_DATA_TYPE_BYTE],
IMAGE_DATA_TYPE_BYTE));
uint4 *info = dscene->tex_image_packed_info.resize(info_size*2); uint4 *info = dscene->tex_image_packed_info.resize(info_size*2);
/* Pack byte4 textures. */ /* Pack byte4 textures. */

@ -134,6 +134,7 @@ private:
int texture_limit, int texture_limit,
device_vector<DeviceType>& tex_img); device_vector<DeviceType>& tex_img);
int max_flattened_slot(ImageDataType type);
int type_index_to_flattened_slot(int slot, ImageDataType type); int type_index_to_flattened_slot(int slot, ImageDataType type);
int flattened_slot_to_type_index(int flat_slot, ImageDataType *type); int flattened_slot_to_type_index(int flat_slot, ImageDataType *type);
string name_from_type(int type); string name_from_type(int type);