mirror of https://github.com/PCSX2/pcsx2.git
Misc: Use std::bit_ceil()/std::has_single_bit()
This commit is contained in:
parent
2b4c7d12b6
commit
9191e8ce91
|
@ -75,46 +75,9 @@ namespace Common
|
||||||
return value & static_cast<T>(~static_cast<T>(alignment - 1));
|
return value & static_cast<T>(~static_cast<T>(alignment - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
static constexpr __fi bool IsPow2(T value)
|
|
||||||
{
|
|
||||||
return (value & (value - 1)) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
static constexpr __fi T PreviousPow2(T value)
|
|
||||||
{
|
|
||||||
if (value == static_cast<T>(0))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
value |= (value >> 1);
|
|
||||||
value |= (value >> 2);
|
|
||||||
value |= (value >> 4);
|
|
||||||
value |= (value >> 8);
|
|
||||||
value |= (value >> 16);
|
|
||||||
return value - (value >> 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
static constexpr __fi T NextPow2(T value)
|
|
||||||
{
|
|
||||||
if (value == static_cast<T>(0))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
value--;
|
|
||||||
value |= value >> 1;
|
|
||||||
value |= value >> 2;
|
|
||||||
value |= value >> 4;
|
|
||||||
value |= value >> 8;
|
|
||||||
value |= value >> 16;
|
|
||||||
value++;
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
static constexpr T PageAlign(T size)
|
static constexpr T PageAlign(T size)
|
||||||
{
|
{
|
||||||
static_assert(Common::IsPow2(__pagesize), "Page size is a power of 2");
|
|
||||||
return Common::AlignUpPow2(size, __pagesize);
|
return Common::AlignUpPow2(size, __pagesize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* PCSX2 - PS2 Emulator for PCs
|
/* PCSX2 - PS2 Emulator for PCs
|
||||||
* Copyright (C) 2002-2021 PCSX2 Dev Team
|
* Copyright (C) 2002-2023 PCSX2 Dev Team
|
||||||
*
|
*
|
||||||
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
||||||
* of the GNU Lesser General Public License as published by the Free Software Found-
|
* of the GNU Lesser General Public License as published by the Free Software Found-
|
||||||
|
@ -19,6 +19,7 @@
|
||||||
#include "GS/GSPng.h"
|
#include "GS/GSPng.h"
|
||||||
#include "common/BitUtils.h"
|
#include "common/BitUtils.h"
|
||||||
#include "common/StringUtil.h"
|
#include "common/StringUtil.h"
|
||||||
|
#include <bit>
|
||||||
#include <bitset>
|
#include <bitset>
|
||||||
|
|
||||||
GSTexture::GSTexture() = default;
|
GSTexture::GSTexture() = default;
|
||||||
|
@ -164,7 +165,7 @@ u32 GSDownloadTexture::GetBufferSize(u32 width, u32 height, GSTexture::Format fo
|
||||||
const u32 bw = (width + (block_size - 1)) / block_size;
|
const u32 bw = (width + (block_size - 1)) / block_size;
|
||||||
const u32 bh = (height + (block_size - 1)) / block_size;
|
const u32 bh = (height + (block_size - 1)) / block_size;
|
||||||
|
|
||||||
pxAssert(Common::IsPow2(pitch_align));
|
pxAssert(std::has_single_bit(pitch_align));
|
||||||
const u32 pitch = Common::AlignUpPow2(bw * bytes_per_block, pitch_align);
|
const u32 pitch = Common::AlignUpPow2(bw * bytes_per_block, pitch_align);
|
||||||
return (pitch * bh);
|
return (pitch * bh);
|
||||||
}
|
}
|
||||||
|
@ -175,7 +176,7 @@ u32 GSDownloadTexture::GetTransferPitch(u32 width, u32 pitch_align) const
|
||||||
const u32 bytes_per_block = GSTexture::GetCompressedBytesPerBlock(m_format);
|
const u32 bytes_per_block = GSTexture::GetCompressedBytesPerBlock(m_format);
|
||||||
const u32 bw = (width + (block_size - 1)) / block_size;
|
const u32 bw = (width + (block_size - 1)) / block_size;
|
||||||
|
|
||||||
pxAssert(Common::IsPow2(pitch_align));
|
pxAssert(std::has_single_bit(pitch_align));
|
||||||
return Common::AlignUpPow2(bw * bytes_per_block, pitch_align);
|
return Common::AlignUpPow2(bw * bytes_per_block, pitch_align);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* PCSX2 - PS2 Emulator for PCs
|
/* PCSX2 - PS2 Emulator for PCs
|
||||||
* Copyright (C) 2002-2021 PCSX2 Dev Team
|
* Copyright (C) 2002-2023 PCSX2 Dev Team
|
||||||
*
|
*
|
||||||
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
||||||
* of the GNU Lesser General Public License as published by the Free Software Found-
|
* of the GNU Lesser General Public License as published by the Free Software Found-
|
||||||
|
@ -28,6 +28,7 @@
|
||||||
|
|
||||||
#include "imgui.h"
|
#include "imgui.h"
|
||||||
|
|
||||||
|
#include <bit>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <VersionHelpers.h>
|
#include <VersionHelpers.h>
|
||||||
|
@ -1724,7 +1725,7 @@ void GSDevice11::RenderImGui()
|
||||||
// This mess is because the vertex size isn't the same...
|
// This mess is because the vertex size isn't the same...
|
||||||
u32 vertex_offset;
|
u32 vertex_offset;
|
||||||
{
|
{
|
||||||
static_assert(Common::IsPow2(sizeof(GSVertexPT1)));
|
static_assert(std::has_single_bit(sizeof(GSVertexPT1)));
|
||||||
|
|
||||||
D3D11_MAP type = D3D11_MAP_WRITE_NO_OVERWRITE;
|
D3D11_MAP type = D3D11_MAP_WRITE_NO_OVERWRITE;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* PCSX2 - PS2 Emulator for PCs
|
/* PCSX2 - PS2 Emulator for PCs
|
||||||
* Copyright (C) 2002-2021 PCSX2 Dev Team
|
* Copyright (C) 2002-2023 PCSX2 Dev Team
|
||||||
*
|
*
|
||||||
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
||||||
* of the GNU Lesser General Public License as published by the Free Software Found-
|
* of the GNU Lesser General Public License as published by the Free Software Found-
|
||||||
|
@ -22,6 +22,7 @@
|
||||||
#include "Host.h"
|
#include "Host.h"
|
||||||
#include "common/BitUtils.h"
|
#include "common/BitUtils.h"
|
||||||
#include "common/StringUtil.h"
|
#include "common/StringUtil.h"
|
||||||
|
#include <bit>
|
||||||
|
|
||||||
GSRendererHW::GSRendererHW()
|
GSRendererHW::GSRendererHW()
|
||||||
: GSRenderer()
|
: GSRenderer()
|
||||||
|
@ -4455,7 +4456,7 @@ bool GSRendererHW::CanUseTexIsFB(const GSTextureCache::Target* rt, const GSTextu
|
||||||
}
|
}
|
||||||
else if (clamp == CLAMP_REGION_REPEAT)
|
else if (clamp == CLAMP_REGION_REPEAT)
|
||||||
{
|
{
|
||||||
const u32 req_tbits = (tmax > 1) ? static_cast<u32>(Common::NextPow2(tmax - 1) - 1) : 0x1;
|
const u32 req_tbits = (tmax > 1) ? std::bit_ceil(static_cast<u32>(tmax - 1) - 1) : 0x1;
|
||||||
if ((min & req_tbits) != req_tbits)
|
if ((min & req_tbits) != req_tbits)
|
||||||
{
|
{
|
||||||
GL_CACHE("Can't use tex-is-fb because of REGION_REPEAT [%d, %d] with TMM of [%d, %d] and tbits of %d",
|
GL_CACHE("Can't use tex-is-fb because of REGION_REPEAT [%d, %d] with TMM of [%d, %d] and tbits of %d",
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
|
|
||||||
#include "imgui.h"
|
#include "imgui.h"
|
||||||
|
|
||||||
|
#include <bit>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
@ -2548,7 +2549,7 @@ bool GSDeviceVK::CreateDeviceAndSwapChain()
|
||||||
std::max(m_device_properties.limits.minTexelBufferOffsetAlignment, static_cast<VkDeviceSize>(32));
|
std::max(m_device_properties.limits.minTexelBufferOffsetAlignment, static_cast<VkDeviceSize>(32));
|
||||||
m_device_properties.limits.optimalBufferCopyOffsetAlignment =
|
m_device_properties.limits.optimalBufferCopyOffsetAlignment =
|
||||||
std::max(m_device_properties.limits.optimalBufferCopyOffsetAlignment, static_cast<VkDeviceSize>(32));
|
std::max(m_device_properties.limits.optimalBufferCopyOffsetAlignment, static_cast<VkDeviceSize>(32));
|
||||||
m_device_properties.limits.optimalBufferCopyRowPitchAlignment = Common::NextPow2(
|
m_device_properties.limits.optimalBufferCopyRowPitchAlignment = std::bit_ceil(
|
||||||
std::max(m_device_properties.limits.optimalBufferCopyRowPitchAlignment, static_cast<VkDeviceSize>(32)));
|
std::max(m_device_properties.limits.optimalBufferCopyRowPitchAlignment, static_cast<VkDeviceSize>(32)));
|
||||||
m_device_properties.limits.bufferImageGranularity =
|
m_device_properties.limits.bufferImageGranularity =
|
||||||
std::max(m_device_properties.limits.bufferImageGranularity, static_cast<VkDeviceSize>(32));
|
std::max(m_device_properties.limits.bufferImageGranularity, static_cast<VkDeviceSize>(32));
|
||||||
|
|
Loading…
Reference in New Issue