Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/opensubdiv/opensubdiv_evaluator_capi.h')
-rw-r--r--intern/opensubdiv/opensubdiv_evaluator_capi.h101
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