void GLTransferBuffers::waitMarker(unsigned int uiMarkerValue) { if (m_bUseP2P) { glWaitMarkerAMD(m_pBuffer[m_uiBufferIdx], uiMarkerValue); } }
void GLSink::draw() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Update stream glBindTexture(GL_TEXTURE_2D, m_uiTexture); FrameData* pFrame = NULL; // block until new frame is available m_uiBufferIdx = m_pInputBuffer->getBufferForReading((void*&)pFrame); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, m_pUnPackBuffer[m_uiBufferIdx]); glWaitMarkerAMD(m_pUnPackBuffer[m_uiBufferIdx], pFrame->uiTransferId); // Copy pinned mem to texture glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_uiTextureWidth, m_uiTextureHeight, m_nExtFormat, m_nType, NULL); // Insert fence to determine when we can release the buffer GLsync Fence = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); glPushMatrix(); // Scale quad to the AR of the incoming texture glScalef(m_fAspectRatio, 1.0f, 1.0f); // Draw quad with mapped texture glBindBuffer(GL_ARRAY_BUFFER, m_uiQuad); glDrawArrays(GL_QUADS, 0, 4); glBindBuffer(GL_ARRAY_BUFFER, 0); glPopMatrix(); glBindTexture(GL_TEXTURE_2D, 0); if (glIsSync(Fence)) { glClientWaitSync(Fence, GL_SYNC_FLUSH_COMMANDS_BIT, OneSecond); glDeleteSync(Fence); } m_pInputBuffer->releaseReadBuffer(); }