AnsweredAssumed Answered

Problem with 3D texture generation.

Question asked by hilo on Jan 10, 2015
Latest reply on Jan 21, 2015 by jzhou

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!

Outcomes