mirror of
https://github.com/BinomialLLC/basis_universal.git
synced 2026-06-08 08:33:53 +00:00
new files
This commit is contained in:
21
CppProperties.json
Normal file
21
CppProperties.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"configurations": [
|
||||
{
|
||||
"inheritEnvironments": [
|
||||
"msvc_x64"
|
||||
],
|
||||
"name": "x64-Release",
|
||||
"includePath": [
|
||||
"${env.INCLUDE}",
|
||||
"${workspaceRoot}\\**"
|
||||
],
|
||||
"defines": [
|
||||
"WIN32",
|
||||
"NDEBUG",
|
||||
"UNICODE",
|
||||
"_UNICODE"
|
||||
],
|
||||
"intelliSenseMode": "windows-msvc-x64"
|
||||
}
|
||||
]
|
||||
}
|
||||
4090
basisu_uastc_enc.cpp
Normal file
4090
basisu_uastc_enc.cpp
Normal file
File diff suppressed because it is too large
Load Diff
125
basisu_uastc_enc.h
Normal file
125
basisu_uastc_enc.h
Normal file
@@ -0,0 +1,125 @@
|
||||
// basisu_uastc_enc.h
|
||||
// Copyright (C) 2019-2020 Binomial LLC. All Rights Reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
#pragma once
|
||||
#include "basisu_etc.h"
|
||||
|
||||
#include "transcoder/basisu_transcoder_uastc.h"
|
||||
|
||||
namespace basisu
|
||||
{
|
||||
const uint32_t TOTAL_PACK_UASTC_LEVELS = 5;
|
||||
|
||||
enum
|
||||
{
|
||||
// Fastest is the lowest quality, although it's stil substantially higher quality vs. BC1/ETC1. It supports 5 modes.
|
||||
// The output may be somewhat blocky because this setting doesn't support 2/3-subset UASTC modes, but it should be less blocky vs. BC1/ETC1.
|
||||
// This setting doesn't write BC1 hints, so BC1 transcoding will be slower.
|
||||
// Transcoded ETC1 quality will be lower because it only considers 2 hints out of 32.
|
||||
// Avg. 43.45 dB
|
||||
cPackUASTCLevelFastest = 0,
|
||||
|
||||
// Faster is ~3x slower than fastest. It supports 9 modes.
|
||||
// Avg. 46.49 dB
|
||||
cPackUASTCLevelFaster = 1,
|
||||
|
||||
// Default is ~5.5x slower than fastest. It supports 14 modes.
|
||||
// Avg. 47.47 dB
|
||||
cPackUASTCLevelDefault = 2,
|
||||
|
||||
// Slower is ~14.5x slower than fastest. It supports all 18 modes.
|
||||
// Avg. 48.01 dB
|
||||
cPackUASTCLevelSlower = 3,
|
||||
|
||||
// VerySlow is ~200x slower than fastest.
|
||||
// The best quality the codec is capable of, but you'll need to be patient or have a lot of cores.
|
||||
// Avg. 48.24 dB
|
||||
cPackUASTCLevelVerySlow = 4,
|
||||
|
||||
cPackUASTCLevelMask = 0xF,
|
||||
|
||||
// By default the encoder tries to strike a balance between UASTC and transcoded BC7 quality.
|
||||
// These flags allow you to favor only optimizing for lowest UASTC error, or lowest BC7 error.
|
||||
cPackUASTCFavorUASTCError = 8,
|
||||
cPackUASTCFavorBC7Error = 16,
|
||||
|
||||
cPackUASTCETC1FasterHints = 64,
|
||||
cPackUASTCETC1FastestHints = 128,
|
||||
cPackUASTCETC1DisableFlipAndIndividual = 256,
|
||||
};
|
||||
|
||||
// pRGBAPixels: Pointer to source 4x4 block of RGBA pixels (R first in memory).
|
||||
// block: Reference to destination UASTC block.
|
||||
// level: Controls compression speed vs. performance tradeoff.
|
||||
void encode_uastc(const uint8_t* pRGBAPixels, basist::uastc_block& output_block, uint32_t flags = cPackUASTCLevelDefault);
|
||||
|
||||
struct uastc_encode_results
|
||||
{
|
||||
uint32_t m_uastc_mode;
|
||||
uint32_t m_common_pattern;
|
||||
basist::astc_block_desc m_astc;
|
||||
color_rgba m_solid_color;
|
||||
uint64_t m_astc_err;
|
||||
};
|
||||
|
||||
void pack_uastc(basist::uastc_block& blk, const uastc_encode_results& result, const etc_block& etc1_blk, uint32_t etc1_bias, const eac_a8_block& etc_eac_a8_blk, bool bc1_hint0, bool bc1_hint1);
|
||||
const float UASTC_RDO_DEFAULT_MAX_ALLOWED_RMS_INCREASE_RATIO = 10.0f;
|
||||
const float UASTC_RDO_DEFAULT_SKIP_BLOCK_RMS_THRESH = 8.0f;
|
||||
|
||||
struct uastc_rdo_params
|
||||
{
|
||||
uastc_rdo_params()
|
||||
{
|
||||
clear();
|
||||
}
|
||||
|
||||
void clear()
|
||||
{
|
||||
m_quality_scaler = 1.0f;
|
||||
m_lz_dict_size = 32768;
|
||||
m_langrangian_multiplier = 0.025f;
|
||||
m_max_allowed_rms_increase_ratio = UASTC_RDO_DEFAULT_MAX_ALLOWED_RMS_INCREASE_RATIO;
|
||||
m_skip_block_rms_thresh = UASTC_RDO_DEFAULT_SKIP_BLOCK_RMS_THRESH;
|
||||
m_endpoint_refinement = true;
|
||||
m_lz_literal_cost = 100;
|
||||
}
|
||||
|
||||
// m_quality_scaler: This value controls the overall quality vs. size tradeoff. Smaller values=larger/higher quality, 0=no change, larger values=smaller/lower quality.
|
||||
// Good range to try is .2-2.5.
|
||||
float m_quality_scaler;
|
||||
|
||||
// m_lz_dict_size: Size of LZ dictionary to simulate in bytes. The larger this value, the slower the encoder but the higher the quality per LZ compressed bit.
|
||||
uint32_t m_lz_dict_size;
|
||||
|
||||
// m_langrangian_multiplier: The post-processor tries to reduce rate+distortion*langrangian_mul (rate is approximate LZ bits and distortion is squared error).
|
||||
// Larger values push the postprocessor towards optimizing more for lower distortion, and smaller values more for rate.
|
||||
float m_langrangian_multiplier;
|
||||
|
||||
// m_max_allowed_rms_increase_ratio: How much the RMS error of a block is allowed to increase before a trial is rejected. 1.0=no increase allowed, 1.05=5% increase allowed, etc.
|
||||
float m_max_allowed_rms_increase_ratio;
|
||||
|
||||
// m_skip_block_rms_thresh: Blocks with this much RMS error or more are completely skipped by the RDO encoder.
|
||||
float m_skip_block_rms_thresh;
|
||||
|
||||
// m_endpoint_refinement: If true, the post-process will attempt to refine the endpoints of blocks with modified selectors.
|
||||
bool m_endpoint_refinement;
|
||||
|
||||
uint32_t m_lz_literal_cost;
|
||||
};
|
||||
|
||||
// num_blocks, pBlocks: Number of blocks and pointer to UASTC blocks to process.
|
||||
// pBlock_pixels: Pointer to an array of 4x4 blocks containing the original texture pixels. This is NOT a raster image, but a pointer to individual 4x4 blocks.
|
||||
// flags: Pass in the same flags used to encode the UASTC blocks. The flags are used to reencode the transcode hints in the same way.
|
||||
bool uastc_rdo(uint32_t num_blocks, basist::uastc_block* pBlocks, const color_rgba* pBlock_pixels, const uastc_rdo_params ¶ms, uint32_t flags = cPackUASTCLevelDefault, job_pool* pJob_pool = nullptr, uint32_t total_jobs = 0);
|
||||
} // namespace basisu
|
||||
Reference in New Issue
Block a user