Fixed parallel canvas shading
This commit is contained in:
parent
b5ee4c432f
commit
9c2d545e6a
2 changed files with 14 additions and 5 deletions
|
@ -16,8 +16,8 @@ int CanvasPixelShader::processParallelUnit(int unit)
|
||||||
{
|
{
|
||||||
// Locate the chunk we work on
|
// Locate the chunk we work on
|
||||||
int prev_sub_chunk_size = chunk_size * 2;
|
int prev_sub_chunk_size = chunk_size * 2;
|
||||||
int chunk_x = unit % chunks_x;
|
int chunk_x = unit / chunks_y;
|
||||||
int chunk_y = unit / chunks_x;
|
int chunk_y = unit % chunks_y;
|
||||||
int base_x = chunk_x * chunk_size;
|
int base_x = chunk_x * chunk_size;
|
||||||
int base_y = chunk_y * chunk_size;
|
int base_y = chunk_y * chunk_size;
|
||||||
int limit_x = portion->getWidth() - base_x;
|
int limit_x = portion->getWidth() - base_x;
|
||||||
|
@ -26,11 +26,12 @@ int CanvasPixelShader::processParallelUnit(int unit)
|
||||||
limit_x = (limit_x > chunk_size) ? chunk_size : limit_x;
|
limit_x = (limit_x > chunk_size) ? chunk_size : limit_x;
|
||||||
limit_y = (limit_y > chunk_size) ? chunk_size : limit_y;
|
limit_y = (limit_y > chunk_size) ? chunk_size : limit_y;
|
||||||
|
|
||||||
|
// Iterate on sub-chunks
|
||||||
for (int x = 0; x < limit_x; x += sub_chunk_size)
|
for (int x = 0; x < limit_x; x += sub_chunk_size)
|
||||||
{
|
{
|
||||||
for (int y = 0; y < limit_y; y += sub_chunk_size)
|
for (int y = 0; y < limit_y; y += sub_chunk_size)
|
||||||
{
|
{
|
||||||
if (x % prev_sub_chunk_size != 0 or y % prev_sub_chunk_size != 0)
|
if (sub_chunk_size == chunk_size or x % prev_sub_chunk_size != 0 or y % prev_sub_chunk_size != 0)
|
||||||
{
|
{
|
||||||
// Resolve the pixel color
|
// Resolve the pixel color
|
||||||
const CanvasPixel &pixel = portion->at(base_x + x, base_y + y);
|
const CanvasPixel &pixel = portion->at(base_x + x, base_y + y);
|
||||||
|
@ -42,7 +43,15 @@ int CanvasPixelShader::processParallelUnit(int unit)
|
||||||
const Rasterizer &rasterizer = renderer.getRasterizer(fragment.getClient());
|
const Rasterizer &rasterizer = renderer.getRasterizer(fragment.getClient());
|
||||||
composite.mask(rasterizer.shadeFragment(fragment));
|
composite.mask(rasterizer.shadeFragment(fragment));
|
||||||
}
|
}
|
||||||
portion->setColor(base_x + x, base_y + y, composite);
|
|
||||||
|
// Fill the square area
|
||||||
|
for (int fx = 0; fx + x < limit_x and fx < sub_chunk_size; fx++)
|
||||||
|
{
|
||||||
|
for (int fy = 0; fy + y < limit_y and fy < sub_chunk_size; fy++)
|
||||||
|
{
|
||||||
|
portion->setColor(base_x + x + fx, base_y + y + fy, composite);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,8 +66,8 @@ protected:
|
||||||
if (unit >= 0)
|
if (unit >= 0)
|
||||||
{
|
{
|
||||||
work->worker->processParallelUnit(unit);
|
work->worker->processParallelUnit(unit);
|
||||||
work->returnThread(this);
|
|
||||||
unit = -1;
|
unit = -1;
|
||||||
|
work->returnThread(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue