Ошибка OpenGL «недостаточно памяти» при превышении 128 МБ текстур - PullRequest
1 голос
/ 13 января 2011

Я работаю над встроенным графическим приложением 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 ]

4 голосов
/ 13 января 2011

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

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

2 голосов
/ 13 января 2011

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

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

1 голос
/ 13 января 2011

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

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

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

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

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

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

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

...