我正在使用带有GMA500图形硬件的Intel Atom z530上运行的嵌入式OpenGL图形应用程序。 (据我所知,GMA500是引擎盖下的PowerVR,但我不确定)。我在Ubuntu 9.10 Karmic Koala上运行Tungsten Graphics“Gallium”驱动程序。哦,你还应该知道我有1 GB的可用系统内存。
这是问题所在: 我有代码分配一堆512x512x32纹理(每个大约1MB)。当我得到大约118-120这些时,我从OpenGL中得到一个“内存不足”错误,我也在控制台上收到此消息:“错误:INTEL_ESCAPE_ALLOC_REGION失败”。
这一点,以及看着“顶部”的简单测量,向我表明我正在达到~128MB的纹理限制。奇怪的是:这个架构没有专用的视频RAM,它是共享的。而且我可以确定OpenGL正在使用系统ram作为纹理,因为我可以看到“自由”ram在'top'中下降。那么为什么我会出现'内存不足'错误?我希望opengl能够使用更多我可用的系统内存。为什么会有如此严格的限制?有没有办法改变这个明显的“硬限制”设定的内容?
谢谢! 克里斯
这是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...
答案 0 :(得分:4)
共享视频内存并不意味着所有可用的RAM都可用于纹理。通常,图形单元只占系统内存的一部分,根本不可用于系统的其余部分。在你的情况下,可能是128MiB。这种情况与板载芯片组图形使用的AGP光圈或英特尔酷睿集成显卡的帧缓冲尺寸相同。
由于OpenGL声明了一个纯粹的虚拟对象模型,它必须在“持久”内存中保留每个对象的副本(GPU内存的内容可能在任何时候都无效,例如VT开关,GPU重置,类似的东西),这是从常规系统内存消耗的。
答案 1 :(得分:2)
使用较小或压缩的纹理或托盘化的纹理。同时要警惕几何/显示列表,这些列表也会占用GPU资源。
(如果你的GL实现不支持这样的纹理,你可以在着色器中自己进行调色板查找。)
答案 2 :(得分:1)
您是否考虑过为mipmapping创建的纹理的较低分辨率副本?
预先计算的,优化的主要纹理图像集合,旨在提高渲染速度并减少锯齿伪影。
这些以2的幂为单位减少,因此您将拥有伴随主纹理的256x256,128x128,64x64 ......图像。与单张图像相比,这会更快地进入纹理记忆。
在他们在维基百科上使用的示例中,原始纹理是256x256,他们将mip-map纹理一直降低到1x1。通过他们的计算
所有这些mipmap所需的存储空间增加是原始纹理的三分之一
这假设您当然没有关闭它。
至于如何增加你可以访问的内存量 - 抱歉不知道。