AnimTestbed/3rdparty/ozz-animation/samples/framework/profile.cc

118 lines
4.2 KiB
C++

//----------------------------------------------------------------------------//
// //
// ozz-animation is hosted at http://github.com/guillaumeblanc/ozz-animation //
// and distributed under the MIT License (MIT). //
// //
// Copyright (c) Guillaume Blanc //
// //
// Permission is hereby granted, free of charge, to any person obtaining a //
// copy of this software and associated documentation files (the "Software"), //
// to deal in the Software without restriction, including without limitation //
// the rights to use, copy, modify, merge, publish, distribute, sublicense, //
// and/or sell copies of the Software, and to permit persons to whom the //
// Software is furnished to do so, subject to the following conditions: //
// //
// The above copyright notice and this permission notice shall be included in //
// all copies or substantial portions of the Software. //
// //
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR //
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, //
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL //
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER //
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING //
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER //
// DEALINGS IN THE SOFTWARE. //
// //
//----------------------------------------------------------------------------//
#define OZZ_INCLUDE_PRIVATE_HEADER // Allows to include private headers.
#include "framework/profile.h"
#include "framework/internal/renderer_impl.h"
#include <cfloat>
#include <cmath>
#include "ozz/base/memory/allocator.h"
namespace ozz {
namespace sample {
Profiler::Profiler(Record* _record)
: begin_(static_cast<float>(glfwGetTime())), record_(_record) {}
Profiler::~Profiler() {
if (record_) {
float end = static_cast<float>(glfwGetTime());
record_->Push((end - begin_) * 1000.f);
}
}
Record::Record(int _max_records)
: max_records_(_max_records < 1 ? 1 : _max_records),
records_end_(
reinterpret_cast<float*>(memory::default_allocator()->Allocate(
_max_records * sizeof(float), alignof(float))) +
max_records_),
records_begin_(records_end_),
cursor_(records_end_) {}
Record::~Record() {
memory::default_allocator()->Deallocate(records_end_ - max_records_);
}
void Record::Push(float _value) {
if (records_begin_ + max_records_ == records_end_) {
if (cursor_ == records_begin_) { // Looping...
cursor_ = records_begin_ + max_records_;
}
} else {
// The buffer is not full yet.
records_begin_--;
}
--cursor_;
*cursor_ = _value;
}
Record::Statistics Record::GetStatistics() {
Statistics statistics = {FLT_MAX, -FLT_MAX, 0.f, 0.f};
if (records_begin_ == records_end_) { // No record.
return statistics;
}
// Computes statistics.
float sum = 0.f;
const float* current = cursor_;
const float* end = records_end_;
while (current < end) {
if (*current < statistics.min) {
statistics.min = *current;
}
if (*current > statistics.max) {
statistics.max = *current;
}
sum += *current;
++current;
if (current == records_end_) { // Looping...
end = cursor_;
current = records_begin_;
}
}
// Stores outputs.
/*
int exponent;
std::frexp(_f, &exponent);
float upper = pow(2.f, exponent);
statistics.max = func(statistics.max);*/
statistics.latest = *cursor_;
statistics.mean = sum / (records_end_ - records_begin_);
return statistics;
}
} // namespace sample
} // namespace ozz