Commit: 44d541a6476d3a3f15d6a6fd227a488768dbb86d
Author: Geraldine Chua
Date:   Fri Aug 3 00:07:58 2018 +0800
Branches: soc-2018-cycles-volumes
https://developer.blender.org/rB44d541a6476d3a3f15d6a6fd227a488768dbb86d

Initial fix for CUDA, OpenCL sparse grid sampling.

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

M       intern/cycles/device/device_cpu.cpp
M       intern/cycles/device/device_cuda.cpp
M       intern/cycles/device/device_memory.h
M       intern/cycles/device/opencl/opencl_base.cpp
M       intern/cycles/kernel/kernels/cuda/kernel_cuda_image.h
M       intern/cycles/kernel/kernels/opencl/kernel_opencl_image.h
M       intern/cycles/render/image.cpp
M       intern/cycles/render/image.h
M       intern/cycles/render/mesh_volume.cpp
M       intern/cycles/util/util_sparse_grid.h
M       intern/cycles/util/util_texture.h

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

diff --git a/intern/cycles/device/device_cpu.cpp 
b/intern/cycles/device/device_cpu.cpp
index 47ef95cb59f..aa016e2a12b 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -52,7 +52,6 @@
 #include "util/util_progress.h"
 #include "util/util_system.h"
 #include "util/util_thread.h"
-#include "util/util_sparse_grid.h"
 
 CCL_NAMESPACE_BEGIN
 
