Blender V4.3
gl_compute_evaluator.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2015 Pixar
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#ifndef OPENSUBDIV_GL_COMPUTE_EVALUATOR_H_
6#define OPENSUBDIV_GL_COMPUTE_EVALUATOR_H_
7
8#include <opensubdiv/osd/bufferDescriptor.h>
9#include <opensubdiv/osd/opengl.h>
10#include <opensubdiv/osd/types.h>
11#include <opensubdiv/version.h>
12
13namespace OpenSubdiv {
14namespace OPENSUBDIV_VERSION {
15namespace Far {
16class LimitStencilTable;
17class StencilTable;
18} // namespace Far
19} // namespace OPENSUBDIV_VERSION
20} // namespace OpenSubdiv
21
22namespace blender::opensubdiv {
23
31 public:
32 static GLStencilTableSSBO *Create(OpenSubdiv::Far::StencilTable const *stencilTable,
33 void *deviceContext = NULL)
34 {
35 (void)deviceContext; // unused
36 return new GLStencilTableSSBO(stencilTable);
37 }
38 static GLStencilTableSSBO *Create(OpenSubdiv::Far::LimitStencilTable const *limitStencilTable,
39 void *deviceContext = NULL)
40 {
41 (void)deviceContext; // unused
42 return new GLStencilTableSSBO(limitStencilTable);
43 }
44
45 explicit GLStencilTableSSBO(OpenSubdiv::Far::StencilTable const *stencilTable);
46 explicit GLStencilTableSSBO(OpenSubdiv::Far::LimitStencilTable const *limitStencilTable);
48
49 // interfaces needed for GLSLComputeKernel
50 GLuint GetSizesBuffer() const
51 {
52 return _sizes;
53 }
54 GLuint GetOffsetsBuffer() const
55 {
56 return _offsets;
57 }
58 GLuint GetIndicesBuffer() const
59 {
60 return _indices;
61 }
62 GLuint GetWeightsBuffer() const
63 {
64 return _weights;
65 }
66 GLuint GetDuWeightsBuffer() const
67 {
68 return _duWeights;
69 }
70 GLuint GetDvWeightsBuffer() const
71 {
72 return _dvWeights;
73 }
74 GLuint GetDuuWeightsBuffer() const
75 {
76 return _duuWeights;
77 }
78 GLuint GetDuvWeightsBuffer() const
79 {
80 return _duvWeights;
81 }
82 GLuint GetDvvWeightsBuffer() const
83 {
84 return _dvvWeights;
85 }
86 int GetNumStencils() const
87 {
88 return _numStencils;
89 }
90
91 private:
92 GLuint _sizes;
93 GLuint _offsets;
94 GLuint _indices;
95 GLuint _weights;
96 GLuint _duWeights;
97 GLuint _dvWeights;
98 GLuint _duuWeights;
99 GLuint _duvWeights;
100 GLuint _dvvWeights;
101 int _numStencils;
102};
103
104// ---------------------------------------------------------------------------
105
107 public:
108 typedef bool Instantiatable;
109 static GLComputeEvaluator *Create(OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
110 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
111 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
112 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
113 void *deviceContext = NULL)
114 {
115 return Create(srcDesc,
116 dstDesc,
117 duDesc,
118 dvDesc,
119 OpenSubdiv::Osd::BufferDescriptor(),
120 OpenSubdiv::Osd::BufferDescriptor(),
121 OpenSubdiv::Osd::BufferDescriptor(),
122 deviceContext);
123 }
124
125 static GLComputeEvaluator *Create(OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
126 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
127 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
128 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
129 OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
130 OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
131 OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
132 void *deviceContext = NULL)
133 {
134 (void)deviceContext; // not used
135 GLComputeEvaluator *instance = new GLComputeEvaluator();
136 if (instance->Compile(srcDesc, dstDesc, duDesc, dvDesc, duuDesc, duvDesc, dvvDesc)) {
137 return instance;
138 }
139 delete instance;
140 return NULL;
141 }
142
145
148
154
182 template<typename SRC_BUFFER, typename DST_BUFFER, typename STENCIL_TABLE>
183 static bool EvalStencils(SRC_BUFFER *srcBuffer,
184 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
185 DST_BUFFER *dstBuffer,
186 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
187 STENCIL_TABLE const *stencilTable,
188 GLComputeEvaluator const *instance,
189 void *deviceContext = NULL)
190 {
191
192 if (instance) {
193 return instance->EvalStencils(srcBuffer, srcDesc, dstBuffer, dstDesc, stencilTable);
194 }
195 else {
196 // Create an instance on demand (slow)
197 (void)deviceContext; // unused
198 instance = Create(srcDesc,
199 dstDesc,
200 OpenSubdiv::Osd::BufferDescriptor(),
201 OpenSubdiv::Osd::BufferDescriptor());
202 if (instance) {
203 bool r = instance->EvalStencils(srcBuffer, srcDesc, dstBuffer, dstDesc, stencilTable);
204 delete instance;
205 return r;
206 }
207 return false;
208 }
209 }
210
250 template<typename SRC_BUFFER, typename DST_BUFFER, typename STENCIL_TABLE>
251 static bool EvalStencils(SRC_BUFFER *srcBuffer,
252 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
253 DST_BUFFER *dstBuffer,
254 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
255 DST_BUFFER *duBuffer,
256 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
257 DST_BUFFER *dvBuffer,
258 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
259 STENCIL_TABLE const *stencilTable,
260 GLComputeEvaluator const *instance,
261 void *deviceContext = NULL)
262 {
263
264 if (instance) {
265 return instance->EvalStencils(srcBuffer,
266 srcDesc,
267 dstBuffer,
268 dstDesc,
269 duBuffer,
270 duDesc,
271 dvBuffer,
272 dvDesc,
273 stencilTable);
274 }
275 else {
276 // Create an instance on demand (slow)
277 (void)deviceContext; // unused
278 instance = Create(srcDesc, dstDesc, duDesc, dvDesc);
279 if (instance) {
280 bool r = instance->EvalStencils(srcBuffer,
281 srcDesc,
282 dstBuffer,
283 dstDesc,
284 duBuffer,
285 duDesc,
286 dvBuffer,
287 dvDesc,
288 stencilTable);
289 delete instance;
290 return r;
291 }
292 return false;
293 }
294 }
295
353 template<typename SRC_BUFFER, typename DST_BUFFER, typename STENCIL_TABLE>
354 static bool EvalStencils(SRC_BUFFER *srcBuffer,
355 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
356 DST_BUFFER *dstBuffer,
357 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
358 DST_BUFFER *duBuffer,
359 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
360 DST_BUFFER *dvBuffer,
361 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
362 DST_BUFFER *duuBuffer,
363 OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
364 DST_BUFFER *duvBuffer,
365 OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
366 DST_BUFFER *dvvBuffer,
367 OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
368 STENCIL_TABLE const *stencilTable,
369 GLComputeEvaluator const *instance,
370 void *deviceContext = NULL)
371 {
372
373 if (instance) {
374 return instance->EvalStencils(srcBuffer,
375 srcDesc,
376 dstBuffer,
377 dstDesc,
378 duBuffer,
379 duDesc,
380 dvBuffer,
381 dvDesc,
382 duuBuffer,
383 duuDesc,
384 duvBuffer,
385 duvDesc,
386 dvvBuffer,
387 dvvDesc,
388 stencilTable);
389 }
390 else {
391 // Create an instance on demand (slow)
392 (void)deviceContext; // unused
393 instance = Create(srcDesc, dstDesc, duDesc, dvDesc, duuDesc, duvDesc, dvvDesc);
394 if (instance) {
395 bool r = instance->EvalStencils(srcBuffer,
396 srcDesc,
397 dstBuffer,
398 dstDesc,
399 duBuffer,
400 duDesc,
401 dvBuffer,
402 dvDesc,
403 duuBuffer,
404 duuDesc,
405 duvBuffer,
406 duvDesc,
407 dvvBuffer,
408 dvvDesc,
409 stencilTable);
410 delete instance;
411 return r;
412 }
413 return false;
414 }
415 }
416
434 template<typename SRC_BUFFER, typename DST_BUFFER, typename STENCIL_TABLE>
435 bool EvalStencils(SRC_BUFFER *srcBuffer,
436 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
437 DST_BUFFER *dstBuffer,
438 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
439 STENCIL_TABLE const *stencilTable) const
440 {
441 return EvalStencils(srcBuffer->BindVBO(),
442 srcDesc,
443 dstBuffer->BindVBO(),
444 dstDesc,
445 0,
446 OpenSubdiv::Osd::BufferDescriptor(),
447 0,
448 OpenSubdiv::Osd::BufferDescriptor(),
449 stencilTable->GetSizesBuffer(),
450 stencilTable->GetOffsetsBuffer(),
451 stencilTable->GetIndicesBuffer(),
452 stencilTable->GetWeightsBuffer(),
453 0,
454 0,
455 /* start = */ 0,
456 /* end = */ stencilTable->GetNumStencils());
457 }
458
488 template<typename SRC_BUFFER, typename DST_BUFFER, typename STENCIL_TABLE>
489 bool EvalStencils(SRC_BUFFER *srcBuffer,
490 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
491 DST_BUFFER *dstBuffer,
492 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
493 DST_BUFFER *duBuffer,
494 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
495 DST_BUFFER *dvBuffer,
496 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
497 STENCIL_TABLE const *stencilTable) const
498 {
499 return EvalStencils(srcBuffer->BindVBO(),
500 srcDesc,
501 dstBuffer->BindVBO(),
502 dstDesc,
503 duBuffer->BindVBO(),
504 duDesc,
505 dvBuffer->BindVBO(),
506 dvDesc,
507 stencilTable->GetSizesBuffer(),
508 stencilTable->GetOffsetsBuffer(),
509 stencilTable->GetIndicesBuffer(),
510 stencilTable->GetWeightsBuffer(),
511 stencilTable->GetDuWeightsBuffer(),
512 stencilTable->GetDvWeightsBuffer(),
513 /* start = */ 0,
514 /* end = */ stencilTable->GetNumStencils());
515 }
516
564 template<typename SRC_BUFFER, typename DST_BUFFER, typename STENCIL_TABLE>
565 bool EvalStencils(SRC_BUFFER *srcBuffer,
566 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
567 DST_BUFFER *dstBuffer,
568 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
569 DST_BUFFER *duBuffer,
570 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
571 DST_BUFFER *dvBuffer,
572 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
573 DST_BUFFER *duuBuffer,
574 OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
575 DST_BUFFER *duvBuffer,
576 OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
577 DST_BUFFER *dvvBuffer,
578 OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
579 STENCIL_TABLE const *stencilTable) const
580 {
581 return EvalStencils(srcBuffer->BindVBO(),
582 srcDesc,
583 dstBuffer->BindVBO(),
584 dstDesc,
585 duBuffer->BindVBO(),
586 duDesc,
587 dvBuffer->BindVBO(),
588 dvDesc,
589 duuBuffer->BindVBO(),
590 duuDesc,
591 duvBuffer->BindVBO(),
592 duvDesc,
593 dvvBuffer->BindVBO(),
594 dvvDesc,
595 stencilTable->GetSizesBuffer(),
596 stencilTable->GetOffsetsBuffer(),
597 stencilTable->GetIndicesBuffer(),
598 stencilTable->GetWeightsBuffer(),
599 stencilTable->GetDuWeightsBuffer(),
600 stencilTable->GetDvWeightsBuffer(),
601 stencilTable->GetDuuWeightsBuffer(),
602 stencilTable->GetDuvWeightsBuffer(),
603 stencilTable->GetDvvWeightsBuffer(),
604 /* start = */ 0,
605 /* end = */ stencilTable->GetNumStencils());
606 }
607
643 bool EvalStencils(GLuint srcBuffer,
644 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
645 GLuint dstBuffer,
646 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
647 GLuint duBuffer,
648 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
649 GLuint dvBuffer,
650 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
651 GLuint sizesBuffer,
652 GLuint offsetsBuffer,
653 GLuint indicesBuffer,
654 GLuint weightsBuffer,
655 GLuint duWeightsBuffer,
656 GLuint dvWeightsBuffer,
657 int start,
658 int end) const;
659
713 bool EvalStencils(GLuint srcBuffer,
714 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
715 GLuint dstBuffer,
716 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
717 GLuint duBuffer,
718 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
719 GLuint dvBuffer,
720 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
721 GLuint duuBuffer,
722 OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
723 GLuint duvBuffer,
724 OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
725 GLuint dvvBuffer,
726 OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
727 GLuint sizesBuffer,
728 GLuint offsetsBuffer,
729 GLuint indicesBuffer,
730 GLuint weightsBuffer,
731 GLuint duWeightsBuffer,
732 GLuint dvWeightsBuffer,
733 GLuint duuWeightsBuffer,
734 GLuint duvWeightsBuffer,
735 GLuint dvvWeightsBuffer,
736 int start,
737 int end) const;
738
744
777 template<typename SRC_BUFFER,
778 typename DST_BUFFER,
779 typename PATCHCOORD_BUFFER,
780 typename PATCH_TABLE>
781 static bool EvalPatches(SRC_BUFFER *srcBuffer,
782 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
783 DST_BUFFER *dstBuffer,
784 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
785 int numPatchCoords,
786 PATCHCOORD_BUFFER *patchCoords,
787 PATCH_TABLE *patchTable,
788 GLComputeEvaluator const *instance,
789 void *deviceContext = NULL)
790 {
791
792 if (instance) {
793 return instance->EvalPatches(
794 srcBuffer, srcDesc, dstBuffer, dstDesc, numPatchCoords, patchCoords, patchTable);
795 }
796 else {
797 // Create an instance on demand (slow)
798 (void)deviceContext; // unused
799 instance = Create(srcDesc,
800 dstDesc,
801 OpenSubdiv::Osd::BufferDescriptor(),
802 OpenSubdiv::Osd::BufferDescriptor());
803 if (instance) {
804 bool r = instance->EvalPatches(
805 srcBuffer, srcDesc, dstBuffer, dstDesc, numPatchCoords, patchCoords, patchTable);
806 delete instance;
807 return r;
808 }
809 return false;
810 }
811 }
812
857 template<typename SRC_BUFFER,
858 typename DST_BUFFER,
859 typename PATCHCOORD_BUFFER,
860 typename PATCH_TABLE>
861 static bool EvalPatches(SRC_BUFFER *srcBuffer,
862 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
863 DST_BUFFER *dstBuffer,
864 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
865 DST_BUFFER *duBuffer,
866 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
867 DST_BUFFER *dvBuffer,
868 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
869 int numPatchCoords,
870 PATCHCOORD_BUFFER *patchCoords,
871 PATCH_TABLE *patchTable,
872 GLComputeEvaluator const *instance,
873 void *deviceContext = NULL)
874 {
875
876 if (instance) {
877 return instance->EvalPatches(srcBuffer,
878 srcDesc,
879 dstBuffer,
880 dstDesc,
881 duBuffer,
882 duDesc,
883 dvBuffer,
884 dvDesc,
885 numPatchCoords,
886 patchCoords,
887 patchTable);
888 }
889 else {
890 // Create an instance on demand (slow)
891 (void)deviceContext; // unused
892 instance = Create(srcDesc, dstDesc, duDesc, dvDesc);
893 if (instance) {
894 bool r = instance->EvalPatches(srcBuffer,
895 srcDesc,
896 dstBuffer,
897 dstDesc,
898 duBuffer,
899 duDesc,
900 dvBuffer,
901 dvDesc,
902 numPatchCoords,
903 patchCoords,
904 patchTable);
905 delete instance;
906 return r;
907 }
908 return false;
909 }
910 }
911
974 template<typename SRC_BUFFER,
975 typename DST_BUFFER,
976 typename PATCHCOORD_BUFFER,
977 typename PATCH_TABLE>
978 static bool EvalPatches(SRC_BUFFER *srcBuffer,
979 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
980 DST_BUFFER *dstBuffer,
981 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
982 DST_BUFFER *duBuffer,
983 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
984 DST_BUFFER *dvBuffer,
985 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
986 DST_BUFFER *duuBuffer,
987 OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
988 DST_BUFFER *duvBuffer,
989 OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
990 DST_BUFFER *dvvBuffer,
991 OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
992 int numPatchCoords,
993 PATCHCOORD_BUFFER *patchCoords,
994 PATCH_TABLE *patchTable,
995 GLComputeEvaluator const *instance,
996 void *deviceContext = NULL)
997 {
998
999 if (instance) {
1000 return instance->EvalPatches(srcBuffer,
1001 srcDesc,
1002 dstBuffer,
1003 dstDesc,
1004 duBuffer,
1005 duDesc,
1006 dvBuffer,
1007 dvDesc,
1008 duuBuffer,
1009 duuDesc,
1010 duvBuffer,
1011 duvDesc,
1012 dvvBuffer,
1013 dvvDesc,
1014 numPatchCoords,
1015 patchCoords,
1016 patchTable);
1017 }
1018 else {
1019 // Create an instance on demand (slow)
1020 (void)deviceContext; // unused
1021 instance = Create(srcDesc, dstDesc, duDesc, dvDesc, duuDesc, duvDesc, dvvDesc);
1022 if (instance) {
1023 bool r = instance->EvalPatches(srcBuffer,
1024 srcDesc,
1025 dstBuffer,
1026 dstDesc,
1027 duBuffer,
1028 duDesc,
1029 dvBuffer,
1030 dvDesc,
1031 duuBuffer,
1032 duuDesc,
1033 duvBuffer,
1034 duvDesc,
1035 dvvBuffer,
1036 dvvDesc,
1037 numPatchCoords,
1038 patchCoords,
1039 patchTable);
1040 delete instance;
1041 return r;
1042 }
1043 return false;
1044 }
1045 }
1046
1071 template<typename SRC_BUFFER,
1072 typename DST_BUFFER,
1073 typename PATCHCOORD_BUFFER,
1074 typename PATCH_TABLE>
1075 bool EvalPatches(SRC_BUFFER *srcBuffer,
1076 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1077 DST_BUFFER *dstBuffer,
1078 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1079 int numPatchCoords,
1080 PATCHCOORD_BUFFER *patchCoords,
1081 PATCH_TABLE *patchTable) const
1082 {
1083
1084 return EvalPatches(srcBuffer->BindVBO(),
1085 srcDesc,
1086 dstBuffer->BindVBO(),
1087 dstDesc,
1088 0,
1089 OpenSubdiv::Osd::BufferDescriptor(),
1090 0,
1091 OpenSubdiv::Osd::BufferDescriptor(),
1092 numPatchCoords,
1093 patchCoords->BindVBO(),
1094 patchTable->GetPatchArrays(),
1095 patchTable->GetPatchIndexBuffer(),
1096 patchTable->GetPatchParamBuffer());
1097 }
1098
1133 template<typename SRC_BUFFER,
1134 typename DST_BUFFER,
1135 typename PATCHCOORD_BUFFER,
1136 typename PATCH_TABLE>
1137 bool EvalPatches(SRC_BUFFER *srcBuffer,
1138 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1139 DST_BUFFER *dstBuffer,
1140 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1141 DST_BUFFER *duBuffer,
1142 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
1143 DST_BUFFER *dvBuffer,
1144 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
1145 int numPatchCoords,
1146 PATCHCOORD_BUFFER *patchCoords,
1147 PATCH_TABLE *patchTable) const
1148 {
1149
1150 return EvalPatches(srcBuffer->BindVBO(),
1151 srcDesc,
1152 dstBuffer->BindVBO(),
1153 dstDesc,
1154 duBuffer->BindVBO(),
1155 duDesc,
1156 dvBuffer->BindVBO(),
1157 dvDesc,
1158 numPatchCoords,
1159 patchCoords->BindVBO(),
1160 patchTable->GetPatchArrays(),
1161 patchTable->GetPatchIndexBuffer(),
1162 patchTable->GetPatchParamBuffer());
1163 }
1164
1217 template<typename SRC_BUFFER,
1218 typename DST_BUFFER,
1219 typename PATCHCOORD_BUFFER,
1220 typename PATCH_TABLE>
1221 bool EvalPatches(SRC_BUFFER *srcBuffer,
1222 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1223 DST_BUFFER *dstBuffer,
1224 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1225 DST_BUFFER *duBuffer,
1226 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
1227 DST_BUFFER *dvBuffer,
1228 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
1229 DST_BUFFER *duuBuffer,
1230 OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
1231 DST_BUFFER *duvBuffer,
1232 OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
1233 DST_BUFFER *dvvBuffer,
1234 OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
1235 int numPatchCoords,
1236 PATCHCOORD_BUFFER *patchCoords,
1237 PATCH_TABLE *patchTable) const
1238 {
1239
1240 return EvalPatches(srcBuffer->BindVBO(),
1241 srcDesc,
1242 dstBuffer->BindVBO(),
1243 dstDesc,
1244 duBuffer->BindVBO(),
1245 duDesc,
1246 dvBuffer->BindVBO(),
1247 dvDesc,
1248 duuBuffer->BindVBO(),
1249 duuDesc,
1250 duvBuffer->BindVBO(),
1251 duvDesc,
1252 dvvBuffer->BindVBO(),
1253 dvvDesc,
1254 numPatchCoords,
1255 patchCoords->BindVBO(),
1256 patchTable->GetPatchArrays(),
1257 patchTable->GetPatchIndexBuffer(),
1258 patchTable->GetPatchParamBuffer());
1259 }
1260
1261 bool EvalPatches(GLuint srcBuffer,
1262 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1263 GLuint dstBuffer,
1264 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1265 GLuint duBuffer,
1266 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
1267 GLuint dvBuffer,
1268 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
1269 int numPatchCoords,
1270 GLuint patchCoordsBuffer,
1271 const OpenSubdiv::Osd::PatchArrayVector &patchArrays,
1272 GLuint patchIndexBuffer,
1273 GLuint patchParamsBuffer) const;
1274
1275 bool EvalPatches(GLuint srcBuffer,
1276 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1277 GLuint dstBuffer,
1278 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1279 GLuint duBuffer,
1280 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
1281 GLuint dvBuffer,
1282 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
1283 GLuint duuBuffer,
1284 OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
1285 GLuint duvBuffer,
1286 OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
1287 GLuint dvvBuffer,
1288 OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
1289 int numPatchCoords,
1290 GLuint patchCoordsBuffer,
1291 const OpenSubdiv::Osd::PatchArrayVector &patchArrays,
1292 GLuint patchIndexBuffer,
1293 GLuint patchParamsBuffer) const;
1294
1327 template<typename SRC_BUFFER,
1328 typename DST_BUFFER,
1329 typename PATCHCOORD_BUFFER,
1330 typename PATCH_TABLE>
1331 static bool EvalPatchesVarying(SRC_BUFFER *srcBuffer,
1332 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1333 DST_BUFFER *dstBuffer,
1334 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1335 int numPatchCoords,
1336 PATCHCOORD_BUFFER *patchCoords,
1337 PATCH_TABLE *patchTable,
1338 GLComputeEvaluator const *instance,
1339 void *deviceContext = NULL)
1340 {
1341
1342 if (instance) {
1343 return instance->EvalPatchesVarying(
1344 srcBuffer, srcDesc, dstBuffer, dstDesc, numPatchCoords, patchCoords, patchTable);
1345 }
1346 else {
1347 // Create an instance on demand (slow)
1348 (void)deviceContext; // unused
1349 instance = Create(srcDesc,
1350 dstDesc,
1351 OpenSubdiv::Osd::BufferDescriptor(),
1352 OpenSubdiv::Osd::BufferDescriptor());
1353 if (instance) {
1354 bool r = instance->EvalPatchesVarying(
1355 srcBuffer, srcDesc, dstBuffer, dstDesc, numPatchCoords, patchCoords, patchTable);
1356 delete instance;
1357 return r;
1358 }
1359 return false;
1360 }
1361 }
1362
1387 template<typename SRC_BUFFER,
1388 typename DST_BUFFER,
1389 typename PATCHCOORD_BUFFER,
1390 typename PATCH_TABLE>
1391 bool EvalPatchesVarying(SRC_BUFFER *srcBuffer,
1392 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1393 DST_BUFFER *dstBuffer,
1394 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1395 int numPatchCoords,
1396 PATCHCOORD_BUFFER *patchCoords,
1397 PATCH_TABLE *patchTable) const
1398 {
1399
1400 return EvalPatches(srcBuffer->BindVBO(),
1401 srcDesc,
1402 dstBuffer->BindVBO(),
1403 dstDesc,
1404 0,
1405 OpenSubdiv::Osd::BufferDescriptor(),
1406 0,
1407 OpenSubdiv::Osd::BufferDescriptor(),
1408 numPatchCoords,
1409 patchCoords->BindVBO(),
1410 patchTable->GetVaryingPatchArrays(),
1411 patchTable->GetVaryingPatchIndexBuffer(),
1412 patchTable->GetPatchParamBuffer());
1413 }
1414
1459 template<typename SRC_BUFFER,
1460 typename DST_BUFFER,
1461 typename PATCHCOORD_BUFFER,
1462 typename PATCH_TABLE>
1463 static bool EvalPatchesVarying(SRC_BUFFER *srcBuffer,
1464 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1465 DST_BUFFER *dstBuffer,
1466 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1467 DST_BUFFER *duBuffer,
1468 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
1469 DST_BUFFER *dvBuffer,
1470 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
1471 int numPatchCoords,
1472 PATCHCOORD_BUFFER *patchCoords,
1473 PATCH_TABLE *patchTable,
1474 GLComputeEvaluator const *instance,
1475 void *deviceContext = NULL)
1476 {
1477
1478 if (instance) {
1479 return instance->EvalPatchesVarying(srcBuffer,
1480 srcDesc,
1481 dstBuffer,
1482 dstDesc,
1483 duBuffer,
1484 duDesc,
1485 dvBuffer,
1486 dvDesc,
1487 numPatchCoords,
1488 patchCoords,
1489 patchTable);
1490 }
1491 else {
1492 // Create an instance on demand (slow)
1493 (void)deviceContext; // unused
1494 instance = Create(srcDesc, dstDesc, duDesc, dvDesc);
1495 if (instance) {
1496 bool r = instance->EvalPatchesVarying(srcBuffer,
1497 srcDesc,
1498 dstBuffer,
1499 dstDesc,
1500 duBuffer,
1501 duDesc,
1502 dvBuffer,
1503 dvDesc,
1504 numPatchCoords,
1505 patchCoords,
1506 patchTable);
1507 delete instance;
1508 return r;
1509 }
1510 return false;
1511 }
1512 }
1513
1550 template<typename SRC_BUFFER,
1551 typename DST_BUFFER,
1552 typename PATCHCOORD_BUFFER,
1553 typename PATCH_TABLE>
1554 bool EvalPatchesVarying(SRC_BUFFER *srcBuffer,
1555 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1556 DST_BUFFER *dstBuffer,
1557 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1558 DST_BUFFER *duBuffer,
1559 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
1560 DST_BUFFER *dvBuffer,
1561 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
1562 int numPatchCoords,
1563 PATCHCOORD_BUFFER *patchCoords,
1564 PATCH_TABLE *patchTable) const
1565 {
1566
1567 return EvalPatches(srcBuffer->BindVBO(),
1568 srcDesc,
1569 dstBuffer->BindVBO(),
1570 dstDesc,
1571 duBuffer->BindVBO(),
1572 duDesc,
1573 dvBuffer->BindVBO(),
1574 dvDesc,
1575 numPatchCoords,
1576 patchCoords->BindVBO(),
1577 patchTable->GetVaryingPatchArrays(),
1578 patchTable->GetVaryingPatchIndexBuffer(),
1579 patchTable->GetPatchParamBuffer());
1580 }
1581
1644 template<typename SRC_BUFFER,
1645 typename DST_BUFFER,
1646 typename PATCHCOORD_BUFFER,
1647 typename PATCH_TABLE>
1648 static bool EvalPatchesVarying(SRC_BUFFER *srcBuffer,
1649 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1650 DST_BUFFER *dstBuffer,
1651 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1652 DST_BUFFER *duBuffer,
1653 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
1654 DST_BUFFER *dvBuffer,
1655 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
1656 DST_BUFFER *duuBuffer,
1657 OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
1658 DST_BUFFER *duvBuffer,
1659 OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
1660 DST_BUFFER *dvvBuffer,
1661 OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
1662 int numPatchCoords,
1663 PATCHCOORD_BUFFER *patchCoords,
1664 PATCH_TABLE *patchTable,
1665 GLComputeEvaluator const *instance,
1666 void *deviceContext = NULL)
1667 {
1668
1669 if (instance) {
1670 return instance->EvalPatchesVarying(srcBuffer,
1671 srcDesc,
1672 dstBuffer,
1673 dstDesc,
1674 duBuffer,
1675 duDesc,
1676 dvBuffer,
1677 dvDesc,
1678 duuBuffer,
1679 duuDesc,
1680 duvBuffer,
1681 duvDesc,
1682 dvvBuffer,
1683 dvvDesc,
1684 numPatchCoords,
1685 patchCoords,
1686 patchTable);
1687 }
1688 else {
1689 // Create an instance on demand (slow)
1690 (void)deviceContext; // unused
1691 instance = Create(srcDesc, dstDesc, duDesc, dvDesc, duuDesc, duvDesc, dvvDesc);
1692 if (instance) {
1693 bool r = instance->EvalPatchesVarying(srcBuffer,
1694 srcDesc,
1695 dstBuffer,
1696 dstDesc,
1697 duBuffer,
1698 duDesc,
1699 dvBuffer,
1700 dvDesc,
1701 duuBuffer,
1702 duuDesc,
1703 duvBuffer,
1704 duvDesc,
1705 dvvBuffer,
1706 dvvDesc,
1707 numPatchCoords,
1708 patchCoords,
1709 patchTable);
1710 delete instance;
1711 return r;
1712 }
1713 return false;
1714 }
1715 }
1716
1771 template<typename SRC_BUFFER,
1772 typename DST_BUFFER,
1773 typename PATCHCOORD_BUFFER,
1774 typename PATCH_TABLE>
1775 bool EvalPatchesVarying(SRC_BUFFER *srcBuffer,
1776 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1777 DST_BUFFER *dstBuffer,
1778 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1779 DST_BUFFER *duBuffer,
1780 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
1781 DST_BUFFER *dvBuffer,
1782 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
1783 DST_BUFFER *duuBuffer,
1784 OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
1785 DST_BUFFER *duvBuffer,
1786 OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
1787 DST_BUFFER *dvvBuffer,
1788 OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
1789 int numPatchCoords,
1790 PATCHCOORD_BUFFER *patchCoords,
1791 PATCH_TABLE *patchTable) const
1792 {
1793
1794 return EvalPatches(srcBuffer->BindVBO(),
1795 srcDesc,
1796 dstBuffer->BindVBO(),
1797 dstDesc,
1798 duBuffer->BindVBO(),
1799 duDesc,
1800 dvBuffer->BindVBO(),
1801 dvDesc,
1802 duuBuffer->BindVBO(),
1803 duuDesc,
1804 duvBuffer->BindVBO(),
1805 duvDesc,
1806 dvvBuffer->BindVBO(),
1807 dvvDesc,
1808 numPatchCoords,
1809 patchCoords->BindVBO(),
1810 patchTable->GetVaryingPatchArrays(),
1811 patchTable->GetVaryingPatchIndexBuffer(),
1812 patchTable->GetPatchParamBuffer());
1813 }
1814
1849 template<typename SRC_BUFFER,
1850 typename DST_BUFFER,
1851 typename PATCHCOORD_BUFFER,
1852 typename PATCH_TABLE>
1853 static bool EvalPatchesFaceVarying(SRC_BUFFER *srcBuffer,
1854 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1855 DST_BUFFER *dstBuffer,
1856 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1857 int numPatchCoords,
1858 PATCHCOORD_BUFFER *patchCoords,
1859 PATCH_TABLE *patchTable,
1860 int fvarChannel,
1861 GLComputeEvaluator const *instance,
1862 void *deviceContext = NULL)
1863 {
1864
1865 if (instance) {
1866 return instance->EvalPatchesFaceVarying(srcBuffer,
1867 srcDesc,
1868 dstBuffer,
1869 dstDesc,
1870 numPatchCoords,
1871 patchCoords,
1872 patchTable,
1873 fvarChannel);
1874 }
1875 else {
1876 // Create an instance on demand (slow)
1877 (void)deviceContext; // unused
1878 instance = Create(srcDesc,
1879 dstDesc,
1880 OpenSubdiv::Osd::BufferDescriptor(),
1881 OpenSubdiv::Osd::BufferDescriptor());
1882 if (instance) {
1883 bool r = instance->EvalPatchesFaceVarying(srcBuffer,
1884 srcDesc,
1885 dstBuffer,
1886 dstDesc,
1887 numPatchCoords,
1888 patchCoords,
1889 patchTable,
1890 fvarChannel);
1891 delete instance;
1892 return r;
1893 }
1894 return false;
1895 }
1896 }
1897
1924 template<typename SRC_BUFFER,
1925 typename DST_BUFFER,
1926 typename PATCHCOORD_BUFFER,
1927 typename PATCH_TABLE>
1928 bool EvalPatchesFaceVarying(SRC_BUFFER *srcBuffer,
1929 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1930 DST_BUFFER *dstBuffer,
1931 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1932 int numPatchCoords,
1933 PATCHCOORD_BUFFER *patchCoords,
1934 PATCH_TABLE *patchTable,
1935 int fvarChannel = 0) const
1936 {
1937
1938 return EvalPatches(srcBuffer->BindVBO(),
1939 srcDesc,
1940 dstBuffer->BindVBO(),
1941 dstDesc,
1942 0,
1943 OpenSubdiv::Osd::BufferDescriptor(),
1944 0,
1945 OpenSubdiv::Osd::BufferDescriptor(),
1946 numPatchCoords,
1947 patchCoords->BindVBO(),
1948 patchTable->GetFVarPatchArrays(fvarChannel),
1949 patchTable->GetFVarPatchIndexBuffer(fvarChannel),
1950 patchTable->GetFVarPatchParamBuffer(fvarChannel));
1951 }
1952
1999 template<typename SRC_BUFFER,
2000 typename DST_BUFFER,
2001 typename PATCHCOORD_BUFFER,
2002 typename PATCH_TABLE>
2003 static bool EvalPatchesFaceVarying(SRC_BUFFER *srcBuffer,
2004 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
2005 DST_BUFFER *dstBuffer,
2006 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
2007 DST_BUFFER *duBuffer,
2008 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
2009 DST_BUFFER *dvBuffer,
2010 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
2011 int numPatchCoords,
2012 PATCHCOORD_BUFFER *patchCoords,
2013 PATCH_TABLE *patchTable,
2014 int fvarChannel,
2015 GLComputeEvaluator const *instance,
2016 void *deviceContext = NULL)
2017 {
2018
2019 if (instance) {
2020 return instance->EvalPatchesFaceVarying(srcBuffer,
2021 srcDesc,
2022 dstBuffer,
2023 dstDesc,
2024 duBuffer,
2025 duDesc,
2026 dvBuffer,
2027 dvDesc,
2028 numPatchCoords,
2029 patchCoords,
2030 patchTable,
2031 fvarChannel);
2032 }
2033 else {
2034 // Create an instance on demand (slow)
2035 (void)deviceContext; // unused
2036 instance = Create(srcDesc, dstDesc, duDesc, dvDesc);
2037 if (instance) {
2038 bool r = instance->EvalPatchesFaceVarying(srcBuffer,
2039 srcDesc,
2040 dstBuffer,
2041 dstDesc,
2042 duBuffer,
2043 duDesc,
2044 dvBuffer,
2045 dvDesc,
2046 numPatchCoords,
2047 patchCoords,
2048 patchTable,
2049 fvarChannel);
2050 delete instance;
2051 return r;
2052 }
2053 return false;
2054 }
2055 }
2056
2095 template<typename SRC_BUFFER,
2096 typename DST_BUFFER,
2097 typename PATCHCOORD_BUFFER,
2098 typename PATCH_TABLE>
2099 bool EvalPatchesFaceVarying(SRC_BUFFER *srcBuffer,
2100 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
2101 DST_BUFFER *dstBuffer,
2102 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
2103 DST_BUFFER *duBuffer,
2104 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
2105 DST_BUFFER *dvBuffer,
2106 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
2107 int numPatchCoords,
2108 PATCHCOORD_BUFFER *patchCoords,
2109 PATCH_TABLE *patchTable,
2110 int fvarChannel = 0) const
2111 {
2112
2113 return EvalPatches(srcBuffer->BindVBO(),
2114 srcDesc,
2115 dstBuffer->BindVBO(),
2116 dstDesc,
2117 duBuffer->BindVBO(),
2118 duDesc,
2119 dvBuffer->BindVBO(),
2120 dvDesc,
2121 numPatchCoords,
2122 patchCoords->BindVBO(),
2123 patchTable->GetFVarPatchArrays(fvarChannel),
2124 patchTable->GetFVarPatchIndexBuffer(fvarChannel),
2125 patchTable->GetFVarPatchParamBuffer(fvarChannel));
2126 }
2127
2192 template<typename SRC_BUFFER,
2193 typename DST_BUFFER,
2194 typename PATCHCOORD_BUFFER,
2195 typename PATCH_TABLE>
2196 static bool EvalPatchesFaceVarying(SRC_BUFFER *srcBuffer,
2197 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
2198 DST_BUFFER *dstBuffer,
2199 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
2200 DST_BUFFER *duBuffer,
2201 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
2202 DST_BUFFER *dvBuffer,
2203 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
2204 DST_BUFFER *duuBuffer,
2205 OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
2206 DST_BUFFER *duvBuffer,
2207 OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
2208 DST_BUFFER *dvvBuffer,
2209 OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
2210 int numPatchCoords,
2211 PATCHCOORD_BUFFER *patchCoords,
2212 PATCH_TABLE *patchTable,
2213 int fvarChannel,
2214 GLComputeEvaluator const *instance,
2215 void *deviceContext = NULL)
2216 {
2217
2218 if (instance) {
2219 return instance->EvalPatchesFaceVarying(srcBuffer,
2220 srcDesc,
2221 dstBuffer,
2222 dstDesc,
2223 duBuffer,
2224 duDesc,
2225 dvBuffer,
2226 dvDesc,
2227 duuBuffer,
2228 duuDesc,
2229 duvBuffer,
2230 duvDesc,
2231 dvvBuffer,
2232 dvvDesc,
2233 numPatchCoords,
2234 patchCoords,
2235 patchTable,
2236 fvarChannel);
2237 }
2238 else {
2239 // Create an instance on demand (slow)
2240 (void)deviceContext; // unused
2241 instance = Create(srcDesc, dstDesc, duDesc, dvDesc, duuDesc, duvDesc, dvvDesc);
2242 if (instance) {
2243 bool r = instance->EvalPatchesFaceVarying(srcBuffer,
2244 srcDesc,
2245 dstBuffer,
2246 dstDesc,
2247 duBuffer,
2248 duDesc,
2249 dvBuffer,
2250 dvDesc,
2251 duuBuffer,
2252 duuDesc,
2253 duvBuffer,
2254 duvDesc,
2255 dvvBuffer,
2256 dvvDesc,
2257 numPatchCoords,
2258 patchCoords,
2259 patchTable,
2260 fvarChannel);
2261 delete instance;
2262 return r;
2263 }
2264 return false;
2265 }
2266 }
2267
2324 template<typename SRC_BUFFER,
2325 typename DST_BUFFER,
2326 typename PATCHCOORD_BUFFER,
2327 typename PATCH_TABLE>
2328 bool EvalPatchesFaceVarying(SRC_BUFFER *srcBuffer,
2329 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
2330 DST_BUFFER *dstBuffer,
2331 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
2332 DST_BUFFER *duBuffer,
2333 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
2334 DST_BUFFER *dvBuffer,
2335 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
2336 DST_BUFFER *duuBuffer,
2337 OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
2338 DST_BUFFER *duvBuffer,
2339 OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
2340 DST_BUFFER *dvvBuffer,
2341 OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
2342 int numPatchCoords,
2343 PATCHCOORD_BUFFER *patchCoords,
2344 PATCH_TABLE *patchTable,
2345 int fvarChannel = 0) const
2346 {
2347
2348 return EvalPatches(srcBuffer->BindVBO(),
2349 srcDesc,
2350 dstBuffer->BindVBO(),
2351 dstDesc,
2352 duBuffer->BindVBO(),
2353 duDesc,
2354 dvBuffer->BindVBO(),
2355 dvDesc,
2356 duuBuffer->BindVBO(),
2357 duuDesc,
2358 duvBuffer->BindVBO(),
2359 duvDesc,
2360 dvvBuffer->BindVBO(),
2361 dvvDesc,
2362 numPatchCoords,
2363 patchCoords->BindVBO(),
2364 patchTable->GetFVarPatchArrays(fvarChannel),
2365 patchTable->GetFVarPatchIndexBuffer(fvarChannel),
2366 patchTable->GetFVarPatchParamBuffer(fvarChannel));
2367 }
2368
2374
2377 bool Compile(
2378 OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
2379 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
2380 OpenSubdiv::Osd::BufferDescriptor const &duDesc = OpenSubdiv::Osd::BufferDescriptor(),
2381 OpenSubdiv::Osd::BufferDescriptor const &dvDesc = OpenSubdiv::Osd::BufferDescriptor(),
2382 OpenSubdiv::Osd::BufferDescriptor const &duuDesc = OpenSubdiv::Osd::BufferDescriptor(),
2383 OpenSubdiv::Osd::BufferDescriptor const &duvDesc = OpenSubdiv::Osd::BufferDescriptor(),
2384 OpenSubdiv::Osd::BufferDescriptor const &dvvDesc = OpenSubdiv::Osd::BufferDescriptor());
2385
2387 static void Synchronize(void *deviceContext);
2388
2389 private:
2390 struct _StencilKernel {
2391 _StencilKernel();
2392 ~_StencilKernel();
2393 bool Compile(OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
2394 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
2395 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
2396 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
2397 OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
2398 OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
2399 OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
2400 int workGroupSize);
2401 GLuint program;
2402 GLuint uniformStart;
2403 GLuint uniformEnd;
2404 GLuint uniformSrcOffset;
2405 GLuint uniformDstOffset;
2406 GLuint uniformDuDesc;
2407 GLuint uniformDvDesc;
2408 GLuint uniformDuuDesc;
2409 GLuint uniformDuvDesc;
2410 GLuint uniformDvvDesc;
2411 } _stencilKernel;
2412
2413 struct _PatchKernel {
2414 _PatchKernel();
2415 ~_PatchKernel();
2416 bool Compile(OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
2417 OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
2418 OpenSubdiv::Osd::BufferDescriptor const &duDesc,
2419 OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
2420 OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
2421 OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
2422 OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
2423 int workGroupSize);
2424 GLuint program;
2425 GLuint uniformSrcOffset;
2426 GLuint uniformDstOffset;
2427 GLuint uniformPatchArray;
2428 GLuint uniformDuDesc;
2429 GLuint uniformDvDesc;
2430 GLuint uniformDuuDesc;
2431 GLuint uniformDuvDesc;
2432 GLuint uniformDvvDesc;
2433 } _patchKernel;
2434
2435 int _workGroupSize;
2436 GLuint _patchArraysSSBO;
2437
2438 int GetDispatchSize(int count) const;
2439
2440 void DispatchCompute(int totalDispatchSize) const;
2441};
2442
2443} // namespace blender::opensubdiv
2444
2445#endif // OPENSUBDIV_GL_COMPUTE_EVALUATOR_H_
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object instance
bool EvalPatchesVarying(SRC_BUFFER *srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, OpenSubdiv::Osd::BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvDesc, 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, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, OpenSubdiv::Osd::BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvDesc, DST_BUFFER *duuBuffer, OpenSubdiv::Osd::BufferDescriptor const &duuDesc, DST_BUFFER *duvBuffer, OpenSubdiv::Osd::BufferDescriptor const &duvDesc, DST_BUFFER *dvvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvvDesc, 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 ...
static bool EvalPatchesFaceVarying(SRC_BUFFER *srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, OpenSubdiv::Osd::BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvDesc, DST_BUFFER *duuBuffer, OpenSubdiv::Osd::BufferDescriptor const &duuDesc, DST_BUFFER *duvBuffer, OpenSubdiv::Osd::BufferDescriptor const &duvDesc, DST_BUFFER *dvvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvvDesc, 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 ...
bool EvalPatchesFaceVarying(SRC_BUFFER *srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, OpenSubdiv::Osd::BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvDesc, 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 ...
static bool EvalPatchesVarying(SRC_BUFFER *srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, OpenSubdiv::Osd::BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvDesc, DST_BUFFER *duuBuffer, OpenSubdiv::Osd::BufferDescriptor const &duuDesc, DST_BUFFER *duvBuffer, OpenSubdiv::Osd::BufferDescriptor const &duvDesc, DST_BUFFER *dvvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvvDesc, 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 ...
static bool EvalPatchesVarying(SRC_BUFFER *srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, OpenSubdiv::Osd::BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, OpenSubdiv::Osd::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 ...
static GLComputeEvaluator * Create(OpenSubdiv::Osd::BufferDescriptor const &srcDesc, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, OpenSubdiv::Osd::BufferDescriptor const &duDesc, OpenSubdiv::Osd::BufferDescriptor const &dvDesc, void *deviceContext=NULL)
bool EvalPatches(GLuint srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, GLuint dstBuffer, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, GLuint duBuffer, OpenSubdiv::Osd::BufferDescriptor const &duDesc, GLuint dvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvDesc, GLuint duuBuffer, OpenSubdiv::Osd::BufferDescriptor const &duuDesc, GLuint duvBuffer, OpenSubdiv::Osd::BufferDescriptor const &duvDesc, GLuint dvvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvvDesc, int numPatchCoords, GLuint patchCoordsBuffer, const OpenSubdiv::Osd::PatchArrayVector &patchArrays, GLuint patchIndexBuffer, GLuint patchParamsBuffer) const
bool EvalPatches(SRC_BUFFER *srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::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 Compile(OpenSubdiv::Osd::BufferDescriptor const &srcDesc, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, OpenSubdiv::Osd::BufferDescriptor const &duDesc=OpenSubdiv::Osd::BufferDescriptor(), OpenSubdiv::Osd::BufferDescriptor const &dvDesc=OpenSubdiv::Osd::BufferDescriptor(), OpenSubdiv::Osd::BufferDescriptor const &duuDesc=OpenSubdiv::Osd::BufferDescriptor(), OpenSubdiv::Osd::BufferDescriptor const &duvDesc=OpenSubdiv::Osd::BufferDescriptor(), OpenSubdiv::Osd::BufferDescriptor const &dvvDesc=OpenSubdiv::Osd::BufferDescriptor())
static bool EvalPatchesVarying(SRC_BUFFER *srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::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 ...
static bool EvalStencils(SRC_BUFFER *srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, OpenSubdiv::Osd::BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvDesc, DST_BUFFER *duuBuffer, OpenSubdiv::Osd::BufferDescriptor const &duuDesc, DST_BUFFER *duvBuffer, OpenSubdiv::Osd::BufferDescriptor const &duvDesc, DST_BUFFER *dvvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvvDesc, STENCIL_TABLE const *stencilTable, GLComputeEvaluator const *instance, void *deviceContext=NULL)
Generic static stencil function. This function has a same signature as other device kernels have so t...
bool EvalPatches(GLuint srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, GLuint dstBuffer, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, GLuint duBuffer, OpenSubdiv::Osd::BufferDescriptor const &duDesc, GLuint dvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvDesc, int numPatchCoords, GLuint patchCoordsBuffer, const OpenSubdiv::Osd::PatchArrayVector &patchArrays, GLuint patchIndexBuffer, GLuint patchParamsBuffer) const
bool EvalStencils(GLuint srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, GLuint dstBuffer, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, GLuint duBuffer, OpenSubdiv::Osd::BufferDescriptor const &duDesc, GLuint dvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvDesc, GLuint sizesBuffer, GLuint offsetsBuffer, GLuint indicesBuffer, GLuint weightsBuffer, GLuint duWeightsBuffer, GLuint dvWeightsBuffer, int start, int end) const
Dispatch the GLSL compute kernel on GPU asynchronously returns false if the kernel hasn't been compil...
bool EvalStencils(SRC_BUFFER *srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, OpenSubdiv::Osd::BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvDesc, STENCIL_TABLE const *stencilTable) const
Generic stencil function.
static bool EvalPatches(SRC_BUFFER *srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::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 ...
static bool EvalPatches(SRC_BUFFER *srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, OpenSubdiv::Osd::BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, OpenSubdiv::Osd::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 ...
static bool EvalStencils(SRC_BUFFER *srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, STENCIL_TABLE const *stencilTable, GLComputeEvaluator const *instance, void *deviceContext=NULL)
Generic static stencil function. This function has a same signature as other device kernels have so t...
bool EvalStencils(SRC_BUFFER *srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, OpenSubdiv::Osd::BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvDesc, DST_BUFFER *duuBuffer, OpenSubdiv::Osd::BufferDescriptor const &duuDesc, DST_BUFFER *duvBuffer, OpenSubdiv::Osd::BufferDescriptor const &duvDesc, DST_BUFFER *dvvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvvDesc, STENCIL_TABLE const *stencilTable) const
Generic stencil function.
static bool EvalStencils(SRC_BUFFER *srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, OpenSubdiv::Osd::BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvDesc, STENCIL_TABLE const *stencilTable, GLComputeEvaluator const *instance, void *deviceContext=NULL)
Generic static stencil function. This function has a same signature as other device kernels have so t...
bool EvalStencils(SRC_BUFFER *srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, STENCIL_TABLE const *stencilTable) const
Generic stencil function.
static GLComputeEvaluator * Create(OpenSubdiv::Osd::BufferDescriptor const &srcDesc, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, OpenSubdiv::Osd::BufferDescriptor const &duDesc, OpenSubdiv::Osd::BufferDescriptor const &dvDesc, OpenSubdiv::Osd::BufferDescriptor const &duuDesc, OpenSubdiv::Osd::BufferDescriptor const &duvDesc, OpenSubdiv::Osd::BufferDescriptor const &dvvDesc, void *deviceContext=NULL)
bool EvalPatches(SRC_BUFFER *srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, OpenSubdiv::Osd::BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvDesc, DST_BUFFER *duuBuffer, OpenSubdiv::Osd::BufferDescriptor const &duuDesc, DST_BUFFER *duvBuffer, OpenSubdiv::Osd::BufferDescriptor const &duvDesc, DST_BUFFER *dvvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvvDesc, 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...
static void Synchronize(void *deviceContext)
Wait the dispatched kernel finishes.
static bool EvalPatches(SRC_BUFFER *srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, OpenSubdiv::Osd::BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvDesc, DST_BUFFER *duuBuffer, OpenSubdiv::Osd::BufferDescriptor const &duuDesc, DST_BUFFER *duvBuffer, OpenSubdiv::Osd::BufferDescriptor const &duvDesc, DST_BUFFER *dvvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvvDesc, 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 ...
bool EvalPatchesVarying(SRC_BUFFER *srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, OpenSubdiv::Osd::BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvDesc, DST_BUFFER *duuBuffer, OpenSubdiv::Osd::BufferDescriptor const &duuDesc, DST_BUFFER *duvBuffer, OpenSubdiv::Osd::BufferDescriptor const &duvDesc, DST_BUFFER *dvvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvvDesc, 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 EvalStencils(GLuint srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, GLuint dstBuffer, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, GLuint duBuffer, OpenSubdiv::Osd::BufferDescriptor const &duDesc, GLuint dvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvDesc, GLuint duuBuffer, OpenSubdiv::Osd::BufferDescriptor const &duuDesc, GLuint duvBuffer, OpenSubdiv::Osd::BufferDescriptor const &duvDesc, GLuint dvvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvvDesc, GLuint sizesBuffer, GLuint offsetsBuffer, GLuint indicesBuffer, GLuint weightsBuffer, GLuint duWeightsBuffer, GLuint dvWeightsBuffer, GLuint duuWeightsBuffer, GLuint duvWeightsBuffer, GLuint dvvWeightsBuffer, int start, int end) const
Dispatch the GLSL compute kernel on GPU asynchronously returns false if the kernel hasn't been compil...
static bool EvalPatchesFaceVarying(SRC_BUFFER *srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::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 ...
static bool EvalPatchesFaceVarying(SRC_BUFFER *srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, OpenSubdiv::Osd::BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, OpenSubdiv::Osd::BufferDescriptor const &dvDesc, 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 ...
~GLComputeEvaluator()
Destructor. note that the GL context must be made current.
bool EvalPatches(SRC_BUFFER *srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, OpenSubdiv::Osd::BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, OpenSubdiv::Osd::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...
bool EvalPatchesVarying(SRC_BUFFER *srcBuffer, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::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, OpenSubdiv::Osd::BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, OpenSubdiv::Osd::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 ...
GL stencil table (Shader Storage buffer)
GLStencilTableSSBO(OpenSubdiv::Far::LimitStencilTable const *limitStencilTable)
static GLStencilTableSSBO * Create(OpenSubdiv::Far::StencilTable const *stencilTable, void *deviceContext=NULL)
static GLStencilTableSSBO * Create(OpenSubdiv::Far::LimitStencilTable const *limitStencilTable, void *deviceContext=NULL)
GLStencilTableSSBO(OpenSubdiv::Far::StencilTable const *stencilTable)
#define NULL
int count