mirror of
https://github.com/PixarAnimationStudios/OpenSubdiv
synced 2025-01-11 17:10:08 +00:00
Merge pull request #503 from takahito-tejima/refactor
osd layer: Add GLPatchTable and retire DrawContext
This commit is contained in:
commit
70e6148a4d
@ -22,10 +22,8 @@
|
|||||||
// language governing permissions and limitations under the Apache License.
|
// language governing permissions and limitations under the Apache License.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef COMMON_PATCH_COLORS_H
|
#ifndef OPENSUBDIV_EXAMPLES_COMMON_PATCH_COLORS_H
|
||||||
#define COMMON_PATCH_COLORS_H
|
#define OPENSUBDIV_EXAMPLES_COMMON_PATCH_COLORS_H
|
||||||
|
|
||||||
#include <osd/drawContext.h>
|
|
||||||
|
|
||||||
#include <far/patchTables.h>
|
#include <far/patchTables.h>
|
||||||
|
|
||||||
@ -33,4 +31,4 @@
|
|||||||
float const * getAdaptivePatchColor(OpenSubdiv::Far::PatchDescriptor const & desc);
|
float const * getAdaptivePatchColor(OpenSubdiv::Far::PatchDescriptor const & desc);
|
||||||
|
|
||||||
|
|
||||||
#endif /* COMMON_PATCH_COLORS_H */
|
#endif /* OPENSUBDIV_EXAMPLES_COMMON_PATCH_COLORS_H */
|
||||||
|
@ -25,7 +25,6 @@
|
|||||||
#include <D3D11.h>
|
#include <D3D11.h>
|
||||||
#include <D3Dcompiler.h>
|
#include <D3Dcompiler.h>
|
||||||
|
|
||||||
#include <osd/d3d11DrawContext.h>
|
|
||||||
#include <far/error.h>
|
#include <far/error.h>
|
||||||
|
|
||||||
#include <osd/cpuD3D11VertexBuffer.h>
|
#include <osd/cpuD3D11VertexBuffer.h>
|
||||||
@ -467,10 +466,6 @@ public:
|
|||||||
ss << "#define OSD_ENABLE_PATCH_CULL\n";
|
ss << "#define OSD_ENABLE_PATCH_CULL\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
// for legacy gregory
|
|
||||||
ss << "#define OSD_MAX_VALENCE " << effectDesc.maxValence << "\n";
|
|
||||||
ss << "#define OSD_NUM_ELEMENTS " << effectDesc.numElements << "\n";
|
|
||||||
|
|
||||||
// add ptex functions
|
// add ptex functions
|
||||||
ss << D3D11PtexMipmapTexture::GetShaderSource();
|
ss << D3D11PtexMipmapTexture::GetShaderSource();
|
||||||
|
|
||||||
@ -741,7 +736,7 @@ createOsdMesh(int level, int kernel) {
|
|||||||
g_mesh = new Osd::Mesh<Osd::CpuD3D11VertexBuffer,
|
g_mesh = new Osd::Mesh<Osd::CpuD3D11VertexBuffer,
|
||||||
Far::StencilTables,
|
Far::StencilTables,
|
||||||
Osd::CpuEvaluator,
|
Osd::CpuEvaluator,
|
||||||
Osd::D3D11DrawContext,
|
Osd::D3D11PatchTable,
|
||||||
ID3D11DeviceContext>(
|
ID3D11DeviceContext>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
@ -753,7 +748,7 @@ createOsdMesh(int level, int kernel) {
|
|||||||
g_mesh = new Osd::Mesh<Osd::CpuD3D11VertexBuffer,
|
g_mesh = new Osd::Mesh<Osd::CpuD3D11VertexBuffer,
|
||||||
Far::StencilTables,
|
Far::StencilTables,
|
||||||
Osd::OmpEvaluator,
|
Osd::OmpEvaluator,
|
||||||
Osd::D3D11DrawContext,
|
Osd::D3D11PatchTable,
|
||||||
ID3D11DeviceContext>(
|
ID3D11DeviceContext>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
@ -765,7 +760,7 @@ createOsdMesh(int level, int kernel) {
|
|||||||
g_mesh = new Osd::Mesh<Osd::CpuD3D11VertexBuffer,
|
g_mesh = new Osd::Mesh<Osd::CpuD3D11VertexBuffer,
|
||||||
Far::StencilTables,
|
Far::StencilTables,
|
||||||
Osd::TbbEvaluator,
|
Osd::TbbEvaluator,
|
||||||
Osd::D3D11DrawContext,
|
Osd::D3D11PatchTable,
|
||||||
ID3D11DeviceContext>(
|
ID3D11DeviceContext>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
@ -778,7 +773,7 @@ createOsdMesh(int level, int kernel) {
|
|||||||
g_mesh = new Osd::Mesh<Osd::CLD3D11VertexBuffer,
|
g_mesh = new Osd::Mesh<Osd::CLD3D11VertexBuffer,
|
||||||
Osd::CLStencilTables,
|
Osd::CLStencilTables,
|
||||||
Osd::CLEvaluator,
|
Osd::CLEvaluator,
|
||||||
Osd::D3D11DrawContext,
|
Osd::D3D11PatchTable,
|
||||||
CLD3D11DeviceContext>(
|
CLD3D11DeviceContext>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
@ -792,7 +787,7 @@ createOsdMesh(int level, int kernel) {
|
|||||||
g_mesh = new Osd::Mesh<Osd::CudaD3D11VertexBuffer,
|
g_mesh = new Osd::Mesh<Osd::CudaD3D11VertexBuffer,
|
||||||
Osd::CudaStencilTables,
|
Osd::CudaStencilTables,
|
||||||
Osd::CudaEvaluator,
|
Osd::CudaEvaluator,
|
||||||
Osd::D3D11DrawContext,
|
Osd::D3D11PatchTable,
|
||||||
ID3D11DeviceContext>(
|
ID3D11DeviceContext>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
@ -804,7 +799,7 @@ createOsdMesh(int level, int kernel) {
|
|||||||
g_mesh = new Osd::Mesh<Osd::D3D11VertexBuffer,
|
g_mesh = new Osd::Mesh<Osd::D3D11VertexBuffer,
|
||||||
Osd::D3D11StencilTables,
|
Osd::D3D11StencilTables,
|
||||||
Osd::D3D11ComputeEvaluator,
|
Osd::D3D11ComputeEvaluator,
|
||||||
Osd::D3D11DrawContext,
|
Osd::D3D11PatchTable,
|
||||||
ID3D11DeviceContext>(
|
ID3D11DeviceContext>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
@ -821,21 +816,10 @@ createOsdMesh(int level, int kernel) {
|
|||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
static void
|
static void
|
||||||
bindProgram(Effect effect, OpenSubdiv::Osd::DrawContext::PatchArray const & patch) {
|
bindProgram(Effect effect, OpenSubdiv::Osd::D3D11PatchTable::PatchArray const & patch) {
|
||||||
|
|
||||||
EffectDesc effectDesc(patch.GetDescriptor(), effect);
|
EffectDesc effectDesc(patch.GetDescriptor(), effect);
|
||||||
|
|
||||||
// only legacy gregory needs maxValence and numElements
|
|
||||||
int maxValence = g_mesh->GetDrawContext()->GetMaxValence();
|
|
||||||
int numElements = 6;
|
|
||||||
|
|
||||||
typedef OpenSubdiv::Far::PatchDescriptor Descriptor;
|
|
||||||
if (patch.GetDescriptor().GetType() == Descriptor::GREGORY or
|
|
||||||
patch.GetDescriptor().GetType() == Descriptor::GREGORY_BOUNDARY) {
|
|
||||||
effectDesc.maxValence = maxValence;
|
|
||||||
effectDesc.numElements = numElements;
|
|
||||||
}
|
|
||||||
|
|
||||||
D3D11DrawConfig *config = g_shaderCache.GetDrawConfig(effectDesc);
|
D3D11DrawConfig *config = g_shaderCache.GetDrawConfig(effectDesc);
|
||||||
|
|
||||||
assert(g_pInputLayout);
|
assert(g_pInputLayout);
|
||||||
@ -885,7 +869,6 @@ bindProgram(Effect effect, OpenSubdiv::Osd::DrawContext::PatchArray const & patc
|
|||||||
__declspec(align(16))
|
__declspec(align(16))
|
||||||
struct Tessellation {
|
struct Tessellation {
|
||||||
float TessLevel;
|
float TessLevel;
|
||||||
int GregoryQuadOffsetBase;
|
|
||||||
int PrimitiveIdBase;
|
int PrimitiveIdBase;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -906,8 +889,7 @@ bindProgram(Effect effect, OpenSubdiv::Osd::DrawContext::PatchArray const & patc
|
|||||||
Tessellation * pData = ( Tessellation* )MappedResource.pData;
|
Tessellation * pData = ( Tessellation* )MappedResource.pData;
|
||||||
|
|
||||||
pData->TessLevel = static_cast<float>(1 << g_tessLevel);
|
pData->TessLevel = static_cast<float>(1 << g_tessLevel);
|
||||||
pData->GregoryQuadOffsetBase = patch.GetQuadOffsetIndex();
|
pData->PrimitiveIdBase = patch.GetPrimitiveIdBase();
|
||||||
pData->PrimitiveIdBase = patch.GetPatchIndex();
|
|
||||||
|
|
||||||
g_pd3dDeviceContext->Unmap( g_pcbTessellation, 0 );
|
g_pd3dDeviceContext->Unmap( g_pcbTessellation, 0 );
|
||||||
}
|
}
|
||||||
@ -959,24 +941,12 @@ bindProgram(Effect effect, OpenSubdiv::Osd::DrawContext::PatchArray const & patc
|
|||||||
g_pd3dDeviceContext->PSSetConstantBuffers(2, 1, &g_pcbLighting);
|
g_pd3dDeviceContext->PSSetConstantBuffers(2, 1, &g_pcbLighting);
|
||||||
g_pd3dDeviceContext->PSSetConstantBuffers(3, 1, &g_pcbConfig);
|
g_pd3dDeviceContext->PSSetConstantBuffers(3, 1, &g_pcbConfig);
|
||||||
|
|
||||||
if (g_mesh->GetDrawContext()->vertexBufferSRV) {
|
ID3D11ShaderResourceView *srv = g_mesh->GetPatchTable()->GetPatchParamSRV();
|
||||||
g_pd3dDeviceContext->VSSetShaderResources(0, 1, &g_mesh->GetDrawContext()->vertexBufferSRV);
|
if (srv) {
|
||||||
}
|
g_pd3dDeviceContext->HSSetShaderResources(0, 1, &srv);
|
||||||
if (g_mesh->GetDrawContext()->vertexValenceBufferSRV) {
|
g_pd3dDeviceContext->DSSetShaderResources(0, 1, &srv);
|
||||||
g_pd3dDeviceContext->VSSetShaderResources(1, 1, &g_mesh->GetDrawContext()->vertexValenceBufferSRV);
|
g_pd3dDeviceContext->GSSetShaderResources(0, 1, &srv);
|
||||||
}
|
g_pd3dDeviceContext->PSSetShaderResources(0, 1, &srv);
|
||||||
if (g_mesh->GetDrawContext()->quadOffsetBufferSRV) {
|
|
||||||
g_pd3dDeviceContext->HSSetShaderResources(2, 1, &g_mesh->GetDrawContext()->quadOffsetBufferSRV);
|
|
||||||
}
|
|
||||||
if (g_mesh->GetDrawContext()->patchParamBufferSRV) {
|
|
||||||
g_pd3dDeviceContext->HSSetShaderResources(
|
|
||||||
3, 1, &g_mesh->GetDrawContext()->patchParamBufferSRV);
|
|
||||||
g_pd3dDeviceContext->DSSetShaderResources(
|
|
||||||
3, 1, &g_mesh->GetDrawContext()->patchParamBufferSRV);
|
|
||||||
g_pd3dDeviceContext->GSSetShaderResources(
|
|
||||||
3, 1, &g_mesh->GetDrawContext()->patchParamBufferSRV);
|
|
||||||
g_pd3dDeviceContext->PSSetShaderResources(
|
|
||||||
3, 1, &g_mesh->GetDrawContext()->patchParamBufferSRV);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
g_pd3dDeviceContext->PSSetShaderResources(4, 1, g_osdPTexImage->GetTexelsSRV());
|
g_pd3dDeviceContext->PSSetShaderResources(4, 1, g_osdPTexImage->GetTexelsSRV());
|
||||||
@ -1011,15 +981,16 @@ drawModel() {
|
|||||||
UINT hOffsets = 0;
|
UINT hOffsets = 0;
|
||||||
g_pd3dDeviceContext->IASetVertexBuffers(0, 1, &buffer, &hStrides, &hOffsets);
|
g_pd3dDeviceContext->IASetVertexBuffers(0, 1, &buffer, &hStrides, &hOffsets);
|
||||||
|
|
||||||
OpenSubdiv::Osd::DrawContext::PatchArrayVector const & patches =
|
OpenSubdiv::Osd::D3D11PatchTable::PatchArrayVector const & patches =
|
||||||
g_mesh->GetDrawContext()->GetPatchArrays();
|
g_mesh->GetPatchTable()->GetPatchArrays();
|
||||||
|
|
||||||
g_pd3dDeviceContext->IASetIndexBuffer(g_mesh->GetDrawContext()->patchIndexBuffer,
|
g_pd3dDeviceContext->IASetIndexBuffer(
|
||||||
DXGI_FORMAT_R32_UINT, 0);
|
g_mesh->GetPatchTable()->GetPatchIndexBuffer(),
|
||||||
|
DXGI_FORMAT_R32_UINT, 0);
|
||||||
|
|
||||||
// patch drawing
|
// patch drawing
|
||||||
for (int i = 0; i < (int)patches.size(); ++i) {
|
for (int i = 0; i < (int)patches.size(); ++i) {
|
||||||
OpenSubdiv::Osd::DrawContext::PatchArray const & patch = patches[i];
|
OpenSubdiv::Osd::D3D11PatchTable::PatchArray const & patch = patches[i];
|
||||||
OpenSubdiv::Far::PatchDescriptor desc = patch.GetDescriptor();
|
OpenSubdiv::Far::PatchDescriptor desc = patch.GetDescriptor();
|
||||||
OpenSubdiv::Far::PatchDescriptor::Type patchType = desc.GetType();
|
OpenSubdiv::Far::PatchDescriptor::Type patchType = desc.GetType();
|
||||||
|
|
||||||
@ -1054,7 +1025,7 @@ drawModel() {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
};
|
}
|
||||||
|
|
||||||
Effect effect;
|
Effect effect;
|
||||||
effect.value = 0;
|
effect.value = 0;
|
||||||
@ -1076,8 +1047,10 @@ drawModel() {
|
|||||||
|
|
||||||
g_pd3dDeviceContext->IASetPrimitiveTopology(topology);
|
g_pd3dDeviceContext->IASetPrimitiveTopology(topology);
|
||||||
|
|
||||||
g_pd3dDeviceContext->DrawIndexed(patch.GetNumIndices(),
|
g_pd3dDeviceContext->DrawIndexed(
|
||||||
patch.GetVertIndex(), 0);
|
patch.GetNumPatches() * desc.GetNumControlVertices(),
|
||||||
|
patch.GetIndexBase(), 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1470,13 +1443,13 @@ initD3D11(HWND hWnd) {
|
|||||||
D3D_FEATURE_LEVEL hFeatureLevel = D3D_FEATURE_LEVEL_11_0;
|
D3D_FEATURE_LEVEL hFeatureLevel = D3D_FEATURE_LEVEL_11_0;
|
||||||
for(UINT driverTypeIndex=0; driverTypeIndex < numDriverTypes; driverTypeIndex++){
|
for(UINT driverTypeIndex=0; driverTypeIndex < numDriverTypes; driverTypeIndex++){
|
||||||
hDriverType = driverTypes[driverTypeIndex];
|
hDriverType = driverTypes[driverTypeIndex];
|
||||||
unsigned int deviceFlags = 0;
|
unsigned int deviceFlags = 0;
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
// XXX: this is problematic in some environments.
|
// XXX: this is problematic in some environments.
|
||||||
// deviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
|
// deviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
|
||||||
#endif
|
#endif
|
||||||
hr = D3D11CreateDeviceAndSwapChain(NULL,
|
hr = D3D11CreateDeviceAndSwapChain(NULL,
|
||||||
hDriverType, NULL, deviceFlags, NULL, 0,
|
hDriverType, NULL, deviceFlags, NULL, 0,
|
||||||
D3D11_SDK_VERSION, &hDXGISwapChainDesc,
|
D3D11_SDK_VERSION, &hDXGISwapChainDesc,
|
||||||
&g_pSwapChain, &g_pd3dDevice,
|
&g_pSwapChain, &g_pd3dDevice,
|
||||||
&hFeatureLevel, &g_pd3dDeviceContext);
|
&hFeatureLevel, &g_pd3dDeviceContext);
|
||||||
@ -1491,30 +1464,29 @@ initD3D11(HWND hWnd) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
// set break points on directx errors
|
// set break points on directx errors
|
||||||
ID3D11Debug *d3dDebug = nullptr;
|
ID3D11Debug *d3dDebug = nullptr;
|
||||||
hr = g_pd3dDevice->QueryInterface(__uuidof(ID3D11Debug), (void**)&d3dDebug);
|
hr = g_pd3dDevice->QueryInterface(__uuidof(ID3D11Debug), (void**)&d3dDebug);
|
||||||
if (SUCCEEDED(hr)) {
|
if (SUCCEEDED(hr)) {
|
||||||
|
ID3D11InfoQueue *d3dInfoQueue = nullptr;
|
||||||
|
hr = d3dDebug->QueryInterface(__uuidof(ID3D11InfoQueue), (void**)&d3dInfoQueue);
|
||||||
|
if (SUCCEEDED(hr)) {
|
||||||
|
|
||||||
ID3D11InfoQueue *d3dInfoQueue = nullptr;
|
d3dInfoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_CORRUPTION, true);
|
||||||
hr = d3dDebug->QueryInterface(__uuidof(ID3D11InfoQueue), (void**)&d3dInfoQueue);
|
d3dInfoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_ERROR, true);
|
||||||
if (SUCCEEDED(hr)) {
|
d3dInfoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_WARNING, true);
|
||||||
|
|
||||||
d3dInfoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_CORRUPTION, true);
|
D3D11_MESSAGE_ID denied[] = { D3D11_MESSAGE_ID_SETPRIVATEDATA_CHANGINGPARAMS };
|
||||||
d3dInfoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_ERROR, true);
|
D3D11_INFO_QUEUE_FILTER filter;
|
||||||
d3dInfoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_WARNING, true);
|
memset(&filter, 0, sizeof(filter));
|
||||||
|
filter.DenyList.NumIDs = _countof(denied);
|
||||||
D3D11_MESSAGE_ID denied[] = { D3D11_MESSAGE_ID_SETPRIVATEDATA_CHANGINGPARAMS };
|
filter.DenyList.pIDList = denied;
|
||||||
D3D11_INFO_QUEUE_FILTER filter;
|
d3dInfoQueue->AddStorageFilterEntries(&filter);
|
||||||
memset(&filter, 0, sizeof(filter));
|
|
||||||
filter.DenyList.NumIDs = _countof(denied);
|
|
||||||
filter.DenyList.pIDList = denied;
|
|
||||||
d3dInfoQueue->AddStorageFilterEntries(&filter);
|
|
||||||
|
|
||||||
d3dInfoQueue->Release();
|
d3dInfoQueue->Release();
|
||||||
}
|
}
|
||||||
d3dDebug->Release();
|
d3dDebug->Release();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// create rasterizer
|
// create rasterizer
|
||||||
|
@ -34,7 +34,6 @@ cbuffer Transform : register( b0 ) {
|
|||||||
|
|
||||||
cbuffer Tessellation : register( b1 ) {
|
cbuffer Tessellation : register( b1 ) {
|
||||||
float TessLevel;
|
float TessLevel;
|
||||||
int GregoryQuadOffsetBase;
|
|
||||||
int PrimitiveIdBase;
|
int PrimitiveIdBase;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -61,7 +60,7 @@ float OsdTessLevel()
|
|||||||
}
|
}
|
||||||
int OsdGregoryQuadOffsetBase()
|
int OsdGregoryQuadOffsetBase()
|
||||||
{
|
{
|
||||||
return GregoryQuadOffsetBase;
|
return 0;
|
||||||
}
|
}
|
||||||
int OsdPrimitiveIdBase()
|
int OsdPrimitiveIdBase()
|
||||||
{
|
{
|
||||||
|
@ -25,7 +25,6 @@
|
|||||||
#include <D3D11.h>
|
#include <D3D11.h>
|
||||||
#include <D3Dcompiler.h>
|
#include <D3Dcompiler.h>
|
||||||
|
|
||||||
#include <osd/d3d11DrawContext.h>
|
|
||||||
#include <far/error.h>
|
#include <far/error.h>
|
||||||
|
|
||||||
#include <osd/cpuD3D11VertexBuffer.h>
|
#include <osd/cpuD3D11VertexBuffer.h>
|
||||||
@ -57,7 +56,9 @@
|
|||||||
#include <osd/d3d11ComputeEvaluator.h>
|
#include <osd/d3d11ComputeEvaluator.h>
|
||||||
|
|
||||||
#include <osd/d3d11Mesh.h>
|
#include <osd/d3d11Mesh.h>
|
||||||
OpenSubdiv::Osd::D3D11MeshInterface *g_mesh;
|
#include <osd/d3d11LegacyGregoryPatchTable.h>
|
||||||
|
OpenSubdiv::Osd::D3D11MeshInterface *g_mesh = NULL;
|
||||||
|
OpenSubdiv::Osd::D3D11LegacyGregoryPatchTable *g_legacyGregoryPatchTable = NULL;
|
||||||
|
|
||||||
#include <common/vtr_utils.h>
|
#include <common/vtr_utils.h>
|
||||||
#include "../common/stopwatch.h"
|
#include "../common/stopwatch.h"
|
||||||
@ -321,7 +322,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level, int kernel, Scheme scheme=
|
|||||||
g_mesh = new Osd::Mesh<Osd::CpuD3D11VertexBuffer,
|
g_mesh = new Osd::Mesh<Osd::CpuD3D11VertexBuffer,
|
||||||
Far::StencilTables,
|
Far::StencilTables,
|
||||||
Osd::CpuEvaluator,
|
Osd::CpuEvaluator,
|
||||||
Osd::D3D11DrawContext,
|
Osd::D3D11PatchTable,
|
||||||
ID3D11DeviceContext>(
|
ID3D11DeviceContext>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
@ -333,7 +334,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level, int kernel, Scheme scheme=
|
|||||||
g_mesh = new Osd::Mesh<Osd::CpuD3D11VertexBuffer,
|
g_mesh = new Osd::Mesh<Osd::CpuD3D11VertexBuffer,
|
||||||
Far::StencilTables,
|
Far::StencilTables,
|
||||||
Osd::OmpEvaluator,
|
Osd::OmpEvaluator,
|
||||||
Osd::D3D11DrawContext,
|
Osd::D3D11PatchTable,
|
||||||
ID3D11DeviceContext>(
|
ID3D11DeviceContext>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
@ -345,7 +346,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level, int kernel, Scheme scheme=
|
|||||||
g_mesh = new Osd::Mesh<Osd::CpuD3D11VertexBuffer,
|
g_mesh = new Osd::Mesh<Osd::CpuD3D11VertexBuffer,
|
||||||
Far::StencilTables,
|
Far::StencilTables,
|
||||||
Osd::TbbEvaluator,
|
Osd::TbbEvaluator,
|
||||||
Osd::D3D11DrawContext,
|
Osd::D3D11PatchTable,
|
||||||
ID3D11DeviceContext>(
|
ID3D11DeviceContext>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
@ -358,7 +359,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level, int kernel, Scheme scheme=
|
|||||||
g_mesh = new Osd::Mesh<Osd::CLD3D11VertexBuffer,
|
g_mesh = new Osd::Mesh<Osd::CLD3D11VertexBuffer,
|
||||||
Osd::CLStencilTables,
|
Osd::CLStencilTables,
|
||||||
Osd::CLEvaluator,
|
Osd::CLEvaluator,
|
||||||
Osd::D3D11DrawContext,
|
Osd::D3D11PatchTable,
|
||||||
CLD3D11DeviceContext>(
|
CLD3D11DeviceContext>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
@ -372,7 +373,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level, int kernel, Scheme scheme=
|
|||||||
g_mesh = new Osd::Mesh<Osd::CudaD3D11VertexBuffer,
|
g_mesh = new Osd::Mesh<Osd::CudaD3D11VertexBuffer,
|
||||||
Osd::CudaStencilTables,
|
Osd::CudaStencilTables,
|
||||||
Osd::CudaEvaluator,
|
Osd::CudaEvaluator,
|
||||||
Osd::D3D11DrawContext,
|
Osd::D3D11PatchTable,
|
||||||
ID3D11DeviceContext>(
|
ID3D11DeviceContext>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
@ -384,7 +385,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level, int kernel, Scheme scheme=
|
|||||||
g_mesh = new Osd::Mesh<Osd::D3D11VertexBuffer,
|
g_mesh = new Osd::Mesh<Osd::D3D11VertexBuffer,
|
||||||
Osd::D3D11StencilTables,
|
Osd::D3D11StencilTables,
|
||||||
Osd::D3D11ComputeEvaluator,
|
Osd::D3D11ComputeEvaluator,
|
||||||
Osd::D3D11DrawContext,
|
Osd::D3D11PatchTable,
|
||||||
ID3D11DeviceContext>(
|
ID3D11DeviceContext>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
@ -396,6 +397,15 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level, int kernel, Scheme scheme=
|
|||||||
printf("Unsupported kernel %s\n", getKernelName(kernel));
|
printf("Unsupported kernel %s\n", getKernelName(kernel));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// legacy gregory
|
||||||
|
delete g_legacyGregoryPatchTable;
|
||||||
|
g_legacyGregoryPatchTable = NULL;
|
||||||
|
if (g_endCap == kEndCapLegacyGregory) {
|
||||||
|
g_legacyGregoryPatchTable =
|
||||||
|
Osd::D3D11LegacyGregoryPatchTable::Create(
|
||||||
|
g_mesh->GetFarPatchTables(), g_pd3dDeviceContext);
|
||||||
|
}
|
||||||
|
|
||||||
// compute model bounding
|
// compute model bounding
|
||||||
float min[3] = { FLT_MAX, FLT_MAX, FLT_MAX};
|
float min[3] = { FLT_MAX, FLT_MAX, FLT_MAX};
|
||||||
float max[3] = {-FLT_MAX, -FLT_MAX, -FLT_MAX};
|
float max[3] = {-FLT_MAX, -FLT_MAX, -FLT_MAX};
|
||||||
@ -618,16 +628,16 @@ ShaderCache g_shaderCache;
|
|||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
static void
|
static void
|
||||||
bindProgram(Effect effect, OpenSubdiv::Osd::DrawContext::PatchArray const & patch) {
|
bindProgram(Effect effect, OpenSubdiv::Osd::D3D11PatchTable::PatchArray const & patch) {
|
||||||
|
|
||||||
EffectDesc effectDesc(patch.GetDescriptor(), effect);
|
EffectDesc effectDesc(patch.GetDescriptor(), effect);
|
||||||
|
typedef OpenSubdiv::Far::PatchDescriptor Descriptor;
|
||||||
|
|
||||||
// only legacy gregory needs maxValence and numElements
|
// only legacy gregory needs maxValence and numElements
|
||||||
// neither legacy gregory nor gregory basis need single crease
|
// neither legacy gregory nor gregory basis need single crease
|
||||||
typedef OpenSubdiv::Far::PatchDescriptor Descriptor;
|
|
||||||
if (patch.GetDescriptor().GetType() == Descriptor::GREGORY or
|
if (patch.GetDescriptor().GetType() == Descriptor::GREGORY or
|
||||||
patch.GetDescriptor().GetType() == Descriptor::GREGORY_BOUNDARY) {
|
patch.GetDescriptor().GetType() == Descriptor::GREGORY_BOUNDARY) {
|
||||||
int maxValence = g_mesh->GetDrawContext()->GetMaxValence();
|
int maxValence = g_mesh->GetMaxValence();
|
||||||
int numElements = 6;
|
int numElements = 6;
|
||||||
effectDesc.maxValence = maxValence;
|
effectDesc.maxValence = maxValence;
|
||||||
effectDesc.numElements = numElements;
|
effectDesc.numElements = numElements;
|
||||||
@ -706,8 +716,9 @@ bindProgram(Effect effect, OpenSubdiv::Osd::DrawContext::PatchArray const & patc
|
|||||||
Tessellation * pData = ( Tessellation* )MappedResource.pData;
|
Tessellation * pData = ( Tessellation* )MappedResource.pData;
|
||||||
|
|
||||||
pData->TessLevel = static_cast<float>(1 << g_tessLevel);
|
pData->TessLevel = static_cast<float>(1 << g_tessLevel);
|
||||||
pData->GregoryQuadOffsetBase = patch.GetQuadOffsetIndex();
|
pData->GregoryQuadOffsetBase = g_legacyGregoryPatchTable ?
|
||||||
pData->PrimitiveIdBase = patch.GetPatchIndex();
|
g_legacyGregoryPatchTable->GetQuadOffsetsBase(patch.GetDescriptor().GetType()) : 0;
|
||||||
|
pData->PrimitiveIdBase = patch.GetPrimitiveIdBase();
|
||||||
|
|
||||||
g_pd3dDeviceContext->Unmap( g_pcbTessellation, 0 );
|
g_pd3dDeviceContext->Unmap( g_pcbTessellation, 0 );
|
||||||
}
|
}
|
||||||
@ -761,22 +772,23 @@ bindProgram(Effect effect, OpenSubdiv::Osd::DrawContext::PatchArray const & patc
|
|||||||
g_pd3dDeviceContext->PSSetConstantBuffers(2, 1, &g_pcbLighting);
|
g_pd3dDeviceContext->PSSetConstantBuffers(2, 1, &g_pcbLighting);
|
||||||
g_pd3dDeviceContext->PSSetConstantBuffers(3, 1, &g_pcbMaterial);
|
g_pd3dDeviceContext->PSSetConstantBuffers(3, 1, &g_pcbMaterial);
|
||||||
|
|
||||||
if (g_mesh->GetDrawContext()->vertexBufferSRV) {
|
ID3D11ShaderResourceView *srv = g_mesh->GetPatchTable()->GetPatchParamSRV();
|
||||||
g_pd3dDeviceContext->VSSetShaderResources(0, 1, &g_mesh->GetDrawContext()->vertexBufferSRV);
|
if (srv) {
|
||||||
|
g_pd3dDeviceContext->HSSetShaderResources(0, 1, &srv); // t0
|
||||||
|
g_pd3dDeviceContext->DSSetShaderResources(0, 1, &srv);
|
||||||
|
g_pd3dDeviceContext->PSSetShaderResources(0, 1, &srv);
|
||||||
}
|
}
|
||||||
if (g_mesh->GetDrawContext()->vertexValenceBufferSRV) {
|
|
||||||
g_pd3dDeviceContext->VSSetShaderResources(1, 1, &g_mesh->GetDrawContext()->vertexValenceBufferSRV);
|
if (g_legacyGregoryPatchTable) {
|
||||||
}
|
ID3D11ShaderResourceView *vertexSRV =
|
||||||
if (g_mesh->GetDrawContext()->quadOffsetBufferSRV) {
|
g_legacyGregoryPatchTable->GetVertexSRV();
|
||||||
g_pd3dDeviceContext->HSSetShaderResources(2, 1, &g_mesh->GetDrawContext()->quadOffsetBufferSRV);
|
ID3D11ShaderResourceView *vertexValenceSRV =
|
||||||
}
|
g_legacyGregoryPatchTable->GetVertexValenceSRV();
|
||||||
if (g_mesh->GetDrawContext()->patchParamBufferSRV) {
|
ID3D11ShaderResourceView *quadOffsetsSRV =
|
||||||
g_pd3dDeviceContext->HSSetShaderResources(
|
g_legacyGregoryPatchTable->GetQuadOffsetsSRV();
|
||||||
3, 1, &g_mesh->GetDrawContext()->patchParamBufferSRV);
|
g_pd3dDeviceContext->VSSetShaderResources(2, 1, &vertexSRV); // t2
|
||||||
g_pd3dDeviceContext->DSSetShaderResources(
|
g_pd3dDeviceContext->VSSetShaderResources(3, 1, &vertexValenceSRV);// t3
|
||||||
3, 1, &g_mesh->GetDrawContext()->patchParamBufferSRV);
|
g_pd3dDeviceContext->HSSetShaderResources(4, 1, &quadOffsetsSRV); // t4
|
||||||
g_pd3dDeviceContext->PSSetShaderResources(
|
|
||||||
3, 1, &g_mesh->GetDrawContext()->patchParamBufferSRV);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -796,32 +808,23 @@ display() {
|
|||||||
ID3D11Buffer *buffer = g_mesh->BindVertexBuffer();
|
ID3D11Buffer *buffer = g_mesh->BindVertexBuffer();
|
||||||
assert(buffer);
|
assert(buffer);
|
||||||
|
|
||||||
|
// vertex texture update for legacy gregory drawing
|
||||||
|
if (g_legacyGregoryPatchTable) {
|
||||||
|
g_legacyGregoryPatchTable->UpdateVertexBuffer(buffer,
|
||||||
|
g_mesh->GetNumVertices(),
|
||||||
|
6,
|
||||||
|
g_pd3dDeviceContext);
|
||||||
|
}
|
||||||
|
|
||||||
UINT hStrides = 6*sizeof(float);
|
UINT hStrides = 6*sizeof(float);
|
||||||
UINT hOffsets = 0;
|
UINT hOffsets = 0;
|
||||||
g_pd3dDeviceContext->IASetVertexBuffers(0, 1, &buffer, &hStrides, &hOffsets);
|
g_pd3dDeviceContext->IASetVertexBuffers(0, 1, &buffer, &hStrides, &hOffsets);
|
||||||
|
|
||||||
OpenSubdiv::Osd::DrawContext::PatchArrayVector const & patches = g_mesh->GetDrawContext()->GetPatchArrays();
|
OpenSubdiv::Osd::D3D11PatchTable::PatchArrayVector const & patches =
|
||||||
|
g_mesh->GetPatchTable()->GetPatchArrays();
|
||||||
|
|
||||||
g_pd3dDeviceContext->IASetIndexBuffer(g_mesh->GetDrawContext()->patchIndexBuffer, DXGI_FORMAT_R32_UINT, 0);
|
g_pd3dDeviceContext->IASetIndexBuffer(
|
||||||
|
g_mesh->GetPatchTable()->GetPatchIndexBuffer(), DXGI_FORMAT_R32_UINT, 0);
|
||||||
// cv drawing
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
if (g_drawPatchCVs) {
|
|
||||||
|
|
||||||
bindProgram(kPoint, OpenSubdiv::Osd::DrawContext::PatchArray());
|
|
||||||
|
|
||||||
g_pd3dDeviceContext->IASetPrimitiveTopology(
|
|
||||||
D3D11_PRIMITIVE_TOPOLOGY_POINTLIST);
|
|
||||||
|
|
||||||
for (int i=0; i<(int)patches.size(); ++i) {
|
|
||||||
OpenSubdiv::Osd::DrawContext::PatchArray const & patch = patches[i];
|
|
||||||
|
|
||||||
g_pd3dDeviceContext->DrawIndexed(patch.GetNumIndices(),
|
|
||||||
patch.GetVertIndex(), 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// patch drawing
|
// patch drawing
|
||||||
int patchCount[12]; // [Type] (see far/patchTables.h)
|
int patchCount[12]; // [Type] (see far/patchTables.h)
|
||||||
@ -829,7 +832,7 @@ display() {
|
|||||||
int numDrawCalls = 0;
|
int numDrawCalls = 0;
|
||||||
|
|
||||||
for (int i=0; i<(int)patches.size(); ++i) {
|
for (int i=0; i<(int)patches.size(); ++i) {
|
||||||
OpenSubdiv::Osd::DrawContext::PatchArray const & patch = patches[i];
|
OpenSubdiv::Osd::D3D11PatchTable::PatchArray const & patch = patches[i];
|
||||||
|
|
||||||
OpenSubdiv::Far::PatchDescriptor desc = patch.GetDescriptor();
|
OpenSubdiv::Far::PatchDescriptor desc = patch.GetDescriptor();
|
||||||
OpenSubdiv::Far::PatchDescriptor::Type patchType = desc.GetType();
|
OpenSubdiv::Far::PatchDescriptor::Type patchType = desc.GetType();
|
||||||
@ -868,13 +871,15 @@ display() {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
};
|
}
|
||||||
|
|
||||||
bindProgram(GetEffect(), patch);
|
bindProgram(GetEffect(), patch);
|
||||||
|
|
||||||
g_pd3dDeviceContext->IASetPrimitiveTopology(topology);
|
g_pd3dDeviceContext->IASetPrimitiveTopology(topology);
|
||||||
|
|
||||||
g_pd3dDeviceContext->DrawIndexed(patch.GetNumIndices(), patch.GetVertIndex(), 0);
|
g_pd3dDeviceContext->DrawIndexed(
|
||||||
|
patch.GetNumPatches() * desc.GetNumControlVertices(),
|
||||||
|
patch.GetIndexBase(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_fpsTimer.Stop();
|
g_fpsTimer.Stop();
|
||||||
@ -1254,7 +1259,8 @@ initD3D11(HWND hWnd) {
|
|||||||
D3D11_RASTERIZER_DESC rasterDesc;
|
D3D11_RASTERIZER_DESC rasterDesc;
|
||||||
ZeroMemory(&rasterDesc, sizeof(rasterDesc));
|
ZeroMemory(&rasterDesc, sizeof(rasterDesc));
|
||||||
rasterDesc.AntialiasedLineEnable = false;
|
rasterDesc.AntialiasedLineEnable = false;
|
||||||
rasterDesc.CullMode = D3D11_CULL_NONE; // XXX
|
//rasterDesc.CullMode = D3D11_CULL_NONE; // XXX
|
||||||
|
rasterDesc.CullMode = D3D11_CULL_BACK; // XXX
|
||||||
rasterDesc.DepthBias = 0;
|
rasterDesc.DepthBias = 0;
|
||||||
rasterDesc.DepthBiasClamp = 0.0f;
|
rasterDesc.DepthBiasClamp = 0.0f;
|
||||||
rasterDesc.DepthClipEnable = true;
|
rasterDesc.DepthClipEnable = true;
|
||||||
|
@ -45,7 +45,6 @@ GLFWmonitor* g_primary=0;
|
|||||||
#include <osd/cpuEvaluator.h>
|
#include <osd/cpuEvaluator.h>
|
||||||
#include <osd/cpuVertexBuffer.h>
|
#include <osd/cpuVertexBuffer.h>
|
||||||
#include <osd/cpuGLVertexBuffer.h>
|
#include <osd/cpuGLVertexBuffer.h>
|
||||||
#include <osd/drawContext.h>
|
|
||||||
#include <osd/mesh.h>
|
#include <osd/mesh.h>
|
||||||
|
|
||||||
#include <far/gregoryBasis.h>
|
#include <far/gregoryBasis.h>
|
||||||
|
@ -42,7 +42,6 @@
|
|||||||
GLFWwindow* g_window = 0;
|
GLFWwindow* g_window = 0;
|
||||||
GLFWmonitor* g_primary = 0;
|
GLFWmonitor* g_primary = 0;
|
||||||
|
|
||||||
#include <osd/glDrawContext.h>
|
|
||||||
#include <far/error.h>
|
#include <far/error.h>
|
||||||
|
|
||||||
#include <osd/cpuEvaluator.h>
|
#include <osd/cpuEvaluator.h>
|
||||||
@ -155,6 +154,51 @@ struct Program {
|
|||||||
GLuint attrColor;
|
GLuint attrColor;
|
||||||
} g_defaultProgram;
|
} g_defaultProgram;
|
||||||
|
|
||||||
|
struct FVarData
|
||||||
|
{
|
||||||
|
FVarData() :
|
||||||
|
textureBuffer(0) {
|
||||||
|
}
|
||||||
|
~FVarData() {
|
||||||
|
Release();
|
||||||
|
}
|
||||||
|
void Release() {
|
||||||
|
if (textureBuffer)
|
||||||
|
glDeleteTextures(1, &textureBuffer);
|
||||||
|
textureBuffer = 0;
|
||||||
|
}
|
||||||
|
void Create(OpenSubdiv::Far::PatchTables const *patchTables,
|
||||||
|
int fvarWidth, std::vector<float> const & fvarSrcData) {
|
||||||
|
Release();
|
||||||
|
OpenSubdiv::Far::ConstIndexArray indices =
|
||||||
|
patchTables->GetFVarPatchesValues(0);
|
||||||
|
|
||||||
|
// expand fvardata to per-patch array
|
||||||
|
std::vector<float> data;
|
||||||
|
data.reserve(indices.size() * fvarWidth);
|
||||||
|
|
||||||
|
for (int fvert = 0; fvert < (int)indices.size(); ++fvert) {
|
||||||
|
int index = indices[fvert] * fvarWidth;
|
||||||
|
for (int i = 0; i < fvarWidth; ++i) {
|
||||||
|
data.push_back(fvarSrcData[index++]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
GLuint buffer;
|
||||||
|
glGenBuffers(1, &buffer);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, buffer);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, data.size()*sizeof(float),
|
||||||
|
&data[0], GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
glBindTexture(GL_TEXTURE_BUFFER, textureBuffer);
|
||||||
|
glTexBuffer(GL_TEXTURE_BUFFER, GL_R32F, buffer);
|
||||||
|
glBindTexture(GL_TEXTURE_BUFFER, 0);
|
||||||
|
glBindTexture(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
|
glDeleteBuffers(1, &buffer);
|
||||||
|
}
|
||||||
|
GLuint textureBuffer;
|
||||||
|
} g_fvarData;
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
static GLuint
|
static GLuint
|
||||||
compileShader(GLenum shaderType, const char *source) {
|
compileShader(GLenum shaderType, const char *source) {
|
||||||
@ -362,7 +406,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level, Scheme scheme = kCatmark)
|
|||||||
g_mesh = new OpenSubdiv::Osd::Mesh<OpenSubdiv::Osd::CpuGLVertexBuffer,
|
g_mesh = new OpenSubdiv::Osd::Mesh<OpenSubdiv::Osd::CpuGLVertexBuffer,
|
||||||
OpenSubdiv::Far::StencilTables,
|
OpenSubdiv::Far::StencilTables,
|
||||||
OpenSubdiv::Osd::CpuEvaluator,
|
OpenSubdiv::Osd::CpuEvaluator,
|
||||||
OpenSubdiv::Osd::GLDrawContext>(
|
OpenSubdiv::Osd::GLPatchTable>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
numVaryingElements,
|
numVaryingElements,
|
||||||
@ -372,7 +416,9 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level, Scheme scheme = kCatmark)
|
|||||||
|
|
||||||
InterpolateFVarData(*refiner, *shape, fvarData);
|
InterpolateFVarData(*refiner, *shape, fvarData);
|
||||||
|
|
||||||
g_mesh->SetFVarDataChannel(shape->GetFVarWidth(), fvarData);
|
// set fvardata to texture buffer
|
||||||
|
g_fvarData.Create(g_mesh->GetFarPatchTables(),
|
||||||
|
shape->GetFVarWidth(), fvarData);
|
||||||
|
|
||||||
delete shape;
|
delete shape;
|
||||||
|
|
||||||
@ -397,7 +443,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level, Scheme scheme = kCatmark)
|
|||||||
// -------- VAO
|
// -------- VAO
|
||||||
glBindVertexArray(g_vao);
|
glBindVertexArray(g_vao);
|
||||||
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_mesh->GetDrawContext()->GetPatchIndexBuffer());
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_mesh->GetPatchTable()->GetPatchIndexBuffer());
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, g_mesh->BindVertexBuffer());
|
glBindBuffer(GL_ARRAY_BUFFER, g_mesh->BindVertexBuffer());
|
||||||
|
|
||||||
glEnableVertexAttribArray(0);
|
glEnableVertexAttribArray(0);
|
||||||
@ -672,21 +718,13 @@ public:
|
|||||||
// assign texture locations
|
// assign texture locations
|
||||||
GLint loc;
|
GLint loc;
|
||||||
glUseProgram(program);
|
glUseProgram(program);
|
||||||
if ((loc = glGetUniformLocation(program, "OsdVertexBuffer")) != -1) {
|
if ((loc = glGetUniformLocation(program, "OsdPatchParamBuffer")) != -1) {
|
||||||
glUniform1i(loc, 0); // GL_TEXTURE0
|
glUniform1i(loc, 0); // GL_TEXTURE0
|
||||||
}
|
}
|
||||||
if ((loc = glGetUniformLocation(program, "OsdValenceBuffer")) != -1) {
|
if ((loc = glGetUniformLocation(program, "OsdFVarDataBuffer")) != -1) {
|
||||||
glUniform1i(loc, 1); // GL_TEXTURE1
|
glUniform1i(loc, 1); // GL_TEXTURE1
|
||||||
}
|
}
|
||||||
if ((loc = glGetUniformLocation(program, "OsdQuadOffsetBuffer")) != -1) {
|
|
||||||
glUniform1i(loc, 2); // GL_TEXTURE2
|
|
||||||
}
|
|
||||||
if ((loc = glGetUniformLocation(program, "OsdPatchParamBuffer")) != -1) {
|
|
||||||
glUniform1i(loc, 3); // GL_TEXTURE3
|
|
||||||
}
|
|
||||||
if ((loc = glGetUniformLocation(program, "OsdFVarDataBuffer")) != -1) {
|
|
||||||
glUniform1i(loc, 4); // GL_TEXTURE4
|
|
||||||
}
|
|
||||||
|
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
@ -733,50 +771,23 @@ updateUniformBlocks() {
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
bindTextures() {
|
bindTextures() {
|
||||||
if (g_mesh->GetDrawContext()->GetVertexTextureBuffer()) {
|
if (g_mesh->GetPatchTable()->GetPatchParamTextureBuffer()) {
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_BUFFER,
|
glBindTexture(GL_TEXTURE_BUFFER,
|
||||||
g_mesh->GetDrawContext()->GetVertexTextureBuffer());
|
g_mesh->GetPatchTable()->GetPatchParamTextureBuffer());
|
||||||
}
|
|
||||||
if (g_mesh->GetDrawContext()->GetVertexValenceTextureBuffer()) {
|
|
||||||
glActiveTexture(GL_TEXTURE1);
|
|
||||||
glBindTexture(GL_TEXTURE_BUFFER,
|
|
||||||
g_mesh->GetDrawContext()->GetVertexValenceTextureBuffer());
|
|
||||||
}
|
|
||||||
if (g_mesh->GetDrawContext()->GetQuadOffsetsTextureBuffer()) {
|
|
||||||
glActiveTexture(GL_TEXTURE2);
|
|
||||||
glBindTexture(GL_TEXTURE_BUFFER,
|
|
||||||
g_mesh->GetDrawContext()->GetQuadOffsetsTextureBuffer());
|
|
||||||
}
|
|
||||||
if (g_mesh->GetDrawContext()->GetPatchParamTextureBuffer()) {
|
|
||||||
glActiveTexture(GL_TEXTURE3);
|
|
||||||
glBindTexture(GL_TEXTURE_BUFFER,
|
|
||||||
g_mesh->GetDrawContext()->GetPatchParamTextureBuffer());
|
|
||||||
}
|
|
||||||
if (g_mesh->GetDrawContext()->GetFvarDataTextureBuffer()) {
|
|
||||||
glActiveTexture(GL_TEXTURE4);
|
|
||||||
glBindTexture(GL_TEXTURE_BUFFER,
|
|
||||||
g_mesh->GetDrawContext()->GetFvarDataTextureBuffer());
|
|
||||||
}
|
}
|
||||||
|
glActiveTexture(GL_TEXTURE1);
|
||||||
|
glBindTexture(GL_TEXTURE_BUFFER, g_fvarData.textureBuffer);
|
||||||
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static GLenum
|
static GLenum
|
||||||
bindProgram(Effect effect, OpenSubdiv::Osd::DrawContext::PatchArray const & patch) {
|
bindProgram(Effect effect, OpenSubdiv::Osd::GLPatchTable::PatchArray const & patch) {
|
||||||
|
|
||||||
EffectDesc effectDesc(patch.GetDescriptor(), effect);
|
EffectDesc effectDesc(patch.GetDescriptor(), effect);
|
||||||
|
|
||||||
typedef OpenSubdiv::Far::PatchDescriptor Descriptor;
|
typedef OpenSubdiv::Far::PatchDescriptor Descriptor;
|
||||||
if (patch.GetDescriptor().GetType() == Descriptor::GREGORY or
|
|
||||||
patch.GetDescriptor().GetType() == Descriptor::GREGORY_BOUNDARY) {
|
|
||||||
// only legacy gregory needs maxValence and numElements
|
|
||||||
int maxValence = g_mesh->GetDrawContext()->GetMaxValence();
|
|
||||||
int numElements = 3;
|
|
||||||
|
|
||||||
effectDesc.maxValence = maxValence;
|
|
||||||
effectDesc.numElements = numElements;
|
|
||||||
}
|
|
||||||
|
|
||||||
// lookup shader cache (compile the shader if needed)
|
// lookup shader cache (compile the shader if needed)
|
||||||
GLDrawConfig *config = g_shaderCache.GetDrawConfig(effectDesc);
|
GLDrawConfig *config = g_shaderCache.GetDrawConfig(effectDesc);
|
||||||
@ -787,14 +798,10 @@ bindProgram(Effect effect, OpenSubdiv::Osd::DrawContext::PatchArray const & patc
|
|||||||
glUseProgram(program);
|
glUseProgram(program);
|
||||||
|
|
||||||
// bind standalone uniforms
|
// bind standalone uniforms
|
||||||
GLint uniformGregoryQuadOffsetBase =
|
|
||||||
glGetUniformLocation(program, "GregoryQuadOffsetBase");
|
|
||||||
GLint uniformPrimitiveIdBase =
|
GLint uniformPrimitiveIdBase =
|
||||||
glGetUniformLocation(program, "PrimitiveIdBase");
|
glGetUniformLocation(program, "PrimitiveIdBase");
|
||||||
if (uniformGregoryQuadOffsetBase >= 0)
|
|
||||||
glUniform1i(uniformGregoryQuadOffsetBase, patch.GetQuadOffsetIndex());
|
|
||||||
if (uniformPrimitiveIdBase >=0)
|
if (uniformPrimitiveIdBase >=0)
|
||||||
glUniform1i(uniformPrimitiveIdBase, patch.GetPatchIndex());
|
glUniform1i(uniformPrimitiveIdBase, patch.GetPrimitiveIdBase());
|
||||||
|
|
||||||
// return primtype
|
// return primtype
|
||||||
GLenum primType;
|
GLenum primType;
|
||||||
@ -858,8 +865,8 @@ display() {
|
|||||||
|
|
||||||
glBindVertexArray(g_vao);
|
glBindVertexArray(g_vao);
|
||||||
|
|
||||||
OpenSubdiv::Osd::DrawContext::PatchArrayVector const & patches =
|
OpenSubdiv::Osd::GLPatchTable::PatchArrayVector const & patches =
|
||||||
g_mesh->GetDrawContext()->GetPatchArrays();
|
g_mesh->GetPatchTable()->GetPatchArrays();
|
||||||
|
|
||||||
if (g_displayStyle == kWire)
|
if (g_displayStyle == kWire)
|
||||||
glDisable(GL_CULL_FACE);
|
glDisable(GL_CULL_FACE);
|
||||||
@ -869,12 +876,15 @@ display() {
|
|||||||
|
|
||||||
// patch drawing
|
// patch drawing
|
||||||
for (int i = 0; i < (int)patches.size(); ++i) {
|
for (int i = 0; i < (int)patches.size(); ++i) {
|
||||||
OpenSubdiv::Osd::DrawContext::PatchArray const & patch = patches[i];
|
OpenSubdiv::Osd::GLPatchTable::PatchArray const & patch = patches[i];
|
||||||
|
|
||||||
GLenum primType = bindProgram(GetEffect(), patch);
|
GLenum primType = bindProgram(GetEffect(), patch);
|
||||||
|
|
||||||
glDrawElements(primType, patch.GetNumIndices(), GL_UNSIGNED_INT,
|
glDrawElements(
|
||||||
(void *)(patch.GetVertIndex() * sizeof(unsigned int)));
|
primType,
|
||||||
|
patch.GetNumPatches()*patch.GetDescriptor().GetNumControlVertices(),
|
||||||
|
GL_UNSIGNED_INT,
|
||||||
|
(void *)(patch.GetIndexBase() * sizeof(unsigned int)));
|
||||||
}
|
}
|
||||||
if (g_displayStyle == kWire)
|
if (g_displayStyle == kWire)
|
||||||
glEnable(GL_CULL_FACE);
|
glEnable(GL_CULL_FACE);
|
||||||
@ -896,12 +906,15 @@ display() {
|
|||||||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||||
|
|
||||||
for (int i = 0; i < (int)patches.size(); ++i) {
|
for (int i = 0; i < (int)patches.size(); ++i) {
|
||||||
OpenSubdiv::Osd::DrawContext::PatchArray const & patch = patches[i];
|
OpenSubdiv::Osd::GLPatchTable::PatchArray const & patch = patches[i];
|
||||||
|
|
||||||
GLenum primType = bindProgram(GetEffect(/*uvDraw=*/ true), patch);
|
GLenum primType = bindProgram(GetEffect(/*uvDraw=*/ true), patch);
|
||||||
|
|
||||||
glDrawElements(primType, patch.GetNumIndices(), GL_UNSIGNED_INT,
|
glDrawElements(
|
||||||
(void *)(patch.GetVertIndex() * sizeof(unsigned int)));
|
primType,
|
||||||
|
patch.GetNumPatches()*patch.GetDescriptor().GetNumControlVertices(),
|
||||||
|
GL_UNSIGNED_INT,
|
||||||
|
(void *)(patch.GetIndexBase() * sizeof(unsigned int)));
|
||||||
}
|
}
|
||||||
|
|
||||||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||||||
|
@ -82,7 +82,6 @@
|
|||||||
#include <osd/glVertexBuffer.h>
|
#include <osd/glVertexBuffer.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <osd/glDrawContext.h>
|
|
||||||
#include <osd/glMesh.h>
|
#include <osd/glMesh.h>
|
||||||
|
|
||||||
#include <common/vtr_utils.h>
|
#include <common/vtr_utils.h>
|
||||||
@ -235,7 +234,7 @@ createOsdMesh(std::string const &kernel,
|
|||||||
return new Osd::Mesh<Osd::CpuGLVertexBuffer,
|
return new Osd::Mesh<Osd::CpuGLVertexBuffer,
|
||||||
Far::StencilTables,
|
Far::StencilTables,
|
||||||
Osd::CpuEvaluator,
|
Osd::CpuEvaluator,
|
||||||
Osd::GLDrawContext>(
|
Osd::GLPatchTable>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
numVaryingElements,
|
numVaryingElements,
|
||||||
@ -245,7 +244,7 @@ createOsdMesh(std::string const &kernel,
|
|||||||
return new Osd::Mesh<Osd::CpuGLVertexBuffer,
|
return new Osd::Mesh<Osd::CpuGLVertexBuffer,
|
||||||
Far::StencilTables,
|
Far::StencilTables,
|
||||||
Osd::OmpEvaluator,
|
Osd::OmpEvaluator,
|
||||||
Osd::GLDrawContext>(
|
Osd::GLPatchTable>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
numVaryingElements,
|
numVaryingElements,
|
||||||
@ -256,7 +255,7 @@ createOsdMesh(std::string const &kernel,
|
|||||||
return new Osd::Mesh<Osd::CpuGLVertexBuffer,
|
return new Osd::Mesh<Osd::CpuGLVertexBuffer,
|
||||||
Far::StencilTables,
|
Far::StencilTables,
|
||||||
Osd::TbbEvaluator,
|
Osd::TbbEvaluator,
|
||||||
Osd::GLDrawContext>(
|
Osd::GLPatchTable>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
numVaryingElements,
|
numVaryingElements,
|
||||||
@ -267,7 +266,7 @@ createOsdMesh(std::string const &kernel,
|
|||||||
return new Osd::Mesh<Osd::CLGLVertexBuffer,
|
return new Osd::Mesh<Osd::CLGLVertexBuffer,
|
||||||
Osd::CLStencilTables,
|
Osd::CLStencilTables,
|
||||||
Osd::CLEvaluator,
|
Osd::CLEvaluator,
|
||||||
Osd::GLDrawContext,
|
Osd::GLPatchTable,
|
||||||
CLDeviceContext>(
|
CLDeviceContext>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
@ -281,7 +280,7 @@ createOsdMesh(std::string const &kernel,
|
|||||||
return new Osd::Mesh<Osd::CudaGLVertexBuffer,
|
return new Osd::Mesh<Osd::CudaGLVertexBuffer,
|
||||||
Osd::CudaStencilTables,
|
Osd::CudaStencilTables,
|
||||||
Osd::CudaEvaluator,
|
Osd::CudaEvaluator,
|
||||||
Osd::GLDrawContext>(
|
Osd::GLPatchTable>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
numVaryingElements,
|
numVaryingElements,
|
||||||
@ -292,7 +291,7 @@ createOsdMesh(std::string const &kernel,
|
|||||||
return new Osd::Mesh<Osd::GLVertexBuffer,
|
return new Osd::Mesh<Osd::GLVertexBuffer,
|
||||||
Osd::GLStencilTablesTBO,
|
Osd::GLStencilTablesTBO,
|
||||||
Osd::GLXFBEvaluator,
|
Osd::GLXFBEvaluator,
|
||||||
Osd::GLDrawContext>(
|
Osd::GLPatchTable>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
numVaryingElements,
|
numVaryingElements,
|
||||||
@ -303,7 +302,7 @@ createOsdMesh(std::string const &kernel,
|
|||||||
return new Osd::Mesh<Osd::GLVertexBuffer,
|
return new Osd::Mesh<Osd::GLVertexBuffer,
|
||||||
Osd::GLStencilTablesSSBO,
|
Osd::GLStencilTablesSSBO,
|
||||||
Osd::GLComputeEvaluator,
|
Osd::GLComputeEvaluator,
|
||||||
Osd::GLDrawContext>(
|
Osd::GLPatchTable>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
numVaryingElements,
|
numVaryingElements,
|
||||||
@ -405,7 +404,7 @@ void runTest(ShapeDesc const &shapeDesc, std::string const &kernel,
|
|||||||
glBindVertexArray(vao);
|
glBindVertexArray(vao);
|
||||||
|
|
||||||
// bind vertex
|
// bind vertex
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->GetDrawContext()->GetPatchIndexBuffer());
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->GetPatchTable()->GetPatchIndexBuffer());
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, mesh->BindVertexBuffer());
|
glBindBuffer(GL_ARRAY_BUFFER, mesh->BindVertexBuffer());
|
||||||
|
|
||||||
glEnableVertexAttribArray(0);
|
glEnableVertexAttribArray(0);
|
||||||
@ -417,17 +416,17 @@ void runTest(ShapeDesc const &shapeDesc, std::string const &kernel,
|
|||||||
(const void*)(sizeof(GLfloat)*3));
|
(const void*)(sizeof(GLfloat)*3));
|
||||||
|
|
||||||
// bind patchparam
|
// bind patchparam
|
||||||
if (mesh->GetDrawContext()->GetPatchParamTextureBuffer()) {
|
if (mesh->GetPatchTable()->GetPatchParamTextureBuffer()) {
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_BUFFER,
|
glBindTexture(GL_TEXTURE_BUFFER,
|
||||||
mesh->GetDrawContext()->GetPatchParamTextureBuffer());
|
mesh->GetPatchTable()->GetPatchParamTextureBuffer());
|
||||||
}
|
}
|
||||||
|
|
||||||
Osd::DrawContext::PatchArrayVector const & patches =
|
Osd::GLPatchTable::PatchArrayVector const & patches =
|
||||||
mesh->GetDrawContext()->GetPatchArrays();
|
mesh->GetPatchTable()->GetPatchArrays();
|
||||||
|
|
||||||
for (int i=0; i<(int)patches.size(); ++i) {
|
for (int i=0; i<(int)patches.size(); ++i) {
|
||||||
Osd::DrawContext::PatchArray const & patch = patches[i];
|
Osd::GLPatchTable::PatchArray const & patch = patches[i];
|
||||||
Far::PatchDescriptor desc = patch.GetDescriptor();
|
Far::PatchDescriptor desc = patch.GetDescriptor();
|
||||||
Far::PatchDescriptor::Type patchType = desc.GetType();
|
Far::PatchDescriptor::Type patchType = desc.GetType();
|
||||||
|
|
||||||
@ -457,13 +456,15 @@ void runTest(ShapeDesc const &shapeDesc, std::string const &kernel,
|
|||||||
glProgramUniform4f(program, diffuseColor,
|
glProgramUniform4f(program, diffuseColor,
|
||||||
color[0], color[1], color[2], color[3]);
|
color[0], color[1], color[2], color[3]);
|
||||||
glProgramUniform1i(program, uniformPrimitiveIdBase,
|
glProgramUniform1i(program, uniformPrimitiveIdBase,
|
||||||
patch.GetPatchIndex());
|
patch.GetPrimitiveIdBase());
|
||||||
} else {
|
} else {
|
||||||
glProgramUniform4f(program, diffuseColor, 0.4f, 0.4f, 0.8f, 1);
|
glProgramUniform4f(program, diffuseColor, 0.4f, 0.4f, 0.8f, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
glDrawElements(primType, patch.GetNumIndices(), GL_UNSIGNED_INT,
|
glDrawElements(primType,
|
||||||
(void *)(patch.GetVertIndex() * sizeof(unsigned int)));
|
patch.GetNumPatches() * desc.GetNumControlVertices(),
|
||||||
|
GL_UNSIGNED_INT,
|
||||||
|
(void *)(patch.GetIndexBase() * sizeof(unsigned int)));
|
||||||
}
|
}
|
||||||
|
|
||||||
glDisableVertexAttribArray(0);
|
glDisableVertexAttribArray(0);
|
||||||
|
@ -42,7 +42,6 @@
|
|||||||
GLFWwindow* g_window=0;
|
GLFWwindow* g_window=0;
|
||||||
GLFWmonitor* g_primary=0;
|
GLFWmonitor* g_primary=0;
|
||||||
|
|
||||||
#include <osd/glDrawContext.h>
|
|
||||||
#include <far/error.h>
|
#include <far/error.h>
|
||||||
#include <far/ptexIndices.h>
|
#include <far/ptexIndices.h>
|
||||||
|
|
||||||
@ -241,7 +240,7 @@ createOsdMesh() {
|
|||||||
g_mesh = new OpenSubdiv::Osd::Mesh<OpenSubdiv::Osd::CpuGLVertexBuffer,
|
g_mesh = new OpenSubdiv::Osd::Mesh<OpenSubdiv::Osd::CpuGLVertexBuffer,
|
||||||
OpenSubdiv::Far::StencilTables,
|
OpenSubdiv::Far::StencilTables,
|
||||||
OpenSubdiv::Osd::CpuEvaluator,
|
OpenSubdiv::Osd::CpuEvaluator,
|
||||||
OpenSubdiv::Osd::GLDrawContext>(
|
OpenSubdiv::Osd::GLPatchTable>(
|
||||||
refiner, 3, 0, g_level, bits);
|
refiner, 3, 0, g_level, bits);
|
||||||
|
|
||||||
// compute model bounding
|
// compute model bounding
|
||||||
@ -265,7 +264,7 @@ createOsdMesh() {
|
|||||||
// -------- VAO
|
// -------- VAO
|
||||||
glBindVertexArray(g_vao);
|
glBindVertexArray(g_vao);
|
||||||
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_mesh->GetDrawContext()->GetPatchIndexBuffer());
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_mesh->GetPatchTable()->GetPatchIndexBuffer());
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, g_mesh->BindVertexBuffer());
|
glBindBuffer(GL_ARRAY_BUFFER, g_mesh->BindVertexBuffer());
|
||||||
|
|
||||||
glEnableVertexAttribArray(0);
|
glEnableVertexAttribArray(0);
|
||||||
@ -462,17 +461,8 @@ public:
|
|||||||
GLint loc;
|
GLint loc;
|
||||||
glUseProgram(program);
|
glUseProgram(program);
|
||||||
|
|
||||||
if ((loc = glGetUniformLocation(program, "OsdVertexBuffer")) != -1) {
|
|
||||||
glUniform1i(loc, 0); // GL_TEXTURE0
|
|
||||||
}
|
|
||||||
if ((loc = glGetUniformLocation(program, "OsdValenceBuffer")) != -1) {
|
|
||||||
glUniform1i(loc, 1); // GL_TEXTURE1
|
|
||||||
}
|
|
||||||
if ((loc = glGetUniformLocation(program, "OsdQuadOffsetBuffer")) != -1) {
|
|
||||||
glUniform1i(loc, 2); // GL_TEXTURE2
|
|
||||||
}
|
|
||||||
if ((loc = glGetUniformLocation(program, "OsdPatchParamBuffer")) != -1) {
|
if ((loc = glGetUniformLocation(program, "OsdPatchParamBuffer")) != -1) {
|
||||||
glUniform1i(loc, 3); // GL_TEXTURE3
|
glUniform1i(loc, 0); // GL_TEXTURE0
|
||||||
}
|
}
|
||||||
|
|
||||||
if (effectDesc.effect.paint) {
|
if (effectDesc.effect.paint) {
|
||||||
@ -586,25 +576,11 @@ static void bindTextures(Effect effect) {
|
|||||||
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
} else {
|
} else {
|
||||||
if (g_mesh->GetDrawContext()->GetVertexTextureBuffer()) {
|
if (g_mesh->GetPatchTable()->GetPatchParamTextureBuffer()) {
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_BUFFER,
|
glBindTexture(
|
||||||
g_mesh->GetDrawContext()->GetVertexTextureBuffer());
|
GL_TEXTURE_BUFFER,
|
||||||
}
|
g_mesh->GetPatchTable()->GetPatchParamTextureBuffer());
|
||||||
if (g_mesh->GetDrawContext()->GetVertexValenceTextureBuffer()) {
|
|
||||||
glActiveTexture(GL_TEXTURE1);
|
|
||||||
glBindTexture(GL_TEXTURE_BUFFER,
|
|
||||||
g_mesh->GetDrawContext()->GetVertexValenceTextureBuffer());
|
|
||||||
}
|
|
||||||
if (g_mesh->GetDrawContext()->GetQuadOffsetsTextureBuffer()) {
|
|
||||||
glActiveTexture(GL_TEXTURE2);
|
|
||||||
glBindTexture(GL_TEXTURE_BUFFER,
|
|
||||||
g_mesh->GetDrawContext()->GetQuadOffsetsTextureBuffer());
|
|
||||||
}
|
|
||||||
if (g_mesh->GetDrawContext()->GetPatchParamTextureBuffer()) {
|
|
||||||
glActiveTexture(GL_TEXTURE3);
|
|
||||||
glBindTexture(GL_TEXTURE_BUFFER,
|
|
||||||
g_mesh->GetDrawContext()->GetPatchParamTextureBuffer());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// color ptex
|
// color ptex
|
||||||
@ -621,19 +597,10 @@ static void bindTextures(Effect effect) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static GLuint
|
static GLuint
|
||||||
bindProgram(Effect effect, OpenSubdiv::Osd::DrawContext::PatchArray const & patch) {
|
bindProgram(Effect effect, OpenSubdiv::Osd::GLPatchTable::PatchArray const & patch) {
|
||||||
|
|
||||||
EffectDesc effectDesc(patch.GetDescriptor(), effect);
|
EffectDesc effectDesc(patch.GetDescriptor(), effect);
|
||||||
|
|
||||||
// only legacy gregory needs maxValence and numElements
|
|
||||||
typedef OpenSubdiv::Far::PatchDescriptor Descriptor;
|
|
||||||
if (patch.GetDescriptor().GetType() == Descriptor::GREGORY or
|
|
||||||
patch.GetDescriptor().GetType() == Descriptor::GREGORY_BOUNDARY) {
|
|
||||||
int maxValence = g_mesh->GetDrawContext()->GetMaxValence();
|
|
||||||
effectDesc.maxValence = maxValence;
|
|
||||||
effectDesc.numElements = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
// lookup shader cache (compile the shader if needed)
|
// lookup shader cache (compile the shader if needed)
|
||||||
GLDrawConfig *config = g_shaderCache.GetDrawConfig(effectDesc);
|
GLDrawConfig *config = g_shaderCache.GetDrawConfig(effectDesc);
|
||||||
if (!config) return 0;
|
if (!config) return 0;
|
||||||
@ -646,15 +613,10 @@ bindProgram(Effect effect, OpenSubdiv::Osd::DrawContext::PatchArray const & patc
|
|||||||
if (uniformImageSize >= 0)
|
if (uniformImageSize >= 0)
|
||||||
glUniform1i(uniformImageSize, g_pageSize);
|
glUniform1i(uniformImageSize, g_pageSize);
|
||||||
|
|
||||||
GLint uniformGregoryQuadOffsetBase =
|
|
||||||
glGetUniformLocation(program, "GregoryQuadOffsetBase");
|
|
||||||
if (uniformGregoryQuadOffsetBase >= 0)
|
|
||||||
glUniform1i(uniformGregoryQuadOffsetBase, patch.GetQuadOffsetIndex());
|
|
||||||
|
|
||||||
GLint uniformPrimitiveIdBase =
|
GLint uniformPrimitiveIdBase =
|
||||||
glGetUniformLocation(program, "PrimitiveIdBase");
|
glGetUniformLocation(program, "PrimitiveIdBase");
|
||||||
if (uniformPrimitiveIdBase >= 0)
|
if (uniformPrimitiveIdBase >= 0)
|
||||||
glUniform1i(uniformPrimitiveIdBase, patch.GetPatchIndex());
|
glUniform1i(uniformPrimitiveIdBase, patch.GetPrimitiveIdBase());
|
||||||
|
|
||||||
|
|
||||||
return program;
|
return program;
|
||||||
@ -708,12 +670,12 @@ display() {
|
|||||||
|
|
||||||
glBindVertexArray(g_vao);
|
glBindVertexArray(g_vao);
|
||||||
|
|
||||||
OpenSubdiv::Osd::DrawContext::PatchArrayVector const & patches =
|
OpenSubdiv::Osd::GLPatchTable::PatchArrayVector const & patches =
|
||||||
g_mesh->GetDrawContext()->GetPatchArrays();
|
g_mesh->GetPatchTable()->GetPatchArrays();
|
||||||
|
|
||||||
// patch drawing
|
// patch drawing
|
||||||
for (int i=0; i<(int)patches.size(); ++i) {
|
for (int i=0; i<(int)patches.size(); ++i) {
|
||||||
OpenSubdiv::Osd::DrawContext::PatchArray const & patch = patches[i];
|
OpenSubdiv::Osd::GLPatchTable::PatchArray const & patch = patches[i];
|
||||||
OpenSubdiv::Far::PatchDescriptor desc = patch.GetDescriptor();
|
OpenSubdiv::Far::PatchDescriptor desc = patch.GetDescriptor();
|
||||||
|
|
||||||
GLenum primType = GL_PATCHES;
|
GLenum primType = GL_PATCHES;
|
||||||
@ -724,8 +686,9 @@ display() {
|
|||||||
glProgramUniform4f(program, diffuseColor, 1, 1, 1, 1);
|
glProgramUniform4f(program, diffuseColor, 1, 1, 1, 1);
|
||||||
|
|
||||||
glDrawElements(primType,
|
glDrawElements(primType,
|
||||||
patch.GetNumIndices(), GL_UNSIGNED_INT,
|
patch.GetNumPatches() * desc.GetNumControlVertices(),
|
||||||
(void *)(patch.GetVertIndex() * sizeof(unsigned int)));
|
GL_UNSIGNED_INT,
|
||||||
|
(void *)(patch.GetIndexBase() * sizeof(unsigned int)));
|
||||||
}
|
}
|
||||||
|
|
||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
@ -844,13 +807,13 @@ drawStroke(int x, int y) {
|
|||||||
effect.paint = 1;
|
effect.paint = 1;
|
||||||
bindTextures(effect);
|
bindTextures(effect);
|
||||||
|
|
||||||
OpenSubdiv::Osd::DrawContext::PatchArrayVector const & patches =
|
OpenSubdiv::Osd::GLPatchTable::PatchArrayVector const & patches =
|
||||||
g_mesh->GetDrawContext()->GetPatchArrays();
|
g_mesh->GetPatchTable()->GetPatchArrays();
|
||||||
|
|
||||||
// patch drawing
|
// patch drawing
|
||||||
for (int i=0; i<(int)patches.size(); ++i) {
|
for (int i=0; i<(int)patches.size(); ++i) {
|
||||||
|
|
||||||
OpenSubdiv::Osd::DrawContext::PatchArray const & patch = patches[i];
|
OpenSubdiv::Osd::GLPatchTable::PatchArray const & patch = patches[i];
|
||||||
OpenSubdiv::Far::PatchDescriptor desc = patch.GetDescriptor();
|
OpenSubdiv::Far::PatchDescriptor desc = patch.GetDescriptor();
|
||||||
|
|
||||||
GLenum primType = GL_PATCHES;
|
GLenum primType = GL_PATCHES;
|
||||||
@ -859,8 +822,9 @@ drawStroke(int x, int y) {
|
|||||||
bindProgram(effect, patch);
|
bindProgram(effect, patch);
|
||||||
|
|
||||||
glDrawElements(primType,
|
glDrawElements(primType,
|
||||||
patch.GetNumIndices(), GL_UNSIGNED_INT,
|
patch.GetNumPatches() * desc.GetNumControlVertices(),
|
||||||
(void *)(patch.GetVertIndex() * sizeof(unsigned int)));
|
GL_UNSIGNED_INT,
|
||||||
|
(void *)(patch.GetIndexBase() * sizeof(unsigned int)));
|
||||||
}
|
}
|
||||||
|
|
||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
|
@ -49,8 +49,6 @@ GLFWmonitor* g_primary = 0;
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
#include <osd/glDrawContext.h>
|
|
||||||
#include <far/error.h>
|
#include <far/error.h>
|
||||||
|
|
||||||
#include <osd/cpuEvaluator.h>
|
#include <osd/cpuEvaluator.h>
|
||||||
@ -783,17 +781,8 @@ public:
|
|||||||
GLint loc;
|
GLint loc;
|
||||||
// patch textures
|
// patch textures
|
||||||
glUseProgram(program);
|
glUseProgram(program);
|
||||||
if ((loc = glGetUniformLocation(program, "OsdVertexBuffer")) != -1) {
|
|
||||||
glUniform1i(loc, 0); // GL_TEXTURE0
|
|
||||||
}
|
|
||||||
if ((loc = glGetUniformLocation(program, "OsdValenceBuffer")) != -1) {
|
|
||||||
glUniform1i(loc, 1); // GL_TEXTURE1
|
|
||||||
}
|
|
||||||
if ((loc = glGetUniformLocation(program, "OsdQuadOffsetBuffer")) != -1) {
|
|
||||||
glUniform1i(loc, 2); // GL_TEXTURE2
|
|
||||||
}
|
|
||||||
if ((loc = glGetUniformLocation(program, "OsdPatchParamBuffer")) != -1) {
|
if ((loc = glGetUniformLocation(program, "OsdPatchParamBuffer")) != -1) {
|
||||||
glUniform1i(loc, 3); // GL_TEXTURE3
|
glUniform1i(loc, 0); // GL_TEXTURE0
|
||||||
}
|
}
|
||||||
|
|
||||||
// environment textures
|
// environment textures
|
||||||
@ -948,7 +937,7 @@ createOsdMesh(int level, int kernel) {
|
|||||||
g_mesh = new OpenSubdiv::Osd::Mesh<OpenSubdiv::Osd::CpuGLVertexBuffer,
|
g_mesh = new OpenSubdiv::Osd::Mesh<OpenSubdiv::Osd::CpuGLVertexBuffer,
|
||||||
OpenSubdiv::Far::StencilTables,
|
OpenSubdiv::Far::StencilTables,
|
||||||
OpenSubdiv::Osd::CpuEvaluator,
|
OpenSubdiv::Osd::CpuEvaluator,
|
||||||
OpenSubdiv::Osd::GLDrawContext>(
|
OpenSubdiv::Osd::GLPatchTable>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
numVaryingElements,
|
numVaryingElements,
|
||||||
@ -958,7 +947,7 @@ createOsdMesh(int level, int kernel) {
|
|||||||
g_mesh = new OpenSubdiv::Osd::Mesh<OpenSubdiv::Osd::CpuGLVertexBuffer,
|
g_mesh = new OpenSubdiv::Osd::Mesh<OpenSubdiv::Osd::CpuGLVertexBuffer,
|
||||||
OpenSubdiv::Far::StencilTables,
|
OpenSubdiv::Far::StencilTables,
|
||||||
OpenSubdiv::Osd::OmpEvaluator,
|
OpenSubdiv::Osd::OmpEvaluator,
|
||||||
OpenSubdiv::Osd::GLDrawContext>(
|
OpenSubdiv::Osd::GLPatchTable>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
numVaryingElements,
|
numVaryingElements,
|
||||||
@ -969,7 +958,7 @@ createOsdMesh(int level, int kernel) {
|
|||||||
g_mesh = new OpenSubdiv::Osd::Mesh<OpenSubdiv::Osd::CpuGLVertexBuffer,
|
g_mesh = new OpenSubdiv::Osd::Mesh<OpenSubdiv::Osd::CpuGLVertexBuffer,
|
||||||
OpenSubdiv::Far::StencilTables,
|
OpenSubdiv::Far::StencilTables,
|
||||||
OpenSubdiv::Osd::TbbEvaluator,
|
OpenSubdiv::Osd::TbbEvaluator,
|
||||||
OpenSubdiv::Osd::GLDrawContext>(
|
OpenSubdiv::Osd::GLPatchTable>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
numVaryingElements,
|
numVaryingElements,
|
||||||
@ -981,7 +970,7 @@ createOsdMesh(int level, int kernel) {
|
|||||||
g_mesh = new OpenSubdiv::Osd::Mesh<OpenSubdiv::Osd::CLGLVertexBuffer,
|
g_mesh = new OpenSubdiv::Osd::Mesh<OpenSubdiv::Osd::CLGLVertexBuffer,
|
||||||
OpenSubdiv::Osd::CLStencilTables,
|
OpenSubdiv::Osd::CLStencilTables,
|
||||||
OpenSubdiv::Osd::CLEvaluator,
|
OpenSubdiv::Osd::CLEvaluator,
|
||||||
OpenSubdiv::Osd::GLDrawContext,
|
OpenSubdiv::Osd::GLPatchTable,
|
||||||
CLDeviceContext>(
|
CLDeviceContext>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
@ -995,7 +984,7 @@ createOsdMesh(int level, int kernel) {
|
|||||||
g_mesh = new OpenSubdiv::Osd::Mesh<OpenSubdiv::Osd::CudaGLVertexBuffer,
|
g_mesh = new OpenSubdiv::Osd::Mesh<OpenSubdiv::Osd::CudaGLVertexBuffer,
|
||||||
OpenSubdiv::Osd::CudaStencilTables,
|
OpenSubdiv::Osd::CudaStencilTables,
|
||||||
OpenSubdiv::Osd::CudaEvaluator,
|
OpenSubdiv::Osd::CudaEvaluator,
|
||||||
OpenSubdiv::Osd::GLDrawContext>(
|
OpenSubdiv::Osd::GLPatchTable>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
numVaryingElements,
|
numVaryingElements,
|
||||||
@ -1007,7 +996,7 @@ createOsdMesh(int level, int kernel) {
|
|||||||
g_mesh = new OpenSubdiv::Osd::Mesh<OpenSubdiv::Osd::GLVertexBuffer,
|
g_mesh = new OpenSubdiv::Osd::Mesh<OpenSubdiv::Osd::GLVertexBuffer,
|
||||||
OpenSubdiv::Osd::GLStencilTablesTBO,
|
OpenSubdiv::Osd::GLStencilTablesTBO,
|
||||||
OpenSubdiv::Osd::GLXFBEvaluator,
|
OpenSubdiv::Osd::GLXFBEvaluator,
|
||||||
OpenSubdiv::Osd::GLDrawContext>(
|
OpenSubdiv::Osd::GLPatchTable>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
numVaryingElements,
|
numVaryingElements,
|
||||||
@ -1020,7 +1009,7 @@ createOsdMesh(int level, int kernel) {
|
|||||||
g_mesh = new OpenSubdiv::Osd::Mesh<OpenSubdiv::Osd::GLVertexBuffer,
|
g_mesh = new OpenSubdiv::Osd::Mesh<OpenSubdiv::Osd::GLVertexBuffer,
|
||||||
OpenSubdiv::Osd::GLStencilTablesSSBO,
|
OpenSubdiv::Osd::GLStencilTablesSSBO,
|
||||||
OpenSubdiv::Osd::GLComputeEvaluator,
|
OpenSubdiv::Osd::GLComputeEvaluator,
|
||||||
OpenSubdiv::Osd::GLDrawContext>(
|
OpenSubdiv::Osd::GLPatchTable>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
numVaryingElements,
|
numVaryingElements,
|
||||||
@ -1051,7 +1040,7 @@ createOsdMesh(int level, int kernel) {
|
|||||||
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 6, 0);
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 6, 0);
|
||||||
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 6, (float*)12);
|
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 6, (float*)12);
|
||||||
}
|
}
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_mesh->GetDrawContext()->GetPatchIndexBuffer());
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_mesh->GetPatchTable()->GetPatchIndexBuffer());
|
||||||
|
|
||||||
// ------ Cage VAO
|
// ------ Cage VAO
|
||||||
glBindVertexArray(g_cageEdgeVAO);
|
glBindVertexArray(g_cageEdgeVAO);
|
||||||
@ -1201,27 +1190,10 @@ updateConstantUniformBlock() {
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
bindTextures() {
|
bindTextures() {
|
||||||
#if defined(GL_ARB_tessellation_shader) || defined(GL_VERSION_4_0)
|
if (g_mesh->GetPatchTable()->GetPatchParamTextureBuffer()) {
|
||||||
if (g_mesh->GetDrawContext()->GetVertexTextureBuffer()) {
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_BUFFER,
|
glBindTexture(GL_TEXTURE_BUFFER,
|
||||||
g_mesh->GetDrawContext()->GetVertexTextureBuffer());
|
g_mesh->GetPatchTable()->GetPatchParamTextureBuffer());
|
||||||
}
|
|
||||||
if (g_mesh->GetDrawContext()->GetVertexValenceTextureBuffer()) {
|
|
||||||
glActiveTexture(GL_TEXTURE1);
|
|
||||||
glBindTexture(GL_TEXTURE_BUFFER,
|
|
||||||
g_mesh->GetDrawContext()->GetVertexValenceTextureBuffer());
|
|
||||||
}
|
|
||||||
if (g_mesh->GetDrawContext()->GetQuadOffsetsTextureBuffer()) {
|
|
||||||
glActiveTexture(GL_TEXTURE2);
|
|
||||||
glBindTexture(GL_TEXTURE_BUFFER,
|
|
||||||
g_mesh->GetDrawContext()->GetQuadOffsetsTextureBuffer());
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (g_mesh->GetDrawContext()->GetPatchParamTextureBuffer()) {
|
|
||||||
glActiveTexture(GL_TEXTURE3);
|
|
||||||
glBindTexture(GL_TEXTURE_BUFFER,
|
|
||||||
g_mesh->GetDrawContext()->GetPatchParamTextureBuffer());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// other textures
|
// other textures
|
||||||
@ -1273,18 +1245,9 @@ bindTextures() {
|
|||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
static GLenum
|
static GLenum
|
||||||
bindProgram(Effect effect,
|
bindProgram(Effect effect,
|
||||||
OpenSubdiv::Osd::DrawContext::PatchArray const & patch) {
|
OpenSubdiv::Osd::GLPatchTable::PatchArray const & patch) {
|
||||||
EffectDesc effectDesc(patch.GetDescriptor(), effect);
|
EffectDesc effectDesc(patch.GetDescriptor(), effect);
|
||||||
|
|
||||||
// only legacy gregory needs maxValence and numElements
|
|
||||||
typedef OpenSubdiv::Far::PatchDescriptor Descriptor;
|
|
||||||
if (patch.GetDescriptor().GetType() == Descriptor::GREGORY or
|
|
||||||
patch.GetDescriptor().GetType() == Descriptor::GREGORY_BOUNDARY) {
|
|
||||||
int maxValence = g_mesh->GetDrawContext()->GetMaxValence();
|
|
||||||
effectDesc.maxValence = maxValence;
|
|
||||||
effectDesc.numElements = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
GLDrawConfig *config = g_shaderCache.GetDrawConfig(effectDesc);
|
GLDrawConfig *config = g_shaderCache.GetDrawConfig(effectDesc);
|
||||||
if (!config) return 0;
|
if (!config) return 0;
|
||||||
|
|
||||||
@ -1293,15 +1256,10 @@ bindProgram(Effect effect,
|
|||||||
glUseProgram(program);
|
glUseProgram(program);
|
||||||
|
|
||||||
// bind standalone uniforms
|
// bind standalone uniforms
|
||||||
GLint uniformGregoryQuadOffsetBase =
|
|
||||||
glGetUniformLocation(program, "GregoryQuadOffsetBase");
|
|
||||||
GLint uniformPrimitiveIdBase =
|
GLint uniformPrimitiveIdBase =
|
||||||
glGetUniformLocation(program, "PrimitiveIdBase");
|
glGetUniformLocation(program, "PrimitiveIdBase");
|
||||||
|
|
||||||
if (uniformGregoryQuadOffsetBase >= 0)
|
|
||||||
glUniform1i(uniformGregoryQuadOffsetBase, patch.GetQuadOffsetIndex());
|
|
||||||
if (uniformPrimitiveIdBase >= 0)
|
if (uniformPrimitiveIdBase >= 0)
|
||||||
glUniform1i(uniformPrimitiveIdBase, patch.GetPatchIndex());
|
glUniform1i(uniformPrimitiveIdBase, patch.GetPrimitiveIdBase());
|
||||||
|
|
||||||
GLenum primType;
|
GLenum primType;
|
||||||
switch(effectDesc.desc.GetType()) {
|
switch(effectDesc.desc.GetType()) {
|
||||||
@ -1334,10 +1292,10 @@ drawModel() {
|
|||||||
glBindVertexArray(g_vao);
|
glBindVertexArray(g_vao);
|
||||||
|
|
||||||
// patch drawing
|
// patch drawing
|
||||||
OpenSubdiv::Osd::DrawContext::PatchArrayVector const & patches =
|
OpenSubdiv::Osd::GLPatchTable::PatchArrayVector const & patches =
|
||||||
g_mesh->GetDrawContext()->GetPatchArrays();
|
g_mesh->GetPatchTable()->GetPatchArrays();
|
||||||
for (int i = 0; i < (int)patches.size(); ++i) {
|
for (int i = 0; i < (int)patches.size(); ++i) {
|
||||||
OpenSubdiv::Osd::DrawContext::PatchArray const & patch = patches[i];
|
OpenSubdiv::Osd::GLPatchTable::PatchArray const & patch = patches[i];
|
||||||
|
|
||||||
Effect effect;
|
Effect effect;
|
||||||
effect.value = 0;
|
effect.value = 0;
|
||||||
@ -1357,8 +1315,9 @@ drawModel() {
|
|||||||
GLenum primType = bindProgram(effect, patch);
|
GLenum primType = bindProgram(effect, patch);
|
||||||
|
|
||||||
glDrawElements(primType,
|
glDrawElements(primType,
|
||||||
patch.GetNumIndices(), GL_UNSIGNED_INT,
|
patch.GetNumPatches() * patch.GetDescriptor().GetNumControlVertices(),
|
||||||
(void *)(patch.GetVertIndex() * sizeof(unsigned int)));
|
GL_UNSIGNED_INT,
|
||||||
|
(void *)(patch.GetIndexBase() * sizeof(unsigned int)));
|
||||||
}
|
}
|
||||||
|
|
||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
|
@ -43,7 +43,6 @@ GLFWwindow* g_window=0;
|
|||||||
GLFWmonitor* g_primary=0;
|
GLFWmonitor* g_primary=0;
|
||||||
|
|
||||||
#include <far/error.h>
|
#include <far/error.h>
|
||||||
#include <osd/glDrawContext.h>
|
|
||||||
|
|
||||||
#include <osd/cpuEvaluator.h>
|
#include <osd/cpuEvaluator.h>
|
||||||
#include <osd/cpuGLVertexBuffer.h>
|
#include <osd/cpuGLVertexBuffer.h>
|
||||||
@ -83,7 +82,9 @@ GLFWmonitor* g_primary=0;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <osd/glMesh.h>
|
#include <osd/glMesh.h>
|
||||||
OpenSubdiv::Osd::GLMeshInterface *g_mesh;
|
#include <osd/glLegacyGregoryPatchTable.h>
|
||||||
|
OpenSubdiv::Osd::GLMeshInterface *g_mesh = NULL;
|
||||||
|
OpenSubdiv::Osd::GLLegacyGregoryPatchTable *g_legacyGregoryPatchTable = NULL;
|
||||||
|
|
||||||
#include <common/vtr_utils.h>
|
#include <common/vtr_utils.h>
|
||||||
#include "../common/stopwatch.h"
|
#include "../common/stopwatch.h"
|
||||||
@ -232,6 +233,55 @@ struct Program
|
|||||||
GLuint attrColor;
|
GLuint attrColor;
|
||||||
} g_defaultProgram;
|
} g_defaultProgram;
|
||||||
|
|
||||||
|
// XXX:
|
||||||
|
// this struct meant to be used as a stopgap entity until we fully implement
|
||||||
|
// face-varying stuffs into patch table.
|
||||||
|
//
|
||||||
|
struct FVarData
|
||||||
|
{
|
||||||
|
FVarData() :
|
||||||
|
textureBuffer(0) {
|
||||||
|
}
|
||||||
|
~FVarData() {
|
||||||
|
Release();
|
||||||
|
}
|
||||||
|
void Release() {
|
||||||
|
if (textureBuffer)
|
||||||
|
glDeleteTextures(1, &textureBuffer);
|
||||||
|
textureBuffer = 0;
|
||||||
|
}
|
||||||
|
void Create(OpenSubdiv::Far::PatchTables const *patchTables,
|
||||||
|
int fvarWidth, std::vector<float> const & fvarSrcData) {
|
||||||
|
Release();
|
||||||
|
OpenSubdiv::Far::ConstIndexArray indices =
|
||||||
|
patchTables->GetFVarPatchesValues(0);
|
||||||
|
|
||||||
|
// expand fvardata to per-patch array
|
||||||
|
std::vector<float> data;
|
||||||
|
data.reserve(indices.size() * fvarWidth);
|
||||||
|
|
||||||
|
for (int fvert = 0; fvert < (int)indices.size(); ++fvert) {
|
||||||
|
int index = indices[fvert] * fvarWidth;
|
||||||
|
for (int i = 0; i < fvarWidth; ++i) {
|
||||||
|
data.push_back(fvarSrcData[index++]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
GLuint buffer;
|
||||||
|
glGenBuffers(1, &buffer);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, buffer);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, data.size()*sizeof(float),
|
||||||
|
&data[0], GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
glBindTexture(GL_TEXTURE_BUFFER, textureBuffer);
|
||||||
|
glTexBuffer(GL_TEXTURE_BUFFER, GL_R32F, buffer);
|
||||||
|
glBindTexture(GL_TEXTURE_BUFFER, 0);
|
||||||
|
glBindTexture(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
|
glDeleteBuffers(1, &buffer);
|
||||||
|
}
|
||||||
|
GLuint textureBuffer;
|
||||||
|
} g_fvarData;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
checkGLErrors(std::string const & where = "")
|
checkGLErrors(std::string const & where = "")
|
||||||
{
|
{
|
||||||
@ -532,7 +582,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level, int kernel, Scheme scheme=
|
|||||||
g_mesh = new Osd::Mesh<Osd::CpuGLVertexBuffer,
|
g_mesh = new Osd::Mesh<Osd::CpuGLVertexBuffer,
|
||||||
Far::StencilTables,
|
Far::StencilTables,
|
||||||
Osd::CpuEvaluator,
|
Osd::CpuEvaluator,
|
||||||
Osd::GLDrawContext>(
|
Osd::GLPatchTable>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
numVaryingElements,
|
numVaryingElements,
|
||||||
@ -542,7 +592,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level, int kernel, Scheme scheme=
|
|||||||
g_mesh = new Osd::Mesh<Osd::CpuGLVertexBuffer,
|
g_mesh = new Osd::Mesh<Osd::CpuGLVertexBuffer,
|
||||||
Far::StencilTables,
|
Far::StencilTables,
|
||||||
Osd::OmpEvaluator,
|
Osd::OmpEvaluator,
|
||||||
Osd::GLDrawContext>(
|
Osd::GLPatchTable>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
numVaryingElements,
|
numVaryingElements,
|
||||||
@ -553,7 +603,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level, int kernel, Scheme scheme=
|
|||||||
g_mesh = new Osd::Mesh<Osd::CpuGLVertexBuffer,
|
g_mesh = new Osd::Mesh<Osd::CpuGLVertexBuffer,
|
||||||
Far::StencilTables,
|
Far::StencilTables,
|
||||||
Osd::TbbEvaluator,
|
Osd::TbbEvaluator,
|
||||||
Osd::GLDrawContext>(
|
Osd::GLPatchTable>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
numVaryingElements,
|
numVaryingElements,
|
||||||
@ -566,7 +616,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level, int kernel, Scheme scheme=
|
|||||||
g_mesh = new Osd::Mesh<Osd::CLGLVertexBuffer,
|
g_mesh = new Osd::Mesh<Osd::CLGLVertexBuffer,
|
||||||
Osd::CLStencilTables,
|
Osd::CLStencilTables,
|
||||||
Osd::CLEvaluator,
|
Osd::CLEvaluator,
|
||||||
Osd::GLDrawContext,
|
Osd::GLPatchTable,
|
||||||
CLDeviceContext>(
|
CLDeviceContext>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
@ -580,7 +630,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level, int kernel, Scheme scheme=
|
|||||||
g_mesh = new Osd::Mesh<Osd::CudaGLVertexBuffer,
|
g_mesh = new Osd::Mesh<Osd::CudaGLVertexBuffer,
|
||||||
Osd::CudaStencilTables,
|
Osd::CudaStencilTables,
|
||||||
Osd::CudaEvaluator,
|
Osd::CudaEvaluator,
|
||||||
Osd::GLDrawContext>(
|
Osd::GLPatchTable>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
numVaryingElements,
|
numVaryingElements,
|
||||||
@ -592,7 +642,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level, int kernel, Scheme scheme=
|
|||||||
g_mesh = new Osd::Mesh<Osd::GLVertexBuffer,
|
g_mesh = new Osd::Mesh<Osd::GLVertexBuffer,
|
||||||
Osd::GLStencilTablesTBO,
|
Osd::GLStencilTablesTBO,
|
||||||
Osd::GLXFBEvaluator,
|
Osd::GLXFBEvaluator,
|
||||||
Osd::GLDrawContext>(
|
Osd::GLPatchTable>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
numVaryingElements,
|
numVaryingElements,
|
||||||
@ -605,7 +655,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level, int kernel, Scheme scheme=
|
|||||||
g_mesh = new Osd::Mesh<Osd::GLVertexBuffer,
|
g_mesh = new Osd::Mesh<Osd::GLVertexBuffer,
|
||||||
Osd::GLStencilTablesSSBO,
|
Osd::GLStencilTablesSSBO,
|
||||||
Osd::GLComputeEvaluator,
|
Osd::GLComputeEvaluator,
|
||||||
Osd::GLDrawContext>(
|
Osd::GLPatchTable>(
|
||||||
refiner,
|
refiner,
|
||||||
numVertexElements,
|
numVertexElements,
|
||||||
numVaryingElements,
|
numVaryingElements,
|
||||||
@ -624,7 +674,17 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level, int kernel, Scheme scheme=
|
|||||||
|
|
||||||
InterpolateFVarData(*refiner, *shape, fvarData);
|
InterpolateFVarData(*refiner, *shape, fvarData);
|
||||||
|
|
||||||
g_mesh->SetFVarDataChannel(shape->GetFVarWidth(), fvarData);
|
// set fvardata to texture buffer
|
||||||
|
g_fvarData.Create(g_mesh->GetFarPatchTables(),
|
||||||
|
shape->GetFVarWidth(), fvarData);
|
||||||
|
}
|
||||||
|
|
||||||
|
// legacy gregory
|
||||||
|
delete g_legacyGregoryPatchTable;
|
||||||
|
g_legacyGregoryPatchTable = NULL;
|
||||||
|
if (g_endCap == kEndCapLegacyGregory) {
|
||||||
|
g_legacyGregoryPatchTable =
|
||||||
|
Osd::GLLegacyGregoryPatchTable::Create(g_mesh->GetFarPatchTables());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (not doAnim) {
|
if (not doAnim) {
|
||||||
@ -656,7 +716,7 @@ createOsdMesh(ShapeDesc const & shapeDesc, int level, int kernel, Scheme scheme=
|
|||||||
// -------- VAO
|
// -------- VAO
|
||||||
glBindVertexArray(g_vao);
|
glBindVertexArray(g_vao);
|
||||||
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_mesh->GetDrawContext()->GetPatchIndexBuffer());
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_mesh->GetPatchTable()->GetPatchIndexBuffer());
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, g_mesh->BindVertexBuffer());
|
glBindBuffer(GL_ARRAY_BUFFER, g_mesh->BindVertexBuffer());
|
||||||
|
|
||||||
glEnableVertexAttribArray(0);
|
glEnableVertexAttribArray(0);
|
||||||
@ -994,19 +1054,20 @@ public:
|
|||||||
// assign texture locations
|
// assign texture locations
|
||||||
GLint loc;
|
GLint loc;
|
||||||
glUseProgram(program);
|
glUseProgram(program);
|
||||||
if ((loc = glGetUniformLocation(program, "OsdVertexBuffer")) != -1) {
|
if ((loc = glGetUniformLocation(program, "OsdPatchParamBuffer")) != -1) {
|
||||||
glUniform1i(loc, 0); // GL_TEXTURE0
|
glUniform1i(loc, 0); // GL_TEXTURE0
|
||||||
}
|
}
|
||||||
if ((loc = glGetUniformLocation(program, "OsdValenceBuffer")) != -1) {
|
if ((loc = glGetUniformLocation(program, "OsdFVarDataBuffer")) != -1) {
|
||||||
glUniform1i(loc, 1); // GL_TEXTURE1
|
glUniform1i(loc, 1); // GL_TEXTURE1
|
||||||
}
|
}
|
||||||
if ((loc = glGetUniformLocation(program, "OsdQuadOffsetBuffer")) != -1) {
|
// for legacy gregory patches
|
||||||
|
if ((loc = glGetUniformLocation(program, "OsdVertexBuffer")) != -1) {
|
||||||
glUniform1i(loc, 2); // GL_TEXTURE2
|
glUniform1i(loc, 2); // GL_TEXTURE2
|
||||||
}
|
}
|
||||||
if ((loc = glGetUniformLocation(program, "OsdPatchParamBuffer")) != -1) {
|
if ((loc = glGetUniformLocation(program, "OsdValenceBuffer")) != -1) {
|
||||||
glUniform1i(loc, 3); // GL_TEXTURE3
|
glUniform1i(loc, 3); // GL_TEXTURE3
|
||||||
}
|
}
|
||||||
if ((loc = glGetUniformLocation(program, "OsdFVarDataBuffer")) != -1) {
|
if ((loc = glGetUniformLocation(program, "OsdQuadOffsetBuffer")) != -1) {
|
||||||
glUniform1i(loc, 4); // GL_TEXTURE4
|
glUniform1i(loc, 4); // GL_TEXTURE4
|
||||||
}
|
}
|
||||||
glUseProgram(0);
|
glUseProgram(0);
|
||||||
@ -1089,37 +1150,36 @@ updateUniformBlocks() {
|
|||||||
static void
|
static void
|
||||||
bindTextures() {
|
bindTextures() {
|
||||||
// bind patch textures
|
// bind patch textures
|
||||||
if (g_mesh->GetDrawContext()->GetVertexTextureBuffer()) {
|
if (g_mesh->GetPatchTable()->GetPatchParamTextureBuffer()) {
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_BUFFER,
|
glBindTexture(GL_TEXTURE_BUFFER,
|
||||||
g_mesh->GetDrawContext()->GetVertexTextureBuffer());
|
g_mesh->GetPatchTable()->GetPatchParamTextureBuffer());
|
||||||
}
|
}
|
||||||
if (g_mesh->GetDrawContext()->GetVertexValenceTextureBuffer()) {
|
|
||||||
|
if (true) {
|
||||||
glActiveTexture(GL_TEXTURE1);
|
glActiveTexture(GL_TEXTURE1);
|
||||||
glBindTexture(GL_TEXTURE_BUFFER,
|
glBindTexture(GL_TEXTURE_BUFFER,
|
||||||
g_mesh->GetDrawContext()->GetVertexValenceTextureBuffer());
|
g_fvarData.textureBuffer);
|
||||||
}
|
}
|
||||||
if (g_mesh->GetDrawContext()->GetQuadOffsetsTextureBuffer()) {
|
|
||||||
|
// legacy gregory
|
||||||
|
if (g_legacyGregoryPatchTable) {
|
||||||
glActiveTexture(GL_TEXTURE2);
|
glActiveTexture(GL_TEXTURE2);
|
||||||
glBindTexture(GL_TEXTURE_BUFFER,
|
glBindTexture(GL_TEXTURE_BUFFER,
|
||||||
g_mesh->GetDrawContext()->GetQuadOffsetsTextureBuffer());
|
g_legacyGregoryPatchTable->GetVertexTextureBuffer());
|
||||||
}
|
|
||||||
if (g_mesh->GetDrawContext()->GetPatchParamTextureBuffer()) {
|
|
||||||
glActiveTexture(GL_TEXTURE3);
|
glActiveTexture(GL_TEXTURE3);
|
||||||
glBindTexture(GL_TEXTURE_BUFFER,
|
glBindTexture(GL_TEXTURE_BUFFER,
|
||||||
g_mesh->GetDrawContext()->GetPatchParamTextureBuffer());
|
g_legacyGregoryPatchTable->GetVertexValenceTextureBuffer());
|
||||||
}
|
|
||||||
if (g_mesh->GetDrawContext()->GetFvarDataTextureBuffer()) {
|
|
||||||
glActiveTexture(GL_TEXTURE4);
|
glActiveTexture(GL_TEXTURE4);
|
||||||
glBindTexture(GL_TEXTURE_BUFFER,
|
glBindTexture(GL_TEXTURE_BUFFER,
|
||||||
g_mesh->GetDrawContext()->GetFvarDataTextureBuffer());
|
g_legacyGregoryPatchTable->GetQuadOffsetsTextureBuffer());
|
||||||
}
|
}
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static GLenum
|
static GLenum
|
||||||
bindProgram(Effect effect,
|
bindProgram(Effect effect,
|
||||||
OpenSubdiv::Osd::DrawContext::PatchArray const & patch) {
|
OpenSubdiv::Osd::GLPatchTable::PatchArray const & patch) {
|
||||||
EffectDesc effectDesc(patch.GetDescriptor(), effect);
|
EffectDesc effectDesc(patch.GetDescriptor(), effect);
|
||||||
|
|
||||||
// only legacy gregory needs maxValence and numElements
|
// only legacy gregory needs maxValence and numElements
|
||||||
@ -1127,7 +1187,7 @@ bindProgram(Effect effect,
|
|||||||
typedef OpenSubdiv::Far::PatchDescriptor Descriptor;
|
typedef OpenSubdiv::Far::PatchDescriptor Descriptor;
|
||||||
if (patch.GetDescriptor().GetType() == Descriptor::GREGORY or
|
if (patch.GetDescriptor().GetType() == Descriptor::GREGORY or
|
||||||
patch.GetDescriptor().GetType() == Descriptor::GREGORY_BOUNDARY) {
|
patch.GetDescriptor().GetType() == Descriptor::GREGORY_BOUNDARY) {
|
||||||
int maxValence = g_mesh->GetDrawContext()->GetMaxValence();
|
int maxValence = g_mesh->GetMaxValence();
|
||||||
int numElements = (g_displayStyle == kInterleavedVaryingColor ? 7 : 3);
|
int numElements = (g_displayStyle == kInterleavedVaryingColor ? 7 : 3);
|
||||||
effectDesc.maxValence = maxValence;
|
effectDesc.maxValence = maxValence;
|
||||||
effectDesc.numElements = numElements;
|
effectDesc.numElements = numElements;
|
||||||
@ -1146,14 +1206,20 @@ bindProgram(Effect effect,
|
|||||||
glUseProgram(program);
|
glUseProgram(program);
|
||||||
|
|
||||||
// bind standalone uniforms
|
// bind standalone uniforms
|
||||||
GLint uniformGregoryQuadOffsetBase =
|
|
||||||
glGetUniformLocation(program, "GregoryQuadOffsetBase");
|
|
||||||
GLint uniformPrimitiveIdBase =
|
GLint uniformPrimitiveIdBase =
|
||||||
glGetUniformLocation(program, "PrimitiveIdBase");
|
glGetUniformLocation(program, "PrimitiveIdBase");
|
||||||
if (uniformGregoryQuadOffsetBase >= 0)
|
|
||||||
glUniform1i(uniformGregoryQuadOffsetBase, patch.GetQuadOffsetIndex());
|
|
||||||
if (uniformPrimitiveIdBase >=0)
|
if (uniformPrimitiveIdBase >=0)
|
||||||
glUniform1i(uniformPrimitiveIdBase, patch.GetPatchIndex());
|
glUniform1i(uniformPrimitiveIdBase, patch.GetPrimitiveIdBase());
|
||||||
|
|
||||||
|
// legacy gregory
|
||||||
|
if (g_endCap == kEndCapLegacyGregory) {
|
||||||
|
GLint uniformGregoryQuadOffsetBase =
|
||||||
|
glGetUniformLocation(program, "GregoryQuadOffsetBase");
|
||||||
|
int quadOffsetBase =
|
||||||
|
g_legacyGregoryPatchTable->GetQuadOffsetsBase(patch.GetDescriptor().GetType());
|
||||||
|
if (uniformGregoryQuadOffsetBase >= 0)
|
||||||
|
glUniform1i(uniformGregoryQuadOffsetBase, quadOffsetBase);
|
||||||
|
}
|
||||||
|
|
||||||
// return primtype
|
// return primtype
|
||||||
GLenum primType;
|
GLenum primType;
|
||||||
@ -1207,7 +1273,13 @@ display() {
|
|||||||
g_transformData.ProjectionMatrix);
|
g_transformData.ProjectionMatrix);
|
||||||
|
|
||||||
// make sure that the vertex buffer is interoped back as a GL resources.
|
// make sure that the vertex buffer is interoped back as a GL resources.
|
||||||
g_mesh->BindVertexBuffer();
|
GLuint vbo = g_mesh->BindVertexBuffer();
|
||||||
|
|
||||||
|
// vertex texture update for legacy gregory drawing
|
||||||
|
if (g_legacyGregoryPatchTable) {
|
||||||
|
glActiveTexture(GL_TEXTURE1);
|
||||||
|
g_legacyGregoryPatchTable->UpdateVertexBuffer(vbo);
|
||||||
|
}
|
||||||
|
|
||||||
if (g_displayStyle == kVaryingColor)
|
if (g_displayStyle == kVaryingColor)
|
||||||
g_mesh->BindVaryingBuffer();
|
g_mesh->BindVaryingBuffer();
|
||||||
@ -1225,8 +1297,8 @@ display() {
|
|||||||
|
|
||||||
glBindVertexArray(g_vao);
|
glBindVertexArray(g_vao);
|
||||||
|
|
||||||
OpenSubdiv::Osd::DrawContext::PatchArrayVector const & patches =
|
OpenSubdiv::Osd::GLPatchTable::PatchArrayVector const & patches =
|
||||||
g_mesh->GetDrawContext()->GetPatchArrays();
|
g_mesh->GetPatchTable()->GetPatchArrays();
|
||||||
|
|
||||||
// patch drawing
|
// patch drawing
|
||||||
int patchCount[13]; // [Type] (see far/patchTables.h)
|
int patchCount[13]; // [Type] (see far/patchTables.h)
|
||||||
@ -1242,7 +1314,7 @@ display() {
|
|||||||
|
|
||||||
// core draw-calls
|
// core draw-calls
|
||||||
for (int i=0; i<(int)patches.size(); ++i) {
|
for (int i=0; i<(int)patches.size(); ++i) {
|
||||||
OpenSubdiv::Osd::DrawContext::PatchArray const & patch = patches[i];
|
OpenSubdiv::Osd::GLPatchTable::PatchArray const & patch = patches[i];
|
||||||
|
|
||||||
OpenSubdiv::Far::PatchDescriptor desc = patch.GetDescriptor();
|
OpenSubdiv::Far::PatchDescriptor desc = patch.GetDescriptor();
|
||||||
OpenSubdiv::Far::PatchDescriptor::Type patchType = desc.GetType();
|
OpenSubdiv::Far::PatchDescriptor::Type patchType = desc.GetType();
|
||||||
@ -1252,8 +1324,10 @@ display() {
|
|||||||
|
|
||||||
GLenum primType = bindProgram(GetEffect(), patch);
|
GLenum primType = bindProgram(GetEffect(), patch);
|
||||||
|
|
||||||
glDrawElements(primType, patch.GetNumIndices(), GL_UNSIGNED_INT,
|
glDrawElements(primType,
|
||||||
(void *)(patch.GetVertIndex() * sizeof(unsigned int)));
|
patch.GetNumPatches() * desc.GetNumControlVertices(),
|
||||||
|
GL_UNSIGNED_INT,
|
||||||
|
(void *)(patch.GetIndexBase() * sizeof(unsigned int)));
|
||||||
++numDrawCalls;
|
++numDrawCalls;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1395,6 +1469,10 @@ uninitGL() {
|
|||||||
|
|
||||||
if (g_mesh)
|
if (g_mesh)
|
||||||
delete g_mesh;
|
delete g_mesh;
|
||||||
|
|
||||||
|
if (g_legacyGregoryPatchTable)
|
||||||
|
delete g_legacyGregoryPatchTable;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
@ -30,7 +30,6 @@ set(CPU_SOURCE_FILES
|
|||||||
cpuEvaluator.cpp
|
cpuEvaluator.cpp
|
||||||
cpuKernel.cpp
|
cpuKernel.cpp
|
||||||
cpuVertexBuffer.cpp
|
cpuVertexBuffer.cpp
|
||||||
drawContext.cpp
|
|
||||||
)
|
)
|
||||||
|
|
||||||
set(GPU_SOURCE_FILES )
|
set(GPU_SOURCE_FILES )
|
||||||
@ -48,7 +47,6 @@ set(PUBLIC_HEADER_FILES
|
|||||||
mesh.h
|
mesh.h
|
||||||
nonCopyable.h
|
nonCopyable.h
|
||||||
opengl.h
|
opengl.h
|
||||||
drawContext.h
|
|
||||||
vertexDescriptor.h
|
vertexDescriptor.h
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -106,7 +104,8 @@ list(APPEND DOXY_HEADER_FILES ${TBB_PUBLIC_HEADERS})
|
|||||||
# GL code & dependencies
|
# GL code & dependencies
|
||||||
set(GL_PUBLIC_HEADERS
|
set(GL_PUBLIC_HEADERS
|
||||||
cpuGLVertexBuffer.h
|
cpuGLVertexBuffer.h
|
||||||
glDrawContext.h
|
glLegacyGregoryPatchTable.h
|
||||||
|
glPatchTable.h
|
||||||
glVertexBuffer.h
|
glVertexBuffer.h
|
||||||
glMesh.h
|
glMesh.h
|
||||||
glslPatchShaderSource.h
|
glslPatchShaderSource.h
|
||||||
@ -115,7 +114,8 @@ set(GL_PUBLIC_HEADERS
|
|||||||
if( OPENGL_FOUND OR OPENGLES_FOUND )
|
if( OPENGL_FOUND OR OPENGLES_FOUND )
|
||||||
list(APPEND GPU_SOURCE_FILES
|
list(APPEND GPU_SOURCE_FILES
|
||||||
cpuGLVertexBuffer.cpp
|
cpuGLVertexBuffer.cpp
|
||||||
glDrawContext.cpp
|
glLegacyGregoryPatchTable.cpp
|
||||||
|
glPatchTable.cpp
|
||||||
glVertexBuffer.cpp
|
glVertexBuffer.cpp
|
||||||
glslPatchShaderSource.cpp
|
glslPatchShaderSource.cpp
|
||||||
)
|
)
|
||||||
@ -182,7 +182,8 @@ list(APPEND DOXY_HEADER_FILES ${GL_4_3_PUBLIC_HEADERS})
|
|||||||
set(DXSDK_PUBLIC_HEADERS
|
set(DXSDK_PUBLIC_HEADERS
|
||||||
cpuD3D11VertexBuffer.h
|
cpuD3D11VertexBuffer.h
|
||||||
d3d11ComputeEvaluator.h
|
d3d11ComputeEvaluator.h
|
||||||
d3d11DrawContext.h
|
d3d11LegacyGregoryPatchTable.h
|
||||||
|
d3d11PatchTable.h
|
||||||
d3d11VertexBuffer.h
|
d3d11VertexBuffer.h
|
||||||
d3d11Mesh.h
|
d3d11Mesh.h
|
||||||
hlslPatchShaderSource.h
|
hlslPatchShaderSource.h
|
||||||
@ -191,7 +192,8 @@ if( DXSDK_FOUND )
|
|||||||
list(APPEND GPU_SOURCE_FILES
|
list(APPEND GPU_SOURCE_FILES
|
||||||
cpuD3D11VertexBuffer.cpp
|
cpuD3D11VertexBuffer.cpp
|
||||||
d3d11ComputeEvaluator.cpp
|
d3d11ComputeEvaluator.cpp
|
||||||
d3d11DrawContext.cpp
|
d3d11LegacyGregoryPatchTable.cpp
|
||||||
|
d3d11PatchTable.cpp
|
||||||
d3d11VertexBuffer.cpp
|
d3d11VertexBuffer.cpp
|
||||||
hlslPatchShaderSource.cpp
|
hlslPatchShaderSource.cpp
|
||||||
)
|
)
|
||||||
|
@ -1,303 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright 2013 Pixar
|
|
||||||
//
|
|
||||||
// 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:
|
|
||||||
//
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
// You may obtain a copy of the Apache License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "../osd/d3d11DrawContext.h"
|
|
||||||
|
|
||||||
#include <D3D11.h>
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
namespace OpenSubdiv {
|
|
||||||
namespace OPENSUBDIV_VERSION {
|
|
||||||
|
|
||||||
namespace Osd {
|
|
||||||
|
|
||||||
D3D11DrawContext::D3D11DrawContext(int maxValence) :
|
|
||||||
DrawContext(maxValence),
|
|
||||||
patchIndexBuffer(NULL),
|
|
||||||
patchParamBuffer(NULL),
|
|
||||||
patchParamBufferSRV(NULL),
|
|
||||||
fvarDataBuffer(NULL),
|
|
||||||
fvarDataBufferSRV(NULL),
|
|
||||||
vertexBufferSRV(NULL),
|
|
||||||
vertexValenceBuffer(NULL),
|
|
||||||
vertexValenceBufferSRV(NULL),
|
|
||||||
quadOffsetBuffer(NULL),
|
|
||||||
quadOffsetBufferSRV(NULL)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
D3D11DrawContext::~D3D11DrawContext()
|
|
||||||
{
|
|
||||||
if (patchIndexBuffer) patchIndexBuffer->Release();
|
|
||||||
if (patchParamBuffer) patchParamBuffer->Release();
|
|
||||||
if (patchParamBufferSRV) patchParamBufferSRV->Release();
|
|
||||||
if (fvarDataBuffer) fvarDataBuffer->Release();
|
|
||||||
if (fvarDataBufferSRV) fvarDataBufferSRV->Release();
|
|
||||||
if (vertexBufferSRV) vertexBufferSRV->Release();
|
|
||||||
if (vertexValenceBuffer) vertexValenceBuffer->Release();
|
|
||||||
if (vertexValenceBufferSRV) vertexValenceBufferSRV->Release();
|
|
||||||
if (quadOffsetBuffer) quadOffsetBuffer->Release();
|
|
||||||
if (quadOffsetBufferSRV) quadOffsetBufferSRV->Release();
|
|
||||||
};
|
|
||||||
|
|
||||||
D3D11DrawContext *
|
|
||||||
D3D11DrawContext::Create(Far::PatchTables const *patchTables,
|
|
||||||
ID3D11DeviceContext *pd3d11DeviceContext)
|
|
||||||
{
|
|
||||||
int maxValence = patchTables->GetMaxValence();
|
|
||||||
D3D11DrawContext * result = new D3D11DrawContext(maxValence);
|
|
||||||
if (result->create(*patchTables, pd3d11DeviceContext))
|
|
||||||
return result;
|
|
||||||
|
|
||||||
delete result;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
D3D11DrawContext::create(Far::PatchTables const &patchTables,
|
|
||||||
ID3D11DeviceContext *pd3d11DeviceContext)
|
|
||||||
{
|
|
||||||
// adaptive patches
|
|
||||||
_isAdaptive = patchTables.IsFeatureAdaptive();
|
|
||||||
|
|
||||||
ID3D11Device *pd3d11Device = NULL;
|
|
||||||
pd3d11DeviceContext->GetDevice(&pd3d11Device);
|
|
||||||
assert(pd3d11Device);
|
|
||||||
|
|
||||||
// Process PTable
|
|
||||||
Far::PatchTables::PatchVertsTable const & ptables = patchTables.GetPatchControlVerticesTable();
|
|
||||||
|
|
||||||
D3D11_BUFFER_DESC bd;
|
|
||||||
bd.ByteWidth = (int)ptables.size() * sizeof(int);
|
|
||||||
bd.Usage = D3D11_USAGE_DYNAMIC;
|
|
||||||
bd.BindFlags = D3D11_BIND_INDEX_BUFFER;
|
|
||||||
bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
|
|
||||||
bd.MiscFlags = 0;
|
|
||||||
bd.StructureByteStride = sizeof(int);
|
|
||||||
HRESULT hr = pd3d11Device->CreateBuffer(&bd, NULL, &patchIndexBuffer);
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
D3D11_MAPPED_SUBRESOURCE mappedResource;
|
|
||||||
hr = pd3d11DeviceContext->Map(patchIndexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
unsigned int * indexBuffer = (unsigned int *) mappedResource.pData;
|
|
||||||
memcpy(indexBuffer, &ptables[0], ptables.size() * sizeof(unsigned int));
|
|
||||||
|
|
||||||
pd3d11DeviceContext->Unmap(patchIndexBuffer, 0);
|
|
||||||
|
|
||||||
DrawContext::ConvertPatchArrays(patchTables, _patchArrays);
|
|
||||||
|
|
||||||
// allocate and initialize additional buffer data
|
|
||||||
|
|
||||||
// create patch param buffer
|
|
||||||
Far::PatchParamTable const & patchParamTables =
|
|
||||||
patchTables.GetPatchParamTable();
|
|
||||||
|
|
||||||
if (not patchParamTables.empty()) {
|
|
||||||
|
|
||||||
int numElements = (int)patchParamTables.size(),
|
|
||||||
elementSize = sizeof(Far::PatchParam);
|
|
||||||
unsigned int const * values =
|
|
||||||
reinterpret_cast<unsigned int const *>(&patchParamTables[0]);
|
|
||||||
|
|
||||||
std::vector<unsigned int> buffer;
|
|
||||||
|
|
||||||
bool useSingleCrease = not patchTables.GetSharpnessIndexTable().empty();
|
|
||||||
|
|
||||||
if (useSingleCrease) {
|
|
||||||
// if indexed sharpnesses exists, flatten them and interleave into 3-component buffer
|
|
||||||
packSharpnessValues(patchTables, buffer);
|
|
||||||
elementSize += sizeof(float);
|
|
||||||
values = &buffer[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
bd.ByteWidth = numElements * elementSize;
|
|
||||||
bd.Usage = D3D11_USAGE_DYNAMIC;
|
|
||||||
bd.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
|
||||||
bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
|
|
||||||
bd.MiscFlags = 0;
|
|
||||||
bd.StructureByteStride = sizeof(unsigned int);
|
|
||||||
hr = pd3d11Device->CreateBuffer(&bd, NULL, &patchParamBuffer);
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
D3D11_SHADER_RESOURCE_VIEW_DESC srvd;
|
|
||||||
ZeroMemory(&srvd, sizeof(srvd));
|
|
||||||
srvd.Format = useSingleCrease ? DXGI_FORMAT_R32G32B32_UINT : DXGI_FORMAT_R32G32_UINT;
|
|
||||||
srvd.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
|
|
||||||
srvd.Buffer.FirstElement = 0;
|
|
||||||
srvd.Buffer.NumElements = numElements;
|
|
||||||
hr = pd3d11Device->CreateShaderResourceView(
|
|
||||||
patchParamBuffer, &srvd, &patchParamBufferSRV);
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
hr = pd3d11DeviceContext->Map(patchParamBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
unsigned int *dst = (unsigned int *) mappedResource.pData;
|
|
||||||
memcpy(dst, values, numElements * elementSize);
|
|
||||||
pd3d11DeviceContext->Unmap(patchParamBuffer, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// create vertex valence buffer and vertex texture
|
|
||||||
Far::PatchTables::VertexValenceTable const &
|
|
||||||
valenceTable = patchTables.GetVertexValenceTable();
|
|
||||||
|
|
||||||
if (not valenceTable.empty()) {
|
|
||||||
D3D11_BUFFER_DESC bd;
|
|
||||||
bd.ByteWidth = UINT(valenceTable.size() * sizeof(unsigned int));
|
|
||||||
bd.Usage = D3D11_USAGE_DEFAULT;
|
|
||||||
bd.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
|
||||||
bd.CPUAccessFlags = 0;
|
|
||||||
bd.MiscFlags = 0;
|
|
||||||
bd.StructureByteStride = sizeof(unsigned int);
|
|
||||||
D3D11_SUBRESOURCE_DATA initData;
|
|
||||||
initData.pSysMem = &valenceTable[0];
|
|
||||||
HRESULT hr = pd3d11Device->CreateBuffer(&bd, &initData, &vertexValenceBuffer);
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
D3D11_SHADER_RESOURCE_VIEW_DESC srvd;
|
|
||||||
ZeroMemory(&srvd, sizeof(srvd));
|
|
||||||
srvd.Format = DXGI_FORMAT_R32_SINT;
|
|
||||||
srvd.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
|
|
||||||
srvd.Buffer.FirstElement = 0;
|
|
||||||
srvd.Buffer.NumElements = UINT(valenceTable.size());
|
|
||||||
hr = pd3d11Device->CreateShaderResourceView(vertexValenceBuffer, &srvd, &vertexValenceBufferSRV);
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Far::PatchTables::QuadOffsetsTable const &
|
|
||||||
quadOffsetTable = patchTables.GetQuadOffsetsTable();
|
|
||||||
|
|
||||||
if (not quadOffsetTable.empty()) {
|
|
||||||
D3D11_BUFFER_DESC bd;
|
|
||||||
bd.ByteWidth = UINT(quadOffsetTable.size() * sizeof(unsigned int));
|
|
||||||
bd.Usage = D3D11_USAGE_DEFAULT;
|
|
||||||
bd.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
|
||||||
bd.CPUAccessFlags = 0;
|
|
||||||
bd.MiscFlags = 0;
|
|
||||||
bd.StructureByteStride = sizeof(unsigned int);
|
|
||||||
D3D11_SUBRESOURCE_DATA initData;
|
|
||||||
initData.pSysMem = &quadOffsetTable[0];
|
|
||||||
HRESULT hr = pd3d11Device->CreateBuffer(&bd, &initData, &quadOffsetBuffer);
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
D3D11_SHADER_RESOURCE_VIEW_DESC srvd;
|
|
||||||
ZeroMemory(&srvd, sizeof(srvd));
|
|
||||||
srvd.Format = DXGI_FORMAT_R32_SINT;
|
|
||||||
srvd.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
|
|
||||||
srvd.Buffer.FirstElement = 0;
|
|
||||||
srvd.Buffer.NumElements = UINT(quadOffsetTable.size());
|
|
||||||
hr = pd3d11Device->CreateShaderResourceView(quadOffsetBuffer, &srvd, &quadOffsetBufferSRV);
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
D3D11DrawContext::SetFVarDataTexture(Far::PatchTables const & patchTables,
|
|
||||||
int fvarWidth, FVarData const & fvarData,
|
|
||||||
ID3D11DeviceContext *pd3d11DeviceContext) {
|
|
||||||
|
|
||||||
if (not fvarData.empty()) {
|
|
||||||
|
|
||||||
FVarData fvarDataTable;
|
|
||||||
|
|
||||||
packFVarData(patchTables, fvarWidth, fvarData, fvarDataTable);
|
|
||||||
|
|
||||||
ID3D11Device *pd3d11Device = NULL;
|
|
||||||
pd3d11DeviceContext->GetDevice(&pd3d11Device);
|
|
||||||
assert(pd3d11Device);
|
|
||||||
|
|
||||||
D3D11_BUFFER_DESC bd;
|
|
||||||
bd.ByteWidth = UINT(fvarDataTable.size() * sizeof(float));
|
|
||||||
bd.Usage = D3D11_USAGE_DEFAULT;
|
|
||||||
bd.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
|
||||||
bd.CPUAccessFlags = 0;
|
|
||||||
bd.MiscFlags = 0;
|
|
||||||
bd.StructureByteStride = sizeof(float);
|
|
||||||
D3D11_SUBRESOURCE_DATA initData;
|
|
||||||
initData.pSysMem = &fvarDataTable[0];
|
|
||||||
HRESULT hr = pd3d11Device->CreateBuffer(&bd, &initData, &fvarDataBuffer);
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
D3D11_SHADER_RESOURCE_VIEW_DESC srvd;
|
|
||||||
ZeroMemory(&srvd, sizeof(srvd));
|
|
||||||
srvd.Format = DXGI_FORMAT_R32_FLOAT;
|
|
||||||
srvd.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
|
|
||||||
srvd.Buffer.FirstElement = 0;
|
|
||||||
srvd.Buffer.NumElements = UINT(fvarDataTable.size());
|
|
||||||
hr = pd3d11Device->CreateShaderResourceView(fvarDataBuffer, &srvd, &fvarDataBufferSRV);
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
D3D11DrawContext::updateVertexTexture(ID3D11Buffer *vbo,
|
|
||||||
ID3D11DeviceContext *pd3d11DeviceContext,
|
|
||||||
int numVertices,
|
|
||||||
int numVertexElements)
|
|
||||||
{
|
|
||||||
ID3D11Device *pd3d11Device = NULL;
|
|
||||||
pd3d11DeviceContext->GetDevice(&pd3d11Device);
|
|
||||||
assert(pd3d11Device);
|
|
||||||
|
|
||||||
D3D11_SHADER_RESOURCE_VIEW_DESC srvd;
|
|
||||||
ZeroMemory(&srvd, sizeof(srvd));
|
|
||||||
srvd.Format = DXGI_FORMAT_R32_FLOAT;
|
|
||||||
srvd.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
|
|
||||||
srvd.Buffer.FirstElement = 0;
|
|
||||||
srvd.Buffer.NumElements = numVertices * numVertexElements;
|
|
||||||
HRESULT hr = pd3d11Device->CreateShaderResourceView(vbo, &srvd, &vertexBufferSRV);
|
|
||||||
if (FAILED(hr)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // end namespace Osd
|
|
||||||
|
|
||||||
} // end namespace OPENSUBDIV_VERSION
|
|
||||||
} // end namespace OpenSubdiv
|
|
@ -1,167 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright 2013 Pixar
|
|
||||||
//
|
|
||||||
// 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:
|
|
||||||
//
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
// You may obtain a copy of the Apache License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef OPENSUBDIV3_OSD_D3D11L_DRAW_CONTEXT_H
|
|
||||||
#define OPENSUBDIV3_OSD_D3D11L_DRAW_CONTEXT_H
|
|
||||||
|
|
||||||
#include "../version.h"
|
|
||||||
|
|
||||||
#include "../far/patchTables.h"
|
|
||||||
#include "../osd/drawContext.h"
|
|
||||||
|
|
||||||
#include <map>
|
|
||||||
|
|
||||||
struct ID3D11VertexShader;
|
|
||||||
struct ID3D11HullShader;
|
|
||||||
struct ID3D11DomainShader;
|
|
||||||
struct ID3D11GeometryShader;
|
|
||||||
struct ID3D11PixelShader;
|
|
||||||
|
|
||||||
struct ID3D11Buffer;
|
|
||||||
struct ID3D11ShaderResourceView;
|
|
||||||
struct ID3D11Device;
|
|
||||||
struct ID3D11DeviceContext;
|
|
||||||
|
|
||||||
namespace OpenSubdiv {
|
|
||||||
namespace OPENSUBDIV_VERSION {
|
|
||||||
|
|
||||||
namespace Osd {
|
|
||||||
|
|
||||||
/// \brief D3D11 specialized DrawContext class
|
|
||||||
///
|
|
||||||
/// D3D11DrawContext implements the OSD drawing interface with Microsoft(c)
|
|
||||||
/// DirectX D3D11 API.
|
|
||||||
/// Some functionality may be disabled depending on compile and run-time driver
|
|
||||||
/// support.
|
|
||||||
///
|
|
||||||
/// Contexts interface the serialized topological data pertaining to the
|
|
||||||
/// geometric primitives with the capabilities of the selected discrete
|
|
||||||
/// compute device.
|
|
||||||
///
|
|
||||||
class D3D11DrawContext : public DrawContext {
|
|
||||||
public:
|
|
||||||
typedef ID3D11Buffer * VertexBufferBinding;
|
|
||||||
|
|
||||||
virtual ~D3D11DrawContext();
|
|
||||||
|
|
||||||
/// \brief Create an D3D11DrawContext from Far::PatchTables
|
|
||||||
///
|
|
||||||
/// @param patchTables A valid set of Far::PatchTables
|
|
||||||
///
|
|
||||||
/// @param pd3d11DeviceContext A device context
|
|
||||||
///
|
|
||||||
static D3D11DrawContext *Create(Far::PatchTables const *patchTables,
|
|
||||||
ID3D11DeviceContext *pd3d11DeviceContext);
|
|
||||||
|
|
||||||
/// template version for custom context (OpenCL) used by OsdMesh
|
|
||||||
template<typename DEVICE_CONTEXT>
|
|
||||||
static D3D11DrawContext *Create(Far::PatchTables const *patchtables,
|
|
||||||
DEVICE_CONTEXT context) {
|
|
||||||
return Create(patchtables, context->GetDeviceContext());
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Set vbo as a vertex texture (for gregory patch drawing)
|
|
||||||
///
|
|
||||||
/// @param vbo The vertex buffer object to update
|
|
||||||
///
|
|
||||||
/// @param pd3d11DeviceContext A device context
|
|
||||||
///
|
|
||||||
template<class VERTEX_BUFFER>
|
|
||||||
void UpdateVertexTexture(VERTEX_BUFFER *vbo, ID3D11DeviceContext *pd3d11DeviceContext) {
|
|
||||||
if (vbo)
|
|
||||||
updateVertexTexture(vbo->BindD3D11Buffer(pd3d11DeviceContext),
|
|
||||||
pd3d11DeviceContext,
|
|
||||||
vbo->GetNumVertices(),
|
|
||||||
vbo->GetNumElements());
|
|
||||||
}
|
|
||||||
|
|
||||||
/// template version for custom context (OpenCL) used by OsdMesh
|
|
||||||
template<class VERTEX_BUFFER, class DEVICE_CONTEXT>
|
|
||||||
void UpdateVertexTexture(VERTEX_BUFFER *vbo, DEVICE_CONTEXT context) {
|
|
||||||
UpdateVertexTexture(vbo, context->GetDeviceContext());
|
|
||||||
}
|
|
||||||
|
|
||||||
ID3D11Buffer *patchIndexBuffer;
|
|
||||||
|
|
||||||
ID3D11Buffer *patchParamBuffer;
|
|
||||||
ID3D11ShaderResourceView *patchParamBufferSRV;
|
|
||||||
|
|
||||||
ID3D11Buffer *fvarDataBuffer;
|
|
||||||
ID3D11ShaderResourceView *fvarDataBufferSRV;
|
|
||||||
|
|
||||||
ID3D11ShaderResourceView *vertexBufferSRV;
|
|
||||||
ID3D11Buffer *vertexValenceBuffer;
|
|
||||||
ID3D11ShaderResourceView *vertexValenceBufferSRV;
|
|
||||||
ID3D11Buffer *quadOffsetBuffer;
|
|
||||||
ID3D11ShaderResourceView *quadOffsetBufferSRV;
|
|
||||||
|
|
||||||
/// Sets face-varying data buffer
|
|
||||||
///
|
|
||||||
/// @param patchTables A valid set of Far::PatchTables
|
|
||||||
///
|
|
||||||
/// @param pd3d11DeviceContext A device context
|
|
||||||
///
|
|
||||||
/// @param fvarWidth Total face-varying primvar data width in fvarData
|
|
||||||
///
|
|
||||||
/// @param fvarData Vector containing the face-varying data
|
|
||||||
///
|
|
||||||
/// @return True if the operation was successful
|
|
||||||
///
|
|
||||||
bool SetFVarDataTexture(Far::PatchTables const & patchTables,
|
|
||||||
int fvarWidth, FVarData const & fvarData,
|
|
||||||
ID3D11DeviceContext *pd3d11DeviceContext);
|
|
||||||
|
|
||||||
/// template version for custom context (OpenCL) used by OsdMesh
|
|
||||||
template<typename DEVICE_CONTEXT>
|
|
||||||
bool SetFVarDataTexture(Far::PatchTables const & patchTables,
|
|
||||||
int fvarWidth, FVarData const & fvarData,
|
|
||||||
DEVICE_CONTEXT context) {
|
|
||||||
return SetFVarDataTexture(patchTables, fvarWidth, fvarData,
|
|
||||||
context->GetDeviceContext());
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
D3D11DrawContext(int maxValence);
|
|
||||||
|
|
||||||
|
|
||||||
// allocate buffers from patchTables
|
|
||||||
bool create(Far::PatchTables const &patchTables,
|
|
||||||
ID3D11DeviceContext *pd3d11DeviceContext);
|
|
||||||
|
|
||||||
void updateVertexTexture(ID3D11Buffer *vbo,
|
|
||||||
ID3D11DeviceContext *pd3d11DeviceContext,
|
|
||||||
int numVertices,
|
|
||||||
int numVertexElements);
|
|
||||||
|
|
||||||
int _numVertices;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // end namespace Osd
|
|
||||||
|
|
||||||
} // end namespace OPENSUBDIV_VERSION
|
|
||||||
using namespace OPENSUBDIV_VERSION;
|
|
||||||
|
|
||||||
} // end namespace OpenSubdiv
|
|
||||||
|
|
||||||
#endif /* OPENSUBDIV3_OSD_D3D11L_DRAW_CONTEXT_H */
|
|
165
opensubdiv/osd/d3d11LegacyGregoryPatchTable.cpp
Normal file
165
opensubdiv/osd/d3d11LegacyGregoryPatchTable.cpp
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
//
|
||||||
|
// Copyright 2015 Pixar
|
||||||
|
//
|
||||||
|
// 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:
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
// You may obtain a copy of the Apache License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "../osd/d3d11LegacyGregoryPatchTable.h"
|
||||||
|
|
||||||
|
#include <D3D11.h>
|
||||||
|
|
||||||
|
namespace OpenSubdiv {
|
||||||
|
namespace OPENSUBDIV_VERSION {
|
||||||
|
|
||||||
|
namespace Osd {
|
||||||
|
|
||||||
|
D3D11LegacyGregoryPatchTable::D3D11LegacyGregoryPatchTable() :
|
||||||
|
_vertexValenceBuffer(0), _quadOffsetsBuffer(0),
|
||||||
|
_vertexSRV(0), _vertexValenceSRV(0), _quadOffsetsSRV(0) {
|
||||||
|
_quadOffsetsBase[0] = _quadOffsetsBase[1] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
D3D11LegacyGregoryPatchTable::~D3D11LegacyGregoryPatchTable() {
|
||||||
|
if (_vertexValenceBuffer) _vertexValenceBuffer->Release();
|
||||||
|
if (_quadOffsetsBuffer) _quadOffsetsBuffer->Release();
|
||||||
|
if (_vertexSRV) _vertexSRV->Release();
|
||||||
|
if (_vertexValenceSRV) _vertexValenceSRV->Release();
|
||||||
|
if (_quadOffsetsSRV) _quadOffsetsSRV->Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
D3D11LegacyGregoryPatchTable *
|
||||||
|
D3D11LegacyGregoryPatchTable::Create(Far::PatchTables const *farPatchTables,
|
||||||
|
ID3D11DeviceContext *pd3d11DeviceContext) {
|
||||||
|
ID3D11Device *pd3d11Device = NULL;
|
||||||
|
pd3d11DeviceContext->GetDevice(&pd3d11Device);
|
||||||
|
assert(pd3d11Device);
|
||||||
|
|
||||||
|
D3D11LegacyGregoryPatchTable *result = new D3D11LegacyGregoryPatchTable();
|
||||||
|
|
||||||
|
Far::PatchTables::VertexValenceTable const &
|
||||||
|
valenceTable = farPatchTables->GetVertexValenceTable();
|
||||||
|
Far::PatchTables::QuadOffsetsTable const &
|
||||||
|
quadOffsetsTable = farPatchTables->GetQuadOffsetsTable();
|
||||||
|
|
||||||
|
if (not valenceTable.empty()) {
|
||||||
|
D3D11_BUFFER_DESC bd;
|
||||||
|
bd.ByteWidth = UINT(valenceTable.size() * sizeof(unsigned int));
|
||||||
|
bd.Usage = D3D11_USAGE_DEFAULT;
|
||||||
|
bd.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
||||||
|
bd.CPUAccessFlags = 0;
|
||||||
|
bd.MiscFlags = 0;
|
||||||
|
bd.StructureByteStride = sizeof(unsigned int);
|
||||||
|
D3D11_SUBRESOURCE_DATA initData;
|
||||||
|
initData.pSysMem = &valenceTable[0];
|
||||||
|
HRESULT hr = pd3d11Device->CreateBuffer(&bd, &initData,
|
||||||
|
&result->_vertexValenceBuffer);
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
delete result;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
D3D11_SHADER_RESOURCE_VIEW_DESC srvd;
|
||||||
|
ZeroMemory(&srvd, sizeof(srvd));
|
||||||
|
srvd.Format = DXGI_FORMAT_R32_SINT;
|
||||||
|
srvd.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
|
||||||
|
srvd.Buffer.FirstElement = 0;
|
||||||
|
srvd.Buffer.NumElements = UINT(valenceTable.size());
|
||||||
|
hr = pd3d11Device->CreateShaderResourceView(
|
||||||
|
result->_vertexValenceBuffer, &srvd,
|
||||||
|
&result->_vertexValenceSRV);
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
delete result;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (not quadOffsetsTable.empty()) {
|
||||||
|
D3D11_BUFFER_DESC bd;
|
||||||
|
bd.ByteWidth = UINT(quadOffsetsTable.size() * sizeof(unsigned int));
|
||||||
|
bd.Usage = D3D11_USAGE_DEFAULT;
|
||||||
|
bd.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
||||||
|
bd.CPUAccessFlags = 0;
|
||||||
|
bd.MiscFlags = 0;
|
||||||
|
bd.StructureByteStride = sizeof(unsigned int);
|
||||||
|
D3D11_SUBRESOURCE_DATA initData;
|
||||||
|
initData.pSysMem = &quadOffsetsTable[0];
|
||||||
|
HRESULT hr = pd3d11Device->CreateBuffer(&bd, &initData,
|
||||||
|
&result->_quadOffsetsBuffer);
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
delete result;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
D3D11_SHADER_RESOURCE_VIEW_DESC srvd;
|
||||||
|
ZeroMemory(&srvd, sizeof(srvd));
|
||||||
|
srvd.Format = DXGI_FORMAT_R32_SINT;
|
||||||
|
srvd.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
|
||||||
|
srvd.Buffer.FirstElement = 0;
|
||||||
|
srvd.Buffer.NumElements = UINT(quadOffsetsTable.size());
|
||||||
|
hr = pd3d11Device->CreateShaderResourceView(
|
||||||
|
result->_quadOffsetsBuffer, &srvd, &result->_quadOffsetsSRV);
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
delete result;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result->_quadOffsetsBase[0] = 0;
|
||||||
|
result->_quadOffsetsBase[1] = 0;
|
||||||
|
|
||||||
|
// scan patchtable to find quadOffsetsBase.
|
||||||
|
for (int i = 0; i < farPatchTables->GetNumPatchArrays(); ++i) {
|
||||||
|
// GREGORY_BOUNDARY's quadoffsets come after GREGORY's.
|
||||||
|
if (farPatchTables->GetPatchArrayDescriptor(i) ==
|
||||||
|
Far::PatchDescriptor::GREGORY) {
|
||||||
|
result->_quadOffsetsBase[1] = farPatchTables->GetNumPatches(i) * 4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
D3D11LegacyGregoryPatchTable::UpdateVertexBuffer(
|
||||||
|
ID3D11Buffer *vbo, int numVertices, int numVertexElements,
|
||||||
|
ID3D11DeviceContext *pd3d11DeviceContext) {
|
||||||
|
ID3D11Device *pd3d11Device = NULL;
|
||||||
|
pd3d11DeviceContext->GetDevice(&pd3d11Device);
|
||||||
|
assert(pd3d11Device);
|
||||||
|
|
||||||
|
D3D11_SHADER_RESOURCE_VIEW_DESC srvd;
|
||||||
|
ZeroMemory(&srvd, sizeof(srvd));
|
||||||
|
srvd.Format = DXGI_FORMAT_R32_FLOAT;
|
||||||
|
srvd.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
|
||||||
|
srvd.Buffer.FirstElement = 0;
|
||||||
|
srvd.Buffer.NumElements = numVertices * numVertexElements;
|
||||||
|
HRESULT hr = pd3d11Device->CreateShaderResourceView(vbo, &srvd,
|
||||||
|
&_vertexSRV);
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // end namespace Osd
|
||||||
|
|
||||||
|
} // end namespace OPENSUBDIV_VERSION
|
||||||
|
} // end namespace OpenSubdiv
|
102
opensubdiv/osd/d3d11LegacyGregoryPatchTable.h
Normal file
102
opensubdiv/osd/d3d11LegacyGregoryPatchTable.h
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
//
|
||||||
|
// Copyright 2015 Pixar
|
||||||
|
//
|
||||||
|
// 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:
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
// You may obtain a copy of the Apache License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef OPENSUBDIV3_OSD_D3D11_LEGACY_GREGORY_PATCH_TABLE_H
|
||||||
|
#define OPENSUBDIV3_OSD_D3D11_LEGACY_GREGORY_PATCH_TABLE_H
|
||||||
|
|
||||||
|
#include "../version.h"
|
||||||
|
|
||||||
|
#include "../far/patchTables.h"
|
||||||
|
#include "../osd/nonCopyable.h"
|
||||||
|
|
||||||
|
struct ID3D11Buffer;
|
||||||
|
struct ID3D11ShaderResourceView;
|
||||||
|
struct ID3D11Device;
|
||||||
|
struct ID3D11DeviceContext;
|
||||||
|
|
||||||
|
namespace OpenSubdiv {
|
||||||
|
namespace OPENSUBDIV_VERSION {
|
||||||
|
|
||||||
|
namespace Osd {
|
||||||
|
|
||||||
|
class D3D11LegacyGregoryPatchTable
|
||||||
|
: private NonCopyable<D3D11LegacyGregoryPatchTable> {
|
||||||
|
public:
|
||||||
|
~D3D11LegacyGregoryPatchTable();
|
||||||
|
|
||||||
|
template<typename DEVICE_CONTEXT>
|
||||||
|
static D3D11LegacyGregoryPatchTable *Create(
|
||||||
|
Far::PatchTables const *farPatchTables, DEVICE_CONTEXT context) {
|
||||||
|
return Create(farPatchTables, context->GetDeviceContext());
|
||||||
|
}
|
||||||
|
|
||||||
|
static D3D11LegacyGregoryPatchTable *Create(
|
||||||
|
Far::PatchTables const *farPatchTables,
|
||||||
|
ID3D11DeviceContext *deviceContext);
|
||||||
|
|
||||||
|
void UpdateVertexBuffer(ID3D11Buffer *vbo,
|
||||||
|
int numVertices, int numVertexElements,
|
||||||
|
ID3D11DeviceContext *pd3d11DeviceContext);
|
||||||
|
|
||||||
|
ID3D11ShaderResourceView* GetVertexSRV() const {
|
||||||
|
return _vertexSRV;
|
||||||
|
}
|
||||||
|
|
||||||
|
ID3D11ShaderResourceView* GetVertexValenceSRV() const {
|
||||||
|
return _vertexValenceSRV;
|
||||||
|
}
|
||||||
|
|
||||||
|
ID3D11ShaderResourceView* GetQuadOffsetsSRV() const {
|
||||||
|
return _quadOffsetsSRV;
|
||||||
|
}
|
||||||
|
|
||||||
|
int GetQuadOffsetsBase(Far::PatchDescriptor::Type type) {
|
||||||
|
if (type == Far::PatchDescriptor::GREGORY_BOUNDARY) {
|
||||||
|
return _quadOffsetsBase[1];
|
||||||
|
}
|
||||||
|
return _quadOffsetsBase[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
D3D11LegacyGregoryPatchTable();
|
||||||
|
|
||||||
|
private:
|
||||||
|
ID3D11Buffer* _vertexValenceBuffer;
|
||||||
|
ID3D11Buffer* _quadOffsetsBuffer;
|
||||||
|
ID3D11ShaderResourceView* _vertexSRV;
|
||||||
|
ID3D11ShaderResourceView* _vertexValenceSRV;
|
||||||
|
ID3D11ShaderResourceView* _quadOffsetsSRV;
|
||||||
|
int _quadOffsetsBase[2]; // gregory, boundaryGregory
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // end namespace Osd
|
||||||
|
|
||||||
|
} // end namespace OPENSUBDIV_VERSION
|
||||||
|
using namespace OPENSUBDIV_VERSION;
|
||||||
|
|
||||||
|
} // end namespace OpenSubdiv
|
||||||
|
|
||||||
|
#endif // OPENSUBDIV3_OSD_D3D11_LEGACY_GREGORY_PATCH_TABLE_H
|
@ -28,14 +28,15 @@
|
|||||||
#include "../version.h"
|
#include "../version.h"
|
||||||
|
|
||||||
#include "../osd/mesh.h"
|
#include "../osd/mesh.h"
|
||||||
#include "../osd/d3d11DrawContext.h"
|
#include "../osd/d3d11PatchTable.h"
|
||||||
|
|
||||||
namespace OpenSubdiv {
|
namespace OpenSubdiv {
|
||||||
namespace OPENSUBDIV_VERSION {
|
namespace OPENSUBDIV_VERSION {
|
||||||
|
|
||||||
namespace Osd {
|
namespace Osd {
|
||||||
|
|
||||||
typedef MeshInterface<D3D11DrawContext> D3D11MeshInterface;
|
typedef MeshInterface<D3D11PatchTable> D3D11MeshInterface;
|
||||||
|
|
||||||
|
|
||||||
} // end namespace Osd
|
} // end namespace Osd
|
||||||
|
|
||||||
|
182
opensubdiv/osd/d3d11PatchTable.cpp
Normal file
182
opensubdiv/osd/d3d11PatchTable.cpp
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
//
|
||||||
|
// Copyright 2015 Pixar
|
||||||
|
//
|
||||||
|
// 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:
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
// You may obtain a copy of the Apache License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "../osd/d3d11PatchTable.h"
|
||||||
|
|
||||||
|
#include <D3D11.h>
|
||||||
|
#include "../far/patchTables.h"
|
||||||
|
|
||||||
|
namespace OpenSubdiv {
|
||||||
|
namespace OPENSUBDIV_VERSION {
|
||||||
|
|
||||||
|
namespace Osd {
|
||||||
|
|
||||||
|
D3D11PatchTable::D3D11PatchTable() :
|
||||||
|
_indexBuffer(0), _patchParamBuffer(0), _patchParamBufferSRV(0) {
|
||||||
|
}
|
||||||
|
|
||||||
|
D3D11PatchTable::~D3D11PatchTable() {
|
||||||
|
if (_indexBuffer) _indexBuffer->Release();
|
||||||
|
if (_patchParamBuffer) _patchParamBuffer->Release();
|
||||||
|
if (_patchParamBufferSRV) _patchParamBufferSRV->Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
D3D11PatchTable *
|
||||||
|
D3D11PatchTable::Create(Far::PatchTables const *farPatchTables,
|
||||||
|
ID3D11DeviceContext *pd3d11DeviceContext) {
|
||||||
|
D3D11PatchTable *instance = new D3D11PatchTable();
|
||||||
|
if (instance->allocate(farPatchTables, pd3d11DeviceContext))
|
||||||
|
return instance;
|
||||||
|
delete instance;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
D3D11PatchTable::allocate(Far::PatchTables const *farPatchTables,
|
||||||
|
ID3D11DeviceContext *pd3d11DeviceContext) {
|
||||||
|
ID3D11Device *pd3d11Device = NULL;
|
||||||
|
pd3d11DeviceContext->GetDevice(&pd3d11Device);
|
||||||
|
assert(pd3d11Device);
|
||||||
|
|
||||||
|
std::vector<int> buffer;
|
||||||
|
std::vector<unsigned int> ppBuffer;
|
||||||
|
|
||||||
|
// needs reserve?
|
||||||
|
int nPatchArrays = farPatchTables->GetNumPatchArrays();
|
||||||
|
|
||||||
|
// for each patchArray
|
||||||
|
for (int j = 0; j < nPatchArrays; ++j) {
|
||||||
|
PatchArray patchArray(farPatchTables->GetPatchArrayDescriptor(j),
|
||||||
|
farPatchTables->GetNumPatches(j),
|
||||||
|
(int)buffer.size(),
|
||||||
|
(int)ppBuffer.size()/3);
|
||||||
|
_patchArrays.push_back(patchArray);
|
||||||
|
|
||||||
|
// indices
|
||||||
|
Far::ConstIndexArray indices = farPatchTables->GetPatchArrayVertices(j);
|
||||||
|
for (int k = 0; k < indices.size(); ++k) {
|
||||||
|
buffer.push_back(indices[k]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// patchParams
|
||||||
|
#if 0
|
||||||
|
// XXX: we need sharpness interface for patcharray or put sharpness
|
||||||
|
// into patchParam.
|
||||||
|
Far::ConstPatchParamArray patchParams =
|
||||||
|
farPatchTables->GetPatchParams(j);
|
||||||
|
for (int k = 0; k < patchParams.size(); ++k) {
|
||||||
|
float sharpness = 0.0;
|
||||||
|
ppBuffer.push_back(patchParams[k].faceIndex);
|
||||||
|
ppBuffer.push_back(patchParams[k].bitField.field);
|
||||||
|
ppBuffer.push_back(*((unsigned int *)&sharpness));
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
// XXX: workaround. GetPatchParamTable() will be deprecated though.
|
||||||
|
Far::PatchParamTable const & patchParamTables =
|
||||||
|
farPatchTables->GetPatchParamTable();
|
||||||
|
std::vector<Far::Index> const &sharpnessIndexTable =
|
||||||
|
farPatchTables->GetSharpnessIndexTable();
|
||||||
|
int numPatches = farPatchTables->GetNumPatches(j);
|
||||||
|
for (int k = 0; k < numPatches; ++k) {
|
||||||
|
float sharpness = 0.0;
|
||||||
|
int patchIndex = (int)ppBuffer.size()/3;
|
||||||
|
if (patchIndex < (int)sharpnessIndexTable.size()) {
|
||||||
|
int sharpnessIndex = sharpnessIndexTable[patchIndex];
|
||||||
|
if (sharpnessIndex >= 0)
|
||||||
|
sharpness = farPatchTables->GetSharpnessValues()[sharpnessIndex];
|
||||||
|
}
|
||||||
|
ppBuffer.push_back(patchParamTables[patchIndex].faceIndex);
|
||||||
|
ppBuffer.push_back(patchParamTables[patchIndex].bitField.field);
|
||||||
|
ppBuffer.push_back(*((unsigned int *)&sharpness));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// index buffer
|
||||||
|
D3D11_BUFFER_DESC bd;
|
||||||
|
ZeroMemory(&bd, sizeof(bd));
|
||||||
|
bd.ByteWidth = (int)buffer.size() * sizeof(int);
|
||||||
|
bd.Usage = D3D11_USAGE_DYNAMIC;
|
||||||
|
bd.BindFlags = D3D11_BIND_INDEX_BUFFER;
|
||||||
|
bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
|
||||||
|
bd.MiscFlags = 0;
|
||||||
|
bd.StructureByteStride = sizeof(int);
|
||||||
|
HRESULT hr = pd3d11Device->CreateBuffer(&bd, NULL, &_indexBuffer);
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
D3D11_MAPPED_SUBRESOURCE mappedResource;
|
||||||
|
hr = pd3d11DeviceContext->Map(_indexBuffer, 0,
|
||||||
|
D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
unsigned int * indexBuffer = (unsigned int *) mappedResource.pData;
|
||||||
|
memcpy(indexBuffer, &buffer[0], buffer.size() * sizeof(unsigned int));
|
||||||
|
|
||||||
|
pd3d11DeviceContext->Unmap(_indexBuffer, 0);
|
||||||
|
|
||||||
|
// patchparam buffer
|
||||||
|
ZeroMemory(&bd, sizeof(bd));
|
||||||
|
bd.ByteWidth = (int)ppBuffer.size() * sizeof(int);
|
||||||
|
bd.Usage = D3D11_USAGE_DYNAMIC;
|
||||||
|
bd.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
||||||
|
bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
|
||||||
|
bd.MiscFlags = 0;
|
||||||
|
bd.StructureByteStride = sizeof(unsigned int);
|
||||||
|
hr = pd3d11Device->CreateBuffer(&bd, NULL, &_patchParamBuffer);
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
D3D11_SHADER_RESOURCE_VIEW_DESC srvd;
|
||||||
|
ZeroMemory(&srvd, sizeof(srvd));
|
||||||
|
srvd.Format = DXGI_FORMAT_R32G32B32_UINT;
|
||||||
|
srvd.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
|
||||||
|
srvd.Buffer.FirstElement = 0;
|
||||||
|
srvd.Buffer.NumElements = (int)ppBuffer.size()/3;
|
||||||
|
hr = pd3d11Device->CreateShaderResourceView(
|
||||||
|
_patchParamBuffer, &srvd, &_patchParamBufferSRV);
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
hr = pd3d11DeviceContext->Map(_patchParamBuffer, 0,
|
||||||
|
D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
unsigned int *dst = (unsigned int *) mappedResource.pData;
|
||||||
|
memcpy(dst, &ppBuffer[0], ppBuffer.size() * sizeof(int));
|
||||||
|
pd3d11DeviceContext->Unmap(_patchParamBuffer, 0);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // end namespace Osd
|
||||||
|
|
||||||
|
} // end namespace OPENSUBDIV_VERSION
|
||||||
|
} // end namespace OpenSubdiv
|
||||||
|
|
125
opensubdiv/osd/d3d11PatchTable.h
Normal file
125
opensubdiv/osd/d3d11PatchTable.h
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
//
|
||||||
|
// Copyright 2015 Pixar
|
||||||
|
//
|
||||||
|
// 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:
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
// You may obtain a copy of the Apache License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef OPENSUBDIV3_OSD_GL_PATCH_TABLE_H
|
||||||
|
#define OPENSUBDIV3_OSD_GL_PATCH_TABLE_H
|
||||||
|
|
||||||
|
#include "../version.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include "../far/patchDescriptor.h"
|
||||||
|
#include "../osd/nonCopyable.h"
|
||||||
|
|
||||||
|
struct ID3D11Buffer;
|
||||||
|
struct ID3D11ShaderResourceView;
|
||||||
|
struct ID3D11Device;
|
||||||
|
struct ID3D11DeviceContext;
|
||||||
|
|
||||||
|
namespace OpenSubdiv {
|
||||||
|
namespace OPENSUBDIV_VERSION {
|
||||||
|
|
||||||
|
namespace Far{
|
||||||
|
class PatchTables;
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace Osd {
|
||||||
|
|
||||||
|
class D3D11PatchTable : private NonCopyable<D3D11PatchTable> {
|
||||||
|
public:
|
||||||
|
typedef ID3D11Buffer * VertexBufferBinding;
|
||||||
|
|
||||||
|
// XXX: this struct will be further refactored.
|
||||||
|
class PatchArray {
|
||||||
|
public:
|
||||||
|
PatchArray(Far::PatchDescriptor desc, int numPatches,
|
||||||
|
int indexBase, int primitiveIdBase) :
|
||||||
|
desc(desc), numPatches(numPatches), indexBase(indexBase),
|
||||||
|
primitiveIdBase(primitiveIdBase) {}
|
||||||
|
Far::PatchDescriptor const &GetDescriptor() const {
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
int GetNumPatches() const {
|
||||||
|
return numPatches;
|
||||||
|
}
|
||||||
|
int GetIndexBase() const {
|
||||||
|
return indexBase;
|
||||||
|
}
|
||||||
|
int GetPrimitiveIdBase() const {
|
||||||
|
return primitiveIdBase;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
Far::PatchDescriptor desc;
|
||||||
|
int numPatches;
|
||||||
|
int indexBase; // an offset within the index buffer
|
||||||
|
int primitiveIdBase; // an offset within the patch param buffer
|
||||||
|
};
|
||||||
|
typedef std::vector<PatchArray> PatchArrayVector;
|
||||||
|
|
||||||
|
D3D11PatchTable();
|
||||||
|
~D3D11PatchTable();
|
||||||
|
|
||||||
|
template<typename DEVICE_CONTEXT>
|
||||||
|
static D3D11PatchTable *Create(Far::PatchTables const *farPatchTables,
|
||||||
|
DEVICE_CONTEXT context) {
|
||||||
|
return Create(farPatchTables, context->GetDeviceContext());
|
||||||
|
}
|
||||||
|
|
||||||
|
static D3D11PatchTable *Create(Far::PatchTables const *farPatchTables,
|
||||||
|
ID3D11DeviceContext *deviceContext);
|
||||||
|
|
||||||
|
PatchArrayVector const &GetPatchArrays() const {
|
||||||
|
return _patchArrays;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the index buffer containing the patch control vertices
|
||||||
|
ID3D11Buffer* GetPatchIndexBuffer() const {
|
||||||
|
return _indexBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the SRV containing the patch parameter
|
||||||
|
ID3D11ShaderResourceView* GetPatchParamSRV() const {
|
||||||
|
return _patchParamBufferSRV;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// allocate buffers from patchTables
|
||||||
|
bool allocate(Far::PatchTables const *farPatchTables,
|
||||||
|
ID3D11DeviceContext *deviceContext);
|
||||||
|
|
||||||
|
PatchArrayVector _patchArrays;
|
||||||
|
|
||||||
|
ID3D11Buffer *_indexBuffer;
|
||||||
|
ID3D11Buffer *_patchParamBuffer;
|
||||||
|
ID3D11ShaderResourceView *_patchParamBufferSRV;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // end namespace Osd
|
||||||
|
|
||||||
|
} // end namespace OPENSUBDIV_VERSION
|
||||||
|
using namespace OPENSUBDIV_VERSION;
|
||||||
|
|
||||||
|
} // end namespace OpenSubdiv
|
||||||
|
|
||||||
|
#endif // OPENSUBDIV3_OSD_GL_PATCH_TABLE_H
|
@ -1,133 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright 2013 Pixar
|
|
||||||
//
|
|
||||||
// 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:
|
|
||||||
//
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
// You may obtain a copy of the Apache License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "../osd/drawContext.h"
|
|
||||||
|
|
||||||
#include "../far/patchTables.h"
|
|
||||||
|
|
||||||
#include <cstring>
|
|
||||||
|
|
||||||
namespace OpenSubdiv {
|
|
||||||
namespace OPENSUBDIV_VERSION {
|
|
||||||
|
|
||||||
namespace Osd {
|
|
||||||
|
|
||||||
DrawContext::~DrawContext() {}
|
|
||||||
|
|
||||||
void
|
|
||||||
DrawContext::ConvertPatchArrays(Far::PatchTables const &patchTables,
|
|
||||||
PatchArrayVector &osdPatchArrays) {
|
|
||||||
|
|
||||||
int narrays = patchTables.GetNumPatchArrays();
|
|
||||||
|
|
||||||
// allocate drawing patch arrays
|
|
||||||
osdPatchArrays.clear();
|
|
||||||
osdPatchArrays.reserve(narrays);
|
|
||||||
|
|
||||||
for (int array=0, pidx=0, vidx=0, qidx=0; array<narrays; ++array) {
|
|
||||||
|
|
||||||
Far::PatchDescriptor desc = patchTables.GetPatchArrayDescriptor(array);
|
|
||||||
|
|
||||||
int npatches = patchTables.GetNumPatches(array),
|
|
||||||
nverts = desc.GetNumControlVertices();
|
|
||||||
|
|
||||||
osdPatchArrays.push_back(PatchArray(desc, npatches, vidx, pidx, qidx));
|
|
||||||
|
|
||||||
vidx += npatches * nverts;
|
|
||||||
pidx += npatches;
|
|
||||||
qidx += (desc.GetType() == Far::PatchDescriptor::GREGORY) ? npatches*nverts : 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// note : it is likely that Far::PatchTables::GetPatchControlVerticesTable()
|
|
||||||
// will eventually be deprecated if control vertices cannot be kept
|
|
||||||
// in a single linear array of indices. This function will help
|
|
||||||
// packing patch control vertices for GPU buffers.
|
|
||||||
void
|
|
||||||
DrawContext::packPatchVerts(Far::PatchTables const & patchTables,
|
|
||||||
std::vector<Index> & dst) {
|
|
||||||
|
|
||||||
dst.resize(patchTables.GetNumControlVerticesTotal());
|
|
||||||
Index * ptr = &dst[0];
|
|
||||||
|
|
||||||
int narrays = patchTables.GetNumPatchArrays();
|
|
||||||
for (int array=0; array<narrays; ++array) {
|
|
||||||
Far::ConstIndexArray verts = patchTables.GetPatchArrayVertices(array);
|
|
||||||
memcpy(ptr, verts.begin(), verts.size()*sizeof(Index));
|
|
||||||
ptr += verts.size();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
DrawContext::packSharpnessValues(Far::PatchTables const & patchTables,
|
|
||||||
std::vector<unsigned int> & dst) {
|
|
||||||
|
|
||||||
Far::PatchParamTable const & patchParamTables =
|
|
||||||
patchTables.GetPatchParamTable();
|
|
||||||
|
|
||||||
std::vector<int> const &sharpnessIndexTable =
|
|
||||||
patchTables.GetSharpnessIndexTable();
|
|
||||||
|
|
||||||
std::vector<float> const &sharpnessValues =
|
|
||||||
patchTables.GetSharpnessValues();
|
|
||||||
|
|
||||||
int npatches = (int)patchParamTables.size();
|
|
||||||
|
|
||||||
// PatchParam = sizeof(int)*2, 1 float for sharpness
|
|
||||||
dst.resize(npatches * (2 + 1));
|
|
||||||
|
|
||||||
for (int i = 0; i < npatches; ++i) {
|
|
||||||
float sharpness = sharpnessIndexTable[i] >= 0 ?
|
|
||||||
sharpnessValues[sharpnessIndexTable[i]] : 0.0f;
|
|
||||||
dst[i*3+0] = patchParamTables[i].faceIndex;
|
|
||||||
dst[i*3+1] = patchParamTables[i].bitField.field;
|
|
||||||
dst[i*3+2] = *((unsigned int *)&sharpness);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
DrawContext::packFVarData(Far::PatchTables const & patchTables,
|
|
||||||
int fvarWidth, FVarData const & src, FVarData & dst) {
|
|
||||||
|
|
||||||
assert(fvarWidth and (not src.empty()));
|
|
||||||
|
|
||||||
// XXXX OsdMesh only accesses channel 0
|
|
||||||
Far::ConstIndexArray indices = patchTables.GetFVarPatchesValues(0);
|
|
||||||
|
|
||||||
dst.resize(indices.size() * fvarWidth);
|
|
||||||
float * ptr = &dst[0];
|
|
||||||
|
|
||||||
for (int fvert=0; fvert<(int)indices.size(); ++fvert, ptr+=fvarWidth) {
|
|
||||||
|
|
||||||
int index = indices[fvert] * fvarWidth;
|
|
||||||
assert(index<(int)src.size());
|
|
||||||
|
|
||||||
memcpy(ptr, &src[index], fvarWidth*sizeof(float));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // end namespace Osd
|
|
||||||
|
|
||||||
} // end namespace OPENSUBDIV_VERSION
|
|
||||||
} // end namespace OpenSubdiv
|
|
@ -1,197 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright 2013 Pixar
|
|
||||||
//
|
|
||||||
// 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:
|
|
||||||
//
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
// You may obtain a copy of the Apache License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef OPENSUBDIV3_OSD_DRAW_CONTEXT_H
|
|
||||||
#define OPENSUBDIV3_OSD_DRAW_CONTEXT_H
|
|
||||||
|
|
||||||
#include "../version.h"
|
|
||||||
|
|
||||||
#include "../far/patchDescriptor.h"
|
|
||||||
#include "../far/types.h"
|
|
||||||
|
|
||||||
#include <utility>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace OpenSubdiv {
|
|
||||||
namespace OPENSUBDIV_VERSION {
|
|
||||||
|
|
||||||
namespace Far {
|
|
||||||
class PatchTables;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Osd {
|
|
||||||
|
|
||||||
/// \brief Base DrawContext class
|
|
||||||
///
|
|
||||||
/// DrawContext derives several sub-classes with API specific functionality
|
|
||||||
/// (GL, D3D11, ...).
|
|
||||||
///
|
|
||||||
/// Current specificiation GPU hardware tessellation limitations require transition
|
|
||||||
/// patches to be split-up into several triangular bi-cubic sub-patches.
|
|
||||||
/// DrawContext processes FarPatchArrays from Far::PatchTables and generates the
|
|
||||||
/// additional sets of sub-patches.
|
|
||||||
///
|
|
||||||
/// Contexts interface the serialized topological data pertaining to the
|
|
||||||
/// geometric primitives with the capabilities of the selected discrete
|
|
||||||
/// compute device.
|
|
||||||
///
|
|
||||||
class DrawContext {
|
|
||||||
|
|
||||||
public:
|
|
||||||
typedef Far::Index Index;
|
|
||||||
|
|
||||||
class PatchArray {
|
|
||||||
public:
|
|
||||||
/// Constructor
|
|
||||||
///
|
|
||||||
/// @param desc Patch descriptor defines the type, pattern, rotation of
|
|
||||||
/// the patches in the array
|
|
||||||
///
|
|
||||||
/// @param npatches The number of patches in the array
|
|
||||||
///
|
|
||||||
/// @param vertIndex Index of the first control vertex in the array
|
|
||||||
///
|
|
||||||
/// @param patchIndex Index of the first patch in the array
|
|
||||||
///
|
|
||||||
/// @param qoIndex Index of the first quad-offset entry
|
|
||||||
///
|
|
||||||
PatchArray(Far::PatchDescriptor desc, int npatches,
|
|
||||||
Index vertIndex, Index patchIndex, Index qoIndex) :
|
|
||||||
_desc(desc), _npatches(npatches),
|
|
||||||
_vertIndex(vertIndex), _patchIndex(patchIndex), _quadOffsetIndex(qoIndex) { }
|
|
||||||
|
|
||||||
/// Returns a patch descriptor defining the type of patches in the array
|
|
||||||
Far::PatchDescriptor GetDescriptor() const {
|
|
||||||
return _desc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Update a patch descriptor
|
|
||||||
void SetDescriptor(Far::PatchDescriptor desc) {
|
|
||||||
_desc = desc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the index of the first control vertex of the first patch
|
|
||||||
/// of this array in the global PTable
|
|
||||||
unsigned int GetVertIndex() const {
|
|
||||||
return _vertIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the global index of the first patch in this array (Used to
|
|
||||||
/// access ptex / fvar table data)
|
|
||||||
unsigned int GetPatchIndex() const {
|
|
||||||
return _patchIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the number of patches in the array
|
|
||||||
unsigned int GetNumPatches() const {
|
|
||||||
return _npatches;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the number of patch indices in the array
|
|
||||||
unsigned int GetNumIndices() const {
|
|
||||||
return _npatches * _desc.GetNumControlVertices();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the offset of quad offset table
|
|
||||||
unsigned int GetQuadOffsetIndex() const {
|
|
||||||
return _quadOffsetIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Set num patches (used at batch glomming)
|
|
||||||
void SetNumPatches(int npatches) {
|
|
||||||
_npatches = npatches;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
Far::PatchDescriptor _desc;
|
|
||||||
int _npatches;
|
|
||||||
Index _vertIndex,
|
|
||||||
_patchIndex,
|
|
||||||
_quadOffsetIndex;
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Constructor
|
|
||||||
DrawContext(int maxValence) : _isAdaptive(false), _maxValence(maxValence) {}
|
|
||||||
|
|
||||||
/// Descrtuctor
|
|
||||||
virtual ~DrawContext();
|
|
||||||
|
|
||||||
/// Returns true if the primitive attached to the context uses feature adaptive
|
|
||||||
/// subdivision
|
|
||||||
bool IsAdaptive() const {
|
|
||||||
return _isAdaptive;
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef std::vector<PatchArray> PatchArrayVector;
|
|
||||||
|
|
||||||
PatchArrayVector const & GetPatchArrays() const {
|
|
||||||
return _patchArrays;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The writable accessor to the internal patch array (tentative).
|
|
||||||
/// We should have a different api something like ConvertPatchArrays().
|
|
||||||
PatchArrayVector &GetPatchArrays() {
|
|
||||||
return _patchArrays;
|
|
||||||
}
|
|
||||||
|
|
||||||
// processes FarPatchArrays and inserts requisite sub-patches for the arrays
|
|
||||||
// containing transition patches
|
|
||||||
static void ConvertPatchArrays(Far::PatchTables const &patchTables,
|
|
||||||
DrawContext::PatchArrayVector &osdPatchArrays);
|
|
||||||
|
|
||||||
// maxValence is needed for legacy gregorypatch drawing
|
|
||||||
int GetMaxValence() const {
|
|
||||||
return _maxValence;
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef std::vector<float> FVarData;
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
static void packPatchVerts(Far::PatchTables const & patchTables,
|
|
||||||
std::vector<Index> & dst);
|
|
||||||
|
|
||||||
static void packSharpnessValues(Far::PatchTables const & patchTables,
|
|
||||||
std::vector<unsigned int> & dst);
|
|
||||||
|
|
||||||
static void packFVarData(Far::PatchTables const & patchTables,
|
|
||||||
int fvarWidth, FVarData const & src, FVarData & dst);
|
|
||||||
|
|
||||||
// XXXX: move to private member
|
|
||||||
PatchArrayVector _patchArrays;
|
|
||||||
|
|
||||||
bool _isAdaptive;
|
|
||||||
|
|
||||||
int _maxValence;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // end namespace Osd
|
|
||||||
|
|
||||||
} // end namespace OPENSUBDIV_VERSION
|
|
||||||
using namespace OPENSUBDIV_VERSION;
|
|
||||||
|
|
||||||
} // end namespace OpenSubdiv
|
|
||||||
|
|
||||||
#endif /* OPENSUBDIV3_OSD_DRAW_CONTEXT_H */
|
|
@ -1,232 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright 2013 Pixar
|
|
||||||
//
|
|
||||||
// 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:
|
|
||||||
//
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
// You may obtain a copy of the Apache License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "../osd/glDrawContext.h"
|
|
||||||
|
|
||||||
#include "../osd/opengl.h"
|
|
||||||
|
|
||||||
namespace OpenSubdiv {
|
|
||||||
namespace OPENSUBDIV_VERSION {
|
|
||||||
|
|
||||||
namespace Osd {
|
|
||||||
|
|
||||||
GLDrawContext::GLDrawContext(int maxValence) :
|
|
||||||
DrawContext(maxValence),
|
|
||||||
_patchIndexBuffer(0), _patchParamTextureBuffer(0), _fvarDataTextureBuffer(0),
|
|
||||||
_vertexTextureBuffer(0), _vertexValenceTextureBuffer(0), _quadOffsetsTextureBuffer(0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
GLDrawContext::~GLDrawContext()
|
|
||||||
{
|
|
||||||
glDeleteBuffers(1, &_patchIndexBuffer);
|
|
||||||
glDeleteTextures(1, &_vertexTextureBuffer);
|
|
||||||
glDeleteTextures(1, &_vertexValenceTextureBuffer);
|
|
||||||
glDeleteTextures(1, &_quadOffsetsTextureBuffer);
|
|
||||||
glDeleteTextures(1, &_patchParamTextureBuffer);
|
|
||||||
glDeleteTextures(1, &_fvarDataTextureBuffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T> static GLuint
|
|
||||||
createTextureBuffer(T const &data, GLint format, int offset=0)
|
|
||||||
{
|
|
||||||
GLuint buffer = 0, texture = 0;
|
|
||||||
|
|
||||||
#if defined(GL_ARB_texture_buffer_object) || defined(GL_VERSION_3_1)
|
|
||||||
glGenTextures(1, &texture);
|
|
||||||
glGenBuffers(1, &buffer);
|
|
||||||
|
|
||||||
#if defined(GL_EXT_direct_state_access)
|
|
||||||
if (glNamedBufferDataEXT and glTextureBufferEXT) {
|
|
||||||
glNamedBufferDataEXT(buffer, (data.size()-offset) * sizeof(typename T::value_type),
|
|
||||||
&data[offset], GL_STATIC_DRAW);
|
|
||||||
glTextureBufferEXT(texture, GL_TEXTURE_BUFFER, format, buffer);
|
|
||||||
} else {
|
|
||||||
#else
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, buffer);
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, (data.size()-offset) * sizeof(typename T::value_type),
|
|
||||||
&data[offset], GL_STATIC_DRAW);
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_BUFFER, texture);
|
|
||||||
glTexBuffer(GL_TEXTURE_BUFFER, format, buffer);
|
|
||||||
glBindTexture(GL_TEXTURE_BUFFER, 0);
|
|
||||||
}
|
|
||||||
glDeleteBuffers(1, &buffer);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return texture;
|
|
||||||
}
|
|
||||||
|
|
||||||
GLDrawContext *
|
|
||||||
GLDrawContext::Create(Far::PatchTables const * patchTables, void * /*deviceContext*/) {
|
|
||||||
|
|
||||||
if (patchTables) {
|
|
||||||
|
|
||||||
int maxValence = patchTables->GetMaxValence();
|
|
||||||
GLDrawContext * result = new GLDrawContext(maxValence);
|
|
||||||
|
|
||||||
if (result->create(*patchTables)) {
|
|
||||||
return result;
|
|
||||||
} else {
|
|
||||||
delete result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
GLDrawContext::create(Far::PatchTables const & patchTables) {
|
|
||||||
|
|
||||||
_isAdaptive = patchTables.IsFeatureAdaptive();
|
|
||||||
|
|
||||||
// Process PTable
|
|
||||||
Far::PatchTables::PatchVertsTable const & ptables = patchTables.GetPatchControlVerticesTable();
|
|
||||||
|
|
||||||
glGenBuffers(1, &_patchIndexBuffer);
|
|
||||||
|
|
||||||
#if defined(GL_EXT_direct_state_access)
|
|
||||||
if (glNamedBufferDataEXT) {
|
|
||||||
glNamedBufferDataEXT(_patchIndexBuffer,
|
|
||||||
ptables.size() * sizeof(unsigned int), &ptables[0], GL_STATIC_DRAW);
|
|
||||||
} else {
|
|
||||||
#else
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _patchIndexBuffer);
|
|
||||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER,
|
|
||||||
ptables.size() * sizeof(unsigned int), &ptables[0], GL_STATIC_DRAW);
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
DrawContext::ConvertPatchArrays(patchTables, _patchArrays);
|
|
||||||
|
|
||||||
// allocate and initialize additional buffer data
|
|
||||||
|
|
||||||
#if defined(GL_ARB_texture_buffer_object) || defined(GL_VERSION_3_1)
|
|
||||||
// create vertex valence buffer and vertex texture
|
|
||||||
Far::PatchTables::VertexValenceTable const &
|
|
||||||
valenceTable = patchTables.GetVertexValenceTable();
|
|
||||||
|
|
||||||
if (not valenceTable.empty()) {
|
|
||||||
_vertexValenceTextureBuffer = createTextureBuffer(valenceTable, GL_R32I);
|
|
||||||
|
|
||||||
// also create vertex texture buffer (will be updated in UpdateVertexTexture())
|
|
||||||
glGenTextures(1, &_vertexTextureBuffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// create quad offset table buffer
|
|
||||||
Far::PatchTables::QuadOffsetsTable const &
|
|
||||||
quadOffsetTable = patchTables.GetQuadOffsetsTable();
|
|
||||||
|
|
||||||
if (not quadOffsetTable.empty())
|
|
||||||
_quadOffsetsTextureBuffer = createTextureBuffer(quadOffsetTable, GL_R32I);
|
|
||||||
|
|
||||||
|
|
||||||
// create ptex coordinate buffer
|
|
||||||
Far::PatchParamTable const & patchParamTables =
|
|
||||||
patchTables.GetPatchParamTable();
|
|
||||||
|
|
||||||
if (not patchParamTables.empty()) {
|
|
||||||
|
|
||||||
if (patchTables.GetSharpnessIndexTable().empty()) {
|
|
||||||
|
|
||||||
_patchParamTextureBuffer = createTextureBuffer(patchParamTables, GL_RG32I);
|
|
||||||
} else {
|
|
||||||
|
|
||||||
// if indexed sharpnesses exists, flatten them and interleave into 3-component buffer
|
|
||||||
std::vector<unsigned int> buffer;
|
|
||||||
packSharpnessValues(patchTables, buffer);
|
|
||||||
|
|
||||||
_patchParamTextureBuffer = createTextureBuffer(buffer, GL_RGB32I);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
glBindBuffer(GL_TEXTURE_BUFFER, 0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(GL_ARB_texture_buffer_object) || defined(GL_VERSION_3_1)
|
|
||||||
bool
|
|
||||||
GLDrawContext::SetFVarDataTexture(
|
|
||||||
Far::PatchTables const & patchTables, int fvarWidth, FVarData const & fvarData,
|
|
||||||
void * /*deviceContext*/) {
|
|
||||||
|
|
||||||
if (not fvarData.empty()) {
|
|
||||||
|
|
||||||
FVarData fvarDataTable;
|
|
||||||
|
|
||||||
packFVarData(patchTables, fvarWidth, fvarData, fvarDataTable);
|
|
||||||
|
|
||||||
_fvarDataTextureBuffer = createTextureBuffer(fvarDataTable, GL_R32F);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
bool
|
|
||||||
GLDrawContext::SetFVarDataTexture(
|
|
||||||
Far::PatchTables const &, int, FVarData const &,
|
|
||||||
void * /*deviceContext*/) {
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(GL_ARB_texture_buffer_object) || defined(GL_VERSION_3_1)
|
|
||||||
void
|
|
||||||
GLDrawContext::updateVertexTexture(GLuint vbo)
|
|
||||||
{
|
|
||||||
|
|
||||||
#if defined(GL_EXT_direct_state_access)
|
|
||||||
if (glTextureBufferEXT) {
|
|
||||||
glTextureBufferEXT(_vertexTextureBuffer, GL_TEXTURE_BUFFER, GL_R32F, vbo);
|
|
||||||
} else {
|
|
||||||
#else
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
glBindTexture(GL_TEXTURE_BUFFER, _vertexTextureBuffer);
|
|
||||||
glTexBuffer(GL_TEXTURE_BUFFER, GL_R32F, vbo);
|
|
||||||
glBindTexture(GL_TEXTURE_BUFFER, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
void
|
|
||||||
GLDrawContext::updateVertexTexture(GLuint)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
} // end namespace Osd
|
|
||||||
|
|
||||||
} // end namespace OPENSUBDIV_VERSION
|
|
||||||
} // end namespace OpenSubdiv
|
|
@ -1,151 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright 2013 Pixar
|
|
||||||
//
|
|
||||||
// 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:
|
|
||||||
//
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
// You may obtain a copy of the Apache License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef OPENSUBDIV3_OSD_GL_DRAW_CONTEXT_H
|
|
||||||
#define OPENSUBDIV3_OSD_GL_DRAW_CONTEXT_H
|
|
||||||
|
|
||||||
#include "../version.h"
|
|
||||||
|
|
||||||
#include <cstddef>
|
|
||||||
|
|
||||||
#include "../far/patchTables.h"
|
|
||||||
#include "../osd/drawContext.h"
|
|
||||||
#include "../osd/opengl.h"
|
|
||||||
|
|
||||||
namespace OpenSubdiv {
|
|
||||||
namespace OPENSUBDIV_VERSION {
|
|
||||||
|
|
||||||
namespace Osd {
|
|
||||||
|
|
||||||
/// \brief OpenGL specialized DrawContext class
|
|
||||||
///
|
|
||||||
/// GLDrawContext implements the OSD drawing interface with the OpenGL API.
|
|
||||||
/// Some functionality may be disabled depending on compile and run-time driver
|
|
||||||
/// support.
|
|
||||||
///
|
|
||||||
/// Contexts interface the serialized topological data pertaining to the
|
|
||||||
/// geometric primitives with the capabilities of the selected discrete
|
|
||||||
/// compute device.
|
|
||||||
///
|
|
||||||
class GLDrawContext : public DrawContext {
|
|
||||||
public:
|
|
||||||
typedef GLuint VertexBufferBinding;
|
|
||||||
|
|
||||||
virtual ~GLDrawContext();
|
|
||||||
|
|
||||||
/// \brief Create an GLDraContext from Far::PatchTables
|
|
||||||
///
|
|
||||||
/// @param patchTables a valid set of Far::PatchTables
|
|
||||||
///
|
|
||||||
/// @param deviceContext not used in GLDrawContext
|
|
||||||
///
|
|
||||||
static GLDrawContext * Create(Far::PatchTables const * patchTables,
|
|
||||||
void *deviceContext = NULL);
|
|
||||||
|
|
||||||
/// Set vbo as a vertex texture (for gregory patch drawing)
|
|
||||||
///
|
|
||||||
/// @param vbo the vertex buffer object to update
|
|
||||||
///
|
|
||||||
template<class VERTEX_BUFFER>
|
|
||||||
void UpdateVertexTexture(VERTEX_BUFFER *vbo, void *deviceContext = NULL) {
|
|
||||||
(void)(deviceContext); // unused parameter
|
|
||||||
if (vbo)
|
|
||||||
updateVertexTexture(vbo->BindVBO());
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the GL texture buffer containing the patch control vertices array
|
|
||||||
GLuint GetPatchIndexBuffer() const {
|
|
||||||
return _patchIndexBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the GL texture buffer containing the patch local parameterization
|
|
||||||
/// data
|
|
||||||
GLuint GetPatchParamTextureBuffer() const {
|
|
||||||
return _patchParamTextureBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the GL texture buffer containing the vertex data
|
|
||||||
GLuint GetVertexTextureBuffer() const {
|
|
||||||
return _vertexTextureBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the GL texture buffer containing patch vertex valence data (only
|
|
||||||
/// used by Gregory patches)
|
|
||||||
GLuint GetVertexValenceTextureBuffer() const {
|
|
||||||
return _vertexValenceTextureBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the GL texture buffer containing patch quad offsets data (only
|
|
||||||
/// used by Gregory patches)
|
|
||||||
GLuint GetQuadOffsetsTextureBuffer() const {
|
|
||||||
return _quadOffsetsTextureBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the GL texture buffer containing fvar data
|
|
||||||
GLuint GetFvarDataTextureBuffer() const {
|
|
||||||
return _fvarDataTextureBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Sets face-varying data buffer
|
|
||||||
///
|
|
||||||
/// @param patchTables A valid set of Far::PatchTables
|
|
||||||
///
|
|
||||||
/// @param fvarWidth Total face-varying primvar data width in fvarData
|
|
||||||
///
|
|
||||||
/// @param fvarData Vector containing the face-varying data
|
|
||||||
///
|
|
||||||
/// @param deviceContext (not used)
|
|
||||||
///
|
|
||||||
/// @return True if the operation was successful
|
|
||||||
///
|
|
||||||
bool SetFVarDataTexture(Far::PatchTables const & patchTables,
|
|
||||||
int fvarWidth, FVarData const & fvarData,
|
|
||||||
void *deviceContext = NULL);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
GLuint _patchIndexBuffer;
|
|
||||||
|
|
||||||
GLuint _patchParamTextureBuffer;
|
|
||||||
GLuint _fvarDataTextureBuffer;
|
|
||||||
|
|
||||||
GLuint _vertexTextureBuffer;
|
|
||||||
GLuint _vertexValenceTextureBuffer;
|
|
||||||
GLuint _quadOffsetsTextureBuffer;
|
|
||||||
|
|
||||||
GLDrawContext(int maxValence);
|
|
||||||
|
|
||||||
// allocate buffers from patchTables
|
|
||||||
bool create(Far::PatchTables const & patchTables);
|
|
||||||
|
|
||||||
void updateVertexTexture(GLuint vbo);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // end namespace Osd
|
|
||||||
|
|
||||||
} // end namespace OPENSUBDIV_VERSION
|
|
||||||
using namespace OPENSUBDIV_VERSION;
|
|
||||||
|
|
||||||
} // end namespace OpenSubdiv
|
|
||||||
|
|
||||||
#endif /* OPENSUBDIV3_OSD_DRAW_CONTEXT_H */
|
|
106
opensubdiv/osd/glLegacyGregoryPatchTable.cpp
Normal file
106
opensubdiv/osd/glLegacyGregoryPatchTable.cpp
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
//
|
||||||
|
// Copyright 2015 Pixar
|
||||||
|
//
|
||||||
|
// 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:
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
// You may obtain a copy of the Apache License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "../osd/glLegacyGregoryPatchTable.h"
|
||||||
|
|
||||||
|
namespace OpenSubdiv {
|
||||||
|
namespace OPENSUBDIV_VERSION {
|
||||||
|
|
||||||
|
namespace Osd {
|
||||||
|
|
||||||
|
GLLegacyGregoryPatchTable::GLLegacyGregoryPatchTable() :
|
||||||
|
_vertexTextureBuffer(0), _vertexValenceTextureBuffer(0),
|
||||||
|
_quadOffsetsTextureBuffer(0) {
|
||||||
|
_quadOffsetsBase[0] = _quadOffsetsBase[1] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLLegacyGregoryPatchTable::~GLLegacyGregoryPatchTable() {
|
||||||
|
if (_vertexTextureBuffer)
|
||||||
|
glDeleteTextures(1, &_vertexTextureBuffer);
|
||||||
|
if (_vertexValenceTextureBuffer)
|
||||||
|
glDeleteTextures(1, &_vertexValenceTextureBuffer);
|
||||||
|
if (_quadOffsetsTextureBuffer)
|
||||||
|
glDeleteTextures(1, &_quadOffsetsTextureBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLLegacyGregoryPatchTable *
|
||||||
|
GLLegacyGregoryPatchTable::Create(Far::PatchTables const *farPatchTables) {
|
||||||
|
|
||||||
|
GLLegacyGregoryPatchTable *result = new GLLegacyGregoryPatchTable();
|
||||||
|
glGenTextures(1, &result->_vertexTextureBuffer);
|
||||||
|
glGenTextures(1, &result->_vertexValenceTextureBuffer);
|
||||||
|
glGenTextures(1, &result->_quadOffsetsTextureBuffer);
|
||||||
|
|
||||||
|
Far::PatchTables::VertexValenceTable const &
|
||||||
|
valenceTable = farPatchTables->GetVertexValenceTable();
|
||||||
|
Far::PatchTables::QuadOffsetsTable const &
|
||||||
|
quadOffsetsTable = farPatchTables->GetQuadOffsetsTable();
|
||||||
|
|
||||||
|
GLuint buffers[2];
|
||||||
|
glGenBuffers(2, buffers);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, valenceTable.size() * sizeof(int),
|
||||||
|
&valenceTable[0], GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
glBindTexture(GL_TEXTURE_BUFFER, result->_vertexValenceTextureBuffer);
|
||||||
|
glTexBuffer(GL_TEXTURE_BUFFER, GL_R32I, buffers[0]);
|
||||||
|
glBindTexture(GL_TEXTURE_BUFFER, 0);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, buffers[1]);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, quadOffsetsTable.size() * sizeof(int),
|
||||||
|
&quadOffsetsTable[0], GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
glBindTexture(GL_TEXTURE_BUFFER, result->_quadOffsetsTextureBuffer);
|
||||||
|
glTexBuffer(GL_TEXTURE_BUFFER, GL_R32I, buffers[1]);
|
||||||
|
glBindTexture(GL_TEXTURE_BUFFER, 0);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
|
glDeleteBuffers(2, buffers);
|
||||||
|
|
||||||
|
result->_quadOffsetsBase[0] = 0;
|
||||||
|
result->_quadOffsetsBase[1] = 0;
|
||||||
|
// scan patchtable to find quadOffsetsBase.
|
||||||
|
for (int i = 0; i < farPatchTables->GetNumPatchArrays(); ++i) {
|
||||||
|
// GREGORY_BOUNDARY's quadoffsets come after GREGORY's.
|
||||||
|
if (farPatchTables->GetPatchArrayDescriptor(i) ==
|
||||||
|
Far::PatchDescriptor::GREGORY) {
|
||||||
|
result->_quadOffsetsBase[1] = farPatchTables->GetNumPatches(i) * 4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
GLLegacyGregoryPatchTable::UpdateVertexBuffer(GLuint vbo) {
|
||||||
|
glBindTexture(GL_TEXTURE_BUFFER, _vertexTextureBuffer);
|
||||||
|
glTexBuffer(GL_TEXTURE_BUFFER, GL_R32F, vbo);
|
||||||
|
glBindTexture(GL_TEXTURE_BUFFER, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // end namespace Osd
|
||||||
|
|
||||||
|
} // end namespace OPENSUBDIV_VERSION
|
||||||
|
} // end namespace OpenSubdiv
|
86
opensubdiv/osd/glLegacyGregoryPatchTable.h
Normal file
86
opensubdiv/osd/glLegacyGregoryPatchTable.h
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
//
|
||||||
|
// Copyright 2015 Pixar
|
||||||
|
//
|
||||||
|
// 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:
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
// You may obtain a copy of the Apache License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef OPENSUBDIV3_OSD_GL_LEGACY_GREGORY_PATCH_TABLE_H
|
||||||
|
#define OPENSUBDIV3_OSD_GL_LEGACY_GREGORY_PATCH_TABLE_H
|
||||||
|
|
||||||
|
#include "../version.h"
|
||||||
|
|
||||||
|
#include "../far/patchTables.h"
|
||||||
|
#include "../osd/nonCopyable.h"
|
||||||
|
#include "../osd/opengl.h"
|
||||||
|
|
||||||
|
namespace OpenSubdiv {
|
||||||
|
namespace OPENSUBDIV_VERSION {
|
||||||
|
|
||||||
|
namespace Osd {
|
||||||
|
|
||||||
|
class GLLegacyGregoryPatchTable
|
||||||
|
: private NonCopyable<GLLegacyGregoryPatchTable> {
|
||||||
|
public:
|
||||||
|
~GLLegacyGregoryPatchTable();
|
||||||
|
|
||||||
|
static GLLegacyGregoryPatchTable *Create(Far::PatchTables const *patchTable);
|
||||||
|
|
||||||
|
void UpdateVertexBuffer(GLuint vbo);
|
||||||
|
|
||||||
|
GLuint GetVertexTextureBuffer() const {
|
||||||
|
return _vertexTextureBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLuint GetVertexValenceTextureBuffer() const {
|
||||||
|
return _vertexValenceTextureBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLuint GetQuadOffsetsTextureBuffer() const {
|
||||||
|
return _quadOffsetsTextureBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLuint GetQuadOffsetsBase(Far::PatchDescriptor::Type type) {
|
||||||
|
if (type == Far::PatchDescriptor::GREGORY_BOUNDARY) {
|
||||||
|
return _quadOffsetsBase[1];
|
||||||
|
}
|
||||||
|
return _quadOffsetsBase[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
GLLegacyGregoryPatchTable();
|
||||||
|
|
||||||
|
private:
|
||||||
|
GLuint _vertexTextureBuffer;
|
||||||
|
GLuint _vertexValenceTextureBuffer;
|
||||||
|
GLuint _quadOffsetsTextureBuffer;
|
||||||
|
GLuint _quadOffsetsBase[2]; // gregory, boundaryGregory
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // end namespace Osd
|
||||||
|
|
||||||
|
} // end namespace OPENSUBDIV_VERSION
|
||||||
|
using namespace OPENSUBDIV_VERSION;
|
||||||
|
|
||||||
|
} // end namespace OpenSubdiv
|
||||||
|
|
||||||
|
#endif // OPENSUBDIV3_OSD_GL_LEGACY_GREGORY_PATCH_TABLE_H
|
@ -28,14 +28,15 @@
|
|||||||
#include "../version.h"
|
#include "../version.h"
|
||||||
|
|
||||||
#include "../osd/mesh.h"
|
#include "../osd/mesh.h"
|
||||||
#include "../osd/glDrawContext.h"
|
#include "../osd/glPatchTable.h"
|
||||||
|
|
||||||
namespace OpenSubdiv {
|
namespace OpenSubdiv {
|
||||||
namespace OPENSUBDIV_VERSION {
|
namespace OPENSUBDIV_VERSION {
|
||||||
|
|
||||||
namespace Osd {
|
namespace Osd {
|
||||||
|
|
||||||
typedef MeshInterface<GLDrawContext> GLMeshInterface;
|
typedef MeshInterface<GLPatchTable> GLMeshInterface;
|
||||||
|
|
||||||
|
|
||||||
} // end namespace Osd
|
} // end namespace Osd
|
||||||
|
|
||||||
|
141
opensubdiv/osd/glPatchTable.cpp
Normal file
141
opensubdiv/osd/glPatchTable.cpp
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
//
|
||||||
|
// Copyright 2015 Pixar
|
||||||
|
//
|
||||||
|
// 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:
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
// You may obtain a copy of the Apache License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "../osd/glPatchTable.h"
|
||||||
|
|
||||||
|
#include "../far/patchTables.h"
|
||||||
|
#include "../osd/opengl.h"
|
||||||
|
|
||||||
|
namespace OpenSubdiv {
|
||||||
|
namespace OPENSUBDIV_VERSION {
|
||||||
|
|
||||||
|
namespace Osd {
|
||||||
|
|
||||||
|
GLPatchTable::GLPatchTable() :
|
||||||
|
_indexBuffer(0), _patchParamTexture(0) {
|
||||||
|
}
|
||||||
|
|
||||||
|
GLPatchTable::~GLPatchTable() {
|
||||||
|
if (_indexBuffer) glDeleteBuffers(1, &_indexBuffer);
|
||||||
|
if (_patchParamTexture) glDeleteTextures(1, &_patchParamTexture);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLPatchTable *
|
||||||
|
GLPatchTable::Create(Far::PatchTables const *farPatchTables,
|
||||||
|
void * /*deviceContext*/) {
|
||||||
|
GLPatchTable *instance = new GLPatchTable();
|
||||||
|
if (instance->allocate(farPatchTables)) return instance;
|
||||||
|
delete instance;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
GLPatchTable::allocate(Far::PatchTables const *farPatchTables) {
|
||||||
|
glGenBuffers(1, &_indexBuffer);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
|
||||||
|
std::vector<int> buffer;
|
||||||
|
std::vector<unsigned int> ppBuffer;
|
||||||
|
|
||||||
|
// needs reserve?
|
||||||
|
|
||||||
|
int nPatchArrays = farPatchTables->GetNumPatchArrays();
|
||||||
|
|
||||||
|
// for each patchArray
|
||||||
|
for (int j = 0; j < nPatchArrays; ++j) {
|
||||||
|
PatchArray patchArray(farPatchTables->GetPatchArrayDescriptor(j),
|
||||||
|
farPatchTables->GetNumPatches(j),
|
||||||
|
(int)buffer.size(),
|
||||||
|
(int)ppBuffer.size()/3);
|
||||||
|
_patchArrays.push_back(patchArray);
|
||||||
|
|
||||||
|
// indices
|
||||||
|
Far::ConstIndexArray indices = farPatchTables->GetPatchArrayVertices(j);
|
||||||
|
for (int k = 0; k < indices.size(); ++k) {
|
||||||
|
buffer.push_back(indices[k]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// patchParams
|
||||||
|
#if 0
|
||||||
|
// XXX: we need sharpness interface for patcharray or put sharpness
|
||||||
|
// into patchParam.
|
||||||
|
Far::ConstPatchParamArray patchParams =
|
||||||
|
farPatchTables->GetPatchParams(j);
|
||||||
|
for (int k = 0; k < patchParams.size(); ++k) {
|
||||||
|
float sharpness = 0.0;
|
||||||
|
ppBuffer.push_back(patchParams[k].faceIndex);
|
||||||
|
ppBuffer.push_back(patchParams[k].bitField.field);
|
||||||
|
ppBuffer.push_back(*((unsigned int *)&sharpness));
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
// XXX: workaround. GetPatchParamTable() will be deprecated though.
|
||||||
|
Far::PatchParamTable const & patchParamTables =
|
||||||
|
farPatchTables->GetPatchParamTable();
|
||||||
|
std::vector<Far::Index> const &sharpnessIndexTable =
|
||||||
|
farPatchTables->GetSharpnessIndexTable();
|
||||||
|
int numPatches = farPatchTables->GetNumPatches(j);
|
||||||
|
for (int k = 0; k < numPatches; ++k) {
|
||||||
|
float sharpness = 0.0;
|
||||||
|
int patchIndex = (int)ppBuffer.size()/3;
|
||||||
|
if (patchIndex < (int)sharpnessIndexTable.size()) {
|
||||||
|
int sharpnessIndex = sharpnessIndexTable[patchIndex];
|
||||||
|
if (sharpnessIndex >= 0)
|
||||||
|
sharpness = farPatchTables->GetSharpnessValues()[sharpnessIndex];
|
||||||
|
}
|
||||||
|
ppBuffer.push_back(patchParamTables[patchIndex].faceIndex);
|
||||||
|
ppBuffer.push_back(patchParamTables[patchIndex].bitField.field);
|
||||||
|
ppBuffer.push_back(*((unsigned int *)&sharpness));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER,
|
||||||
|
(int)buffer.size()*sizeof(int), &buffer[0], GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
// patchParam is currently expected to be texture (it can be SSBO)
|
||||||
|
GLuint texBuffer = 0;
|
||||||
|
glGenBuffers(1, &texBuffer);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, texBuffer);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, ppBuffer.size()*sizeof(unsigned int),
|
||||||
|
&ppBuffer[0], GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
glGenTextures(1, &_patchParamTexture);
|
||||||
|
glBindTexture(GL_TEXTURE_BUFFER, _patchParamTexture);
|
||||||
|
glTexBuffer(GL_TEXTURE_BUFFER, GL_RGB32I, texBuffer);
|
||||||
|
glBindTexture(GL_TEXTURE_BUFFER, 0);
|
||||||
|
|
||||||
|
glDeleteBuffers(1, &texBuffer);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // end namespace Osd
|
||||||
|
|
||||||
|
} // end namespace OPENSUBDIV_VERSION
|
||||||
|
} // end namespace OpenSubdiv
|
||||||
|
|
112
opensubdiv/osd/glPatchTable.h
Normal file
112
opensubdiv/osd/glPatchTable.h
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
//
|
||||||
|
// Copyright 2015 Pixar
|
||||||
|
//
|
||||||
|
// 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:
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
// You may obtain a copy of the Apache License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef OPENSUBDIV3_OSD_GL_PATCH_TABLE_H
|
||||||
|
#define OPENSUBDIV3_OSD_GL_PATCH_TABLE_H
|
||||||
|
|
||||||
|
#include "../version.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include "../far/patchDescriptor.h"
|
||||||
|
#include "../osd/nonCopyable.h"
|
||||||
|
#include "../osd/opengl.h"
|
||||||
|
|
||||||
|
namespace OpenSubdiv {
|
||||||
|
namespace OPENSUBDIV_VERSION {
|
||||||
|
|
||||||
|
namespace Far{
|
||||||
|
class PatchTables;
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace Osd {
|
||||||
|
|
||||||
|
class GLPatchTable : private NonCopyable<GLPatchTable> {
|
||||||
|
public:
|
||||||
|
typedef GLuint VertexBufferBinding;
|
||||||
|
|
||||||
|
// XXX: this struct will be further refactored.
|
||||||
|
class PatchArray {
|
||||||
|
public:
|
||||||
|
PatchArray(Far::PatchDescriptor desc, int numPatches,
|
||||||
|
int indexBase, int primitiveIdBase) :
|
||||||
|
desc(desc), numPatches(numPatches), indexBase(indexBase),
|
||||||
|
primitiveIdBase(primitiveIdBase) {}
|
||||||
|
Far::PatchDescriptor const &GetDescriptor() const {
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
int GetNumPatches() const {
|
||||||
|
return numPatches;
|
||||||
|
}
|
||||||
|
int GetIndexBase() const {
|
||||||
|
return indexBase;
|
||||||
|
}
|
||||||
|
int GetPrimitiveIdBase() const {
|
||||||
|
return primitiveIdBase;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
Far::PatchDescriptor desc;
|
||||||
|
int numPatches;
|
||||||
|
int indexBase; // an offset within the index buffer
|
||||||
|
int primitiveIdBase; // an offset within the patch param buffer
|
||||||
|
};
|
||||||
|
typedef std::vector<PatchArray> PatchArrayVector;
|
||||||
|
|
||||||
|
GLPatchTable();
|
||||||
|
~GLPatchTable();
|
||||||
|
|
||||||
|
static GLPatchTable *Create(Far::PatchTables const *farPatchTables,
|
||||||
|
void *deviceContext = NULL);
|
||||||
|
|
||||||
|
PatchArrayVector const &GetPatchArrays() const {
|
||||||
|
return _patchArrays;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the GL index buffer containing the patch control vertices
|
||||||
|
GLuint GetPatchIndexBuffer() const {
|
||||||
|
return _indexBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the GL texture buffer containing the patch parameter
|
||||||
|
GLuint GetPatchParamTextureBuffer() const {
|
||||||
|
return _patchParamTexture;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// allocate buffers from patchTables
|
||||||
|
bool allocate(Far::PatchTables const *farPatchTables);
|
||||||
|
|
||||||
|
PatchArrayVector _patchArrays;
|
||||||
|
GLuint _indexBuffer;
|
||||||
|
GLuint _patchParamTexture;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // end namespace Osd
|
||||||
|
|
||||||
|
} // end namespace OPENSUBDIV_VERSION
|
||||||
|
using namespace OPENSUBDIV_VERSION;
|
||||||
|
|
||||||
|
} // end namespace OpenSubdiv
|
||||||
|
|
||||||
|
#endif // OPENSUBDIV3_OSD_GL_PATCH_TABLE_H
|
@ -127,9 +127,9 @@ int OsdPrimitiveIdBase();
|
|||||||
//
|
//
|
||||||
|
|
||||||
#if defined OSD_PATCH_ENABLE_SINGLE_CREASE
|
#if defined OSD_PATCH_ENABLE_SINGLE_CREASE
|
||||||
Buffer<uint3> OsdPatchParamBuffer : register( t3 );
|
Buffer<uint3> OsdPatchParamBuffer : register( t0 );
|
||||||
#else
|
#else
|
||||||
Buffer<uint2> OsdPatchParamBuffer : register( t3 );
|
Buffer<uint2> OsdPatchParamBuffer : register( t0 );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int OsdGetPatchIndex(int primitiveId)
|
int OsdGetPatchIndex(int primitiveId)
|
||||||
|
@ -64,8 +64,8 @@ float sinfn(uint n, uint j) {
|
|||||||
// Patches.TessVertexGregory
|
// Patches.TessVertexGregory
|
||||||
//----------------------------------------------------------
|
//----------------------------------------------------------
|
||||||
|
|
||||||
Buffer<float> VertexBuffer : register( t0 );
|
Buffer<float> VertexBuffer : register( t2 );
|
||||||
Buffer<int> OsdValenceBuffer : register( t1 );
|
Buffer<int> OsdValenceBuffer : register( t3 );
|
||||||
|
|
||||||
void vs_main_patches( in InputVertex input,
|
void vs_main_patches( in InputVertex input,
|
||||||
uint vID : SV_VertexID,
|
uint vID : SV_VertexID,
|
||||||
@ -260,7 +260,7 @@ void vs_main_patches( in InputVertex input,
|
|||||||
// Patches.HullGregory
|
// Patches.HullGregory
|
||||||
//----------------------------------------------------------
|
//----------------------------------------------------------
|
||||||
|
|
||||||
Buffer<int> OsdQuadOffsetBuffer : register( t2 );
|
Buffer<int> OsdQuadOffsetBuffer : register( t4 );
|
||||||
|
|
||||||
HS_CONSTANT_FUNC_OUT HSConstFunc(
|
HS_CONSTANT_FUNC_OUT HSConstFunc(
|
||||||
InputPatch<GregHullVertex, 4> patch,
|
InputPatch<GregHullVertex, 4> patch,
|
||||||
|
@ -60,11 +60,11 @@ typedef std::bitset<NUM_MESH_BITS> MeshBitset;
|
|||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
template <class DRAW_CONTEXT>
|
template <class PATCH_TABLE>
|
||||||
class MeshInterface {
|
class MeshInterface {
|
||||||
public:
|
public:
|
||||||
typedef DRAW_CONTEXT DrawContext;
|
typedef PATCH_TABLE PatchTable;
|
||||||
typedef typename DrawContext::VertexBufferBinding VertexBufferBinding;
|
typedef typename PatchTable::VertexBufferBinding VertexBufferBinding;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MeshInterface() { }
|
MeshInterface() { }
|
||||||
@ -73,6 +73,8 @@ public:
|
|||||||
|
|
||||||
virtual int GetNumVertices() const = 0;
|
virtual int GetNumVertices() const = 0;
|
||||||
|
|
||||||
|
virtual int GetMaxValence() const = 0;
|
||||||
|
|
||||||
virtual void UpdateVertexBuffer(float const *vertexData,
|
virtual void UpdateVertexBuffer(float const *vertexData,
|
||||||
int startVertex, int numVerts) = 0;
|
int startVertex, int numVerts) = 0;
|
||||||
|
|
||||||
@ -83,15 +85,14 @@ public:
|
|||||||
|
|
||||||
virtual void Synchronize() = 0;
|
virtual void Synchronize() = 0;
|
||||||
|
|
||||||
virtual DrawContext * GetDrawContext() = 0;
|
virtual PatchTable * GetPatchTable() const = 0;
|
||||||
|
|
||||||
|
virtual Far::PatchTables const *GetFarPatchTables() const = 0;
|
||||||
|
|
||||||
virtual VertexBufferBinding BindVertexBuffer() = 0;
|
virtual VertexBufferBinding BindVertexBuffer() = 0;
|
||||||
|
|
||||||
virtual VertexBufferBinding BindVaryingBuffer() = 0;
|
virtual VertexBufferBinding BindVaryingBuffer() = 0;
|
||||||
|
|
||||||
virtual void SetFVarDataChannel(int fvarWidth,
|
|
||||||
std::vector<float> const & fvarData) = 0;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static inline void refineMesh(Far::TopologyRefiner & refiner,
|
static inline void refineMesh(Far::TopologyRefiner & refiner,
|
||||||
int level, bool adaptive,
|
int level, bool adaptive,
|
||||||
@ -232,17 +233,17 @@ static EVALUATOR *GetEvaluator(
|
|||||||
template <typename VERTEX_BUFFER,
|
template <typename VERTEX_BUFFER,
|
||||||
typename STENCIL_TABLES,
|
typename STENCIL_TABLES,
|
||||||
typename EVALUATOR,
|
typename EVALUATOR,
|
||||||
typename DRAW_CONTEXT,
|
typename PATCH_TABLE,
|
||||||
typename DEVICE_CONTEXT = void>
|
typename DEVICE_CONTEXT = void>
|
||||||
class Mesh : public MeshInterface<DRAW_CONTEXT> {
|
class Mesh : public MeshInterface<PATCH_TABLE> {
|
||||||
public:
|
public:
|
||||||
typedef VERTEX_BUFFER VertexBuffer;
|
typedef VERTEX_BUFFER VertexBuffer;
|
||||||
typedef EVALUATOR Evaluator;
|
typedef EVALUATOR Evaluator;
|
||||||
typedef STENCIL_TABLES StencilTables;
|
typedef STENCIL_TABLES StencilTables;
|
||||||
typedef DRAW_CONTEXT DrawContext;
|
typedef PATCH_TABLE PatchTable;
|
||||||
typedef DEVICE_CONTEXT DeviceContext;
|
typedef DEVICE_CONTEXT DeviceContext;
|
||||||
typedef EvaluatorCacheT<Evaluator> EvaluatorCache;
|
typedef EvaluatorCacheT<Evaluator> EvaluatorCache;
|
||||||
typedef typename DrawContext::VertexBufferBinding VertexBufferBinding;
|
typedef typename PatchTable::VertexBufferBinding VertexBufferBinding;
|
||||||
|
|
||||||
Mesh(Far::TopologyRefiner * refiner,
|
Mesh(Far::TopologyRefiner * refiner,
|
||||||
int numVertexElements,
|
int numVertexElements,
|
||||||
@ -253,19 +254,20 @@ public:
|
|||||||
DeviceContext * deviceContext = NULL) :
|
DeviceContext * deviceContext = NULL) :
|
||||||
|
|
||||||
_refiner(refiner),
|
_refiner(refiner),
|
||||||
_patchTables(NULL),
|
_farPatchTables(NULL),
|
||||||
_numVertices(0),
|
_numVertices(0),
|
||||||
|
_maxValence(0),
|
||||||
_vertexBuffer(NULL),
|
_vertexBuffer(NULL),
|
||||||
_varyingBuffer(NULL),
|
_varyingBuffer(NULL),
|
||||||
_vertexStencilTables(NULL),
|
_vertexStencilTables(NULL),
|
||||||
_varyingStencilTables(NULL),
|
_varyingStencilTables(NULL),
|
||||||
_evaluatorCache(evaluatorCache),
|
_evaluatorCache(evaluatorCache),
|
||||||
_drawContext(NULL),
|
_patchTable(NULL),
|
||||||
_deviceContext(deviceContext) {
|
_deviceContext(deviceContext) {
|
||||||
|
|
||||||
assert(_refiner);
|
assert(_refiner);
|
||||||
|
|
||||||
MeshInterface<DRAW_CONTEXT>::refineMesh(
|
MeshInterface<PATCH_TABLE>::refineMesh(
|
||||||
*_refiner, level,
|
*_refiner, level,
|
||||||
bits.test(MeshAdaptive),
|
bits.test(MeshAdaptive),
|
||||||
bits.test(MeshUseSingleCreasePatch));
|
bits.test(MeshUseSingleCreasePatch));
|
||||||
@ -296,21 +298,16 @@ public:
|
|||||||
numVaryingElements,
|
numVaryingElements,
|
||||||
varyingBufferStride);
|
varyingBufferStride);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// will retire
|
|
||||||
_drawContext->UpdateVertexTexture(_vertexBuffer, _deviceContext);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~Mesh() {
|
virtual ~Mesh() {
|
||||||
delete _refiner;
|
delete _refiner;
|
||||||
delete _patchTables;
|
delete _farPatchTables;
|
||||||
delete _vertexBuffer;
|
delete _vertexBuffer;
|
||||||
delete _varyingBuffer;
|
delete _varyingBuffer;
|
||||||
delete _vertexStencilTables;
|
delete _vertexStencilTables;
|
||||||
delete _varyingStencilTables;
|
delete _varyingStencilTables;
|
||||||
delete _drawContext;
|
delete _patchTable;
|
||||||
// deviceContext and evaluatorCache are not owned by this class.
|
// deviceContext and evaluatorCache are not owned by this class.
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -373,23 +370,18 @@ public:
|
|||||||
Evaluator::Synchronize(_deviceContext);
|
Evaluator::Synchronize(_deviceContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual DrawContext * GetDrawContext() {
|
virtual PatchTable * GetPatchTable() const {
|
||||||
return _drawContext;
|
return _patchTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void SetFVarDataChannel(int fvarWidth,
|
virtual Far::PatchTables const *GetFarPatchTables() const {
|
||||||
std::vector<float> const & fvarData) {
|
return _farPatchTables;
|
||||||
if (_patchTables and
|
|
||||||
_drawContext and
|
|
||||||
fvarWidth and
|
|
||||||
(not fvarData.empty())) {
|
|
||||||
_drawContext->SetFVarDataTexture(*_patchTables, fvarWidth, fvarData,
|
|
||||||
_deviceContext);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int GetNumVertices() const { return _numVertices; }
|
virtual int GetNumVertices() const { return _numVertices; }
|
||||||
|
|
||||||
|
virtual int GetMaxValence() const { return _maxValence; }
|
||||||
|
|
||||||
virtual VertexBufferBinding BindVertexBuffer() {
|
virtual VertexBufferBinding BindVertexBuffer() {
|
||||||
return _vertexBuffer->BindVBO(_deviceContext);
|
return _vertexBuffer->BindVBO(_deviceContext);
|
||||||
}
|
}
|
||||||
@ -457,16 +449,16 @@ private:
|
|||||||
Far::PatchTablesFactory::Options::ENDCAP_LEGACY_GREGORY);
|
Far::PatchTablesFactory::Options::ENDCAP_LEGACY_GREGORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
_patchTables = Far::PatchTablesFactory::Create(*_refiner, poptions);
|
_farPatchTables = Far::PatchTablesFactory::Create(*_refiner, poptions);
|
||||||
|
|
||||||
// if there's endcap stencils, merge it into regular stencils.
|
// if there's endcap stencils, merge it into regular stencils.
|
||||||
if (_patchTables->GetEndCapVertexStencilTables()) {
|
if (_farPatchTables->GetEndCapVertexStencilTables()) {
|
||||||
// append stencils
|
// append stencils
|
||||||
if (Far::StencilTables const *vertexStencilsWithEndCap =
|
if (Far::StencilTables const *vertexStencilsWithEndCap =
|
||||||
Far::StencilTablesFactory::AppendEndCapStencilTables(
|
Far::StencilTablesFactory::AppendEndCapStencilTables(
|
||||||
*_refiner,
|
*_refiner,
|
||||||
vertexStencils,
|
vertexStencils,
|
||||||
_patchTables->GetEndCapVertexStencilTables())) {
|
_farPatchTables->GetEndCapVertexStencilTables())) {
|
||||||
delete vertexStencils;
|
delete vertexStencils;
|
||||||
vertexStencils = vertexStencilsWithEndCap;
|
vertexStencils = vertexStencilsWithEndCap;
|
||||||
}
|
}
|
||||||
@ -475,14 +467,15 @@ private:
|
|||||||
Far::StencilTablesFactory::AppendEndCapStencilTables(
|
Far::StencilTablesFactory::AppendEndCapStencilTables(
|
||||||
*_refiner,
|
*_refiner,
|
||||||
varyingStencils,
|
varyingStencils,
|
||||||
_patchTables->GetEndCapVaryingStencilTables())) {
|
_farPatchTables->GetEndCapVaryingStencilTables())) {
|
||||||
delete varyingStencils;
|
delete varyingStencils;
|
||||||
varyingStencils = varyingStencilsWithEndCap;
|
varyingStencils = varyingStencilsWithEndCap;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_drawContext = DrawContext::Create(_patchTables, _deviceContext);
|
_maxValence = _farPatchTables->GetMaxValence();
|
||||||
|
_patchTable = PatchTable::Create(_farPatchTables, _deviceContext);
|
||||||
|
|
||||||
// numvertices = coarse verts + refined verts + gregory basis verts
|
// numvertices = coarse verts + refined verts + gregory basis verts
|
||||||
_numVertices = vertexStencils->GetNumControlVertices()
|
_numVertices = vertexStencils->GetNumControlVertices()
|
||||||
@ -517,9 +510,10 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
Far::TopologyRefiner * _refiner;
|
Far::TopologyRefiner * _refiner;
|
||||||
Far::PatchTables * _patchTables;
|
Far::PatchTables * _farPatchTables;
|
||||||
|
|
||||||
int _numVertices;
|
int _numVertices;
|
||||||
|
int _maxValence;
|
||||||
|
|
||||||
VertexBuffer * _vertexBuffer;
|
VertexBuffer * _vertexBuffer;
|
||||||
VertexBuffer * _varyingBuffer;
|
VertexBuffer * _varyingBuffer;
|
||||||
@ -531,7 +525,7 @@ private:
|
|||||||
StencilTables const * _varyingStencilTables;
|
StencilTables const * _varyingStencilTables;
|
||||||
EvaluatorCache * _evaluatorCache;
|
EvaluatorCache * _evaluatorCache;
|
||||||
|
|
||||||
DrawContext *_drawContext;
|
PatchTable *_patchTable;
|
||||||
DeviceContext *_deviceContext;
|
DeviceContext *_deviceContext;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user