@@ -376,17 +375,9 @@ public:
 
        void tex_alloc(device_memory& mem)
        {
-               size_t total_memory = mem.memory_size();
-               device_memory *sparse_mem = NULL;
-
-               if(mem.grid_info && mem.grid_type == IMAGE_GRID_TYPE_SPARSE) {
-                       sparse_mem = (device_memory*)mem.grid_info;
-                       total_memory += sparse_mem->memory_size();
-               }
-
                VLOG(1) << "Texture allocate: " << mem.name << ", "
-                       << string_human_readable_number(total_memory) << " 
bytes. ("
-                       << string_human_readable_size(total_memory) << ")";
+                       << string_human_readable_number(mem.memory_size()) << " 
bytes. ("
+                       << string_human_readable_size(mem.memory_size()) << ")";
 
                if(mem.interpolation == INTERPOLATION_NONE) {
                        /* Data texture. */
@@ -417,24 +408,34 @@ public:
                        info.cl_buffer = 0;
                        info.interpolation = mem.interpolation;
                        info.extension = mem.extension;
-                       info.width = mem.real_width;
-                       info.height = mem.real_height;
-                       info.depth = mem.real_depth;
-
-                       SparseTextureInfo sparse_info;
-                       if(mem.grid_type == IMAGE_GRID_TYPE_SPARSE) {
-                               sparse_info.offsets = 
(uint64_t)sparse_mem->host_pointer;
-                               sparse_info.tiled_w = get_tile_res(info.width);
-                               sparse_info.tiled_h = get_tile_res(info.height);
-                               sparse_info.remain_w = info.width % TILE_SIZE;
-                               sparse_info.remain_h = info.height % TILE_SIZE;
-                               sparse_info.div_w = info.width - 
sparse_info.remain_w;
-                               sparse_info.div_h = info.height - 
sparse_info.remain_h;
-                       }
-                       else {
-                               sparse_info.offsets = 0;
+                       info.width = mem.dense_width;
+                       info.height = mem.dense_height;
+                       info.depth = mem.dense_depth;
+
+                       SparseTextureInfo s_info;
+                       s_info.offsets = 0;
+
+                       /* If image is sparse, cache info needed for index 
calculation. */
+                       if(mem.grid_info && mem.grid_type == 
IMAGE_GRID_TYPE_SPARSE) {
+                               device_memory *sparse_mem = 
(device_memory*)mem.grid_info;
+                               s_info.offsets = 
(uint64_t)sparse_mem->host_pointer;
+                               s_info.remain_w = info.width % TILE_SIZE;
+                               s_info.remain_h = info.height % TILE_SIZE;
+                               s_info.tiled_w = info.width / TILE_SIZE + 
(s_info.remain_w != 0);
+                               s_info.tiled_h = info.height / TILE_SIZE + 
(s_info.remain_h != 0);
+                               s_info.div_w = info.width - s_info.remain_w;
+                               s_info.div_h = info.height - s_info.remain_h;
+
+                               VLOG(1) << "Allocate: " << sparse_mem->name << 
", "
+                                       << 
string_human_readable_number(sparse_mem->memory_size()) << " bytes. ("
+                                       << 
string_human_readable_size(sparse_mem->memory_size()) << ")";
+
+                               sparse_mem->device_pointer = 
(device_ptr)sparse_mem->host_pointer;
+                               sparse_mem->device_size = 
sparse_mem->memory_size();
+                               stats.mem_alloc(sparse_mem->device_size);
                        }
-                       info.sparse_info = sparse_info;
+
+                       info.sparse_info = s_info;
 
                        need_texture_info = true;
                }
@@ -442,12 +443,6 @@ public:
                mem.device_pointer = (device_ptr)mem.host_pointer;
                mem.device_size = mem.memory_size();
                stats.mem_alloc(mem.device_size);
-
-               if(sparse_mem) {
-                       sparse_mem->device_pointer = 
(device_ptr)sparse_mem->host_pointer;
-                       sparse_mem->device_size = sparse_mem->memory_size();
-                       stats.mem_alloc(sparse_mem->device_size);
-               }
        }
 
        void tex_free(device_memory& mem)
diff --git a/intern/cycles/device/device_cuda.cpp 
b/intern/cycles/device/device_cuda.cpp
index d9f146339d2..363d41877f6 100644
--- a/intern/cycles/device/device_cuda.cpp
+++ b/intern/cycles/device/device_cuda.cpp
@@ -1020,9 +1020,6 @@ public:
                string bind_name = mem.name;
                size_t dsize = datatype_size(mem.data_type);
                size_t size = mem.memory_size();
-               if(mem.grid_info) {
-                       size += mem.grid_info->memory_size();
-               }
 
                CUaddress_mode address_mode = CU_TR_ADDRESS_MODE_WRAP;
                switch(mem.extension) {
@@ -1225,6 +1222,26 @@ public:
                info.width = mem.data_width;
                info.height = mem.data_height;
                info.depth = mem.data_depth;
+               info.sparse_info.offsets = 0;
+
+               /* If image is sparse, cache info needed for index calculation. 
*/
+               if(mem.grid_info && mem.grid_type == 
IMAGE_GRID_TYPE_SPARSE_PAD) {
+                       device_memory *sparse_mem = 
(device_memory*)mem.grid_info;
+                       info.sparse_info.offsets = 
(uint64_t)sparse_mem->host_pointer;
+                       info.sparse_info.tiled_w = (mem.dense_width / 
TILE_SIZE) +
+                                                  (mem.dense_width % TILE_SIZE 
!= 0);
+                       info.sparse_info.tiled_h = (mem.dense_height / 
TILE_SIZE) +
+                                                  (mem.dense_height % 
TILE_SIZE != 0);
+
+                       VLOG(1) << "Allocate: " << sparse_mem->name << ", "
+                               << 
string_human_readable_number(sparse_mem->memory_size()) << " bytes. ("
+                               << 
string_human_readable_size(sparse_mem->memory_size()) << ")";
+
+                       sparse_mem->device_pointer = 
(device_ptr)sparse_mem->host_pointer;
+                       sparse_mem->device_size = sparse_mem->memory_size();
+                       stats.mem_alloc(sparse_mem->device_size);
+               }
+
                need_texture_info = true;
        }
 
@@ -1252,6 +1269,15 @@ public:
                                generic_free(mem);
                        }
                }
+
+               if(mem.grid_info && mem.grid_type == IMAGE_GRID_TYPE_SPARSE) {
+                       device_memory *grid_info = 
(device_memory*)mem.grid_info;
+                       if(grid_info->device_pointer) {
+                               stats.mem_free(grid_info->device_size);
+                               grid_info->device_pointer = 0;
+                               grid_info->device_size = 0;
+                       }
+               }
        }
 
        bool denoising_set_tiles(device_ptr *buffers, DenoisingTask *task)
diff --git a/intern/cycles/device/device_memory.h 
b/intern/cycles/device/device_memory.h
index 5d4fb130ca2..492b1503891 100644
--- a/intern/cycles/device/device_memory.h
+++ b/intern/cycles/device/device_memory.h
@@ -190,12 +190,11 @@ public:
        size_t data_width;
        size_t data_height;
        size_t data_depth;
-       /* For normal images, data_* = real_*. For sparse images,
-        * real_* refers to the real voxel resolution of the image,
-        * since sparse images are stored as a long 1D array. */
-       size_t real_width;
-       size_t real_height;
-       size_t real_depth;
+       /* data_* stores actual dimensions, while dense_* stores image 
dimensions
+        * before compression. */
+       size_t dense_width;
+       size_t dense_height;
+       size_t dense_depth;
        MemoryType type;
        const char *name;
        InterpolationType interpolation;
@@ -328,9 +327,9 @@ public:
                }
 
                data_size = new_size;
-               data_width = real_width = width;
-               data_height = real_height = height;
-               data_depth = real_depth = depth;
+               data_width = dense_width = width;
+               data_height = dense_height = height;
+               data_depth = dense_depth = depth;
 
                return data();
        }
