You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
2.3 KiB
74 lines
2.3 KiB
|
2 years ago
|
#include <cstddef>
|
||
|
|
|
||
|
|
#include <benchmark/benchmark.h>
|
||
|
|
|
||
|
|
#include "engine/clx_sprite.hpp"
|
||
|
|
#include "engine/displacement.hpp"
|
||
|
|
#include "engine/load_clx.hpp"
|
||
|
|
#include "engine/render/clx_render.hpp"
|
||
|
|
#include "engine/surface.hpp"
|
||
|
|
#include "utils/log.hpp"
|
||
|
|
#include "utils/sdl_wrap.h"
|
||
|
|
|
||
|
|
namespace devilution {
|
||
|
|
namespace {
|
||
|
|
|
||
|
|
void BM_RenderSmallClx(benchmark::State &state)
|
||
|
|
{
|
||
|
|
SDLSurfaceUniquePtr sdl_surface = SDLWrap::CreateRGBSurfaceWithFormat(
|
||
|
|
/*flags=*/0, /*width=*/640, /*height=*/480, /*depth=*/8, SDL_PIXELFORMAT_INDEX8);
|
||
|
|
if (sdl_surface == nullptr) {
|
||
|
|
LogError("Failed to create SDL Surface: {}", SDL_GetError());
|
||
|
|
exit(1);
|
||
|
|
}
|
||
|
|
Surface out = Surface(sdl_surface.get());
|
||
|
|
OwnedClxSpriteList sprites = LoadClx("data\\resistance.clx");
|
||
|
|
|
||
|
|
const size_t numSprites = sprites.numSprites();
|
||
|
|
const size_t dataSize = sprites.dataSize();
|
||
|
|
size_t numBytesProcessed = 0;
|
||
|
|
size_t numItemsProcessed = 0;
|
||
|
|
for (auto _ : state) {
|
||
|
|
for (size_t i = 0; i < numSprites; ++i) {
|
||
|
|
RenderClxSprite(out, sprites[i], Point { static_cast<int>(i * 100), static_cast<int>(i * 60) });
|
||
|
|
}
|
||
|
|
uint8_t color = out[Point { 120, 120 }];
|
||
|
|
benchmark::DoNotOptimize(color);
|
||
|
|
numItemsProcessed += numSprites;
|
||
|
|
numBytesProcessed += dataSize;
|
||
|
|
}
|
||
|
|
state.SetBytesProcessed(numBytesProcessed);
|
||
|
|
state.SetItemsProcessed(numItemsProcessed);
|
||
|
|
}
|
||
|
|
|
||
|
|
void BM_RenderLargeClx(benchmark::State &state)
|
||
|
|
{
|
||
|
|
SDLSurfaceUniquePtr sdl_surface = SDLWrap::CreateRGBSurfaceWithFormat(
|
||
|
|
/*flags=*/0, /*width=*/640, /*height=*/480, /*depth=*/8, SDL_PIXELFORMAT_INDEX8);
|
||
|
|
if (sdl_surface == nullptr) {
|
||
|
|
LogError("Failed to create SDL Surface: {}", SDL_GetError());
|
||
|
|
exit(1);
|
||
|
|
}
|
||
|
|
Surface out = Surface(sdl_surface.get());
|
||
|
|
OwnedClxSpriteList sprites = LoadClx("ui_art\\dvl_lrpopup.clx");
|
||
|
|
|
||
|
|
const size_t dataSize = sprites.dataSize();
|
||
|
|
size_t numBytesProcessed = 0;
|
||
|
|
size_t numItemsProcessed = 0;
|
||
|
|
for (auto _ : state) {
|
||
|
|
RenderClxSprite(out, sprites[0], Point { 100, 100 });
|
||
|
|
uint8_t color = out[Point { 120, 120 }];
|
||
|
|
benchmark::DoNotOptimize(color);
|
||
|
|
numBytesProcessed += dataSize;
|
||
|
|
++numItemsProcessed;
|
||
|
|
}
|
||
|
|
state.SetBytesProcessed(numBytesProcessed);
|
||
|
|
state.SetItemsProcessed(numItemsProcessed);
|
||
|
|
}
|
||
|
|
|
||
|
|
BENCHMARK(BM_RenderSmallClx);
|
||
|
|
BENCHMARK(BM_RenderLargeClx);
|
||
|
|
|
||
|
|
} // namespace
|
||
|
|
} // namespace devilution
|