В общем, у меня Ubuntu 12.04 64-bit LTS. Версия libsdl1.2-dev = 1.2.14-6.4ubuntu3. nVidia - драйвер 310.14, карта GTX465.
Проблема: на компьютере (том что я описал) - не срабатывает вывод изображения в полноэкранном режиме. Иногда да, иногда нет, иногда ровно через раз. Это на домашнем компе. А на работе nVidia 8500GT - с опенсорсным драйвером бывает иногда что не срабатывает, а с проприетарным (current версия, 2** - точно не помню) - всегда срабатывает.
Приводу ниже код, задача крайне простая - выставить полноэкранный режим и выводить последовательность картинок. Что может быть не так?
Работаю так: по нажатию кнопки в GUI (Qt) - ставлю видео-режим set, затем три секунды жду таймером и затем выводу картинку draw_image, а через 8 секунд после старта - restore т.е. возвращаюсь как было.
(И заодно поинтересуюсь, как задать свой refresh rate в SDL? чтобы ыло например 75 Гц а не 95 и не 60 для того или иного режима)
#include "video_mode.h"
#include <QDebug>
video_mode::video_mode(QObject *parent) :
QObject(parent)
{
ready = false;
}
void video_mode::set(int _w, int _h)
{
SDL_Init(SDL_INIT_VIDEO);
SDL_ShowCursor(0);
w = _w;
h = _h;
// system("export SDL_VIDEO_GF_REFRESH_RATE=60");
surface = SDL_SetVideoMode(w, h, 24, SDL_FULLSCREEN);
ready = true;
}
void video_mode::restore()
{
ready = false;
SDL_ShowCursor(1);
SDL_Quit();
}
void video_mode::draw_image(QImage image)
{
if(!ready)
{
qDebug() << "ERROR: video_mode::draw_image not ready";
}
SDL_Rect src, dst;
SDL_Surface *rgb = SDL_CreateRGBSurfaceFrom((void*) image.bits(), image.width(), image.height(), 24, image.width()*3, 0x000000FF, 0x0000FF00, 0x00FF0000, 0);
src.x = 0;
src.y = 0;
src.w = image.width();
src.h = image.height();
dst.x = 0;
dst.y = 0;
dst.w = w;
dst.h = h;
int res = SDL_BlitSurface(rgb, &src, surface, &dst);
qDebug() << "SDL_BlitSurface" << res;
if(res != 0)
{
qDebug() << "ERROR: SDL" << res << QString((char*) SDL_GetError());
}
// image.save("test_qt.bmp");//!!!
// QImage image_sdl = QImage((uchar*) rgb->pixels, rgb->w, rgb->h, QImage::Format_RGB888);//!!!
// image_sdl.save("test_sdl.bmp");//!!!
SDL_UpdateRect(surface, 0, 0, w, h);
SDL_FreeSurface(rgb);
}
Никаких сообщений об ошибках операции SDL_BlitSurface не выводится - т.е. формально всё идеально работает. А по факту я как видел черный экран так и вижу...