Commit: 2724a95f0609300957ea16f24d067d4254ddd80e
Author: Mai Lavelle
Date:   Wed Jun 8 05:17:48 2016 -0400
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rB2724a95f0609300957ea16f24d067d4254ddd80e

Copy patches to device memory

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

M       intern/cycles/kernel/kernel_textures.h
M       intern/cycles/render/mesh.cpp
M       intern/cycles/render/mesh.h
M       intern/cycles/render/scene.h

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

diff --git a/intern/cycles/kernel/kernel_textures.h 
b/intern/cycles/kernel/kernel_textures.h
index 245d236..c7f1433 100644
--- a/intern/cycles/kernel/kernel_textures.h
+++ b/intern/cycles/kernel/kernel_textures.h
@@ -46,6 +46,9 @@ KERNEL_TEX(float4, texture_float4, __tri_verts)
 KERNEL_TEX(float4, texture_float4, __curves)
 KERNEL_TEX(float4, texture_float4, __curve_keys)
 
+/* patches */
+KERNEL_TEX(uint4, texture_uint4, __patches)
+
 /* attributes */
 KERNEL_TEX(uint4, texture_uint4, __attributes_map)
 KERNEL_TEX(float, texture_float, __attributes_float)
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index f2722c6..79f172a 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -130,6 +130,8 @@ Mesh::Mesh()
        curve_offset = 0;
        curvekey_offset = 0;
 
+       patch_offset = 0;
+
        attributes.triangle_mesh = this;
        curve_attributes.curve_mesh = this;
 
@@ -537,7 +539,7 @@ void Mesh::pack_verts(float4 *tri_verts, float4 
*tri_vindex, size_t vert_offset)
        if(triangles_size) {
                for(size_t i = 0; i < triangles_size; i++) {
                        Triangle t = get_triangle(i);
-                       int patch_index = (!patches.size()) ? -1 : 
triangle_patch[i];
+                       uint patch_index = (!patches.size()) ? -1 : 
(triangle_patch[i] + patch_offset);
 
                        tri_vindex[i] = make_float4(
                                __int_as_float(t.v[0] + vert_offset),
@@ -581,6 +583,22 @@ void Mesh::pack_curves(Scene *scene, float4 *curve_key_co, 
float4 *curve_data, s
        }
 }
 
+void Mesh::pack_patches(uint4 *patch_data, uint vert_offset)
+{
+       size_t patches_size = patches.size();
+
+       if(patches_size) {
+               for(size_t i = 0; i < patches_size; i++) {
+                       Patch p = patches[i];
+
+                       patch_data[i] = {p.v[0] + vert_offset,
+                                            p.v[1] + vert_offset,
+                                            p.v[2] + vert_offset,
+                                            p.v[3] >= 0 ? p.v[3] + vert_offset 
: -1};
+               }
+       }
+}
+
 void Mesh::compute_bvh(SceneParams *params, Progress *progress, int n, int 
total)
 {
        if(progress->get_cancel())
@@ -1127,6 +1145,8 @@ void MeshManager::device_update_mesh(Device *device, 
DeviceScene *dscene, Scene
        size_t curve_key_size = 0;
        size_t curve_size = 0;
 
+       size_t patch_size = 0;
+
        foreach(Mesh *mesh, scene->meshes) {
                mesh->vert_offset = vert_size;
                mesh->tri_offset = tri_size;
@@ -1134,11 +1154,15 @@ void MeshManager::device_update_mesh(Device *device, 
DeviceScene *dscene, Scene
                mesh->curvekey_offset = curve_key_size;
                mesh->curve_offset = curve_size;
 
+               mesh->patch_offset = patch_size;
+
                vert_size += mesh->verts.size();
                tri_size += mesh->num_triangles();
 
                curve_key_size += mesh->curve_keys.size();
                curve_size += mesh->num_curves();
+
+               patch_size += mesh->patches.size();
        }
 
        if(tri_size != 0) {
@@ -1180,6 +1204,19 @@ void MeshManager::device_update_mesh(Device *device, 
DeviceScene *dscene, Scene
                device->tex_alloc("__curve_keys", dscene->curve_keys);
                device->tex_alloc("__curves", dscene->curves);
        }
+
+       if(patch_size != 0) {
+               progress.set_status("Updating Mesh", "Copying Patches to 
device");
+
+               uint4 *patch_data = dscene->patches.resize(patch_size);
+
+               foreach(Mesh *mesh, scene->meshes) {
+                       mesh->pack_patches(&patch_data[mesh->patch_offset], 
mesh->vert_offset);
+                       if(progress.get_cancel()) return;
+               }
+
+               device->tex_alloc("__patches", dscene->patches);
+       }
 }
 
 void MeshManager::device_update_bvh(Device *device, DeviceScene *dscene, Scene 
*scene, Progress& progress)
@@ -1464,6 +1501,7 @@ void MeshManager::device_free(Device *device, DeviceScene 
*dscene)
        device->tex_free(dscene->tri_verts);
        device->tex_free(dscene->curves);
        device->tex_free(dscene->curve_keys);
+       device->tex_free(dscene->patches);
        device->tex_free(dscene->attributes_map);
        device->tex_free(dscene->attributes_float);
        device->tex_free(dscene->attributes_float3);
@@ -1482,6 +1520,7 @@ void MeshManager::device_free(Device *device, DeviceScene 
*dscene)
        dscene->tri_verts.clear();
        dscene->curves.clear();
        dscene->curve_keys.clear();
+       dscene->patches.clear();
        dscene->attributes_map.clear();
        dscene->attributes_float.clear();
        dscene->attributes_float3.clear();
diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h
index 3cff3e2..c8d07aa 100644
--- a/intern/cycles/render/mesh.h
+++ b/intern/cycles/render/mesh.h
@@ -161,6 +161,8 @@ public:
        size_t curve_offset;
        size_t curvekey_offset;
 
+       size_t patch_offset;
+
        /* Functions */
        Mesh();
        ~Mesh();
@@ -188,6 +190,7 @@ public:
        void pack_normals(Scene *scene, uint *shader, float4 *vnormal);
        void pack_verts(float4 *tri_verts, float4 *tri_vindex, size_t 
vert_offset);
        void pack_curves(Scene *scene, float4 *curve_key_co, float4 
*curve_data, size_t curvekey_offset);
+       void pack_patches(uint4 *patch_data, uint vert_offset);
        void compute_bvh(SceneParams *params, Progress *progress, int n, int 
total);
 
        bool need_attribute(Scene *scene, AttributeStandard std);
diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h
index b34d612..8b7b2f9 100644
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@ -78,6 +78,8 @@ public:
        device_vector<float4> curves;
        device_vector<float4> curve_keys;
 
+       device_vector<uint4> patches;
+
        /* objects */
        device_vector<float4> objects;
        device_vector<float4> objects_vector;

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

Reply via email to