TexConv/CMP_CompressonatorLib/BC7/BC7_Partitions.cpp

1071 lines
16 KiB
C++
Raw Normal View History

2020-07-31 11:31:32 +08:00
//===============================================================================
// Copyright (c) 2007-2016 Advanced Micro Devices, Inc. All rights reserved.
// Copyright (c) 2004-2006 ATI Technologies Inc.
//===============================================================================
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files(the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions :
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
#include "BC7_Partitions.h"
//
// Verified to match the final definitions as detailedin the OpenGL BPTC spec
//
CMP_DWORD BC7_PARTITIONS[MAX_SUBSETS][MAX_PARTITIONS][MAX_SUBSET_SIZE] =
{
// Single subset partitions for both BC6H abd BC7
{
{
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
},
},
{
{ // 0
0,0,1,1,
0,0,1,1,
0,0,1,1,
0,0,1,1
},
{ // 1
0,0,0,1,
0,0,0,1,
0,0,0,1,
0,0,0,1
},
{ // 2
0,1,1,1,
0,1,1,1,
0,1,1,1,
0,1,1,1
},
{ // 3
0,0,0,1,
0,0,1,1,
0,0,1,1,
0,1,1,1
},
{ // 4
0,0,0,0,
0,0,0,1,
0,0,0,1,
0,0,1,1
},
{ // 5
0,0,1,1,
0,1,1,1,
0,1,1,1,
1,1,1,1
},
{ // 6
0,0,0,1,
0,0,1,1,
0,1,1,1,
1,1,1,1
},
{ // 7
0,0,0,0,
0,0,0,1,
0,0,1,1,
0,1,1,1
},
{ // 8
0,0,0,0,
0,0,0,0,
0,0,0,1,
0,0,1,1
},
{ // 9
0,0,1,1,
0,1,1,1,
1,1,1,1,
1,1,1,1
},
{ // 10
0,0,0,0,
0,0,0,1,
0,1,1,1,
1,1,1,1
},
{ // 11
0,0,0,0,
0,0,0,0,
0,0,0,1,
0,1,1,1
},
{ // 12
0,0,0,1,
0,1,1,1,
1,1,1,1,
1,1,1,1
},
{ // 13
0,0,0,0,
0,0,0,0,
1,1,1,1,
1,1,1,1
},
{ // 14
0,0,0,0,
1,1,1,1,
1,1,1,1,
1,1,1,1
},
{ // 15
0,0,0,0,
0,0,0,0,
0,0,0,0,
1,1,1,1
},
{ // 16
0,0,0,0,
1,0,0,0,
1,1,1,0,
1,1,1,1
},
{ // 17
0,1,1,1,
0,0,0,1,
0,0,0,0,
0,0,0,0
},
{ // 18
0,0,0,0,
0,0,0,0,
1,0,0,0,
1,1,1,0
},
{ // 19
0,1,1,1,
0,0,1,1,
0,0,0,1,
0,0,0,0
},
{ // 20
0,0,1,1,
0,0,0,1,
0,0,0,0,
0,0,0,0
},
{ // 21
0,0,0,0,
1,0,0,0,
1,1,0,0,
1,1,1,0
},
{ // 22
0,0,0,0,
0,0,0,0,
1,0,0,0,
1,1,0,0
},
{ // 23
0,1,1,1,
0,0,1,1,
0,0,1,1,
0,0,0,1
},
{ // 24
0,0,1,1,
0,0,0,1,
0,0,0,1,
0,0,0,0
},
{ // 25
0,0,0,0,
1,0,0,0,
1,0,0,0,
1,1,0,0
},
{ // 26
0,1,1,0,
0,1,1,0,
0,1,1,0,
0,1,1,0
},
{ // 27
0,0,1,1,
0,1,1,0,
0,1,1,0,
1,1,0,0
},
{ // 28
0,0,0,1,
0,1,1,1,
1,1,1,0,
1,0,0,0
},
{ // 29
0,0,0,0,
1,1,1,1,
1,1,1,1,
0,0,0,0
},
{ // 30
0,1,1,1,
0,0,0,1,
1,0,0,0,
1,1,1,0
},
{ // 31
0,0,1,1,
1,0,0,1,
1,0,0,1,
1,1,0,0
},
// ----------- BC7 only shapes from here on -------------
{ // 32
0,1,0,1,
0,1,0,1,
0,1,0,1,
0,1,0,1
},
{ // 33
0,0,0,0,
1,1,1,1,
0,0,0,0,
1,1,1,1
},
{ // 34
0,1,0,1,
1,0,1,0,
0,1,0,1,
1,0,1,0
},
{ // 35
0,0,1,1,
0,0,1,1,
1,1,0,0,
1,1,0,0
},
{ // 36
0,0,1,1,
1,1,0,0,
0,0,1,1,
1,1,0,0
},
{ // 37
0,1,0,1,
0,1,0,1,
1,0,1,0,
1,0,1,0
},
{ // 38
0,1,1,0,
1,0,0,1,
0,1,1,0,
1,0,0,1
},
{ // 39
0,1,0,1,
1,0,1,0,
1,0,1,0,
0,1,0,1
},
{ // 40
0,1,1,1,
0,0,1,1,
1,1,0,0,
1,1,1,0
},
{ // 41
0,0,0,1,
0,0,1,1,
1,1,0,0,
1,0,0,0
},
{ // 42
0,0,1,1,
0,0,1,0,
0,1,0,0,
1,1,0,0
},
{ // 43
0,0,1,1,
1,0,1,1,
1,1,0,1,
1,1,0,0
},
{ // 44
0,1,1,0,
1,0,0,1,
1,0,0,1,
0,1,1,0
},
{ // 45
0,0,1,1,
1,1,0,0,
1,1,0,0,
0,0,1,1
},
{ // 46
0,1,1,0,
0,1,1,0,
1,0,0,1,
1,0,0,1
},
{ // 47
0,0,0,0,
0,1,1,0,
0,1,1,0,
0,0,0,0
},
{ // 48
0,1,0,0,
1,1,1,0,
0,1,0,0,
0,0,0,0
},
{ // 49
0,0,1,0,
0,1,1,1,
0,0,1,0,
0,0,0,0
},
{ // 50
0,0,0,0,
0,0,1,0,
0,1,1,1,
0,0,1,0
},
{ // 51
0,0,0,0,
0,1,0,0,
1,1,1,0,
0,1,0,0
},
{ // 52
0,1,1,0,
1,1,0,0,
1,0,0,1,
0,0,1,1
},
{ // 53
0,0,1,1,
0,1,1,0,
1,1,0,0,
1,0,0,1
},
{ // 54
0,1,1,0,
0,0,1,1,
1,0,0,1,
1,1,0,0
},
{ // 55
0,0,1,1,
1,0,0,1,
1,1,0,0,
0,1,1,0
},
{ // 56
0,1,1,0,
1,1,0,0,
1,1,0,0,
1,0,0,1
},
{ // 57
0,1,1,0,
0,0,1,1,
0,0,1,1,
1,0,0,1
},
{ // 58
0,1,1,1,
1,1,1,0,
1,0,0,0,
0,0,0,1
},
{ // 59
0,0,0,1,
1,0,0,0,
1,1,1,0,
0,1,1,1
},
{ // 60
0,0,0,0,
1,1,1,1,
0,0,1,1,
0,0,1,1
},
{ // 61
0,0,1,1,
0,0,1,1,
1,1,1,1,
0,0,0,0
},
{ // 62
0,0,1,0,
0,0,1,0,
1,1,1,0,
1,1,1,0
},
{ // 63
0,1,0,0,
0,1,0,0,
0,1,1,1,
0,1,1,1
},
},
// Table.P3 - only for BC7
{
{
0,0,1,1,
0,0,1,1,
0,2,2,1,
2,2,2,2
},
{
0,0,0,1,
0,0,1,1,
2,2,1,1,
2,2,2,1
},
{
0,0,0,0,
2,0,0,1,
2,2,1,1,
2,2,1,1
},
{
0,2,2,2,
0,0,2,2,
0,0,1,1,
0,1,1,1
},
{
0,0,0,0,
0,0,0,0,
1,1,2,2,
1,1,2,2
},
{
0,0,1,1,
0,0,1,1,
0,0,2,2,
0,0,2,2
},
{
0,0,2,2,
0,0,2,2,
1,1,1,1,
1,1,1,1
},
{
0,0,1,1,
0,0,1,1,
2,2,1,1,
2,2,1,1
},
{
0,0,0,0,
0,0,0,0,
1,1,1,1,
2,2,2,2
},
{
0,0,0,0,
1,1,1,1,
1,1,1,1,
2,2,2,2
},
{
0,0,0,0,
1,1,1,1,
2,2,2,2,
2,2,2,2
},
{
0,0,1,2,
0,0,1,2,
0,0,1,2,
0,0,1,2
},
{
0,1,1,2,
0,1,1,2,
0,1,1,2,
0,1,1,2
},
{
0,1,2,2,
0,1,2,2,
0,1,2,2,
0,1,2,2
},
{
0,0,1,1,
0,1,1,2,
1,1,2,2,
1,2,2,2
},
{
0,0,1,1,
2,0,0,1,
2,2,0,0,
2,2,2,0
},
{
0,0,0,1,
0,0,1,1,
0,1,1,2,
1,1,2,2
},
{
0,1,1,1,
0,0,1,1,
2,0,0,1,
2,2,0,0
},
{
0,0,0,0,
1,1,2,2,
1,1,2,2,
1,1,2,2
},
{
0,0,2,2,
0,0,2,2,
0,0,2,2,
1,1,1,1
},
{
0,1,1,1,
0,1,1,1,
0,2,2,2,
0,2,2,2
},
{
0,0,0,1,
0,0,0,1,
2,2,2,1,
2,2,2,1
},
{
0,0,0,0,
0,0,1,1,
0,1,2,2,
0,1,2,2
},
{
0,0,0,0,
1,1,0,0,
2,2,1,0,
2,2,1,0
},
{
0,1,2,2,
0,1,2,2,
0,0,1,1,
0,0,0,0
},
{
0,0,1,2,
0,0,1,2,
1,1,2,2,
2,2,2,2
},
{
0,1,1,0,
1,2,2,1,
1,2,2,1,
0,1,1,0
},
{
0,0,0,0,
0,1,1,0,
1,2,2,1,
1,2,2,1
},
{
0,0,2,2,
1,1,0,2,
1,1,0,2,
0,0,2,2
},
{
0,1,1,0,
0,1,1,0,
2,0,0,2,
2,2,2,2
},
{
0,0,1,1,
0,1,2,2,
0,1,2,2,
0,0,1,1
},
{
0,0,0,0,
2,0,0,0,
2,2,1,1,
2,2,2,1
},
{
0,0,0,0,
0,0,0,2,
1,1,2,2,
1,2,2,2
},
{
0,2,2,2,
0,0,2,2,
0,0,1,2,
0,0,1,1
},
{
0,0,1,1,
0,0,1,2,
0,0,2,2,
0,2,2,2
},
{
0,1,2,0,
0,1,2,0,
0,1,2,0,
0,1,2,0
},
{
0,0,0,0,
1,1,1,1,
2,2,2,2,
0,0,0,0
},
{
0,1,2,0,
1,2,0,1,
2,0,1,2,
0,1,2,0
},
{
0,1,2,0,
2,0,1,2,
1,2,0,1,
0,1,2,0
},
{
0,0,1,1,
2,2,0,0,
1,1,2,2,
0,0,1,1
},
{
0,0,1,1,
1,1,2,2,
2,2,0,0,
0,0,1,1
},
{
0,1,0,1,
0,1,0,1,
2,2,2,2,
2,2,2,2
},
{
0,0,0,0,
0,0,0,0,
2,1,2,1,
2,1,2,1
},
{
0,0,2,2,
1,1,2,2,
0,0,2,2,
1,1,2,2
},
{
0,0,2,2,
0,0,1,1,
0,0,2,2,
0,0,1,1
},
{
0,2,2,0,
1,2,2,1,
0,2,2,0,
1,2,2,1
},
{
0,1,0,1,
2,2,2,2,
2,2,2,2,
0,1,0,1
},
{
0,0,0,0,
2,1,2,1,
2,1,2,1,
2,1,2,1
},
{
0,1,0,1,
0,1,0,1,
0,1,0,1,
2,2,2,2
},
{
0,2,2,2,
0,1,1,1,
0,2,2,2,
0,1,1,1
},
{
0,0,0,2,
1,1,1,2,
0,0,0,2,
1,1,1,2
},
{
0,0,0,0,
2,1,1,2,
2,1,1,2,
2,1,1,2
},
{
0,2,2,2,
0,1,1,1,
0,1,1,1,
0,2,2,2
},
{
0,0,0,2,
1,1,1,2,
1,1,1,2,
0,0,0,2
},
{
0,1,1,0,
0,1,1,0,
0,1,1,0,
2,2,2,2
},
{
0,0,0,0,
0,0,0,0,
2,1,1,2,
2,1,1,2
},
{
0,1,1,0,
0,1,1,0,
2,2,2,2,
2,2,2,2
},
{
0,0,2,2,
0,0,1,1,
0,0,1,1,
0,0,2,2
},
{
0,0,2,2,
1,1,2,2,
1,1,2,2,
0,0,2,2
},
{
0,0,0,0,
0,0,0,0,
0,0,0,0,
2,1,1,2
},
{
0,0,0,2,
0,0,0,1,
0,0,0,2,
0,0,0,1
},
{
0,2,2,2,
1,2,2,2,
0,2,2,2,
1,2,2,2
},
{
0,1,0,1,
2,2,2,2,
2,2,2,2,
2,2,2,2
},
{
0,1,1,1,
2,0,1,1,
2,2,0,1,
2,2,2,0
},
},
};
CMP_DWORD BC7_FIXUPINDICES[MAX_SUBSETS][MAX_PARTITIONS][3] =
{
// One subset
{
{0, 0, 0},
},
{
{0, 15},{0, 15},{0, 15},{0, 15},
{0, 15},{0, 15},{0, 15},{0, 15},
{0, 15},{0, 15},{0, 15},{0, 15},
{0, 15},{0, 15},{0, 15},{0, 15},
{0, 15},{0, 2},{0, 8},{0, 2},
{0, 2},{0, 8},{0, 8},{0, 15},
{0, 2},{0, 8},{0, 2},{0, 2},
{0, 8},{0, 8},{0, 2},{0, 2},
{0, 15},{0, 15},{0, 6},{0, 8},
{0, 2},{0, 8},{0, 15},{0, 15},
{0, 2},{0, 8},{0, 2},{0, 2},
{0, 2},{0, 15},{0, 15},{0, 6},
{0, 6},{0, 2},{0, 6},{0, 8},
{0, 15},{0, 15},{0, 2},{0, 2},
{0, 15},{0, 15},{0, 15},{0, 15},
{0, 15},{0, 2},{0, 2},{0, 15},
},
// Three subsets
{
{0, 3,15}, {0, 3, 8}, {0,15, 8}, {0,15, 3},
{0, 8,15}, {0, 3,15}, {0,15, 3}, {0,15, 8},
{0, 8,15}, {0, 8,15}, {0, 6,15}, {0, 6,15},
{0, 6,15}, {0, 5,15}, {0, 3,15}, {0, 3, 8},
{0, 3,15}, {0, 3, 8}, {0, 8,15}, {0,15, 3},
{0, 3,15}, {0, 3, 8}, {0, 6,15}, {0,10, 8},
{0, 5, 3}, {0, 8,15}, {0, 8, 6}, {0, 6,10},
{0, 8,15}, {0, 5,15}, {0,15,10}, {0,15, 8},
{0, 8,15}, {0,15, 3}, {0, 3,15}, {0, 5,10},
{0, 6,10}, {0,10, 8}, {0, 8, 9}, {0,15,10},
{0,15, 6}, {0, 3,15}, {0,15, 8}, {0, 5,15},
{0,15, 3}, {0,15, 6}, {0,15, 6}, {0,15, 8},
{0, 3,15}, {0,15, 3}, {0, 5,15}, {0, 5,15},
{0, 5,15}, {0, 8,15}, {0, 5,15}, {0,10,15},
{0, 5,15}, {0,10,15}, {0, 8,15}, {0,13,15},
{0,15, 3}, {0,12,15}, {0, 3,15}, {0, 3, 8}
},
};
//
// Reversible partitioning operation for BC7
//
extern FILE *fp;
void Partition(CMP_DWORD partition,
double in[][MAX_DIMENSION_BIG],
double subsets[MAX_SUBSETS][MAX_SUBSET_SIZE][MAX_DIMENSION_BIG],
CMP_DWORD count[MAX_SUBSETS],
CMP_DWORD blockType,
int dimension)
{
int i,j;
CMP_DWORD *table = NULL;
for(i=0;i<MAX_SUBSETS;i++)
{
count[i] = 0;
}
int insubset = 0,inpart;
switch(bti[blockType].subsetCount)
{
case 0:
case 1:
insubset = 0;
inpart = 0;
table = &(BC7_PARTITIONS[0][0][0]);
break;
case 2:
insubset = 1;
inpart = partition;
table = &(BC7_PARTITIONS[1][partition][0]);
break;
case 3:
insubset = 2;
inpart = partition;
table = &(BC7_PARTITIONS[2][partition][0]);
break;
default:
break;
}
if (table == NULL) return; // Nothing to do!!
#ifdef USE_DBGTRACE
DbgTrace(("insubset [%d] inpart [%2d]",insubset,inpart));
#endif
for(i=0; i<MAX_SUBSET_SIZE; i++)
{
CMP_DWORD subset = table[i];
for(j=0; j<dimension; j++)
{
subsets[subset][count[subset]][j] = in[i][j];
}
if(dimension < MAX_DIMENSION_BIG)
{
subsets[subset][count[subset]][j] = 0.0;
}
count[subset]++;
}
}