Load functions from ARB_uniform_buffer_object
authorJuan A. Suarez Romero <jasuarez@igalia.com>
Tue, 7 Nov 2017 12:24:25 +0000 (12:24 +0000)
committerJuan A. Suarez Romero <jasuarez@igalia.com>
Tue, 7 Nov 2017 12:24:25 +0000 (12:24 +0000)
While this extension is part of OpenGL 3.1 and above, it is not part of
OpenGL 3.0.

As we need to run the tests for OpenGL 3.0 too, and we need to use some
functions exposed by this extension, let's load them from the extension
itself, instead of relying in the core functions.

Affects:
* KHR-GL30.transform_feedback.draw_xfb_instanced_test
* KHR-GL30.transform_feedback.draw_xfb_stream_instanced_test

Components: OpenGL

VK-GL-CTS issue: 819

Change-Id: I2cd1652b4c2d3b55e009c44b85b451d207387b96

external/openglcts/modules/gl/gl3cTransformFeedbackTests.cpp
external/openglcts/modules/gl/gl3cTransformFeedbackTests.hpp

index ce0d078..93633f9 100644 (file)
@@ -5723,6 +5723,8 @@ gl3cts::TransformFeedback::DrawXFBInstanced::DrawXFBInstanced(deqp::Context& con
        , m_bo_id_uniform(0)
        , m_fbo_id(0)
        , m_rbo_id(0)
+       , m_glGetUniformBlockIndex(DE_NULL)
+       , m_glUniformBlockBinding(DE_NULL)
 {
 }
 
@@ -5741,6 +5743,20 @@ tcu::TestNode::IterateResult gl3cts::TransformFeedback::DrawXFBInstanced::iterat
        bool is_ok              = true;
        bool test_error = false;
 
+       if (is_arb_ubo)
+       {
+               m_glGetUniformBlockIndex =
+                       (GetUniformBlockIndex_ProcAddress)m_context.getRenderContext().getProcAddress("glGetUniformBlockIndex");
+
+               m_glUniformBlockBinding =
+                       (UniformBlockBinding_ProcAddress)m_context.getRenderContext().getProcAddress("glUniformBlockBinding");
+
+               if (DE_NULL == m_glGetUniformBlockIndex || DE_NULL == m_glUniformBlockBinding)
+               {
+                       throw 0;
+               }
+       }
+
        try
        {
                if (is_at_least_gl_42 || ((is_at_least_gl_31 || is_arb_ubo) && is_arb_tf_instanced))
@@ -5857,7 +5873,7 @@ void gl3cts::TransformFeedback::DrawXFBInstanced::prepareObjects()
        gl.bindBufferBase(GL_UNIFORM_BUFFER, 0, m_bo_id_uniform);
        GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferRange call failed.");
 
-       glw::GLuint uniform_index = gl.getUniformBlockIndex(m_program_id_draw, s_uniform);
+       glw::GLuint uniform_index = m_glGetUniformBlockIndex(m_program_id_draw, s_uniform);
        GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformBlockIndex call failed.");
 
        if (GL_INVALID_INDEX == uniform_index)
@@ -5865,7 +5881,7 @@ void gl3cts::TransformFeedback::DrawXFBInstanced::prepareObjects()
                throw 0;
        }
 
-       gl.uniformBlockBinding(m_program_id_draw, uniform_index, 0);
+       m_glUniformBlockBinding(m_program_id_draw, uniform_index, 0);
        GLU_EXPECT_NO_ERROR(gl.getError(), "glUniformBlockBinding call failed.");
 
        /* Prepare framebuffer. */
@@ -6144,6 +6160,8 @@ gl3cts::TransformFeedback::DrawXFBStreamInstanced::DrawXFBStreamInstanced(deqp::
        , m_bo_id_uniform(0)
        , m_fbo_id(0)
        , m_rbo_id(0)
+       , m_glGetUniformBlockIndex(DE_NULL)
+       , m_glUniformBlockBinding(DE_NULL)
 {
 }
 
@@ -6164,6 +6182,20 @@ tcu::TestNode::IterateResult gl3cts::TransformFeedback::DrawXFBStreamInstanced::
        bool is_ok              = true;
        bool test_error = false;
 
+       if (is_arb_ubo)
+       {
+               m_glGetUniformBlockIndex =
+                       (GetUniformBlockIndex_ProcAddress)m_context.getRenderContext().getProcAddress("glGetUniformBlockIndex");
+
+               m_glUniformBlockBinding =
+                       (UniformBlockBinding_ProcAddress)m_context.getRenderContext().getProcAddress("glUniformBlockBinding");
+
+               if (DE_NULL == m_glGetUniformBlockIndex || DE_NULL == m_glUniformBlockBinding)
+               {
+                       throw 0;
+               }
+       }
+
        /* Test. */
        try
        {
@@ -6295,7 +6327,7 @@ void gl3cts::TransformFeedback::DrawXFBStreamInstanced::prepareObjects()
        gl.bindBufferBase(GL_UNIFORM_BUFFER, 0, m_bo_id_uniform);
        GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferRange call failed.");
 
-       glw::GLuint uniform_index = gl.getUniformBlockIndex(m_program_id_draw, s_uniform);
+       glw::GLuint uniform_index = m_glGetUniformBlockIndex(m_program_id_draw, s_uniform);
        GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformBlockIndex call failed.");
 
        if (GL_INVALID_INDEX == uniform_index)
@@ -6303,7 +6335,7 @@ void gl3cts::TransformFeedback::DrawXFBStreamInstanced::prepareObjects()
                throw 0;
        }
 
-       gl.uniformBlockBinding(m_program_id_draw, uniform_index, 0);
+       m_glUniformBlockBinding(m_program_id_draw, uniform_index, 0);
        GLU_EXPECT_NO_ERROR(gl.getError(), "glUniformBlockBinding call failed.");
 
        /* Prepare framebuffer. */
index 5a43a74..0f5776a 100644 (file)
@@ -1195,6 +1195,14 @@ private:
        void drawInstanced();
        bool check();
        void clean();
+
+       typedef glw::GLuint (*GetUniformBlockIndex_ProcAddress)(glw::GLuint program, const glw::GLchar* uniformBlockName);
+       typedef void        (*UniformBlockBinding_ProcAddress)(glw::GLuint program,
+                                                                                                                  glw::GLuint uniformIndex,
+                                                                                                                  glw::GLuint uniformBlockBinding);
+
+       GetUniformBlockIndex_ProcAddress m_glGetUniformBlockIndex;
+       UniformBlockBinding_ProcAddress  m_glUniformBlockBinding;
 };
 
 /** DrawXFBStreamInstanced
@@ -1271,6 +1279,14 @@ private:
        void drawStreamInstanced();
        bool check();
        void clean();
+
+       typedef glw::GLuint (*GetUniformBlockIndex_ProcAddress)(glw::GLuint program, const glw::GLchar* uniformBlockName);
+       typedef void        (*UniformBlockBinding_ProcAddress)(glw::GLuint program,
+                                                                                                                  glw::GLuint uniformIndex,
+                                                                                                                  glw::GLuint uniformBlockBinding);
+
+       GetUniformBlockIndex_ProcAddress m_glGetUniformBlockIndex;
+       UniformBlockBinding_ProcAddress  m_glUniformBlockBinding;
 };
 
 namespace Utilities