diff options
author | Fox Caminiti <fox@foxcam.net> | 2022-07-22 20:45:08 -0400 |
---|---|---|
committer | Fox Caminiti <fox@foxcam.net> | 2022-07-22 20:45:08 -0400 |
commit | fc8040d695644aaca4596adebeca4ea1369ef630 (patch) | |
tree | aea6979da97c43df8f03f3a2d7b421ee71bef370 /threading.cpp |
first
Diffstat (limited to 'threading.cpp')
-rw-r--r-- | threading.cpp | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/threading.cpp b/threading.cpp new file mode 100644 index 0000000..07584bd --- /dev/null +++ b/threading.cpp @@ -0,0 +1,59 @@ +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 void +AVX2_RenderLayer(transform_info TransformInfo, pixel_buffer *Buffer, rectangle RenderRegion); +internal void +Fallback_RenderLayer(transform_info TransformInfo, pixel_buffer *Buffer, rectangle RenderRegion); + +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); + for (int16 i = 0; i < RenderInfo.State->NumberOfLayersToRender; i++) { + int16 Idx = RenderInfo.State->LayersToRender[i]; +#if ARM + Fallback_RenderLayer(RenderInfo.File->Layer[Idx]->TransformInfo, RenderInfo.CompBuffer, Entry->RenderRegion); + // RenderLayerNeon(RenderInfo.File->Layer[Idx], RenderInfo.CompBuffer, Entry->RenderRegion); +#else + // printf("(RENDERING) Thread %i, region X%i Y%i\n", Index, Entry->RenderRegion.Min.x/240, Entry->RenderRegion.Min.y/135); + if (AVXEnabled) + AVX2_RenderLayer(RenderInfo.File->Layer[Idx]->TransformInfo, RenderInfo.CompBuffer, Entry->RenderRegion); + else + Fallback_RenderLayer(RenderInfo.File->Layer[Idx]->TransformInfo, RenderInfo.CompBuffer, Entry->RenderRegion); +#endif + } + + // 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); + } + } +} |