Autor Wątek: GLX tworzenie context'u OpenGL  (Przeczytany 2649 razy)

Offline Stig

  • Użytkownik

# Marzec 25, 2013, 22:21:10
Witam,
towrze sobię za pomocą funkcji glXCreateNewContext nowy context OpenGL wszytko ładnie pięknie się stworzyło
tylko nie wiem w jakiej wersji OpenGL jest ten context czy to 3.0, 2.1 etc ? w ogóle chciałbym sobie przed stworzeniem ustalić z jakiej wersji OpenGL będę korzystał. GLX mam w wersji 1.4

Pozdrawiam


Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Kos

  • Użytkownik
    • kos.gd

# Marzec 25, 2013, 22:25:57
glGetString(GL_VERSION)
glXCreateContextAttribsARB
http://www.opengl.org/registry/specs/ARB/glx_create_context.txt

Offline Stig

  • Użytkownik

# Marzec 25, 2013, 22:33:10
Dzięki zmyliło mnie to, że w dokumentacji do glxCreateNewContext pisze, że jest dopiero dostępne w wersji  >= glx 1.3 więc na chłopski rozum myślałem, że i obsługuje nowsze wersje OpenGL

Offline Hail The Mush...

  • Użytkownik

# Marzec 26, 2013, 14:33:41
Stig: w dokumentacji GLX jest taka tabelka:

GLX Version --- Highest OpenGL Version Supported
GLX 1.0            OpenGL 1.0
GLX 1.1            OpenGL 1.0
GLX 1.2            OpenGL 1.1
GLX 1.3            OpenGL 1.2
GLX 1.4            OpenGL 1.3

Offline Stig

  • Użytkownik

  • +1
# Marzec 27, 2013, 23:01:57
Napotkałem kolejny problemik :)
udało się korzystając z glx i opengl stworzyć context i podpiąć go pod okno stworzone za pomocą X11lib,
ale teraz chciałbym mieć możliwość podpinać ten swój context pod dowolną bibliotekę obsługującą okienka poprzez przekazanie z niej windowId, pointera na display, i numer screen'a.
Pod lupę poszło Qt, wszystko szło ok do momentu aż chciałem context zrobić current, no i tu pojawia się cały problem:

X Error: BadMatch (invalid parameter attributes) 8
  Extension:    135 (Uknown extension)
  Minor opcode: 5 (Unknown request)
  Resource id:  0x4a00003

#include "widget.h"

typedef GLXContext (*glXCreateContextAttribsARBProc)(Display*, GLXFBConfig, GLXContext, Bool, const int*);

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{   
    this->setAutoFillBackground(false);
    this->setAttribute(Qt::WA_OpaquePaintEvent);
    this->setAttribute(Qt::WA_NoSystemBackground);
    this->setAttribute(Qt::WA_NativeWindow);
    this->setAttribute(Qt::WA_PaintOnScreen, true);
    this->setAttribute(Qt::WA_StyledBackground, false);
    this->setAttribute(Qt::WA_PaintUnclipped);

    this->xInfo = this->x11Info();

    this->findBestFrameBuffer();

//    XVisualInfo* visualInfo = glXGetVisualFromFBConfig(this->xInfo.display(), this->fbConfig);
//    qDebug("fb visual infoId %li", visualInfo->visualid);

//    XSetWindowAttributes windowAttributes;
//    XWindowAttributes currentWindowAttributes;
//    XGetWindowAttributes(this->xInfo.display(), this->winId(), &currentWindowAttributes);

//    qDebug("current window mask %li", currentWindowAttributes.all_event_masks);

//    Colormap colormap = XCreateColormap(this->xInfo.display(), this->xInfo.appRootWindow(), visualInfo->visual, AllocNone);
//    windowAttributes.colormap = colormap;
//    windowAttributes.background_pixmap = None;
//    windowAttributes.border_pixel = 0;
//    windowAttributes.event_mask = StructureNotifyMask;

//    XChangeWindowAttributes(this->xInfo.display(), this->winId(), CWBorderPixel|CWColormap|CWEventMask, &windowAttributes);

    GLXContext context = 0;

    glXCreateContextAttribsARBProc glXCreateContextAttribsARB = 0;
    glXCreateContextAttribsARB = (glXCreateContextAttribsARBProc)glXGetProcAddressARB( (const GLubyte *) "glXCreateContextAttribsARB" );

    int contextAttribs[] =
    {
        GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
        GLX_CONTEXT_MINOR_VERSION_ARB, 3,
        //GLX_CONTEXT_FLAGS_ARB        , GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
        None
    };


    context = glXCreateContextAttribsARB(this->xInfo.display(), this->fbConfig, 0, True, contextAttribs);
    qDebug("context %p ", context);

    glXMakeCurrent(this->xInfo.display(), this->winId(), context);
}


