gl::Error Query11::resume() { if (mActiveQuery.query == nullptr) { gl::Error error = flush(false); if (error.isError()) { return error; } D3D11_QUERY_DESC queryDesc; queryDesc.Query = gl_d3d11::ConvertQueryType(getType()); queryDesc.MiscFlags = 0; ID3D11Device *device = mRenderer->getDevice(); HRESULT result = device->CreateQuery(&queryDesc, &mActiveQuery.query); if (FAILED(result)) { return gl::Error(GL_OUT_OF_MEMORY, "Internal query creation failed, result: 0x%X.", result); } // If we are doing time elapsed we also need a query to actually query the timestamp if (getType() == GL_TIME_ELAPSED_EXT) { D3D11_QUERY_DESC desc; desc.Query = D3D11_QUERY_TIMESTAMP; desc.MiscFlags = 0; result = device->CreateQuery(&desc, &mActiveQuery.beginTimestamp); if (FAILED(result)) { return gl::Error(GL_OUT_OF_MEMORY, "Internal query creation failed, result: 0x%X.", result); } result = device->CreateQuery(&desc, &mActiveQuery.endTimestamp); if (FAILED(result)) { return gl::Error(GL_OUT_OF_MEMORY, "Internal query creation failed, result: 0x%X.", result); } } ID3D11DeviceContext *context = mRenderer->getDeviceContext(); context->Begin(mActiveQuery.query); // If we are doing time elapsed, query the begin timestamp if (getType() == GL_TIME_ELAPSED_EXT) { context->End(mActiveQuery.beginTimestamp); } } return gl::Error(GL_NO_ERROR); }
Microsoft::WRL::ComPtr< ID3D11Query > Profiler::createDisjointQuery( ID3D11Device& device ) { D3D11_QUERY_DESC desc; ZeroMemory( &desc, sizeof( desc ) ); desc.Query = D3D11_QUERY_TIMESTAMP_DISJOINT; ComPtr< ID3D11Query > query; HRESULT result = device.CreateQuery( &desc, query.ReleaseAndGetAddressOf() ); if ( result < 0 ) throw std::exception( "Failed to create a disjoint query." ); return query; }
ComPtr< ID3D11Query > Profiler::createTimestampQuery( ID3D11Device& device ) { D3D11_QUERY_DESC desc; ZeroMemory(&desc, sizeof(desc)); desc.Query = D3D11_QUERY_TIMESTAMP; ComPtr< ID3D11Query > query; HRESULT result = device.CreateQuery( &desc, query.ReleaseAndGetAddressOf() ); if ( result < 0 ) throw std::exception( "Failed to create a timestamp query." ); return query; }
void OsdD3D11ComputeController::Synchronize() { if (! _query) { ID3D11Device *device = NULL; _deviceContext->GetDevice(&device); assert(device); D3D11_QUERY_DESC desc; desc.Query = D3D11_QUERY_EVENT; desc.MiscFlags = 0; device->CreateQuery(&desc, &_query); } _deviceContext->Flush(); _deviceContext->End(_query); while (S_OK != _deviceContext->GetData(_query, NULL, 0, 0)); }
/* static */ void D3D11ComputeEvaluator::Synchronize(ID3D11DeviceContext *deviceContext) { // XXX: this is currently just for the performance measuring purpose. // XXXFIXME! ID3D11Query *query = NULL; ID3D11Device *device = NULL; deviceContext->GetDevice(&device); assert(device); D3D11_QUERY_DESC desc; desc.Query = D3D11_QUERY_EVENT; desc.MiscFlags = 0; device->CreateQuery(&desc, &query); deviceContext->Flush(); deviceContext->End(query); while (S_OK != deviceContext->GetData(query, NULL, 0, 0)); SAFE_RELEASE(query); }
void CRenderCaptureDX::BeginRender() { ID3D11DeviceContext* pContext = DX::DeviceResources::Get()->GetD3DContext(); ID3D11Device* pDevice = DX::DeviceResources::Get()->GetD3DDevice(); CD3D11_QUERY_DESC queryDesc(D3D11_QUERY_EVENT); if (!m_asyncChecked) { m_asyncSupported = SUCCEEDED(pDevice->CreateQuery(&queryDesc, nullptr)); if (m_flags & CAPTUREFLAG_CONTINUOUS) { if (!m_asyncSupported) CLog::Log(LOGWARNING, "%s: D3D11_QUERY_OCCLUSION not supported, performance might suffer.", __FUNCTION__); if (!UseOcclusionQuery()) CLog::Log(LOGWARNING, "%s: D3D11_QUERY_OCCLUSION disabled, performance might suffer.", __FUNCTION__); } m_asyncChecked = true; } HRESULT result; if (m_surfaceWidth != m_width || m_surfaceHeight != m_height) { m_renderTex.Release(); m_copyTex.Release(); if (!m_renderTex.Create(m_width, m_height, 1, D3D11_USAGE_DEFAULT, DXGI_FORMAT_B8G8R8A8_UNORM)) { CLog::LogF(LOGERROR, "CreateTexture2D (RENDER_TARGET) failed."); SetState(CAPTURESTATE_FAILED); return; } if (!m_copyTex.Create(m_width, m_height, 1, D3D11_USAGE_STAGING, DXGI_FORMAT_B8G8R8A8_UNORM)) { CLog::LogF(LOGERROR, "CreateRenderTargetView failed."); SetState(CAPTURESTATE_FAILED); return; } m_surfaceWidth = m_width; m_surfaceHeight = m_height; } if (m_bufferSize != m_width * m_height * 4) { m_bufferSize = m_width * m_height * 4; av_freep(&m_pixels); m_pixels = (uint8_t*)av_malloc(m_bufferSize); } if (m_asyncSupported && UseOcclusionQuery()) { //generate an occlusion query if we don't have one if (!m_query) { result = pDevice->CreateQuery(&queryDesc, &m_query); if (FAILED(result)) { CLog::LogF(LOGERROR, "CreateQuery failed %s", DX::GetErrorDescription(result).c_str()); m_asyncSupported = false; SAFE_RELEASE(m_query); } } } else { //don't use an occlusion query, clean up any old one SAFE_RELEASE(m_query); } }
void CRenderCaptureDX::BeginRender() { ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context(); ID3D11Device* pDevice = g_Windowing.Get3D11Device(); CD3D11_QUERY_DESC queryDesc(D3D11_QUERY_EVENT); if (!m_asyncChecked) { m_asyncSupported = SUCCEEDED(pDevice->CreateQuery(&queryDesc, nullptr)); if (m_flags & CAPTUREFLAG_CONTINUOUS) { if (!m_asyncSupported) CLog::Log(LOGWARNING, "CRenderCaptureDX: D3D11_QUERY_OCCLUSION not supported, performance might suffer"); if (!UseOcclusionQuery()) CLog::Log(LOGWARNING, "CRenderCaptureDX: D3D11_QUERY_OCCLUSION disabled, performance might suffer"); } m_asyncChecked = true; } HRESULT result; if (m_surfaceWidth != m_width || m_surfaceHeight != m_height) { SAFE_RELEASE(m_renderSurface); SAFE_RELEASE(m_copySurface); CD3D11_TEXTURE2D_DESC texDesc(DXGI_FORMAT_B8G8R8A8_UNORM, m_width, m_height, 1, 1, D3D11_BIND_RENDER_TARGET); result = pDevice->CreateTexture2D(&texDesc, nullptr, &m_renderTexture); if (FAILED(result)) { CLog::Log(LOGERROR, "CRenderCaptureDX::BeginRender: CreateTexture2D (RENDER_TARGET) failed %s", g_Windowing.GetErrorDescription(result).c_str()); SetState(CAPTURESTATE_FAILED); return; } CD3D11_RENDER_TARGET_VIEW_DESC rtDesc(D3D11_RTV_DIMENSION_TEXTURE2D); result = pDevice->CreateRenderTargetView(m_renderTexture, &rtDesc, &m_renderSurface); if (FAILED(result)) { CLog::Log(LOGERROR, "CRenderCaptureDX::BeginRender: CreateRenderTargetView failed %s", g_Windowing.GetErrorDescription(result).c_str()); SetState(CAPTURESTATE_FAILED); return; } texDesc.BindFlags = 0; texDesc.Usage = D3D11_USAGE_STAGING; texDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; result = pDevice->CreateTexture2D(&texDesc, nullptr, &m_copySurface); if (FAILED(result)) { CLog::Log(LOGERROR, "CRenderCaptureDX::BeginRender: CreateTexture2D (USAGE_STAGING) failed %s", g_Windowing.GetErrorDescription(result).c_str()); SetState(CAPTURESTATE_FAILED); return; } m_surfaceWidth = m_width; m_surfaceHeight = m_height; } if (m_bufferSize != m_width * m_height * 4) { m_bufferSize = m_width * m_height * 4; av_freep(&m_pixels); m_pixels = (uint8_t*)av_malloc(m_bufferSize); } pContext->OMSetRenderTargets(1, &m_renderSurface, nullptr); if (m_asyncSupported && UseOcclusionQuery()) { //generate an occlusion query if we don't have one if (!m_query) { result = pDevice->CreateQuery(&queryDesc, &m_query); if (FAILED(result)) { CLog::Log(LOGERROR, "CRenderCaptureDX::BeginRender: CreateQuery failed %s", g_Windowing.GetErrorDescription(result).c_str()); m_asyncSupported = false; SAFE_RELEASE(m_query); } } } else { //don't use an occlusion query, clean up any old one SAFE_RELEASE(m_query); } }