[Bf-blender-cvs] [ca3a96c2436] master: OpenSubdiv: Use more generic access to patch coordinates
Sergey Sharybin
noreply at git.blender.org
Wed Oct 30 15:18:04 CET 2019
Commit: ca3a96c24365991ed46b5e0109a29a0293a44aaf
Author: Sergey Sharybin
Date: Wed Oct 16 14:17:12 2019 +0200
Branches: master
https://developer.blender.org/rBca3a96c24365991ed46b5e0109a29a0293a44aaf
OpenSubdiv: Use more generic access to patch coordinates
Saves another unnecessary temporary data copy during evaluation.
===================================================================
M intern/opensubdiv/internal/opensubdiv_evaluator_internal.cc
===================================================================
diff --git a/intern/opensubdiv/internal/opensubdiv_evaluator_internal.cc b/intern/opensubdiv/internal/opensubdiv_evaluator_internal.cc
index 0777dab24e6..a88193c30cc 100644
--- a/intern/opensubdiv/internal/opensubdiv_evaluator_internal.cc
+++ b/intern/opensubdiv/internal/opensubdiv_evaluator_internal.cc
@@ -58,54 +58,47 @@ namespace opensubdiv_capi {
namespace {
-// Helper class to wrap single of patch coord into a buffer. Used to pass
-// coordinates to the CPU evaluator. Other evaluators are not supported.
-class SinglePatchCoordBuffer {
+// Buffer which implements API required by OpenSubdiv and uses an existing memory as an underlying
+// storage.
+template<typename T> class RawDataWrapperBuffer {
public:
- SinglePatchCoordBuffer()
+ RawDataWrapperBuffer(T *data) : data_(data)
{
}
- explicit SinglePatchCoordBuffer(const PatchCoord &patch_coord) : patch_coord_(patch_coord)
+ T *BindCpuBuffer()
{
+ return data_;
}
- PatchCoord *BindCpuBuffer()
- {
- return &patch_coord_;
- }
+ // TODO(sergey): Support UpdateData().
- int GetNumVertices()
+ protected:
+ T *data_;
+};
+
+template<typename T> class RawDataWrapperVertexBuffer : public RawDataWrapperBuffer<T> {
+ public:
+ RawDataWrapperVertexBuffer(T *data, int num_vertices)
+ : RawDataWrapperBuffer<T>(data), num_vertices_(num_vertices)
{
- return 1;
}
- void UpdateData(const PatchCoord &patch_coord)
+ int GetNumVertices()
{
- patch_coord_ = patch_coord;
+ return num_vertices_;
}
protected:
- PatchCoord patch_coord_;
+ int num_vertices_;
};
-// Buffer which implements API required by OpenSubdiv and uses an existing memory as an underlying
-// storage.
-template<typename T> class RawDataWrapperBuffer {
+class ConstPatchCoordWrapperBuffer : public RawDataWrapperVertexBuffer<const PatchCoord> {
public:
- RawDataWrapperBuffer(T *data) : data_(data)
+ ConstPatchCoordWrapperBuffer(const PatchCoord *data, int num_vertices)
+ : RawDataWrapperVertexBuffer(data, num_vertices)
{
}
-
- T *BindCpuBuffer()
- {
- return data_;
- }
-
- // TODO(sergey): Support UpdateData().
-
- protected:
- T *data_;
};
template<typename EVAL_VERTEX_BUFFER,
@@ -170,7 +163,7 @@ class FaceVaryingVolatileEval {
{
RawDataWrapperBuffer<float> face_varying_data(face_varying);
BufferDescriptor face_varying_desc(0, 2, 2);
- SinglePatchCoordBuffer patch_coord_buffer(patch_coord);
+ ConstPatchCoordWrapperBuffer patch_coord_buffer(&patch_coord, 1);
const EVALUATOR *eval_instance = OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(
evaluator_cache_, src_face_varying_desc_, face_varying_desc, device_context_);
EVALUATOR::EvalPatchesFaceVarying(src_face_varying_data_,
@@ -349,7 +342,7 @@ class VolatileEvalOutput {
RawDataWrapperBuffer<float> P_data(P);
// TODO(sergey): Support interleaved vertex-varying data.
BufferDescriptor P_desc(0, 3, 3);
- SinglePatchCoordBuffer patch_coord_buffer(patch_coord);
+ ConstPatchCoordWrapperBuffer patch_coord_buffer(&patch_coord, 1);
const EVALUATOR *eval_instance = OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(
evaluator_cache_, src_desc_, P_desc, device_context_);
EVALUATOR::EvalPatches(src_data_,
@@ -375,7 +368,7 @@ class VolatileEvalOutput {
// TODO(sergey): Support interleaved vertex-varying data.
BufferDescriptor P_desc(0, 3, 3);
BufferDescriptor dpDu_desc(0, 3, 3), pPdv_desc(0, 3, 3);
- SinglePatchCoordBuffer patch_coord_buffer(patch_coord);
+ ConstPatchCoordWrapperBuffer patch_coord_buffer(&patch_coord, 1);
const EVALUATOR *eval_instance = OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(
evaluator_cache_, src_desc_, P_desc, dpDu_desc, pPdv_desc, device_context_);
EVALUATOR::EvalPatches(src_data_,
@@ -397,7 +390,7 @@ class VolatileEvalOutput {
{
RawDataWrapperBuffer<float> varying_data(varying);
BufferDescriptor varying_desc(3, 3, 6);
- SinglePatchCoordBuffer patch_coord_buffer(patch_coord);
+ ConstPatchCoordWrapperBuffer patch_coord_buffer(&patch_coord, 1);
const EVALUATOR *eval_instance = OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(
evaluator_cache_, src_varying_desc_, varying_desc, device_context_);
EVALUATOR::EvalPatchesVarying(src_varying_data_,
More information about the Bf-blender-cvs
mailing list