void Widget::findBestFrameBuffer()
{
    static int visualAttribs[] =
    {
          GLX_X_RENDERABLE    , True,
          GLX_DRAWABLE_TYPE   , GLX_WINDOW_BIT,
          GLX_RENDER_TYPE     , GLX_RGBA_BIT,
          GLX_X_VISUAL_TYPE   , GLX_TRUE_COLOR,
          GLX_RED_SIZE        , 8,
          GLX_GREEN_SIZE      , 8,
          GLX_BLUE_SIZE       , 8,
          GLX_ALPHA_SIZE      , 8,
          GLX_DEPTH_SIZE      , 24,
          GLX_STENCIL_SIZE    , 8,
          GLX_DOUBLEBUFFER    , True,
          //GLX_SAMPLE_BUFFERS  , 1,
          //GLX_SAMPLES         , 4,
          None
    };
    int fbCount = 0;

    GLXFBConfig* fbConfigsList = glXChooseFBConfig(this->xInfo.display(), this->xInfo.screen(), visualAttribs, &fbCount);

    qDebug("%i frame buffers found", fbCount);

    int bestFbCfg = -1;
    int worstFbCfg = -1;
    int bestNumberOfSamples = -1;
    int worstNumberOfSamples = 999;
    XVisualInfo* visualInfo = NULL;
    int sampleBuffers = 0;
    int samples = 0;

    for( int i = 0 ; i < fbCount ; i++ )
    {
        visualInfo = glXGetVisualFromFBConfig(this->xInfo.display(), fbConfigsList[i]);

        if( visualInfo != NULL )
        {
            glXGetFBConfigAttrib(this->xInfo.display(), fbConfigsList[i], GLX_SAMPLE_BUFFERS, &sampleBuffers);
            glXGetFBConfigAttrib(this->xInfo.display(), fbConfigsList[i], GLX_SAMPLES, &samples);

            qDebug("\t matching %i fbCOnfig, visualId %p sampleBUffers %i samples %i", i+1, visualInfo->visualid, sampleBuffers, samples);

            if( bestFbCfg < 0 || sampleBuffers && samples > bestNumberOfSamples )
            {
                bestFbCfg = i;
                bestNumberOfSamples = samples;
            }

            if( worstFbCfg < 0 || !sampleBuffers | samples < worstNumberOfSamples )
            {
                worstFbCfg = i;
                worstNumberOfSamples = samples;
             }

         }

         XFree(visualInfo);
    }

    qDebug("best fb %i worst fb %i", bestFbCfg+1, worstFbCfg+1);

    this->fbConfig = fbConfigsList[bestFbCfg];
    XFree(fbConfigsList);
}

void Widget::paintEvent(QPaintEvent *)
{

}

Pisałem na qtcentre, ale zero odpowiedzi, może ktoś ma jakieś pomysły?

Pozdrawiam

Offline rastabaddon

  • Użytkownik

# Maj 25, 2013, 22:19:54
czemu nie zainkludujesz sobie glx.h
masz tam odrazu glXCreateNewContext