Merge branch 'master' into TemporaryHackishBranch

This commit is contained in:
LunaMoo committed 2019-06-18 02:35:17 +02:00
commit 30559d8fd8
15 files changed
+116 -72

No files matched your search

+36
View File
@@ -0,0 +1,36 @@
#pragma once
#include "ppsspp_config.h"
#if PPSSPP_PLATFORM(WINDOWS)
#include "Common/CommonWindows.h"
// Use this if you know the value is non-zero.
inline uint32_t clz32_nonzero(uint32_t value) {
DWORD index;
BitScanReverse(&index, value);
return 31 ^ (uint32_t)index;
}
inline uint32_t clz32(uint32_t value) {
if (!value)
return 32;
DWORD index;
BitScanReverse(&index, value);
return 31 ^ (uint32_t)index;
}
#else
// Use this if you know the value is non-zero.
inline uint32_t clz32_nonzero(uint32_t value) {
return __builtin_clz(value);
}
inline uint32_t clz32(uint32_t value) {
if (!value)
return 32;
return __builtin_clz(value);
}
#endif
+1 -1
View File
@@ -128,7 +128,6 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
@@ -384,6 +383,7 @@
<ClInclude Include="Atomics.h" />
<ClInclude Include="Atomic_GCC.h" />
<ClInclude Include="Atomic_Win32.h" />
<ClInclude Include="BitScan.h" />
<ClInclude Include="BitSet.h" />
<ClInclude Include="ColorConvNEON.h" />
<ClInclude Include="ChunkFile.h" />
+2 -1
View File
@@ -73,6 +73,7 @@
<ClInclude Include="OSVersion.h" />
<ClInclude Include="Hashmaps.h" />
<ClInclude Include="Vulkan\VulkanDebug.h" />
<ClInclude Include="BitScan.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="stdafx.cpp" />
@@ -149,4 +150,4 @@
<UniqueIdentifier>{c14d66ef-5f7c-4565-975a-72774e7ccfb9}</UniqueIdentifier>
</Filter>
</ItemGroup>
</Project>
</Project>
+2 -8
View File
@@ -4,6 +4,7 @@
#include "ppsspp_config.h"
#include "math/math_util.h"
#include "Common/Common.h"
#include "Common/BitScan.h"
#ifdef _M_SSE
#include <emmintrin.h>
@@ -563,14 +564,7 @@ u32 IRInterpret(MIPSState *mips, const IRInst *inst, int count) {
case IROp::Clz:
{
int x = 31;
int count = 0;
int value = mips->r[inst->src1];
while (x >= 0 && !(value & (1 << x))) {
count++;
x--;
}
mips->r[inst->dest] = count;
mips->r[inst->dest] = clz32(mips->r[inst->src1]);
break;
}
+3 -23
View File
@@ -15,13 +15,12 @@
// Official git repository and contact information can be found at
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
// MIPS is really trivial :)
#include <cmath>
#include "math/math_util.h"
#include "Common/Common.h"
#include "Common/BitScan.h"
#include "Core/Config.h"
#include "Core/Core.h"
#include "Core/Host.h"
@@ -281,7 +280,6 @@ namespace MIPSInt
switch (op & 0x3f)
{
case 8: //jr
// LOG(CPU,"returning from: %08x",PC);
DelayBranchTo(addr);
break;
case 9: //jalr
@@ -551,28 +549,10 @@ namespace MIPSInt
switch (op & 63)
{
case 22: //clz
{ //TODO: verify
int x = 31;
int count=0;
while (x >= 0 && !(R(rs) & (1<<x)))
{
count++;
x--;
}
R(rd) = count;
}
R(rd) = clz32(R(rs));
break;
case 23: //clo
{ //TODO: verify
int x = 31;
int count=0;
while (x >= 0 && (R(rs) & (1<<x)))
{
count++;
x--;
}
R(rd) = count;
}
R(rd) = clz32(~R(rs));
break;
default:
_dbg_assert_msg_(CPU,0,"Trying to interpret instruction that can't be interpreted");
+12 -5
View File
@@ -346,7 +346,7 @@ namespace MIPSInt
int off = GetMatrixSide(sz) - 1;
u32 sprefixRemove = VFPU_ANY_SWIZZLE();
u32 sprefixAdd;
u32 sprefixAdd = 0;
switch ((op >> 16) & 0xF) {
case 3:
{
@@ -363,6 +363,9 @@ namespace MIPSInt
case 7:
sprefixAdd = VFPU_MAKE_CONSTANTS(VFPUConst::ONE, VFPUConst::ONE, VFPUConst::ONE, VFPUConst::ONE);
break;
default:
_dbg_assert_msg_(CPU, 0, "Unknown matrix init op");
break;
}
ApplyPrefixST(&prefixed[off * 4], VFPURewritePrefix(VFPU_CTRL_SPREFIX, sprefixRemove, sprefixAdd), V_Quad);
WriteMatrix(prefixed, sz, vd);
@@ -1559,7 +1562,7 @@ namespace MIPSInt
int vd = _VD;
int vs = _VS;
int vt = _VT;
int ins = (op >> 23) & 7;
int ins = (op >> 23) & 3;
VectorSize sz = (VectorSize)(ins + 1);
MatrixSize msz = (MatrixSize)(ins + 1);
@@ -1598,9 +1601,13 @@ namespace MIPSInt
VFPUConst constZ = n < 3 ? VFPUConst::ZERO : VFPUConst::NONE;
VFPUConst constW = n < 4 ? VFPUConst::ZERO : VFPUConst::NONE;
if (ins >= n) {
constY = ins == 1 ? VFPUConst::ONE : VFPUConst::ZERO;
constZ = ins == 2 ? VFPUConst::ONE : VFPUConst::ZERO;
constW = ins == 3 ? VFPUConst::ONE : VFPUConst::ZERO;
if (ins == 1) {
constY = VFPUConst::ONE;
} else if (ins == 2) {
constZ = VFPUConst::ONE;
} else if (ins == 3) {
constW = VFPUConst::ONE;
}
}
u32 tprefixRemove = VFPU_SWIZZLE(0, n < 2 ? 3 : 0, n < 3 ? 3 : 0, n < 4 ? 3 : 0);
u32 tprefixAdd = VFPU_MAKE_CONSTANTS(constX, constY, constZ, constW);
+5 -6
View File
@@ -237,26 +237,24 @@ static bool ConvertPixelTo8888RGBA(GPUDebugBufferFormat fmt, u8 &r, u8 &g, u8 &b
}
const u8 *ConvertBufferToScreenshot(const GPUDebugBuffer &buf, bool alpha, u8 *&temp, u32 &w, u32 &h) {
int pixelSize = alpha ? 4 : 3;
size_t pixelSize = alpha ? 4 : 3;
GPUDebugBufferFormat nativeFmt = alpha ? GPU_DBG_FORMAT_8888 : GPU_DBG_FORMAT_888_RGB;
w = std::min(w, buf.GetStride());
h = std::min(h, buf.GetHeight());
// The temp buffer will be freed by the caller if set, and can be the return value.
if (buf.GetFlipped() || buf.GetFormat() != nativeFmt) {
temp = new u8[pixelSize * w * h];
} else {
temp = nullptr;
}
temp = nullptr;
const u8 *buffer = buf.GetData();
if (buf.GetFlipped() && buf.GetFormat() == nativeFmt) {
temp = new u8[pixelSize * w * h];
// Silly OpenGL reads upside down, we flip to another buffer for simplicity.
for (u32 y = 0; y < h; y++) {
memcpy(temp + y * w * pixelSize, buffer + (buf.GetHeight() - y - 1) * buf.GetStride() * pixelSize, w * pixelSize);
}
} else if (buf.GetFormat() < GPU_DBG_FORMAT_FLOAT && buf.GetFormat() != nativeFmt) {
temp = new u8[pixelSize * w * h];
// Let's boil it down to how we need to interpret the bits.
int baseFmt = buf.GetFormat() & ~(GPU_DBG_FORMAT_REVERSE_FLAG | GPU_DBG_FORMAT_BRSWAP_FLAG);
bool rev = (buf.GetFormat() & GPU_DBG_FORMAT_REVERSE_FLAG) != 0;
@@ -284,6 +282,7 @@ const u8 *ConvertBufferToScreenshot(const GPUDebugBuffer &buf, bool alpha, u8 *&
}
}
} else if (buf.GetFormat() != nativeFmt) {
temp = new u8[pixelSize * w * h];
bool flip = buf.GetFlipped();
// This is pretty inefficient.
+11 -11
View File
@@ -79,7 +79,7 @@ inline GPUDebugBufferFormat &operator |=(GPUDebugBufferFormat &lhs, const GPUDeb
}
struct GPUDebugBuffer {
GPUDebugBuffer() : alloc_(false), data_(NULL) {
GPUDebugBuffer() {
}
GPUDebugBuffer(void *data, u32 stride, u32 height, GEBufferFormat fmt, bool reversed = false)
@@ -100,7 +100,7 @@ struct GPUDebugBuffer {
: alloc_(false), data_((u8 *)data), stride_(stride), height_(height), fmt_(fmt), flipped_(false) {
}
GPUDebugBuffer(GPUDebugBuffer &&other) {
GPUDebugBuffer(GPUDebugBuffer &&other) noexcept {
alloc_ = other.alloc_;
data_ = other.data_;
height_ = other.height_;
@@ -108,14 +108,14 @@ struct GPUDebugBuffer {
flipped_ = other.flipped_;
fmt_ = other.fmt_;
other.alloc_ = false;
other.data_ = NULL;
other.data_ = nullptr;
}
~GPUDebugBuffer() {
Free();
}
GPUDebugBuffer &operator = (GPUDebugBuffer &&other) {
GPUDebugBuffer &operator = (GPUDebugBuffer &&other) noexcept {
if (this != &other) {
Free();
alloc_ = other.alloc_;
@@ -125,7 +125,7 @@ struct GPUDebugBuffer {
flipped_ = other.flipped_;
fmt_ = other.fmt_;
other.alloc_ = false;
other.data_ = NULL;
other.data_ = nullptr;
}
return *this;
@@ -164,12 +164,12 @@ struct GPUDebugBuffer {
private:
u32 PixelSize(GPUDebugBufferFormat fmt) const;
bool alloc_;
u8 *data_;
u32 stride_;
u32 height_;
GPUDebugBufferFormat fmt_;
bool flipped_;
bool alloc_ = false;
u8 *data_ = nullptr;
u32 stride_ = 0;
u32 height_ = 0;
GPUDebugBufferFormat fmt_ = GPU_DBG_FORMAT_INVALID;
bool flipped_ = false;
};
struct GPUDebugVertex {
+2 -2
View File
@@ -246,8 +246,8 @@ private:
VulkanContext *vulkan_;
VkFramebuffer backbuffer_;
VkImage backbufferImage_;
VkFramebuffer backbuffer_ = VK_NULL_HANDLE;
VkImage backbufferImage_ = VK_NULL_HANDLE;
VkRenderPass backbufferRenderPass_ = VK_NULL_HANDLE;
VkRenderPass framebufferRenderPass_ = VK_NULL_HANDLE;
+1 -1
View File
@@ -159,7 +159,7 @@ void VulkanRenderManager::CreateBackbuffers() {
VkCommandBuffer cmdInit = GetInitCmd();
for (uint32_t i = 0; i < swapchainImageCount_; i++) {
SwapchainImageData sc_buffer;
SwapchainImageData sc_buffer{};
sc_buffer.image = swapchainImages[i];
VkImageViewCreateInfo color_image_view = { VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO };
+3 -3
View File
@@ -288,8 +288,8 @@ private:
FrameData frameData_[VulkanContext::MAX_INFLIGHT_FRAMES];
// Submission time state
int curWidth_;
int curHeight_;
int curWidth_ = -1;
int curHeight_ = -1;
bool insideFrame_ = false;
VKRStep *curRenderStep_ = nullptr;
std::vector<VKRStep *> steps_;
@@ -310,7 +310,7 @@ private:
};
std::vector<VkFramebuffer> framebuffers_;
std::vector<SwapchainImageData> swapchainImages_;
uint32_t swapchainImageCount_;
uint32_t swapchainImageCount_ = 0;
struct DepthBufferInfo {
VkFormat format = VK_FORMAT_UNDEFINED;
VkImage image = VK_NULL_HANDLE;
+7 -7
View File
@@ -109,7 +109,7 @@ private:
class ListPopupScreen : public PopupScreen {
public:
ListPopupScreen(std::string title) : PopupScreen(title), showButtons_(false) {}
ListPopupScreen(std::string title) : PopupScreen(title) {}
ListPopupScreen(std::string title, const std::vector<std::string> &items, int selected, std::function<void(int)> callback, bool showButtons = false)
: PopupScreen(title, "OK", "Cancel"), adaptor_(items, selected), callback_(callback), showButtons_(showButtons) {
}
@@ -135,13 +135,13 @@ protected:
virtual bool ShowButtons() const override { return showButtons_; }
virtual void CreatePopupContents(UI::ViewGroup *parent) override;
UI::StringVectorListAdaptor adaptor_;
UI::ListView *listView_;
UI::ListView *listView_ = nullptr;
private:
UI::EventReturn OnListChoice(UI::EventParams &e);
std::function<void(int)> callback_;
bool showButtons_;
bool showButtons_ = false;
std::set<int> hidden_;
};
@@ -169,7 +169,7 @@ namespace UI {
class SliderPopupScreen : public PopupScreen {
public:
SliderPopupScreen(int *value, int minValue, int maxValue, const std::string &title, int step = 1, const std::string &units = "")
: PopupScreen(title, "OK", "Cancel"), units_(units), value_(value), minValue_(minValue), maxValue_(maxValue), step_(step) {}
: PopupScreen(title, "OK", "Cancel"), units_(units), value_(value), minValue_(minValue), maxValue_(maxValue), step_(step) {}
virtual void CreatePopupContents(ViewGroup *parent) override;
void SetNegativeDisable(const std::string &str) {
@@ -185,12 +185,12 @@ private:
EventReturn OnTextChange(EventParams &params);
EventReturn OnSliderChange(EventParams &params);
virtual void OnCompleted(DialogResult result) override;
Slider *slider_;
UI::TextEdit *edit_;
Slider *slider_ = nullptr;
UI::TextEdit *edit_ = nullptr;
std::string units_;
std::string negativeLabel_;
int *value_;
int sliderValue_;
int sliderValue_ = 0;
int minValue_;
int maxValue_;
int step_;
+3 -3
View File
@@ -552,8 +552,8 @@ private:
float paddingLeft_;
float paddingRight_;
int step_;
int repeat_;
int repeatCode_;
int repeat_ = 0;
int repeatCode_ = 0;
};
class SliderFloat : public Clickable {
@@ -580,7 +580,7 @@ private:
float paddingLeft_;
float paddingRight_;
int repeat_;
int repeatCode_;
int repeatCode_ = 0;
};
// Basic button that modifies a bitfield based on the pressed status. Supports multitouch.
+1 -1
View File
@@ -31,7 +31,7 @@ protected:
// Position the current word starts at.
float x_ = 0.0f;
// Most recent width of word since last index.
float wordWidth_;
float wordWidth_ = 0.0f;
// Force the next word to cut partially and wrap.
bool forceEarlyWrap_ = false;
};
+27
View File
@@ -31,6 +31,9 @@
#include <string>
#include <sstream>
#include "Common/BitScan.h"
#include "Core/MIPS/MIPSVFPUUtils.h"
#include "base/NativeApp.h"
#include "base/logging.h"
#include "input/input_state.h"
@@ -459,6 +462,29 @@ bool TestQuickTexHash() {
return true;
}
bool TestCLZ() {
static const uint32_t input[] = {
0xFFFFFFFF,
0x00FFFFF0,
0x00101000,
0x00003000,
0x00000001,
0x00000000,
};
static const uint32_t expected[] = {
0,
8,
11,
18,
31,
32,
};
for (int i = 0; i < ARRAY_SIZE(input); i++) {
EXPECT_EQ_INT(clz32(input[i]), expected[i]);
}
return true;
}
typedef bool (*TestFunc)();
struct TestItem {
const char *name;
@@ -491,6 +517,7 @@ TestItem availableTests[] = {
TEST_ITEM(MatrixTranspose),
TEST_ITEM(ParseLBN),
TEST_ITEM(QuickTexHash),
TEST_ITEM(CLZ),
};
int main(int argc, const char *argv[]) {