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

时间:2014-01-28 00:33:06

标签: opengl memory graphics directx shader

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

2 个答案:

答案 0 :(得分:4)

在OpenGL中,您可以将glGetProgramivGL_PROGRAM_BINARY_LENGTH一起使用(文档here)。这是glGetProgramBinary返回的程序长度 - 它可能无法反映GPU内存中的实际占用空间。

答案 1 :(得分:2)

虽然我仍然很好奇为什么你需要这个,我认为,只有驱动程序才知道shader二进制文件是如何上传到设备的(哪些部分?什么时候?它是上传的?所有着色器一次或一个-一?)。无法从高级API(如OpenGL和DirectX)估计着色器的设备内存占用量。你甚至不知道它到达设备内存的哪个时间点。如果它完全得到它。

仍然可以在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);
    

希望它有所帮助!