Blender  V3.3
gl_compute_evaluator.h
Go to the documentation of this file.
1 //
2 // Copyright 2015 Pixar
3 //
4 // Licensed under the Apache License, Version 2.0 (the "Apache License")
5 // with the following modification; you may not use this file except in
6 // compliance with the Apache License and the following modification to it:
7 // Section 6. Trademarks. is deleted and replaced with:
8 //
9 // 6. Trademarks. This License does not grant permission to use the trade
10 // names, trademarks, service marks, or product names of the Licensor
11 // and its affiliates, except as required to comply with Section 4(c) of
12 // the License and to reproduce the content of the NOTICE file.
13 //
14 // You may obtain a copy of the Apache License at
15 //
16 // http://www.apache.org/licenses/LICENSE-2.0
17 //
18 // Unless required by applicable law or agreed to in writing, software
19 // distributed under the Apache License with the above modification is
20 // distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
21 // KIND, either express or implied. See the Apache License for the specific
22 // language governing permissions and limitations under the Apache License.
23 //
24 
25 #ifndef OPENSUBDIV_GL_COMPUTE_EVALUATOR_H_
26 #define OPENSUBDIV_GL_COMPUTE_EVALUATOR_H_
27 
28 #include <opensubdiv/osd/bufferDescriptor.h>
29 #include <opensubdiv/osd/opengl.h>
30 #include <opensubdiv/osd/types.h>
31 #include <opensubdiv/version.h>
32 
33 namespace OpenSubdiv {
34 namespace OPENSUBDIV_VERSION {
35 namespace Far {
36 class LimitStencilTable;
37 class StencilTable;
38 } // namespace Far
39 } // namespace OPENSUBDIV_VERSION
40 } // namespace OpenSubdiv
41 
42 namespace blender {
43 namespace opensubdiv {
44 
52  public:
53  static GLStencilTableSSBO *Create(OpenSubdiv::Far::StencilTable const *stencilTable,
54  void *deviceContext = NULL)
55  {
56  (void)deviceContext; // unused
57  return new GLStencilTableSSBO(stencilTable);
58  }
59  static GLStencilTableSSBO *Create(OpenSubdiv::Far::LimitStencilTable const *limitStencilTable,
60  void *deviceContext = NULL)
61  {
62  (void)deviceContext; // unused
63  return new GLStencilTableSSBO(limitStencilTable);
64  }
65 
66  explicit GLStencilTableSSBO(OpenSubdiv::Far::StencilTable const *stencilTable);
67  explicit GLStencilTableSSBO(OpenSubdiv::Far::LimitStencilTable const *limitStencilTable);
69 
70  // interfaces needed for GLSLComputeKernel
71  GLuint GetSizesBuffer() const
72  {
73  return _sizes;
74  }
75  GLuint GetOffsetsBuffer() const
76  {
77  return _offsets;
78  }
79  GLuint GetIndicesBuffer() const
80  {
81  return _indices;
82  }
83  GLuint GetWeightsBuffer() const
84  {
85  return _weights;
86  }
87  GLuint GetDuWeightsBuffer() const
88  {
89  return _duWeights;
90  }
91  GLuint GetDvWeightsBuffer() const
92  {
93  return _dvWeights;
94  }
95  GLuint GetDuuWeightsBuffer() const
96  {
97  return _duuWeights;
98  }
99  GLuint GetDuvWeightsBuffer() const
100  {
101  return _duvWeights;
102  }
103  GLuint GetDvvWeightsBuffer() const
104  {
105  return _dvvWeights;
106  }
107  int GetNumStencils() const
108  {
109  return _numStencils;
110  }
111 
112  private:
113  GLuint _sizes;
114  GLuint _offsets;
115  GLuint _indices;
116  GLuint _weights;
117  GLuint _duWeights;
118  GLuint _dvWeights;
119  GLuint _duuWeights;
120  GLuint _duvWeights;
121  GLuint _dvvWeights;
122  int _numStencils;
123 };
124 
125 // ---------------------------------------------------------------------------
126 
128  public:
129  typedef bool Instantiatable;
130  static GLComputeEvaluator *Create(OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
131  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
132  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
133  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
134  void *deviceContext = NULL)
135  {
136  return Create(srcDesc,
137  dstDesc,
138  duDesc,
139  dvDesc,
140  OpenSubdiv::Osd::BufferDescriptor(),
141  OpenSubdiv::Osd::BufferDescriptor(),
142  OpenSubdiv::Osd::BufferDescriptor(),
143  deviceContext);
144  }
145 
146  static GLComputeEvaluator *Create(OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
147  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
148  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
149  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
150  OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
151  OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
152  OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
153  void *deviceContext = NULL)
154  {
155  (void)deviceContext; // not used
157  if (instance->Compile(srcDesc, dstDesc, duDesc, dvDesc, duuDesc, duvDesc, dvvDesc))
158  return instance;
159  delete instance;
160  return NULL;
161  }
162 
165 
168 
174 
202  template<typename SRC_BUFFER, typename DST_BUFFER, typename STENCIL_TABLE>
203  static bool EvalStencils(SRC_BUFFER *srcBuffer,
204  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
205  DST_BUFFER *dstBuffer,
206  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
207  STENCIL_TABLE const *stencilTable,
209  void *deviceContext = NULL)
210  {
211 
212  if (instance) {
213  return instance->EvalStencils(srcBuffer, srcDesc, dstBuffer, dstDesc, stencilTable);
214  }
215  else {
216  // Create an instance on demand (slow)
217  (void)deviceContext; // unused
218  instance = Create(srcDesc,
219  dstDesc,
220  OpenSubdiv::Osd::BufferDescriptor(),
221  OpenSubdiv::Osd::BufferDescriptor());
222  if (instance) {
223  bool r = instance->EvalStencils(srcBuffer, srcDesc, dstBuffer, dstDesc, stencilTable);
224  delete instance;
225  return r;
226  }
227  return false;
228  }
229  }
230 
270  template<typename SRC_BUFFER, typename DST_BUFFER, typename STENCIL_TABLE>
271  static bool EvalStencils(SRC_BUFFER *srcBuffer,
272  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
273  DST_BUFFER *dstBuffer,
274  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
275  DST_BUFFER *duBuffer,
276  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
277  DST_BUFFER *dvBuffer,
278  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
279  STENCIL_TABLE const *stencilTable,
281  void *deviceContext = NULL)
282  {
283 
284  if (instance) {
285  return instance->EvalStencils(srcBuffer,
286  srcDesc,
287  dstBuffer,
288  dstDesc,
289  duBuffer,
290  duDesc,
291  dvBuffer,
292  dvDesc,
293  stencilTable);
294  }
295  else {
296  // Create an instance on demand (slow)
297  (void)deviceContext; // unused
298  instance = Create(srcDesc, dstDesc, duDesc, dvDesc);
299  if (instance) {
300  bool r = instance->EvalStencils(srcBuffer,
301  srcDesc,
302  dstBuffer,
303  dstDesc,
304  duBuffer,
305  duDesc,
306  dvBuffer,
307  dvDesc,
308  stencilTable);
309  delete instance;
310  return r;
311  }
312  return false;
313  }
314  }
315 
373  template<typename SRC_BUFFER, typename DST_BUFFER, typename STENCIL_TABLE>
374  static bool EvalStencils(SRC_BUFFER *srcBuffer,
375  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
376  DST_BUFFER *dstBuffer,
377  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
378  DST_BUFFER *duBuffer,
379  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
380  DST_BUFFER *dvBuffer,
381  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
382  DST_BUFFER *duuBuffer,
383  OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
384  DST_BUFFER *duvBuffer,
385  OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
386  DST_BUFFER *dvvBuffer,
387  OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
388  STENCIL_TABLE const *stencilTable,
390  void *deviceContext = NULL)
391  {
392 
393  if (instance) {
394  return instance->EvalStencils(srcBuffer,
395  srcDesc,
396  dstBuffer,
397  dstDesc,
398  duBuffer,
399  duDesc,
400  dvBuffer,
401  dvDesc,
402  duuBuffer,
403  duuDesc,
404  duvBuffer,
405  duvDesc,
406  dvvBuffer,
407  dvvDesc,
408  stencilTable);
409  }
410  else {
411  // Create an instance on demand (slow)
412  (void)deviceContext; // unused
413  instance = Create(srcDesc, dstDesc, duDesc, dvDesc, duuDesc, duvDesc, dvvDesc);
414  if (instance) {
415  bool r = instance->EvalStencils(srcBuffer,
416  srcDesc,
417  dstBuffer,
418  dstDesc,
419  duBuffer,
420  duDesc,
421  dvBuffer,
422  dvDesc,
423  duuBuffer,
424  duuDesc,
425  duvBuffer,
426  duvDesc,
427  dvvBuffer,
428  dvvDesc,
429  stencilTable);
430  delete instance;
431  return r;
432  }
433  return false;
434  }
435  }
436 
454  template<typename SRC_BUFFER, typename DST_BUFFER, typename STENCIL_TABLE>
455  bool EvalStencils(SRC_BUFFER *srcBuffer,
456  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
457  DST_BUFFER *dstBuffer,
458  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
459  STENCIL_TABLE const *stencilTable) const
460  {
461  return EvalStencils(srcBuffer->BindVBO(),
462  srcDesc,
463  dstBuffer->BindVBO(),
464  dstDesc,
465  0,
466  OpenSubdiv::Osd::BufferDescriptor(),
467  0,
468  OpenSubdiv::Osd::BufferDescriptor(),
469  stencilTable->GetSizesBuffer(),
470  stencilTable->GetOffsetsBuffer(),
471  stencilTable->GetIndicesBuffer(),
472  stencilTable->GetWeightsBuffer(),
473  0,
474  0,
475  /* start = */ 0,
476  /* end = */ stencilTable->GetNumStencils());
477  }
478 
508  template<typename SRC_BUFFER, typename DST_BUFFER, typename STENCIL_TABLE>
509  bool EvalStencils(SRC_BUFFER *srcBuffer,
510  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
511  DST_BUFFER *dstBuffer,
512  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
513  DST_BUFFER *duBuffer,
514  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
515  DST_BUFFER *dvBuffer,
516  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
517  STENCIL_TABLE const *stencilTable) const
518  {
519  return EvalStencils(srcBuffer->BindVBO(),
520  srcDesc,
521  dstBuffer->BindVBO(),
522  dstDesc,
523  duBuffer->BindVBO(),
524  duDesc,
525  dvBuffer->BindVBO(),
526  dvDesc,
527  stencilTable->GetSizesBuffer(),
528  stencilTable->GetOffsetsBuffer(),
529  stencilTable->GetIndicesBuffer(),
530  stencilTable->GetWeightsBuffer(),
531  stencilTable->GetDuWeightsBuffer(),
532  stencilTable->GetDvWeightsBuffer(),
533  /* start = */ 0,
534  /* end = */ stencilTable->GetNumStencils());
535  }
536 
584  template<typename SRC_BUFFER, typename DST_BUFFER, typename STENCIL_TABLE>
585  bool EvalStencils(SRC_BUFFER *srcBuffer,
586  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
587  DST_BUFFER *dstBuffer,
588  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
589  DST_BUFFER *duBuffer,
590  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
591  DST_BUFFER *dvBuffer,
592  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
593  DST_BUFFER *duuBuffer,
594  OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
595  DST_BUFFER *duvBuffer,
596  OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
597  DST_BUFFER *dvvBuffer,
598  OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
599  STENCIL_TABLE const *stencilTable) const
600  {
601  return EvalStencils(srcBuffer->BindVBO(),
602  srcDesc,
603  dstBuffer->BindVBO(),
604  dstDesc,
605  duBuffer->BindVBO(),
606  duDesc,
607  dvBuffer->BindVBO(),
608  dvDesc,
609  duuBuffer->BindVBO(),
610  duuDesc,
611  duvBuffer->BindVBO(),
612  duvDesc,
613  dvvBuffer->BindVBO(),
614  dvvDesc,
615  stencilTable->GetSizesBuffer(),
616  stencilTable->GetOffsetsBuffer(),
617  stencilTable->GetIndicesBuffer(),
618  stencilTable->GetWeightsBuffer(),
619  stencilTable->GetDuWeightsBuffer(),
620  stencilTable->GetDvWeightsBuffer(),
621  stencilTable->GetDuuWeightsBuffer(),
622  stencilTable->GetDuvWeightsBuffer(),
623  stencilTable->GetDvvWeightsBuffer(),
624  /* start = */ 0,
625  /* end = */ stencilTable->GetNumStencils());
626  }
627 
663  bool EvalStencils(GLuint srcBuffer,
664  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
665  GLuint dstBuffer,
666  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
667  GLuint duBuffer,
668  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
669  GLuint dvBuffer,
670  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
671  GLuint sizesBuffer,
672  GLuint offsetsBuffer,
673  GLuint indicesBuffer,
674  GLuint weightsBuffer,
675  GLuint duWeightsBuffer,
676  GLuint dvWeightsBuffer,
677  int start,
678  int end) const;
679 
733  bool EvalStencils(GLuint srcBuffer,
734  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
735  GLuint dstBuffer,
736  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
737  GLuint duBuffer,
738  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
739  GLuint dvBuffer,
740  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
741  GLuint duuBuffer,
742  OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
743  GLuint duvBuffer,
744  OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
745  GLuint dvvBuffer,
746  OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
747  GLuint sizesBuffer,
748  GLuint offsetsBuffer,
749  GLuint indicesBuffer,
750  GLuint weightsBuffer,
751  GLuint duWeightsBuffer,
752  GLuint dvWeightsBuffer,
753  GLuint duuWeightsBuffer,
754  GLuint duvWeightsBuffer,
755  GLuint dvvWeightsBuffer,
756  int start,
757  int end) const;
758 
764 
797  template<typename SRC_BUFFER,
798  typename DST_BUFFER,
799  typename PATCHCOORD_BUFFER,
800  typename PATCH_TABLE>
801  static bool EvalPatches(SRC_BUFFER *srcBuffer,
802  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
803  DST_BUFFER *dstBuffer,
804  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
805  int numPatchCoords,
806  PATCHCOORD_BUFFER *patchCoords,
807  PATCH_TABLE *patchTable,
809  void *deviceContext = NULL)
810  {
811 
812  if (instance) {
813  return instance->EvalPatches(
814  srcBuffer, srcDesc, dstBuffer, dstDesc, numPatchCoords, patchCoords, patchTable);
815  }
816  else {
817  // Create an instance on demand (slow)
818  (void)deviceContext; // unused
819  instance = Create(srcDesc,
820  dstDesc,
821  OpenSubdiv::Osd::BufferDescriptor(),
822  OpenSubdiv::Osd::BufferDescriptor());
823  if (instance) {
824  bool r = instance->EvalPatches(
825  srcBuffer, srcDesc, dstBuffer, dstDesc, numPatchCoords, patchCoords, patchTable);
826  delete instance;
827  return r;
828  }
829  return false;
830  }
831  }
832 
877  template<typename SRC_BUFFER,
878  typename DST_BUFFER,
879  typename PATCHCOORD_BUFFER,
880  typename PATCH_TABLE>
881  static bool EvalPatches(SRC_BUFFER *srcBuffer,
882  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
883  DST_BUFFER *dstBuffer,
884  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
885  DST_BUFFER *duBuffer,
886  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
887  DST_BUFFER *dvBuffer,
888  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
889  int numPatchCoords,
890  PATCHCOORD_BUFFER *patchCoords,
891  PATCH_TABLE *patchTable,
893  void *deviceContext = NULL)
894  {
895 
896  if (instance) {
897  return instance->EvalPatches(srcBuffer,
898  srcDesc,
899  dstBuffer,
900  dstDesc,
901  duBuffer,
902  duDesc,
903  dvBuffer,
904  dvDesc,
905  numPatchCoords,
906  patchCoords,
907  patchTable);
908  }
909  else {
910  // Create an instance on demand (slow)
911  (void)deviceContext; // unused
912  instance = Create(srcDesc, dstDesc, duDesc, dvDesc);
913  if (instance) {
914  bool r = instance->EvalPatches(srcBuffer,
915  srcDesc,
916  dstBuffer,
917  dstDesc,
918  duBuffer,
919  duDesc,
920  dvBuffer,
921  dvDesc,
922  numPatchCoords,
923  patchCoords,
924  patchTable);
925  delete instance;
926  return r;
927  }
928  return false;
929  }
930  }
931 
994  template<typename SRC_BUFFER,
995  typename DST_BUFFER,
996  typename PATCHCOORD_BUFFER,
997  typename PATCH_TABLE>
998  static bool EvalPatches(SRC_BUFFER *srcBuffer,
999  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1000  DST_BUFFER *dstBuffer,
1001  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1002  DST_BUFFER *duBuffer,
1003  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
1004  DST_BUFFER *dvBuffer,
1005  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
1006  DST_BUFFER *duuBuffer,
1007  OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
1008  DST_BUFFER *duvBuffer,
1009  OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
1010  DST_BUFFER *dvvBuffer,
1011  OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
1012  int numPatchCoords,
1013  PATCHCOORD_BUFFER *patchCoords,
1014  PATCH_TABLE *patchTable,
1016  void *deviceContext = NULL)
1017  {
1018 
1019  if (instance) {
1020  return instance->EvalPatches(srcBuffer,
1021  srcDesc,
1022  dstBuffer,
1023  dstDesc,
1024  duBuffer,
1025  duDesc,
1026  dvBuffer,
1027  dvDesc,
1028  duuBuffer,
1029  duuDesc,
1030  duvBuffer,
1031  duvDesc,
1032  dvvBuffer,
1033  dvvDesc,
1034  numPatchCoords,
1035  patchCoords,
1036  patchTable);
1037  }
1038  else {
1039  // Create an instance on demand (slow)
1040  (void)deviceContext; // unused
1041  instance = Create(srcDesc, dstDesc, duDesc, dvDesc, duuDesc, duvDesc, dvvDesc);
1042  if (instance) {
1043  bool r = instance->EvalPatches(srcBuffer,
1044  srcDesc,
1045  dstBuffer,
1046  dstDesc,
1047  duBuffer,
1048  duDesc,
1049  dvBuffer,
1050  dvDesc,
1051  duuBuffer,
1052  duuDesc,
1053  duvBuffer,
1054  duvDesc,
1055  dvvBuffer,
1056  dvvDesc,
1057  numPatchCoords,
1058  patchCoords,
1059  patchTable);
1060  delete instance;
1061  return r;
1062  }
1063  return false;
1064  }
1065  }
1066 
1091  template<typename SRC_BUFFER,
1092  typename DST_BUFFER,
1093  typename PATCHCOORD_BUFFER,
1094  typename PATCH_TABLE>
1095  bool EvalPatches(SRC_BUFFER *srcBuffer,
1096  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1097  DST_BUFFER *dstBuffer,
1098  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1099  int numPatchCoords,
1100  PATCHCOORD_BUFFER *patchCoords,
1101  PATCH_TABLE *patchTable) const
1102  {
1103 
1104  return EvalPatches(srcBuffer->BindVBO(),
1105  srcDesc,
1106  dstBuffer->BindVBO(),
1107  dstDesc,
1108  0,
1109  OpenSubdiv::Osd::BufferDescriptor(),
1110  0,
1111  OpenSubdiv::Osd::BufferDescriptor(),
1112  numPatchCoords,
1113  patchCoords->BindVBO(),
1114  patchTable->GetPatchArrays(),
1115  patchTable->GetPatchIndexBuffer(),
1116  patchTable->GetPatchParamBuffer());
1117  }
1118 
1153  template<typename SRC_BUFFER,
1154  typename DST_BUFFER,
1155  typename PATCHCOORD_BUFFER,
1156  typename PATCH_TABLE>
1157  bool EvalPatches(SRC_BUFFER *srcBuffer,
1158  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1159  DST_BUFFER *dstBuffer,
1160  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1161  DST_BUFFER *duBuffer,
1162  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
1163  DST_BUFFER *dvBuffer,
1164  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
1165  int numPatchCoords,
1166  PATCHCOORD_BUFFER *patchCoords,
1167  PATCH_TABLE *patchTable) const
1168  {
1169 
1170  return EvalPatches(srcBuffer->BindVBO(),
1171  srcDesc,
1172  dstBuffer->BindVBO(),
1173  dstDesc,
1174  duBuffer->BindVBO(),
1175  duDesc,
1176  dvBuffer->BindVBO(),
1177  dvDesc,
1178  numPatchCoords,
1179  patchCoords->BindVBO(),
1180  patchTable->GetPatchArrays(),
1181  patchTable->GetPatchIndexBuffer(),
1182  patchTable->GetPatchParamBuffer());
1183  }
1184 
1237  template<typename SRC_BUFFER,
1238  typename DST_BUFFER,
1239  typename PATCHCOORD_BUFFER,
1240  typename PATCH_TABLE>
1241  bool EvalPatches(SRC_BUFFER *srcBuffer,
1242  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1243  DST_BUFFER *dstBuffer,
1244  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1245  DST_BUFFER *duBuffer,
1246  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
1247  DST_BUFFER *dvBuffer,
1248  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
1249  DST_BUFFER *duuBuffer,
1250  OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
1251  DST_BUFFER *duvBuffer,
1252  OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
1253  DST_BUFFER *dvvBuffer,
1254  OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
1255  int numPatchCoords,
1256  PATCHCOORD_BUFFER *patchCoords,
1257  PATCH_TABLE *patchTable) const
1258  {
1259 
1260  return EvalPatches(srcBuffer->BindVBO(),
1261  srcDesc,
1262  dstBuffer->BindVBO(),
1263  dstDesc,
1264  duBuffer->BindVBO(),
1265  duDesc,
1266  dvBuffer->BindVBO(),
1267  dvDesc,
1268  duuBuffer->BindVBO(),
1269  duuDesc,
1270  duvBuffer->BindVBO(),
1271  duvDesc,
1272  dvvBuffer->BindVBO(),
1273  dvvDesc,
1274  numPatchCoords,
1275  patchCoords->BindVBO(),
1276  patchTable->GetPatchArrays(),
1277  patchTable->GetPatchIndexBuffer(),
1278  patchTable->GetPatchParamBuffer());
1279  }
1280 
1281  bool EvalPatches(GLuint srcBuffer,
1282  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1283  GLuint dstBuffer,
1284  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1285  GLuint duBuffer,
1286  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
1287  GLuint dvBuffer,
1288  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
1289  int numPatchCoords,
1290  GLuint patchCoordsBuffer,
1291  const OpenSubdiv::Osd::PatchArrayVector &patchArrays,
1292  GLuint patchIndexBuffer,
1293  GLuint patchParamsBuffer) const;
1294 
1295  bool EvalPatches(GLuint srcBuffer,
1296  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1297  GLuint dstBuffer,
1298  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1299  GLuint duBuffer,
1300  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
1301  GLuint dvBuffer,
1302  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
1303  GLuint duuBuffer,
1304  OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
1305  GLuint duvBuffer,
1306  OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
1307  GLuint dvvBuffer,
1308  OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
1309  int numPatchCoords,
1310  GLuint patchCoordsBuffer,
1311  const OpenSubdiv::Osd::PatchArrayVector &patchArrays,
1312  GLuint patchIndexBuffer,
1313  GLuint patchParamsBuffer) const;
1314 
1347  template<typename SRC_BUFFER,
1348  typename DST_BUFFER,
1349  typename PATCHCOORD_BUFFER,
1350  typename PATCH_TABLE>
1351  static bool EvalPatchesVarying(SRC_BUFFER *srcBuffer,
1352  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1353  DST_BUFFER *dstBuffer,
1354  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1355  int numPatchCoords,
1356  PATCHCOORD_BUFFER *patchCoords,
1357  PATCH_TABLE *patchTable,
1359  void *deviceContext = NULL)
1360  {
1361 
1362  if (instance) {
1363  return instance->EvalPatchesVarying(
1364  srcBuffer, srcDesc, dstBuffer, dstDesc, numPatchCoords, patchCoords, patchTable);
1365  }
1366  else {
1367  // Create an instance on demand (slow)
1368  (void)deviceContext; // unused
1369  instance = Create(srcDesc,
1370  dstDesc,
1371  OpenSubdiv::Osd::BufferDescriptor(),
1372  OpenSubdiv::Osd::BufferDescriptor());
1373  if (instance) {
1374  bool r = instance->EvalPatchesVarying(
1375  srcBuffer, srcDesc, dstBuffer, dstDesc, numPatchCoords, patchCoords, patchTable);
1376  delete instance;
1377  return r;
1378  }
1379  return false;
1380  }
1381  }
1382 
1407  template<typename SRC_BUFFER,
1408  typename DST_BUFFER,
1409  typename PATCHCOORD_BUFFER,
1410  typename PATCH_TABLE>
1411  bool EvalPatchesVarying(SRC_BUFFER *srcBuffer,
1412  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1413  DST_BUFFER *dstBuffer,
1414  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1415  int numPatchCoords,
1416  PATCHCOORD_BUFFER *patchCoords,
1417  PATCH_TABLE *patchTable) const
1418  {
1419 
1420  return EvalPatches(srcBuffer->BindVBO(),
1421  srcDesc,
1422  dstBuffer->BindVBO(),
1423  dstDesc,
1424  0,
1425  OpenSubdiv::Osd::BufferDescriptor(),
1426  0,
1427  OpenSubdiv::Osd::BufferDescriptor(),
1428  numPatchCoords,
1429  patchCoords->BindVBO(),
1430  patchTable->GetVaryingPatchArrays(),
1431  patchTable->GetVaryingPatchIndexBuffer(),
1432  patchTable->GetPatchParamBuffer());
1433  }
1434 
1479  template<typename SRC_BUFFER,
1480  typename DST_BUFFER,
1481  typename PATCHCOORD_BUFFER,
1482  typename PATCH_TABLE>
1483  static bool EvalPatchesVarying(SRC_BUFFER *srcBuffer,
1484  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1485  DST_BUFFER *dstBuffer,
1486  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1487  DST_BUFFER *duBuffer,
1488  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
1489  DST_BUFFER *dvBuffer,
1490  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
1491  int numPatchCoords,
1492  PATCHCOORD_BUFFER *patchCoords,
1493  PATCH_TABLE *patchTable,
1495  void *deviceContext = NULL)
1496  {
1497 
1498  if (instance) {
1499  return instance->EvalPatchesVarying(srcBuffer,
1500  srcDesc,
1501  dstBuffer,
1502  dstDesc,
1503  duBuffer,
1504  duDesc,
1505  dvBuffer,
1506  dvDesc,
1507  numPatchCoords,
1508  patchCoords,
1509  patchTable);
1510  }
1511  else {
1512  // Create an instance on demand (slow)
1513  (void)deviceContext; // unused
1514  instance = Create(srcDesc, dstDesc, duDesc, dvDesc);
1515  if (instance) {
1516  bool r = instance->EvalPatchesVarying(srcBuffer,
1517  srcDesc,
1518  dstBuffer,
1519  dstDesc,
1520  duBuffer,
1521  duDesc,
1522  dvBuffer,
1523  dvDesc,
1524  numPatchCoords,
1525  patchCoords,
1526  patchTable);
1527  delete instance;
1528  return r;
1529  }
1530  return false;
1531  }
1532  }
1533 
1570  template<typename SRC_BUFFER,
1571  typename DST_BUFFER,
1572  typename PATCHCOORD_BUFFER,
1573  typename PATCH_TABLE>
1574  bool EvalPatchesVarying(SRC_BUFFER *srcBuffer,
1575  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1576  DST_BUFFER *dstBuffer,
1577  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1578  DST_BUFFER *duBuffer,
1579  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
1580  DST_BUFFER *dvBuffer,
1581  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
1582  int numPatchCoords,
1583  PATCHCOORD_BUFFER *patchCoords,
1584  PATCH_TABLE *patchTable) const
1585  {
1586 
1587  return EvalPatches(srcBuffer->BindVBO(),
1588  srcDesc,
1589  dstBuffer->BindVBO(),
1590  dstDesc,
1591  duBuffer->BindVBO(),
1592  duDesc,
1593  dvBuffer->BindVBO(),
1594  dvDesc,
1595  numPatchCoords,
1596  patchCoords->BindVBO(),
1597  patchTable->GetVaryingPatchArrays(),
1598  patchTable->GetVaryingPatchIndexBuffer(),
1599  patchTable->GetPatchParamBuffer());
1600  }
1601 
1664  template<typename SRC_BUFFER,
1665  typename DST_BUFFER,
1666  typename PATCHCOORD_BUFFER,
1667  typename PATCH_TABLE>
1668  static bool EvalPatchesVarying(SRC_BUFFER *srcBuffer,
1669  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1670  DST_BUFFER *dstBuffer,
1671  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1672  DST_BUFFER *duBuffer,
1673  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
1674  DST_BUFFER *dvBuffer,
1675  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
1676  DST_BUFFER *duuBuffer,
1677  OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
1678  DST_BUFFER *duvBuffer,
1679  OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
1680  DST_BUFFER *dvvBuffer,
1681  OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
1682  int numPatchCoords,
1683  PATCHCOORD_BUFFER *patchCoords,
1684  PATCH_TABLE *patchTable,
1686  void *deviceContext = NULL)
1687  {
1688 
1689  if (instance) {
1690  return instance->EvalPatchesVarying(srcBuffer,
1691  srcDesc,
1692  dstBuffer,
1693  dstDesc,
1694  duBuffer,
1695  duDesc,
1696  dvBuffer,
1697  dvDesc,
1698  duuBuffer,
1699  duuDesc,
1700  duvBuffer,
1701  duvDesc,
1702  dvvBuffer,
1703  dvvDesc,
1704  numPatchCoords,
1705  patchCoords,
1706  patchTable);
1707  }
1708  else {
1709  // Create an instance on demand (slow)
1710  (void)deviceContext; // unused
1711  instance = Create(srcDesc, dstDesc, duDesc, dvDesc, duuDesc, duvDesc, dvvDesc);
1712  if (instance) {
1713  bool r = instance->EvalPatchesVarying(srcBuffer,
1714  srcDesc,
1715  dstBuffer,
1716  dstDesc,
1717  duBuffer,
1718  duDesc,
1719  dvBuffer,
1720  dvDesc,
1721  duuBuffer,
1722  duuDesc,
1723  duvBuffer,
1724  duvDesc,
1725  dvvBuffer,
1726  dvvDesc,
1727  numPatchCoords,
1728  patchCoords,
1729  patchTable);
1730  delete instance;
1731  return r;
1732  }
1733  return false;
1734  }
1735  }
1736 
1791  template<typename SRC_BUFFER,
1792  typename DST_BUFFER,
1793  typename PATCHCOORD_BUFFER,
1794  typename PATCH_TABLE>
1795  bool EvalPatchesVarying(SRC_BUFFER *srcBuffer,
1796  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1797  DST_BUFFER *dstBuffer,
1798  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1799  DST_BUFFER *duBuffer,
1800  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
1801  DST_BUFFER *dvBuffer,
1802  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
1803  DST_BUFFER *duuBuffer,
1804  OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
1805  DST_BUFFER *duvBuffer,
1806  OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
1807  DST_BUFFER *dvvBuffer,
1808  OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
1809  int numPatchCoords,
1810  PATCHCOORD_BUFFER *patchCoords,
1811  PATCH_TABLE *patchTable) const
1812  {
1813 
1814  return EvalPatches(srcBuffer->BindVBO(),
1815  srcDesc,
1816  dstBuffer->BindVBO(),
1817  dstDesc,
1818  duBuffer->BindVBO(),
1819  duDesc,
1820  dvBuffer->BindVBO(),
1821  dvDesc,
1822  duuBuffer->BindVBO(),
1823  duuDesc,
1824  duvBuffer->BindVBO(),
1825  duvDesc,
1826  dvvBuffer->BindVBO(),
1827  dvvDesc,
1828  numPatchCoords,
1829  patchCoords->BindVBO(),
1830  patchTable->GetVaryingPatchArrays(),
1831  patchTable->GetVaryingPatchIndexBuffer(),
1832  patchTable->GetPatchParamBuffer());
1833  }
1834 
1869  template<typename SRC_BUFFER,
1870  typename DST_BUFFER,
1871  typename PATCHCOORD_BUFFER,
1872  typename PATCH_TABLE>
1873  static bool EvalPatchesFaceVarying(SRC_BUFFER *srcBuffer,
1874  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1875  DST_BUFFER *dstBuffer,
1876  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1877  int numPatchCoords,
1878  PATCHCOORD_BUFFER *patchCoords,
1879  PATCH_TABLE *patchTable,
1880  int fvarChannel,
1882  void *deviceContext = NULL)
1883  {
1884 
1885  if (instance) {
1886  return instance->EvalPatchesFaceVarying(srcBuffer,
1887  srcDesc,
1888  dstBuffer,
1889  dstDesc,
1890  numPatchCoords,
1891  patchCoords,
1892  patchTable,
1893  fvarChannel);
1894  }
1895  else {
1896  // Create an instance on demand (slow)
1897  (void)deviceContext; // unused
1898  instance = Create(srcDesc,
1899  dstDesc,
1900  OpenSubdiv::Osd::BufferDescriptor(),
1901  OpenSubdiv::Osd::BufferDescriptor());
1902  if (instance) {
1903  bool r = instance->EvalPatchesFaceVarying(srcBuffer,
1904  srcDesc,
1905  dstBuffer,
1906  dstDesc,
1907  numPatchCoords,
1908  patchCoords,
1909  patchTable,
1910  fvarChannel);
1911  delete instance;
1912  return r;
1913  }
1914  return false;
1915  }
1916  }
1917 
1944  template<typename SRC_BUFFER,
1945  typename DST_BUFFER,
1946  typename PATCHCOORD_BUFFER,
1947  typename PATCH_TABLE>
1948  bool EvalPatchesFaceVarying(SRC_BUFFER *srcBuffer,
1949  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
1950  DST_BUFFER *dstBuffer,
1951  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
1952  int numPatchCoords,
1953  PATCHCOORD_BUFFER *patchCoords,
1954  PATCH_TABLE *patchTable,
1955  int fvarChannel = 0) const
1956  {
1957 
1958  return EvalPatches(srcBuffer->BindVBO(),
1959  srcDesc,
1960  dstBuffer->BindVBO(),
1961  dstDesc,
1962  0,
1963  OpenSubdiv::Osd::BufferDescriptor(),
1964  0,
1965  OpenSubdiv::Osd::BufferDescriptor(),
1966  numPatchCoords,
1967  patchCoords->BindVBO(),
1968  patchTable->GetFVarPatchArrays(fvarChannel),
1969  patchTable->GetFVarPatchIndexBuffer(fvarChannel),
1970  patchTable->GetFVarPatchParamBuffer(fvarChannel));
1971  }
1972 
2019  template<typename SRC_BUFFER,
2020  typename DST_BUFFER,
2021  typename PATCHCOORD_BUFFER,
2022  typename PATCH_TABLE>
2023  static bool EvalPatchesFaceVarying(SRC_BUFFER *srcBuffer,
2024  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
2025  DST_BUFFER *dstBuffer,
2026  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
2027  DST_BUFFER *duBuffer,
2028  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
2029  DST_BUFFER *dvBuffer,
2030  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
2031  int numPatchCoords,
2032  PATCHCOORD_BUFFER *patchCoords,
2033  PATCH_TABLE *patchTable,
2034  int fvarChannel,
2036  void *deviceContext = NULL)
2037  {
2038 
2039  if (instance) {
2040  return instance->EvalPatchesFaceVarying(srcBuffer,
2041  srcDesc,
2042  dstBuffer,
2043  dstDesc,
2044  duBuffer,
2045  duDesc,
2046  dvBuffer,
2047  dvDesc,
2048  numPatchCoords,
2049  patchCoords,
2050  patchTable,
2051  fvarChannel);
2052  }
2053  else {
2054  // Create an instance on demand (slow)
2055  (void)deviceContext; // unused
2056  instance = Create(srcDesc, dstDesc, duDesc, dvDesc);
2057  if (instance) {
2058  bool r = instance->EvalPatchesFaceVarying(srcBuffer,
2059  srcDesc,
2060  dstBuffer,
2061  dstDesc,
2062  duBuffer,
2063  duDesc,
2064  dvBuffer,
2065  dvDesc,
2066  numPatchCoords,
2067  patchCoords,
2068  patchTable,
2069  fvarChannel);
2070  delete instance;
2071  return r;
2072  }
2073  return false;
2074  }
2075  }
2076 
2115  template<typename SRC_BUFFER,
2116  typename DST_BUFFER,
2117  typename PATCHCOORD_BUFFER,
2118  typename PATCH_TABLE>
2119  bool EvalPatchesFaceVarying(SRC_BUFFER *srcBuffer,
2120  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
2121  DST_BUFFER *dstBuffer,
2122  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
2123  DST_BUFFER *duBuffer,
2124  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
2125  DST_BUFFER *dvBuffer,
2126  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
2127  int numPatchCoords,
2128  PATCHCOORD_BUFFER *patchCoords,
2129  PATCH_TABLE *patchTable,
2130  int fvarChannel = 0) const
2131  {
2132 
2133  return EvalPatches(srcBuffer->BindVBO(),
2134  srcDesc,
2135  dstBuffer->BindVBO(),
2136  dstDesc,
2137  duBuffer->BindVBO(),
2138  duDesc,
2139  dvBuffer->BindVBO(),
2140  dvDesc,
2141  numPatchCoords,
2142  patchCoords->BindVBO(),
2143  patchTable->GetFVarPatchArrays(fvarChannel),
2144  patchTable->GetFVarPatchIndexBuffer(fvarChannel),
2145  patchTable->GetFVarPatchParamBuffer(fvarChannel));
2146  }
2147 
2212  template<typename SRC_BUFFER,
2213  typename DST_BUFFER,
2214  typename PATCHCOORD_BUFFER,
2215  typename PATCH_TABLE>
2216  static bool EvalPatchesFaceVarying(SRC_BUFFER *srcBuffer,
2217  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
2218  DST_BUFFER *dstBuffer,
2219  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
2220  DST_BUFFER *duBuffer,
2221  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
2222  DST_BUFFER *dvBuffer,
2223  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
2224  DST_BUFFER *duuBuffer,
2225  OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
2226  DST_BUFFER *duvBuffer,
2227  OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
2228  DST_BUFFER *dvvBuffer,
2229  OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
2230  int numPatchCoords,
2231  PATCHCOORD_BUFFER *patchCoords,
2232  PATCH_TABLE *patchTable,
2233  int fvarChannel,
2235  void *deviceContext = NULL)
2236  {
2237 
2238  if (instance) {
2239  return instance->EvalPatchesFaceVarying(srcBuffer,
2240  srcDesc,
2241  dstBuffer,
2242  dstDesc,
2243  duBuffer,
2244  duDesc,
2245  dvBuffer,
2246  dvDesc,
2247  duuBuffer,
2248  duuDesc,
2249  duvBuffer,
2250  duvDesc,
2251  dvvBuffer,
2252  dvvDesc,
2253  numPatchCoords,
2254  patchCoords,
2255  patchTable,
2256  fvarChannel);
2257  }
2258  else {
2259  // Create an instance on demand (slow)
2260  (void)deviceContext; // unused
2261  instance = Create(srcDesc, dstDesc, duDesc, dvDesc, duuDesc, duvDesc, dvvDesc);
2262  if (instance) {
2263  bool r = instance->EvalPatchesFaceVarying(srcBuffer,
2264  srcDesc,
2265  dstBuffer,
2266  dstDesc,
2267  duBuffer,
2268  duDesc,
2269  dvBuffer,
2270  dvDesc,
2271  duuBuffer,
2272  duuDesc,
2273  duvBuffer,
2274  duvDesc,
2275  dvvBuffer,
2276  dvvDesc,
2277  numPatchCoords,
2278  patchCoords,
2279  patchTable,
2280  fvarChannel);
2281  delete instance;
2282  return r;
2283  }
2284  return false;
2285  }
2286  }
2287 
2344  template<typename SRC_BUFFER,
2345  typename DST_BUFFER,
2346  typename PATCHCOORD_BUFFER,
2347  typename PATCH_TABLE>
2348  bool EvalPatchesFaceVarying(SRC_BUFFER *srcBuffer,
2349  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
2350  DST_BUFFER *dstBuffer,
2351  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
2352  DST_BUFFER *duBuffer,
2353  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
2354  DST_BUFFER *dvBuffer,
2355  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
2356  DST_BUFFER *duuBuffer,
2357  OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
2358  DST_BUFFER *duvBuffer,
2359  OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
2360  DST_BUFFER *dvvBuffer,
2361  OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
2362  int numPatchCoords,
2363  PATCHCOORD_BUFFER *patchCoords,
2364  PATCH_TABLE *patchTable,
2365  int fvarChannel = 0) const
2366  {
2367 
2368  return EvalPatches(srcBuffer->BindVBO(),
2369  srcDesc,
2370  dstBuffer->BindVBO(),
2371  dstDesc,
2372  duBuffer->BindVBO(),
2373  duDesc,
2374  dvBuffer->BindVBO(),
2375  dvDesc,
2376  duuBuffer->BindVBO(),
2377  duuDesc,
2378  duvBuffer->BindVBO(),
2379  duvDesc,
2380  dvvBuffer->BindVBO(),
2381  dvvDesc,
2382  numPatchCoords,
2383  patchCoords->BindVBO(),
2384  patchTable->GetFVarPatchArrays(fvarChannel),
2385  patchTable->GetFVarPatchIndexBuffer(fvarChannel),
2386  patchTable->GetFVarPatchParamBuffer(fvarChannel));
2387  }
2388 
2394 
2397  bool Compile(
2398  OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
2399  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
2400  OpenSubdiv::Osd::BufferDescriptor const &duDesc = OpenSubdiv::Osd::BufferDescriptor(),
2401  OpenSubdiv::Osd::BufferDescriptor const &dvDesc = OpenSubdiv::Osd::BufferDescriptor(),
2402  OpenSubdiv::Osd::BufferDescriptor const &duuDesc = OpenSubdiv::Osd::BufferDescriptor(),
2403  OpenSubdiv::Osd::BufferDescriptor const &duvDesc = OpenSubdiv::Osd::BufferDescriptor(),
2404  OpenSubdiv::Osd::BufferDescriptor const &dvvDesc = OpenSubdiv::Osd::BufferDescriptor());
2405 
2407  static void Synchronize(void *deviceContext);
2408 
2409  private:
2410  struct _StencilKernel {
2411  _StencilKernel();
2412  ~_StencilKernel();
2413  bool Compile(OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
2414  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
2415  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
2416  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
2417  OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
2418  OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
2419  OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
2420  int workGroupSize);
2421  GLuint program;
2422  GLuint uniformStart;
2423  GLuint uniformEnd;
2424  GLuint uniformSrcOffset;
2425  GLuint uniformDstOffset;
2426  GLuint uniformDuDesc;
2427  GLuint uniformDvDesc;
2428  GLuint uniformDuuDesc;
2429  GLuint uniformDuvDesc;
2430  GLuint uniformDvvDesc;
2431  } _stencilKernel;
2432 
2433  struct _PatchKernel {
2434  _PatchKernel();
2435  ~_PatchKernel();
2436  bool Compile(OpenSubdiv::Osd::BufferDescriptor const &srcDesc,
2437  OpenSubdiv::Osd::BufferDescriptor const &dstDesc,
2438  OpenSubdiv::Osd::BufferDescriptor const &duDesc,
2439  OpenSubdiv::Osd::BufferDescriptor const &dvDesc,
2440  OpenSubdiv::Osd::BufferDescriptor const &duuDesc,
2441  OpenSubdiv::Osd::BufferDescriptor const &duvDesc,
2442  OpenSubdiv::Osd::BufferDescriptor const &dvvDesc,
2443  int workGroupSize);
2444  GLuint program;
2445  GLuint uniformSrcOffset;
2446  GLuint uniformDstOffset;
2447  GLuint uniformPatchArray;
2448  GLuint uniformDuDesc;
2449  GLuint uniformDvDesc;
2450  GLuint uniformDuuDesc;
2451  GLuint uniformDuvDesc;
2452  GLuint uniformDvvDesc;
2453  } _patchKernel;
2454 
2455  int _workGroupSize;
2456  GLuint _patchArraysSSBO;
2457 
2458  int GetDispatchSize(int count) const;
2459 
2460  void DispatchCompute(int totalDispatchSize) const;
2461 };
2462 } // namespace opensubdiv
2463 } // namespace blender
2464 
2465 #endif // OPENSUBDIV_GL_COMPUTE_EVALUATOR_H_
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble GLdouble r _GL_VOID_RET _GL_VOID GLfloat GLfloat r _GL_VOID_RET _GL_VOID GLint GLint r _GL_VOID_RET _GL_VOID GLshort GLshort r _GL_VOID_RET _GL_VOID GLdouble GLdouble r
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
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 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.
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)
static GLStencilTableSSBO * Create(OpenSubdiv::Far::StencilTable const *stencilTable, void *deviceContext=NULL)
GLStencilTableSSBO(OpenSubdiv::Far::LimitStencilTable const *limitStencilTable)
GLStencilTableSSBO(OpenSubdiv::Far::StencilTable const *stencilTable)
static GLStencilTableSSBO * Create(OpenSubdiv::Far::LimitStencilTable const *limitStencilTable, void *deviceContext=NULL)
SyclQueue void void size_t num_bytes void
int count