mirror of
https://github.com/PixarAnimationStudios/OpenSubdiv
synced 2024-09-19 22:30:05 +00:00
parent
eb26c65a88
commit
54c2345647
@ -64,8 +64,8 @@
|
|||||||
#include <functional>
|
#include <functional>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
#define OPT_E0_IT_VEC4
|
//#define OPT_E0_IT_VEC4
|
||||||
#define OPT_E0_S_VEC2
|
//#define OPT_E0_S_VEC2
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#define snprintf _snprintf
|
#define snprintf _snprintf
|
||||||
@ -290,6 +290,36 @@ OsdGlslKernelDispatcher::unbindTextureBuffer(int unit) const {
|
|||||||
glBindTexture(GL_TEXTURE_BUFFER, 0);
|
glBindTexture(GL_TEXTURE_BUFFER, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
OsdGlslKernelDispatcher::ApplyBilinearFaceVerticesKernel(
|
||||||
|
FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const {
|
||||||
|
|
||||||
|
_shader->ApplyBilinearFaceVerticesKernel(_currentVertexBuffer, _currentVaryingBuffer,
|
||||||
|
_tableOffsets[F_IT][level-1],
|
||||||
|
_tableOffsets[F_ITa][level-1],
|
||||||
|
offset, start, end);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
OsdGlslKernelDispatcher::ApplyBilinearEdgeVerticesKernel(
|
||||||
|
FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const {
|
||||||
|
|
||||||
|
_shader->ApplyBilinearEdgeVerticesKernel(_currentVertexBuffer, _currentVaryingBuffer,
|
||||||
|
_tableOffsets[E_IT][level-1],
|
||||||
|
offset, start, end);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
OsdGlslKernelDispatcher::ApplyBilinearVertexVerticesKernel(
|
||||||
|
FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const {
|
||||||
|
|
||||||
|
_shader->ApplyBilinearVertexVerticesKernel(_currentVertexBuffer, _currentVaryingBuffer,
|
||||||
|
_tableOffsets[V_ITa][level-1],
|
||||||
|
offset, start, end);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
OsdGlslKernelDispatcher::ApplyCatmarkFaceVerticesKernel(
|
OsdGlslKernelDispatcher::ApplyCatmarkFaceVerticesKernel(
|
||||||
FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const {
|
FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const {
|
||||||
@ -300,6 +330,8 @@ OsdGlslKernelDispatcher::ApplyCatmarkFaceVerticesKernel(
|
|||||||
offset, start, end);
|
offset, start, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
OsdGlslKernelDispatcher::ApplyCatmarkEdgeVerticesKernel(
|
OsdGlslKernelDispatcher::ApplyCatmarkEdgeVerticesKernel(
|
||||||
FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const {
|
FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const {
|
||||||
@ -331,6 +363,8 @@ OsdGlslKernelDispatcher::ApplyCatmarkVertexVerticesKernelA(
|
|||||||
offset, pass, start, end);
|
offset, pass, start, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
OsdGlslKernelDispatcher::ApplyLoopEdgeVerticesKernel(
|
OsdGlslKernelDispatcher::ApplyLoopEdgeVerticesKernel(
|
||||||
FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const {
|
FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const {
|
||||||
@ -437,8 +471,10 @@ OsdGlslKernelDispatcher::ComputeShader::Compile(int numVertexElements, int numVa
|
|||||||
|
|
||||||
_subComputeFace = glGetSubroutineIndex(_program, GL_VERTEX_SHADER, "catmarkComputeFace");
|
_subComputeFace = glGetSubroutineIndex(_program, GL_VERTEX_SHADER, "catmarkComputeFace");
|
||||||
_subComputeEdge = glGetSubroutineIndex(_program, GL_VERTEX_SHADER, "catmarkComputeEdge");
|
_subComputeEdge = glGetSubroutineIndex(_program, GL_VERTEX_SHADER, "catmarkComputeEdge");
|
||||||
|
_subComputeBilinearEdge = glGetSubroutineIndex(_program, GL_VERTEX_SHADER, "bilinearComputeEdge");
|
||||||
|
_subComputeVertex = glGetSubroutineIndex(_program, GL_VERTEX_SHADER, "bilinearComputeVertex");
|
||||||
_subComputeVertexA = glGetSubroutineIndex(_program, GL_VERTEX_SHADER, "catmarkComputeVertexA");
|
_subComputeVertexA = glGetSubroutineIndex(_program, GL_VERTEX_SHADER, "catmarkComputeVertexA");
|
||||||
_subComputeVertexB = glGetSubroutineIndex(_program, GL_VERTEX_SHADER, "catmarkComputeVertexB");
|
_subComputeCatmarkVertexB = glGetSubroutineIndex(_program, GL_VERTEX_SHADER, "catmarkComputeVertexB");
|
||||||
_subComputeLoopVertexB = glGetSubroutineIndex(_program, GL_VERTEX_SHADER, "loopComputeVertexB");
|
_subComputeLoopVertexB = glGetSubroutineIndex(_program, GL_VERTEX_SHADER, "loopComputeVertexB");
|
||||||
|
|
||||||
_uniformVertexPass = glGetUniformLocation(_program, "vertexPass");
|
_uniformVertexPass = glGetUniformLocation(_program, "vertexPass");
|
||||||
@ -510,6 +546,39 @@ OsdGlslKernelDispatcher::ComputeShader::transformGpuBufferData(OsdGpuVertexBuffe
|
|||||||
glDeleteSync(sync);
|
glDeleteSync(sync);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
OsdGlslKernelDispatcher::ComputeShader::ApplyBilinearFaceVerticesKernel(
|
||||||
|
OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying,
|
||||||
|
int F_IT_ofs, int F_ITa_ofs, int offset, int start, int end) {
|
||||||
|
|
||||||
|
glUniformSubroutinesuiv(GL_VERTEX_SHADER, 1, &_subComputeFace);
|
||||||
|
glUniform1i(_tableOffsetUniforms[F_IT], F_IT_ofs);
|
||||||
|
glUniform1i(_tableOffsetUniforms[F_ITa], F_ITa_ofs);
|
||||||
|
transformGpuBufferData(vertex, varying, offset, start, end);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
OsdGlslKernelDispatcher::ComputeShader::ApplyBilinearEdgeVerticesKernel(
|
||||||
|
OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying,
|
||||||
|
int E_IT_ofs, int offset, int start, int end) {
|
||||||
|
|
||||||
|
glUniformSubroutinesuiv(GL_VERTEX_SHADER, 1, &_subComputeBilinearEdge);
|
||||||
|
glUniform1i(_tableOffsetUniforms[E_IT], E_IT_ofs);
|
||||||
|
transformGpuBufferData(vertex, varying, offset, start, end);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
OsdGlslKernelDispatcher::ComputeShader::ApplyBilinearVertexVerticesKernel(
|
||||||
|
OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying,
|
||||||
|
int V_ITa_ofs, int offset, int start, int end) {
|
||||||
|
|
||||||
|
glUniformSubroutinesuiv(GL_VERTEX_SHADER, 1, &_subComputeVertex);
|
||||||
|
glUniform1i(_tableOffsetUniforms[V_ITa], V_ITa_ofs);
|
||||||
|
transformGpuBufferData(vertex, varying, offset, start, end);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
OsdGlslKernelDispatcher::ComputeShader::ApplyCatmarkFaceVerticesKernel(
|
OsdGlslKernelDispatcher::ComputeShader::ApplyCatmarkFaceVerticesKernel(
|
||||||
OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying,
|
OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying,
|
||||||
@ -537,7 +606,7 @@ OsdGlslKernelDispatcher::ComputeShader::ApplyCatmarkVertexVerticesKernelB(
|
|||||||
OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying,
|
OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying,
|
||||||
int V_IT_ofs, int V_ITa_ofs, int V_W_ofs, int offset, int start, int end) {
|
int V_IT_ofs, int V_ITa_ofs, int V_W_ofs, int offset, int start, int end) {
|
||||||
|
|
||||||
glUniformSubroutinesuiv(GL_VERTEX_SHADER, 1, &_subComputeVertexB);
|
glUniformSubroutinesuiv(GL_VERTEX_SHADER, 1, &_subComputeCatmarkVertexB);
|
||||||
glUniform1i(_tableOffsetUniforms[V_IT], V_IT_ofs);
|
glUniform1i(_tableOffsetUniforms[V_IT], V_IT_ofs);
|
||||||
glUniform1i(_tableOffsetUniforms[V_ITa], V_ITa_ofs);
|
glUniform1i(_tableOffsetUniforms[V_ITa], V_ITa_ofs);
|
||||||
glUniform1i(_tableOffsetUniforms[V_W], V_W_ofs);
|
glUniform1i(_tableOffsetUniforms[V_W], V_W_ofs);
|
||||||
|
@ -70,6 +70,12 @@ public:
|
|||||||
|
|
||||||
virtual ~OsdGlslKernelDispatcher();
|
virtual ~OsdGlslKernelDispatcher();
|
||||||
|
|
||||||
|
virtual void ApplyBilinearFaceVerticesKernel(FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const;
|
||||||
|
|
||||||
|
virtual void ApplyBilinearEdgeVerticesKernel(FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const;
|
||||||
|
|
||||||
|
virtual void ApplyBilinearVertexVerticesKernel(FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const;
|
||||||
|
|
||||||
|
|
||||||
virtual void ApplyCatmarkFaceVerticesKernel(FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const;
|
virtual void ApplyCatmarkFaceVerticesKernel(FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const;
|
||||||
|
|
||||||
@ -123,27 +129,34 @@ protected:
|
|||||||
GLuint GetVertexUniform() const { return _vertexUniform; }
|
GLuint GetVertexUniform() const { return _vertexUniform; }
|
||||||
GLuint GetVaryingUniform() const { return _varyingUniform; }
|
GLuint GetVaryingUniform() const { return _varyingUniform; }
|
||||||
|
|
||||||
void ApplyCatmarkFaceVerticesKernel(OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying,
|
|
||||||
int F_IT_ofs, int F_ITa_ofs, int offset, int start, int end);
|
|
||||||
|
|
||||||
void ApplyCatmarkEdgeVerticesKernel(OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying,
|
|
||||||
int E_IT_ofs, int E_W_ofs, int offset, int start, int end);
|
|
||||||
|
|
||||||
void ApplyCatmarkVertexVerticesKernelB(OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying,
|
void ApplyBilinearFaceVerticesKernel(OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying, int F_IT_ofs, int F_ITa_ofs, int offset, int start, int end);
|
||||||
int V_IT_ofs, int V_ITa_ofs, int V_W_ofs, int offset, int start, int end);
|
|
||||||
|
void ApplyBilinearEdgeVerticesKernel(OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying, int E_IT_ofs, int offset, int start, int end);
|
||||||
|
|
||||||
|
void ApplyBilinearVertexVerticesKernel(OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying, int V_ITa_ofs, int offset, int start, int end);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void ApplyCatmarkFaceVerticesKernel(OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying, int F_IT_ofs, int F_ITa_ofs, int offset, int start, int end);
|
||||||
|
|
||||||
|
void ApplyCatmarkEdgeVerticesKernel(OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying, int E_IT_ofs, int E_W_ofs, int offset, int start, int end);
|
||||||
|
|
||||||
|
void ApplyCatmarkVertexVerticesKernelB(OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying, int V_IT_ofs, int V_ITa_ofs, int V_W_ofs, int offset, int start, int end);
|
||||||
|
|
||||||
|
void ApplyCatmarkVertexVerticesKernelA(OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying, int V_ITa_ofs, int V_W_ofs, int offset, bool pass, int start, int end);
|
||||||
|
|
||||||
|
|
||||||
void ApplyCatmarkVertexVerticesKernelA(OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying,
|
|
||||||
int V_ITa_ofs, int V_W_ofs, int offset, bool pass, int start, int end);
|
|
||||||
|
|
||||||
void ApplyLoopEdgeVerticesKernel(OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying,
|
void ApplyLoopEdgeVerticesKernel(OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying, int E_IT_ofs, int E_W_ofs, int offset, int start, int end);
|
||||||
int E_IT_ofs, int E_W_ofs, int offset, int start, int end);
|
|
||||||
|
|
||||||
void ApplyLoopVertexVerticesKernelB(OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying,
|
void ApplyLoopVertexVerticesKernelB(OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying, int V_IT_ofs, int V_ITa_ofs, int V_W_ofs, int offset, int start, int end);
|
||||||
int V_IT_ofs, int V_ITa_ofs, int V_W_ofs, int offset, int start, int end);
|
|
||||||
|
|
||||||
void ApplyLoopVertexVerticesKernelA(OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying,
|
void ApplyLoopVertexVerticesKernelA(OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying, int V_ITa_ofs, int V_W_ofs, int offset, bool pass, int start, int end);
|
||||||
int V_ITa_ofs, int V_W_ofs, int offset, bool pass, int start, int end);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void UseProgram () const {
|
void UseProgram () const {
|
||||||
glUseProgram(_program);
|
glUseProgram(_program);
|
||||||
}
|
}
|
||||||
@ -180,8 +193,13 @@ protected:
|
|||||||
_varyingUniform;
|
_varyingUniform;
|
||||||
|
|
||||||
// shader locations
|
// shader locations
|
||||||
GLuint _subComputeFace, _subComputeEdge, _subComputeVertexA, _subComputeVertexB;
|
GLuint _subComputeFace, // general face-vertex kernel (all schemes)
|
||||||
GLuint _subComputeLoopVertexB;
|
_subComputeEdge, // edge-vertex kernel (catmark + loop schemes)
|
||||||
|
_subComputeBilinearEdge, // edge-vertex kernel (bilinear scheme)
|
||||||
|
_subComputeVertex, // vertex-vertex kernel (bilinear scheme)
|
||||||
|
_subComputeVertexA, // vertex-vertex kernel A (catmark + loop schemes)
|
||||||
|
_subComputeCatmarkVertexB, // vertex-vertex kernel B (catmark scheme)
|
||||||
|
_subComputeLoopVertexB; // vertex-vertex kernel B (loop scheme)
|
||||||
|
|
||||||
std::vector<GLuint> _tableUniforms;
|
std::vector<GLuint> _tableUniforms;
|
||||||
std::vector<GLuint> _tableOffsetUniforms;
|
std::vector<GLuint> _tableOffsetUniforms;
|
||||||
|
@ -234,6 +234,49 @@ void catmarkComputeEdge()
|
|||||||
writeVertex(dst);
|
writeVertex(dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Edge-vertices compute Kernel (bilinear scheme)
|
||||||
|
subroutine(computeKernelType)
|
||||||
|
void bilinearComputeEdge()
|
||||||
|
{
|
||||||
|
int i = gl_VertexID + indexStart;
|
||||||
|
|
||||||
|
Vertex dst;
|
||||||
|
clear(dst);
|
||||||
|
|
||||||
|
#ifdef OPT_E0_IT_VEC4
|
||||||
|
ivec2 eidx = texelFetch(_E0_IT, E_IT_ofs/2+i).xy;
|
||||||
|
#else
|
||||||
|
ivec2 eidx = ivec2(texelFetch(_E0_IT, E_IT_ofs+2*i+0).x,
|
||||||
|
texelFetch(_E0_IT, E_IT_ofs+2*i+1).x);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
addWithWeight(dst, readVertex(eidx.x), 0.5f);
|
||||||
|
addWithWeight(dst, readVertex(eidx.y), 0.5f);
|
||||||
|
|
||||||
|
addVaryingWithWeight(dst, readVertex(eidx.x), 0.5f);
|
||||||
|
addVaryingWithWeight(dst, readVertex(eidx.y), 0.5f);
|
||||||
|
|
||||||
|
writeVertex(dst);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vertex-vertices compute Kernel (bilinear scheme)
|
||||||
|
subroutine(computeKernelType)
|
||||||
|
void bilinearComputeVertex()
|
||||||
|
{
|
||||||
|
int i = gl_VertexID + indexStart;
|
||||||
|
|
||||||
|
Vertex dst;
|
||||||
|
clear(dst);
|
||||||
|
|
||||||
|
int p = texelFetch(_V0_ITa, V_ITa_ofs+i).x;
|
||||||
|
|
||||||
|
addWithWeight(dst, readVertex(p), 1.0f);
|
||||||
|
|
||||||
|
addVaryingWithWeight(dst, readVertex(p), 1.0f);
|
||||||
|
|
||||||
|
writeVertex(dst);
|
||||||
|
}
|
||||||
|
|
||||||
// Vertex-vertices compute Kernels 'A' / k_Crease and k_Corner rules
|
// Vertex-vertices compute Kernels 'A' / k_Crease and k_Corner rules
|
||||||
subroutine(computeKernelType)
|
subroutine(computeKernelType)
|
||||||
void catmarkComputeVertexA()
|
void catmarkComputeVertexA()
|
||||||
|
Loading…
Reference in New Issue
Block a user