Cocoa Port:

- Optimize VBO uploading of the HUD layer.
This commit is contained in:
rogerman 2016-02-08 23:53:05 +00:00
parent f68df5b976
commit 65c0eec884
2 changed files with 45 additions and 42 deletions

View File

@ -5752,20 +5752,6 @@ OGLHUDLayer::OGLHUDLayer(OGLVideoOutput *oglVO)
assert(_glyphTileSize <= 128); assert(_glyphTileSize <= 128);
memset(_vtxBuffer, 0, sizeof(_vtxBuffer));
memset(_texCoordBuffer, 0, sizeof(_texCoordBuffer));
memset(_idxBuffer, 0, sizeof(_idxBuffer));
for (size_t i = 0; i < 4096; i++)
{
_idxBuffer[(i*6)+0] = (i*4)+0;
_idxBuffer[(i*6)+1] = (i*4)+1;
_idxBuffer[(i*6)+2] = (i*4)+2;
_idxBuffer[(i*6)+3] = (i*4)+2;
_idxBuffer[(i*6)+4] = (i*4)+3;
_idxBuffer[(i*6)+5] = (i*4)+0;
}
glGenTextures(1, &_texCharMap); glGenTextures(1, &_texCharMap);
// Set up VBOs // Set up VBOs
@ -5774,13 +5760,26 @@ OGLHUDLayer::OGLHUDLayer(OGLVideoOutput *oglVO)
glGenBuffersARB(1, &_vboElementID); glGenBuffersARB(1, &_vboElementID);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, _vboVertexID); glBindBufferARB(GL_ARRAY_BUFFER_ARB, _vboVertexID);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLint) * 4096 * (2 * 4), _vtxBuffer, GL_STATIC_DRAW_ARB); glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLint) * 4096 * (2 * 4), NULL, GL_STREAM_DRAW_ARB);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, _vboTexCoordID); glBindBufferARB(GL_ARRAY_BUFFER_ARB, _vboTexCoordID);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLfloat) * 4096 * (2 * 4), _texCoordBuffer, GL_STATIC_DRAW_ARB); glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLfloat) * 4096 * (2 * 4), NULL, GL_STREAM_DRAW_ARB);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, _vboElementID); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, _vboElementID);
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, sizeof(GLshort) * 4096 * 6, _idxBuffer, GL_STATIC_DRAW_ARB); glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, sizeof(GLshort) * 4096 * 6, NULL, GL_STATIC_DRAW_ARB);
GLshort *idxBufferPtr = (GLshort *)glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
for (size_t i = 0; i < 4096; i++)
{
idxBufferPtr[(i*6)+0] = (i*4)+0;
idxBufferPtr[(i*6)+1] = (i*4)+1;
idxBufferPtr[(i*6)+2] = (i*4)+2;
idxBufferPtr[(i*6)+3] = (i*4)+2;
idxBufferPtr[(i*6)+4] = (i*4)+3;
idxBufferPtr[(i*6)+5] = (i*4)+0;
}
glUnmapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
// Set up VAO // Set up VAO
@ -6111,6 +6110,7 @@ void OGLHUDLayer::_ProcessVerticesOGL()
const size_t length = this->_statusString.length(); const size_t length = this->_statusString.length();
const char *cString = this->_statusString.c_str(); const char *cString = this->_statusString.c_str();
const size_t bufferSize = length * (2 * 4) * sizeof(GLint);
const GLint leftAlignedPosition = 10 - (this->_viewportWidth / 2); const GLint leftAlignedPosition = 10 - (this->_viewportWidth / 2);
const GLint charSize = (float)this->_glyphSize * 0.80f; const GLint charSize = (float)this->_glyphSize * 0.80f;
@ -6118,12 +6118,16 @@ void OGLHUDLayer::_ProcessVerticesOGL()
GLint charLocY = (this->_viewportHeight / 2) - charSize - (this->_glyphTileSize - this->_glyphSize); GLint charLocY = (this->_viewportHeight / 2) - charSize - (this->_glyphTileSize - this->_glyphSize);
GLint textBoxTop = this->_viewportHeight / 2; GLint textBoxTop = this->_viewportHeight / 2;
glBindBufferARB(GL_ARRAY_BUFFER_ARB, this->_vboVertexID);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, bufferSize, NULL, GL_STREAM_DRAW_ARB);
GLint *vtxBufferPtr = (GLint *)glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
// First, calculate the vertices of the text box. // First, calculate the vertices of the text box.
// The text box should always be the first character in the string. // The text box should always be the first character in the string.
this->_vtxBuffer[0] = leftAlignedPosition - 6; this->_vtxBuffer[1] = textBoxTop - 3; vtxBufferPtr[0] = leftAlignedPosition - 6; vtxBufferPtr[1] = textBoxTop - 3;
this->_vtxBuffer[2] = leftAlignedPosition + this->_textBoxWidth; this->_vtxBuffer[3] = textBoxTop - 3; vtxBufferPtr[2] = leftAlignedPosition + this->_textBoxWidth; vtxBufferPtr[3] = textBoxTop - 3;
this->_vtxBuffer[4] = leftAlignedPosition + this->_textBoxWidth; this->_vtxBuffer[5] = textBoxTop - (charSize * this->_textBoxLines) - 8; vtxBufferPtr[4] = leftAlignedPosition + this->_textBoxWidth; vtxBufferPtr[5] = textBoxTop - (charSize * this->_textBoxLines) - 8;
this->_vtxBuffer[6] = leftAlignedPosition - 6; this->_vtxBuffer[7] = textBoxTop - (charSize * this->_textBoxLines) - 8; vtxBufferPtr[6] = leftAlignedPosition - 6; vtxBufferPtr[7] = textBoxTop - (charSize * this->_textBoxLines) - 8;
// Calculate the vertices of the remaining characters in the string. // Calculate the vertices of the remaining characters in the string.
for (size_t i = 1; i < length; i++) for (size_t i = 1; i < length; i++)
@ -6140,15 +6144,14 @@ void OGLHUDLayer::_ProcessVerticesOGL()
const GLint glyphWidth = this->_glyphInfo[c].width; const GLint glyphWidth = this->_glyphInfo[c].width;
const GLint charWidth = (GLfloat)glyphWidth * ((GLfloat)charSize / (GLfloat)this->_glyphTileSize); const GLint charWidth = (GLfloat)glyphWidth * ((GLfloat)charSize / (GLfloat)this->_glyphTileSize);
this->_vtxBuffer[(i*8)+0] = charLocX; this->_vtxBuffer[(i*8)+1] = charLocY + charSize; // Top Left vtxBufferPtr[(i*8)+0] = charLocX; vtxBufferPtr[(i*8)+1] = charLocY + charSize; // Top Left
this->_vtxBuffer[(i*8)+2] = charLocX + charWidth; this->_vtxBuffer[(i*8)+3] = charLocY + charSize; // Top Right vtxBufferPtr[(i*8)+2] = charLocX + charWidth; vtxBufferPtr[(i*8)+3] = charLocY + charSize; // Top Right
this->_vtxBuffer[(i*8)+4] = charLocX + charWidth; this->_vtxBuffer[(i*8)+5] = charLocY; // Bottom Right vtxBufferPtr[(i*8)+4] = charLocX + charWidth; vtxBufferPtr[(i*8)+5] = charLocY; // Bottom Right
this->_vtxBuffer[(i*8)+6] = charLocX; this->_vtxBuffer[(i*8)+7] = charLocY; // Bottom Left vtxBufferPtr[(i*8)+6] = charLocX; vtxBufferPtr[(i*8)+7] = charLocY; // Bottom Left
charLocX += (charWidth + (GLint)(((GLfloat)charSize / 32.0f) + 0.5f)); charLocX += (charWidth + (GLint)(((GLfloat)charSize / 32.0f) + 0.5f));
} }
glBindBufferARB(GL_ARRAY_BUFFER_ARB, this->_vboVertexID); glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, length * (2 * 4) * sizeof(GLint), this->_vtxBuffer);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
} }
@ -6171,16 +6174,20 @@ void OGLHUDLayer::ProcessOGL()
const size_t length = this->_statusString.length(); const size_t length = this->_statusString.length();
const char *cString = this->_statusString.c_str(); const char *cString = this->_statusString.c_str();
const size_t bufferSize = length * (2 * 4) * sizeof(GLfloat);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, this->_vboTexCoordID);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, bufferSize, NULL, GL_STREAM_DRAW_ARB);
GLfloat *texCoordBufferPtr = (GLfloat *)glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
for (size_t i = 0; i < length; i++) for (size_t i = 0; i < length; i++)
{ {
const char c = cString[i]; const char c = cString[i];
GLfloat *texCoord = &this->_texCoordBuffer[i * 8]; GLfloat *texCoord = &texCoordBufferPtr[i * 8];
memcpy(texCoord, this->_glyphInfo[c].texCoord, sizeof(GLfloat) * 8); memcpy(texCoord, this->_glyphInfo[c].texCoord, sizeof(GLfloat) * 8);
} }
glBindBufferARB(GL_ARRAY_BUFFER_ARB, this->_vboTexCoordID); glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, length * (2 * 4) * sizeof(GLfloat), this->_texCoordBuffer);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
this->_ProcessVerticesOGL(); this->_ProcessVerticesOGL();
@ -6264,6 +6271,10 @@ OGLDisplayLayer::OGLDisplayLayer(OGLVideoOutput *oglVO)
_videoSrcCustomBufferHeight[0] = GPU_DISPLAY_HEIGHT; _videoSrcCustomBufferHeight[0] = GPU_DISPLAY_HEIGHT;
_videoSrcCustomBufferHeight[1] = GPU_DISPLAY_HEIGHT; _videoSrcCustomBufferHeight[1] = GPU_DISPLAY_HEIGHT;
// Set up fences for DMA texture uploads
glGenFencesAPPLE(2, _fenceTexUploadNativeID);
glGenFencesAPPLE(2, _fenceTexUploadCustomID);
// Set up textures // Set up textures
glGenTextures(2, _texCPUFilterDstID); glGenTextures(2, _texCPUFilterDstID);
glGenTextures(2, _texVideoInputDataNativeID); glGenTextures(2, _texVideoInputDataNativeID);
@ -6315,10 +6326,6 @@ OGLDisplayLayer::OGLDisplayLayer(OGLVideoOutput *oglVO)
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);
// Set up fences for DMA texture uploads
glGenFencesAPPLE(2, _fenceTexUploadNativeID);
glGenFencesAPPLE(2, _fenceTexUploadCustomID);
// Set up VBOs // Set up VBOs
glGenBuffersARB(1, &_vboVertexID); glGenBuffersARB(1, &_vboVertexID);
glGenBuffersARB(1, &_vboTexCoordID); glGenBuffersARB(1, &_vboTexCoordID);
@ -6422,9 +6429,6 @@ OGLDisplayLayer::~OGLDisplayLayer()
_isVAOPresent = false; _isVAOPresent = false;
} }
glDeleteFencesAPPLE(2, _fenceTexUploadNativeID);
glDeleteFencesAPPLE(2, _fenceTexUploadCustomID);
glDeleteBuffersARB(1, &this->_vboVertexID); glDeleteBuffersARB(1, &this->_vboVertexID);
glDeleteBuffersARB(1, &this->_vboTexCoordID); glDeleteBuffersARB(1, &this->_vboTexCoordID);
glDeleteBuffersARB(1, &this->_vboElementID); glDeleteBuffersARB(1, &this->_vboElementID);
@ -6440,6 +6444,9 @@ OGLDisplayLayer::~OGLDisplayLayer()
glDeleteTextures(1, &this->_texHQ4xLUT); glDeleteTextures(1, &this->_texHQ4xLUT);
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
glDeleteFencesAPPLE(2, _fenceTexUploadNativeID);
glDeleteFencesAPPLE(2, _fenceTexUploadCustomID);
if (_canUseShaderOutput) if (_canUseShaderOutput)
{ {
glUseProgram(0); glUseProgram(0);

View File

@ -301,10 +301,6 @@ protected:
OGLShaderProgram *_program; OGLShaderProgram *_program;
GLint _vtxBuffer[4096 * (2 * 4)];
GLfloat _texCoordBuffer[4096 * (2 * 4)];
GLshort _idxBuffer[4096 * 6];
bool _isVAOPresent; bool _isVAOPresent;
bool _canUseShaderOutput; bool _canUseShaderOutput;