diff --git a/src/render/software/CanvasPixelShader.cpp b/src/render/software/CanvasPixelShader.cpp index 43f1940..318d071 100644 --- a/src/render/software/CanvasPixelShader.cpp +++ b/src/render/software/CanvasPixelShader.cpp @@ -16,8 +16,8 @@ int CanvasPixelShader::processParallelUnit(int unit) { // Locate the chunk we work on int prev_sub_chunk_size = chunk_size * 2; - int chunk_x = unit % chunks_x; - int chunk_y = unit / chunks_x; + int chunk_x = unit / chunks_y; + int chunk_y = unit % chunks_y; int base_x = chunk_x * chunk_size; int base_y = chunk_y * chunk_size; 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_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 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 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()); 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); + } + } } } } diff --git a/src/system/ParallelWork.cpp b/src/system/ParallelWork.cpp index a80bb0a..c77aca3 100644 --- a/src/system/ParallelWork.cpp +++ b/src/system/ParallelWork.cpp @@ -66,8 +66,8 @@ protected: if (unit >= 0) { work->worker->processParallelUnit(unit); - work->returnThread(this); unit = -1; + work->returnThread(this); } } }