IRenderBuffer *CBaseRenderBufferPool::GetBuffer(unsigned int width, unsigned int height) { if (!m_bConfigured) return nullptr; IRenderBuffer *renderBuffer = nullptr; void *header = nullptr; if (GetHeaderWithTimeout(header)) { CSingleLock lock(m_bufferMutex); for (auto it = m_free.begin(); it != m_free.end(); ++it) { std::unique_ptr<IRenderBuffer> &buffer = *it; // Only return buffers of the same dimensions const unsigned int bufferWidth = buffer->GetWidth(); const unsigned int bufferHeight = buffer->GetHeight(); if (bufferWidth == width && bufferHeight == height) { renderBuffer = buffer.release(); renderBuffer->SetHeader(header); m_free.erase(it); break; } } if (renderBuffer == nullptr) { CLog::Log(LOGDEBUG, "RetroPlayer[RENDER]: Creating render buffer of size %ux%u for buffer pool", width, height); std::unique_ptr<IRenderBuffer> renderBufferPtr(CreateRenderBuffer(header)); if (renderBufferPtr->Allocate(m_format, width, height)) renderBuffer = renderBufferPtr.release(); else CLog::Log(LOGERROR, "RetroPlayer[RENDER]: Failed to allocate render buffer"); } if (renderBuffer != nullptr) { renderBuffer->Acquire(GetPtr()); renderBuffer->Update(); } } return renderBuffer; }
IRenderBuffer *CBaseRenderBufferPool::GetBuffer(size_t size) { if (!m_bConfigured) return nullptr; // If frame size is unknown, set it now if (m_frameSize == 0) m_frameSize = size; // Changing sizes is not implemented if (m_frameSize != size) return nullptr; IRenderBuffer *renderBuffer = nullptr; void *header = nullptr; if (GetHeaderWithTimeout(header)) { CSingleLock lock(m_bufferMutex); if (!m_free.empty()) { renderBuffer = m_free.front().release(); m_free.pop_front(); renderBuffer->SetHeader(header); } else { CLog::Log(LOGDEBUG, "RetroPlayer[RENDER]: Creating render buffer for buffer pool"); std::unique_ptr<IRenderBuffer> renderBufferPtr(CreateRenderBuffer(header)); if (renderBufferPtr->Allocate(m_format, m_width, m_height, m_frameSize)) renderBuffer = renderBufferPtr.release(); } if (renderBuffer != nullptr) { renderBuffer->Acquire(GetPtr()); renderBuffer->Update(); } } return renderBuffer; }