mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-07-11 01:25:07 +02:00
Fix some NEON code that had bad compile-time checks (and some didn't compile)
This commit is contained in:
@@ -9,7 +9,7 @@
|
||||
#ifdef _M_SSE
|
||||
#include <emmintrin.h>
|
||||
#endif
|
||||
#if PPSSPP_PLATFORM(ARM_NEON)
|
||||
#if PPSSPP_ARCH(ARM_NEON)
|
||||
#if defined(_MSC_VER) && PPSSPP_ARCH(ARM64)
|
||||
#include <arm64_neon.h>
|
||||
#else
|
||||
@@ -31,13 +31,12 @@ inline void Uint8x4ToFloat4(float f[4], uint32_t u) {
|
||||
__m128i value32 = _mm_unpacklo_epi16(_mm_unpacklo_epi8(value, zero), zero);
|
||||
__m128 fvalues = _mm_mul_ps(_mm_cvtepi32_ps(value32), _mm_load_ps(one_over_255_x4));
|
||||
_mm_storeu_ps(f, fvalues);
|
||||
#elif PPSSPP_PLATFORM(ARM_NEON)
|
||||
const float32x4_t one_over = vdupq_n_f32(1.0f/255.0f);
|
||||
const uint8x8_t value = vld1_lane_u32(u);
|
||||
const uint16x8_t value16 = vmovl_s8(value);
|
||||
const uint32x4_t value32 = vmovl_s16(vget_low_s16(value16));
|
||||
const float32x4_t valueFloat = vmulq_f32(vcvtq_f32_u32(value32), one_over);
|
||||
vst1q_u32((uint32_t *)dest, valueFloat);
|
||||
#elif PPSSPP_ARCH(ARM_NEON)
|
||||
const uint8x8_t value = (uint8x8_t)vdup_n_u32(u);
|
||||
const uint16x8_t value16 = vmovl_u8(value);
|
||||
const uint32x4_t value32 = vmovl_u16(vget_low_u16(value16));
|
||||
const float32x4_t valueFloat = vmulq_f32(vcvtq_f32_u32(value32), vdupq_n_f32(1.0f / 255.0f));
|
||||
vst1q_f32(f, valueFloat);
|
||||
#else
|
||||
f[0] = ((u >> 0) & 0xFF) * (1.0f / 255.0f);
|
||||
f[1] = ((u >> 8) & 0xFF) * (1.0f / 255.0f);
|
||||
@@ -62,7 +61,7 @@ inline uint32_t Float4ToUint8x4(const float f[4]) {
|
||||
}
|
||||
|
||||
inline void Uint8x3ToFloat4_AlphaUint8(float f[4], uint32_t u, uint8_t alpha) {
|
||||
#if defined(_M_SSE) || PPSSPP_PLATFORM(ARM_NEON)
|
||||
#if defined(_M_SSE) || PPSSPP_ARCH(ARM_NEON)
|
||||
Uint8x4ToFloat4(f, (u & 0xFFFFFF) | (alpha << 24));
|
||||
#else
|
||||
f[0] = ((u >> 0) & 0xFF) * (1.0f / 255.0f);
|
||||
@@ -73,7 +72,7 @@ inline void Uint8x3ToFloat4_AlphaUint8(float f[4], uint32_t u, uint8_t alpha) {
|
||||
}
|
||||
|
||||
inline void Uint8x3ToFloat4(float f[4], uint32_t u) {
|
||||
#if defined(_M_SSE) || PPSSPP_PLATFORM(ARM_NEON)
|
||||
#if defined(_M_SSE) || PPSSPP_ARCH(ARM_NEON)
|
||||
Uint8x4ToFloat4(f, u & 0xFFFFFF);
|
||||
#else
|
||||
f[0] = ((u >> 0) & 0xFF) * (1.0f / 255.0f);
|
||||
@@ -168,8 +167,8 @@ inline void ExpandFloat24x3ToFloat4(float dest[4], const uint32_t src[3]) {
|
||||
#ifdef _M_SSE
|
||||
__m128i values = _mm_slli_epi32(_mm_loadu_si128((const __m128i *)src), 8);
|
||||
_mm_storeu_si128((__m128i *)dest, values);
|
||||
#elif PPSSPP_PLATFORM(ARM_NEON)
|
||||
const uint32x4_t values = vshlq_n_u32(vld1q_u32(&gstate.texscaleu), 8);
|
||||
#elif PPSSPP_ARCH(ARM_NEON)
|
||||
const uint32x4_t values = vshlq_n_u32(vld1q_u32(src), 8);
|
||||
vst1q_u32((uint32_t *)dest, values);
|
||||
#else
|
||||
uint32_t temp[4] = { src[0] << 8, src[1] << 8, src[2] << 8, 0 };
|
||||
|
||||
@@ -3318,7 +3318,7 @@ int RecreatePtpSocket(int ptpId) {
|
||||
WARN_LOG(SCENET, "RecreatePtpSocket(%id) - Wrapped Port Detected: Original(%d) -> Requested(%d), Bound(%d) -> BoundOriginal(%d)", ptpId, sock->data.ptp.lport, requestedport, boundport, boundport - portOffset);
|
||||
u16 newlport = boundport - portOffset;
|
||||
if (newlport != sock->data.ptp.lport) {
|
||||
WARN_LOG(SCENET, "RecreatePtpSocket(%id) - Old and New LPort is different! The port may need to be reforwarded");
|
||||
WARN_LOG(SCENET, "RecreatePtpSocket(%id) - Old and New LPort is different! The port may need to be reforwarded", ptpId);
|
||||
if (!sock->isClient)
|
||||
UPnP_Add(IP_PROTOCOL_TCP, isOriPort ? newlport : newlport + portOffset, newlport + portOffset);
|
||||
}
|
||||
|
||||
@@ -1792,7 +1792,7 @@ namespace MIPSComp {
|
||||
fpr.MapRegsAndSpillLockV(sregs, sz, 0);
|
||||
gpr.MapReg(MIPS_REG_VFPUCC);
|
||||
for (int i = 0; i < n; i++) {
|
||||
TSTI2R(gpr.R(MIPS_REG_VFPUCC), 1 << i);
|
||||
TSTI2R(gpr.R(MIPS_REG_VFPUCC), 1ULL << i);
|
||||
FixupBranch b = B(tf ? CC_NEQ : CC_EQ);
|
||||
fp.FMOV(fpr.V(dregs[i]), fpr.V(sregs[i]));
|
||||
SetJumpTarget(b);
|
||||
|
||||
@@ -1,4 +1,16 @@
|
||||
#include "ppsspp_config.h"
|
||||
|
||||
#if defined(_M_SSE)
|
||||
#include <emmintrin.h>
|
||||
#endif
|
||||
#if PPSSPP_ARCH(ARM_NEON)
|
||||
#if defined(_MSC_VER) && PPSSPP_ARCH(ARM64)
|
||||
#include <arm64_neon.h>
|
||||
#else
|
||||
#include <arm_neon.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <algorithm>
|
||||
#include <type_traits>
|
||||
#include <mutex>
|
||||
@@ -2959,6 +2971,21 @@ bool GPUCommon::FramebufferReallyDirty() {
|
||||
return true;
|
||||
}
|
||||
|
||||
void GPUCommon::UpdateUVScaleOffset() {
|
||||
#ifdef _M_SSE
|
||||
__m128i values = _mm_slli_epi32(_mm_load_si128((const __m128i *) & gstate.texscaleu), 8);
|
||||
_mm_storeu_si128((__m128i *) & gstate_c.uv, values);
|
||||
#elif PPSSPP_ARCH(ARM_NEON)
|
||||
const uint32x4_t values = vshlq_n_u32(vld1q_u32((const u32 *)&gstate.texscaleu), 8);
|
||||
vst1q_u32((u32 *)&gstate_c.uv, values);
|
||||
#else
|
||||
gstate_c.uv.uScale = getFloat24(gstate.texscaleu);
|
||||
gstate_c.uv.vScale = getFloat24(gstate.texscalev);
|
||||
gstate_c.uv.uOff = getFloat24(gstate.texoffsetu);
|
||||
gstate_c.uv.vOff = getFloat24(gstate.texoffsetv);
|
||||
#endif
|
||||
}
|
||||
|
||||
size_t GPUCommon::FormatGPUStatsCommon(char *buffer, size_t size) {
|
||||
float vertexAverageCycles = gpuStats.numVertsSubmitted > 0 ? (float)gpuStats.vertexGPUCycles / (float)gpuStats.numVertsSubmitted : 0.0f;
|
||||
return snprintf(buffer, size,
|
||||
|
||||
+1
-18
@@ -11,10 +11,6 @@
|
||||
#include <atomic>
|
||||
#endif
|
||||
|
||||
#if defined(_M_SSE)
|
||||
#include <emmintrin.h>
|
||||
#endif
|
||||
|
||||
class FramebufferManagerCommon;
|
||||
class TextureCacheCommon;
|
||||
class DrawEngineCommon;
|
||||
@@ -218,20 +214,7 @@ public:
|
||||
GPUgstate GetGState() override;
|
||||
void SetCmdValue(u32 op) override;
|
||||
|
||||
void UpdateUVScaleOffset() {
|
||||
#ifdef _M_SSE
|
||||
__m128i values = _mm_slli_epi32(_mm_load_si128((const __m128i *)&gstate.texscaleu), 8);
|
||||
_mm_storeu_si128((__m128i *)&gstate_c.uv, values);
|
||||
#elif PPSSPP_PLATFORM(ARM_NEON)
|
||||
const uint32x4_t values = vshlq_n_u32(vld1q_u32(&gstate.texscaleu), 8);
|
||||
vst1q_u32(&gstate_c.uv, values);
|
||||
#else
|
||||
gstate_c.uv.uScale = getFloat24(gstate.texscaleu);
|
||||
gstate_c.uv.vScale = getFloat24(gstate.texscalev);
|
||||
gstate_c.uv.uOff = getFloat24(gstate.texoffsetu);
|
||||
gstate_c.uv.vOff = getFloat24(gstate.texoffsetv);
|
||||
#endif
|
||||
}
|
||||
void UpdateUVScaleOffset();
|
||||
|
||||
DisplayList* getList(int listid) override {
|
||||
return &dls[listid];
|
||||
|
||||
Reference in New Issue
Block a user