Terrain rasterizer now uses ParallelQueue to use cpu cores
This commit is contained in:
parent
9d13f46fe6
commit
2fe387918f
1 changed files with 44 additions and 1 deletions
|
@ -4,7 +4,9 @@
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include "../tools.h"
|
||||||
#include "../tools/boundingbox.h"
|
#include "../tools/boundingbox.h"
|
||||||
|
#include "../tools/parallel.h"
|
||||||
#include "../renderer.h"
|
#include "../renderer.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -13,6 +15,8 @@
|
||||||
|
|
||||||
static inline Vector3 _getPoint(TerrainDefinition* definition, Renderer* renderer, double x, double z)
|
static inline Vector3 _getPoint(TerrainDefinition* definition, Renderer* renderer, double x, double z)
|
||||||
{
|
{
|
||||||
|
UNUSED(definition);
|
||||||
|
|
||||||
Vector3 result;
|
Vector3 result;
|
||||||
|
|
||||||
result.x = x;
|
result.x = x;
|
||||||
|
@ -201,16 +205,55 @@ void terrainGetTessellationInfo(Renderer* renderer, FuncTerrainTessellationCallb
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
Renderer* renderer;
|
||||||
|
TerrainChunkInfo chunk;
|
||||||
|
} ParallelRasterInfo;
|
||||||
|
|
||||||
|
static int _parallelJobCallback(ParallelQueue* queue, int job_id, void* data, int stopping)
|
||||||
|
{
|
||||||
|
ParallelRasterInfo* info = (ParallelRasterInfo*)data;
|
||||||
|
UNUSED(queue);
|
||||||
|
UNUSED(job_id);
|
||||||
|
|
||||||
|
if (!stopping)
|
||||||
|
{
|
||||||
|
terrainTessellateChunk(info->renderer, &info->chunk, info->chunk.detail_hint);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(data);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int _standardTessellationCallback(Renderer* renderer, TerrainChunkInfo* chunk, double progress)
|
static int _standardTessellationCallback(Renderer* renderer, TerrainChunkInfo* chunk, double progress)
|
||||||
{
|
{
|
||||||
terrainTessellateChunk(renderer, chunk, chunk->detail_hint);
|
ParallelRasterInfo* info = malloc(sizeof(ParallelRasterInfo));
|
||||||
|
|
||||||
|
info->renderer = renderer;
|
||||||
|
info->chunk = *chunk;
|
||||||
|
|
||||||
|
if (!parallelQueueAddJob(renderer->customData[0], _parallelJobCallback, info))
|
||||||
|
{
|
||||||
|
free(info);
|
||||||
|
}
|
||||||
|
|
||||||
renderer->render_progress = 0.05 * progress;
|
renderer->render_progress = 0.05 * progress;
|
||||||
return !renderer->render_interrupt;
|
return !renderer->render_interrupt;
|
||||||
}
|
}
|
||||||
|
|
||||||
void terrainRenderSurface(Renderer* renderer)
|
void terrainRenderSurface(Renderer* renderer)
|
||||||
{
|
{
|
||||||
|
ParallelQueue* queue;
|
||||||
|
queue = parallelQueueCreate(0);
|
||||||
|
|
||||||
|
/* TODO Do not use custom data, it could already be used by another module */
|
||||||
|
renderer->customData[0] = queue;
|
||||||
|
|
||||||
renderer->render_progress = 0.0;
|
renderer->render_progress = 0.0;
|
||||||
terrainGetTessellationInfo(renderer, _standardTessellationCallback, 0);
|
terrainGetTessellationInfo(renderer, _standardTessellationCallback, 0);
|
||||||
renderer->render_progress = 0.05;
|
renderer->render_progress = 0.05;
|
||||||
|
|
||||||
|
parallelQueueWait(queue);
|
||||||
|
parallelQueueDelete(queue);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue