Ошибка OpenGL "недостаточно памяти" при превышении 128 МБ текстур

Я работаю над встроенным графическим приложением OpenGL, работающим на Intel Atom z530 с графическим оборудованием GMA500. (Насколько я понимаю, GMA500 - это PowerVR под капотом, но я не уверен). Я работаю с драйвером Tungsten Graphics "Gallium" на Ubuntu 9.10 Karmic Koala. О, вы также должны знать, что у меня есть 1 ГБ доступной системной памяти.

Вот проблема: у меня есть код, который выделяет кучу текстур 512x512x32 (около 1 МБ за штуку). Когда я получаю около 118-120 из них, я получаю сообщение об ошибке "недостаточно памяти" от OpenGL, и я также получаю на консоли следующее сообщение: "ошибка: ошибка INTEL_ESCAPE_ALLOC_REGION".

Это, наряду с простыми измерениями, глядя на "верх", показывает мне, что я бьюсь над пределом ~128 МБ для текстур. Странно то, что в этой архитектуре нет выделенного видео-плеера, он используется совместно. И я могу точно сказать, что OpenGL использует системный ram для текстур, потому что я вижу, как "свободный" ram опускается в "top". Так почему я получаю ошибку "недостаточно памяти"? Я ожидаю, что opengl будет просто использовать больше моего доступного системного RAM. Почему такой жесткий предел? Есть ли какой-нибудь способ изменить то, на что установлен этот очевидный "жесткий предел"?

Спасибо! Крис


Вот мой вывод из glxinfo:

$ glxinfo

name of display: :0.0
display: :0  screen: 0
direct rendering: Yes
server glx vendor string: SGI
server glx version string: 1.2
server glx extensions:
    GLX_ARB_multisample, GLX_EXT_visual_info, GLX_EXT_visual_rating, 
    GLX_EXT_import_context, GLX_EXT_texture_from_pixmap, GLX_OML_swap_method, 
    GLX_SGI_make_current_read, GLX_SGIS_multisample, GLX_SGIX_hyperpipe, 
    GLX_SGIX_swap_barrier, GLX_SGIX_fbconfig, GLX_MESA_copy_sub_buffer
client glx vendor string: SGI
client glx version string: 1.4
client glx extensions:
    GLX_ARB_get_proc_address, GLX_ARB_multisample, GLX_EXT_import_context, 
    GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_MESA_allocate_memory, 
    GLX_MESA_copy_sub_buffer, GLX_MESA_swap_control, 
    GLX_MESA_swap_frame_usage, GLX_OML_swap_method, GLX_OML_sync_control, 
    GLX_SGI_make_current_read, GLX_SGI_swap_control, GLX_SGI_video_sync, 
    GLX_SGIS_multisample, GLX_SGIX_fbconfig, GLX_SGIX_pbuffer, 
    GLX_SGIX_visual_select_group, GLX_EXT_texture_from_pixmap
GLX version: 1.2
GLX extensions:
    GLX_ARB_get_proc_address, GLX_ARB_multisample, GLX_EXT_import_context, 
    GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_MESA_swap_control, 
    GLX_OML_swap_method, GLX_SGI_make_current_read, GLX_SGIS_multisample, 
    GLX_SGIX_fbconfig, GLX_EXT_texture_from_pixmap
