diff options
Diffstat (limited to 'intern/opensubdiv/opensubdiv_evaluator_capi.h')
-rw-r--r-- | intern/opensubdiv/opensubdiv_evaluator_capi.h | 101 |
1 files changed, 100 insertions, 1 deletions
diff --git a/intern/opensubdiv/opensubdiv_evaluator_capi.h b/intern/opensubdiv/opensubdiv_evaluator_capi.h index b860ae8db2e..1afd3e966f6 100644 --- a/intern/opensubdiv/opensubdiv_evaluator_capi.h +++ b/intern/opensubdiv/opensubdiv_evaluator_capi.h @@ -19,6 +19,10 @@ #ifndef OPENSUBDIV_EVALUATOR_CAPI_H_ #define OPENSUBDIV_EVALUATOR_CAPI_H_ +#include <stdint.h> // for uint64_t + +#include "opensubdiv_capi_type.h" + #ifdef __cplusplus extern "C" { #endif @@ -27,6 +31,38 @@ struct OpenSubdiv_EvaluatorInternal; struct OpenSubdiv_PatchCoord; struct OpenSubdiv_TopologyRefiner; +// Callback type for doing input/output operations on buffers. +// Useful to abstract GPU buffers. +typedef struct OpenSubdiv_Buffer { + // Bind the buffer to the GPU. + void (*bind_gpu)(const struct OpenSubdiv_Buffer *buffer); + + // Allocate the buffer directly on the host for the given size in bytes. This has to return + // a pointer to the newly allocated memory. + void *(*alloc)(const struct OpenSubdiv_Buffer *buffer, const unsigned int size); + + // Allocate the buffer directly on the device for the given size in bytes. + void (*device_alloc)(const struct OpenSubdiv_Buffer *buffer, const unsigned int size); + + // Update the given range of the buffer with new data. + void (*device_update)(const struct OpenSubdiv_Buffer *buffer, + unsigned int start, + unsigned int len, + const void *data); + + // Wrap an existing GPU buffer, given its device handle, into the client's buffer type for + // read-only use. + void (*wrap_device_handle)(const struct OpenSubdiv_Buffer *buffer, uint64_t device_ptr); + + // Offset in the buffer where the data starts, if a single buffer is used for multiple data + // channels. + int buffer_offset; + + // Pointer to the client buffer data, which is modified or initialized through the various + // callbacks. + void *data; +} OpenSubdiv_Buffer; + typedef struct OpenSubdiv_Evaluator { // Set coarse positions from a continuous array of coordinates. void (*setCoarsePositions)(struct OpenSubdiv_Evaluator *evaluator, @@ -122,15 +158,78 @@ typedef struct OpenSubdiv_Evaluator { float *dPdu, float *dPdv); + // Copy the patch map to the given buffers, and output some topology information. + void (*getPatchMap)(struct OpenSubdiv_Evaluator *evaluator, + struct OpenSubdiv_Buffer *patch_map_handles, + struct OpenSubdiv_Buffer *patch_map_quadtree, + int *min_patch_face, + int *max_patch_face, + int *max_depth, + int *patches_are_triangular); + + // Fill the given buffer with data from the evaluator's patch array buffer. + void (*fillPatchArraysBuffer)(struct OpenSubdiv_Evaluator *evaluator, + struct OpenSubdiv_Buffer *patch_array_buffer); + + // Fill the given buffer with data from the evaluator's patch index buffer. + void (*wrapPatchIndexBuffer)(struct OpenSubdiv_Evaluator *evaluator, + struct OpenSubdiv_Buffer *patch_index_buffer); + + // Fill the given buffer with data from the evaluator's patch parameter buffer. + void (*wrapPatchParamBuffer)(struct OpenSubdiv_Evaluator *evaluator, + struct OpenSubdiv_Buffer *patch_param_buffer); + + // Fill the given buffer with data from the evaluator's source buffer. + void (*wrapSrcBuffer)(struct OpenSubdiv_Evaluator *evaluator, + struct OpenSubdiv_Buffer *src_buffer); + + // Fill the given buffer with data from the evaluator's face varying patch array buffer. + void (*fillFVarPatchArraysBuffer)(struct OpenSubdiv_Evaluator *evaluator, + const int face_varying_channel, + struct OpenSubdiv_Buffer *patch_array_buffer); + + // Fill the given buffer with data from the evaluator's face varying patch index buffer. + void (*wrapFVarPatchIndexBuffer)(struct OpenSubdiv_Evaluator *evaluator, + const int face_varying_channel, + struct OpenSubdiv_Buffer *patch_index_buffer); + + // Fill the given buffer with data from the evaluator's face varying patch parameter buffer. + void (*wrapFVarPatchParamBuffer)(struct OpenSubdiv_Evaluator *evaluator, + const int face_varying_channel, + struct OpenSubdiv_Buffer *patch_param_buffer); + + // Fill the given buffer with data from the evaluator's face varying source buffer. + void (*wrapFVarSrcBuffer)(struct OpenSubdiv_Evaluator *evaluator, + const int face_varying_channel, + struct OpenSubdiv_Buffer *src_buffer); + // Implementation of the evaluator. struct OpenSubdiv_EvaluatorImpl *impl; + + // Type of the evaluator. + eOpenSubdivEvaluator type; } OpenSubdiv_Evaluator; +typedef struct OpenSubdiv_EvaluatorCache { + // Implementation of the evaluator cache. + struct OpenSubdiv_EvaluatorCacheImpl *impl; +} OpenSubdiv_EvaluatorCache; + OpenSubdiv_Evaluator *openSubdiv_createEvaluatorFromTopologyRefiner( - struct OpenSubdiv_TopologyRefiner *topology_refiner); + struct OpenSubdiv_TopologyRefiner *topology_refiner, + eOpenSubdivEvaluator evaluator_type, + OpenSubdiv_EvaluatorCache *evaluator_cache); void openSubdiv_deleteEvaluator(OpenSubdiv_Evaluator *evaluator); +OpenSubdiv_EvaluatorCache *openSubdiv_createEvaluatorCache(eOpenSubdivEvaluator evaluator_type); + +void openSubdiv_deleteEvaluatorCache(OpenSubdiv_EvaluatorCache *evaluator_cache); + +// Return the GLSL source code from the OpenSubDiv library used for patch evaluation. +// This function is not thread-safe. +const char *openSubdiv_getGLSLPatchBasisSource(void); + #ifdef __cplusplus } #endif |