diff --git a/intern/cycles/device/opencl/opencl_base.cpp 
b/intern/cycles/device/opencl/opencl_base.cpp
index 0f4a80025b5..5c6c4cd6c20 100644
--- a/intern/cycles/device/opencl/opencl_base.cpp
+++ b/intern/cycles/device/opencl/opencl_base.cpp
@@ -526,14 +526,9 @@ void OpenCLDeviceBase::const_copy_to(const char *name, 
void *host, size_t size)
 
 void OpenCLDeviceBase::tex_alloc(device_memory& mem)
 {
-       size_t total_memory = mem.memory_size();
-       if(mem.grid_info) {
-               total_memory += mem.grid_info->memory_size();
-       }
-
        VLOG(1) << "Texture allocate: " << mem.name << ", "
-               << string_human_readable_number(total_memory) << " bytes. ("
-               << string_human_readable_size(total_memory) << ")";
+               << string_human_readable_number(mem.memory_size()) << " bytes. 
("
+               << string_human_readable_size(mem.memory_size()) << ")";
 
        memory_manager.alloc(mem.name, mem);
        /* Set the pointer to non-null to keep code that inspects its value 
from thinking its unallocated. */
@@ -558,6 +553,15 @@ void OpenCLDeviceBase::tex_free(device_memory& mem)
                        }
                }
        }
+
+       if(mem.grid_info && mem.grid_type == IMAGE_GRID_TYPE_SPARSE) {
+               device_memory *grid_info = (device_memory*)mem.grid_info;
+               if(grid_info->device_pointer) {
+                       stats.mem_free(grid_info->device_size);
+                       grid_info->device_pointer = 0;
+                       grid_info->device_size = 0;
+               }
+       }
 }
 
 size_t OpenCLDeviceBase::global_size_round_up(int group_size, int global_size)
@@ -691,6 +695,31 @@ void OpenCLDeviceBase::flush_texture_buffers()
 
                        info.interpolation = mem->interpolation;
                        info.extension = mem->extension;
+
+                       SparseTextureInfo s_info;
+                       s_info.offsets = 0;
+
+                       /* If image is sparse, cache info needed for index 
calculation. */
+                       if(mem->grid_info && mem->grid_type == 
IMAGE_GRID_TYPE_SPARSE) {
+                               device_memory *sparse_mem = 
(device_memory*)mem->grid_info;
+                               s_info.offsets = 
(uint64_t)sparse_mem->host_pointer;
+                               s_info.remain_w = info.width % TILE_SIZE;
+                               s_info.remain_h = info.height % TILE_SIZE;
+                               s_info.tiled_w = info.width / TILE_SIZE + 
(s_info.remain_w != 0);
+                               s_info.tiled_h = info.height / TILE_SIZE + 
(s_info.remain_h != 0);
+                               s_info.div_w = info.width - s_info.remain_w;
+                               s_info.div_h = info.height - s_info.remain_h;
+
+                               VLOG(1) << "Allocate: " << sparse_mem->name << 
", "
+                                       << 
string_human_readable_number(sparse_mem->memory_size()) << " bytes. ("
+                                       << 
string_human_readable_size(sparse_mem->memory_size()) << ")";
+
+                               sparse_mem->device_pointer = 
(device_ptr)sparse_mem->host_pointer;
+                               sparse_mem->device_size = 
sparse_mem->memory_size();
+                               stats.mem_alloc(sparse_mem->device_size);
+                       }
+
+                       info.sparse_info = s_info;
                }
        }
 
diff --git a/intern/cycles/kernel/kernels/cuda/kernel_cuda_image.h 
b/intern/cycles/kernel/kernels/cuda/kernel_cuda_image.h
index f73f5cdbb3a..7724b0dc3f1 100644
--- a/intern/cycles/kernel/kernels/cuda/kernel_cuda_image.h
+++ b/intern/cycles/kernel/kernels/cuda/kernel_cuda_image.h
@@ -59,27 +59,30 @@ ccl_device float cubic_h1(float a)
 }
 
 /* Converts coordinates from normal volume textures dense to sparse ones. */
-ccl_device bool compute_sparse_coordinates(const TextureInfo *info, float &fx, 
float &fy, float &fz)
+ccl_device bool sparse_coordinates(const SparseTextureInfo *s_info, float &fx, 
float &fy, float &fz)
 {
-       float *ix, *iy, *iz;
-       modff(fx, *ix);
-       modff(fy, *iy);
-       modff(fz, *iz);
-       int x = *ix, y = *iy, z = *iz;
-       int tix = x / TILE_SIZE, itix = x % 

@@ 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