//===================================================================== // 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