Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Qt+OpenGL+Cuda 
:(
    Опции темы
vindavirik
Дата 6.11.2014, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 4.5.2009

Репутация: нет
Всего: нет



Здравствуйте! Столкнулся я с такой проблемой: создаю QGLWidget, определяю функцию initializeGL()
Код

void GLWidget::initializeGL()
{
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glDisable(GL_DEPTH_TEST);

    // viewport
    glViewport(0, 0, window_width, window_height);
    
    // projection
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    initglew();

    createVBO(&vboPos, &cuda_vbo_resource_pos,2);
    createVBO(&vboColor, &cuda_vbo_resource_color,2);
    runCudaPos(&cuda_vbo_resource_pos);
    runCudaColor(&cuda_vbo_resource_color);
}

функции createVBO и runCuda.... выдраны из примера по совместимости opengl и cuda, который идёт вместе с cuda toolkit. В них создается буфер vbo и связывается с ресурсом cuda. 
Код

void runCudaColor(struct cudaGraphicsResource **vbo_resource)
{
    float4 *dptr;    
    checkCudaErrors(cudaGraphicsMapResources(1, vbo_resource, 0));
    size_t num_bytes;
    checkCudaErrors(cudaGraphicsResourceGetMappedPointer((void **)&dptr, &num_bytes,
                                                         *vbo_resource));
    
    launch_kernel_color(dptr, dmesh_width, dmesh_height, g_fAnim);

    // unmap buffer object
    checkCudaErrors(cudaGraphicsUnmapResources(1, vbo_resource, 0));
}


Функцию paintGL() определяю следующим образом:
Код

void display(GLuint *vboPos, GLuint *vboColor)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
     // set view matrix
     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity();
    

     // render from the vbo
    glEnableClientState  ( GL_VERTEX_ARRAY );
    glBindBuffer(GL_ARRAY_BUFFER, *vboPos);
    glVertexPointer(4, GL_FLOAT, 0, 0);

    glEnableClientState  ( GL_COLOR_ARRAY );
    glBindBuffer(GL_ARRAY_BUFFER, *vboColor);
    glColorPointer(4, GL_FLOAT, 0, 0);

    //glColor3f(1.0, 0.0, 0.0);
     glDrawArrays(GL_POINTS, 0, dmesh_width * dmesh_height);
     glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);

    
}
void GLWidget::paintGL()
{
    display(&vboPos, &vboColor);
    swapBuffers();

}


Проблема заключается в том, что функцию runCudaColor получается вызвать только один раз, если QGLWidget имеет параметр SampleBuffer и только два раза, если QGLWidget имеет DoubleBuffer. Падает функция на строчке checkCudaErrors(cudaGraphicsMapResources(1, vbo_resource, 0)); т.е. при попытке обращения к ресурсу. Такое ощущение, что при вызове paintGL ресурс cuda_vbo_resource_color занимается и больше никогда не освобождается. Подскажите пожалуйста как освободить ресурс после отрисовки?
PM MAIL   Вверх
vindavirik
Дата 7.11.2014, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 4.5.2009

Репутация: нет
Всего: нет



дело похоже не в занятости ресурса, а в контесте OGL. Функция cudaGraphicsMapResources возвращает cudaErrorInvalidGraphicsContext после второго вызова. Получается сначала всё хорошо, но потом paintGL() каким то образом портит контекст? Или я что то не так понимаю?
PM MAIL   Вверх
Amp
Дата 7.11.2014, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 2
Всего: 17



В initglew что именно происходит? И зачем вообще glew понадобился, если в Qt есть встроенные средства для работы с расширениями?
PM MAIL   Вверх
vindavirik
Дата 12.11.2014, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 4.5.2009

Репутация: нет
Всего: нет



из библиотеки glew мне нужный функции glGenBuffers и glBindBuffer. я генерю vertex buffer object и через него связываю область памяти cuda с openGL. как это сделать с помощью Qt`ного vertex object`а я не знаю.. 
PM MAIL   Вверх
Amp
Дата 12.11.2014, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 2
Всего: 17



Qt сам может инициализировать связанные с расширениями функции (см.  QGLFunctions). Может glew где-то неявно создает или меняет текущий контекст - проверь контекст в разных местах.
PM MAIL   Вверх
vindavirik
Дата 12.11.2014, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 4.5.2009

Репутация: нет
Всего: нет



убрал glew, стал пользоваться QGLFunctions - не помогло, результат точно такой же.. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.1407 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.