static void RenderLayers(render_entry Entry); static bool32 CheckQueue(uint16 Index) { bool32 Result = 0; uint32 Q = SDL_AtomicGet(&QueuedEntries); uint32 C = SDL_AtomicGet(&CurrentEntry); if (Q > C) { if (SDL_AtomicCAS(&CurrentEntry, C, C + 1)) { // printf("C: %i START: F%i Thread %i, region X%i Y%i\n", C, Entry->FrameNumber, Index, Entry->RenderRegion.Min.x, Entry->RenderRegion.Min.y); RenderLayers(Entries[C]); // printf("END: F%i Thread %i, region X%i Y%i\n", Entry->FrameNumber, Index, Entry->RenderRegion.Min.x, Entry->RenderRegion.Min.y); SDL_AtomicAdd(&CompletedEntries, 1); Result = 1; } } return Result; } static int TestThread(void *ptr) { uint16 Index = *(uint16 *)ptr; for(;;) { if (!CheckQueue(Index)) { SDL_SemWait(Semaphore); } } } static bool32 Threading_IsActive() { uint32 C = SDL_AtomicGet(&CompletedEntries); Assert(C < 17); return (C == 16) ? false : true; } static void Threading_BitmapOp(void *Data, void *OutputBuffer, rectangle InitialRenderRegion) { uint16 TileWidth = (InitialRenderRegion.Max.x - InitialRenderRegion.Min.x) / 4; uint16 TileHeight = (InitialRenderRegion.Max.y - InitialRenderRegion.Min.y) / 4; SDL_AtomicSet(&QueuedEntries, 0); SDL_AtomicSet(&CurrentEntry, 0); SDL_AtomicSet(&CompletedEntries, 0); for (int y = 0; y < 4; y++) { for (int x = 0; x < 4; x++) { // if (x == y) { rectangle RenderRegion = { TileWidth*x, TileHeight*y, TileWidth + TileWidth*x, TileHeight + TileHeight*y }; RenderRegion.Min.x -= RenderRegion.Min.x % 8; RenderRegion.Min.y -= RenderRegion.Min.y % 8; RenderRegion.Max.x -= RenderRegion.Max.x % 8; RenderRegion.Max.y -= RenderRegion.Max.y % 8; if (RenderRegion.Max.x > InitialRenderRegion.Max.x) RenderRegion.Max.x = InitialRenderRegion.Max.x; if (RenderRegion.Max.y > InitialRenderRegion.Max.y) RenderRegion.Max.y = InitialRenderRegion.Max.y; if (x == 3) RenderRegion.Max.x = InitialRenderRegion.Max.x; if (y == 3) RenderRegion.Max.y = InitialRenderRegion.Max.y; render_entry Entry = { Data, OutputBuffer, RenderRegion }; uint32 Q = SDL_AtomicGet(&QueuedEntries); *(Entries + Q) = Entry; SDL_AtomicAdd(&QueuedEntries, 1); SDL_SemPost(Semaphore); } // } } }