2013-06-25 3 views
1

Я пишу приложение OpenGL (ES), и мое устройство, похоже, возвращается к рендерингу программного обеспечения. Как я могу определить, какие вызовы API/ограничения на устройства вызывают это?Как определить, какие методы OpenGL вызывают резервную копию программного обеспечения?

В моем случае это происходит на малине Pi с OpenGL ES 2.0, но идеальный ответ должен применяться к гораздо более широкому диапазону версий OpenGL и ОС.

ответ

3

Я честно не думаю, что есть правильный способ узнать.

Драйверы графических карт предоставят функциональность для определенной версии OpenGL, насколько я знаю, она не должна предоставлять аппаратную поддержку этих функций, просто смогите обработать заявку, запрашивающую их. Таким образом, карта может претендовать на поддержку OpenGL 4, но почти все, что является более новым, тогда OpenGL3 может быть просто программным обеспечением.

Возможно, вам удастся найти документацию по оборудованию, которое вы хотите запустить, и сообщит вам, что ускоряется аппаратное обеспечение. В противном случае вам, возможно, придется попытаться создать список функций, которые вы используете медленно, пока не начнете видеть, что он отпал на рендеринг программного обеспечения.

Кроме того, как вы знаете, что он использует рендеринг программного обеспечения, это просто удар производительности? Я предполагаю, что возможно, что, хотя он поддерживает функцию в оборудовании, он делает это очень плохо. Существует также вероятность того, что вы не правильно создаете свой контекст в первую очередь, поэтому не можете воспользоваться более поздней версией.

+0

Erg. Ну, это печально. Если ваш ответ правильный (как это, вероятно, есть), то у меня совсем немного рассола. Я дам ему еще несколько дней, чтобы узнать, есть ли у кого-нибудь ответ, а если нет, то просто бросьте вам щедрость. – fouric

+0

thecoshman правильный. По сравнению с DirectX, который (используется) обеспечивает запрос на то, что аппаратное ускорение, OpenGL выбрал другой маршрут, который поддерживает все функции, но не было гарантии производительности. Фактически, в предыдущие дни различные комбинации настроек состояния могли привести к тому, что драйвер переместился с аппаратного ускорения на поддержку программного обеспечения. Вы получаете гораздо меньше, когда используете OpenGL только для шейдеров в настоящее время, но ситуация несколько возродилась с помощью OpenGL ES и встроенного оборудования. – radical7

+0

Это позор, я бы счел разумным иметь стандартную функцию поддержки запросов для определенных функций.По моему мнению, это действительно то, что нужно сделать, позволяя вам вернуться к более низкому качеству, но все же более быстрым методам благодаря аппаратным ускорениям. Насколько я понимаю, это примерно так, как работают расширения, за исключением того, что функции «ядра» гарантируют, по крайней мере, поддержку уровня программного обеспечения. Там * может * быть расширением, которое может делать то, что вам нужно, но вы не можете точно сказать, насколько он будет широко поддерживаться. – thecoshman

2

Если устройство поддерживает GL_ARB_debug_output, тогда отладочный вывод может иметь представление о том, является ли что-то программным обеспечением или плохим для производительности.

Использование описано в документе http://www.opengl.org/registry/specs/ARB/debug_output.txt Короче говоря, вы должны установить буфер журнала или функцию обратного вызова, которая будет получать сообщения.

Существует также еще один удлинитель отладки http://www.opengl.org/registry/specs/KHR/debug.txt, вероятно, еще существует.

использовать расширение KHR вы должны инициализировать Context правильно

EGLint ctx_attribs[] = { 
EGL_CONTEXT_CLIENT_VERSION, 2, 
EGL_CONTEXT_FLAGS_KHR, EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR, 
EGL_NONE}; 

EGLContext *ctx = eglCreateContext(dpy, config, EGL_NO_CONTEXT, ctx_attribs); 

и установка обратного вызова

static void on_gl_error(enum source, enum type, uint id, enum severity, 
sizei length, const char* message, void *userParam) 
{ 
    printf("%s\n", message); 
} 

static void enable_debug_callbacks(void) 
{ 
    glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR, GL_TRUE); 
    glDebugMessageCallbackKHR(on_gl_error, NULL); 
} 

Другие, вероятно, работают подобным образом, вы должны проверить, поддерживаемыми расширениями, прежде чем пытаться это, это делается проверяя возврат вызова. Это строка со списком всех поддерживаемых расширений.

glGetString(GL_EXTENSIONS); 
Смежные вопросы