static void PushRect(rectangle RenderRegion) { uint32 Q = SDL_AtomicGet(&QueuedEntries); render_entry *Entry = Entries + Q; Entry->RenderRegion = RenderRegion; SDL_AtomicAdd(&QueuedEntries, 1); SDL_SemPost(Semaphore); } static void RenderLayers(render_queue *RenderInfo, rectangle RenderRegion); static bool32 CheckQueue(render_queue RenderInfo, 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)) { render_entry *Entry = Entries + C; Assert(Entry->RenderRegion.Max.x != 0); RenderLayers(&RenderInfo, Entry->RenderRegion); // printf("(FINISHED) Thread %i, region X%i Y%i\n", Index, Entry->RenderRegion.Min.x/240, Entry->RenderRegion.Min.y/135); SDL_AtomicAdd(&CompletedEntries, 1); Result = 1; } } return Result; } static int TestThread(void *ptr) { thread_info *ThreadInfo = (thread_info *)ptr; uint16 Index = ThreadInfo->Index; for(;;) { if (!CheckQueue(*ThreadInfo->RenderInfo, Index)) { SDL_SemWait(Semaphore); } } }