2020-07-31 11:31:32 +08:00

127 lines
5.3 KiB
C++

//===============================================================================
// Copyright (c) 2014-2016 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 _BC6H_ENCODE_H_
#define _BC6H_ENCODE_H_
#include "Compressonator.h"
#include "BC6H_Definitions.h"
#include <float.h>
//#define DEBUG_PATTERNS // Define if you want to debug pattern matching
//#define USE_KNOWN_PATTERNS // Enable this if you want to bipass using user images and use the known 32 BC6H patterns
#ifdef DEBUG_PATTERNS
#define TOP_OFFSET 0
#define BASE_OFFSET 0
#define RANDOM_NOISE_LEVEL 10
#endif
#define NOISE_BAND_WIDTH 0.2
#define LEVEL_BAND_GAP 0.2
#define DELTA_UP 0
#define DELTA_RIGHT 1
#define DELTA_DOWN 2
#define DELTA_LEFT 3
class BC6HBlockEncoder
{
public:
BC6HBlockEncoder(CMP_BC6H_BLOCK_PARAMETERS user_options)
{
m_quality = user_options.fQuality;
m_useMonoShapePatterns = user_options.bUsePatternRec;
m_isSigned = user_options.bIsSigned;
m_ModeMask = user_options.dwMask;
m_Exposure = user_options.fExposure;
m_bAverageEndPoint = true;
m_DiffLevel = 0.01f;
};
~BC6HBlockEncoder(){};
float CompressBlock(float in[MAX_SUBSET_SIZE][MAX_DIMENSION_BIG],BYTE out[COMPRESSED_BLOCK_SIZE]);
void clampF16Max(float EndPoints[MAX_SUBSETS][MAX_END_POINTS][MAX_DIMENSION_BIG]);
void AverageEndPoint(float EndPoints[MAX_SUBSETS][MAX_END_POINTS][MAX_DIMENSION_BIG], float iEndPoints[MAX_SUBSETS][MAX_END_POINTS][MAX_DIMENSION_BIG], int max_subsets, int mode);
void QuantizeEndPointToF16Prec(float EndPoints[MAX_SUBSETS][MAX_END_POINTS][MAX_DIMENSION_BIG], int iEndPoints[MAX_SUBSETS][MAX_END_POINTS][MAX_DIMENSION_BIG], int max_subsets, int prec);
void SwapIndices(int iEndPoints[MAX_SUBSETS][MAX_END_POINTS][MAX_DIMENSION_BIG], int iIndices[3][MAX_SUBSET_SIZE], int entryCount[MAX_SUBSETS], int max_subsets, int mode, int shape_pattern);
bool TransformEndPoints(AMD_BC6H_Format &BC6H_data, int iEndPoints[MAX_SUBSETS][MAX_END_POINTS][MAX_DIMENSION_BIG], int oEndPoints[MAX_SUBSETS][MAX_END_POINTS][MAX_DIMENSION_BIG],int max_subsets, int mode);
private:
#ifdef DEBUG_PATTERNS
float DoPixelNoise(); // Used for debugging... adds existing shape patterns with random noise
#endif
/*
Reserved Feature MONOSHAPE_PATTERNS
int BC6HBlockEncoder::FindPattern();
*/
float FindBestPattern(AMD_BC6H_Format &BC6H_data,
bool TwoRegionShapes,
int shape_pattern);
float EncodePattern(AMD_BC6H_Format &BC6H_data,
float error);
void SaveCompressedBlockData(AMD_BC6H_Format &BC6H_data,
int oEndPoints[MAX_SUBSETS][MAX_END_POINTS][MAX_DIMENSION_BIG],
int iIndices[3][MAX_SUBSET_SIZE],
int max_subsets,
int mode);
// ==========================================================
// Reserved Feature
// ==========================================================
bool m_useMonoShapePatterns;
// ==========================================================
// Bulky temporary data used during compression of a block
// ==========================================================
int m_sortedModes[MAX_PARTITIONS];
// This stores the min and max for the components of the block, and the ranges
float m_blockMin[MAX_DIMENSION_BIG];
float m_blockMax[MAX_DIMENSION_BIG];
float m_blockRange[MAX_DIMENSION_BIG];
float m_blockMaxRange;
// data setup at initialization time
float m_quality;
DWORD m_ModeMask;
bool m_isSigned;
float m_Exposure;
bool m_bAverageEndPoint; // Enables Averaging Endpoints for low bits modes
float m_DiffLevel; // Threashhold for Channel diferance to set Averages value of channels on Endpoints
};
#endif