25 #ifndef OPENSUBDIV3_OSD_GL_COMPUTE_EVALUATOR_H 26 #define OPENSUBDIV3_OSD_GL_COMPUTE_EVALUATOR_H 28 #include "../version.h" 30 #include "../osd/opengl.h" 31 #include "../osd/types.h" 32 #include "../osd/bufferDescriptor.h" 35 namespace OPENSUBDIV_VERSION {
40 class LimitStencilTable;
54 void *deviceContext = NULL) {
60 void *deviceContext = NULL) {
97 void * deviceContext = NULL) {
100 if (instance->
Compile(srcDesc, dstDesc, duDesc, dvDesc))
return instance;
144 template <
typename SRC_BUFFER,
typename DST_BUFFER,
typename STENCIL_TABLE>
148 STENCIL_TABLE
const *stencilTable,
150 void * deviceContext = NULL) {
159 instance = Create(srcDesc, dstDesc,
212 template <
typename SRC_BUFFER,
typename DST_BUFFER,
typename STENCIL_TABLE>
218 STENCIL_TABLE
const *stencilTable,
220 void * deviceContext = NULL) {
231 instance = Create(srcDesc, dstDesc, duDesc, dvDesc);
247 template <
typename SRC_BUFFER,
typename DST_BUFFER,
typename STENCIL_TABLE>
251 STENCIL_TABLE
const *stencilTable)
const {
252 return EvalStencils(srcBuffer->BindVBO(), srcDesc,
253 dstBuffer->BindVBO(), dstDesc,
256 stencilTable->GetSizesBuffer(),
257 stencilTable->GetOffsetsBuffer(),
258 stencilTable->GetIndicesBuffer(),
259 stencilTable->GetWeightsBuffer(),
263 stencilTable->GetNumStencils());
268 template <
typename SRC_BUFFER,
typename DST_BUFFER,
typename STENCIL_TABLE>
274 STENCIL_TABLE
const *stencilTable)
const {
275 return EvalStencils(srcBuffer->BindVBO(), srcDesc,
276 dstBuffer->BindVBO(), dstDesc,
277 duBuffer->BindVBO(), duDesc,
278 dvBuffer->BindVBO(), dvDesc,
279 stencilTable->GetSizesBuffer(),
280 stencilTable->GetOffsetsBuffer(),
281 stencilTable->GetIndicesBuffer(),
282 stencilTable->GetWeightsBuffer(),
283 stencilTable->GetDuWeightsBuffer(),
284 stencilTable->GetDvWeightsBuffer(),
286 stencilTable->GetNumStencils());
296 GLuint offsetsBuffer,
297 GLuint indicesBuffer,
298 GLuint weightsBuffer,
299 GLuint duWeightsBuffer,
300 GLuint dvWeightsBuffer,
342 template <
typename SRC_BUFFER,
typename DST_BUFFER,
343 typename PATCHCOORD_BUFFER,
typename PATCH_TABLE>
348 PATCHCOORD_BUFFER *patchCoords,
349 PATCH_TABLE *patchTable,
351 void * deviceContext = NULL) {
356 numPatchCoords, patchCoords,
361 instance = Create(srcDesc, dstDesc,
367 numPatchCoords, patchCoords,
416 template <
typename SRC_BUFFER,
typename DST_BUFFER,
417 typename PATCHCOORD_BUFFER,
typename PATCH_TABLE>
424 PATCHCOORD_BUFFER *patchCoords,
425 PATCH_TABLE *patchTable,
427 void * deviceContext = NULL) {
434 numPatchCoords, patchCoords,
439 instance = Create(srcDesc, dstDesc, duDesc, dvDesc);
445 numPatchCoords, patchCoords,
478 template <
typename SRC_BUFFER,
typename DST_BUFFER,
479 typename PATCHCOORD_BUFFER,
typename PATCH_TABLE>
484 PATCHCOORD_BUFFER *patchCoords,
485 PATCH_TABLE *patchTable)
const {
487 return EvalPatches(srcBuffer->BindVBO(), srcDesc,
488 dstBuffer->BindVBO(), dstDesc,
492 patchCoords->BindVBO(),
493 patchTable->GetPatchArrays(),
494 patchTable->GetPatchIndexBuffer(),
495 patchTable->GetPatchParamBuffer());
532 template <
typename SRC_BUFFER,
typename DST_BUFFER,
533 typename PATCHCOORD_BUFFER,
typename PATCH_TABLE>
540 PATCHCOORD_BUFFER *patchCoords,
541 PATCH_TABLE *patchTable)
const {
543 return EvalPatches(srcBuffer->BindVBO(), srcDesc,
544 dstBuffer->BindVBO(), dstDesc,
545 duBuffer->BindVBO(), duDesc,
546 dvBuffer->BindVBO(), dvDesc,
548 patchCoords->BindVBO(),
549 patchTable->GetPatchArrays(),
550 patchTable->GetPatchIndexBuffer(),
551 patchTable->GetPatchParamBuffer());
559 GLuint patchCoordsBuffer,
561 GLuint patchIndexBuffer,
562 GLuint patchParamsBuffer)
const;
596 template <
typename SRC_BUFFER,
typename DST_BUFFER,
597 typename PATCHCOORD_BUFFER,
typename PATCH_TABLE>
602 PATCHCOORD_BUFFER *patchCoords,
603 PATCH_TABLE *patchTable,
605 void * deviceContext = NULL) {
611 numPatchCoords, patchCoords,
616 instance = Create(srcDesc, dstDesc,
623 numPatchCoords, patchCoords,
656 template <
typename SRC_BUFFER,
typename DST_BUFFER,
657 typename PATCHCOORD_BUFFER,
typename PATCH_TABLE>
662 PATCHCOORD_BUFFER *patchCoords,
663 PATCH_TABLE *patchTable)
const {
665 return EvalPatches(srcBuffer->BindVBO(), srcDesc,
666 dstBuffer->BindVBO(), dstDesc,
670 patchCoords->BindVBO(),
671 patchTable->GetVaryingPatchArrays(),
672 patchTable->GetVaryingPatchIndexBuffer(),
673 patchTable->GetPatchParamBuffer());
710 template <
typename SRC_BUFFER,
typename DST_BUFFER,
711 typename PATCHCOORD_BUFFER,
typename PATCH_TABLE>
716 PATCHCOORD_BUFFER *patchCoords,
717 PATCH_TABLE *patchTable,
720 void * deviceContext = NULL) {
726 numPatchCoords, patchCoords,
727 patchTable, fvarChannel);
731 instance = Create(srcDesc, dstDesc,
738 numPatchCoords, patchCoords,
739 patchTable, fvarChannel);
773 template <
typename SRC_BUFFER,
typename DST_BUFFER,
774 typename PATCHCOORD_BUFFER,
typename PATCH_TABLE>
779 PATCHCOORD_BUFFER *patchCoords,
780 PATCH_TABLE *patchTable,
781 int fvarChannel = 0)
const {
783 return EvalPatches(srcBuffer->BindVBO(), srcDesc,
784 dstBuffer->BindVBO(), dstDesc,
788 patchCoords->BindVBO(),
789 patchTable->GetFVarPatchArrays(fvarChannel),
790 patchTable->GetFVarPatchIndexBuffer(fvarChannel),
791 patchTable->GetFVarPatchParamBuffer(fvarChannel));
808 static void Synchronize(
void *deviceContext);
811 struct _StencilKernel {
822 GLuint uniformSrcOffset;
823 GLuint uniformDstOffset;
824 GLuint uniformDuDesc;
825 GLuint uniformDvDesc;
828 struct _PatchKernel {
837 GLuint uniformSrcOffset;
838 GLuint uniformDstOffset;
839 GLuint uniformPatchArray;
840 GLuint uniformDuDesc;
841 GLuint uniformDvDesc;
851 using namespace OPENSUBDIV_VERSION;
856 #endif // OPENSUBDIV3_OSD_GL_COMPUTE_EVALUATOR_H static bool EvalPatchesVarying(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, int numPatchCoords, PATCHCOORD_BUFFER *patchCoords, PATCH_TABLE *patchTable, GLComputeEvaluator const *instance, void *deviceContext=NULL)
Generic limit eval function. This function has a same signature as other device kernels have so that ...
Table of subdivision stencils.
bool EvalStencils(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, STENCIL_TABLE const *stencilTable) const
Table of limit subdivision stencils.
static bool EvalStencils(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, STENCIL_TABLE const *stencilTable, GLComputeEvaluator const *instance, void *deviceContext=NULL)
Generic static compute function. This function has a same signature as other device kernels have so t...
bool EvalPatches(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, int numPatchCoords, PATCHCOORD_BUFFER *patchCoords, PATCH_TABLE *patchTable) const
Generic limit eval function with derivatives. This function has a same signature as other device kern...
int GetNumStencils() const
static bool EvalPatchesFaceVarying(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, int numPatchCoords, PATCHCOORD_BUFFER *patchCoords, PATCH_TABLE *patchTable, int fvarChannel, GLComputeEvaluator const *instance, void *deviceContext=NULL)
Generic limit eval function. This function has a same signature as other device kernels have so that ...
GLuint GetDuWeightsBuffer() const
static bool EvalPatches(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, int numPatchCoords, PATCHCOORD_BUFFER *patchCoords, PATCH_TABLE *patchTable, GLComputeEvaluator const *instance, void *deviceContext=NULL)
Generic limit eval function. This function has a same signature as other device kernels have so that ...
std::vector< PatchArray > PatchArrayVector
bool EvalStencils(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, STENCIL_TABLE const *stencilTable) const
static bool EvalStencils(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, STENCIL_TABLE const *stencilTable, GLComputeEvaluator const *instance, void *deviceContext=NULL)
Generic static compute function. This function has a same signature as other device kernels have so t...
static GLStencilTableSSBO * Create(Far::StencilTable const *stencilTable, void *deviceContext=NULL)
bool EvalPatches(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, int numPatchCoords, PATCHCOORD_BUFFER *patchCoords, PATCH_TABLE *patchTable) const
Generic limit eval function. This function has a same signature as other device kernels have so that ...
BufferDescriptor is a struct which describes buffer elements in interleaved data buffers. Almost all Osd Evaluator APIs take BufferDescriptors along with device-specific buffer objects.
static GLStencilTableSSBO * Create(Far::LimitStencilTable const *limitStencilTable, void *deviceContext=NULL)
GLuint GetOffsetsBuffer() const
static GLComputeEvaluator * Create(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc, BufferDescriptor const &dvDesc, void *deviceContext=NULL)
bool Compile(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc, BufferDescriptor const &dvDesc)
bool EvalPatchesVarying(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, int numPatchCoords, PATCHCOORD_BUFFER *patchCoords, PATCH_TABLE *patchTable) const
Generic limit eval function. This function has a same signature as other device kernels have so that ...
bool EvalPatchesFaceVarying(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, int numPatchCoords, PATCHCOORD_BUFFER *patchCoords, PATCH_TABLE *patchTable, int fvarChannel=0) const
Generic limit eval function. This function has a same signature as other device kernels have so that ...
GLuint GetIndicesBuffer() const
GLuint GetSizesBuffer() const
GLuint GetWeightsBuffer() const
static bool EvalPatches(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, int numPatchCoords, PATCHCOORD_BUFFER *patchCoords, PATCH_TABLE *patchTable, GLComputeEvaluator const *instance, void *deviceContext=NULL)
Generic limit eval function. This function has a same signature as other device kernels have so that ...
GLuint GetDvWeightsBuffer() const
GL stencil table (Shader Storage buffer)