2011-01-12 9 views
1

GMA500グラフィックハードウェアを搭載したIntel Atom z530上で動作する組み込みOpenGLグラフィックスアプリケーションで作業しています。 (GMA500はPowerVRであると私は理解していますが、わかりません)。私は、Ubuntu 9.10 Karmic KoalaのTungsten Graphics "Gallium"ドライバを使って走っています。ああ、私は1 GBの利用可能なシステムメモリを持っていることも知っておくべきです。128MBのテクスチャを超えるOpenGLの「メモリ不足」エラー

ここに問題があります: 私は512x512x32のテクスチャ(一個につき約1個)の束を割り当てるコードを持っています。私が約118-120になったとき、OpenGLから "メモリ不足"というエラーが出て、コンソールに "error:INTEL_ESCAPE_ALLOC_REGION failed"というメッセージが表示されます。

これは、「トップ」を見ている間の簡単な測定とともに、テクスチャの〜128MBの制限にぶつかっていることを示しています。奇妙なことはこれです:このアーキテクチャは専用のビデオRAMを持っていない、それは共有されています。そして、私は、 "自由な"ラムが "トップ"になるのを見ることができるので、OpenGLがテクスチャにシステムラムを使用していることを確かめることができます。では、なぜ「メモリ不足」エラーが出るのですか?私は、単に私の利用可能なシステムRAMの多くを使用する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

'glxinfo'コマンドの結果を貼り付けてコピーできますか? (視覚配列の前の線) – tibur

+2

ちょうど脇役:OpenGLはGPU-RAMのテクスチャをすばやく変更できるように、テクスチャをRAMの周りに保持することがよくあります。そのため、専用のテクスチャRAMを使用しないという指標として、RAM使用量を増やすことはできません。 (これはバッファを使用して作業することができます、GPUのみのテクスチャ用の拡張機能の追加に関する話があります) – Macke

+0

MESAはソフトウェア専用のレンダラではありませんか? (私のopengl-linux-fuは少し弱いです..) – Macke

答えて

1

は、あなたのアカウントにmipmappingを行うために作成されますテクスチャの低解像度のコピーを取っていますか?

pre-calculated, optimized collections of images that accompany a main texture, intended to increase rendering speed and reduce aliasing artifacts.

これらは、ので、あなたは256×256、128×128、64×64、...主な質感を伴うイメージを持っています2のべき乗の段階で減らします。これは、単一のイメージを持っているよりもはるかに速くテクスチャメモリに食べるでしょう。

これらの例では、Wikipediaで使用する例では、元のテクスチャは256x256で、ミップマップテクスチャを1x1まで使用しています。計算の結果

The increase in storage space required for all of these mipmaps is a third of the original texture

これはもちろんオフにしていないことを前提としています。

あなたがアクセスできるメモリ量を増やす方法については、ごめんなさい。

+0

しかし、これは1/4 + 1/16 + 1/64 + ... <1/2のメモリを使用しただけなので、それでも192MB以下になるはずです –

+0

@brian_d - 私はこのようなことをしてからしばらくしています私の数学は少し錆びています。 – ChrisF

+0

ミップマップについての良い点。私は間違いなくそれをオフにする必要があります(もしどのように考えているのか、OpenGLでやっていますか?) - 問題は、これらの節約でも、私はもっと多くのラムが必要になることです。 512MB)。 – sidewinderguy

1

より小さいまたは圧縮されたテクスチャ、またはパレタイズされたテクスチャを使用します。また、ジオメトリ/ GPUリソ​​ースを吸うリストを注意してください。

(あなたのGLのimplementionは、このようなテクスチャをサポートしていない場合、パレットは、シェーダの中で自分自身を検索できます。)

+0

細かい方がいいですが、ある程度の詳細を維持する必要があります。私は圧縮されたテクスチャを考えていましたが、それは良いと思っていますが、描くのが遅くなり、レンダリングが遅くなりますか?私はCPU/GPUのパフォーマンスが非常に限られています。表示リストについての良い点...私はそれらを使わずに走ってみると、私はいくつかの利点を得るかどうかを確認する必要があります。 – sidewinderguy

+0

パレタイジングされたテクスチャを使ったことはありませんでしたが、通常のテクスチャと同じように描画するのと同じ速さですか?彼らは大幅に少ないメモリを取るか? – sidewinderguy

+1

これは私に質問につながります:120x512の120テクスチャをどうすればフル解像度で表示できますか? – tibur

3

共有ビデオメモリは、すべての利用可能なRAMがテクスチャのために使用することができるという意味ではありません。通常、グラフィックスユニットはシステムメモリのスライスにすぎません。これは、システムの残りの部分ではまったく使用できません。あなたの場合、それは128MiBかもしれません。オンボードのチップセットグラフィックスで使用されているAGPアパーチャ、またはIntel Core統合グラフィックスのフレームバッファサイズなど、同じ種類のものです。

OpenGLは純粋に仮想オブジェクトモデルを宣言するので、各オブジェクトのコピーを「永続的」メモリに保持する必要があります(GPスイッチのメモリの内容は、VTスイッチ、GPUリセット、それは、通常のシステムメモリから消費されるものです。

+0

私の場合、GPUは確かにテクスチャに「通常の」システムメモリを使用しています。私はテクスチャを作成すると、利用可能なRAMが「トップ」になることがわかります。 GPUが残りのシステムで利用できなかったメモリを使用していた場合は、「フリー」RAMが「トップ」になることはありません。 (そして、それはちょうど私が期待する量だけ下に行くので、これは私のアプリの他のメモリの使用によるものではありません)。 – sidewinderguy

+0

しかし、GPUがシステムメモリの固定「スライス」を取得していることは間違いありません。私はちょうど私がもっと何とか使用するようにドライバに言うことができたらいいと思っています。 – sidewinderguy

+0

@sidewinderguy:GPUスライスに消費されて見えるメモリは、OpenGLドライバのバッキングストアです。システムが別のX11セッションに切り替わった場合など、GPUメモリの内容(テクスチャ、頂点バッファオブジェクト、FBOなど)はゴミ箱に表示される可能性があります。または、システムを休止状態にすると、ウェイクアップ時にGPUがリセットされ、GPUメモリスライスの内容が破損します。しかしOpenGLはアプリケーションがいつでもそのオブジェクトを使用できることを保証しなければなりません。したがって、各オブジェクトのコピーがシステムメモリに保持されます。 – datenwolf