You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nvidia-texture-tools/extern/CMP_Core/shaders/BC7_Encode_Kernel.h

1581 lines
51 KiB
C

//=====================================================================
// Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved.
//
// 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.
//
//=====================================================================
#ifndef BC7_ENCODE_KERNEL_H
#define BC7_ENCODE_KERNEL_H
#if defined(ISPC)||defined(ASPM)
//#include "..\..\Common\Common_Def.h"
#include "Common_Def.h"
#else
#include "Common_Def.h"
#endif
// cmp param uniform data tracking
typedef CGU_UINT8 CGU_CHANNEL;
typedef CGV_UINT32 CGV_SHIFT32;
typedef CGV_UINT8 CGV_BYTE;
typedef CGV_FLOAT CGV_ERROR;
typedef CGV_FLOAT CGV_IMAGE;
typedef CGV_INT CGV_EPOCODE;
typedef CGV_UINT8 CGV_CMPOUT;
typedef CGV_UINT8 CGV_INDEX;
typedef CGV_UINT32 CGV_INDEXPACKED;
typedef CGV_UINT32 CGV_CMPOUTPACKED;
typedef CGV_INT CGV_LEVELS;
typedef CGV_INT CGV_SUBSETS;
typedef CGV_INT CGV_MASK;
typedef CGV_INT CGV_ITTERATIONS;
typedef CGV_INT CGV_PARTID;
typedef CGV_INT CGV_FIXUPINDEX;
typedef CGV_INT CGV_RAMP;
typedef CGV_INT CGV_ENTRIES;
typedef CGV_INT CGV_TYPEINT;
typedef CGV_UINT32 CGV_TYPEUINT32;
typedef CGU_UINT8 CGU_BYTE;
typedef CGV_CMPOUT CGUV_CMPOUT;
typedef CGU_UINT8 CGUV_DSTPTR;
#define USE_VARYING
#ifdef USE_VARYING
typedef CGV_INT CGUV_BLOCKWIDTH;
#else
typedef CGU_INT CGUV_BLOCKWIDTH;
#endif
#ifndef ASPM_GPU
struct cmp_bc7_state
{
CGV_IMAGE block[16][4];
CGV_SHIFT32 best_data[4];
} ;
typedef enum
{
CGU_FORMAT_Unknown, // Undefined texture format.
// Channel Component formats-------------------------------------------------------------------------------
CGU_FORMAT_RGBA_8888, // RGBA format with 8-bit fixed channels.
// Formats supported by GPU
CGU_FORMAT_BC1, // A four component opaque (or 1-bit alpha) compressed texture format for Microsoft DirectX10. Identical to DXT1. Four bits per pixel.
CGU_FORMAT_BC6H, // BC6H compressed texture format
CGU_FORMAT_BC7, // BC7 compressed texture format
// Formats supported by CPU
CGU_FORMAT_GTC, // GTC Gradient Texture Compressor
CGU_FORMAT_MAX
} CGU_FORMAT;
//------------------------------------
// The structure describing a texture
//------------------------------------
struct CGU_Texture_Type
{
// Optional Settings
CGU_FLOAT m_fquality; // Minimum resulting quality to maintain while processing the texture, default is 0.05
CGU_INT8 m_nBlockHeight; // Size of the texture tiles (blocks) to use.during processing
CGU_INT8 m_nBlockWidth; // default = 4
CGU_INT8 m_nBlockDepth; // default = 1
// Required settings
CGU_FORMAT m_format; // Texture format
CGU_UINT32 m_src_width; // Width of the texture.
CGU_UINT32 m_src_height; // Height of the texture.
CGU_UINT32 m_stride; // Number of bytes to start of next line
CGU_UINT32 m_dwDataSize; // Size of the allocated texture data.
CGU_UINT8* m_pData; // Pointer to the texture data
};
#endif // End of ASPM_CPU
#define SOURCE_BLOCK_SIZE 16 // Size of a source block in pixels (each pixel has RGBA:8888 channels)
#define COMPRESSED_BLOCK_SIZE 16 // Size of a compressed block in bytes
#define MAX_CHANNELS 4
#define MAX_SUBSETS 3 // Maximum number of possible subsets
#define MAX_SUBSET_SIZE 16 // Largest possible size for an individual subset
#define BC7_qFAST_THRESHOLD 0.50f
#define MAX_INDEX_BITS 4 // Maximum number of index bits
typedef struct
{
CGV_IMAGE image;
CGV_INDEX index;
} CMP_di;
typedef struct
{
CGV_IMAGE image;
CGV_UINT8 index;
} CMP_du;
#define MAX_PARTITION_ENTRIES 64
#define MAX_PARTITIONS_TABLE 193
#define MAX_PARTITIONS 64 // Maximum number of partition types
#define EPSILON 0.00390625f
#define DIMENSION 4
#define BlockX 4
#define BlockY 4
#define QUANT_RT 250.0f // quality = 0.05f
//==========================================================================================================
#define LOG_CL_RANGE 5
#define LOG_CL_BASE 2
#define BIT_BASE 5
#define BIT_RANGE 9
#define MAX_CLUSTERS_BIG 16
#define MAX_CLUSTERS 8
#define BTT(bits) (bits-BIT_BASE)
#define CLT(cl) (cl-LOG_CL_BASE)
#define MAX_TRY_QUANT_TRACE 2 // used in optQuantTrace_d : increasing this has no gain in quality!, keep it set at 2
#define MAX_TRY_SHAKER 5 // used in ep_shaker_2_d if set at 4 PSNR drops by -0.1 SSIM stays the same
#define NUM_BLOCK_TYPES 8 // Number of block types in the format
#define BC7_MAX_TRACE 25000
// If this is defined, ramp calculation is done via math floor and division.
// Otherwise, ramp calculation is done by bit shifting
#define USE_HIGH_PRECISION_INTERPOLATION_BC7
typedef struct
{
CGU_INT32 k;
CGV_FLOAT d;
} TRACE;
typedef struct
#ifdef ASPM
BC7_EncodeState
#endif
{
CGV_IMAGE image_src[64];
CGV_CMPOUT cmp_out[COMPRESSED_BLOCK_SIZE];
// Common
CGV_ERROR opaque_err; // error for coding alpha=255
CGV_ERROR best_err;
// set per mode
CGU_CHANNEL channels3or4;
CGU_UINT8 bits;
CGU_INT clusters;
CGU_BYTE componentBits;
CGU_UINT8 numPartitionModes;
CGU_INT maxSubSets;
CGU_UINT8 numClusters0[2];
CGU_UINT8 numClusters1[2];
CGU_UINT8 max_idxMode;
CGU_INT modeBits[2];
CGU_BOOL optimizedQ;
CGU_UINT32 validModeMask;
CGU_INT part_count;
CGU_CHANNEL channels;
// use_icmp
CGV_CMPOUTPACKED best_cmp_out[5];
CGV_BOOL cmp_isout16Bytes;
CGU_INT refineIterations;
CGU_INT fastSkipTreshold;
}
#ifndef ASPM
BC7_EncodeState
#endif
;
typedef struct
#ifdef ASPM
cmp_mode_parameters
#endif
{
CGV_EPOCODE color_qendpoint[8];
CGV_EPOCODE alpha_qendpoint[8];
CGV_INDEXPACKED best_color_index[2];
CGV_INDEXPACKED best_alpha_index[2];
CGV_INDEX color_index[SOURCE_BLOCK_SIZE];
CGV_INDEX alpha_index[SOURCE_BLOCK_SIZE];
CGV_SHIFT32 idxMode;
CGV_SHIFT32 rotated_channel;
}
#ifndef ASPM
cmp_mode_parameters
#endif
;
typedef struct
#ifdef ASPM
BC7_Encode
#endif
{
// Global data setup at initialization time
CGU_FLOAT quality; // range is 0 to 1
CGU_FLOAT errorThreshold; // use 5 to 75
CGU_UINT32 validModeMask; // bit for mode masks def to 0xFF
CGU_BOOL imageNeedsAlpha; // default: false
CGU_BOOL colourRestrict; // default: false
CGU_BOOL alphaRestrict; // default: false
// Used to track errors in internal state code
CGV_ERROR opaque_err;
CGV_ERROR best_err;
CGU_FLOAT minThreshold;
CGU_FLOAT maxThreshold;;
// icmp code settings
CGU_INT refineIterations;
CGU_INT part_count;
CGU_INT channels;
}
#ifndef ASPM
BC7_Encode
#endif
;
CMP_CONSTANT CGU_FLOAT rampWeights[5][SOURCE_BLOCK_SIZE] = {
{ 0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f}, // 0 bit index
{ 0.000000f,1.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f}, // 1 bit index
{ 0.000000f,0.328125f,0.671875f,1.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f}, // 2 bit index
{ 0.000000f,0.140625f,0.281250f,0.421875f,0.578125f,0.718750f,0.859375f,1.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f}, // 3 bit index
{ 0.000000f,0.062500f,0.140625f,0.203125f,0.265625f,0.328125f,0.406250f,0.468750f,0.531250f,0.593750f,0.671875f,0.734375f,0.796875f,0.859375f,0.937500f,1.000000f} // 4 bit index
};
#ifndef ASPM_GPU
typedef struct
#ifdef ASPM
BC7_EncodeRamps
#endif
{
CGU_INT ep_d[4][256];
#ifdef USE_BC7_SP_ERR_IDX
CGU_UINT8 sp_err[3*4*256*2*2*16];
CGU_INT sp_idx[3*4*256*2*2*16*2];
#endif
#ifdef USE_BC7_RAMP
CGU_FLOAT ramp[3*4*256*256*16];
#endif
CGU_BOOL ramp_init;
}
#ifndef ASPM
BC7_EncodeRamps
#endif
;
#endif
CMP_CONSTANT CGU_UINT8 npv_nd[2][8] = {
{1,2,4,8,16,32,0,0}, // 3
{1,2,4,0,0 ,0 ,0,0} // 4
};
typedef enum
{
NO_ALPHA,
COMBINED_ALPHA,
SEPARATE_ALPHA
} CMP_BCE;
// Endpoint encoding type
typedef enum
{
NO_PBIT,
ONE_PBIT,
TWO_PBIT,
THREE_PBIT,
FOUR_PBIT,
FIVE_PBIT
} CMP_PBIT;
typedef struct
#ifdef ASPM
BC7_Encode_local
#endif
{
// Data for compressing a particular block mode
CGV_INT clusters[2];
CGV_BYTE parityBits;
CGV_BYTE componentBits[MAX_CHANNELS];
CMP_BCE encodingType; // Type of block
CGU_UINT8 partitionBits; // Number of bits for partition data
CGU_UINT8 rotationBits; // Number of bits for component rotation
CGU_UINT8 indexModeBits; // Number of bits for index selection
CMP_PBIT pBitType; // Type of P-bit encoding
CGU_UINT8 subsetCount; // Number of subsets
CGU_UINT8 indexBits[2]; // Number of bits per index in each index set
// Bulky temporary data used during compression of a block
CGV_UINT8 storedindex[MAX_PARTITIONS][MAX_SUBSETS][MAX_SUBSET_SIZE];
CGV_ERROR storedError[MAX_PARTITIONS];
CGV_UINT8 sortedModes[MAX_PARTITIONS];
// This stores the min and max for the components of the block, and the ranges
CGV_IMAGE blockMin[MAX_CHANNELS];
CGV_IMAGE blockMax[MAX_CHANNELS];
CGV_IMAGE blockRange[MAX_CHANNELS];
CGV_IMAGE blockMaxRange;
}
#ifndef ASPM
BC7_Encode_local
#endif
;
typedef enum
{
CART,
SAME_PAR,
BCC,
SAME_FCC,
FCC,
FCC_SAME_BCC,
} CMP_qt;
// Block component encoding
// Descriptor structure for block encodings
typedef struct
{
uniform CMP_BCE encodingType; // Type of block
CGU_UINT8 partitionBits; // Number of bits for partition data
CGU_UINT8 rotationBits; // Number of bits for component rotation
CGU_UINT8 indexModeBits; // Number of bits for index selection
CGU_UINT8 scalarBits; // Number of bits for one scalar endpoint
CGU_UINT8 vectorBits; // Number of bits for one vector endpoint(excluding P bits)
uniform CMP_PBIT pBitType; // Type of P-bit encoding
CGU_UINT8 subsetCount; // Number of subsets
CGU_UINT8 indexBits[2]; // Number of bits per index in each index set
} CMP_BTI;
typedef enum
{
COMP_RED = 0,
COMP_GREEN = 1,
COMP_BLUE = 2,
COMP_ALPHA = 3
} COMPONENT;
CMP_CONSTANT CGU_UINT8 componentRotations[4][4] = {
{ COMP_ALPHA, COMP_RED, COMP_GREEN, COMP_BLUE },
{ COMP_RED, COMP_ALPHA, COMP_GREEN, COMP_BLUE },
{ COMP_GREEN, COMP_RED, COMP_ALPHA, COMP_BLUE },
{ COMP_BLUE, COMP_RED, COMP_GREEN, COMP_ALPHA }
};
CMP_CONSTANT CMP_BTI bti[NUM_BLOCK_TYPES] = {
//encodingType,partitionBits,rotationBits,indexModeBits,scalarBits,vectorBits,pBitType, subsetCount,indexBits[0]&[1]
{ NO_ALPHA, 4, 0, 0, 0, 12, TWO_PBIT, 3, { 3, 0 } }, // Format Mode 0
{ NO_ALPHA, 6, 0, 0, 0, 18, ONE_PBIT, 2, { 3, 0 } }, // Format Mode 1
{ NO_ALPHA, 6, 0, 0, 0, 15, NO_PBIT, 3, { 2, 0 } }, // Format Mode 2
{ NO_ALPHA, 6, 0, 0, 0, 21, TWO_PBIT, 2, { 2, 0 } }, // Format Mode 3
{ SEPARATE_ALPHA, 0, 2, 1, 6, 15, NO_PBIT, 1, { 2, 3 } }, // Format Mode 4
{ SEPARATE_ALPHA, 0, 2, 0, 8, 21, NO_PBIT, 1, { 2, 2 } }, // Format Mode 5
{ COMBINED_ALPHA, 0, 0, 0, 0, 28, TWO_PBIT, 1, { 4, 0 } }, // Format Mode 6
{ COMBINED_ALPHA, 6, 0, 0, 0, 20, TWO_PBIT, 2, { 2, 0 } } // Format Mode 7
};
CMP_CONSTANT CGU_UINT8 par_vectors_nd[2][8][64][2][4] = {
{ // 3D
{
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{1,1,1,0},{1,1,1,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{1,1,1,0}},{{1,1,1,0},{0,0,0,0}},{{1,1,1,0},{1,1,1,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,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,0,1,0},{1,0,1,0}},{{0,1,1,0},{0,1,1,0}},{{0,0,0,0},{1,1,1,0}},{{1,1,1,0},{0,0,0,0}},{{0,1,0,0},{0,1,0,0}},{{1,1,1,0},{1,1,1,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{1,1,0,0},{0,0,0,0}},{{1,0,1,0},{0,0,0,0}},{{0,1,1,0},{0,0,0,0}},{{0,0,0,0},{1,1,0,0}},{{1,1,0,0},{1,1,0,0}},{{1,0,1,0},{1,1,0,0}},{{0,1,1,0},{1,1,0,0}},
{{0,0,0,0},{1,0,1,0}},{{1,1,0,0},{1,0,1,0}},{{1,0,1,0},{1,0,1,0}},{{0,1,1,0},{1,0,1,0}},{{0,0,0,0},{0,1,1,0}},{{1,1,0,0},{0,1,1,0}},{{1,0,1,0},{0,1,1,0}},{{0,1,1,0},{0,1,1,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{1,1,0,0},{0,0,0,0}},{{1,0,1,0},{0,0,0,0}},{{0,1,1,0},{0,0,0,0}},{{0,0,0,0},{1,1,0,0}},{{1,1,0,0},{1,1,0,0}},{{1,0,1,0},{1,1,0,0}},{{0,1,1,0},{1,1,0,0}},
{{0,0,0,0},{1,0,1,0}},{{1,1,0,0},{1,0,1,0}},{{1,0,1,0},{1,0,1,0}},{{0,1,1,0},{1,0,1,0}},{{0,0,0,0},{0,1,1,0}},{{1,1,0,0},{0,1,1,0}},{{1,0,1,0},{0,1,1,0}},{{0,1,1,0},{0,1,1,0}},
{{1,0,0,0},{1,1,1,0}},{{0,1,0,0},{1,1,1,0}},{{0,0,1,0},{1,1,1,0}},{{1,1,1,0},{1,1,1,0}},{{1,0,0,0},{0,0,1,0}},{{0,1,0,0},{0,0,1,0}},{{0,0,1,0},{0,0,1,0}},{{1,1,1,0},{0,0,1,0}},
{{1,0,0,0},{1,0,0,0}},{{0,1,0,0},{1,0,0,0}},{{0,0,1,0},{1,0,0,0}},{{1,1,1,0},{1,0,0,0}},{{1,0,0,0},{0,1,0,0}},{{0,1,0,0},{0,1,0,0}},{{0,0,1,0},{0,1,0,0}},{{1,1,1,0},{0,1,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
},
{ // 4D
{
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{1,1,1,1},{1,1,1,1}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{1,1,1,1}},{{1,1,1,1},{0,0,0,0}},{{1,1,1,1},{1,1,1,1}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,1,1,1}},{{0,1,1,1},{0,0,0,0}},{{0,1,1,1},{0,1,1,1}},{{1,0,0,0},{1,0,0,0}},{{1,0,0,0},{1,1,1,1}},{{1,1,1,1},{1,0,0,0}},{{1,1,1,1},{1,1,1,1}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,1,1,1}},{{0,1,1,1},{0,0,0,0}},{{0,1,1,1},{0,1,1,1}},{{1,0,0,0},{1,0,0,0}},{{1,0,0,0},{1,1,1,1}},{{1,1,1,1},{1,0,0,0}},{{1,1,1,1},{1,1,1,1}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,1,1}},{{0,0,1,1},{0,0,0,0}},{{0,1,0,1},{0,1,0,1}},{{1,0,0,0},{1,0,0,0}},{{1,0,0,0},{1,0,1,1}},{{1,0,1,1},{1,0,0,0}},{{1,1,0,1},{1,1,0,1}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
},
};
#ifndef ASPM_GPU
// =============================== USED BY DECODER THIS CODE NEEDS TO BE UPDATED =========================================
CMP_CONSTANT CGU_UINT32 BC7_FIXUPINDICES_LOCAL[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}
},
};
CMP_STATIC void SetDefaultBC7Options(BC7_Encode *BC7Encode)
{
if (BC7Encode)
{
// Set for max quality
BC7Encode->quality = 1.0f;
BC7Encode->minThreshold = 5.0f;
BC7Encode->maxThreshold = 80.0f;
BC7Encode->errorThreshold = 5.0f;
BC7Encode->validModeMask = 0xFF;
BC7Encode->imageNeedsAlpha = FALSE;
BC7Encode->colourRestrict = FALSE;
BC7Encode->alphaRestrict = FALSE;
BC7Encode->channels = 4;
BC7Encode->part_count = 128;
}
}
#ifndef ASPM
//=====================
// Used by Decoder
//=====================
__constant CGU_FLOAT rampLerpWeightsBC7[5][16] =
{
{ 0.0 }, // 0 bit index
{ 0.0, 1.0 }, // 1 bit index
{ 0.0, 21.0 / 64.0, 43.0 / 64.0, 1.0 }, // 2 bit index
{ 0.0, 9.0 / 64.0, 18.0 / 64.0, 27.0 / 64.0, 37.0 / 64.0, 46.0 / 64.0, 55.0 / 64.0, 1.0 }, // 3 bit index
{ 0.0, 4.0 / 64.0, 9.0 / 64.0, 13.0 / 64.0, 17.0 / 64.0, 21.0 / 64.0, 26.0 / 64.0, 30.0 / 64.0,
34.0 / 64.0, 38.0 / 64.0, 43.0 / 64.0, 47.0 / 64.0, 51.0 / 64.0, 55.0 / 64.0, 60.0 / 64.0, 1.0 } // 4 bit index
};
__constant CGU_UINT8 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
},
},
};
#endif
#endif // !ASPM_GPU
#endif