标签: video-memory

OpenGL视频内存使用

是否有API或探查器应用程序可以跟踪我的应用程序的视频内存使用情况?

我在Windows上使用C++/OpenGL,但我也对其他平台上的建议持开放态度.

c++ memory opengl profiling video-memory

7
推荐指数
1
解决办法
1416
查看次数

为什么我的视频内存偏移量计算会减一?

我一直在阅读并遵循Nick Blundell从零开始编写操作系统的教程,可以在https://www.cs.bham.ac.uk/~exr/lectures/opsys/10_11/lectures/os-找到dev.pdf

我已经成功编写了一个可以调用C代码的引导加载程序,因此我开始在C中编写内核.我现在正在尝试编写可以在屏幕上打印字符和字符串的函数.当我开始执行C代码时,我处于32位保护模式,所以我试图正确计算视频内存地址0xb8000的内存偏移量.

当我尝试使用计算的偏移量访问视频内存的特定区域时,我的问题就出现了.由于文本区域是25行乘80列,我使用公式((行*80)+列)*2,因为我必须有一个字符字节和一个属性字节.当我设置row = 0和column = 0时,我正在尝试打印的X不存在.设置row = 0和column = 1,X出现在左上角.

从char*video_memory = 0xb8000开始并重复发出video_memory ++允许我正确访问每个字节并在黑色背景上打印空格.

这是我的主要代码:

#include "../drivers/screen.h"

void main() {

   //clear_screen();
   //print_character('X', 0, 0, 0);

   // Helper variables.
   int row;
   int column;

   // We need to point at 0xB8000, where video memory resides.
   unsigned char* video_memory = (unsigned char*)0xB8000;
   for(row = 0; row < 25; row++) {
      for(column = 0; column < 80; column++) {
         // Clear the screen by printing a space on a …
Run Code Online (Sandbox Code Playgroud)

c operating-system video-memory off-by-one

6
推荐指数
1
解决办法
108
查看次数

通过OpenGL编程访问整个视频内存

如何通过OpenGL编程访问显卡的视频内存,具体来说,获取所有内容的视频内存?

我尝试了以下两种方法,但都失败了.将它们连接起来,我希望你能指出我的程序中的错误或我对视频内存结构的理解.提前致谢!

我的基本想法是继续在视频内存中分配一个未初始化的区域,直到探索视频内存的所有内容.

(1)在main函数中,我创建了一个带有双缓冲区的窗口(参见下面的代码).

int main(int argc,char ** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); // double buffers
    glutInitWindowPosition(0,0);
    glutInitWindowSize(windowWidth, windowHeight);
    glutCreateWindow("Hope to be successful!");
    glutDisplayFunc(myDisplay); // call back function "myDisplay"
    glutKeyboardFunc(keyboard);
    glutMainLoop();

    free(PixelData);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后,在"myDisplay"函数中,首先调用glReadPixels()函数从后面的帧缓冲区中读出给定大小的像素矩形,将这些像素信息保存在数组"PixelData"中,最后显示这些像素信息.通过调用glDrawPixels()函数来调整屏幕.执行此程序后,只显示一个黑色窗口.黑色是默认颜色.所以这意味着窗口什么都没有.然后我试图从后面的帧缓冲区中读取其他区域,并且它们都不包含任何内容.

从上面得出的结论是后框架缓冲器中不包含任何内容.但是,这是不合理的,因为前缓冲区应该只包含当前屏幕内容/窗口,因此在屏幕底部打开和最小化的其他窗口应该将其内容放在后面的帧缓冲区中,但后面的帧缓冲区是空的.那些存储了哪些窗口(由我在底部打开并最小化)?

我想为我的程序分配的帧缓冲区(后面和前面)只占整个视频内存的一小部分.因此,那些最小化的窗口内容应该存储在视频存储器的其他位置.

一段时间后,我阅读了OpenGL frameBuffer对象(FBO)的介绍,并且有一句话:默认情况下,OpenGL使用帧缓冲作为完全由窗口系统创建和管理的渲染目标.此默认帧缓冲区称为窗口系统提供的帧缓冲区.这似乎证实了我的上述猜测.

(2)然后我开始研究FBO,希望FBO可以帮助我探索整个视频内存.

在下面的main函数中,我创建了一个FBO和7个渲染缓冲对象(RBO),然后通过颜色附加点将这7个RBO附加到此FBO.

const int RBO_COUNT = 7; //how many renderBuffer objects are created to attach to the frameBuffer object

int main(int argc, char **argv)
{
    ....
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_ALPHA); // display mode
    ...  

    // create a …
Run Code Online (Sandbox Code Playgroud)

opengl fbo video-memory

5
推荐指数
2
解决办法
2598
查看次数

Intel GMA950 私有缓冲区中字节的含义,在 VGA 文本模式下

在文本屏幕(模式 3,80x25)上工作时,位于 B800h 的常用视频缓冲区和接近 4GB 地址空间末尾的线性帧缓冲区 (LFB) 都处于活动状态。我发现对于显示器上的每个字符单元格,LFB 使用8 bytes。第一个字节 (a) 表示 ASCII,第二个字节 (b) 表示属性。

在一个空的显示页面上,这 8 个字节看起来像:

20h,07h,00h,00h,00h,00h,00h,00h
(a) (b) (c) (d) (e) (f) (g) (h)    
Run Code Online (Sandbox Code Playgroud)

有谁知道额外的 6 个字节是做什么用的?我观察到只有这些神秘字节的第一个 (c) 和第五个 (g) 实际上刷新了对我来说似乎是随机的值。其他 4 个字节保持为零,但如果我将任何内容放入其中,即使设置了视频模式,它也能幸存下来。

assembly intel osdev vga video-memory

5
推荐指数
1
解决办法
226
查看次数

显存地址

视频存储器的地址(0xB8000),谁将视频存储器映射到该地址?
从地址复制数据并将其放到屏幕上的例程,这是处理器的内置功能吗(该驱动程序是否随处理器一起提供)?

cpu operating-system kernel processor video-memory

4
推荐指数
1
解决办法
2484
查看次数

报告Direct3D内存使用情况

我有一个Direct3D 9应用程序,我想监视内存使用情况.有没有工具可以知道Direct3D使用了多少系统和视频内存?理想情况下,它还会报告为纹理,顶点缓冲区,索引缓冲区分配了多少......

memory windows direct3d video-memory

1
推荐指数
1
解决办法
4931
查看次数