mirror of
https://thingvellir.net/git/overte
synced 2025-03-27 23:52:03 +01:00
Add simple optim and instrumentation for tthe number of input buffer changes per frame"
This commit is contained in:
parent
8344cb9aff
commit
ce86e94e6f
4 changed files with 25 additions and 29 deletions
|
@ -781,25 +781,6 @@ void FBXReader::buildModelMesh(FBXMesh& extractedMesh, const QString& url) {
|
||||||
attribChannel = 2;
|
attribChannel = 2;
|
||||||
|
|
||||||
totalAttribBufferSize = totalVertsSize - positionsSize - normalsAndTangentsSize;
|
totalAttribBufferSize = totalVertsSize - positionsSize - normalsAndTangentsSize;
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
auto posBuffer = std::make_shared<gpu::Buffer>();
|
|
||||||
posBuffer->setData(positionsSize, (const gpu::Byte*) vertBuffer->getData() + positionsOffset);
|
|
||||||
vertexBufferStream->addBuffer(posBuffer, 0, positionElement.getSize());
|
|
||||||
|
|
||||||
// update channels and attribBuffer size accordingly
|
|
||||||
interleavePositions = false;
|
|
||||||
|
|
||||||
auto tangentBuffer = std::make_shared<gpu::Buffer>();
|
|
||||||
tangentBuffer->setData(normalsAndTangentsSize, (const gpu::Byte*) vertBuffer->getData() + normalsAndTangentsOffset);
|
|
||||||
vertexBufferStream->addBuffer(tangentBuffer, 0, normalsAndTangentsStride);
|
|
||||||
|
|
||||||
interleaveNormalsTangents = false;
|
|
||||||
|
|
||||||
tangentChannel = 1;
|
|
||||||
attribChannel = 2;
|
|
||||||
|
|
||||||
totalAttribBufferSize = totalVertsSize - positionsSize - normalsAndTangentsSize;*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Define the vertex format, compute the offset for each attributes as we append them to the vertex format
|
// Define the vertex format, compute the offset for each attributes as we append them to the vertex format
|
||||||
|
@ -813,9 +794,9 @@ void FBXReader::buildModelMesh(FBXMesh& extractedMesh, const QString& url) {
|
||||||
}
|
}
|
||||||
if (normalsSize) {
|
if (normalsSize) {
|
||||||
vertexFormat->setAttribute(gpu::Stream::NORMAL, tangentChannel, normalElement, bufOffset);
|
vertexFormat->setAttribute(gpu::Stream::NORMAL, tangentChannel, normalElement, bufOffset);
|
||||||
bufOffset = normalElement.getSize();
|
bufOffset += normalElement.getSize();
|
||||||
vertexFormat->setAttribute(gpu::Stream::TANGENT, tangentChannel, normalElement, bufOffset);
|
vertexFormat->setAttribute(gpu::Stream::TANGENT, tangentChannel, normalElement, bufOffset);
|
||||||
bufOffset = normalElement.getSize();
|
bufOffset += normalElement.getSize();
|
||||||
if (!interleaveNormalsTangents) {
|
if (!interleaveNormalsTangents) {
|
||||||
bufOffset = 0;
|
bufOffset = 0;
|
||||||
}
|
}
|
||||||
|
@ -895,7 +876,7 @@ void FBXReader::buildModelMesh(FBXMesh& extractedMesh, const QString& url) {
|
||||||
vertexBufferStream->addBuffer(attribBuffer, 0, vStride);
|
vertexBufferStream->addBuffer(attribBuffer, 0, vStride);
|
||||||
}
|
}
|
||||||
|
|
||||||
// MEsh vertex format and vertex stream is ready
|
// Mesh vertex format and vertex stream is ready
|
||||||
mesh->setVertexFormatAndStream(vertexFormat, vertexBufferStream);
|
mesh->setVertexFormatAndStream(vertexFormat, vertexBufferStream);
|
||||||
|
|
||||||
// Index and Part Buffers
|
// Index and Part Buffers
|
||||||
|
|
|
@ -268,9 +268,18 @@ void GLBackend::updateInput() {
|
||||||
auto offset = _input._bufferOffsets.data();
|
auto offset = _input._bufferOffsets.data();
|
||||||
auto stride = _input._bufferStrides.data();
|
auto stride = _input._bufferStrides.data();
|
||||||
|
|
||||||
|
// Profile the count of buffers to update and use it to short cut the for loop
|
||||||
|
int numInvalids = _input._invalidBuffers.count();
|
||||||
|
_stats._ISNumInputBufferChanges += numInvalids;
|
||||||
|
PROFILE_COUNTER_IF_CHANGED(render_gpu, "numInputBuffersbound", int, numInvalids);
|
||||||
|
|
||||||
for (GLuint buffer = 0; buffer < _input._buffers.size(); buffer++, vbo++, offset++, stride++) {
|
for (GLuint buffer = 0; buffer < _input._buffers.size(); buffer++, vbo++, offset++, stride++) {
|
||||||
if (_input._invalidBuffers.test(buffer)) {
|
if (_input._invalidBuffers.test(buffer)) {
|
||||||
glBindVertexBuffer(buffer, (*vbo), (*offset), (GLsizei)(*stride));
|
glBindVertexBuffer(buffer, (*vbo), (*offset), (GLsizei)(*stride));
|
||||||
|
numInvalids--;
|
||||||
|
if (numInvalids <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -78,7 +78,10 @@ void GL41Backend::updateInput() {
|
||||||
|
|
||||||
const Stream::Format::AttributeMap& attributes = _input._format->getAttributes();
|
const Stream::Format::AttributeMap& attributes = _input._format->getAttributes();
|
||||||
auto& inputChannels = _input._format->getChannels();
|
auto& inputChannels = _input._format->getChannels();
|
||||||
_stats._ISNumInputBufferChanges++;
|
_stats._ISNumInputBufferChanges += _input._invalidBuffers.count();
|
||||||
|
|
||||||
|
// Profile the count of buffers to update
|
||||||
|
PROFILE_COUNTER_IF_CHANGED(render_gpu, "numInputBuffersbound", int, _input._invalidBuffers.count());
|
||||||
|
|
||||||
GLuint boundVBO = 0;
|
GLuint boundVBO = 0;
|
||||||
for (auto& channelIt : inputChannels) {
|
for (auto& channelIt : inputChannels) {
|
||||||
|
|
|
@ -27,8 +27,6 @@ void GL45Backend::resetInputStage() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void GL45Backend::updateInput() {
|
void GL45Backend::updateInput() {
|
||||||
// PROFILE_RANGE(render_gpu, __FUNCTION__);
|
|
||||||
|
|
||||||
bool isStereoNow = isStereo();
|
bool isStereoNow = isStereo();
|
||||||
// track stereo state change potentially happening wihtout changing the input format
|
// track stereo state change potentially happening wihtout changing the input format
|
||||||
// this is a rare case requesting to invalid the format
|
// this is a rare case requesting to invalid the format
|
||||||
|
@ -131,21 +129,26 @@ void GL45Backend::updateInput() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_input._invalidBuffers.any()) {
|
if (_input._invalidBuffers.any()) {
|
||||||
// PROFILE_RANGE(render_gpu, "bindInputBuffers");
|
|
||||||
auto vbo = _input._bufferVBOs.data();
|
auto vbo = _input._bufferVBOs.data();
|
||||||
auto offset = _input._bufferOffsets.data();
|
auto offset = _input._bufferOffsets.data();
|
||||||
auto stride = _input._bufferStrides.data();
|
auto stride = _input._bufferStrides.data();
|
||||||
|
|
||||||
int numSet = 0;
|
// Profile the count of buffers to update and use it to short cut the for loop
|
||||||
|
int numInvalids = _input._invalidBuffers.count();
|
||||||
|
_stats._ISNumInputBufferChanges += numInvalids;
|
||||||
|
PROFILE_COUNTER_IF_CHANGED(render_gpu, "numInputBuffersbound", int, numInvalids);
|
||||||
|
|
||||||
auto numBuffers = _input._buffers.size();
|
auto numBuffers = _input._buffers.size();
|
||||||
for (GLuint buffer = 0; buffer < numBuffers; buffer++, vbo++, offset++, stride++) {
|
for (GLuint buffer = 0; buffer < numBuffers; buffer++, vbo++, offset++, stride++) {
|
||||||
if (_input._invalidBuffers.test(buffer)) {
|
if (_input._invalidBuffers.test(buffer)) {
|
||||||
glBindVertexBuffer(buffer, (*vbo), (*offset), (GLsizei)(*stride));
|
glBindVertexBuffer(buffer, (*vbo), (*offset), (GLsizei)(*stride));
|
||||||
numSet++;
|
numInvalids--;
|
||||||
|
if (numInvalids <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PROFILE_COUNTER_IF_CHANGED(render_gpu, "numVBSbound", int, numSet);
|
|
||||||
|
|
||||||
_input._invalidBuffers.reset();
|
_input._invalidBuffers.reset();
|
||||||
(void)CHECK_GL_ERROR();
|
(void)CHECK_GL_ERROR();
|
||||||
|
|
Loading…
Reference in a new issue