3 Replies Latest reply on Jan 21, 2015 11:59 PM by jzhou

    Problem with 3D texture generation.

    hilo

      Hi,

       

      I have been working on a small OpenGl demo program on my A8-7600 Kaveri APU, in Qt5.4.

      I would set a huge (1024x1024x1024 = 1Gbyte) byte array (volume) as single channel 3D texture.

      On top of that, I would like to see the free memory after texture allocation.

      Unfortunately the results confuse me, so any advise/explanation is welcome!

       

      Here is the relevant code fragment:


      void Widget::initializeGL()

          if (glewInit() != GLEW_OK) exit( EXIT_FAILURE );

          qDebug() << versionString; qDebug() << rendererString;

          ati_meminfo();

          glGenTextures( 1, &texture);

          glBindTexture(GL_TEXTURE_3D, texture);

          glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP);

          glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP);

          glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP);

          glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

          glTexPaframeteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

          glTexImage3D( GL_TEXTURE_3D, 0, GL_R8UI, 1024, 1024, 1024, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, data );

          HandleGLError();

          ati_meminfo();

      }

      void Widget::HandleGLError()

      {

          GLenum error;

          int i = 1;

          while ((error = glGetError()) != GL_NO_ERROR)

          {

              qDebug("GL ERROR: %i, %s", i , gluErrorString(error));

              ++i;

          }

      }

      void Widget::ati_meminfo()

      {

          GLint param[4] = {-1, -1, -1, -1};

          if ( GL_ATI_meminfo)

          {

           glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, param);

           qDebug("TEXTURE_FREE_MEMORY_ATI");

           qDebug("  Total memory free in the pool: %i Kbyte", param[0]);

           qDebug("  Largest available free block in the pool: %i Kbyte", param[1]);

           qDebug("  Total auxiliary memory free: %i Kbyte", param[2]);

           qDebug("  Largest auxiliary free block: %i Kbyte", param[3]);

           HandleGLError();

          }   

      }


      First case, Ubuntu 14.04:

      Texture allocation is OK I think, because I can render the texture well. No GL error at all. But memory allocation query show NO memory allocation.

      "4.4.13283 Compatibility Profile Context 14.501.1003"

      "AMD Radeon(TM) R7 Graphics   "

      TEXTURE_FREE_MEMORY_ATI     < before texture generation

        Total memory free in the pool: 1882239 Kbyte

        Largest available free block in the pool: 1700688 Kbyte

        Total auxiliary memory free: 1987760 Kbyte

        Largest auxiliary free block: 11612 Kbyte

      TEXTURE_FREE_MEMORY_ATI     < after texture generation

        Total memory free in the pool: 1882239 Kbyte

        Largest available free block in the pool: 1700688 Kbyte

        Total auxiliary memory free: 1987824 Kbyte

        Largest auxiliary free block: 11612 Kbyte

       

      Perhaps this method of memory monitoring is incorrect??

       

      The 2nd case is Windows7, and this is more interesting, because the same code throw errors, and can not build/render the texture..

      "4.4.13283 Compatibility Profile Context 14.501.1003.0"

      "AMD Radeon(TM) R7 Graphics"

      TEXTURE_FREE_MEMORY_ATI

        Total memory free in the pool: 2084864 Kbyte

        Largest available free block in the pool: 1822720 Kbyte

        Total auxiliary memory free: 2096128 Kbyte

        Largest auxiliary free block: 2096128 Kbyte

      GL ERROR: 1, invalid enumerant

      GL ERROR: 1, out of memory

      TEXTURE_FREE_MEMORY_ATI

        Total memory free in the pool: 2084864 Kbyte

        Largest available free block in the pool: 1822720 Kbyte

        Total auxiliary memory free: 2096128 Kbyte

        Largest auxiliary free block: 2096128 Kbyte

      GL ERROR: 1, invalid enumerant

       

      1, Looks like TEXTURE_FREE_MEMORY_ATI tag is invalid, but then I get memory info.

      2, Even if I have more free memory than in Linux case, I can not allocate the texture..

      3, No memory usage as in the Linux case.. Hmm.

       

      Any idea what is behind the win7 failure?

      Thank you for your help in advance!

        • Re: Problem with 3D texture generation.
          jzhou

          I think you need call glFlush() after create texture, i.e.:

          ....

          glTexImage3D( GL_TEXTURE_3D, 0, GL_R8UI, 1024, 1024, 1024, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, data );

          glFlush();

          HandleGLError();

          ati_meminfo();

          ....


          On windows, please make sure there is ATI_meminfo extension firstly. ATI_meminfo is only available on workstation card. I don't think A8-7600 Kaveri APU is a workstation card.

          So you can't use this extension on win7 with your APU.

          1 of 1 people found this helpful
            • Re: Problem with 3D texture generation.
              hilo

              Hi jzhou,

               

              First, thank you for your help!

               

              Unfortunately add a glFlush(); command to the code did not help the situation.

              Win7 version still suffers GL ERROR: 1, out of memory, and no texture, even if the code is correct on Ubuntu.

              ( The GPU has 2 Gbyte allocated RAM in both op. system, so this error msg. is quite a surprise..)

               

              Regarding ATI_meminfo:You are absolutely right!

              Based on your hint, I have checked the system with OpenGL extensions viewer tool by realtech, and Kaveri does not support this extension according the tool. ( Even If the reported numbers look really valid at first sight, and that makes me fool. )