diff --git a/opensubdiv/osd/glslDispatcher.cpp b/opensubdiv/osd/glslDispatcher.cpp index 4cabceed..0cf9dd5f 100644 --- a/opensubdiv/osd/glslDispatcher.cpp +++ b/opensubdiv/osd/glslDispatcher.cpp @@ -64,8 +64,8 @@ #include #include -#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 * 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 * 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 * 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 * 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 * 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 * 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); diff --git a/opensubdiv/osd/glslDispatcher.h b/opensubdiv/osd/glslDispatcher.h index 83a198e9..49663749 100644 --- a/opensubdiv/osd/glslDispatcher.h +++ b/opensubdiv/osd/glslDispatcher.h @@ -70,6 +70,12 @@ public: virtual ~OsdGlslKernelDispatcher(); + virtual void ApplyBilinearFaceVerticesKernel(FarMesh * mesh, int offset, int level, int start, int end, void * data) const; + + virtual void ApplyBilinearEdgeVerticesKernel(FarMesh * mesh, int offset, int level, int start, int end, void * data) const; + + virtual void ApplyBilinearVertexVerticesKernel(FarMesh * mesh, int offset, int level, int start, int end, void * data) const; + virtual void ApplyCatmarkFaceVerticesKernel(FarMesh * 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 _tableUniforms; std::vector _tableOffsetUniforms; diff --git a/opensubdiv/osd/glslKernel.glsl b/opensubdiv/osd/glslKernel.glsl index c3674383..93063870 100644 --- a/opensubdiv/osd/glslKernel.glsl +++ b/opensubdiv/osd/glslKernel.glsl @@ -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()