summaryrefslogtreecommitdiff
path: root/threading.cpp
diff options
context:
space:
mode:
authorFox Caminiti <fox@foxcam.net>2022-07-22 20:45:08 -0400
committerFox Caminiti <fox@foxcam.net>2022-07-22 20:45:08 -0400
commitfc8040d695644aaca4596adebeca4ea1369ef630 (patch)
treeaea6979da97c43df8f03f3a2d7b421ee71bef370 /threading.cpp
first
Diffstat (limited to 'threading.cpp')
-rw-r--r--threading.cpp59
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);
+ }
+ }
+}