Commit: ba59ae94110ebd7e6228ce19d985b3e908029eca
Author: Mai Lavelle
Date: Sun Jul 10 20:04:43 2016 -0400
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rBba59ae94110ebd7e6228ce19d985b3e908029eca
Prepare for merge with master
Sergey's bvh work made use of and removed the same unused bytes that
were being used for storing patch info, so this info now has to be
moved elsewhere. Unfortunately we use up two more textures for this.
===================================================================
M intern/cycles/kernel/geom/geom_attribute.h
M intern/cycles/kernel/geom/geom_triangle.h
M intern/cycles/kernel/kernel_textures.h
M intern/cycles/kernel/svm/svm_image.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/geom/geom_attribute.h
b/intern/cycles/kernel/geom/geom_attribute.h
index f8e35e9..a41dff6 100644
--- a/intern/cycles/kernel/geom/geom_attribute.h
+++ b/intern/cycles/kernel/geom/geom_attribute.h
@@ -25,7 +25,7 @@ CCL_NAMESPACE_BEGIN
* Lookup of attributes is different between OSL and SVM, as OSL is ustring
* based while for SVM we use integer ids. */
-ccl_device_inline int subd_triangle_patch(KernelGlobals *kg, const ShaderData
*sd);
+ccl_device_inline uint subd_triangle_patch(KernelGlobals *kg, const ShaderData
*sd);
ccl_device_inline uint attribute_primitive_type(KernelGlobals *kg, const
ShaderData *sd)
{
diff --git a/intern/cycles/kernel/geom/geom_triangle.h
b/intern/cycles/kernel/geom/geom_triangle.h
index 387230c..712ff40 100644
--- a/intern/cycles/kernel/geom/geom_triangle.h
+++ b/intern/cycles/kernel/geom/geom_triangle.h
@@ -207,9 +207,9 @@ ccl_device float3 triangle_attribute_float3(KernelGlobals
*kg, const ShaderData
/* Patch index for triangle, -1 if not subdivision triangle */
-ccl_device_inline int subd_triangle_patch(KernelGlobals *kg, const ShaderData
*sd)
+ccl_device_inline uint subd_triangle_patch(KernelGlobals *kg, const ShaderData
*sd)
{
- return __float_as_int(kernel_tex_fetch(__tri_vindex, ccl_fetch(sd,
prim)).w);
+ return kernel_tex_fetch(__tri_patch, ccl_fetch(sd, prim));
}
/* UV coords of triangle within patch */
@@ -218,14 +218,9 @@ ccl_device_inline void
subd_triangle_patch_uv(KernelGlobals *kg, const ShaderDat
{
float4 tri_vindex = kernel_tex_fetch(__tri_vindex, ccl_fetch(sd, prim));
- uv[0].x = kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.x)).w;
- uv[0].y = kernel_tex_fetch(__tri_vnormal,
__float_as_int(tri_vindex.x)).w;
-
- uv[1].x = kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.y)).w;
- uv[1].y = kernel_tex_fetch(__tri_vnormal,
__float_as_int(tri_vindex.y)).w;
-
- uv[2].x = kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.z)).w;
- uv[2].y = kernel_tex_fetch(__tri_vnormal,
__float_as_int(tri_vindex.z)).w;
+ uv[0] = kernel_tex_fetch(__tri_patch_uv, __float_as_int(tri_vindex.x));
+ uv[1] = kernel_tex_fetch(__tri_patch_uv, __float_as_int(tri_vindex.y));
+ uv[2] = kernel_tex_fetch(__tri_patch_uv, __float_as_int(tri_vindex.z));
}
/* Vertex indices of patch */
diff --git a/intern/cycles/kernel/kernel_textures.h
b/intern/cycles/kernel/kernel_textures.h
index 3a43658..d69f060 100644
--- a/intern/cycles/kernel/kernel_textures.h
+++ b/intern/cycles/kernel/kernel_textures.h
@@ -41,6 +41,8 @@ KERNEL_TEX(uint, texture_uint, __tri_shader)
KERNEL_TEX(float4, texture_float4, __tri_vnormal)
KERNEL_TEX(float4, texture_float4, __tri_vindex)
KERNEL_TEX(float4, texture_float4, __tri_verts)
+KERNEL_TEX(uint, texture_uint, __tri_patch)
+KERNEL_TEX(float2, texture_float2, __tri_patch_uv)
/* curves */
KERNEL_TEX(float4, texture_float4, __curves)
@@ -176,8 +178,6 @@ KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4,
__tex_image_byte4_086)
KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_byte4_087)
KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_byte4_088)
KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_byte4_089)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_byte4_090)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_byte4_091)
# else
/* bindless textures */
diff --git a/intern/cycles/kernel/svm/svm_image.h
b/intern/cycles/kernel/svm/svm_image.h
index 1eb584c..141b71b 100644
--- a/intern/cycles/kernel/svm/svm_image.h
+++ b/intern/cycles/kernel/svm/svm_image.h
@@ -256,8 +256,6 @@ ccl_device float4 svm_image_texture(KernelGlobals *kg, int
id, float x, float y,
case 87: r = kernel_tex_image_interp(__tex_image_byte4_087, x,
y); break;
case 88: r = kernel_tex_image_interp(__tex_image_byte4_088, x,
y); break;
case 89: r = kernel_tex_image_interp(__tex_image_byte4_089, x,
y); break;
- case 90: r = kernel_tex_image_interp(__tex_image_byte4_090, x,
y); break;
- case 91: r = kernel_tex_image_interp(__tex_image_byte4_091, x,
y); break;
default:
kernel_assert(0);
return make_float4(0.0f, 0.0f, 0.0f, 0.0f);
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 50271a3..af94ac0 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -565,13 +565,15 @@ void Mesh::pack_normals(Scene *scene, uint *tri_shader,
float4 *vnormal)
if(do_transform)
vNi = normalize(transform_direction(&ntfm, vNi));
- float patch_v = (!subd_faces.size()) ? 0.0f :
vert_patch_uv[i].y;
-
- vnormal[i] = make_float4(vNi.x, vNi.y, vNi.z, patch_v);
+ vnormal[i] = make_float4(vNi.x, vNi.y, vNi.z, 0.0f);
}
}
-void Mesh::pack_verts(float4 *tri_verts, float4 *tri_vindex, size_t
vert_offset)
+void Mesh::pack_verts(float4 *tri_verts,
+ float4 *tri_vindex,
+ uint *tri_patch,
+ float2 *tri_patch_uv,
+ size_t vert_offset)
{
size_t verts_size = verts.size();
@@ -580,9 +582,12 @@ void Mesh::pack_verts(float4 *tri_verts, float4
*tri_vindex, size_t vert_offset)
for(size_t i = 0; i < verts_size; i++) {
float3 p = verts_ptr[i];
- float patch_u = (!subd_faces.size()) ? 0.0f :
vert_patch_uv[i].x;
- tri_verts[i] = make_float4(p.x, p.y, p.z, patch_u);
+ tri_verts[i] = make_float4(p.x, p.y, p.z, 0.0f);
+
+ if(subd_faces.size()) {
+ tri_patch_uv[i] = vert_patch_uv[i];
+ }
}
}
@@ -591,13 +596,14 @@ 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);
- uint patch_index = (!subd_faces.size()) ? -1 :
(triangle_patch[i]*8 + patch_offset);
tri_vindex[i] = make_float4(
__int_as_float(t.v[0] + vert_offset),
__int_as_float(t.v[1] + vert_offset),
__int_as_float(t.v[2] + vert_offset),
- __int_as_float(patch_index));
+ 0.0f);
+
+ tri_patch[i] = (!subd_faces.size()) ? -1 :
(triangle_patch[i]*8 + patch_offset);
}
}
}
@@ -1326,10 +1332,16 @@ void MeshManager::device_update_mesh(Device *device,
DeviceScene *dscene, Scene
float4 *vnormal = dscene->tri_vnormal.resize(vert_size);
float4 *tri_verts = dscene->tri_verts.resize(vert_size);
float4 *tri_vindex = dscene->tri_vindex.resize(tri_size);
+ uint *tri_patch = dscene->tri_patch.resize(tri_size);
+ float2 *tri_patch_uv = dscene->tri_patch_uv.resize(vert_size);
foreach(Mesh *mesh, scene->meshes) {
mesh->pack_normals(scene,
&tri_shader[mesh->tri_offset], &vnormal[mesh->vert_offset]);
- mesh->pack_verts(&tri_verts[mesh->vert_offset],
&tri_vindex[mesh->tri_offset], mesh->vert_offset);
+ mesh->pack_verts(&tri_verts[mesh->vert_offset],
+ &tri_vindex[mesh->tri_offset],
+ &tri_patch[mesh->tri_offset],
+ &tri_patch_uv[mesh->vert_offset],
+ mesh->vert_offset);
if(progress.get_cancel()) return;
}
@@ -1341,6 +1353,8 @@ void MeshManager::device_update_mesh(Device *device,
DeviceScene *dscene, Scene
device->tex_alloc("__tri_vnormal", dscene->tri_vnormal);
device->tex_alloc("__tri_verts", dscene->tri_verts);
device->tex_alloc("__tri_vindex", dscene->tri_vindex);
+ device->tex_alloc("__tri_patch", dscene->tri_patch);
+ device->tex_alloc("__tri_patch_uv", dscene->tri_patch_uv);
}
if(curve_size != 0) {
@@ -1661,6 +1675,8 @@ void MeshManager::device_free(Device *device, DeviceScene
*dscene)
device->tex_free(dscene->tri_vnormal);
device->tex_free(dscene->tri_vindex);
device->tex_free(dscene->tri_verts);
+ device->tex_free(dscene->tri_patch);
+ device->tex_free(dscene->tri_patch_uv);
device->tex_free(dscene->curves);
device->tex_free(dscene->curve_keys);
device->tex_free(dscene->patches);
@@ -1680,6 +1696,8 @@ void MeshManager::device_free(Device *device, DeviceScene
*dscene)
dscene->tri_vnormal.clear();
dscene->tri_vindex.clear();
dscene->tri_verts.clear();
+ dscene->tri_patch.clear();
+ dscene->tri_patch_uv.clear();
dscene->curves.clear();
dscene->curve_keys.clear();
dscene->patches.clear();
diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h
index d732d69..fa49a6b 100644
--- a/intern/cycles/render/mesh.h
+++ b/intern/cycles/render/mesh.h
@@ -216,7 +216,12 @@ public:
void add_vertex_normals();
void pack_normals(Scene *scene, uint *shader, float4 *vnormal);
- void pack_verts(float4 *tri_verts, float4 *tri_vindex, size_t
vert_offset);
+ void pack_verts(float4 *tri_verts,
+ float4 *tri_vindex,
+ uint *tri_patch,
+ float2 *tri_patch_uv,
+ size_t vert_offset);
+
void pack_curves(Scene *scene, float4 *curve_key_co, float4
*curve_data, size_t curvekey_offset);
void pack_patches(uint *patch_data, uint vert_offset, uint face_offset,
uint corner_offset);
void compute_bvh(SceneParams *params, Progress *progress, int n, int
total);
diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h
index ec1903a..9c4c3f3 100644
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@ -74,6 +74,8 @@ public:
device_vector<float4> tri_vnormal;
device_vector<float4> tri_vindex;
device_vector<float4> tri_verts;
+ device_vector<uint> tri_patch;
+ device_vector<float2> tri_patch_uv;
device_vector<float4> curves;
device_vector<float4> curve_keys;
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs