#include "../src/meshoptimizer.h"
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
void fuzzDecoder(const uint8_t* data, size_t size, size_t stride, int (*decode)(void*, size_t, size_t, const unsigned char*, size_t))
{
size_t count = 66;
void* destination = malloc(count * stride);
assert(destination);
int rc = decode(destination, count, stride, reinterpret_cast<const unsigned char*>(data), size);
(void)rc;
free(destination);
}
void fuzzRoundtrip(const uint8_t* data, size_t size, size_t stride, int level)
{
size_t count = size / stride;
size_t bound = meshopt_encodeVertexBufferBound(count, stride);
void* encoded = malloc(bound);
void* decoded = malloc(count * stride);
assert(encoded && decoded);
size_t res = meshopt_encodeVertexBufferLevel(static_cast<unsigned char*>(encoded), bound, data, count, stride, level, -1);
assert(res > 0 && res <= bound);
size_t rese = meshopt_encodeVertexBufferLevel(static_cast<unsigned char*>(encoded) + bound - res, res, data, count, stride, level, -1);
assert(rese == res);
int rc = meshopt_decodeVertexBuffer(decoded, count, stride, static_cast<unsigned char*>(encoded) + bound - res, res);
assert(rc == 0);
assert(memcmp(data, decoded, count * stride) == 0);
free(decoded);
free(encoded);
}
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
{
fuzzDecoder(data, size, 2, meshopt_decodeIndexBuffer);
fuzzDecoder(data, size, 4, meshopt_decodeIndexBuffer);
fuzzDecoder(data, size, 2, meshopt_decodeIndexSequence);
fuzzDecoder(data, size, 4, meshopt_decodeIndexSequence);
fuzzDecoder(data, size, 4, meshopt_decodeVertexBuffer);
fuzzDecoder(data, size, 16, meshopt_decodeVertexBuffer);
fuzzDecoder(data, size, 24, meshopt_decodeVertexBuffer);
fuzzDecoder(data, size, 32, meshopt_decodeVertexBuffer);
uint8_t data0 = size > 0 ? data[0] : 0;
int level = data0 % 5;
meshopt_encodeVertexVersion(level < 4 ? 1 : 0);
fuzzRoundtrip(data, size, 4, level);
fuzzRoundtrip(data, size, 16, level);
fuzzRoundtrip(data, size, 24, level);
fuzzRoundtrip(data, size, 32, level);
return 0;
}