Сбой OpenGL python glTextImage2D из-за ошибки шины

В моем текущем OpenGL-проекте на Python мне нужно создать 2d-текстуру с помощью glTexImage2d. При этом у меня возникают проблемы, когда ширина / высота текстуры превышает 888x888.

# crashes _sometimes_ when self._w * self._h > 888*888
glBindTexture(GL_TEXTURE_2D, self._id);
glTexImage2D(
    GL_TEXTURE_2D, 
    0, GL_RGB, 
    self._w, 
    self._h, 
    0, 
    GL_RGB, 
    GL_UNSIGNED_BYTE, 
    ''); # init an empty texture 

Иногда он работает, иногда он не работает, что приводит к "Ошибка шины: 10". Вот некоторые детали отладки:

Crashed Thread:        0  Dispatch queue: com.apple.main-thread
Exception Type:        EXC_BAD_ACCESS (SIGBUS)
Exception Codes:       KERN_PROTECTION_FAILURE at 0x0000000103694000

железо: mac book pro retina (2013):

Date/Time:             2015-06-22 21:30:53.795 +0200
OS Version:            Mac OS X 10.10.2 (14C109)
Report Version:        11

запуск профиля ядра OpenGL 4.1:

localhost:py keksnicoh$ python -m demos.plotter
[...] init GLFW
[...] load OPENGL_CORE_PROFILE 4.10
  + Vendor             Intel Inc.
  + Opengl version     4.1 INTEL-10.2.46
  + GLSL Version       4.10
  + Renderer           Intel Iris OpenGL Engine
  + GLFW3              3.0.4 Cocoa NSGL chdir menubar dynamic
GL_MAX_TEXTURE_SIZE 16384

Во время моего исследования этой проблемы я обнаружил очень похожую проблему переполнения стека EXC_BAD_ACCESS с glTexImage2D в GLKViewController. Решением было установить "блокировку" во время вызова glTexImage2d. Причина, по которой эта проблема, кажется, подходит для моей проблемы, заключается в том, что вызов, по-видимому, происходит случайным образом примерно в 50% случаев, что может указывать на какую-либо проблему, обусловленную расой.

Есть ли способ реализовать подобную блокировку в моем скрипте Python или я должен инициализировать текстуру другим способом? Обратите внимание, что при инициализации текстура пуста, так как текстура будет записана буфером кадра.

ОБНОВЛЕНИЕ РЕШЕНО Так как я думал, что попробовал это с None вместо пустой строки в качестве значения инициализации в glTexImage2d, я передал эту пустую строку. Проблема решается этим кодом

# crashes _sometimes_ when self._w * self._h > 888*888
glBindTexture(GL_TEXTURE_2D, self._id);
glTexImage2D(
    GL_TEXTURE_2D, 
    0, GL_RGB, 
    self._w, 
    self._h, 
    0, 
    GL_RGB, 
    GL_UNSIGNED_BYTE, 
    None); # <<<<---------------------- 

спасибо derhass и datenwolf за помощь!

0 ответов

Другие вопросы по тегам