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

我正在使用带有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...
    
已邀请:
共享视频内存并不意味着所有可用的RAM都可用于纹理。通常,图形单元只占系统内存的一部分,根本不可用于系统的其余部分。在你的情况下,可能是128MiB。这种类似于板载芯片组图形使用的AGP光圈,或英特尔酷睿集成显卡的帧缓冲大小。 由于OpenGL声明了一个纯粹的虚拟对象模型,它必须在“持久”内存中保留每个对象的副本(GPU内存的内容可能在任何时候都无效,例如通过VT开关,GPU重置,类似的东西),这是什么是常规系统内存消耗的。     
使用较小或压缩的纹理或托盘化的纹理。同时要警惕几何/显示列表,这些列表也会吸收GPU资源。 (如果你的GL实现不支持这样的纹理,你可以在着色器中自己进行调色板查找。)     
您是否考虑过为mipmapping创建的纹理的较低分辨率副本?   预先计算的,优化的主要纹理图像集合,旨在提高渲染速度并减少混叠伪像。 它们以2的幂为单位减少,因此您将拥有伴随主纹理的256x256,128x128,64x64 ......图像。这比使用单个图像时更快地进入纹理记忆。 在维基百科上使用的示例中,原始纹理为256x256,它们将mip-map纹理一直降至1x1。通过他们的计算   所有这些mipmap所需的存储空间的增加是原始纹理的三分之一 这假设您当然没有关闭它。 至于你如何增加你可以访问的内存量 - 抱歉不知道。     

要回复问题请先登录注册