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 CRenderCaptureGL::BeginRender() { if (!m_asyncChecked) { #ifndef HAS_GLES m_asyncSupported = CServiceBroker::GetRenderSystem().IsExtSupported("GL_ARB_pixel_buffer_object"); m_occlusionQuerySupported = CServiceBroker::GetRenderSystem().IsExtSupported("GL_ARB_occlusion_query"); if (m_flags & CAPTUREFLAG_CONTINUOUS) { if (!m_occlusionQuerySupported) CLog::Log(LOGWARNING, "CRenderCaptureGL: GL_ARB_occlusion_query not supported, performance might suffer"); if (!CServiceBroker::GetRenderSystem().IsExtSupported("GL_ARB_pixel_buffer_object")) CLog::Log(LOGWARNING, "CRenderCaptureGL: GL_ARB_pixel_buffer_object not supported, performance might suffer"); if (UseOcclusionQuery()) CLog::Log(LOGWARNING, "CRenderCaptureGL: GL_ARB_occlusion_query disabled, performance might suffer"); } #endif m_asyncChecked = true; } #ifndef HAS_GLES if (m_asyncSupported) { if (!m_pbo) glGenBuffersARB(1, &m_pbo); if (UseOcclusionQuery() && m_occlusionQuerySupported) { //generate an occlusion query if we don't have one if (!m_query) glGenQueriesARB(1, &m_query); } else { //don't use an occlusion query, clean up any old one if (m_query) { glDeleteQueriesARB(1, &m_query); m_query = 0; } } //start the occlusion query if (m_query) glBeginQueryARB(GL_SAMPLES_PASSED_ARB, m_query); //allocate data on the pbo and pixel buffer glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, m_pbo); if (m_bufferSize != m_width * m_height * 4) { m_bufferSize = m_width * m_height * 4; glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, m_bufferSize, 0, GL_STREAM_READ_ARB); delete[] m_pixels; m_pixels = new uint8_t[m_bufferSize]; } } else #endif { if (m_bufferSize != m_width * m_height * 4) { delete[] m_pixels; m_bufferSize = m_width * m_height * 4; m_pixels = new uint8_t[m_bufferSize]; } } }
void CRenderCaptureGL::BeginRender() { if (!m_asyncChecked) { #ifndef HAS_GLES unsigned int major, minor, glversion; CServiceBroker::GetRenderSystem()->GetRenderVersion(major, minor); glversion = 10 * major + minor; if (glversion >= 21) { m_asyncSupported = true; m_occlusionQuerySupported = true; } else if (glversion > 14) { m_occlusionQuerySupported = true; } else { CLog::Log(LOGWARNING, "CRenderCaptureGL: Occlusion_query not supported, upgrade your GL drivers to support at least GL 2.1"); } if (m_flags & CAPTUREFLAG_CONTINUOUS) { if (!m_occlusionQuerySupported) CLog::Log(LOGWARNING, "CRenderCaptureGL: Occlusion_query not supported, performance might suffer"); if (!CServiceBroker::GetRenderSystem()->IsExtSupported("GL_ARB_pixel_buffer_object")) CLog::Log(LOGWARNING, "CRenderCaptureGL: GL_ARB_pixel_buffer_object not supported, performance might suffer"); if (!UseOcclusionQuery()) CLog::Log(LOGWARNING, "CRenderCaptureGL: GL_ARB_occlusion_query disabled, performance might suffer"); } #endif m_asyncChecked = true; } #ifndef HAS_GLES if (m_asyncSupported) { if (!m_pbo) glGenBuffersARB(1, &m_pbo); if (UseOcclusionQuery() && m_occlusionQuerySupported) { //generate an occlusion query if we don't have one if (!m_query) glGenQueries(1, &m_query); } else { //don't use an occlusion query, clean up any old one if (m_query) { glDeleteQueries(1, &m_query); m_query = 0; } } //start the occlusion query if (m_query) glBeginQuery(GL_SAMPLES_PASSED, m_query); //allocate data on the pbo and pixel buffer glBindBuffer(GL_PIXEL_PACK_BUFFER, m_pbo); if (m_bufferSize != m_width * m_height * 4) { m_bufferSize = m_width * m_height * 4; glBufferData(GL_PIXEL_PACK_BUFFER, m_bufferSize, 0, GL_STREAM_READ); delete[] m_pixels; m_pixels = new uint8_t[m_bufferSize]; } } else #endif { if (m_bufferSize != m_width * m_height * 4) { delete[] m_pixels; m_bufferSize = m_width * m_height * 4; m_pixels = new uint8_t[m_bufferSize]; } } }
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); } }
void CRenderCaptureDX::BeginRender() { LPDIRECT3DDEVICE9 pD3DDevice = g_Windowing.Get3DDevice(); if (!m_asyncChecked) { m_asyncSupported = pD3DDevice->CreateQuery(D3DQUERYTYPE_OCCLUSION, NULL) == D3D_OK; if (m_flags & CAPTUREFLAG_CONTINUOUS) { if (!m_asyncSupported) CLog::Log(LOGWARNING, "CRenderCaptureDX: D3DQUERYTYPE_OCCLUSION not supported, performance might suffer"); if (!UseOcclusionQuery()) CLog::Log(LOGWARNING, "CRenderCaptureDX: D3DQUERYTYPE_OCCLUSION disabled, performance might suffer"); } m_asyncChecked = true; } HRESULT result; if (m_surfaceWidth != m_width || m_surfaceHeight != m_height) { if (m_renderSurface) { while(m_renderSurface->Release() > 0); m_renderSurface = NULL; } if (m_copySurface) { while (m_copySurface->Release() > 0); m_copySurface = NULL; } result = pD3DDevice->CreateRenderTarget(m_width, m_height, D3DFMT_A8R8G8B8, D3DMULTISAMPLE_NONE, 0, TRUE, &m_renderSurface, NULL); if (result != D3D_OK) { CLog::Log(LOGERROR, "CRenderCaptureDX::BeginRender: CreateRenderTarget failed %s", g_Windowing.GetErrorDescription(result).c_str()); SetState(CAPTURESTATE_FAILED); return; } result = pD3DDevice->CreateOffscreenPlainSurface(m_width, m_height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &m_copySurface, NULL); if (result != D3D_OK) { CLog::Log(LOGERROR, "CRenderCaptureDX::BeginRender: CreateOffscreenPlainSurface 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; delete[] m_pixels; m_pixels = new uint8_t[m_bufferSize]; } result = pD3DDevice->SetRenderTarget(0, m_renderSurface); if (result != D3D_OK) { CLog::Log(LOGERROR, "CRenderCaptureDX::BeginRender: SetRenderTarget failed %s", g_Windowing.GetErrorDescription(result).c_str()); SetState(CAPTURESTATE_FAILED); return; } if (m_asyncSupported && UseOcclusionQuery()) { //generate an occlusion query if we don't have one if (!m_query) { result = pD3DDevice->CreateQuery(D3DQUERYTYPE_OCCLUSION, &m_query); if (result != D3D_OK) { CLog::Log(LOGERROR, "CRenderCaptureDX::BeginRender: CreateQuery failed %s", g_Windowing.GetErrorDescription(result).c_str()); m_asyncSupported = false; if (m_query) { while (m_query->Release() > 0); m_query = NULL; } } } } else { //don't use an occlusion query, clean up any old one if (m_query) { while (m_query->Release() > 0); m_query = NULL; } } if (m_query) m_query->Issue(D3DISSUE_BEGIN); }