add bilinear compute to cpu kernel ( not yet for other kernels)

This commit is contained in:
Takahito Tejima 2012-06-11 17:52:32 -07:00
parent 23a3b7b15f
commit ee40f8d259
4 changed files with 70 additions and 2 deletions

View File

@ -206,20 +206,35 @@ OsdCpuKernelDispatcher::Synchronize() { }
void
OsdCpuKernelDispatcher::ApplyBilinearFaceVerticesKernel( FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const {
VertexDescriptor vd(_numVertexElements, _numVaryingElements);
computeFace(&vd, _vbo, _varyingVbo,
(int*)_tables[F_IT].devicePtr + _tableOffsets[F_IT][level-1],
(int*)_tables[F_ITa].devicePtr + _tableOffsets[F_ITa][level-1],
offset, start, end);
}
void
OsdCpuKernelDispatcher::ApplyBilinearEdgeVerticesKernel( FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const {
VertexDescriptor vd(_numVertexElements, _numVaryingElements);
computeBilinearEdge(&vd, _vbo, _varyingVbo,
(int*)_tables[E_IT].devicePtr + _tableOffsets[E_IT][level-1],
offset,
start, end);
}
void
OsdCpuKernelDispatcher::ApplyBilinearVertexVerticesKernel( FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const {
VertexDescriptor vd(_numVertexElements, _numVaryingElements);
computeBilinearVertex(&vd, _vbo, _varyingVbo,
(int*)_tables[V_ITa].devicePtr + _tableOffsets[V_ITa][level-1],
offset, start, end);
}
void
OsdCpuKernelDispatcher::ApplyCatmarkFaceVerticesKernel( FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const {

View File

@ -227,5 +227,49 @@ void computeLoopVertexB(const VertexDescriptor *vdesc, float *vertex, float *var
}
}
void computeBilinearEdge(const VertexDescriptor *vdesc, float *vertex, float *varying, const int *E_IT, int offset, int start, int end) {
int ve = vdesc->numVertexElements;
int vev = vdesc->numVaryingElements;
#ifdef _OPENMP
#pragma omp parallel for
#endif
for (int i = start; i < end; i++) {
int eidx0 = E_IT[2*i+0];
int eidx1 = E_IT[2*i+1];
float *dst = &vertex[(offset+i)*ve];
float *dstVarying = &varying[(offset+i)*vev];
vdesc->Clear(dst, dstVarying);
vdesc->AddWithWeight(dst, &vertex[eidx0*ve], 0.5f);
vdesc->AddWithWeight(dst, &vertex[eidx1*ve], 0.5f);
vdesc->AddVaryingWithWeight(dstVarying, &varying[eidx0*vev], 0.5f);
vdesc->AddVaryingWithWeight(dstVarying, &varying[eidx1*vev], 0.5f);
}
}
void computeBilinearVertex(const VertexDescriptor *vdesc, float *vertex, float *varying, const int *V_ITa, int offset, int start, int end) {
int ve = vdesc->numVertexElements;
int vev = vdesc->numVaryingElements;
#ifdef _OPENMP
#pragma omp parallel for
#endif
for (int i = start; i < end; i++) {
int p = V_ITa[i];
float *dst = &vertex[(offset+i)*ve];
float *dstVarying = &varying[(offset+i)*vev];
vdesc->Clear(dst, dstVarying);
vdesc->AddWithWeight(dst, &vertex[p*ve], 1.0f);
vdesc->AddVaryingWithWeight(dstVarying, &varying[p*vev], 1.0f);
}
}
} // end namespace OPENSUBDIV_VERSION
} // end namespace OpenSubdiv

View File

@ -99,6 +99,10 @@ void computeVertexB(const VertexDescriptor *vdesc, float *vertex, float * varyin
void computeLoopVertexB(const VertexDescriptor *vdesc, float *vertex, float * varying, const int *V_ITa, const int *V_IT, const float *V_W, int offset, int start, int end);
void computeBilinearEdge(const VertexDescriptor *vdesc, float *vertex, float * varying, const int *E_IT, int offset, int start, int end);
void computeBilinearVertex(const VertexDescriptor *vdesc, float *vertex, float * varying, const int *V_ITa, int offset, int start, int end);
}
} // end namespace OPENSUBDIV_VERSION

View File

@ -121,6 +121,11 @@ OsdMesh::Create(OsdHbrMesh *hbrMesh, int level, const std::string &kernel) {
// catmark
_dispatcher->UpdateTable(OsdKernelDispatcher::F_IT, cctable->Get_F_IT());
_dispatcher->UpdateTable(OsdKernelDispatcher::F_ITa, cctable->Get_F_ITa());
} else if ( const FarBilinearSubdivisionTables<OsdVertex> * btable =
dynamic_cast<const FarBilinearSubdivisionTables<OsdVertex>*>(table) ) {
// bilinear
_dispatcher->UpdateTable(OsdKernelDispatcher::F_IT, btable->Get_F_IT());
_dispatcher->UpdateTable(OsdKernelDispatcher::F_ITa, btable->Get_F_ITa());
} else {
// XXX for glsl shader...
_dispatcher->CopyTable(OsdKernelDispatcher::F_IT, 0, NULL);