Ubuntu OpenGL";“内存不足”;纹理超过128MB时出错

Ubuntu OpenGL";“内存不足”;纹理超过128MB时出错,ubuntu,opengl,memory,textures,intel-atom,Ubuntu,Opengl,Memory,Textures,Intel Atom,我正在开发一个嵌入式OpenGL图形应用程序,该应用程序运行在带有GMA500图形硬件的Intel Atom z530上。(据我所知,GMA500是引擎盖下的PowerVR,但我不确定)。我在Ubuntu 9.10 Karmic Koala上运行钨图形“镓”驱动程序。哦,你也应该知道我有1GB的可用系统内存 问题是: 我的代码分配了一堆512x512x32纹理(每个大约1MB)。当我看到其中的118-120个时,我从OpenGL得到了一个“内存不足”错误,我在控制台上也得到了这样一条消息:“错误

我正在开发一个嵌入式OpenGL图形应用程序,该应用程序运行在带有GMA500图形硬件的Intel Atom z530上。(据我所知,GMA500是引擎盖下的PowerVR,但我不确定)。我在Ubuntu 9.10 Karmic Koala上运行钨图形“镓”驱动程序。哦,你也应该知道我有1GB的可用系统内存

问题是: 我的代码分配了一堆512x512x32纹理(每个大约1MB)。当我看到其中的118-120个时,我从OpenGL得到了一个“内存不足”错误,我在控制台上也得到了这样一条消息:“错误:INTEL_ESCAPE_ALLOC_REGION failed”

这一点,再加上查看“顶部”时的简单测量,向我表明我遇到了~128MB的纹理限制。奇怪的是:这种架构没有专用的视频ram,而是共享的。我可以肯定地说OpenGL使用系统ram来处理纹理,因为我可以看到“自由”ram在“顶部”中下降。那么,为什么会出现“内存不足”错误呢?我希望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...

您是否考虑过创建纹理的低分辨率副本

伴随主纹理的预先计算、优化的图像集合,旨在提高渲染速度并减少锯齿瑕疵

它们以2的幂级数递减,因此您将拥有一个256x256、一个128x128、一个64x64。。。与主纹理相关的图像。这将消耗你的纹理记忆,比你只拥有一张图像要快得多

在他们在维基百科上使用的示例中,原始纹理是256x256,他们将mip贴图纹理一直带到1x1。根据他们的计算

所有这些mipmap所需的存储空间增加了原始纹理的三分之一

当然,这是假设您没有关闭它


至于如何增加您可以访问的内存量-抱歉,不知道。

使用较小或压缩的纹理,或托盘纹理。同时也要注意几何图形/显示列表,它们也会占用GPU资源


(如果GL实现不支持此类纹理,您可以自己在着色器中查找调色板。)

共享视频内存并不意味着所有可用RAM都可以用于纹理。通常,图形单元只获取系统内存的一部分,而系统的其余部分根本不可用。在您的情况下,可能是128MiB。这与板载芯片组图形使用的AGP光圈或Intel Core集成图形的帧缓冲区大小类似


由于OpenGL声明了一个纯虚拟对象模型,因此它必须在“持久”内存中保留每个对象的副本(GPU内存的内容可能随时失效,例如通过VT开关、GPU重置等等),这是从常规系统内存中消耗的内存。

能否复制粘贴
glxinfo
命令的结果?(视觉阵列前的线条)只是一个旁注:OpenGL经常在RAM中保留纹理,以便能够快速更改GPU-RAM中的纹理。因此,您不能使用增加的RAM使用率作为没有专用纹理RAM的指标。(我相信,这可以通过使用缓冲区来解决。有人说要为仅GPU的纹理添加扩展)MESA难道不是仅软件渲染器吗?(我的opengl linux fu有点弱…)我想在这种情况下我可以。首先,这个硬件没有GPU-RAM,它是共享RAM,所以GPU总是使用系统RAM。此外,我仔细测量了系统RAM的使用情况,它与这些纹理的理论大小非常吻合。@Marcus:Mesa有一个软件光栅化器,是的,但它也有许多硬件驱动程序。但这只能产生1/4+1/16+1/64+…<使用了1/2的内存,因此仍应在192MB@brian_d-我已经有一段时间没做这些了,所以我的数学有点生疏了。关于MIP映射的观点很好。如果还没有(知道如何在opengl中做到这一点吗?;-)的话,我肯定应该关闭它。问题是,即使有这些可能的节省,我也需要更多的ram(我希望512MB)。@sidewiderguy-很抱歉,我记不起来了(已经有一段时间了)&我认为这可能是问题所在。每个纹理实际上占用大约1.36MB的空间。128除以1.36得到大约94,这比您计算的118低。@ChrisF:我真正的问题不是弄清楚为什么我只能分配118个纹理。真正的问题是,我如何使更多的RAM对我可用。不管怎样,谢谢你对这个mipmapping东西的输入,我会记住这一点,我相信它会有帮助。小一些就好了,不过我必须保持一定的细节水平。我曾考虑过压缩纹理,它们听起来不错,但它们绘制和/或渲染是否较慢?我的CPU/GPU性能非常有限。关于显示列表的好观点。。。我必须尝试在没有这些的情况下运行,看看是否能从中获益。这就引出了一个问题:你怎么能拥有512x512的120个纹理并以全分辨率显示它们?@tibur:这些纹理都是“瓷砖”,包含一些“图像”,将作为3D地图的一部分显示。因此,它们不是同时显示的,这取决于您的平移/缩放所看到的瓷砖以及分辨率。@sidewinderguy:不可能低于8位纹理(好吧,通过大量的数学运算,您可以将两个4位纹理组合成一个,并使用着色器选择每个纹理..但这太愚蠢了)。但是如果8位无法实现,也许您可以考虑动态管理mipmap(因为您不总是使用所有纹理)。想想谷歌地球。这更复杂,但是