Merge pull request #11761 from lioncash/mathrev
Common/MathUtil: Move remaining utilities into MathUtil namespace
This commit is contained in:
commit
969318ff66
|
@ -3092,7 +3092,7 @@ void ARM64FloatEmitter::FMOV(ARM64Reg Rd, uint8_t imm8)
|
||||||
// Vector
|
// Vector
|
||||||
void ARM64FloatEmitter::ADD(u8 size, ARM64Reg Rd, ARM64Reg Rn, ARM64Reg Rm)
|
void ARM64FloatEmitter::ADD(u8 size, ARM64Reg Rd, ARM64Reg Rn, ARM64Reg Rm)
|
||||||
{
|
{
|
||||||
EmitThreeSame(0, IntLog2(size) - 3, 0b10000, Rd, Rn, Rm);
|
EmitThreeSame(0, MathUtil::IntLog2(size) - 3, 0b10000, Rd, Rn, Rm);
|
||||||
}
|
}
|
||||||
void ARM64FloatEmitter::AND(ARM64Reg Rd, ARM64Reg Rn, ARM64Reg Rm)
|
void ARM64FloatEmitter::AND(ARM64Reg Rd, ARM64Reg Rn, ARM64Reg Rm)
|
||||||
{
|
{
|
||||||
|
|
|
@ -80,7 +80,6 @@ add_library(common
|
||||||
Logging/Log.h
|
Logging/Log.h
|
||||||
Logging/LogManager.cpp
|
Logging/LogManager.cpp
|
||||||
Logging/LogManager.h
|
Logging/LogManager.h
|
||||||
MathUtil.cpp
|
|
||||||
MathUtil.h
|
MathUtil.h
|
||||||
Matrix.cpp
|
Matrix.cpp
|
||||||
Matrix.h
|
Matrix.h
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
// Copyright 2008 Dolphin Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
#include "Common/MathUtil.h"
|
|
||||||
|
|
||||||
#include <numeric>
|
|
||||||
|
|
||||||
// Calculate sum of a float list
|
|
||||||
float MathFloatVectorSum(const std::vector<float>& Vec)
|
|
||||||
{
|
|
||||||
return std::accumulate(Vec.begin(), Vec.end(), 0.0f);
|
|
||||||
}
|
|
|
@ -8,7 +8,6 @@
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "Common/CommonTypes.h"
|
#include "Common/CommonTypes.h"
|
||||||
|
|
||||||
|
@ -186,12 +185,9 @@ private:
|
||||||
T m_variance{};
|
T m_variance{};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace MathUtil
|
|
||||||
|
|
||||||
float MathFloatVectorSum(const std::vector<float>&);
|
|
||||||
|
|
||||||
// Rounds down. 0 -> undefined
|
// Rounds down. 0 -> undefined
|
||||||
constexpr int IntLog2(u64 val)
|
constexpr int IntLog2(u64 val)
|
||||||
{
|
{
|
||||||
return 63 - std::countl_zero(val);
|
return 63 - std::countl_zero(val);
|
||||||
}
|
}
|
||||||
|
} // namespace MathUtil
|
||||||
|
|
|
@ -1223,7 +1223,7 @@ void Jit64::MultiplyImmediate(u32 imm, int a, int d, bool overflow)
|
||||||
// power of 2; just a shift
|
// power of 2; just a shift
|
||||||
if (MathUtil::IsPow2(imm))
|
if (MathUtil::IsPow2(imm))
|
||||||
{
|
{
|
||||||
u32 shift = IntLog2(imm);
|
u32 shift = MathUtil::IntLog2(imm);
|
||||||
// use LEA if it saves an op
|
// use LEA if it saves an op
|
||||||
if (d != a && shift <= 3 && shift >= 1 && Ra.IsSimpleReg())
|
if (d != a && shift <= 3 && shift >= 1 && Ra.IsSimpleReg())
|
||||||
{
|
{
|
||||||
|
@ -1731,7 +1731,7 @@ void Jit64::divwx(UGeckoInstruction inst)
|
||||||
TEST(32, R(dividend), R(dividend));
|
TEST(32, R(dividend), R(dividend));
|
||||||
LEA(32, sum, MDisp(dividend, abs_val - 1));
|
LEA(32, sum, MDisp(dividend, abs_val - 1));
|
||||||
CMOVcc(32, Rd, R(src), cond);
|
CMOVcc(32, Rd, R(src), cond);
|
||||||
SAR(32, Rd, Imm8(IntLog2(abs_val)));
|
SAR(32, Rd, Imm8(MathUtil::IntLog2(abs_val)));
|
||||||
|
|
||||||
if (divisor < 0)
|
if (divisor < 0)
|
||||||
NEG(32, Rd);
|
NEG(32, Rd);
|
||||||
|
|
|
@ -198,7 +198,7 @@ void Jit64::UpdateFPExceptionSummary(X64Reg fpscr, X64Reg tmp1, X64Reg tmp2)
|
||||||
// fpscr.VX = (fpscr & FPSCR_VX_ANY) != 0
|
// fpscr.VX = (fpscr & FPSCR_VX_ANY) != 0
|
||||||
TEST(32, R(fpscr), Imm32(FPSCR_VX_ANY));
|
TEST(32, R(fpscr), Imm32(FPSCR_VX_ANY));
|
||||||
SETcc(CC_NZ, R(tmp1));
|
SETcc(CC_NZ, R(tmp1));
|
||||||
SHL(32, R(tmp1), Imm8(IntLog2(FPSCR_VX)));
|
SHL(32, R(tmp1), Imm8(MathUtil::IntLog2(FPSCR_VX)));
|
||||||
AND(32, R(fpscr), Imm32(~(FPSCR_VX | FPSCR_FEX)));
|
AND(32, R(fpscr), Imm32(~(FPSCR_VX | FPSCR_FEX)));
|
||||||
OR(32, R(fpscr), R(tmp1));
|
OR(32, R(fpscr), R(tmp1));
|
||||||
|
|
||||||
|
@ -212,7 +212,7 @@ void Jit64::UpdateFPExceptionSummary(X64Reg fpscr, X64Reg tmp1, X64Reg tmp2)
|
||||||
// the TEST, and we can't use XOR right after the TEST since that would overwrite flags. However,
|
// the TEST, and we can't use XOR right after the TEST since that would overwrite flags. However,
|
||||||
// there is no false dependency, since SETcc depends on TEST's flags and TEST depends on tmp1.
|
// there is no false dependency, since SETcc depends on TEST's flags and TEST depends on tmp1.
|
||||||
SETcc(CC_NZ, R(tmp1));
|
SETcc(CC_NZ, R(tmp1));
|
||||||
SHL(32, R(tmp1), Imm8(IntLog2(FPSCR_FEX)));
|
SHL(32, R(tmp1), Imm8(MathUtil::IntLog2(FPSCR_FEX)));
|
||||||
OR(32, R(fpscr), R(tmp1));
|
OR(32, R(fpscr), R(tmp1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -97,7 +97,7 @@ FixupBranch EmuCodeBlock::BATAddressLookup(X64Reg addr, X64Reg tmp, const void*
|
||||||
MOV(64, R(tmp), ImmPtr(bat_table));
|
MOV(64, R(tmp), ImmPtr(bat_table));
|
||||||
SHR(32, R(addr), Imm8(PowerPC::BAT_INDEX_SHIFT));
|
SHR(32, R(addr), Imm8(PowerPC::BAT_INDEX_SHIFT));
|
||||||
MOV(32, R(addr), MComplex(tmp, addr, SCALE_4, 0));
|
MOV(32, R(addr), MComplex(tmp, addr, SCALE_4, 0));
|
||||||
BT(32, R(addr), Imm8(IntLog2(PowerPC::BAT_MAPPED_BIT)));
|
BT(32, R(addr), Imm8(MathUtil::IntLog2(PowerPC::BAT_MAPPED_BIT)));
|
||||||
|
|
||||||
return J_CC(CC_NC, m_far_code.Enabled());
|
return J_CC(CC_NC, m_far_code.Enabled());
|
||||||
}
|
}
|
||||||
|
|
|
@ -544,7 +544,7 @@ void JitArm64::WriteConditionalExceptionExit(int exception, ARM64Reg temp_gpr, A
|
||||||
u64 increment_sp_on_exit)
|
u64 increment_sp_on_exit)
|
||||||
{
|
{
|
||||||
LDR(IndexType::Unsigned, temp_gpr, PPC_REG, PPCSTATE_OFF(Exceptions));
|
LDR(IndexType::Unsigned, temp_gpr, PPC_REG, PPCSTATE_OFF(Exceptions));
|
||||||
FixupBranch no_exception = TBZ(temp_gpr, IntLog2(exception));
|
FixupBranch no_exception = TBZ(temp_gpr, MathUtil::IntLog2(exception));
|
||||||
|
|
||||||
const bool switch_to_far_code = !IsInFarCode();
|
const bool switch_to_far_code = !IsInFarCode();
|
||||||
|
|
||||||
|
@ -938,7 +938,7 @@ bool JitArm64::DoJit(u32 em_address, JitBlock* b, u32 nextPC)
|
||||||
|
|
||||||
// Inline exception check
|
// Inline exception check
|
||||||
LDR(IndexType::Unsigned, ARM64Reg::W30, PPC_REG, PPCSTATE_OFF(Exceptions));
|
LDR(IndexType::Unsigned, ARM64Reg::W30, PPC_REG, PPCSTATE_OFF(Exceptions));
|
||||||
FixupBranch no_ext_exception = TBZ(ARM64Reg::W30, IntLog2(EXCEPTION_EXTERNAL_INT));
|
FixupBranch no_ext_exception = TBZ(ARM64Reg::W30, MathUtil::IntLog2(EXCEPTION_EXTERNAL_INT));
|
||||||
FixupBranch exception = B();
|
FixupBranch exception = B();
|
||||||
SwitchToFarCode();
|
SwitchToFarCode();
|
||||||
const u8* done_here = GetCodePtr();
|
const u8* done_here = GetCodePtr();
|
||||||
|
@ -974,7 +974,7 @@ bool JitArm64::DoJit(u32 em_address, JitBlock* b, u32 nextPC)
|
||||||
ARM64Reg XA = EncodeRegTo64(WA);
|
ARM64Reg XA = EncodeRegTo64(WA);
|
||||||
|
|
||||||
LDR(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(Exceptions));
|
LDR(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(Exceptions));
|
||||||
FixupBranch no_ext_exception = TBZ(WA, IntLog2(EXCEPTION_EXTERNAL_INT));
|
FixupBranch no_ext_exception = TBZ(WA, MathUtil::IntLog2(EXCEPTION_EXTERNAL_INT));
|
||||||
FixupBranch exception = B();
|
FixupBranch exception = B();
|
||||||
SwitchToFarCode();
|
SwitchToFarCode();
|
||||||
const u8* done_here = GetCodePtr();
|
const u8* done_here = GetCodePtr();
|
||||||
|
|
|
@ -909,7 +909,7 @@ bool JitArm64::MultiplyImmediate(u32 imm, int a, int d, bool rc)
|
||||||
else if (MathUtil::IsPow2(imm))
|
else if (MathUtil::IsPow2(imm))
|
||||||
{
|
{
|
||||||
// Multiplication by a power of two (2^n).
|
// Multiplication by a power of two (2^n).
|
||||||
const int shift = IntLog2(imm);
|
const int shift = MathUtil::IntLog2(imm);
|
||||||
|
|
||||||
gpr.BindToRegister(d, d == a);
|
gpr.BindToRegister(d, d == a);
|
||||||
LSL(gpr.R(d), gpr.R(a), shift);
|
LSL(gpr.R(d), gpr.R(a), shift);
|
||||||
|
@ -919,7 +919,7 @@ bool JitArm64::MultiplyImmediate(u32 imm, int a, int d, bool rc)
|
||||||
else if (MathUtil::IsPow2(imm - 1))
|
else if (MathUtil::IsPow2(imm - 1))
|
||||||
{
|
{
|
||||||
// Multiplication by a power of two plus one (2^n + 1).
|
// Multiplication by a power of two plus one (2^n + 1).
|
||||||
const int shift = IntLog2(imm - 1);
|
const int shift = MathUtil::IntLog2(imm - 1);
|
||||||
|
|
||||||
gpr.BindToRegister(d, d == a);
|
gpr.BindToRegister(d, d == a);
|
||||||
ADD(gpr.R(d), gpr.R(a), gpr.R(a), ArithOption(gpr.R(a), ShiftType::LSL, shift));
|
ADD(gpr.R(d), gpr.R(a), gpr.R(a), ArithOption(gpr.R(a), ShiftType::LSL, shift));
|
||||||
|
@ -929,7 +929,7 @@ bool JitArm64::MultiplyImmediate(u32 imm, int a, int d, bool rc)
|
||||||
else if (MathUtil::IsPow2(~imm + 1))
|
else if (MathUtil::IsPow2(~imm + 1))
|
||||||
{
|
{
|
||||||
// Multiplication by a negative power of two (-(2^n)).
|
// Multiplication by a negative power of two (-(2^n)).
|
||||||
const int shift = IntLog2(~imm + 1);
|
const int shift = MathUtil::IntLog2(~imm + 1);
|
||||||
|
|
||||||
gpr.BindToRegister(d, d == a);
|
gpr.BindToRegister(d, d == a);
|
||||||
NEG(gpr.R(d), gpr.R(a), ArithOption(gpr.R(a), ShiftType::LSL, shift));
|
NEG(gpr.R(d), gpr.R(a), ArithOption(gpr.R(a), ShiftType::LSL, shift));
|
||||||
|
@ -939,7 +939,7 @@ bool JitArm64::MultiplyImmediate(u32 imm, int a, int d, bool rc)
|
||||||
else if (MathUtil::IsPow2(~imm + 2))
|
else if (MathUtil::IsPow2(~imm + 2))
|
||||||
{
|
{
|
||||||
// Multiplication by a negative power of two plus one (-(2^n) + 1).
|
// Multiplication by a negative power of two plus one (-(2^n) + 1).
|
||||||
const int shift = IntLog2(~imm + 2);
|
const int shift = MathUtil::IntLog2(~imm + 2);
|
||||||
|
|
||||||
gpr.BindToRegister(d, d == a);
|
gpr.BindToRegister(d, d == a);
|
||||||
SUB(gpr.R(d), gpr.R(a), gpr.R(a), ArithOption(gpr.R(a), ShiftType::LSL, shift));
|
SUB(gpr.R(d), gpr.R(a), gpr.R(a), ArithOption(gpr.R(a), ShiftType::LSL, shift));
|
||||||
|
@ -1603,9 +1603,9 @@ void JitArm64::divwx(UGeckoInstruction inst)
|
||||||
CSEL(WA, RA, WA, CCFlags::CC_PL);
|
CSEL(WA, RA, WA, CCFlags::CC_PL);
|
||||||
|
|
||||||
if (divisor < 0)
|
if (divisor < 0)
|
||||||
NEG(RD, WA, ArithOption(WA, ShiftType::ASR, IntLog2(abs_val)));
|
NEG(RD, WA, ArithOption(WA, ShiftType::ASR, MathUtil::IntLog2(abs_val)));
|
||||||
else
|
else
|
||||||
ASR(RD, WA, IntLog2(abs_val));
|
ASR(RD, WA, MathUtil::IntLog2(abs_val));
|
||||||
|
|
||||||
if (allocate_reg)
|
if (allocate_reg)
|
||||||
gpr.Unlock(WA);
|
gpr.Unlock(WA);
|
||||||
|
|
|
@ -347,7 +347,7 @@ FixupBranch JitArm64::BATAddressLookup(ARM64Reg addr_out, ARM64Reg addr_in, ARM6
|
||||||
MOVP2R(tmp, bat_table);
|
MOVP2R(tmp, bat_table);
|
||||||
LSR(addr_out, addr_in, PowerPC::BAT_INDEX_SHIFT);
|
LSR(addr_out, addr_in, PowerPC::BAT_INDEX_SHIFT);
|
||||||
LDR(addr_out, tmp, ArithOption(addr_out, true));
|
LDR(addr_out, tmp, ArithOption(addr_out, true));
|
||||||
FixupBranch pass = TBNZ(addr_out, IntLog2(PowerPC::BAT_MAPPED_BIT));
|
FixupBranch pass = TBNZ(addr_out, MathUtil::IntLog2(PowerPC::BAT_MAPPED_BIT));
|
||||||
FixupBranch fail = B();
|
FixupBranch fail = B();
|
||||||
SetJumpTarget(pass);
|
SetJumpTarget(pass);
|
||||||
return fail;
|
return fail;
|
||||||
|
@ -361,7 +361,7 @@ FixupBranch JitArm64::CheckIfSafeAddress(Arm64Gen::ARM64Reg addr, Arm64Gen::ARM6
|
||||||
MOVP2R(tmp2, m_mmu.GetDBATTable().data());
|
MOVP2R(tmp2, m_mmu.GetDBATTable().data());
|
||||||
LSR(tmp1, addr, PowerPC::BAT_INDEX_SHIFT);
|
LSR(tmp1, addr, PowerPC::BAT_INDEX_SHIFT);
|
||||||
LDR(tmp1, tmp2, ArithOption(tmp1, true));
|
LDR(tmp1, tmp2, ArithOption(tmp1, true));
|
||||||
FixupBranch pass = TBNZ(tmp1, IntLog2(PowerPC::BAT_PHYSICAL_BIT));
|
FixupBranch pass = TBNZ(tmp1, MathUtil::IntLog2(PowerPC::BAT_PHYSICAL_BIT));
|
||||||
FixupBranch fail = B();
|
FixupBranch fail = B();
|
||||||
SetJumpTarget(pass);
|
SetJumpTarget(pass);
|
||||||
return fail;
|
return fail;
|
||||||
|
|
|
@ -60,13 +60,13 @@ void JitArm64::UpdateFPExceptionSummary(ARM64Reg fpscr)
|
||||||
MOVI2R(WA, FPSCR_VX_ANY);
|
MOVI2R(WA, FPSCR_VX_ANY);
|
||||||
TST(WA, fpscr);
|
TST(WA, fpscr);
|
||||||
CSET(WA, CCFlags::CC_NEQ);
|
CSET(WA, CCFlags::CC_NEQ);
|
||||||
BFI(fpscr, WA, IntLog2(FPSCR_VX), 1);
|
BFI(fpscr, WA, MathUtil::IntLog2(FPSCR_VX), 1);
|
||||||
|
|
||||||
// fpscr.FEX = ((fpscr >> 22) & (fpscr & FPSCR_ANY_E)) != 0
|
// fpscr.FEX = ((fpscr >> 22) & (fpscr & FPSCR_ANY_E)) != 0
|
||||||
AND(WA, fpscr, LogicalImm(FPSCR_ANY_E, 32));
|
AND(WA, fpscr, LogicalImm(FPSCR_ANY_E, 32));
|
||||||
TST(WA, fpscr, ArithOption(fpscr, ShiftType::LSR, 22));
|
TST(WA, fpscr, ArithOption(fpscr, ShiftType::LSR, 22));
|
||||||
CSET(WA, CCFlags::CC_NEQ);
|
CSET(WA, CCFlags::CC_NEQ);
|
||||||
BFI(fpscr, WA, IntLog2(FPSCR_FEX), 1);
|
BFI(fpscr, WA, MathUtil::IntLog2(FPSCR_FEX), 1);
|
||||||
|
|
||||||
gpr.Unlock(WA);
|
gpr.Unlock(WA);
|
||||||
}
|
}
|
||||||
|
|
|
@ -773,7 +773,6 @@
|
||||||
<ClCompile Include="Common\LdrWatcher.cpp" />
|
<ClCompile Include="Common\LdrWatcher.cpp" />
|
||||||
<ClCompile Include="Common\Logging\ConsoleListenerWin.cpp" />
|
<ClCompile Include="Common\Logging\ConsoleListenerWin.cpp" />
|
||||||
<ClCompile Include="Common\Logging\LogManager.cpp" />
|
<ClCompile Include="Common\Logging\LogManager.cpp" />
|
||||||
<ClCompile Include="Common\MathUtil.cpp" />
|
|
||||||
<ClCompile Include="Common\Matrix.cpp" />
|
<ClCompile Include="Common\Matrix.cpp" />
|
||||||
<ClCompile Include="Common\MemArenaWin.cpp" />
|
<ClCompile Include="Common\MemArenaWin.cpp" />
|
||||||
<ClCompile Include="Common\MemoryUtil.cpp" />
|
<ClCompile Include="Common\MemoryUtil.cpp" />
|
||||||
|
|
|
@ -547,7 +547,7 @@ std::string FormatSize(u64 bytes, int decimals)
|
||||||
// div 10 to get largest named unit less than size
|
// div 10 to get largest named unit less than size
|
||||||
// 10 == log2(1024) (number of B in a KiB, KiB in a MiB, etc)
|
// 10 == log2(1024) (number of B in a KiB, KiB in a MiB, etc)
|
||||||
// Max value is 63 / 10 = 6
|
// Max value is 63 / 10 = 6
|
||||||
const int unit = IntLog2(std::max<u64>(bytes, 1)) / 10;
|
const int unit = MathUtil::IntLog2(std::max<u64>(bytes, 1)) / 10;
|
||||||
|
|
||||||
// Don't need exact values, only 5 most significant digits
|
// Don't need exact values, only 5 most significant digits
|
||||||
const double unit_size = std::pow(2, unit * 10);
|
const double unit_size = std::pow(2, unit * 10);
|
||||||
|
|
|
@ -25,7 +25,7 @@ static u32 GenBuffer()
|
||||||
|
|
||||||
StreamBuffer::StreamBuffer(u32 type, u32 size)
|
StreamBuffer::StreamBuffer(u32 type, u32 size)
|
||||||
: m_buffer(GenBuffer()), m_buffertype(type), m_size(MathUtil::NextPowerOf2(size)),
|
: m_buffer(GenBuffer()), m_buffertype(type), m_size(MathUtil::NextPowerOf2(size)),
|
||||||
m_bit_per_slot(IntLog2(MathUtil::NextPowerOf2(size) / SYNC_POINTS))
|
m_bit_per_slot(MathUtil::IntLog2(MathUtil::NextPowerOf2(size) / SYNC_POINTS))
|
||||||
{
|
{
|
||||||
m_iterator = 0;
|
m_iterator = 0;
|
||||||
m_used_iterator = 0;
|
m_used_iterator = 0;
|
||||||
|
|
|
@ -202,9 +202,9 @@ static void WriteSwizzler(ShaderCode& code, const EFBCopyParams& params, APIType
|
||||||
const int blkH = TexDecoder_GetEFBCopyBlockHeightInTexels(params.copy_format);
|
const int blkH = TexDecoder_GetEFBCopyBlockHeightInTexels(params.copy_format);
|
||||||
int samples = GetEncodedSampleCount(params.copy_format);
|
int samples = GetEncodedSampleCount(params.copy_format);
|
||||||
|
|
||||||
code.Write(" int x_block_position = (uv1.x >> {}) << {};\n", IntLog2(blkH * blkW / samples),
|
code.Write(" int x_block_position = (uv1.x >> {}) << {};\n",
|
||||||
IntLog2(blkW));
|
MathUtil::IntLog2(blkH * blkW / samples), MathUtil::IntLog2(blkW));
|
||||||
code.Write(" int y_block_position = uv1.y << {};\n", IntLog2(blkH));
|
code.Write(" int y_block_position = uv1.y << {};\n", MathUtil::IntLog2(blkH));
|
||||||
if (samples == 1)
|
if (samples == 1)
|
||||||
{
|
{
|
||||||
// With samples == 1, we write out pairs of blocks; one A8R8, one G8B8.
|
// With samples == 1, we write out pairs of blocks; one A8R8, one G8B8.
|
||||||
|
@ -212,9 +212,10 @@ static void WriteSwizzler(ShaderCode& code, const EFBCopyParams& params, APIType
|
||||||
samples = 2;
|
samples = 2;
|
||||||
}
|
}
|
||||||
code.Write(" int offset_in_block = uv1.x & {};\n", (blkH * blkW / samples) - 1);
|
code.Write(" int offset_in_block = uv1.x & {};\n", (blkH * blkW / samples) - 1);
|
||||||
code.Write(" int y_offset_in_block = offset_in_block >> {};\n", IntLog2(blkW / samples));
|
code.Write(" int y_offset_in_block = offset_in_block >> {};\n",
|
||||||
|
MathUtil::IntLog2(blkW / samples));
|
||||||
code.Write(" int x_offset_in_block = (offset_in_block & {}) << {};\n", (blkW / samples) - 1,
|
code.Write(" int x_offset_in_block = (offset_in_block & {}) << {};\n", (blkW / samples) - 1,
|
||||||
IntLog2(samples));
|
MathUtil::IntLog2(samples));
|
||||||
|
|
||||||
code.Write(" sampleUv.x = x_block_position + x_offset_in_block;\n"
|
code.Write(" sampleUv.x = x_block_position + x_offset_in_block;\n"
|
||||||
" sampleUv.y = y_block_position + y_offset_in_block;\n");
|
" sampleUv.y = y_block_position + y_offset_in_block;\n");
|
||||||
|
|
|
@ -83,7 +83,7 @@ TextureInfo::TextureInfo(u32 stage, const u8* ptr, const u8* tlut_ptr, u32 addre
|
||||||
// e.g. 64x64 with 7 LODs would have the mipmap chain 64x64,32x32,16x16,8x8,4x4,2x2,1x1,0x0, so
|
// e.g. 64x64 with 7 LODs would have the mipmap chain 64x64,32x32,16x16,8x8,4x4,2x2,1x1,0x0, so
|
||||||
// we limit the mipmap count to 6 there
|
// we limit the mipmap count to 6 there
|
||||||
const u32 limited_mip_count =
|
const u32 limited_mip_count =
|
||||||
std::min<u32>(IntLog2(std::max(width, height)) + 1, raw_mip_count + 1) - 1;
|
std::min<u32>(MathUtil::IntLog2(std::max(width, height)) + 1, raw_mip_count + 1) - 1;
|
||||||
|
|
||||||
// load mips
|
// load mips
|
||||||
const u8* src_data = m_ptr + GetTextureSize();
|
const u8* src_data = m_ptr + GetTextureSize();
|
||||||
|
|
|
@ -7,15 +7,15 @@
|
||||||
|
|
||||||
TEST(MathUtil, IntLog2)
|
TEST(MathUtil, IntLog2)
|
||||||
{
|
{
|
||||||
EXPECT_EQ(0, IntLog2(1));
|
EXPECT_EQ(0, MathUtil::IntLog2(1));
|
||||||
EXPECT_EQ(1, IntLog2(2));
|
EXPECT_EQ(1, MathUtil::IntLog2(2));
|
||||||
EXPECT_EQ(2, IntLog2(4));
|
EXPECT_EQ(2, MathUtil::IntLog2(4));
|
||||||
EXPECT_EQ(3, IntLog2(8));
|
EXPECT_EQ(3, MathUtil::IntLog2(8));
|
||||||
EXPECT_EQ(63, IntLog2(0x8000000000000000ull));
|
EXPECT_EQ(63, MathUtil::IntLog2(0x8000000000000000ull));
|
||||||
|
|
||||||
// Rounding behavior.
|
// Rounding behavior.
|
||||||
EXPECT_EQ(3, IntLog2(15));
|
EXPECT_EQ(3, MathUtil::IntLog2(15));
|
||||||
EXPECT_EQ(63, IntLog2(0xFFFFFFFFFFFFFFFFull));
|
EXPECT_EQ(63, MathUtil::IntLog2(0xFFFFFFFFFFFFFFFFull));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(MathUtil, NextPowerOf2)
|
TEST(MathUtil, NextPowerOf2)
|
||||||
|
|
Loading…
Reference in New Issue