DirectX::XMMATRIX 错误 C2719:__declspec(align('16')) 不会对齐



好的,所以我在自己的DirectX框架上工作,所有关于制作DirectX框架的教程都是旧的,并且使用废弃的东西,所以我只是做了自己的一个,尽管我从旧教程中拿走了一些东西,并更新了它们以与新的Windows 8.1 SDK一起工作问题来了,我得到XMMATRIX的错误,原始代码使用D3DXMATRIX

(33): error C2719: 'unnamed-parameter': formal parameter with __declspec(align('16')) won't be aligned
(40): error C2719: 'unnamed-parameter': formal parameter with __declspec(align('16')) won't be aligned
(42): error C2719: 'worldMatrix': formal parameter with __declspec(align('16')) won't be aligned
(42): error C2719: 'viewMatrix': formal parameter with __declspec(align('16')) won't be aligned
(42): error C2719: 'projectionMatrix': formal parameter with __declspec(align('16')) won't be aligned

这是S_SHADER.h中的第33行:

bool Render(ID3D11DeviceContext*, int, XMMATRIX, XMMATRIX, XMMATRIX);
这是S_SHADER.h中的第40行:
bool SetSHaderParameters(ID3D11DeviceContext*, XMMATRIX, XMMATRIX, XMMATRIX);

,这是S_SHADER.cpp中的第42行:

41 - bool S_SHADER::Render(ID3D11DeviceContext* deviceContext, int indexCount, DirectX::XMMATRIX worldMatrix,  DirectX::XMMATRIX viewMatrix, DirectX::XMMATRIX projectionMatrix)
42 - {

实际上41有所有的代码和42只有左括号,无论如何,我做错了什么?

编辑:

我不认为这会有帮助,但是我有一台Windows 7 64位计算机,使用visual studio 2013

这是相当复杂的,并且在MSDN中有涉及。

简短的回答是你需要使用调用约定友好的类型定义,这些类型定义可以与x86 __fastcall, x64 __fastcall, ARM __fastcall和新的VS 2013 x86/x64 __vectorcall的各种组合一起工作。

理想的解决方案是:

bool XM_CALLCONV Render(ID3D11DeviceContext*, int, FXMMATRIX, CXMMATRIX, CXMMATRIX);
bool XM_CALLCONV SetSHaderParameters(ID3D11DeviceContext*, FXMMATRIX, CXMMATRIX, CXMMATRIX);

您的原始版本实际上可以为x64本机编译,但是每个XMMATRIX都被压入堆栈,而不是传递"in-register"。X64本机保证堆栈变量的16字节对齐。Win32和ARM不支持。

对于x86和x64, VS 2013支持一个新的调用约定"__vectorcall",它可以在寄存器中传递前六(6)个__m128值,包括异构向量聚合(hva),如XMMATRIX。然而,任何不适合寄存器的东西都应该通过const reference传递,而不是通过value传递。

对于VS 2012及以下版本,x86 __fastcall在寄存器中传递前三(3)个__m128值,但不能在寄存器中传递hva。由于堆栈变量的自然对齐,其余的必须通过'const reference'而不是'value'传递。

对于VS 2012及以下版本,x64 __fastcall永远不会在寄存器中传递__m128值。虽然堆栈的自然对齐允许XMVECTOR和XMMATRIX作为堆栈上的副本通过'value'传递,但通过'const reference'传递可能更有效。

对于ARM, __fastcall在寄存器中传递前四(4)个__n128值,并支持HVA。在本例中,它将是一个XMMATRIX。

因此DirectXMath使用FXMVECTOR, GXMVECTOR, HXMVECTOR, CXMVECTOR, FXMMATRIXCXMMATRIX作为参数的惯例,而不是直接使用XMVECTORXMMATRIX。这一开始可能有点复杂,但由于编译器会报错,就像你在Win32中看到的那样,你可以通过一点尝试和(编译器)错误来解决不寻常或复杂的情况。

或者,你可以不用担心"最优"的寄存器传递向量和矩阵值的行为,只是选择一些简单的东西,如:

bool Render(ID3D11DeviceContext*, int, const XMMATRIX&, const XMMATRIX&, const XMMATRIX&);
bool SetSHaderParameters(ID3D11DeviceContext*, const XMMATRIX&, const XMMATRIX&, const XMMATRIX&);

这应该可以很好地跨所有的架构和调用约定。

相关内容

  • 没有找到相关文章

最新更新