Commit: 5f3b35547725159bb33e383a81dc93dc92f4ad4f
Author: Geraldine Chua
Date:   Tue May 29 01:33:47 2018 +0800
Branches: soc-2018-volumes
https://developer.blender.org/rB5f3b35547725159bb33e383a81dc93dc92f4ad4f

sparse volumes initial commit

===================================================================

M       intern/cycles/device/device_cpu.cpp
M       intern/cycles/device/device_memory.h
M       intern/cycles/device/opencl/opencl.h
M       intern/cycles/render/image.cpp
M       intern/cycles/render/image.h
M       intern/cycles/render/mesh_volume.cpp
M       intern/cycles/util/CMakeLists.txt
M       intern/cycles/util/util_texture.h
A       intern/cycles/util/util_volume.cpp
A       intern/cycles/util/util_volume.h

===================================================================

diff --git a/intern/cycles/device/device_cpu.cpp 
b/intern/cycles/device/device_cpu.cpp
index 6be60f8bbb6..e9898cba20d 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -52,6 +52,8 @@
 #include "util/util_progress.h"
 #include "util/util_system.h"
 #include "util/util_thread.h"
+/* gchua: fix later */
+#include "util/util_volume.h"
 
 CCL_NAMESPACE_BEGIN
 
@@ -375,9 +377,14 @@ public:
 
        void tex_alloc(device_memory& mem)
        {
+               size_t total_memory = mem.memory_size();
+               if(mem.helper != NULL) {
+                       total_memory += mem.helper->memory_size();
+               }
+
                VLOG(1) << "Texture allocate: " << mem.name << ", "
-                       << string_human_readable_number(mem.memory_size()) << " 
bytes. ("
-                       << string_human_readable_size(mem.memory_size()) << ")";
+                       << string_human_readable_number(total_memory) << " 
bytes. ("
+                       << string_human_readable_size(total_memory) << ")";
 
                if(mem.interpolation == INTERPOLATION_NONE) {
                        /* Data texture. */
@@ -408,16 +415,38 @@ public:
                        info.cl_buffer = 0;
                        info.interpolation = mem.interpolation;
                        info.extension = mem.extension;
-                       info.width = mem.data_width;
-                       info.height = mem.data_height;
-                       info.depth = mem.data_depth;
-
+                       if(mem.helper != NULL) {
+                               /* If mem is a sparse volume, its real (tile) 
dimensions
+                                * are stored in the helper texture. */
+                               info.width = mem.helper->data_width * CUBE_SIZE;
+                               info.height = mem.helper->data_height * 
CUBE_SIZE;
+                               info.depth = mem.helper->data_depth * CUBE_SIZE;
+                               info.indexes = 
(uint64_t)mem.helper->host_pointer;
+                       }
+                       else {
+                               info.width = mem.data_width;
+                               info.height = mem.data_height;
+                               info.depth = mem.data_depth;
+                               /* todo (gchua): what if the valid host pointer 
is 0 */
+                               info.indexes = (uint64_t)0;
+                       }
+                       VLOG(1) << "Texture width: " << mem.data_width << ", " 
<< info.width;
+                       VLOG(1) << "Texture height: " << mem.data_height << ", 
" << info.height;
+                       VLOG(1) << "Texture depth: " << mem.data_depth << ", " 
<< info.depth;
+                       VLOG(1) << "Texture helper: " << info.indexes;
                        need_texture_info = true;
                }
 
                mem.device_pointer = (device_ptr)mem.host_pointer;
                mem.device_size = mem.memory_size();
                stats.mem_alloc(mem.device_size);
+
+               if(mem.helper != NULL) {
+                       mem.helper->device_pointer = 
(device_ptr)mem.helper->host_pointer;
+                       mem.helper->device_size = mem.helper->memory_size();
+                       stats.mem_alloc(mem.helper->device_size);
+               }
+
        }
 
        void tex_free(device_memory& mem)
diff --git a/intern/cycles/device/device_memory.h 
b/intern/cycles/device/device_memory.h
index d8fe41e78bb..cfe95b5b0c5 100644
--- a/intern/cycles/device/device_memory.h
+++ b/intern/cycles/device/device_memory.h
@@ -197,6 +197,7 @@ public:
        device_ptr device_pointer;
        void *host_pointer;
        void *shared_pointer;
+       device_memory *helper;
 
        virtual ~device_memory();
 
diff --git a/intern/cycles/device/opencl/opencl.h 
b/intern/cycles/device/opencl/opencl.h
index 85ef14ee29a..0d0f838bc69 100644
--- a/intern/cycles/device/opencl/opencl.h
+++ b/intern/cycles/device/opencl/opencl.h
@@ -549,7 +549,7 @@ private:
        MemoryManager memory_manager;
        friend class MemoryManager;
 
-       static_assert_align(TextureInfo, 16);
+       static_assert_align(TextureInfo, 20);
        device_vector<TextureInfo> texture_info;
 
        typedef map<string, device_memory*> TexturesMap;
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
index 9c5e32e8219..c37d7e02d43 100644
--- a/intern/cycles/render/image.cpp
+++ b/intern/cycles/render/image.cpp
@@ -22,7 +22,10 @@
 #include "util/util_logging.h"
 #include "util/util_path.h"
 #include "util/util_progress.h"
+#include "util/util_string.h"
 #include "util/util_texture.h"
+/* gchua: fix later */
+#include "util/util_volume.h"
 
 #ifdef WITH_OSL
 #include <OSL/oslexec.h>
@@ -192,6 +195,8 @@ bool ImageManager::get_image_metadata(const string& 
filename,
        else {
                metadata.type = (metadata.channels > 1) ? IMAGE_DATA_TYPE_BYTE4 
: IMAGE_DATA_TYPE_BYTE;
        }
+       VLOG(1) << filename;
+       VLOG(1) << metadata.type;
 
        in->close();
        delete in;
@@ -235,6 +240,8 @@ string ImageManager::name_from_type(int type)
                return "half4";
        else if(type == IMAGE_DATA_TYPE_HALF)
                return "half";
+       else if(type == IMAGE_DATA_TYPE_VOLUME)
+               return "volume";
        else
                return "byte4";
 }
@@ -574,6 +581,7 @@ bool ImageManager::file_load_image(Image *img,
         * but device doesn't support single channel textures.
         */
        bool is_rgba = (type == IMAGE_DATA_TYPE_FLOAT4 ||
+                       type == IMAGE_DATA_TYPE_VOLUME ||
                        type == IMAGE_DATA_TYPE_HALF4 ||
                        type == IMAGE_DATA_TYPE_BYTE4);
        if(is_rgba) {
@@ -682,6 +690,71 @@ bool ImageManager::file_load_image(Image *img,
        return true;
 }
 
+
+/* If volume, call this to convert to sparse grid. */
+template<TypeDesc::BASETYPE FileFormat,
+         typename StorageType,
+         typename DeviceType>
+bool ImageManager::file_load_image(Image *img,
+                                   ImageDataType type,
+                                   int texture_limit,
+                                   device_vector<VolumeTile>& tex_img,
+                                   device_vector<int>& tex_helper)
+{
+
+       device_vector<DeviceType> *tex_img_raw
+               = new device_vector<DeviceType>(NULL, img->mem_name.c_str(), 
MEM_TEXTURE);
+
+       if(!file_load_image<FileFormat, StorageType, DeviceType>(img, type, 
texture_limit, *tex_img_raw)) {
+                return false;
+       }
+
+       VLOG(1) << "Memory usage of raw volume texture: "
+                   << string_human_readable_size(tex_img_raw->memory_size());
+
+       DeviceType *data = tex_img_raw->data();
+       size_t tile_width = compute_tile_resolution(tex_img_raw->data_width);
+       size_t tile_height = compute_tile_resolution(tex_img_raw->data_height);
+       size_t tile_depth = compute_tile_resolution(tex_img_raw->data_depth);
+
+       vector<VolumeTile> sparse_grid;
+       vector<int> indexes;
+       create_sparse_grid(data,
+                          tex_img_raw->data_width,
+                          tex_img_raw->data_height,
+                          tex_img_raw->data_depth,
+                          sparse_grid,
+                          indexes);
+
+       VolumeTile *texture_pixels;
+       int *texture_indexes;
+       {
+               /* Since only active tiles are stored in tex_img, its
+                * allocated memory will be less than the actual resolution
+                * of the volume. We store the true resolution (in tiles) in the
+                * tex_helper instead, since it needs to be allocated enough
+                * space to track all tiles anyway. */
+               thread_scoped_lock device_lock(device_mutex);
+               texture_pixels = (VolumeTile*)tex_img.alloc(sparse_grid.size());
+               texture_indexes = (int*)tex_helper.alloc(tile_width,
+                                                                               
                 tile_height,
+                                                                               
                 tile_depth);
+       }
+
+       memcpy(texture_pixels,
+                  &sparse_grid[0],
+                  sparse_grid.size() * sizeof(VolumeTile));
+
+       memcpy(texture_indexes,
+                  &indexes[0],
+                  indexes.size() * sizeof(int));
+
+       VLOG(1) << "Memory usage of sparse grid: "
+               << string_human_readable_size(tex_img.memory_size());
+
+       return true;
+}
+
 void ImageManager::device_load_image(Device *device,
                                      Scene *scene,
                                      ImageDataType type,
@@ -705,9 +778,13 @@ void ImageManager::device_load_image(Device *device,
        int flat_slot = type_index_to_flattened_slot(slot, type);
        img->mem_name = string_printf("__tex_image_%s_%03d", 
name_from_type(type).c_str(), flat_slot);
 
-       /* Free previous texture in slot. */
+       /* Free previous texture(s) in slot. */
        if(img->mem) {
                thread_scoped_lock device_lock(device_mutex);
+               if(img->mem->helper) {
+                       delete img->mem->helper;
+                       img->mem->helper = NULL;
+               }
                delete img->mem;
                img->mem = NULL;
        }
@@ -857,6 +934,29 @@ void ImageManager::device_load_image(Device *device,
                thread_scoped_lock device_lock(device_mutex);
                tex_img->copy_to_device();
        }
+       else if(type == IMAGE_DATA_TYPE_VOLUME) {
+               device_vector<VolumeTile> *tex_img
+                       = new device_vector<VolumeTile>(device, 
img->mem_name.c_str(), MEM_TEXTURE);
+               device_vector<int> *tex_helper
+                       = new device_vector<int>(device, (img->mem_name + 
"_helper").c_str(), MEM_TEXTURE);
+
+               if(!file_load_image<TypeDesc::FLOAT, float, float4>(img,
+                                                                               
                                        type,
+                                                                               
                                        texture_limit,
+                                                                               
                                        *tex_img,
+                                                                               
                                        *tex_helper)) {
+                        /* todo (gchua): fix this later */
+               }
+
+               tex_img->helper = tex_helper;
+               img->mem = tex_img;
+               img->mem->interpolation = img->interpolation;
+               img->mem->extension = img->extension;
+
+               thread_scoped_lock device_lock(device_mutex);
+               tex_img->copy_to_device();
+               tex_helper->copy_to_device();
+       }
 
        img->need_load = false;
 }
diff --git a/intern/cycles/render/image.h b/intern/cycles/render/image.h
index 5391490d993..dae911d38bb 100644
--- a/intern/cycles/render/image.h
+++ b/intern/cycles/render/image.h
@@ -24,6 +24,8 @@
 #include "util/util_string.h"
 #include "util/util_thread.h"
 #include "util/util_vector.h"
+/* gchua: fixxxxx */
+#include "util/util_volume.h"
 
 CCL_NAMESPACE_BEGIN
 
@@ -151,6 +153,15 @@ private:
                             int texture_limit,
                             device_vector<DeviceType>& tex_img);
 
+       template<TypeDesc::BASETYPE FileFormat,
+                typename StorageType,
+                typename DeviceType>
+       bool file_load_image(Image *img,
+                            ImageDataType type,
+                            int texture_limit,
+                            device_vector<VolumeTile>& tex_img,
+                            device_vector<int>& tex_helper);
+
        int max_flattened_slot(ImageDataType type);
        int type_index_to_flattened_slot(int slot, ImageDataType type);
        int flattened_slot_to_type_index(int flat_slot, ImageDataType *type);
diff --git a/intern/cycles/render/mesh_volume.cpp 
b/intern/cycles/render/mesh_volume.cpp
index d1c49b456ff..4c0a7a80b6f 100644
--- a/intern/cycles/render/mesh_volume.cpp
+++ b/intern/cycles/render/mesh_volume.cpp
@@ -22,6 +22,7 @@
 #include "util/util_logging.h"
 #include "util/util_progress.h"
 #include "util/util_types.h"
+#include "util/util_volume.h"
 
 CCL_NAMESPACE_BEGIN
 
@@ -113,8 +114,6 @@ struct VolumeParams {
        int pad_size;
 };
 
-static const int CUBE_SIZE = 8;
-
 /* Create a mesh from a volum

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to