我有一个没有进行任何实时渲染的DirectX 11.1应用程序。
相反,我只会在应用程序中的某些内容发生更改时进行渲染,获取输出并将其保存到磁盘。
这完全没问题,但不是第一次使用Drawcall。
这里有一些伪代码粗略地列出了我正在做的事情:
// init()
D3D11CreateDevice(...);
dxgidevice1->SetMaximumFrameLatency(0)
createTexture(&rt);
createStagingTexture(&staging);
// render
immediateContext->SetRenderTarget(rt);
immediateContext->DrawIndexed(...);
d3d11Device->CreateQuery(...)
immediateContext->End(query)
immediateContext->Flush();
while(immediateContext->GetData(query) == S_FALSE) { }
// get bytes
immediateContext->CopyResource(staging, rt);
immediateContext->Flush();
immediateContext->Map(staging, &mapped);
memcopy (mapped.pData) // returns all 0 bytes first time
// copy to preview
immediateContext->SetRenderTarget(staging)
immediateContext->Map(..) // constant buffer with shader parameters
immediateContext->Draw(...); // fullscreen quad
memcopy(...)
这完全适用于第二次以及随后的次数,但是,第一次memcopy将返回一个填充零的数组。
如果我将订单更改为
//render
//copy to preview
//get bytes
我仍然得到零
//render
//copy to preview
//render
//get bytes
给我数据。
在实际获得任何结果之前,我似乎必须进行2次绘制调用,现在,如果是这种情况,我可以在应用程序启动时绘制一些空白。但我需要确定这是通过API的设计,而不是随机设备上随机结果的一些侥幸?
有没有人可以对这个问题有所了解?