unsigned int queryVSInvocations(ID3D11Device* device, ID3D11DeviceContext* context, const unsigned int* indices, size_t index_count) { if (index_count == 0) return 0; ID3D11Buffer* ib = 0; { D3D11_BUFFER_DESC bd = {}; bd.Usage = D3D11_USAGE_DYNAMIC; bd.ByteWidth = index_count * 4; bd.BindFlags = D3D11_BIND_INDEX_BUFFER; bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; device->CreateBuffer(&bd, 0, &ib); D3D11_MAPPED_SUBRESOURCE ms; context->Map(ib, 0, D3D11_MAP_WRITE_DISCARD, 0, &ms); memcpy(ms.pData, indices, index_count * 4); context->Unmap(ib, 0); } context->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST); context->IASetIndexBuffer(ib, DXGI_FORMAT_R32_UINT, 0); D3D11_QUERY_DESC qdesc = {D3D11_QUERY_PIPELINE_STATISTICS}; ID3D11Query* query = 0; device->CreateQuery(&qdesc, &query); context->Begin(query); context->DrawIndexed(index_count, 0, 0); context->End(query); D3D11_QUERY_DATA_PIPELINE_STATISTICS stats = {}; while (S_FALSE == context->GetData(query, &stats, sizeof(stats), 0)) ; query->Release(); ib->Release(); assert(stats.IAVertices == index_count); return stats.VSInvocations; }
void D3D11Replay::SerializeImmediateContext() { ID3D11Query *query = 0; D3D11_QUERY_DESC desc = {D3D11_QUERY_EVENT}; HRESULT hr = m_pDevice->CreateQuery(&desc, &query); if(FAILED(hr)) { return; } BOOL completed = FALSE; m_pImmediateContext->End(query); m_pImmediateContext->Flush(); do { hr = m_pImmediateContext->GetData(query, &completed, sizeof(BOOL), 0); if(hr == S_FALSE) { ::Sleep(0); } else if(SUCCEEDED(hr) && completed) { break; } else { // error break; } } while(!completed); query->Release(); }