Переглянути джерело

Fix incorrect Uniform Buffer bindings

tobspr 10 роки тому
батько
коміт
289c92cd38

+ 1 - 1
panda/src/glstuff/glGraphicsStateGuardian_src.cxx

@@ -5263,7 +5263,7 @@ get_uniform_buffer(const GeomVertexArrayFormat *layout) {
 //               rendering.
 ////////////////////////////////////////////////////////////////////
 bool CLP(GraphicsStateGuardian)::
-apply_uniform_buffer(int index, CLP(UniformBufferContext) *gubc,
+apply_uniform_buffer(GLuint index, CLP(UniformBufferContext) *gubc,
                      const ShaderAttrib *attrib) {
   nassertr(_supports_uniform_buffers, false);
 

+ 1 - 1
panda/src/glstuff/glGraphicsStateGuardian_src.h

@@ -305,7 +305,7 @@ public:
 
 #ifndef OPENGLES
   PT(CLP(UniformBufferContext)) get_uniform_buffer(const GeomVertexArrayFormat *layout);
-  bool apply_uniform_buffer(int index, CLP(UniformBufferContext) *gubc,
+  bool apply_uniform_buffer(GLuint index, CLP(UniformBufferContext) *gubc,
                             const ShaderAttrib *attrib);
 #endif
 

+ 5 - 2
panda/src/glstuff/glShaderContext_src.cxx

@@ -522,8 +522,10 @@ void CLP(ShaderContext)::
 reflect_uniform_block(int i, const char *name, char *name_buffer, GLsizei name_buflen) {
   GLint data_size = 0;
   GLint param_count = 0;
+  GLint binding_index = 0;
   _glgsg->_glGetActiveUniformBlockiv(_glsl_program, i, GL_UNIFORM_BLOCK_DATA_SIZE, &data_size);
   _glgsg->_glGetActiveUniformBlockiv(_glsl_program, i, GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, &param_count);
+  _glgsg->_glGetActiveUniformBlockiv(_glsl_program, i, GL_UNIFORM_BLOCK_BINDING, &binding_index);
 
   // We use a GeomVertexArrayFormat to describe the uniform buffer layout.
   GeomVertexArrayFormat *block_format = new GeomVertexArrayFormat;
@@ -651,7 +653,7 @@ reflect_uniform_block(int i, const char *name, char *name_buffer, GLsizei name_b
   }
 
   if (GLCAT.is_debug()) {
-    GLCAT.debug() << "Active uniform block " << name << " has layout:\n";
+    GLCAT.debug() << "Active uniform block " << name << " with index " << binding_index << " has layout:\n";
     block_format->write(GLCAT.debug(false), 2);
   }
 
@@ -660,6 +662,7 @@ reflect_uniform_block(int i, const char *name, char *name_buffer, GLsizei name_b
   UniformBlock block;
   block._name = InternalName::make(name);
   block._buffer = _glgsg->get_uniform_buffer(layout);
+  block._binding_index = binding_index;
 
   nassertv(i == _uniform_blocks.size());
   _uniform_blocks.push_back(block);
@@ -1832,7 +1835,7 @@ issue_parameters(int altered) {
 
     for (int i = 0; i < _uniform_blocks.size(); ++i) {
       UniformBlock &block = _uniform_blocks[i];
-      _glgsg->apply_uniform_buffer(i, block._buffer, attrib);
+      _glgsg->apply_uniform_buffer(block._binding_index, block._buffer, attrib);
     }
   }
 #endif

+ 1 - 0
panda/src/glstuff/glShaderContext_src.h

@@ -98,6 +98,7 @@ private:
   struct UniformBlock {
     CPT(InternalName) _name;
     PT(CLP(UniformBufferContext)) _buffer;
+    GLuint _binding_index;
   };
   typedef pvector<UniformBlock> UniformBlocks;
   UniformBlocks _uniform_blocks;

+ 1 - 0
panda/src/glstuff/glmisc_src.cxx

@@ -333,6 +333,7 @@ void CLP(init_classes)() {
   CLP(OcclusionQueryContext)::init_type();
   CLP(TimerQueryContext)::init_type();
   CLP(LatencyQueryContext)::init_type();
+  CLP(UniformBufferContext)::init_type();
 #endif
 
   PandaSystem *ps = PandaSystem::get_global_ptr();