mirror of
https://github.com/yuzu-emu/FasTC.git
synced 2025-01-09 15:45:30 +00:00
Since all of our texture dimensions are powers of two, we can optimize out the modulo in favor of a mask.
This commit is contained in:
parent
87f1e06cb5
commit
4f44826056
|
@ -180,8 +180,8 @@ namespace PVRTCC {
|
||||||
|
|
||||||
if(i == 0 && j == 0) continue;
|
if(i == 0 && j == 0) continue;
|
||||||
|
|
||||||
int32 xx = (i + static_cast<int32>(x + width)) % width;
|
int32 xx = (i + static_cast<int32>(x + width)) & (width - 1);
|
||||||
int32 yy = (j + static_cast<int32>(y + height)) % height;
|
int32 yy = (j + static_cast<int32>(y + height)) & (height - 1);
|
||||||
|
|
||||||
assert(xx >= 0 && xx < static_cast<int32>(width));
|
assert(xx >= 0 && xx < static_cast<int32>(width));
|
||||||
assert(yy >= 0 && yy < static_cast<int32>(height));
|
assert(yy >= 0 && yy < static_cast<int32>(height));
|
||||||
|
@ -284,16 +284,16 @@ namespace PVRTCC {
|
||||||
|
|
||||||
for(uint32 j = 0; j < h+3; j++) {
|
for(uint32 j = 0; j < h+3; j++) {
|
||||||
for(uint32 i = 0; i < w; i++) {
|
for(uint32 i = 0; i < w; i++) {
|
||||||
EExtremaResult result = ComputeLocalExtrema(labels, inBuf, i, j % h, w, h);
|
EExtremaResult result = ComputeLocalExtrema(labels, inBuf, i, j & (h - 1), w, h);
|
||||||
bool dilateMax = result != eExtremaResult_LocalMax;
|
bool dilateMax = result != eExtremaResult_LocalMax;
|
||||||
bool dilateMin = result != eExtremaResult_LocalMin;
|
bool dilateMin = result != eExtremaResult_LocalMin;
|
||||||
|
|
||||||
if(dilateMax || dilateMin) {
|
if(dilateMax || dilateMin) {
|
||||||
// Look up and to the left to determine the distance...
|
// Look up and to the left to determine the distance...
|
||||||
uint32 upIdx = ((j+h-1) % h) * w + i;
|
uint32 upIdx = ((j+h-1) & (h - 1)) * w + i;
|
||||||
uint32 leftIdx = (j % h) * w + ((i+w-1) % w);
|
uint32 leftIdx = (j & (h - 1)) * w + ((i+w-1) & (w - 1));
|
||||||
|
|
||||||
CompressionLabel &l = labels[(j % h)*w + i];
|
CompressionLabel &l = labels[(j & (h - 1))*w + i];
|
||||||
CompressionLabel &up = labels[upIdx];
|
CompressionLabel &up = labels[upIdx];
|
||||||
CompressionLabel &left = labels[leftIdx];
|
CompressionLabel &left = labels[leftIdx];
|
||||||
|
|
||||||
|
@ -359,22 +359,22 @@ namespace PVRTCC {
|
||||||
for(int32 j = static_cast<int32>(h)+2; j >= 0; j--) {
|
for(int32 j = static_cast<int32>(h)+2; j >= 0; j--) {
|
||||||
for(int32 i = static_cast<int32>(w)-1; i >= 0; i--) {
|
for(int32 i = static_cast<int32>(w)-1; i >= 0; i--) {
|
||||||
|
|
||||||
CompressionLabel &l = labels[(j % h) * w + i];
|
CompressionLabel &l = labels[(j & (h - 1)) * w + i];
|
||||||
|
|
||||||
// Add top right corner
|
// Add top right corner
|
||||||
neighbors[0] = &(labels[((j + h - 1) % h) * w + ((i + 1) % w)]);
|
neighbors[0] = &(labels[((j + h - 1) & (h - 1)) * w + ((i + 1) & (w - 1))]);
|
||||||
|
|
||||||
// Add right label
|
// Add right label
|
||||||
neighbors[1] = &(labels[(j % h) * w + ((i + 1) % w)]);
|
neighbors[1] = &(labels[(j & (h - 1)) * w + ((i + 1) & (w - 1))]);
|
||||||
|
|
||||||
// Add bottom right label
|
// Add bottom right label
|
||||||
neighbors[2] = &(labels[((j + 1) % h) * w + ((i + 1) % w)]);
|
neighbors[2] = &(labels[((j + 1) & (h - 1)) * w + ((i + 1) & (w - 1))]);
|
||||||
|
|
||||||
// Add bottom label
|
// Add bottom label
|
||||||
neighbors[3] = &(labels[((j + 1) % h) * w + i]);
|
neighbors[3] = &(labels[((j + 1) & (h - 1)) * w + i]);
|
||||||
|
|
||||||
// Add bottom left label
|
// Add bottom left label
|
||||||
neighbors[4] = &(labels[((j + 1) % h) * w + ((i + w - 1) % w)]);
|
neighbors[4] = &(labels[((j + 1) & (h - 1)) * w + ((i + w - 1) & (w - 1))]);
|
||||||
|
|
||||||
DilateLabelBackward(l.highLabel, neighbors, true);
|
DilateLabelBackward(l.highLabel, neighbors, true);
|
||||||
DilateLabelBackward(l.lowLabel, neighbors, false);
|
DilateLabelBackward(l.lowLabel, neighbors, false);
|
||||||
|
@ -420,7 +420,7 @@ namespace PVRTCC {
|
||||||
for(uint32 y = j*4; y <= (j+1)*4; y++)
|
for(uint32 y = j*4; y <= (j+1)*4; y++)
|
||||||
for(uint32 x = i*4; x <= (i+1)*4; x++) {
|
for(uint32 x = i*4; x <= (i+1)*4; x++) {
|
||||||
|
|
||||||
uint32 idx = (y%h)*w + (x%w);
|
uint32 idx = (y & (h-1))*w + (x & (w-1));
|
||||||
float intensity = labels[idx].intensity;
|
float intensity = labels[idx].intensity;
|
||||||
if(intensity < minIntensity) {
|
if(intensity < minIntensity) {
|
||||||
minIntensity = intensity;
|
minIntensity = intensity;
|
||||||
|
|
Loading…
Reference in a new issue