Merge "Reduce hwui CPU time by using glDrawRangeElements"

This commit is contained in:
Treehugger Robot
2017-05-05 18:50:11 +00:00
committed by Gerrit Code Review
3 changed files with 15 additions and 3 deletions

View File

@@ -112,6 +112,7 @@ public:
} vertices; } vertices;
int elementCount; int elementCount;
int vertexCount; // only used for meshes (for glDrawRangeElements)
TextureVertex mappedVertices[4]; TextureVertex mappedVertices[4];
} mesh; } mesh;

View File

@@ -210,6 +210,7 @@ GlopBuilder& GlopBuilder::setMeshVertexBuffer(const VertexBuffer& vertexBuffer)
alphaVertex ? kAlphaVertexStride : kVertexStride }; alphaVertex ? kAlphaVertexStride : kVertexStride };
mOutGlop->mesh.elementCount = indices mOutGlop->mesh.elementCount = indices
? vertexBuffer.getIndexCount() : vertexBuffer.getVertexCount(); ? vertexBuffer.getIndexCount() : vertexBuffer.getVertexCount();
mOutGlop->mesh.vertexCount = vertexBuffer.getVertexCount(); // used for glDrawRangeElements()
return *this; return *this;
} }

View File

@@ -364,18 +364,28 @@ void RenderState::render(const Glop& glop, const Matrix4& orthoMatrix) {
const GLbyte* vertexData = static_cast<const GLbyte*>(vertices.position); const GLbyte* vertexData = static_cast<const GLbyte*>(vertices.position);
while (elementsCount > 0) { while (elementsCount > 0) {
GLsizei drawCount = std::min(elementsCount, (GLsizei) kMaxNumberOfQuads * 6); GLsizei drawCount = std::min(elementsCount, (GLsizei) kMaxNumberOfQuads * 6);
GLsizei vertexCount = (drawCount / 6) * 4;
meshState().bindPositionVertexPointer(vertexData, vertices.stride); meshState().bindPositionVertexPointer(vertexData, vertices.stride);
if (vertices.attribFlags & VertexAttribFlags::TextureCoord) { if (vertices.attribFlags & VertexAttribFlags::TextureCoord) {
meshState().bindTexCoordsVertexPointer( meshState().bindTexCoordsVertexPointer(
vertexData + kMeshTextureOffset, vertices.stride); vertexData + kMeshTextureOffset, vertices.stride);
} }
glDrawElements(mesh.primitiveMode, drawCount, GL_UNSIGNED_SHORT, nullptr); if (mCaches->extensions().getMajorGlVersion() >= 3) {
glDrawRangeElements(mesh.primitiveMode, 0, vertexCount-1, drawCount, GL_UNSIGNED_SHORT, nullptr);
} else {
glDrawElements(mesh.primitiveMode, drawCount, GL_UNSIGNED_SHORT, nullptr);
}
elementsCount -= drawCount; elementsCount -= drawCount;
vertexData += (drawCount / 6) * 4 * vertices.stride; vertexData += vertexCount * vertices.stride;
} }
} else if (indices.bufferObject || indices.indices) { } else if (indices.bufferObject || indices.indices) {
glDrawElements(mesh.primitiveMode, mesh.elementCount, GL_UNSIGNED_SHORT, indices.indices); if (mCaches->extensions().getMajorGlVersion() >= 3) {
// use glDrawRangeElements to reduce CPU overhead (otherwise the driver has to determine the min/max index values)
glDrawRangeElements(mesh.primitiveMode, 0, mesh.vertexCount-1, mesh.elementCount, GL_UNSIGNED_SHORT, indices.indices);
} else {
glDrawElements(mesh.primitiveMode, mesh.elementCount, GL_UNSIGNED_SHORT, indices.indices);
}
} else { } else {
glDrawArrays(mesh.primitiveMode, 0, mesh.elementCount); glDrawArrays(mesh.primitiveMode, 0, mesh.elementCount);
} }