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 <algorithm>
|
||||
|
||||
#define OPT_E0_IT_VEC4
|
||||
#define OPT_E0_S_VEC2
|
||||
//#define OPT_E0_IT_VEC4
|
||||
//#define OPT_E0_S_VEC2
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define snprintf _snprintf
|
||||
@ -290,6 +290,36 @@ OsdGlslKernelDispatcher::unbindTextureBuffer(int unit) const {
|
||||
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
|
||||
OsdGlslKernelDispatcher::ApplyCatmarkFaceVerticesKernel(
|
||||
FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const {
|
||||
@ -300,6 +330,8 @@ OsdGlslKernelDispatcher::ApplyCatmarkFaceVerticesKernel(
|
||||
offset, start, end);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
OsdGlslKernelDispatcher::ApplyCatmarkEdgeVerticesKernel(
|
||||
FarMesh<OsdVertex> * mesh, int offset, int level, int start, int end, void * data) const {
|
||||
@ -331,6 +363,8 @@ OsdGlslKernelDispatcher::ApplyCatmarkVertexVerticesKernelA(
|
||||
offset, pass, start, end);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
OsdGlslKernelDispatcher::ApplyLoopEdgeVerticesKernel(
|
||||
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");
|
||||
_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");
|
||||
_subComputeVertexB = glGetSubroutineIndex(_program, GL_VERTEX_SHADER, "catmarkComputeVertexB");
|
||||
_subComputeCatmarkVertexB = glGetSubroutineIndex(_program, GL_VERTEX_SHADER, "catmarkComputeVertexB");
|
||||
_subComputeLoopVertexB = glGetSubroutineIndex(_program, GL_VERTEX_SHADER, "loopComputeVertexB");
|
||||
|
||||
_uniformVertexPass = glGetUniformLocation(_program, "vertexPass");
|
||||
@ -510,6 +546,39 @@ OsdGlslKernelDispatcher::ComputeShader::transformGpuBufferData(OsdGpuVertexBuffe
|
||||
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
|
||||
OsdGlslKernelDispatcher::ComputeShader::ApplyCatmarkFaceVerticesKernel(
|
||||
OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying,
|
||||
@ -537,7 +606,7 @@ OsdGlslKernelDispatcher::ComputeShader::ApplyCatmarkVertexVerticesKernelB(
|
||||
OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying,
|
||||
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_ITa], V_ITa_ofs);
|
||||
glUniform1i(_tableOffsetUniforms[V_W], V_W_ofs);
|
||||
|
@ -70,6 +70,12 @@ public:
|
||||
|
||||
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;
|
||||
|
||||
@ -123,27 +129,34 @@ protected:
|
||||
GLuint GetVertexUniform() const { return _vertexUniform; }
|
||||
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,
|
||||
int V_IT_ofs, int V_ITa_ofs, int V_W_ofs, int offset, int start, int end);
|
||||
void ApplyBilinearFaceVerticesKernel(OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying, int F_IT_ofs, int F_ITa_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,
|
||||
int E_IT_ofs, int E_W_ofs, int offset, int start, int end);
|
||||
void ApplyLoopEdgeVerticesKernel(OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying, int E_IT_ofs, int E_W_ofs, int offset, int start, int end);
|
||||
|
||||
void ApplyLoopVertexVerticesKernelB(OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying,
|
||||
int V_IT_ofs, int V_ITa_ofs, int V_W_ofs, int offset, int start, int end);
|
||||
void ApplyLoopVertexVerticesKernelB(OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying, int V_IT_ofs, int V_ITa_ofs, int V_W_ofs, int offset, int start, int end);
|
||||
|
||||
void ApplyLoopVertexVerticesKernelA(OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying,
|
||||
int V_ITa_ofs, int V_W_ofs, int offset, bool pass, int start, int end);
|
||||
void ApplyLoopVertexVerticesKernelA(OsdGpuVertexBuffer *vertex, OsdGpuVertexBuffer *varying, int V_ITa_ofs, int V_W_ofs, int offset, bool pass, int start, int end);
|
||||
|
||||
|
||||
|
||||
void UseProgram () const {
|
||||
glUseProgram(_program);
|
||||
}
|
||||
@ -180,8 +193,13 @@ protected:
|
||||
_varyingUniform;
|
||||
|
||||
// shader locations
|
||||
GLuint _subComputeFace, _subComputeEdge, _subComputeVertexA, _subComputeVertexB;
|
||||
GLuint _subComputeLoopVertexB;
|
||||
GLuint _subComputeFace, // general face-vertex kernel (all schemes)
|
||||
_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> _tableOffsetUniforms;
|
||||
|
@ -234,6 +234,49 @@ void catmarkComputeEdge()
|
||||
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
|
||||
subroutine(computeKernelType)
|
||||
void catmarkComputeVertexA()
|
||||
|
Loading…
Reference in New Issue
Block a user