OpenGL vendor string: Tungsten Graphics, Inc.
OpenGL renderer string: Gallium 0.1, pipe/psb/Poulsbo on IEGD
OpenGL version string: 2.0 Mesa 7.1
OpenGL shading language version string: 1.10
OpenGL extensions:
    GL_ARB_depth_texture, GL_ARB_draw_buffers, GL_ARB_fragment_program, 
    GL_ARB_fragment_shader, GL_ARB_multisample, GL_ARB_multitexture, 
    GL_ARB_occlusion_query, GL_ARB_pixel_buffer_object, 
    GL_ARB_point_parameters, GL_ARB_point_sprite, GL_ARB_shader_objects, 
    GL_ARB_shading_language_100, GL_ARB_shading_language_120, GL_ARB_shadow, 
    GL_ARB_texture_border_clamp, GL_ARB_texture_compression, 
    GL_ARB_texture_cube_map, GL_ARB_texture_env_add, 
    GL_ARB_texture_env_combine, GL_ARB_texture_env_crossbar, 
    GL_ARB_texture_env_dot3, GL_ARB_texture_mirrored_repeat, 
    GL_ARB_texture_non_power_of_two, GL_ARB_texture_rectangle, 
    GL_ARB_transpose_matrix, GL_ARB_vertex_buffer_object, 
    GL_ARB_vertex_program, GL_ARB_vertex_shader, GL_ARB_window_pos, 
    GL_EXT_abgr, GL_EXT_bgra, GL_EXT_blend_color, 
    GL_EXT_blend_equation_separate, GL_EXT_blend_func_separate, 
    GL_EXT_blend_logic_op, GL_EXT_blend_minmax, GL_EXT_blend_subtract, 
    GL_EXT_clip_volume_hint, GL_EXT_compiled_vertex_array, 
    GL_EXT_copy_texture, GL_EXT_draw_range_elements, 
    GL_EXT_framebuffer_object, GL_EXT_framebuffer_blit, GL_EXT_fog_coord, 
    GL_EXT_multi_draw_arrays, GL_EXT_packed_pixels, 
    GL_EXT_pixel_buffer_object, GL_EXT_point_parameters, 
    GL_EXT_polygon_offset, GL_EXT_rescale_normal, GL_EXT_secondary_color, 
    GL_EXT_separate_specular_color, GL_EXT_shadow_funcs, 
    GL_EXT_stencil_two_side, GL_EXT_stencil_wrap, GL_EXT_subtexture, 
    GL_EXT_texture, GL_EXT_texture3D, GL_EXT_texture_compression_s3tc, 
    GL_EXT_texture_edge_clamp, GL_EXT_texture_env_add, 
    GL_EXT_texture_env_combine, GL_EXT_texture_env_dot3, 
    GL_EXT_texture_filter_anisotropic, GL_EXT_texture_lod_bias, 
    GL_EXT_texture_mirror_clamp, GL_EXT_texture_object, 
    GL_EXT_texture_rectangle, GL_EXT_vertex_array, GL_APPLE_packed_pixels, 
    GL_ATI_blend_equation_separate, GL_ATI_separate_stencil, 
    GL_IBM_rasterpos_clip, GL_IBM_texture_mirrored_repeat, 
    GL_INGR_blend_func_separate, GL_MESA_ycbcr_texture, GL_MESA_window_pos, 
    GL_NV_blend_square, GL_NV_light_max_exponent, GL_NV_point_sprite, 
    GL_NV_texture_rectangle, GL_NV_texgen_reflection, GL_OES_read_format, 
    GL_SGI_color_matrix, GL_SGIS_generate_mipmap, 
    GL_SGIS_texture_border_clamp, GL_SGIS_texture_edge_clamp, 
    GL_SGIS_texture_lod, GL_SUN_multi_draw_arrays

    ...truncated visuals part...

3 ответа

Общая видеопамять не означает, что все доступное ОЗУ можно использовать для текстур. Обычно графический блок получает только часть системной памяти, которая вообще недоступна для остальной системы. В вашем случае это может быть 128MiB. Это то же самое, что и апертура AGP, используемая встроенной графикой чипсета, или размер кадрового буфера встроенной графики Intel Core.

Так как OpenGL объявляет чисто виртуальную объектную модель, он должен хранить копию каждого объекта в "постоянной" памяти (содержимое памяти графического процессора может быть в любое время аннулировано, например, с помощью коммутаторов VT, перезагрузки графического процессора и т. П.), Это что потребляется из обычной системной памяти.

Используйте меньшие или сжатые текстуры или паллетированные. Также будьте осторожны с геометрией / списками отображения, которые также высасывают ресурсы GPU.

(Вы можете выполнить поиск палитры самостоятельно в шейдере, если ваша реализация GL не поддерживает такие текстуры.)

Учли ли вы копии текстур с более низким разрешением, которые создаются для создания мипмапинга?

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

Они уменьшают с шагом в 2 степени, так что вы получите изображение 256x256, 128x128, 64x64, ..., сопровождающее основную текстуру. Это будет поглощать вашу текстурную память намного быстрее, чем если бы у вас было только одно изображение.

В примере, который они используют в Википедии, исходная текстура имеет размер 256x256, и они используют текстуры mip-map вплоть до 1x1. По их расчетам

Увеличение объема памяти, необходимого для всех этих мипмапов, составляет треть первоначальной текстуры

Это предполагает, что вы не выключили его, конечно.

Что касается того, как вы увеличиваете объем памяти, к которой у вас есть доступ - извините, не знаю.

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