OpenSubdiv
Loading...
Searching...
No Matches
glXFBEvaluator.h
Go to the documentation of this file.
1//
2// Copyright 2015 Pixar
3//
4// Licensed under the terms set forth in the LICENSE.txt file available at
5// https://opensubdiv.org/license.
6//
7
8#ifndef OPENSUBDIV3_OSD_GL_XFB_EVALUATOR_H
9#define OPENSUBDIV3_OSD_GL_XFB_EVALUATOR_H
10
11#include "../version.h"
12
13#include "../osd/types.h"
15
16namespace OpenSubdiv {
17namespace OPENSUBDIV_VERSION {
18
19namespace Far {
20 class PatchTable;
21 class StencilTable;
22 class LimitStencilTable;
23}
24
25namespace Osd {
26
35public:
36 using ID = unsigned int; // GLuint resource ID
37
39 Far::StencilTable const *stencilTable, void *deviceContext = NULL) {
40 (void)deviceContext; // unused
41 return new GLStencilTableTBO(stencilTable);
42 }
43
45 Far::LimitStencilTable const *limitStencilTable,
46 void *deviceContext = NULL) {
47 (void)deviceContext; // unused
48 return new GLStencilTableTBO(limitStencilTable);
49 }
50
51 explicit GLStencilTableTBO(Far::StencilTable const *stencilTable);
52 explicit GLStencilTableTBO(Far::LimitStencilTable const *limitStencilTable);
54
55 // interfaces needed for GLSLTransformFeedbackKernel
56 ID GetSizesTexture() const { return _sizes; }
57 ID GetOffsetsTexture() const { return _offsets; }
58 ID GetIndicesTexture() const { return _indices; }
59 ID GetWeightsTexture() const { return _weights; }
60 ID GetDuWeightsTexture() const { return _duWeights; }
61 ID GetDvWeightsTexture() const { return _dvWeights; }
62 ID GetDuuWeightsTexture() const { return _duuWeights; }
63 ID GetDuvWeightsTexture() const { return _duvWeights; }
64 ID GetDvvWeightsTexture() const { return _dvvWeights; }
65 int GetNumStencils() const { return _numStencils; }
66
67private:
68 ID _sizes;
69 ID _offsets;
70 ID _indices;
71 ID _weights;
72 ID _duWeights;
73 ID _dvWeights;
74 ID _duuWeights;
75 ID _duvWeights;
76 ID _dvvWeights;
77 int _numStencils;
78};
79
80// ---------------------------------------------------------------------------
81
83public:
84 using ID = unsigned int; // GLuint resource ID
85 using LOCATION = int; // GLint program location
86 using Instantiatable = bool; // Enable compiled kernel evaluator cache
87
89 template <typename DEVICE_CONTEXT>
90 static GLXFBEvaluator *Create(BufferDescriptor const &srcDesc,
91 BufferDescriptor const &dstDesc,
92 BufferDescriptor const &duDesc,
93 BufferDescriptor const &dvDesc,
94 DEVICE_CONTEXT deviceContext) {
95 bool interleavedDerivativeBuffers = deviceContext
96 ? deviceContext->AreInterleavedDerivativeBuffers()
97 : false;
98 return Create(srcDesc, dstDesc, duDesc, dvDesc,
99 interleavedDerivativeBuffers);
100 }
101
103 static GLXFBEvaluator *Create(BufferDescriptor const &srcDesc,
104 BufferDescriptor const &dstDesc,
105 BufferDescriptor const &duDesc,
106 BufferDescriptor const &dvDesc,
107 void * deviceContext) {
108 (void)deviceContext; // not used
109 return Create(srcDesc, dstDesc, duDesc, dvDesc);
110 }
111
112 static GLXFBEvaluator * Create(BufferDescriptor const &srcDesc,
113 BufferDescriptor const &dstDesc,
114 BufferDescriptor const &duDesc,
115 BufferDescriptor const &dvDesc,
116 bool interleavedDerivativeBuffers = false) {
117 GLXFBEvaluator *instance = new GLXFBEvaluator(interleavedDerivativeBuffers);
118 if (instance->Compile(srcDesc, dstDesc, duDesc, dvDesc))
119 return instance;
120 delete instance;
121 return NULL;
122 }
123
125 template <typename DEVICE_CONTEXT>
126 static GLXFBEvaluator *Create(BufferDescriptor const &srcDesc,
127 BufferDescriptor const &dstDesc,
128 BufferDescriptor const &duDesc,
129 BufferDescriptor const &dvDesc,
130 BufferDescriptor const &duuDesc,
131 BufferDescriptor const &duvDesc,
132 BufferDescriptor const &dvvDesc,
133 DEVICE_CONTEXT deviceContext) {
134 bool interleavedDerivativeBuffers = deviceContext
135 ? deviceContext->AreInterleavedDerivativeBuffers()
136 : false;
137 return Create(srcDesc, dstDesc, duDesc, dvDesc,
138 duuDesc, duvDesc, dvvDesc,
139 interleavedDerivativeBuffers);
140 }
141
143 static GLXFBEvaluator *Create(BufferDescriptor const &srcDesc,
144 BufferDescriptor const &dstDesc,
145 BufferDescriptor const &duDesc,
146 BufferDescriptor const &dvDesc,
147 BufferDescriptor const &duuDesc,
148 BufferDescriptor const &duvDesc,
149 BufferDescriptor const &dvvDesc,
150 void * deviceContext) {
151 (void)deviceContext; // not used
152 return Create(srcDesc, dstDesc, duDesc, dvDesc,
153 duuDesc, duvDesc, dvvDesc);
154 }
155
156 static GLXFBEvaluator * Create(BufferDescriptor const &srcDesc,
157 BufferDescriptor const &dstDesc,
158 BufferDescriptor const &duDesc,
159 BufferDescriptor const &dvDesc,
160 BufferDescriptor const &duuDesc,
161 BufferDescriptor const &duvDesc,
162 BufferDescriptor const &dvvDesc,
163 bool interleavedDerivativeBuffers = false) {
164 GLXFBEvaluator *instance = new GLXFBEvaluator(interleavedDerivativeBuffers);
165 if (instance->Compile(srcDesc, dstDesc, duDesc, dvDesc,
166 duuDesc, duvDesc, dvvDesc))
167 return instance;
168 delete instance;
169 return NULL;
170 }
171
185 GLXFBEvaluator(bool interleavedDerivativeBuffers = false);
186
189
195
223 template <typename SRC_BUFFER, typename DST_BUFFER, typename STENCIL_TABLE>
224 static bool EvalStencils(
225 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
226 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
227 STENCIL_TABLE const *stencilTable,
228 GLXFBEvaluator const *instance,
229 void * deviceContext = NULL) {
230
231 if (instance) {
232 return instance->EvalStencils(srcBuffer, srcDesc,
233 dstBuffer, dstDesc,
234 stencilTable);
235 } else {
236 // Create an instance on demand (slow)
237 (void)deviceContext; // unused
238 instance = Create(srcDesc, dstDesc,
241 if (instance) {
242 bool r = instance->EvalStencils(srcBuffer, srcDesc,
243 dstBuffer, dstDesc,
244 stencilTable);
245 delete instance;
246 return r;
247 }
248 return false;
249 }
250 }
251
291 template <typename SRC_BUFFER, typename DST_BUFFER, typename STENCIL_TABLE>
292 static bool EvalStencils(
293 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
294 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
295 DST_BUFFER *duBuffer, BufferDescriptor const &duDesc,
296 DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc,
297 STENCIL_TABLE const *stencilTable,
298 GLXFBEvaluator const *instance,
299 void * deviceContext = NULL) {
300
301 if (instance) {
302 return instance->EvalStencils(srcBuffer, srcDesc,
303 dstBuffer, dstDesc,
304 duBuffer, duDesc,
305 dvBuffer, dvDesc,
306 stencilTable);
307 } else {
308 // Create an instance on demand (slow)
309 (void)deviceContext; // unused
310 instance = Create(srcDesc, dstDesc, duDesc, dvDesc);
311 if (instance) {
312 bool r = instance->EvalStencils(srcBuffer, srcDesc,
313 dstBuffer, dstDesc,
314 duBuffer, duDesc,
315 dvBuffer, dvDesc,
316 stencilTable);
317 delete instance;
318 return r;
319 }
320 return false;
321 }
322 }
323
381 template <typename SRC_BUFFER, typename DST_BUFFER, typename STENCIL_TABLE>
382 static bool EvalStencils(
383 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
384 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
385 DST_BUFFER *duBuffer, BufferDescriptor const &duDesc,
386 DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc,
387 DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc,
388 DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc,
389 DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc,
390 STENCIL_TABLE const *stencilTable,
391 GLXFBEvaluator const *instance,
392 void * deviceContext = NULL) {
393
394 if (instance) {
395 return instance->EvalStencils(srcBuffer, srcDesc,
396 dstBuffer, dstDesc,
397 duBuffer, duDesc,
398 dvBuffer, dvDesc,
399 duuBuffer, duuDesc,
400 duvBuffer, duvDesc,
401 dvvBuffer, dvvDesc,
402 stencilTable);
403 } else {
404 // Create an instance on demand (slow)
405 (void)deviceContext; // unused
406 instance = Create(srcDesc, dstDesc,
407 duDesc, dvDesc,
408 duuDesc, duvDesc, dvvDesc);
409 if (instance) {
410 bool r = instance->EvalStencils(srcBuffer, srcDesc,
411 dstBuffer, dstDesc,
412 duBuffer, duDesc,
413 dvBuffer, dvDesc,
414 duuBuffer, duuDesc,
415 duvBuffer, duvDesc,
416 dvvBuffer, dvvDesc,
417 stencilTable);
418 delete instance;
419 return r;
420 }
421 return false;
422 }
423 }
424
442 template <typename SRC_BUFFER, typename DST_BUFFER, typename STENCIL_TABLE>
444 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
445 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
446 STENCIL_TABLE const *stencilTable) const {
447
448 return EvalStencils(srcBuffer->BindVBO(), srcDesc,
449 dstBuffer->BindVBO(), dstDesc,
450 0, BufferDescriptor(),
451 0, BufferDescriptor(),
452 stencilTable->GetSizesTexture(),
453 stencilTable->GetOffsetsTexture(),
454 stencilTable->GetIndicesTexture(),
455 stencilTable->GetWeightsTexture(),
456 0,
457 0,
458 /* start = */ 0,
459 /* end = */ stencilTable->GetNumStencils());
460 }
461
491 template <typename SRC_BUFFER, typename DST_BUFFER, typename STENCIL_TABLE>
493 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
494 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
495 DST_BUFFER *duBuffer, BufferDescriptor const &duDesc,
496 DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc,
497 STENCIL_TABLE const *stencilTable) const {
498
499 return EvalStencils(srcBuffer->BindVBO(), srcDesc,
500 dstBuffer->BindVBO(), dstDesc,
501 duBuffer->BindVBO(), duDesc,
502 dvBuffer->BindVBO(), dvDesc,
503 stencilTable->GetSizesTexture(),
504 stencilTable->GetOffsetsTexture(),
505 stencilTable->GetIndicesTexture(),
506 stencilTable->GetWeightsTexture(),
507 stencilTable->GetDuWeightsTexture(),
508 stencilTable->GetDvWeightsTexture(),
509 /* start = */ 0,
510 /* end = */ stencilTable->GetNumStencils());
511 }
512
560 template <typename SRC_BUFFER, typename DST_BUFFER, typename STENCIL_TABLE>
562 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
563 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
564 DST_BUFFER *duBuffer, BufferDescriptor const &duDesc,
565 DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc,
566 DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc,
567 DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc,
568 DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc,
569 STENCIL_TABLE const *stencilTable) const {
570
571 return EvalStencils(srcBuffer->BindVBO(), srcDesc,
572 dstBuffer->BindVBO(), dstDesc,
573 duBuffer->BindVBO(), duDesc,
574 dvBuffer->BindVBO(), dvDesc,
575 duuBuffer->BindVBO(), duuDesc,
576 duvBuffer->BindVBO(), duvDesc,
577 dvvBuffer->BindVBO(), dvvDesc,
578 stencilTable->GetSizesTexture(),
579 stencilTable->GetOffsetsTexture(),
580 stencilTable->GetIndicesTexture(),
581 stencilTable->GetWeightsTexture(),
582 stencilTable->GetDuWeightsTexture(),
583 stencilTable->GetDvWeightsTexture(),
584 stencilTable->GetDuuWeightsTexture(),
585 stencilTable->GetDuvWeightsTexture(),
586 stencilTable->GetDvvWeightsTexture(),
587 /* start = */ 0,
588 /* end = */ stencilTable->GetNumStencils());
589 }
590
626 bool EvalStencils(ID srcBuffer, BufferDescriptor const &srcDesc,
627 ID dstBuffer, BufferDescriptor const &dstDesc,
628 ID duBuffer, BufferDescriptor const &duDesc,
629 ID dvBuffer, BufferDescriptor const &dvDesc,
630 ID sizesBuffer,
631 ID offsetsBuffer,
632 ID indicesBuffer,
633 ID weightsBuffer,
634 ID duWeightsBuffer,
635 ID dvWeightsBuffer,
636 int start,
637 int end) const;
638
692 bool EvalStencils(ID srcBuffer, BufferDescriptor const &srcDesc,
693 ID dstBuffer, BufferDescriptor const &dstDesc,
694 ID duBuffer, BufferDescriptor const &duDesc,
695 ID dvBuffer, BufferDescriptor const &dvDesc,
696 ID duuBuffer, BufferDescriptor const &duuDesc,
697 ID duvBuffer, BufferDescriptor const &duvDesc,
698 ID dvvBuffer, BufferDescriptor const &dvvDesc,
699 ID sizesBuffer,
700 ID offsetsBuffer,
701 ID indicesBuffer,
702 ID weightsBuffer,
703 ID duWeightsBuffer,
704 ID dvWeightsBuffer,
705 ID duuWeightsBuffer,
706 ID duvWeightsBuffer,
707 ID dvvWeightsBuffer,
708 int start,
709 int end) const;
710
716
749 template <typename SRC_BUFFER, typename DST_BUFFER,
750 typename PATCHCOORD_BUFFER, typename PATCH_TABLE>
751 static bool EvalPatches(
752 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
753 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
754 int numPatchCoords,
755 PATCHCOORD_BUFFER *patchCoords,
756 PATCH_TABLE *patchTable,
757 GLXFBEvaluator const *instance,
758 void * deviceContext = NULL) {
759
760 if (instance) {
761 return instance->EvalPatches(srcBuffer, srcDesc,
762 dstBuffer, dstDesc,
763 numPatchCoords, patchCoords,
764 patchTable);
765 } else {
766 // Create an instance on demand (slow)
767 (void)deviceContext; // unused
768 instance = Create(srcDesc, dstDesc,
771 if (instance) {
772 bool r = instance->EvalPatches(srcBuffer, srcDesc,
773 dstBuffer, dstDesc,
774 numPatchCoords, patchCoords,
775 patchTable);
776 delete instance;
777 return r;
778 }
779 return false;
780 }
781 }
782
827 template <typename SRC_BUFFER, typename DST_BUFFER,
828 typename PATCHCOORD_BUFFER, typename PATCH_TABLE>
829 static bool EvalPatches(
830 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
831 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
832 DST_BUFFER *duBuffer, BufferDescriptor const &duDesc,
833 DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc,
834 int numPatchCoords,
835 PATCHCOORD_BUFFER *patchCoords,
836 PATCH_TABLE *patchTable,
837 GLXFBEvaluator const *instance,
838 void * deviceContext = NULL) {
839
840 if (instance) {
841 return instance->EvalPatches(srcBuffer, srcDesc,
842 dstBuffer, dstDesc,
843 duBuffer, duDesc,
844 dvBuffer, dvDesc,
845 numPatchCoords, patchCoords,
846 patchTable);
847 } else {
848 // Create an instance on demand (slow)
849 (void)deviceContext; // unused
850 instance = Create(srcDesc, dstDesc, duDesc, dvDesc);
851 if (instance) {
852 bool r = instance->EvalPatches(srcBuffer, srcDesc,
853 dstBuffer, dstDesc,
854 duBuffer, duDesc,
855 dvBuffer, dvDesc,
856 numPatchCoords, patchCoords,
857 patchTable);
858 delete instance;
859 return r;
860 }
861 return false;
862 }
863 }
864
927 template <typename SRC_BUFFER, typename DST_BUFFER,
928 typename PATCHCOORD_BUFFER, typename PATCH_TABLE>
929 static bool EvalPatches(
930 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
931 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
932 DST_BUFFER *duBuffer, BufferDescriptor const &duDesc,
933 DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc,
934 DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc,
935 DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc,
936 DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc,
937 int numPatchCoords,
938 PATCHCOORD_BUFFER *patchCoords,
939 PATCH_TABLE *patchTable,
940 GLXFBEvaluator const *instance,
941 void * deviceContext = NULL) {
942
943 if (instance) {
944 return instance->EvalPatches(srcBuffer, srcDesc,
945 dstBuffer, dstDesc,
946 duBuffer, duDesc,
947 dvBuffer, dvDesc,
948 duuBuffer, duuDesc,
949 duvBuffer, duvDesc,
950 dvvBuffer, dvvDesc,
951 numPatchCoords, patchCoords,
952 patchTable);
953 } else {
954 // Create an instance on demand (slow)
955 (void)deviceContext; // unused
956 instance = Create(srcDesc, dstDesc,
957 duDesc, dvDesc,
958 duuDesc, duvDesc, dvvDesc);
959 if (instance) {
960 bool r = instance->EvalPatches(srcBuffer, srcDesc,
961 dstBuffer, dstDesc,
962 duBuffer, duDesc,
963 dvBuffer, dvDesc,
964 duuBuffer, duuDesc,
965 duvBuffer, duvDesc,
966 dvvBuffer, dvvDesc,
967 numPatchCoords, patchCoords,
968 patchTable);
969 delete instance;
970 return r;
971 }
972 return false;
973 }
974 }
975
1000 template <typename SRC_BUFFER, typename DST_BUFFER,
1001 typename PATCHCOORD_BUFFER, typename PATCH_TABLE>
1003 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
1004 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
1005 int numPatchCoords,
1006 PATCHCOORD_BUFFER *patchCoords,
1007 PATCH_TABLE *patchTable) const {
1008
1009 return EvalPatches(srcBuffer->BindVBO(), srcDesc,
1010 dstBuffer->BindVBO(), dstDesc,
1011 0, BufferDescriptor(),
1012 0, BufferDescriptor(),
1013 numPatchCoords,
1014 patchCoords->BindVBO(),
1015 patchTable->GetPatchArrays(),
1016 patchTable->GetPatchIndexTextureBuffer(),
1017 patchTable->GetPatchParamTextureBuffer());
1018 }
1019
1054 template <typename SRC_BUFFER, typename DST_BUFFER,
1055 typename PATCHCOORD_BUFFER, typename PATCH_TABLE>
1057 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
1058 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
1059 DST_BUFFER *duBuffer, BufferDescriptor const &duDesc,
1060 DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc,
1061 int numPatchCoords,
1062 PATCHCOORD_BUFFER *patchCoords,
1063 PATCH_TABLE *patchTable) const {
1064
1065 return EvalPatches(srcBuffer->BindVBO(), srcDesc,
1066 dstBuffer->BindVBO(), dstDesc,
1067 duBuffer->BindVBO(), duDesc,
1068 dvBuffer->BindVBO(), dvDesc,
1069 numPatchCoords,
1070 patchCoords->BindVBO(),
1071 patchTable->GetPatchArrays(),
1072 patchTable->GetPatchIndexTextureBuffer(),
1073 patchTable->GetPatchParamTextureBuffer());
1074 }
1075
1128 template <typename SRC_BUFFER, typename DST_BUFFER,
1129 typename PATCHCOORD_BUFFER, typename PATCH_TABLE>
1131 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
1132 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
1133 DST_BUFFER *duBuffer, BufferDescriptor const &duDesc,
1134 DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc,
1135 DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc,
1136 DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc,
1137 DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc,
1138 int numPatchCoords,
1139 PATCHCOORD_BUFFER *patchCoords,
1140 PATCH_TABLE *patchTable) const {
1141
1142 return EvalPatches(srcBuffer->BindVBO(), srcDesc,
1143 dstBuffer->BindVBO(), dstDesc,
1144 duBuffer->BindVBO(), duDesc,
1145 dvBuffer->BindVBO(), dvDesc,
1146 duuBuffer->BindVBO(), duuDesc,
1147 duvBuffer->BindVBO(), duvDesc,
1148 dvvBuffer->BindVBO(), dvvDesc,
1149 numPatchCoords,
1150 patchCoords->BindVBO(),
1151 patchTable->GetPatchArrays(),
1152 patchTable->GetPatchIndexTextureBuffer(),
1153 patchTable->GetPatchParamTextureBuffer());
1154 }
1155
1156 bool EvalPatches(ID srcBuffer, BufferDescriptor const &srcDesc,
1157 ID dstBuffer, BufferDescriptor const &dstDesc,
1158 ID duBuffer, BufferDescriptor const &duDesc,
1159 ID dvBuffer, BufferDescriptor const &dvDesc,
1160 int numPatchCoords,
1161 ID patchCoordsBuffer,
1162 const PatchArrayVector &patchArrays,
1163 ID patchIndexBuffer,
1164 ID patchParamsBuffer) const;
1165
1166 bool EvalPatches(ID srcBuffer, BufferDescriptor const &srcDesc,
1167 ID dstBuffer, BufferDescriptor const &dstDesc,
1168 ID duBuffer, BufferDescriptor const &duDesc,
1169 ID dvBuffer, BufferDescriptor const &dvDesc,
1170 ID duuBuffer, BufferDescriptor const &duuDesc,
1171 ID duvBuffer, BufferDescriptor const &duvDesc,
1172 ID dvvBuffer, BufferDescriptor const &dvvDesc,
1173 int numPatchCoords,
1174 ID patchCoordsBuffer,
1175 const PatchArrayVector &patchArrays,
1176 ID patchIndexBuffer,
1177 ID patchParamsBuffer) const;
1178
1211 template <typename SRC_BUFFER, typename DST_BUFFER,
1212 typename PATCHCOORD_BUFFER, typename PATCH_TABLE>
1214 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
1215 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
1216 int numPatchCoords,
1217 PATCHCOORD_BUFFER *patchCoords,
1218 PATCH_TABLE *patchTable,
1219 GLXFBEvaluator const *instance,
1220 void * deviceContext = NULL) {
1221
1222 if (instance) {
1223 return instance->EvalPatchesVarying(
1224 srcBuffer, srcDesc,
1225 dstBuffer, dstDesc,
1226 numPatchCoords, patchCoords,
1227 patchTable);
1228 } else {
1229 // Create an instance on demand (slow)
1230 (void)deviceContext; // unused
1231 instance = Create(srcDesc, dstDesc,
1234 if (instance) {
1235 bool r = instance->EvalPatchesVarying(
1236 srcBuffer, srcDesc,
1237 dstBuffer, dstDesc,
1238 numPatchCoords, patchCoords,
1239 patchTable);
1240 delete instance;
1241 return r;
1242 }
1243 return false;
1244 }
1245 }
1246
1271 template <typename SRC_BUFFER, typename DST_BUFFER,
1272 typename PATCHCOORD_BUFFER, typename PATCH_TABLE>
1274 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
1275 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
1276 int numPatchCoords,
1277 PATCHCOORD_BUFFER *patchCoords,
1278 PATCH_TABLE *patchTable) const {
1279
1280 return EvalPatches(srcBuffer->BindVBO(), srcDesc,
1281 dstBuffer->BindVBO(), dstDesc,
1282 0, BufferDescriptor(),
1283 0, BufferDescriptor(),
1284 numPatchCoords,
1285 patchCoords->BindVBO(),
1286 patchTable->GetVaryingPatchArrays(),
1287 patchTable->GetVaryingPatchIndexTextureBuffer(),
1288 patchTable->GetPatchParamTextureBuffer());
1289 }
1290
1335 template <typename SRC_BUFFER, typename DST_BUFFER,
1336 typename PATCHCOORD_BUFFER, typename PATCH_TABLE>
1338 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
1339 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
1340 DST_BUFFER *duBuffer, BufferDescriptor const &duDesc,
1341 DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc,
1342 int numPatchCoords,
1343 PATCHCOORD_BUFFER *patchCoords,
1344 PATCH_TABLE *patchTable,
1345 GLXFBEvaluator const *instance,
1346 void * deviceContext = NULL) {
1347
1348 if (instance) {
1349 return instance->EvalPatchesVarying(
1350 srcBuffer, srcDesc,
1351 dstBuffer, dstDesc,
1352 duBuffer, duDesc,
1353 dvBuffer, dvDesc,
1354 numPatchCoords, patchCoords,
1355 patchTable);
1356 } else {
1357 // Create an instance on demand (slow)
1358 (void)deviceContext; // unused
1359 instance = Create(srcDesc, dstDesc,
1360 duDesc, dvDesc);
1361 if (instance) {
1362 bool r = instance->EvalPatchesVarying(
1363 srcBuffer, srcDesc,
1364 dstBuffer, dstDesc,
1365 duBuffer, duDesc,
1366 dvBuffer, dvDesc,
1367 numPatchCoords, patchCoords,
1368 patchTable);
1369 delete instance;
1370 return r;
1371 }
1372 return false;
1373 }
1374 }
1375
1412 template <typename SRC_BUFFER, typename DST_BUFFER,
1413 typename PATCHCOORD_BUFFER, typename PATCH_TABLE>
1415 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
1416 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
1417 DST_BUFFER *duBuffer, BufferDescriptor const &duDesc,
1418 DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc,
1419 int numPatchCoords,
1420 PATCHCOORD_BUFFER *patchCoords,
1421 PATCH_TABLE *patchTable) const {
1422
1423 return EvalPatches(srcBuffer->BindVBO(), srcDesc,
1424 dstBuffer->BindVBO(), dstDesc,
1425 duBuffer->BindVBO(), duDesc,
1426 dvBuffer->BindVBO(), dvDesc,
1427 numPatchCoords,
1428 patchCoords->BindVBO(),
1429 patchTable->GetVaryingPatchArrays(),
1430 patchTable->GetVaryingPatchIndexTextureBuffer(),
1431 patchTable->GetPatchParamTextureBuffer());
1432 }
1433
1496 template <typename SRC_BUFFER, typename DST_BUFFER,
1497 typename PATCHCOORD_BUFFER, typename PATCH_TABLE>
1499 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
1500 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
1501 DST_BUFFER *duBuffer, BufferDescriptor const &duDesc,
1502 DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc,
1503 DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc,
1504 DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc,
1505 DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc,
1506 int numPatchCoords,
1507 PATCHCOORD_BUFFER *patchCoords,
1508 PATCH_TABLE *patchTable,
1509 GLXFBEvaluator const *instance,
1510 void * deviceContext = NULL) {
1511
1512 if (instance) {
1513 return instance->EvalPatchesVarying(
1514 srcBuffer, srcDesc,
1515 dstBuffer, dstDesc,
1516 duBuffer, duDesc,
1517 dvBuffer, dvDesc,
1518 duuBuffer, duuDesc,
1519 duvBuffer, duvDesc,
1520 dvvBuffer, dvvDesc,
1521 numPatchCoords, patchCoords,
1522 patchTable);
1523 } else {
1524 // Create an instance on demand (slow)
1525 (void)deviceContext; // unused
1526 instance = Create(srcDesc, dstDesc,
1527 duDesc, dvDesc,
1528 duuDesc, duvDesc, dvvDesc);
1529 if (instance) {
1530 bool r = instance->EvalPatchesVarying(
1531 srcBuffer, srcDesc,
1532 dstBuffer, dstDesc,
1533 duBuffer, duDesc,
1534 dvBuffer, dvDesc,
1535 duuBuffer, duuDesc,
1536 duvBuffer, duvDesc,
1537 dvvBuffer, dvvDesc,
1538 numPatchCoords, patchCoords,
1539 patchTable);
1540 delete instance;
1541 return r;
1542 }
1543 return false;
1544 }
1545 }
1546
1601 template <typename SRC_BUFFER, typename DST_BUFFER,
1602 typename PATCHCOORD_BUFFER, typename PATCH_TABLE>
1604 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
1605 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
1606 DST_BUFFER *duBuffer, BufferDescriptor const &duDesc,
1607 DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc,
1608 DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc,
1609 DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc,
1610 DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc,
1611 int numPatchCoords,
1612 PATCHCOORD_BUFFER *patchCoords,
1613 PATCH_TABLE *patchTable) const {
1614
1615 return EvalPatches(srcBuffer->BindVBO(), srcDesc,
1616 dstBuffer->BindVBO(), dstDesc,
1617 duBuffer->BindVBO(), duDesc,
1618 dvBuffer->BindVBO(), dvDesc,
1619 duuBuffer->BindVBO(), duuDesc,
1620 duvBuffer->BindVBO(), duvDesc,
1621 dvvBuffer->BindVBO(), dvvDesc,
1622 numPatchCoords,
1623 patchCoords->BindVBO(),
1624 patchTable->GetVaryingPatchArrays(),
1625 patchTable->GetVaryingPatchIndexTextureBuffer(),
1626 patchTable->GetPatchParamTextureBuffer());
1627 }
1628
1663 template <typename SRC_BUFFER, typename DST_BUFFER,
1664 typename PATCHCOORD_BUFFER, typename PATCH_TABLE>
1666 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
1667 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
1668 int numPatchCoords,
1669 PATCHCOORD_BUFFER *patchCoords,
1670 PATCH_TABLE *patchTable,
1671 int fvarChannel,
1672 GLXFBEvaluator const *instance,
1673 void * deviceContext = NULL) {
1674
1675 if (instance) {
1676 return instance->EvalPatchesFaceVarying(
1677 srcBuffer, srcDesc,
1678 dstBuffer, dstDesc,
1679 numPatchCoords, patchCoords,
1680 patchTable, fvarChannel);
1681 } else {
1682 // Create an instance on demand (slow)
1683 (void)deviceContext; // unused
1684 instance = Create(srcDesc, dstDesc,
1687 if (instance) {
1688 bool r = instance->EvalPatchesFaceVarying(
1689 srcBuffer, srcDesc,
1690 dstBuffer, dstDesc,
1691 numPatchCoords, patchCoords,
1692 patchTable, fvarChannel);
1693 delete instance;
1694 return r;
1695 }
1696 return false;
1697 }
1698 }
1699
1726 template <typename SRC_BUFFER, typename DST_BUFFER,
1727 typename PATCHCOORD_BUFFER, typename PATCH_TABLE>
1729 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
1730 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
1731 int numPatchCoords,
1732 PATCHCOORD_BUFFER *patchCoords,
1733 PATCH_TABLE *patchTable,
1734 int fvarChannel = 0) const {
1735
1736 return EvalPatches(srcBuffer->BindVBO(), srcDesc,
1737 dstBuffer->BindVBO(), dstDesc,
1738 0, BufferDescriptor(),
1739 0, BufferDescriptor(),
1740 numPatchCoords,
1741 patchCoords->BindVBO(),
1742 patchTable->GetFVarPatchArrays(fvarChannel),
1743 patchTable->GetFVarPatchIndexTextureBuffer(fvarChannel),
1744 patchTable->GetFVarPatchParamTextureBuffer(fvarChannel));
1745 }
1746
1793 template <typename SRC_BUFFER, typename DST_BUFFER,
1794 typename PATCHCOORD_BUFFER, typename PATCH_TABLE>
1796 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
1797 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
1798 DST_BUFFER *duBuffer, BufferDescriptor const &duDesc,
1799 DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc,
1800 int numPatchCoords,
1801 PATCHCOORD_BUFFER *patchCoords,
1802 PATCH_TABLE *patchTable,
1803 int fvarChannel,
1804 GLXFBEvaluator const *instance,
1805 void * deviceContext = NULL) {
1806
1807 if (instance) {
1808 return instance->EvalPatchesFaceVarying(
1809 srcBuffer, srcDesc,
1810 dstBuffer, dstDesc,
1811 duBuffer, duDesc,
1812 dvBuffer, dvDesc,
1813 numPatchCoords, patchCoords,
1814 patchTable, fvarChannel);
1815 } else {
1816 // Create an instance on demand (slow)
1817 (void)deviceContext; // unused
1818 instance = Create(srcDesc, dstDesc,
1819 duDesc, dvDesc);
1820 if (instance) {
1821 bool r = instance->EvalPatchesFaceVarying(
1822 srcBuffer, srcDesc,
1823 dstBuffer, dstDesc,
1824 duBuffer, duDesc,
1825 dvBuffer, dvDesc,
1826 numPatchCoords, patchCoords,
1827 patchTable, fvarChannel);
1828 delete instance;
1829 return r;
1830 }
1831 return false;
1832 }
1833 }
1834
1873 template <typename SRC_BUFFER, typename DST_BUFFER,
1874 typename PATCHCOORD_BUFFER, typename PATCH_TABLE>
1876 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
1877 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
1878 DST_BUFFER *duBuffer, BufferDescriptor const &duDesc,
1879 DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc,
1880 int numPatchCoords,
1881 PATCHCOORD_BUFFER *patchCoords,
1882 PATCH_TABLE *patchTable,
1883 int fvarChannel = 0) const {
1884
1885 return EvalPatches(srcBuffer->BindVBO(), srcDesc,
1886 dstBuffer->BindVBO(), dstDesc,
1887 duBuffer->BindVBO(), duDesc,
1888 dvBuffer->BindVBO(), dvDesc,
1889 numPatchCoords,
1890 patchCoords->BindVBO(),
1891 patchTable->GetFVarPatchArrays(fvarChannel),
1892 patchTable->GetFVarPatchIndexTextureBuffer(fvarChannel),
1893 patchTable->GetFVarPatchParamTextureBuffer(fvarChannel));
1894 }
1895
1960 template <typename SRC_BUFFER, typename DST_BUFFER,
1961 typename PATCHCOORD_BUFFER, typename PATCH_TABLE>
1963 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
1964 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
1965 DST_BUFFER *duBuffer, BufferDescriptor const &duDesc,
1966 DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc,
1967 DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc,
1968 DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc,
1969 DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc,
1970 int numPatchCoords,
1971 PATCHCOORD_BUFFER *patchCoords,
1972 PATCH_TABLE *patchTable,
1973 int fvarChannel,
1974 GLXFBEvaluator const *instance,
1975 void * deviceContext = NULL) {
1976
1977 if (instance) {
1978 return instance->EvalPatchesFaceVarying(
1979 srcBuffer, srcDesc,
1980 dstBuffer, dstDesc,
1981 duBuffer, duDesc,
1982 dvBuffer, dvDesc,
1983 duuBuffer, duuDesc,
1984 duvBuffer, duvDesc,
1985 dvvBuffer, dvvDesc,
1986 numPatchCoords, patchCoords,
1987 patchTable, fvarChannel);
1988 } else {
1989 // Create an instance on demand (slow)
1990 (void)deviceContext; // unused
1991 instance = Create(srcDesc, dstDesc,
1992 duDesc, dvDesc,
1993 duuDesc, duvDesc, dvvDesc);
1994 if (instance) {
1995 bool r = instance->EvalPatchesFaceVarying(
1996 srcBuffer, srcDesc,
1997 dstBuffer, dstDesc,
1998 duBuffer, duDesc,
1999 dvBuffer, dvDesc,
2000 duuBuffer, duuDesc,
2001 duvBuffer, duvDesc,
2002 dvvBuffer, dvvDesc,
2003 numPatchCoords, patchCoords,
2004 patchTable, fvarChannel);
2005 delete instance;
2006 return r;
2007 }
2008 return false;
2009 }
2010 }
2011
2068 template <typename SRC_BUFFER, typename DST_BUFFER,
2069 typename PATCHCOORD_BUFFER, typename PATCH_TABLE>
2071 SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc,
2072 DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc,
2073 DST_BUFFER *duBuffer, BufferDescriptor const &duDesc,
2074 DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc,
2075 DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc,
2076 DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc,
2077 DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc,
2078 int numPatchCoords,
2079 PATCHCOORD_BUFFER *patchCoords,
2080 PATCH_TABLE *patchTable,
2081 int fvarChannel = 0) const {
2082
2083 return EvalPatches(srcBuffer->BindVBO(), srcDesc,
2084 dstBuffer->BindVBO(), dstDesc,
2085 duBuffer->BindVBO(), duDesc,
2086 dvBuffer->BindVBO(), dvDesc,
2087 duuBuffer->BindVBO(), duuDesc,
2088 duvBuffer->BindVBO(), duvDesc,
2089 dvvBuffer->BindVBO(), dvvDesc,
2090 numPatchCoords,
2091 patchCoords->BindVBO(),
2092 patchTable->GetFVarPatchArrays(fvarChannel),
2093 patchTable->GetFVarPatchIndexTextureBuffer(fvarChannel),
2094 patchTable->GetFVarPatchParamTextureBuffer(fvarChannel));
2095 }
2096
2102
2105 bool Compile(BufferDescriptor const &srcDesc,
2106 BufferDescriptor const &dstDesc,
2107 BufferDescriptor const &duDesc = BufferDescriptor(),
2108 BufferDescriptor const &dvDesc = BufferDescriptor(),
2109 BufferDescriptor const &duuDesc = BufferDescriptor(),
2110 BufferDescriptor const &duvDesc = BufferDescriptor(),
2111 BufferDescriptor const &dvvDesc = BufferDescriptor());
2112
2114 static void Synchronize(void *kernel);
2115
2116private:
2117 ID _srcBufferTexture;
2118 ID _patchArraysUBO;
2119 bool _interleavedDerivativeBuffers;
2120
2121 struct _StencilKernel {
2122 _StencilKernel();
2123 ~_StencilKernel();
2124 bool Compile(BufferDescriptor const &srcDesc,
2125 BufferDescriptor const &dstDesc,
2126 BufferDescriptor const &duDesc,
2127 BufferDescriptor const &dvDesc,
2128 BufferDescriptor const &duuDesc,
2129 BufferDescriptor const &duvDesc,
2130 BufferDescriptor const &dvvDesc,
2131 bool interleavedDerivativeBuffers);
2132 ID program;
2133 LOCATION uniformSrcBufferTexture;
2134 LOCATION uniformSrcOffset; // src buffer offset (in elements)
2135
2136 LOCATION uniformSizesTexture;
2137 LOCATION uniformOffsetsTexture;
2138 LOCATION uniformIndicesTexture;
2139 LOCATION uniformWeightsTexture;
2140 LOCATION uniformDuWeightsTexture;
2141 LOCATION uniformDvWeightsTexture;
2142 LOCATION uniformDuuWeightsTexture;
2143 LOCATION uniformDuvWeightsTexture;
2144 LOCATION uniformDvvWeightsTexture;
2145 LOCATION uniformStart; // range
2146 LOCATION uniformEnd;
2147 } _stencilKernel;
2148
2149 struct _PatchKernel {
2150 _PatchKernel();
2151 ~_PatchKernel();
2152 bool Compile(BufferDescriptor const &srcDesc,
2153 BufferDescriptor const &dstDesc,
2154 BufferDescriptor const &duDesc,
2155 BufferDescriptor const &dvDesc,
2156 BufferDescriptor const &duuDesc,
2157 BufferDescriptor const &duvDesc,
2158 BufferDescriptor const &dvvDesc,
2159 bool interleavedDerivativeBuffers);
2160 ID program;
2161 LOCATION uniformSrcBufferTexture;
2162 LOCATION uniformSrcOffset; // src buffer offset (in elements)
2163
2164 LOCATION uniformPatchArraysUBOBinding;
2165 LOCATION uniformPatchParamTexture;
2166 LOCATION uniformPatchIndexTexture;
2167 } _patchKernel;
2168
2169};
2170
2171} // end namespace Osd
2172
2173} // end namespace OPENSUBDIV_VERSION
2174using namespace OPENSUBDIV_VERSION;
2175
2176} // end namespace OpenSubdiv
2177
2178
2179#endif // OPENSUBDIV3_OSD_GL_XFB_EVALUATOR_H
std::vector< PatchArray > PatchArrayVector
Definition types.h:115
Stencil table class wrapping the template for compatibility.
Limit stencil table class wrapping the template for compatibility.
BufferDescriptor is a struct which describes buffer elements in interleaved data buffers....
static GLStencilTableTBO * Create(Far::StencilTable const *stencilTable, void *deviceContext=NULL)
GLStencilTableTBO(Far::StencilTable const *stencilTable)
GLStencilTableTBO(Far::LimitStencilTable const *limitStencilTable)
static GLStencilTableTBO * Create(Far::LimitStencilTable const *limitStencilTable, void *deviceContext=NULL)
bool EvalPatchesVarying(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, int numPatchCoords, PATCHCOORD_BUFFER *patchCoords, PATCH_TABLE *patchTable) const
Generic limit eval function. This function has a same signature as other device kernels have so that ...
static GLXFBEvaluator * Create(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc, BufferDescriptor const &dvDesc, bool interleavedDerivativeBuffers=false)
bool EvalStencils(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, STENCIL_TABLE const *stencilTable) const
Generic stencil function.
GLXFBEvaluator(bool interleavedDerivativeBuffers=false)
Constructor.
bool EvalStencils(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, STENCIL_TABLE const *stencilTable) const
Generic stencil function.
static bool EvalStencils(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, STENCIL_TABLE const *stencilTable, GLXFBEvaluator const *instance, void *deviceContext=NULL)
Generic static stencil function. This function has a same signature as other device kernels have so t...
bool EvalPatches(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, DST_BUFFER *dvvBuffer, 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...
bool EvalStencils(ID srcBuffer, BufferDescriptor const &srcDesc, ID dstBuffer, BufferDescriptor const &dstDesc, ID duBuffer, BufferDescriptor const &duDesc, ID dvBuffer, BufferDescriptor const &dvDesc, ID sizesBuffer, ID offsetsBuffer, ID indicesBuffer, ID weightsBuffer, ID duWeightsBuffer, ID dvWeightsBuffer, int start, int end) const
Dispatch the GLSL XFB kernel on on GPU asynchronously returns false if the kernel hasn't been compile...
static GLXFBEvaluator * Create(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc, BufferDescriptor const &dvDesc, BufferDescriptor const &duuDesc, BufferDescriptor const &duvDesc, BufferDescriptor const &dvvDesc, bool interleavedDerivativeBuffers=false)
static GLXFBEvaluator * Create(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc, BufferDescriptor const &dvDesc, void *deviceContext)
Specialization to allow creation without a device context.
static bool EvalStencils(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, STENCIL_TABLE const *stencilTable, GLXFBEvaluator const *instance, void *deviceContext=NULL)
Generic static stencil function. This function has a same signature as other device kernels have so t...
static bool EvalPatchesVarying(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, int numPatchCoords, PATCHCOORD_BUFFER *patchCoords, PATCH_TABLE *patchTable, GLXFBEvaluator 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, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, int numPatchCoords, PATCHCOORD_BUFFER *patchCoords, PATCH_TABLE *patchTable, GLXFBEvaluator const *instance, void *deviceContext=NULL)
Generic limit eval function. This function has a same signature as other device kernels have so that ...
static GLXFBEvaluator * Create(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc, BufferDescriptor const &dvDesc, BufferDescriptor const &duuDesc, BufferDescriptor const &duvDesc, BufferDescriptor const &dvvDesc, DEVICE_CONTEXT deviceContext)
Generic creator template.
static GLXFBEvaluator * Create(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc, BufferDescriptor const &dvDesc, DEVICE_CONTEXT deviceContext)
Generic creator template.
static void Synchronize(void *kernel)
Wait the dispatched kernel finishes.
static bool EvalPatchesVarying(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, int numPatchCoords, PATCHCOORD_BUFFER *patchCoords, PATCH_TABLE *patchTable, GLXFBEvaluator 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, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, DST_BUFFER *dvvBuffer, 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 EvalPatchesFaceVarying(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, int numPatchCoords, PATCHCOORD_BUFFER *patchCoords, PATCH_TABLE *patchTable, int fvarChannel=0) const
Generic limit eval function. This function has a same signature as other device kernels have so that ...
static bool EvalPatches(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, int numPatchCoords, PATCHCOORD_BUFFER *patchCoords, PATCH_TABLE *patchTable, GLXFBEvaluator const *instance, void *deviceContext=NULL)
Generic limit eval function. This function has a same signature as other device kernels have so that ...
bool EvalPatches(ID srcBuffer, BufferDescriptor const &srcDesc, ID dstBuffer, BufferDescriptor const &dstDesc, ID duBuffer, BufferDescriptor const &duDesc, ID dvBuffer, BufferDescriptor const &dvDesc, int numPatchCoords, ID patchCoordsBuffer, const PatchArrayVector &patchArrays, ID patchIndexBuffer, ID patchParamsBuffer) const
static bool EvalPatchesFaceVarying(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, int numPatchCoords, PATCHCOORD_BUFFER *patchCoords, PATCH_TABLE *patchTable, int fvarChannel, GLXFBEvaluator const *instance, void *deviceContext=NULL)
Generic limit eval function. This function has a same signature as other device kernels have so that ...
bool EvalPatches(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, int numPatchCoords, PATCHCOORD_BUFFER *patchCoords, PATCH_TABLE *patchTable) const
Generic limit eval function. This function has a same signature as other device kernels have so that ...
bool EvalPatches(ID srcBuffer, BufferDescriptor const &srcDesc, ID dstBuffer, BufferDescriptor const &dstDesc, ID duBuffer, BufferDescriptor const &duDesc, ID dvBuffer, BufferDescriptor const &dvDesc, ID duuBuffer, BufferDescriptor const &duuDesc, ID duvBuffer, BufferDescriptor const &duvDesc, ID dvvBuffer, BufferDescriptor const &dvvDesc, int numPatchCoords, ID patchCoordsBuffer, const PatchArrayVector &patchArrays, ID patchIndexBuffer, ID patchParamsBuffer) const
static bool EvalPatches(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, int numPatchCoords, PATCHCOORD_BUFFER *patchCoords, PATCH_TABLE *patchTable, GLXFBEvaluator const *instance, void *deviceContext=NULL)
Generic limit eval function. This function has a same signature as other device kernels have so that ...
bool EvalStencils(ID srcBuffer, BufferDescriptor const &srcDesc, ID dstBuffer, BufferDescriptor const &dstDesc, ID duBuffer, BufferDescriptor const &duDesc, ID dvBuffer, BufferDescriptor const &dvDesc, ID duuBuffer, BufferDescriptor const &duuDesc, ID duvBuffer, BufferDescriptor const &duvDesc, ID dvvBuffer, BufferDescriptor const &dvvDesc, ID sizesBuffer, ID offsetsBuffer, ID indicesBuffer, ID weightsBuffer, ID duWeightsBuffer, ID dvWeightsBuffer, ID duuWeightsBuffer, ID duvWeightsBuffer, ID dvvWeightsBuffer, int start, int end) const
Dispatch the GLSL XFB kernel on on GPU asynchronously returns false if the kernel hasn't been compile...
bool EvalPatches(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, int numPatchCoords, PATCHCOORD_BUFFER *patchCoords, PATCH_TABLE *patchTable) const
Generic limit eval function with derivatives. This function has a same signature as other device kern...
bool EvalStencils(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, STENCIL_TABLE const *stencilTable) const
Generic stencil function.
static GLXFBEvaluator * Create(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc, BufferDescriptor const &dvDesc, BufferDescriptor const &duuDesc, BufferDescriptor const &duvDesc, BufferDescriptor const &dvvDesc, void *deviceContext)
Specialization to allow creation without a device context.
bool EvalPatchesFaceVarying(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, DST_BUFFER *dvvBuffer, 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 EvalPatchesVarying(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, int numPatchCoords, PATCHCOORD_BUFFER *patchCoords, PATCH_TABLE *patchTable, GLXFBEvaluator 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, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, int numPatchCoords, PATCHCOORD_BUFFER *patchCoords, PATCH_TABLE *patchTable, int fvarChannel, GLXFBEvaluator 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, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, STENCIL_TABLE const *stencilTable, GLXFBEvaluator const *instance, void *deviceContext=NULL)
Generic static stencil function. This function has a same signature as other device kernels have so t...
~GLXFBEvaluator()
Destructor. note that the GL context must be made current.
bool Compile(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc=BufferDescriptor(), BufferDescriptor const &dvDesc=BufferDescriptor(), BufferDescriptor const &duuDesc=BufferDescriptor(), BufferDescriptor const &duvDesc=BufferDescriptor(), BufferDescriptor const &dvvDesc=BufferDescriptor())
bool EvalPatchesVarying(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, int numPatchCoords, PATCHCOORD_BUFFER *patchCoords, PATCH_TABLE *patchTable) const
Generic limit eval function. This function has a same signature as other device kernels have so that ...
bool EvalPatchesFaceVarying(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, int numPatchCoords, PATCHCOORD_BUFFER *patchCoords, PATCH_TABLE *patchTable, int fvarChannel=0) const
Generic limit eval function. This function has a same signature as other device kernels have so that ...
static bool EvalPatchesFaceVarying(SRC_BUFFER *srcBuffer, BufferDescriptor const &srcDesc, DST_BUFFER *dstBuffer, BufferDescriptor const &dstDesc, DST_BUFFER *duBuffer, BufferDescriptor const &duDesc, DST_BUFFER *dvBuffer, BufferDescriptor const &dvDesc, DST_BUFFER *duuBuffer, BufferDescriptor const &duuDesc, DST_BUFFER *duvBuffer, BufferDescriptor const &duvDesc, DST_BUFFER *dvvBuffer, BufferDescriptor const &dvvDesc, int numPatchCoords, PATCHCOORD_BUFFER *patchCoords, PATCH_TABLE *patchTable, int fvarChannel, GLXFBEvaluator const *instance, void *deviceContext=NULL)
Generic limit eval function. This function has a same signature as other device kernels have so that ...