某些設備上顯存是內存的一部分,這時OpenGL能否直接使用內存中的紋理?

在某些設備上(如Tegra TK1),顯存是內存的一部分,能否讓OpenGL直接使用內存中的紋理從而避免glTexStorage2D, glTexImage2D之類的調用?


不能。

1. 即便一體的內存,仍有一塊區域是GPU使用最趁手的,通常叫做carve out。

2. 在API層面你仍然只能map/unmap。至於驅動如何實現這個,你管不著。

欲知更多細節,請見 UMA的優勢與限制

補充一點,xbox 360上,可以p = new char[xxx]; 然後賦給texture,作為紋理的內存。這是需要不同的api。


你為啥需要這麼做呢...我想到了各種map/unmap,但是GLES能不能這麼幹不了解


這麼說吧,主機廠商為了壓成本(或者說:讓消費者可以在有限的價格內享受到最優質的遊戲體驗)什麼都乾的出來。統一內存這事情遊戲機史上就有這麼乾的,比如 Atari Jaguar 這個神奇的主機,它的三個大晶元是這樣的:

  • "Tom" Chip, 26.59 MHz
    • Graphics processing unit (GPU) – 32-bitRISC architecture, 4 KB internal cache, all graphics effects are software based.
      • Core has some additional instructions intended for 3D operations
    • Object Processor – 64-bit non-programmable; provides all video output from system.
    • Blitter – 64-bit high speed logic operations, z-buffering and Gouraud shading, with 64-bit internal registers.
    • DRAM controller, 8, 16, 32 and 64-bit memory management
  • "Jerry" Chip, 26.59 MHz
    • Digital Signal Processor – 32-bitRISC architecture, 8 KB internal cache
      • Similar RISC core as the GPU, additional instructions intended for audio operations
    • CD-quality sound (16-bit stereo)
      • Number of sound channels limited by software
      • Two DACs (stereo) convert digital data to analog sound signals
      • Full stereo capabilities
    • Wavetable synthesis, FM synthesis, FM Sample synthesis, and AM synthesis
    • A clock control block, incorporating timers, and a UART
    • Joystick control
  • Motorola 68000 "used as a manager".

    • General purpose 16/32-bit control processor, 13.295 MHz

內存在這三個晶元間就是完全對稱的。

不過對於 Tegra,應該不行。


用map就是了

驅動實現上肯定就避免了拷貝


顯存不只是個當前context使用啊,你直接操縱內存,那個內存可能正在被其他context使用。。。

API存在有其目的,還是老老實實用API吧。


不一定行,因為可能只有一部分區域可以被用。而且即便是同一塊內存區域,CPU和GPU所見的地址未必一樣。


可以,現在已經有類似的擴展,chrome有類似的需求,具體查下user ptr,linux下實現也早就有了


推薦閱讀:

Opengl 的片段著色器的Blend的疑惑 片段著色器的Alpha Blend次序?
OpenGL ES 在不同架構上的指令優化是否真的完美?
OpenGL 與 OpenGL ES2 之間有何區別?
請問你用opengl/opengl es做過或者看到過的最酷的作品?

TAG:OpenGL | OpenGLES | 計算機圖形學 |