Code cleanup: tweaks to image manager code found while looking into previous bug.
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Sun, 8 May 2016 18:18:52 +0000 (20:18 +0200)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Sun, 8 May 2016 18:20:53 +0000 (20:20 +0200)
intern/cycles/render/image.cpp
intern/cycles/render/image.h

index 95090ae835668f6bff2dd7df47a654056d03b551..7cfa3fd0a0f3d5a8e3b7267548095e5aa6a4161c 100644 (file)
@@ -41,31 +41,31 @@ ImageManager::ImageManager(const DeviceInfo& info)
 
        /* CPU */
        if(info.type == DEVICE_CPU) {
-               tex_num_images[IMAGE_DATA_TYPE_BYTE] = TEX_NUM_BYTE_IMAGES_CPU;
+               tex_num_images[IMAGE_DATA_TYPE_BYTE4] = TEX_NUM_BYTE_IMAGES_CPU;
                tex_num_images[IMAGE_DATA_TYPE_FLOAT4] = TEX_NUM_FLOAT4_IMAGES_CPU;
                tex_image_byte_start = TEX_IMAGE_BYTE_START_CPU;
        }
        /* CUDA (Fermi) */
        else if((info.type == DEVICE_CUDA || info.type == DEVICE_MULTI) && !info.extended_images) {
-               tex_num_images[IMAGE_DATA_TYPE_BYTE] = TEX_NUM_BYTE_IMAGES_CUDA;
+               tex_num_images[IMAGE_DATA_TYPE_BYTE4] = TEX_NUM_BYTE_IMAGES_CUDA;
                tex_num_images[IMAGE_DATA_TYPE_FLOAT4] = TEX_NUM_FLOAT4_IMAGES_CUDA;
                tex_image_byte_start = TEX_IMAGE_BYTE_START_CUDA;
        }
        /* CUDA (Kepler and above) */
        else if((info.type == DEVICE_CUDA || info.type == DEVICE_MULTI) && info.extended_images) {
-               tex_num_images[IMAGE_DATA_TYPE_BYTE] = TEX_NUM_BYTE_IMAGES_CUDA_KEPLER;
+               tex_num_images[IMAGE_DATA_TYPE_BYTE4] = TEX_NUM_BYTE_IMAGES_CUDA_KEPLER;
                tex_num_images[IMAGE_DATA_TYPE_FLOAT4] = TEX_NUM_FLOAT4_IMAGES_CUDA_KEPLER;
                tex_image_byte_start = TEX_IMAGE_BYTE_START_CUDA_KELPER;
        }
        /* OpenCL */
        else if(info.pack_images) {
-               tex_num_images[IMAGE_DATA_TYPE_BYTE] = TEX_NUM_BYTE_IMAGES_OPENCL;
+               tex_num_images[IMAGE_DATA_TYPE_BYTE4] = TEX_NUM_BYTE_IMAGES_OPENCL;
                tex_num_images[IMAGE_DATA_TYPE_FLOAT4] = TEX_NUM_FLOAT4_IMAGES_OPENCL;
                tex_image_byte_start = TEX_IMAGE_BYTE_START_OPENCL;
        }
        /* Should never happen */
        else {
-               tex_num_images[IMAGE_DATA_TYPE_BYTE] = 0;
+               tex_num_images[IMAGE_DATA_TYPE_BYTE4] = 0;
                tex_num_images[IMAGE_DATA_TYPE_FLOAT4] = 0;
                tex_image_byte_start = 0;
                assert(0);
@@ -171,7 +171,7 @@ bool ImageManager::is_float_image(const string& filename, void *builtin_data, bo
 
 int ImageManager::type_index_to_flattened_slot(int slot, ImageDataType type)
 {
-       if(type == IMAGE_DATA_TYPE_BYTE)
+       if(type == IMAGE_DATA_TYPE_BYTE4)
                return slot + tex_image_byte_start;
        else
                return slot;
@@ -180,8 +180,8 @@ int ImageManager::type_index_to_flattened_slot(int slot, ImageDataType type)
 int ImageManager::flattened_slot_to_type_index(int slot, ImageDataType *type)
 {
        if(slot >= tex_image_byte_start) {
-               *type = IMAGE_DATA_TYPE_BYTE;
-               return slot -= tex_image_byte_start;
+               *type = IMAGE_DATA_TYPE_BYTE4;
+               return slot - tex_image_byte_start;
        }
        else {
                *type = IMAGE_DATA_TYPE_FLOAT4;
@@ -225,7 +225,7 @@ int ImageManager::add_image(const string& filename,
        /* Load image info and find out if we need a float texture. */
        is_float = (pack_images)? false: is_float_image(filename, builtin_data, is_linear);
 
-       ImageDataType type = is_float? IMAGE_DATA_TYPE_FLOAT4 : IMAGE_DATA_TYPE_BYTE;
+       ImageDataType type = is_float? IMAGE_DATA_TYPE_FLOAT4 : IMAGE_DATA_TYPE_BYTE4;
 
        /* Fnd existing image. */
        for(slot = 0; slot < images[type].size(); slot++) {
@@ -290,16 +290,16 @@ void ImageManager::remove_image(int slot)
        ImageDataType type;
        slot = flattened_slot_to_type_index(slot, &type);
 
-       assert(images[type][slot] != NULL);
+       Image *image = images[type][slot];
+       assert(image && image->users >= 1);
 
        /* decrement user count */
-       images[type][slot]->users--;
-       assert(images[type][slot]->users >= 0);
+       image->users--;
 
        /* don't remove immediately, rather do it all together later on. one of
         * the reasons for this is that on shader changes we add and remove nodes
         * that use them, but we do not want to reload the image all the time. */
-       if(images[type][slot]->users == 0)
+       if(image->users == 0)
                need_update = true;
 }
 
@@ -622,27 +622,21 @@ bool ImageManager::file_load_float_image(Image *img, device_vector<float4>& tex_
        return true;
 }
 
-void ImageManager::device_load_image(Device *device, DeviceScene *dscene, int slot, Progress *progress)
+void ImageManager::device_load_image(Device *device, DeviceScene *dscene, ImageDataType type, int slot, Progress *progress)
 {
        if(progress->get_cancel())
                return;
        
-       Image *img;
-       ImageDataType type;
-       int slot_offset;
-
-       slot_offset = flattened_slot_to_type_index(slot, &type);
-
-       img = images[type][slot_offset];
+       Image *img = images[type][slot];
 
        if(osl_texture_system && !img->builtin_data)
                return;
 
-       string filename = path_filename(images[type][slot_offset]->filename);
+       string filename = path_filename(images[type][slot]->filename);
        progress->set_status("Updating Images", "Loading " + filename);
 
        if(type == IMAGE_DATA_TYPE_FLOAT4) {
-               device_vector<float4>& tex_img = dscene->tex_float4_image[slot_offset];
+               device_vector<float4>& tex_img = dscene->tex_float4_image[slot];
 
                if(tex_img.device_pointer) {
                        thread_scoped_lock device_lock(device_mutex);
@@ -674,7 +668,7 @@ void ImageManager::device_load_image(Device *device, DeviceScene *dscene, int sl
                }
        }
        else {
-               device_vector<uchar4>& tex_img = dscene->tex_byte_image[slot_offset];
+               device_vector<uchar4>& tex_img = dscene->tex_byte_image[slot];
 
                if(tex_img.device_pointer) {
                        thread_scoped_lock device_lock(device_mutex);
@@ -709,14 +703,9 @@ void ImageManager::device_load_image(Device *device, DeviceScene *dscene, int sl
        img->need_load = false;
 }
 
-void ImageManager::device_free_image(Device *device, DeviceScene *dscene, int slot)
+void ImageManager::device_free_image(Device *device, DeviceScene *dscene, ImageDataType type, int slot)
 {
-       Image *img;
-       ImageDataType type;
-
-       int slot_offset = flattened_slot_to_type_index(slot, &type);
-
-       img = images[type][slot_offset];
+       Image *img = images[type][slot];
 
        if(img) {
                if(osl_texture_system && !img->builtin_data) {
@@ -726,7 +715,7 @@ void ImageManager::device_free_image(Device *device, DeviceScene *dscene, int sl
 #endif
                }
                else if(type == IMAGE_DATA_TYPE_FLOAT4) {
-                       device_vector<float4>& tex_img = dscene->tex_float4_image[slot_offset];
+                       device_vector<float4>& tex_img = dscene->tex_float4_image[slot];
 
                        if(tex_img.device_pointer) {
                                thread_scoped_lock device_lock(device_mutex);
@@ -735,11 +724,11 @@ void ImageManager::device_free_image(Device *device, DeviceScene *dscene, int sl
 
                        tex_img.clear();
 
-                       delete images[type][slot_offset];
-                       images[type][slot_offset] = NULL;
+                       delete images[type][slot];
+                       images[type][slot] = NULL;
                }
                else {
-                       device_vector<uchar4>& tex_img = dscene->tex_byte_image[slot_offset];
+                       device_vector<uchar4>& tex_img = dscene->tex_byte_image[slot];
 
                        if(tex_img.device_pointer) {
                                thread_scoped_lock device_lock(device_mutex);
@@ -748,8 +737,8 @@ void ImageManager::device_free_image(Device *device, DeviceScene *dscene, int sl
 
                        tex_img.clear();
 
-                       delete images[type][slot_offset];
-                       images[type][slot_offset] = NULL;
+                       delete images[type][slot];
+                       images[type][slot] = NULL;
                }
        }
 }
@@ -767,11 +756,11 @@ void ImageManager::device_update(Device *device, DeviceScene *dscene, Progress&
                                continue;
 
                        if(images[type][slot]->users == 0) {
-                               device_free_image(device, dscene, type_index_to_flattened_slot(slot, (ImageDataType)type));
+                               device_free_image(device, dscene, (ImageDataType)type, slot);
                        }
                        else if(images[type][slot]->need_load) {
                                if(!osl_texture_system || images[type][slot]->builtin_data)
-                                       pool.push(function_bind(&ImageManager::device_load_image, this, device, dscene, type_index_to_flattened_slot(slot, (ImageDataType)type), &progress));
+                                       pool.push(function_bind(&ImageManager::device_load_image, this, device, dscene, (ImageDataType)type, slot, &progress));
                        }
                }
        }
@@ -789,21 +778,20 @@ void ImageManager::device_update_slot(Device *device,
                                       int slot,
                                       Progress *progress)
 {
-       Image *image;
        ImageDataType type;
-
        slot = flattened_slot_to_type_index(slot, &type);
 
-       assert(images[type][slot] != NULL);
-       image = images[type][slot];
+       Image *image = images[type][slot];
+       assert(image != NULL);
 
        if(image->users == 0) {
-               device_free_image(device, dscene, slot);
+               device_free_image(device, dscene, type, slot);
        }
        else if(image->need_load) {
                if(!osl_texture_system || image->builtin_data)
                        device_load_image(device,
                                          dscene,
+                                         type,
                                          slot,
                                          progress);
        }
@@ -818,7 +806,7 @@ void ImageManager::device_pack_images(Device *device,
        size_t size = 0;
 
        /* Only byte textures are supported atm */
-       ImageDataType type = IMAGE_DATA_TYPE_BYTE;
+       ImageDataType type = IMAGE_DATA_TYPE_BYTE4;
 
        for(size_t slot = 0; slot < images[type].size(); slot++) {
                if(!images[type][slot])
@@ -872,7 +860,7 @@ void ImageManager::device_free_builtin(Device *device, DeviceScene *dscene)
        for(int type = 0; type < IMAGE_DATA_NUM_TYPES; type++) {
                for(size_t slot = 0; slot < images[type].size(); slot++) {
                        if(images[type][slot] && images[type][slot]->builtin_data)
-                               device_free_image(device, dscene, type_index_to_flattened_slot(slot, (ImageDataType)type));
+                               device_free_image(device, dscene, (ImageDataType)type, slot);
                }
        }
 }
@@ -881,7 +869,7 @@ void ImageManager::device_free(Device *device, DeviceScene *dscene)
 {
        for(int type = 0; type < IMAGE_DATA_NUM_TYPES; type++) {
                for(size_t slot = 0; slot < images[type].size(); slot++) {
-                       device_free_image(device, dscene, type_index_to_flattened_slot(slot, (ImageDataType)type));
+                       device_free_image(device, dscene, (ImageDataType)type, slot);
                }
                images[type].clear();
        }
index b4097d624b8c34db8a7d15826f9a58c8f95ac87e..bda288cb5fc84d2ffd3d5b3061897c851508fe22 100644 (file)
@@ -37,7 +37,7 @@ public:
 
        enum ImageDataType {
                IMAGE_DATA_TYPE_FLOAT4 = 0,
-               IMAGE_DATA_TYPE_BYTE = 1,
+               IMAGE_DATA_TYPE_BYTE4 = 1,
 
                IMAGE_DATA_NUM_TYPES
        };
@@ -108,8 +108,8 @@ private:
        int flattened_slot_to_type_index(int slot, ImageDataType *type);
        string name_from_type(int type);
 
-       void device_load_image(Device *device, DeviceScene *dscene, int slot, Progress *progess);
-       void device_free_image(Device *device, DeviceScene *dscene, int slot);
+       void device_load_image(Device *device, DeviceScene *dscene, ImageDataType type, int slot, Progress *progess);
+       void device_free_image(Device *device, DeviceScene *dscene, ImageDataType type, int slot);
 
        void device_pack_images(Device *device, DeviceScene *dscene, Progress& progess);
 };