Merge "Reduce hwui CPU time by using glDrawRangeElements"
This commit is contained in:
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user