void CGUITextureGLES::DrawQuad(const CRect &rect, color_t color, CBaseTexture *texture, const CRect *texCoords) { CRenderSystemGLES *renderSystem = dynamic_cast<CRenderSystemGLES*>(&CServiceBroker::GetRenderSystem()); if (texture) { texture->LoadToGPU(); texture->BindToUnit(0); } glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); // Turn Blending On VerifyGLState(); GLubyte col[4]; GLfloat ver[4][3]; GLfloat tex[4][2]; GLubyte idx[4] = {0, 1, 3, 2}; //determines order of triangle strip if (texture) renderSystem->EnableGUIShader(SM_TEXTURE); else renderSystem->EnableGUIShader(SM_DEFAULT); GLint posLoc = renderSystem->GUIShaderGetPos(); GLint tex0Loc = renderSystem->GUIShaderGetCoord0(); GLint uniColLoc= renderSystem->GUIShaderGetUniCol(); glVertexAttribPointer(posLoc, 3, GL_FLOAT, 0, 0, ver); if (texture) glVertexAttribPointer(tex0Loc, 2, GL_FLOAT, 0, 0, tex); glEnableVertexAttribArray(posLoc); if (texture) glEnableVertexAttribArray(tex0Loc); // Setup Colors col[0] = (GLubyte)GET_R(color); col[1] = (GLubyte)GET_G(color); col[2] = (GLubyte)GET_B(color); col[3] = (GLubyte)GET_A(color); glUniform4f(uniColLoc, col[0] / 255.0f, col[1] / 255.0f, col[2] / 255.0f, col[3] / 255.0f); ver[0][0] = ver[3][0] = rect.x1; ver[0][1] = ver[1][1] = rect.y1; ver[1][0] = ver[2][0] = rect.x2; ver[2][1] = ver[3][1] = rect.y2; ver[0][2] = ver[1][2] = ver[2][2] = ver[3][2]= 0; if (texture) { // Setup texture coordinates CRect coords = texCoords ? *texCoords : CRect(0.0f, 0.0f, 1.0f, 1.0f); tex[0][0] = tex[3][0] = coords.x1; tex[0][1] = tex[1][1] = coords.y1; tex[1][0] = tex[2][0] = coords.x2; tex[2][1] = tex[3][1] = coords.y2; } glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, idx); glDisableVertexAttribArray(posLoc); if (texture) glDisableVertexAttribArray(tex0Loc); renderSystem->DisableGUIShader(); }
bool CRendererMediaCodec::RenderHook(int index) { CYuvPlane &plane = m_buffers[index].fields[0][0]; CYuvPlane &planef = m_buffers[index].fields[m_currentField][0]; glDisable(GL_DEPTH_TEST); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_EXTERNAL_OES, plane.id); CRenderSystemGLES* renderSystem = dynamic_cast<CRenderSystemGLES*>(CServiceBroker::GetRenderSystem()); if (m_currentField != FIELD_FULL) { renderSystem->EnableGUIShader(SM_TEXTURE_RGBA_BOB_OES); GLint fieldLoc = renderSystem->GUIShaderGetField(); GLint stepLoc = renderSystem->GUIShaderGetStep(); // Y is inverted, so invert fields if (m_currentField == FIELD_TOP) glUniform1i(fieldLoc, 0); else if(m_currentField == FIELD_BOT) glUniform1i(fieldLoc, 1); glUniform1f(stepLoc, 1.0f / (float)plane.texheight); } else renderSystem->EnableGUIShader(SM_TEXTURE_RGBA_OES); GLint contrastLoc = renderSystem->GUIShaderGetContrast(); glUniform1f(contrastLoc, m_videoSettings.m_Contrast * 0.02f); GLint brightnessLoc = renderSystem->GUIShaderGetBrightness(); glUniform1f(brightnessLoc, m_videoSettings.m_Brightness * 0.01f - 0.5f); glUniformMatrix4fv(renderSystem->GUIShaderGetCoord0Matrix(), 1, GL_FALSE, m_textureMatrix); GLubyte idx[4] = {0, 1, 3, 2}; //determines order of triangle strip GLfloat ver[4][4]; GLfloat tex[4][4]; GLint posLoc = renderSystem->GUIShaderGetPos(); GLint texLoc = renderSystem->GUIShaderGetCoord0(); glVertexAttribPointer(posLoc, 4, GL_FLOAT, 0, 0, ver); glVertexAttribPointer(texLoc, 4, GL_FLOAT, 0, 0, tex); glEnableVertexAttribArray(posLoc); glEnableVertexAttribArray(texLoc); // Set vertex coordinates for(int i = 0; i < 4; i++) { ver[i][0] = m_rotatedDestCoords[i].x; ver[i][1] = m_rotatedDestCoords[i].y; ver[i][2] = 0.0f; // set z to 0 ver[i][3] = 1.0f; } // Set texture coordinates (MediaCodec is flipped in y) if (m_currentField == FIELD_FULL) { tex[0][0] = tex[3][0] = plane.rect.x1; tex[0][1] = tex[1][1] = plane.rect.y2; tex[1][0] = tex[2][0] = plane.rect.x2; tex[2][1] = tex[3][1] = plane.rect.y1; } else { tex[0][0] = tex[3][0] = planef.rect.x1; tex[0][1] = tex[1][1] = planef.rect.y2 * 2.0f; tex[1][0] = tex[2][0] = planef.rect.x2; tex[2][1] = tex[3][1] = planef.rect.y1 * 2.0f; } for(int i = 0; i < 4; i++) { tex[i][2] = 0.0f; tex[i][3] = 1.0f; } glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, idx); glDisableVertexAttribArray(posLoc); glDisableVertexAttribArray(texLoc); const float identity[16] = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }; glUniformMatrix4fv(renderSystem->GUIShaderGetCoord0Matrix(), 1, GL_FALSE, identity); renderSystem->DisableGUIShader(); VerifyGLState(); glBindTexture(GL_TEXTURE_EXTERNAL_OES, 0); VerifyGLState(); return true; }