2013-09-11 23:05:14 +00:00
|
|
|
//
|
2013-09-26 19:04:57 +00:00
|
|
|
// Copyright 2013 Pixar
|
2013-09-11 23:05:14 +00:00
|
|
|
//
|
2013-09-26 19:04:57 +00:00
|
|
|
// Licensed under the Apache License, Version 2.0 (the "Apache License")
|
|
|
|
// with the following modification; you may not use this file except in
|
|
|
|
// compliance with the Apache License and the following modification to it:
|
|
|
|
// Section 6. Trademarks. is deleted and replaced with:
|
2013-09-11 23:05:14 +00:00
|
|
|
//
|
2013-09-26 19:04:57 +00:00
|
|
|
// 6. Trademarks. This License does not grant permission to use the trade
|
|
|
|
// names, trademarks, service marks, or product names of the Licensor
|
|
|
|
// and its affiliates, except as required to comply with Section 4(c) of
|
|
|
|
// the License and to reproduce the content of the NOTICE file.
|
2013-09-11 23:05:14 +00:00
|
|
|
//
|
2013-09-26 19:04:57 +00:00
|
|
|
// You may obtain a copy of the Apache License at
|
2013-09-11 23:05:14 +00:00
|
|
|
//
|
2013-09-26 19:04:57 +00:00
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
2013-09-11 23:05:14 +00:00
|
|
|
//
|
2013-09-26 19:04:57 +00:00
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the Apache License with the above modification is
|
|
|
|
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
|
|
// KIND, either express or implied. See the Apache License for the specific
|
|
|
|
// language governing permissions and limitations under the Apache License.
|
2013-09-11 23:05:14 +00:00
|
|
|
//
|
|
|
|
|
|
|
|
#ifndef FAR_TBB_EVALSTENCILS_CONTROLLER_H
|
|
|
|
#define FAR_TBB_EVALSTENCILS_CONTROLLER_H
|
|
|
|
|
|
|
|
#include "../version.h"
|
|
|
|
|
|
|
|
#include "../osd/cpuEvalStencilsContext.h"
|
|
|
|
|
|
|
|
|
|
|
|
namespace OpenSubdiv {
|
|
|
|
namespace OPENSUBDIV_VERSION {
|
|
|
|
|
|
|
|
///
|
|
|
|
/// \brief CPU stencils evaluation controller
|
|
|
|
///
|
|
|
|
/// OsdCpuStencilsController is a compute controller class to launch
|
|
|
|
/// single threaded CPU stencil evalution kernels.
|
|
|
|
///
|
|
|
|
/// Controller entities execute requests from Context instances that they share
|
|
|
|
/// common interfaces with. Controllers are attached to discrete compute devices
|
|
|
|
/// and share the devices resources with Context entities.
|
|
|
|
///
|
|
|
|
class OsdTbbEvalStencilsController {
|
|
|
|
public:
|
|
|
|
|
|
|
|
/// \brief Constructor.
|
|
|
|
///
|
|
|
|
/// @param numThreads specifies how many openmp parallel threads to use.
|
|
|
|
/// -1 attempts to use all available processors.
|
|
|
|
///
|
|
|
|
OsdTbbEvalStencilsController(int numThreads=-1);
|
|
|
|
|
|
|
|
/// \brief Destructor.
|
|
|
|
~OsdTbbEvalStencilsController();
|
|
|
|
|
|
|
|
|
|
|
|
/// \brief Applies stencil weights to the control vertex data
|
|
|
|
///
|
|
|
|
/// Applies the stencil weights to the control vertex data to evaluate the
|
|
|
|
/// interpolated limit positions at the parametric locations of the stencils
|
|
|
|
///
|
|
|
|
/// @param context the OsdCpuEvalStencilsContext with the stencil weights
|
|
|
|
///
|
|
|
|
/// @param controlDataDesc vertex buffer descriptor for the control vertex data
|
|
|
|
///
|
|
|
|
/// @param controlVertices vertex buffer with the control vertices data
|
|
|
|
///
|
|
|
|
/// @param outputDataDesc vertex buffer descriptor for the output vertex data
|
|
|
|
///
|
|
|
|
/// @param outputData output vertex buffer for the interpolated data
|
|
|
|
///
|
|
|
|
template<class CONTROL_BUFFER, class OUTPUT_BUFFER>
|
|
|
|
int UpdateValues( OsdCpuEvalStencilsContext * context,
|
|
|
|
OsdVertexBufferDescriptor const & controlDataDesc, CONTROL_BUFFER *controlVertices,
|
|
|
|
OsdVertexBufferDescriptor const & outputDataDesc, OUTPUT_BUFFER *outputData ) {
|
|
|
|
|
|
|
|
if (not context->GetStencilTables()->GetNumStencils())
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
context->BindControlData( controlDataDesc, controlVertices );
|
|
|
|
context->BindOutputData( outputDataDesc, outputData );
|
|
|
|
|
|
|
|
int n = _UpdateValues( context );
|
|
|
|
|
|
|
|
context->Unbind();
|
|
|
|
|
|
|
|
return n;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// \brief Applies derivative stencil weights to the control vertex data
|
|
|
|
///
|
|
|
|
/// Computes the U and V derivative stencils to the control vertex data at
|
|
|
|
/// the parametric locations contained in each stencil
|
|
|
|
///
|
|
|
|
/// @param context the OsdCpuEvalStencilsContext with the stencil weights
|
|
|
|
///
|
|
|
|
/// @param controlDataDesc vertex buffer descriptor for the control vertex data
|
|
|
|
///
|
|
|
|
/// @param controlVertices vertex buffer with the control vertices data
|
|
|
|
///
|
|
|
|
/// @param outputDuDesc vertex buffer descriptor for the U derivative output data
|
|
|
|
///
|
|
|
|
/// @param outputDuData output vertex buffer for the U derivative data
|
|
|
|
///
|
|
|
|
/// @param outputDvDesc vertex buffer descriptor for the V deriv output data
|
|
|
|
///
|
|
|
|
/// @param outputDvData output vertex buffer for the V derivative data
|
|
|
|
///
|
|
|
|
template<class CONTROL_BUFFER, class OUTPUT_BUFFER>
|
|
|
|
int UpdateDerivs( OsdCpuEvalStencilsContext * context,
|
|
|
|
OsdVertexBufferDescriptor const & controlDataDesc, CONTROL_BUFFER *controlVertices,
|
|
|
|
OsdVertexBufferDescriptor const & outputDuDesc, OUTPUT_BUFFER *outputDuData,
|
|
|
|
OsdVertexBufferDescriptor const & outputDvDesc, OUTPUT_BUFFER *outputDvData ) {
|
|
|
|
|
|
|
|
if (not context->GetStencilTables()->GetNumStencils())
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
context->BindControlData( controlDataDesc, controlVertices );
|
|
|
|
|
|
|
|
context->BindOutputDerivData( outputDuDesc, outputDuData, outputDvDesc, outputDvData );
|
|
|
|
|
|
|
|
int n = _UpdateDerivs( context );
|
|
|
|
|
|
|
|
context->Unbind();
|
|
|
|
|
|
|
|
return n;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Waits until all running subdivision kernels finish.
|
|
|
|
void Synchronize();
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
int _UpdateValues( OsdCpuEvalStencilsContext * context );
|
|
|
|
int _UpdateDerivs( OsdCpuEvalStencilsContext * context );
|
|
|
|
|
|
|
|
int _numThreads;
|
|
|
|
};
|
|
|
|
|
|
|
|
} // end namespace OPENSUBDIV_VERSION
|
|
|
|
using namespace OPENSUBDIV_VERSION;
|
|
|
|
|
|
|
|
} // end namespace OpenSubdiv
|
|
|
|
|
|
|
|
#endif // FAR_TBB_EVALSTENCILS_CONTROLLER_H
|