2 c++ directx directx-11 directxmath visual-studio-2013
好吧我正在开发我自己的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
Run Code Online (Sandbox Code Playgroud)
这是S_SHADER.h的第33行:
bool Render(ID3D11DeviceContext*, int, XMMATRIX, XMMATRIX, XMMATRIX);
Run Code Online (Sandbox Code Playgroud)
这是S_SHADER.h的第40行:
bool SetSHaderParameters(ID3D11DeviceContext*, XMMATRIX, XMMATRIX, XMMATRIX);
Run Code Online (Sandbox Code Playgroud)
这是S_SHADER.cpp的第42行:
41 - bool S_SHADER::Render(ID3D11DeviceContext* deviceContext, int indexCount, DirectX::XMMATRIX worldMatrix, DirectX::XMMATRIX viewMatrix, DirectX::XMMATRIX projectionMatrix)
42 - {
Run Code Online (Sandbox Code Playgroud)
实际上41有所有代码,42只有开括号,反正我做错了什么?
编辑: 不要认为这将有所帮助,但我有一个Windows 7 64位计算机与visual studio 2013
事实证明这是相当复杂的,并且在MSDN上有所涉及.
简短的回答是你需要使用与x86 __fastcall,x64 __fastcall,ARM __fastcall和新的VS 2013 x86/x64 __vectorcall的各种组合一起使用的调用约定友好typedef.
"理想"的解决方案是:
bool XM_CALLCONV Render(ID3D11DeviceContext*, int, FXMMATRIX, CXMMATRIX, CXMMATRIX);
bool XM_CALLCONV SetSHaderParameters(ID3D11DeviceContext*, FXMMATRIX, CXMMATRIX, CXMMATRIX);
Run Code Online (Sandbox Code Playgroud)
您的原始版本实际上将编译为x64本机,但每个XMMATRIX都被压入堆栈并且不会"在寄存器中"传递.x64 native保证堆栈变量的16字节对齐.Win32和ARM没有.
对于x86和x64,VS 2013支持新的调用约定"__vectorcall",它可以传递寄存器中的前六(6)__m128值,包括XMMATRIX等异构向量聚合(HVAs).但是,任何不适合寄存器的内容都应该通过'const reference'而不是'value'来传递.
对于VS 2012及更低版本,x86 __fastcall将寄存器中的前三(3)个__m128值传递,但不能传递寄存器中的HVAs.由于堆栈变量的自然对齐,其余部分必须通过'const reference'而不是'value'传递.
对于VS 2012及更低版本,x64 __fastcall永远不会在寄存器中传递__m128值.虽然堆栈的自然对齐允许XMVECTOR和XMMATRIX通过'value'作为堆栈上的副本传递,但是通过'const reference'传递可能更有效.
对于ARM,__ fastcall传递寄存器中的前四(4)__n128个值,并支持HVA.在这种情况下,那将是一个XMMATRIX.
因此DirectXMath的使用的惯例FXMVECTOR,GXMVECTOR,HXMVECTOR,CXMVECTOR,FXMMATRIX,和CXMMATRIX为参数而不是使用XMVECTOR或XMMATRIX直接.起初这可能有点复杂,但是由于编译器会像你在Win32中看到的那样抱怨,你可以通过一些试验和(编译器)错误来解决异常或复杂的情况.
或者,您不必担心向量和矩阵值的"最佳"寄存器传递行为,只需选择简单的内容:
bool Render(ID3D11DeviceContext*, int, const XMMATRIX&, const XMMATRIX&, const XMMATRIX&);
bool SetSHaderParameters(ID3D11DeviceContext*, const XMMATRIX&, const XMMATRIX&, const XMMATRIX&);
Run Code Online (Sandbox Code Playgroud)
这应该适用于所有体系结构和调用约定.
| 归档时间: |
|
| 查看次数: |
4597 次 |
| 最近记录: |