确定内存中已编译着色器的大小

问题描述 投票:0回答:3

一旦在 OpenGL 或 DirectX 中运行时编译了顶点着色器,是否可以确定其在 GPU 内存中的占用空间?

opengl memory graphics directx shader
3个回答
4
投票

在 OpenGL 中,您可以将

glGetProgramiv
GL_PROGRAM_BINARY_LENGTH
一起使用(文档此处)。这是
glGetProgramBinary
返回的程序长度 - 它可能无法反映 GPU 内存中的实际占用空间。


4
投票

虽然我仍然很好奇为什么你需要这个,但我认为,只有驱动程序知道着色器二进制文件如何准确地上传到设备(哪些部分?何时?是否上传?一次或一个一个地上传所有着色器?)。无法通过 OpenGL 和 DirectX 等高级 API 来估计着色器的设备内存占用量。您甚至不知道它在哪个时间点到达设备内存。如果它真的得到了。

您仍然可以在 CPU 端获取二进制文件的大小,以了解我们正在讨论的数字。

  • 在 DirectX 中,您可以通过调用其

    ID3DBlob
    方法,从
    D3DCompile()
    函数返回的
    ID3DBlob::GetBufferSize()
    查询二进制文件的大小。示例(为了清楚起见,省略了错误检查):

    ID3DBlob* pBinary = 0;
    D3DCompile(..., &pBinary, &pErrorMsgs);
    size_t binarySize = pBinary->GetBufferSize();
    
  • 在OpenGL中,您可以将

    glGetProgramiv()
    函数与
    GL_PROGRAM_BINARY_LENGTH
    一起使用,如GuyRT的答案中所述。示例(为了清楚起见,省略了错误检查):

    GLint binarySize = 0;
    glGetProgramiv(programId, GL_PROGRAM_BINARY_LENGTH, &binarySize);
    

希望有帮助!


0
投票

不幸的是 - 截至我在 2024 年的测试 - 所有上述关于 GL_PROGRAM_BINARY_LENGTH 的建议都不再有效(至少在 Nvidia 硬件上)。每次都会收到“INVALID ENUMERANT”错误。

© www.soinside.com 2019 - 2024. All rights reserved.