3

我正在使用 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 的纹理限制。奇怪的是:这个架构没有专用的视频内存,它是共享的。而且我可以确定 OpenGL 正在使用系统内存来处理纹理,因为我可以看到“免费”内存在“顶部”中下降。那么为什么我会收到“内存不足”错误呢?我希望 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...
4

3 回答 3

5

共享视频内存并不意味着所有可用的 RAM 都可以用于纹理。通常图形单元只获得系统内存的一部分,系统的其余部分根本无法使用。在您的情况下,可能是 128MiB。这与板载芯片组显卡使用的 AGP 孔径或英特尔酷睿集成显卡的帧缓冲区大小相同。

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

于 2011-01-12T23:58:51.580 回答
3

使用较小或压缩的纹理,或托盘化的纹理。还要警惕同样消耗 GPU 资源的几何/显示列表。

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

于 2011-01-12T21:46:54.373 回答
1

您是否考虑过为进行mipmapping而创建的低分辨率纹理副本?

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

这些以 2 的幂为单位减少,因此您将拥有 256x256、128x128、64x64 ......伴随主纹理的图像。这将比您只有单个图像更快地吞噬您的纹理记忆。

在他们在 Wikipedia 上使用的示例中,原始纹理是 256x256,他们将 mip-map 纹理一直降低到 1x1。通过他们的计算

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

这假设您当然没有将其关闭。

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

于 2011-01-12T21:31:24.983 回答