2013-05-10 16:20:45 +00:00
|
|
|
//
|
|
|
|
//
|
2013-09-26 19:04:57 +00:00
|
|
|
// Copyright 2013 Pixar
|
2013-05-10 16:20:45 +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-05-10 16:20:45 +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-05-10 16:20:45 +00:00
|
|
|
//
|
2013-09-26 19:04:57 +00:00
|
|
|
// You may obtain a copy of the Apache License at
|
2013-07-18 21:19:50 +00:00
|
|
|
//
|
2013-09-26 19:04:57 +00:00
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
2013-05-10 16:20:45 +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-05-22 00:20:22 +00:00
|
|
|
#ifndef OSDUTIL_MESH_BATCH_CL_H
|
|
|
|
#define OSDUTIL_MESH_BATCH_CL_H
|
2013-05-10 16:20:45 +00:00
|
|
|
|
|
|
|
#include "../version.h"
|
2013-05-22 00:20:22 +00:00
|
|
|
#include "../osdutil/batch.h"
|
2013-05-10 16:20:45 +00:00
|
|
|
#include "../osd/clComputeController.h"
|
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
namespace OpenSubdiv {
|
|
|
|
namespace OPENSUBDIV_VERSION {
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// OsdUtilMeshBatch OpenCL specialized class
|
|
|
|
//
|
|
|
|
template <typename VERTEX_BUFFER, typename DRAW_CONTEXT>
|
|
|
|
class OsdUtilMeshBatch<VERTEX_BUFFER, DRAW_CONTEXT, OsdCLComputeController> : public OsdUtilMeshBatchBase<DRAW_CONTEXT> {
|
|
|
|
public:
|
|
|
|
typedef VERTEX_BUFFER VertexBuffer;
|
|
|
|
typedef OsdCLComputeController::ComputeContext ComputeContext;
|
|
|
|
typedef DRAW_CONTEXT DrawContext;
|
|
|
|
typedef OsdCLComputeController ComputeController;
|
|
|
|
typedef OsdUtilMeshBatchBase<DRAW_CONTEXT> Base;
|
|
|
|
|
|
|
|
// XXX: not happy with retaining compute controller..
|
2013-05-16 23:55:53 +00:00
|
|
|
static OsdUtilMeshBatch* Create(ComputeController *computeController,
|
|
|
|
const std::vector<FarMesh<OsdVertex> const * > &meshVector,
|
2013-05-22 00:20:22 +00:00
|
|
|
int numVertexElements,
|
|
|
|
int numVaryingElements,
|
2013-07-02 18:18:06 +00:00
|
|
|
int batchIndex,
|
|
|
|
bool requireFVarData=false);
|
2013-05-10 16:20:45 +00:00
|
|
|
|
|
|
|
virtual ~OsdUtilMeshBatch();
|
|
|
|
|
2013-07-02 18:18:06 +00:00
|
|
|
virtual typename DrawContext::VertexBufferBinding BindVertexBuffer() {
|
|
|
|
if (not _vertexBuffer) return 0;
|
|
|
|
return _vertexBuffer->BindVBO();
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual typename DrawContext::VertexBufferBinding BindVaryingBuffer() {
|
|
|
|
if (not _varyingBuffer) return 0;
|
|
|
|
return _varyingBuffer->BindVBO();
|
|
|
|
}
|
|
|
|
|
2013-05-10 16:20:45 +00:00
|
|
|
virtual DrawContext * GetDrawContext() const { return _drawContext; }
|
|
|
|
|
|
|
|
// update API
|
2013-07-02 18:18:06 +00:00
|
|
|
virtual void UpdateCoarseVertices(int meshIndex, const float *data, int numVertices) {
|
|
|
|
|
|
|
|
if (not _vertexBuffer)
|
|
|
|
return;
|
|
|
|
|
|
|
|
Base::setMeshDirty(meshIndex);
|
|
|
|
|
|
|
|
_vertexBuffer->UpdateData(data, Base::GetVertexOffset(meshIndex), numVertices,
|
|
|
|
_computeController->GetCommandQueue());
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void UpdateCoarseVaryings(int meshIndex, const float *data, int numVertices) {
|
|
|
|
|
|
|
|
if (not _varyingBuffer)
|
|
|
|
return;
|
2013-05-10 16:20:45 +00:00
|
|
|
|
2013-05-16 23:55:53 +00:00
|
|
|
Base::setMeshDirty(meshIndex);
|
2013-05-10 16:20:45 +00:00
|
|
|
|
2013-07-02 18:18:06 +00:00
|
|
|
_varyingBuffer->UpdateData(data, Base::GetVertexOffset(meshIndex), numVertices,
|
|
|
|
_computeController->GetCommandQueue());
|
2013-05-10 16:20:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// utility function
|
|
|
|
virtual void FinalizeUpdate() {
|
|
|
|
// create kernel batch for dirty handles
|
|
|
|
|
2013-05-16 23:55:53 +00:00
|
|
|
FarKernelBatchVector batches;
|
2013-05-22 00:20:22 +00:00
|
|
|
Base::populateDirtyKernelBatches(batches);
|
2013-05-10 16:20:45 +00:00
|
|
|
Base::resetMeshDirty();
|
|
|
|
|
|
|
|
_computeController->Refine(_computeContext, batches, _vertexBuffer);
|
|
|
|
}
|
|
|
|
|
|
|
|
VertexBuffer *GetVertexBuffer() const { return _vertexBuffer; }
|
|
|
|
VertexBuffer *GetVaryingBuffer() const { return _varyingBuffer; }
|
|
|
|
|
|
|
|
private:
|
2013-05-22 02:19:00 +00:00
|
|
|
OsdUtilMeshBatch();
|
|
|
|
|
|
|
|
bool initialize(ComputeController *computeController,
|
|
|
|
OsdUtilMeshBatchEntryVector const &entries,
|
|
|
|
FarMesh<OsdVertex> const *farMultiMesh,
|
|
|
|
int numVertexElements,
|
|
|
|
int numVaryingElements,
|
2013-07-02 18:18:06 +00:00
|
|
|
int batchIndex,
|
|
|
|
bool requireFVarData);
|
2013-05-22 02:19:00 +00:00
|
|
|
|
|
|
|
bool initialize(FarPatchTables const *patchTables,
|
|
|
|
int numVertices,
|
|
|
|
int numPtexFaces,
|
|
|
|
int numVertexElements,
|
|
|
|
int numVaryingElements,
|
2013-07-02 18:18:06 +00:00
|
|
|
int batchIndex,
|
|
|
|
bool requireFVarData);
|
2013-05-16 23:55:53 +00:00
|
|
|
|
2013-05-10 16:20:45 +00:00
|
|
|
ComputeController *_computeController;
|
|
|
|
ComputeContext *_computeContext;
|
|
|
|
|
|
|
|
VertexBuffer *_vertexBuffer, *_varyingBuffer;
|
|
|
|
DrawContext *_drawContext;
|
|
|
|
};
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
2013-05-16 23:55:53 +00:00
|
|
|
|
2013-05-10 16:20:45 +00:00
|
|
|
template <typename VERTEX_BUFFER, typename DRAW_CONTEXT>
|
2013-05-22 02:19:00 +00:00
|
|
|
OsdUtilMeshBatch<VERTEX_BUFFER, DRAW_CONTEXT, OsdCLComputeController>::OsdUtilMeshBatch() :
|
|
|
|
_computeController(NULL), _computeContext(NULL), _vertexBuffer(NULL), _varyingBuffer(NULL), _drawContext(NULL) {
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename VERTEX_BUFFER, typename DRAW_CONTEXT> bool
|
|
|
|
OsdUtilMeshBatch<VERTEX_BUFFER, DRAW_CONTEXT, OsdCLComputeController>::initialize(ComputeController *computeController,
|
|
|
|
OsdUtilMeshBatchEntryVector const &entries,
|
|
|
|
FarMesh<OsdVertex> const *farMultiMesh,
|
|
|
|
int numVertexElements,
|
|
|
|
int numVaryingElements,
|
2013-07-02 18:18:06 +00:00
|
|
|
int batchIndex,
|
|
|
|
bool requireFVarData) {
|
2013-05-22 02:19:00 +00:00
|
|
|
Base::initialize(entries, farMultiMesh->GetNumVertices(), farMultiMesh->GetNumPtexFaces(),
|
|
|
|
numVertexElements, batchIndex);
|
|
|
|
|
|
|
|
_computeController = computeController;
|
2013-05-11 02:35:25 +00:00
|
|
|
|
2013-05-16 23:55:53 +00:00
|
|
|
// copy batches
|
|
|
|
Base::setKernelBatches(farMultiMesh->GetKernelBatches());
|
2013-05-11 02:35:25 +00:00
|
|
|
|
2013-05-10 16:20:45 +00:00
|
|
|
// create compute contexts
|
2013-05-11 02:35:25 +00:00
|
|
|
_computeContext = ComputeContext::Create(farMultiMesh, _computeController->GetContext());
|
|
|
|
|
2013-05-22 02:19:00 +00:00
|
|
|
if (not _computeContext) return false;
|
|
|
|
|
2013-05-16 23:55:53 +00:00
|
|
|
FarPatchTables const * patchTables = farMultiMesh->GetPatchTables();
|
|
|
|
|
2013-09-03 22:13:00 +00:00
|
|
|
if (numVertexElements) {
|
|
|
|
_vertexBuffer = VertexBuffer::Create(numVertexElements, Base::GetNumVertices(), _computeController->GetContext());
|
|
|
|
if (not _vertexBuffer) return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (numVaryingElements) {
|
|
|
|
_varyingBuffer = VertexBuffer::Create(numVaryingElements, Base::GetNumVertices(), _computeController->GetContext());
|
|
|
|
if (not _varyingBuffer) return false;
|
|
|
|
}
|
2013-05-22 00:20:22 +00:00
|
|
|
|
2013-07-02 18:18:06 +00:00
|
|
|
_drawContext = DrawContext::Create(patchTables, requireFVarData);
|
2013-05-22 02:19:00 +00:00
|
|
|
|
|
|
|
if (not _drawContext) return false;
|
|
|
|
|
2013-05-22 00:20:22 +00:00
|
|
|
_drawContext->UpdateVertexTexture(_vertexBuffer);
|
2013-05-22 02:19:00 +00:00
|
|
|
|
|
|
|
return true;
|
2013-05-16 23:55:53 +00:00
|
|
|
}
|
2013-05-11 02:35:25 +00:00
|
|
|
|
2013-05-22 02:19:00 +00:00
|
|
|
template <typename VERTEX_BUFFER, typename DRAW_CONTEXT> bool
|
|
|
|
OsdUtilMeshBatch<VERTEX_BUFFER, DRAW_CONTEXT, OsdCLComputeController>::initialize(FarPatchTables const *patchTables,
|
|
|
|
int numVertices,
|
|
|
|
int numPtexFaces,
|
|
|
|
int numVertexElements,
|
|
|
|
int numVaryingElements,
|
2013-07-02 18:18:06 +00:00
|
|
|
int batchIndex,
|
|
|
|
bool requireFVarData) {
|
2013-05-22 02:19:00 +00:00
|
|
|
Base::initialize(numVertices, numPtexFaces, numVertexElements, batchIndex);
|
2013-05-11 02:35:25 +00:00
|
|
|
|
2013-09-03 22:13:00 +00:00
|
|
|
if (numVertexElements) {
|
|
|
|
_vertexBuffer = VertexBuffer::Create(numVertexElements, Base::GetNumVertices(), _computeController->GetContext());
|
|
|
|
if (not _vertexBuffer) return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (numVaryingElements) {
|
|
|
|
_varyingBuffer = VertexBuffer::Create(numVaryingElements, Base::GetNumVertices(), _computeController->GetContext());
|
|
|
|
if (not _varyingBuffer) return false;
|
|
|
|
}
|
2013-05-22 00:20:22 +00:00
|
|
|
|
2013-07-02 18:18:06 +00:00
|
|
|
_drawContext = DrawContext::Create(patchTables, requireFVarData);
|
2013-05-22 02:19:00 +00:00
|
|
|
|
|
|
|
if (not _drawContext) return false;
|
|
|
|
|
2013-05-22 00:20:22 +00:00
|
|
|
_drawContext->UpdateVertexTexture(_vertexBuffer);
|
2013-05-22 02:19:00 +00:00
|
|
|
|
|
|
|
return true;
|
2013-05-10 16:20:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <typename VERTEX_BUFFER, typename DRAW_CONTEXT>
|
2013-07-02 18:18:06 +00:00
|
|
|
OsdUtilMeshBatch<VERTEX_BUFFER, DRAW_CONTEXT, OsdCLComputeController>::~OsdUtilMeshBatch()
|
|
|
|
{
|
2013-05-10 16:20:45 +00:00
|
|
|
delete _computeContext;
|
|
|
|
delete _drawContext;
|
|
|
|
|
|
|
|
delete _vertexBuffer;
|
|
|
|
delete _varyingBuffer;
|
|
|
|
}
|
|
|
|
|
2013-05-16 23:55:53 +00:00
|
|
|
template <typename VERTEX_BUFFER, typename DRAW_CONTEXT>
|
|
|
|
OsdUtilMeshBatch<VERTEX_BUFFER, DRAW_CONTEXT, OsdCLComputeController> *
|
|
|
|
OsdUtilMeshBatch<VERTEX_BUFFER, DRAW_CONTEXT, OsdCLComputeController>::Create(ComputeController *computeController,
|
2013-05-22 00:20:22 +00:00
|
|
|
const std::vector<FarMesh<OsdVertex> const * > &meshVector,
|
|
|
|
int numVertexElements,
|
|
|
|
int numVaryingElements,
|
2013-07-02 18:18:06 +00:00
|
|
|
int batchIndex,
|
|
|
|
bool requireFVarData) {
|
2013-05-16 23:55:53 +00:00
|
|
|
std::vector<FarPatchTables::PatchArrayVector> multiFarPatchArray;
|
|
|
|
FarMesh <OsdVertex> *farMultiMesh = createMultiMesh(meshVector, multiFarPatchArray);
|
|
|
|
|
|
|
|
FarPatchTables const * patchTables = farMultiMesh->GetPatchTables();
|
|
|
|
|
|
|
|
// create entries
|
|
|
|
OsdUtilMeshBatchEntryVector entries;
|
|
|
|
createEntries(entries, multiFarPatchArray, patchTables->GetMaxValence(), meshVector);
|
|
|
|
|
|
|
|
OsdUtilMeshBatch<VERTEX_BUFFER, DRAW_CONTEXT, OsdCLComputeController> *batch =
|
2013-05-22 02:19:00 +00:00
|
|
|
new OsdUtilMeshBatch<VERTEX_BUFFER, DRAW_CONTEXT, OsdCLComputeController>();
|
|
|
|
|
2013-09-03 22:13:00 +00:00
|
|
|
if (not batch->initialize(computeController, entries, farMultiMesh,
|
|
|
|
numVertexElements, numVaryingElements,
|
|
|
|
batchIndex, requireFVarData)) {
|
|
|
|
delete batch;
|
|
|
|
batch = NULL;
|
|
|
|
}
|
2013-05-16 23:55:53 +00:00
|
|
|
|
|
|
|
delete farMultiMesh;
|
|
|
|
|
|
|
|
return batch;
|
|
|
|
}
|
|
|
|
|
2013-05-10 16:20:45 +00:00
|
|
|
} // end namespace OPENSUBDIV_VERSION
|
|
|
|
using namespace OPENSUBDIV_VERSION;
|
|
|
|
|
|
|
|
} // end namespace OpenSubdiv
|
|
|
|
|
2013-05-22 00:20:22 +00:00
|
|
|
#endif /* OSDUTIL_MESH_BATCH_H */
|