From 6f6ca2d867afa55642fcebd02fba06a90a8b77a2 Mon Sep 17 00:00:00 2001 From: Pavel Krajcevski Date: Mon, 11 Mar 2013 16:20:52 -0400 Subject: [PATCH] Another bug fix. With the old code, it was possible that we skipped a compression with unlucky preemption of our threads. I'm not exactly sure why, but that caused deadlock (livelock?) in some very unfortunate circumstances. This new algorithm should work regardless of how many threads execute at once and should also prevent textures in the compression job list from being skipped. This algorithm seems to be an improvement on low-core count machines (around 4 cores), but it is slower on high-core count machines (40 cores or more)... --- BPTCEncoder/src/BC7Compressor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BPTCEncoder/src/BC7Compressor.cpp b/BPTCEncoder/src/BC7Compressor.cpp index 3d938a4..1ca2538 100755 --- a/BPTCEncoder/src/BC7Compressor.cpp +++ b/BPTCEncoder/src/BC7Compressor.cpp @@ -1555,7 +1555,7 @@ namespace BC7C // Help finish whatever texture we're compressing before we start again on my work... uint32 blockIdx; - while((blockIdx = FetchAndAdd(&(cjl.m_CurrentBlockIndex))) < nBlocks && jobIdx == cjl.m_CurrentJobIndex) { + while((blockIdx = FetchAndAdd(&(cjl.m_CurrentBlockIndex))) < nBlocks && *(cjl.GetFinishedFlag(jobIdx)) == 0) { unsigned char *out = cj->outBuf + (16 * blockIdx); const unsigned char *in = cj->inBuf + (64 * blockIdx); @@ -1563,8 +1563,8 @@ namespace BC7C } if(TestAndSet(cjl.GetFinishedFlag(jobIdx)) == 0) { - cjl.m_CurrentJobIndex++; cjl.m_CurrentBlockIndex = 0; + cjl.m_CurrentJobIndex++; } // Wait until this texture finishes.