Adding GLSL compute kernels for bilinear scheme

Closes #19.
This commit is contained in:
manuelk 2012-06-19 18:57:43 -07:00
parent eb26c65a88
commit 54c2345647
3 changed files with 150 additions and 20 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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()