Как переключить полноэкранный режим на Mac OSX с использованием SDL 1.3, чтобы он действительно работал? - PullRequest
0 голосов
/ 08 января 2012

Есть SDL_WM_ToggleFullScreen. Однако на Mac его реализация разрушает контекст OpenGL, который уничтожает ваши текстуры вместе с ним. Хорошо, раздражает, но я могу перезагрузить свои текстуры. Однако, когда я перезагружаю свои текстуры после переключения, он падает на определенных текстурах внутри memcpy, вызываемого glTexImage2D. Да, это не сработало, когда я загрузил эти текстуры в первый раз. Я даже пытаюсь удалить все свои текстуры перед переключением, но получаю тот же результат.

В качестве теста я перезагружаю текстуры, не переключая полноэкранный режим, и текстуры перезагружаются нормально. Таким образом, переключение в полноэкранный режим делает что-то смешное с OpenGL. (И под «переключением» я подразумеваю движение в любом направлении: windowed-> fullscreen или fullscreen-> windowed - я получаю те же результаты.)

В качестве альтернативы этот код также может переключаться в полноэкранный режим:

SDL_Surface *surface = SDL_GetVideoSurce();
Uint32 flags = surface->flags;
flags ^= SDL_FULLSCREEN;
SDL_SetVideoMode(surface->w, surface->h, surface->format->BitsPerPixel, flags);

Однако, вызов SDL_GetError после этого кода говорит о том, что во время SDL_SetVideoMode была установлена ​​ошибка «Неверное окно». И если я проигнорирую это и попытаюсь загрузить текстуры, это не приведет к сбою, но мои текстуры тоже не отображаются (возможно, OpenGL просто сразу возвращается из glTexImage2D, фактически ничего не делая). В качестве теста во время запуска я пытаюсь вызвать SDL_SetVideoMode два раза подряд, чтобы выполнить переключение прямо перед тем, как даже загрузить свои текстуры в первый раз. В этом конкретном случае текстуры действительно отображаются. А что?

Я использую SDL 1.3.0-6176 (размещено на веб-сайте SDL 7 января 2012 г.).

Обновление:

Ниже приведен мой код загрузки текстур (здесь нет ничего удивительного). Для пояснения, это приложение (включая приведенный ниже код) уже работает без каких-либо проблем в качестве готового приложения для iOS, Android, PSP и Windows. Windows - единственная другая версия, кроме Mac, которая использует SDL под капотом.

unsigned int Texture::init(const void *data, int width, int height)
{
    unsigned int textureID;
    glGenTextures(1, &textureID);
    glBindTexture(GL_TEXTURE_2D, textureID);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
    return textureID;
}

1 Ответ

0 голосов
/ 08 января 2012

он падает на некоторых текстурах внутри memcpy, вызываемого glTexImage2D.

Этого не должно быть.Где-то есть ошибка, либо в вашем коде, либо в реализации OpenGL.И я бы сказал, что это твое.Поэтому, пожалуйста, опубликуйте ваше распределение текстур и загрузите код, чтобы мы могли его увидеть.

Однако на Mac его реализация разрушает контекст OpenGL, который уничтожает ваши текстуры вместе сэто.

Да, к сожалению, именно так это работает на MacOS X .И из-за дизайна его модели драйвера OpenGL, вы можете с этим поделать (я уже говорил, что MacOS X отстой; о да, я сделал. Иногда. Как и более ста раз).Такая же плохо спроектированная модель драйвера также делает MacOS X настолько медленным, чтобы не отставать от разработки OpenGL.

...