internal void PushRect(rectangle RenderRegion) { render_entry *Entry = Entries + EntryCount; Entry->RenderRegion = RenderRegion; __atomic_add_fetch(&EntryCount, 1, __ATOMIC_ACQ_REL); SDL_SemPost(Semaphore); } internal bool32 CheckQueue(render_queue RenderInfo, uint16 Index) { bool32 Result = 0; uint32 OriginalEntry = NextEntryToDo; if (NextEntryToDo < EntryCount) { if (__atomic_compare_exchange_n(&NextEntryToDo, &OriginalEntry, NextEntryToDo + 1, true, __ATOMIC_RELEASE, __ATOMIC_ACQUIRE)) { render_entry *Entry = Entries + OriginalEntry; 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); __atomic_add_fetch(&CompletedJobs, 1, __ATOMIC_ACQ_REL); Result = 1; } } return Result; } internal int TestThread(void *ptr) { thread_info *ThreadInfo = (thread_info *)ptr; uint16 Index = ThreadInfo->Index; for(;;) { if (!CheckQueue(*ThreadInfo->RenderInfo, Index)) { SDL_SemWait(Semaphore); } } }