[Bf-blender-cvs] [0f79ef1] opensubdiv-modifier: OpenSubdiv: A bit of optimizations
Sergey Sharybin
noreply at git.blender.org
Mon Jul 21 11:47:16 CEST 2014
Commit: 0f79ef131a36fd81c2083e380c84e0ca431cbf4d
Author: Sergey Sharybin
Date: Mon Jul 21 15:45:31 2014 +0600
Branches: opensubdiv-modifier
https://developer.blender.org/rB0f79ef131a36fd81c2083e380c84e0ca431cbf4d
OpenSubdiv: A bit of optimizations
- Use OpenMP for updating coarse normals and positions.
- Update coarse opsitions of GL Mesh only when it's needed.
===================================================================
M source/blender/blenkernel/intern/CCGSubSurf.c
===================================================================
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c
index 8952909..f1d019b 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf.c
@@ -37,8 +37,11 @@
#include "BKE_subsurf.h"
#include "BKE_subsurf.h"
+#include "BKE_global.h"
+#include "BKE_main.h"
#include "DNA_userdef_types.h"
+#include "DNA_scene_types.h"
#ifdef WITH_OPENSUBDIV
# include "opensubdiv_capi.h"
@@ -462,7 +465,7 @@ struct CCGSubSurf {
#ifdef WITH_OPENSUBDIV
struct OpenSubdiv_EvaluatorDescr *osd_evaluator;
struct OpenSubdiv_GLMesh *osd_mesh;
- bool osd_mesh_invalid;
+ bool osd_mesh_invalid, osd_coords_invalid;
unsigned int osd_vao;
bool skip_grids;
short osd_compute;
@@ -926,6 +929,7 @@ CCGSubSurf *ccgSubSurf_new(CCGMeshIFC *ifc, int subdivLevels, CCGAllocatorIFC *a
ss->osd_evaluator = NULL;
ss->osd_mesh = NULL;
ss->osd_mesh_invalid = false;
+ ss->osd_coords_invalid = false;
ss->osd_vao = 0;
ss->skip_grids = false;
ss->osd_compute = 0;
@@ -2295,6 +2299,7 @@ static void ccgSubSurf__updateGLMeshCoords(CCGSubSurf *ss)
positions = MEM_callocN(2 * sizeof(*positions) * num_basis_verts,
"OpenSubdiv coarse points");
+#pragma omp parallel for
for (i = 0; i < ss->vMap->curSize; i++) {
CCGVert *v = (CCGVert *) ss->vMap->buckets[i];
for (; v; v = v->next) {
@@ -2385,10 +2390,11 @@ bool ccgSubSurf_prepareGLMesh(CCGSubSurf *ss, bool use_osd_glsl)
ss->osd_compute = U.opensubdiv_compute_type;
}
- else {
+ else if (ss->osd_coords_invalid) {
ccgSubSurf__updateGLMeshCoords(ss);
openSubdiv_osdGLMeshRefine(ss->osd_mesh);
openSubdiv_osdGLMeshSynchronize(ss->osd_mesh);
+ ss->osd_coords_invalid = false;
}
openSubdiv_osdGLMeshDisplayPrepare(use_osd_glsl);
@@ -2637,12 +2643,15 @@ static void opensubdiv_updateCoarsePositions(CCGSubSurf *ss)
/* If all the components are to be initialized, no need to memset the
* new memory block.
*/
- positions = MEM_mallocN(3 * sizeof(float) * num_basis_verts, "OpenSubdiv coarse points");
+ positions = MEM_mallocN(3 * sizeof(float) * num_basis_verts,
+ "OpenSubdiv coarse points");
}
else {
/* Calloc in order to have z component initialized to 0 for Uvs */
- positions = MEM_callocN(3 * sizeof(float) * num_basis_verts, "OpenSubdiv coarse points");
+ positions = MEM_callocN(3 * sizeof(float) * num_basis_verts,
+ "OpenSubdiv coarse points");
}
+#pragma omp parallel for
for (i = 0; i < ss->vMap->curSize; i++) {
CCGVert *v = (CCGVert *) ss->vMap->buckets[i];
for (; v; v = v->next) {
@@ -2674,6 +2683,7 @@ static void opensubdiv_updateCoarseNormals(CCGSubSurf *ss)
return;
}
+#pragma omp palallel for
for (i = 0; i < ss->vMap->curSize; ++i) {
CCGVert *v = (CCGVert *) ss->vMap->buckets[i];
for (; v; v = v->next) {
@@ -2682,6 +2692,7 @@ static void opensubdiv_updateCoarseNormals(CCGSubSurf *ss)
}
}
+#pragma omp palallel for
for (i = 0; i < ss->fMap->curSize; ++i) {
CCGFace *f = (CCGFace *) ss->fMap->buckets[i];
for (; f; f = f->next) {
@@ -2698,14 +2709,18 @@ static void opensubdiv_updateCoarseNormals(CCGSubSurf *ss)
if (UNLIKELY(normalize_v3(face_no) == 0.0f)) {
face_no[2] = 1.0f; /* other axis set to 0.0 */
}
- for (S = 0; S < f->numVerts; S++) {
- CCGVert *v = FACE_getVerts(f)[S];
- float *no = VERT_getNo(v, 0);
- add_v3_v3(no, face_no);
+#pragma omp critical
+ {
+ for (S = 0; S < f->numVerts; S++) {
+ CCGVert *v = FACE_getVerts(f)[S];
+ float *no = VERT_getNo(v, 0);
+ add_v3_v3(no, face_no);
+ }
}
}
}
+#pragma omp palallel for
for (i = 0; i < ss->vMap->curSize; ++i) {
CCGVert *v = (CCGVert *) ss->vMap->buckets[i];
for (; v; v = v->next) {
@@ -2986,6 +3001,8 @@ static void ccgSubSurf__sync(CCGSubSurf *ss)
return;
}
+ ss->osd_coords_invalid = true;
+
/* Make sure OSD evaluator is up-to-date. */
if (opensubdiv_ensureEvaluator(ss)) {
if (ss->skip_grids == false) {
More information about the Bf-blender-cvs
mailing list