// // Copyright (C) Pixar. All rights reserved. // // This license governs use of the accompanying software. If you // use the software, you accept this license. If you do not accept // the license, do not use the software. // // 1. Definitions // The terms "reproduce," "reproduction," "derivative works," and // "distribution" have the same meaning here as under U.S. // copyright law. A "contribution" is the original software, or // any additions or changes to the software. // A "contributor" is any person or entity that distributes its // contribution under this license. // "Licensed patents" are a contributor's patent claims that read // directly on its contribution. // // 2. Grant of Rights // (A) Copyright Grant- Subject to the terms of this license, // including the license conditions and limitations in section 3, // each contributor grants you a non-exclusive, worldwide, // royalty-free copyright license to reproduce its contribution, // prepare derivative works of its contribution, and distribute // its contribution or any derivative works that you create. // (B) Patent Grant- Subject to the terms of this license, // including the license conditions and limitations in section 3, // each contributor grants you a non-exclusive, worldwide, // royalty-free license under its licensed patents to make, have // made, use, sell, offer for sale, import, and/or otherwise // dispose of its contribution in the software or derivative works // of the contribution in the software. // // 3. Conditions and Limitations // (A) No Trademark License- This license does not grant you // rights to use any contributor's name, logo, or trademarks. // (B) If you bring a patent claim against any contributor over // patents that you claim are infringed by the software, your // patent license from such contributor to the software ends // automatically. // (C) If you distribute any portion of the software, you must // retain all copyright, patent, trademark, and attribution // notices that are present in the software. // (D) If you distribute any portion of the software in source // code form, you may do so only under this license by including a // complete copy of this license with your distribution. If you // distribute any portion of the software in compiled or object // code form, you may only do so under a license that complies // with this license. // (E) The software is licensed "as-is." You bear the risk of // using it. The contributors give no express warranties, // guarantees or conditions. You may have additional consumer // rights under your local laws which this license cannot change. // To the extent permitted under your local laws, the contributors // exclude the implied warranties of merchantability, fitness for // a particular purpose and non-infringement. // #ifndef OSD_D3D11MESH_H #define OSD_D3D11MESH_H #include "../version.h" #include "../osd/mesh.h" #include "../osd/d3d11ComputeController.h" #include "../osd/d3d11DrawContext.h" #include "../osd/d3d11VertexBuffer.h" namespace OpenSubdiv { namespace OPENSUBDIV_VERSION { typedef OsdMeshInterface OsdD3D11MeshInterface; template class OsdMesh : public OsdD3D11MeshInterface { public: typedef VERTEX_BUFFER VertexBuffer; typedef COMPUTE_CONTROLLER ComputeController; typedef typename ComputeController::ComputeContext ComputeContext; typedef OsdD3D11DrawContext DrawContext; typedef typename DrawContext::VertexBufferBinding VertexBufferBinding; OsdMesh(ComputeController * computeController, HbrMesh * hmesh, int numVertexElements, int numVaryingElements, int level, OsdMeshBitset bits, ID3D11DeviceContext *d3d11DeviceContext) : _farMesh(0), _vertexBuffer(0), _varyingBuffer(0), _computeContext(0), _computeController(computeController), _drawContext(0), _pd3d11DeviceContext(d3d11DeviceContext) { FarMeshFactory meshFactory(hmesh, level, bits.test(MeshAdaptive)); _farMesh = meshFactory.Create(bits.test(MeshFVarData)); ID3D11Device * pd3d11Device; _pd3d11DeviceContext->GetDevice(&pd3d11Device); int numVertices = _farMesh->GetNumVertices(); _vertexBuffer = VertexBuffer::Create(numVertexElements, numVertices, pd3d11Device); if (numVaryingElements) _vertexBuffer = VertexBuffer::Create(numVaryingElements, numVertices, pd3d11Device); _computeContext = ComputeContext::Create(_farMesh); _drawContext = DrawContext::Create(_farMesh->GetPatchTables(), _pd3d11DeviceContext, bits.test(MeshFVarData)); assert(_drawContext); _drawContext->UpdateVertexTexture(_vertexBuffer, _pd3d11DeviceContext); } virtual ~OsdMesh() { delete _farMesh; delete _vertexBuffer; delete _varyingBuffer; delete _computeContext; delete _drawContext; } virtual int GetNumVertices() const { return _farMesh->GetNumVertices(); } virtual void UpdateVertexBuffer(float const *vertexData, int startVertex, int numVerts) { _vertexBuffer->UpdateData(vertexData, startVertex, numVerts, _pd3d11DeviceContext); } virtual void UpdateVaryingBuffer(float const *varyingData, int startVertex, int numVerts) { _varyingBuffer->UpdateData(varyingData, startVertex, numVerts, _pd3d11DeviceContext); } virtual void Refine() { _computeController->Refine(_computeContext, _farMesh->GetKernelBatches(), _vertexBuffer, _varyingBuffer); } virtual void Synchronize() { _computeController->Synchronize(); } virtual VertexBufferBinding BindVertexBuffer() { return _vertexBuffer->BindD3D11Buffer(_pd3d11DeviceContext); } virtual VertexBufferBinding BindVaryingBuffer() { return _varyingBuffer->BindD3D11Buffer(_pd3d11DeviceContext); } virtual DrawContext * GetDrawContext() { return _drawContext; } private: FarMesh *_farMesh; VertexBuffer *_vertexBuffer; VertexBuffer *_varyingBuffer; ComputeContext *_computeContext; ComputeController *_computeController; DrawContext *_drawContext; ID3D11DeviceContext *_pd3d11DeviceContext; }; template <> class OsdMesh : public OsdD3D11MeshInterface { public: typedef OsdD3D11VertexBuffer VertexBuffer; typedef OsdD3D11ComputeController ComputeController; typedef ComputeController::ComputeContext ComputeContext; typedef OsdD3D11DrawContext DrawContext; typedef DrawContext::VertexBufferBinding VertexBufferBinding; OsdMesh(ComputeController * computeController, HbrMesh * hmesh, int numVertexElements, int numVaryingElements, int level, OsdMeshBitset bits, ID3D11DeviceContext *d3d11DeviceContext) : _farMesh(0), _vertexBuffer(0), _varyingBuffer(0), _computeContext(0), _computeController(computeController), _drawContext(0), _pd3d11DeviceContext(d3d11DeviceContext) { FarMeshFactory meshFactory(hmesh, level, bits.test(MeshAdaptive)); _farMesh = meshFactory.Create(bits.test(MeshFVarData)); ID3D11Device * pd3d11Device; _pd3d11DeviceContext->GetDevice(&pd3d11Device); int numVertices = _farMesh->GetNumVertices(); _vertexBuffer = VertexBuffer::Create(numVertexElements, numVertices, pd3d11Device); if (numVaryingElements) _varyingBuffer = VertexBuffer::Create(numVaryingElements, numVertices, pd3d11Device); _computeContext = ComputeContext::Create(_farMesh, _pd3d11DeviceContext); _drawContext = DrawContext::Create(_farMesh->GetPatchTables(), _pd3d11DeviceContext, bits.test(MeshFVarData)); _drawContext->UpdateVertexTexture(_vertexBuffer, _pd3d11DeviceContext); } virtual ~OsdMesh() { delete _farMesh; delete _vertexBuffer; delete _varyingBuffer; delete _computeContext; delete _drawContext; } virtual int GetNumVertices() const { return _farMesh->GetNumVertices(); } virtual void UpdateVertexBuffer(float const *vertexData, int startVertex, int numVerts) { _vertexBuffer->UpdateData(vertexData, startVertex, numVerts, _pd3d11DeviceContext); } virtual void UpdateVaryingBuffer(float const *varyingData, int startVertex, int numVerts) { _varyingBuffer->UpdateData(varyingData, startVertex, numVerts, _pd3d11DeviceContext); } virtual void Refine() { _computeController->Refine(_computeContext, _farMesh->GetKernelBatches(), _vertexBuffer, _varyingBuffer); } virtual void Synchronize() { _computeController->Synchronize(); } virtual VertexBufferBinding BindVertexBuffer() { return _vertexBuffer->BindD3D11Buffer(_pd3d11DeviceContext); } virtual VertexBufferBinding BindVaryingBuffer() { return _varyingBuffer->BindD3D11Buffer(_pd3d11DeviceContext); } virtual DrawContext * GetDrawContext() { return _drawContext; } private: FarMesh *_farMesh; VertexBuffer *_vertexBuffer; VertexBuffer *_varyingBuffer; ComputeContext *_computeContext; ComputeController *_computeController; DrawContext *_drawContext; ID3D11DeviceContext *_pd3d11DeviceContext; }; #ifdef OPENSUBDIV_HAS_OPENCL #if defined(__APPLE__) #include #else #include #endif class OsdCLComputeController; template class OsdMesh : public OsdD3D11MeshInterface { public: typedef VERTEX_BUFFER VertexBuffer; typedef OsdCLComputeController ComputeController; typedef typename ComputeController::ComputeContext ComputeContext; typedef OsdD3D11DrawContext DrawContext; typedef typename DrawContext::VertexBufferBinding VertexBufferBinding; OsdMesh(ComputeController * computeController, HbrMesh * hmesh, int numVertexElements, int numVaryingElements, int level, OsdMeshBitset bits, cl_context clContext, cl_command_queue clQueue, ID3D11DeviceContext *d3d11DeviceContext) : _farMesh(0), _vertexBuffer(0), _varyingBuffer(0), _computeContext(0), _computeController(computeController), _drawContext(0), _clContext(clContext), _clQueue(clQueue), _pd3d11DeviceContext(d3d11DeviceContext) { FarMeshFactory meshFactory(hmesh, level, bits.test(MeshAdaptive)); _farMesh = meshFactory.Create(bits.test(MeshPtexData), bits.test(MeshFVarData)); ID3D11Device * pd3d11Device; _pd3d11DeviceContext->GetDevice(&pd3d11Device); int numVertices = _farMesh->GetNumVertices(); _vertexBuffer = typename VertexBuffer::Create(numVertexElements, numVertices, _clContext, pd3d11Device); if (numVaryingElements) _varyingBuffer = typename VertexBuffer::Create(numVaryingElements, numVertices, _clContext, pd3d11Device); _computeContext = ComputeContext::Create(_farMesh, _clContext); _drawContext = DrawContext::Create(_farMesh, _vertexBuffer, _pd3d11DeviceContext, bits.test(MeshPtexData), bits.test(MeshFVarData)); } virtual ~OsdMesh() { delete _farMesh; delete _vertexBuffer; delete _varyingBuffer; delete _computeContext; delete _drawContext; } virtual int GetNumVertices() const { return _farMesh->GetNumVertices(); } virtual void UpdateVertexBuffer(float const *vertexData, int numVerts) { ID3D11Device * pd3d11Device; _pd3d11DeviceContext->GetDevice(&pd3d11Device); _vertexBuffer->UpdateData(vertexData, numVerts, _clQueue, pd3d11Device); } virtual void UpdateVaryingBuffer(float const *varyingData, int numVerts) { ID3D11Device * pd3d11Device; _pd3d11DeviceContext->GetDevice(&pd3d11Device); _varyingBuffer->UpdateData(varyingData, numVerts, _clQueue, pd3d11Device); } virtual void Refine() { _computeController->Refine(_computeContext, _farMesh->GetKernelBatches(), _vertexBuffer, _varyingBuffer); } virtual void Synchronize() { _computeController->Synchronize(); } virtual VertexBufferBinding BindVertexBuffer() { return _vertexBuffer->BindD3D11Buffer(_pd3d11DeviceContext); } virtual VertexBufferBinding BindVaryingBuffer() { return _varyingBuffer->BindD3D11Buffer(_pd3d11DeviceContext); } virtual DrawContext * GetDrawContext() { return _drawContext; } private: FarMesh *_farMesh; VertexBuffer *_vertexBuffer; VertexBuffer *_varyingBuffer; ComputeContext *_computeContext; ComputeController *_computeController; DrawContext *_drawContext; cl_context _clContext; cl_command_queue _clQueue; ID3D11DeviceContext *_pd3d11DeviceContext; }; #endif } // end namespace OPENSUBDIV_VERSION using namespace OPENSUBDIV_VERSION; } // end namespace OpenSubdiv #endif // OSD_D3D11MESH_H