Merge branch 'master' into compat_openxr_gta

This commit is contained in:
Lubos 2022-09-13 21:01:55 +02:00
commit e406dc4730
36 changed files with 801 additions and 160 deletions

View File

@ -47,12 +47,12 @@ struct TinySet {
size_t otherSize = other.size();
if (size() + otherSize <= MaxFastSize) {
// Fast case
for (int i = 0; i < otherSize; i++) {
for (size_t i = 0; i < otherSize; i++) {
fastLookup_[fastCount + i] = other.fastLookup_[i];
}
fastCount += other.fastCount;
} else {
for (int i = 0; i < otherSize; i++) {
for (size_t i = 0; i < otherSize; i++) {
push_back(other[i]);
}
}

View File

@ -644,6 +644,9 @@ retry_depth:
void GLQueueRunner::RunSteps(const std::vector<GLRStep *> &steps, bool skipGLCalls, bool keepSteps) {
if (skipGLCalls) {
if (keepSteps) {
return;
}
// Dry run
for (size_t i = 0; i < steps.size(); i++) {
const GLRStep &step = *steps[i];

View File

@ -1219,7 +1219,7 @@ bool OpenGLPipeline::LinkShaders() {
}
std::vector<GLRProgram::Initializer> initialize;
for (int i = 0; i < MAX_TEXTURE_SLOTS; ++i) {
if (i < samplers_.size()) {
if (i < (int)samplers_.size()) {
initialize.push_back({ &samplerLocs_[i], 0, i });
} else {
samplerLocs_[i] = -1;

View File

@ -1086,7 +1086,7 @@ Pipeline *VKContext::CreateGraphicsPipeline(const PipelineDesc &desc, const char
_dbg_assert_((int)input->attributes.size() == (int)input->visc.vertexAttributeDescriptionCount);
gDesc.ibd = input->bindings[0];
for (int i = 0; i < input->attributes.size(); i++) {
for (size_t i = 0; i < input->attributes.size(); i++) {
gDesc.attrs[i] = input->attributes[i];
}
gDesc.vis.vertexAttributeDescriptionCount = input->visc.vertexAttributeDescriptionCount;

View File

@ -307,7 +307,6 @@ bool PreVRRender() {
VR_SetConfig(VR_CONFIG_6DOF_ENABLED, g_Config.bEnable6DoF);
VR_SetConfig(VR_CONFIG_CANVAS_DISTANCE, g_Config.iCanvasDistance);
VR_SetConfig(VR_CONFIG_FOV_SCALE, g_Config.iFieldOfViewPercentage);
VR_SetConfig(VR_CONFIG_STEREO_SEPARATION, g_Config.iStereoSeparation);
return true;
}
return false;
@ -353,9 +352,19 @@ void UpdateVRProjection(float* projMatrix, float* leftEye, float* rightEye) {
VR_TweakProjection(projMatrix, leftEye, VR_PROJECTION_MATRIX_LEFT_EYE);
VR_TweakProjection(projMatrix, rightEye, VR_PROJECTION_MATRIX_RIGHT_EYE);
VR_TweakMirroring(projMatrix);
// Set 6DoF scale
float scale = pow(fabs(projMatrix[14]), 1.15f);
if (PSP_CoreParameter().compat.vrCompat().UnitsPerMeter > 0) {
scale = PSP_CoreParameter().compat.vrCompat().UnitsPerMeter;
VR_SetConfig(VR_CONFIG_6DOF_PRECISE, true);
} else {
VR_SetConfig(VR_CONFIG_6DOF_PRECISE, false);
}
VR_SetConfig(VR_CONFIG_6DOF_SCALE, (int)(scale * 1000000));
}
void UpdateVRView(float* projMatrix, float* leftEye, float* rightEye) {
VR_TweakView(leftEye, projMatrix, VR_VIEW_MATRIX_LEFT_EYE);
VR_TweakView(rightEye, projMatrix, VR_VIEW_MATRIX_RIGHT_EYE);
void UpdateVRView(float* leftEye, float* rightEye) {
VR_TweakView(leftEye, VR_VIEW_MATRIX_LEFT_EYE);
VR_TweakView(rightEye, VR_VIEW_MATRIX_RIGHT_EYE);
}

View File

@ -44,7 +44,7 @@ bool IsMultiviewSupported();
bool IsFlatVRScene();
bool Is2DVRObject(float* projMatrix, bool ortho);
void UpdateVRProjection(float* projMatrix, float* leftEye, float* rightEye);
void UpdateVRView(float* projMatrix, float* leftEye, float* rightEye);
void UpdateVRView(float* leftEye, float* rightEye);
#else //dummy integration
@ -73,6 +73,6 @@ inline bool IsMultiviewSupported() { return false; }
inline bool IsFlatVRScene() { return true; }
inline bool Is2DVRObject(float* projMatrix, bool ortho) { return false; }
inline void UpdateVRProjection(float* projMatrix, float* leftEye, float* rightEye) {}
inline void UpdateVRView(float* projMatrix, float* leftEye, float* rightEye) {}
inline void UpdateVRView(float* leftEye, float* rightEye) {}
#endif

View File

@ -493,17 +493,16 @@ ovrMatrix4f VR_GetMatrix( VRMatrix matrix ) {
}
output = ovrMatrix4f_CreateFromQuaternion(&invView.orientation);
float scale = (float)VR_GetConfig(VR_CONFIG_6DOF_SCALE) * 0.001f;
float scale = (float)VR_GetConfig(VR_CONFIG_6DOF_SCALE) * 0.000001f;
if (vrConfig[VR_CONFIG_6DOF_ENABLED]) {
output.M[0][3] -= hmdposition.x * (vrConfig[VR_CONFIG_MIRROR_AXIS_X] ? -1.0f : 1.0f) * scale;
output.M[1][3] -= hmdposition.y * (vrConfig[VR_CONFIG_MIRROR_AXIS_Y] ? -1.0f : 1.0f) * scale;
output.M[2][3] -= hmdposition.z * (vrConfig[VR_CONFIG_MIRROR_AXIS_Z] ? -1.0f : 1.0f) * scale;
}
if (matrix == VR_VIEW_MATRIX_RIGHT_EYE) {
float ipdScale = (float)vrConfig[VR_CONFIG_STEREO_SEPARATION] * 0.1f * scale;
output.M[0][3] += (invViewTransform[1].position.x - invViewTransform[0].position.x) * ipdScale;
output.M[1][3] += (invViewTransform[1].position.y - invViewTransform[0].position.y) * ipdScale;
output.M[2][3] += (invViewTransform[1].position.z - invViewTransform[0].position.z) * ipdScale;
if (vrConfig[VR_CONFIG_6DOF_PRECISE] && (matrix == VR_VIEW_MATRIX_RIGHT_EYE)) {
output.M[0][3] += (invViewTransform[1].position.x - invViewTransform[0].position.x) * scale;
output.M[1][3] += (invViewTransform[1].position.y - invViewTransform[0].position.y) * scale;
output.M[2][3] += (invViewTransform[1].position.z - invViewTransform[0].position.z) * scale;
}
} else {
assert(false);

View File

@ -7,9 +7,9 @@ enum VRConfig {
//switching between 2D and 3D
VR_CONFIG_MODE, VR_CONFIG_3D_GEOMETRY_COUNT, VR_CONFIG_FORCE_2D,
//camera setup
VR_CONFIG_FOV_SCALE, VR_CONFIG_CANVAS_DISTANCE, VR_CONFIG_STEREO_SEPARATION,
VR_CONFIG_FOV_SCALE, VR_CONFIG_CANVAS_DISTANCE,
//6DoF
VR_CONFIG_6DOF_ENABLED, VR_CONFIG_6DOF_SCALE,
VR_CONFIG_6DOF_ENABLED, VR_CONFIG_6DOF_SCALE, VR_CONFIG_6DOF_PRECISE,
VR_CONFIG_MIRROR_AXIS_X, VR_CONFIG_MIRROR_AXIS_Y, VR_CONFIG_MIRROR_AXIS_Z,
VR_CONFIG_MIRROR_PITCH, VR_CONFIG_MIRROR_YAW, VR_CONFIG_MIRROR_ROLL,
//2D canvas positioning

View File

@ -79,15 +79,11 @@ void VR_TweakProjection(float* src, float* dst, VRMatrix matrix) {
memcpy(dst, hmdProjection.M, 16 * sizeof(float));
}
void VR_TweakView(float* view, float* projMatrix, VRMatrix matrix) {
void VR_TweakView(float* view, VRMatrix matrix) {
// Get view matrix from the game
ovrMatrix4f gameView;
memcpy(gameView.M, view, 16 * sizeof(float));
// Set 6DoF scale
float scale = pow(fabs(projMatrix[14]), 1.15f);
VR_SetConfig(VR_CONFIG_6DOF_SCALE, (int)(scale * 1000));
// Get view matrix from the headset
ovrMatrix4f hmdView = VR_GetMatrix(matrix);

View File

@ -9,4 +9,4 @@ bool VR_TweakIsMatrixOneScale(float* matrix);
bool VR_TweakIsMatrixOneTransform(float* matrix);
void VR_TweakMirroring(float* projMatrix);
void VR_TweakProjection(float* src, float* dst, VRMatrix matrix);
void VR_TweakView(float* view, float* projMatrix, VRMatrix matrix);
void VR_TweakView(float* view, VRMatrix matrix);

View File

@ -42,6 +42,14 @@ void Compatibility::Load(const std::string &gameID) {
}
}
{
IniFile compat;
// This loads from assets.
if (compat.LoadFromVFS("compatvr.ini")) {
CheckSetting(compat, gameID, "UnitsPerMeter", &vrCompat_.UnitsPerMeter);
}
}
{
IniFile compat2;
// This one is user-editable. Need to load it after the system one.
@ -54,6 +62,7 @@ void Compatibility::Load(const std::string &gameID) {
void Compatibility::Clear() {
memset(&flags_, 0, sizeof(flags_));
memset(&vrCompat_, 0, sizeof(vrCompat_));
}
void Compatibility::CheckSettings(IniFile &iniFile, const std::string &gameID) {
@ -112,3 +121,9 @@ void Compatibility::CheckSetting(IniFile &iniFile, const std::string &gameID, co
*flag |= all;
}
}
void Compatibility::CheckSetting(IniFile &iniFile, const std::string &gameID, const char *option, float *flag) {
std::string value;
iniFile.Get(option, gameID.c_str(), &value, "0");
*flag = stof(value);
}

View File

@ -92,6 +92,10 @@ struct CompatFlags {
bool VRSkyplane;
};
struct VRCompat {
float UnitsPerMeter;
};
class IniFile;
class Compatibility {
@ -103,13 +107,17 @@ public:
// Flags enforced read-only through const. Only way to change them is to load assets/compat.ini.
const CompatFlags &flags() const { return flags_; }
const VRCompat &vrCompat() const { return vrCompat_; }
void Load(const std::string &gameID);
private:
void Clear();
void CheckSettings(IniFile &iniFile, const std::string &gameID);
void CheckSetting(IniFile &iniFile, const std::string &gameID, const char *option, bool *flag);
void CheckSetting(IniFile &iniFile, const std::string &gameID, const char *option, float *value);
CompatFlags flags_{};
VRCompat vrCompat_{};
std::set<std::string> ignored_;
};

View File

@ -1208,7 +1208,6 @@ static ConfigSetting vrSettings[] = {
ConfigSetting("VREnableStereo", &g_Config.bEnableStereo, false),
ConfigSetting("VRCanvasDistance", &g_Config.iCanvasDistance, 6),
ConfigSetting("VRFieldOfView", &g_Config.iFieldOfViewPercentage, 100),
ConfigSetting("VRStereoSeparation", &g_Config.iStereoSeparation, 10),
ConfigSetting(false),
};

View File

@ -458,7 +458,6 @@ public:
bool bEnableStereo;
int iCanvasDistance;
int iFieldOfViewPercentage;
int iStereoSeparation;
// Debugger
int iDisasmWindowX;

View File

@ -1149,7 +1149,9 @@ void PSPSaveDialog::ExecuteNotVisibleIOAction() {
case SCE_UTILITY_SAVEDATA_TYPE_READDATA:
case SCE_UTILITY_SAVEDATA_TYPE_READDATASECURE:
result = param.Load(param.GetPspParam(), GetSelectedSaveDirName(), currentSelectedSave, param.GetPspParam()->mode == SCE_UTILITY_SAVEDATA_TYPE_READDATASECURE);
if(result == SCE_UTILITY_SAVEDATA_ERROR_LOAD_NO_DATA)
if (result == SCE_UTILITY_SAVEDATA_ERROR_LOAD_DATA_BROKEN)
result = SCE_UTILITY_SAVEDATA_ERROR_RW_DATA_BROKEN;
if (result == SCE_UTILITY_SAVEDATA_ERROR_LOAD_NO_DATA)
result = SCE_UTILITY_SAVEDATA_ERROR_RW_NO_DATA;
break;
case SCE_UTILITY_SAVEDATA_TYPE_ERASE:

View File

@ -589,15 +589,22 @@ int SavedataParam::Load(SceUtilitySavedataParam *param, const std::string &saveD
return isRWMode ? SCE_UTILITY_SAVEDATA_ERROR_RW_NO_DATA : SCE_UTILITY_SAVEDATA_ERROR_LOAD_NO_DATA;
}
if (fileName != "" && !pspFileSystem.GetFileInfo(filePath).exists) {
return isRWMode ? SCE_UTILITY_SAVEDATA_ERROR_RW_FILE_NOT_FOUND : SCE_UTILITY_SAVEDATA_ERROR_LOAD_FILE_NOT_FOUND;
}
// If it wasn't zero, force to zero before loading and especially in case of error.
// This isn't reset if the path doesn't even exist.
param->dataSize = 0;
int result = LoadSaveData(param, saveDirName, dirPath, secureMode);
if (result != 0)
return result;
// Load sfo
if (!LoadSFO(param, dirPath)) {
return isRWMode ? SCE_UTILITY_SAVEDATA_ERROR_RW_DATA_BROKEN : SCE_UTILITY_SAVEDATA_ERROR_LOAD_DATA_BROKEN;
}
if (fileName != "" && !pspFileSystem.GetFileInfo(filePath).exists) {
return isRWMode ? SCE_UTILITY_SAVEDATA_ERROR_RW_FILE_NOT_FOUND : SCE_UTILITY_SAVEDATA_ERROR_LOAD_FILE_NOT_FOUND;
}
// Don't know what it is, but PSP always respond this and this unlock some game
param->bind = 1021;
@ -612,15 +619,6 @@ int SavedataParam::Load(SceUtilitySavedataParam *param, const std::string &saveD
// Load SND0.AT3
LoadFile(dirPath, SND0_FILENAME, &param->snd0FileData);
if (fileName == "") {
// Don't load savedata but return success.
return 0;
}
int result = LoadSaveData(param, saveDirName, dirPath, secureMode);
if (result != 0)
return result;
return 0;
}
@ -638,6 +636,10 @@ int SavedataParam::LoadSaveData(SceUtilitySavedataParam *param, const std::strin
std::string filename = GetFileName(param);
std::string filePath = dirPath + "/" + filename;
// Blank filename always means success, if secureVersion was correct.
if (filename == "")
return 0;
s64 readSize;
INFO_LOG(SCEUTILITY, "Loading file with size %u in %s", param->dataBufSize, filePath.c_str());
u8 *saveData = nullptr;
@ -667,14 +669,18 @@ int SavedataParam::LoadSaveData(SceUtilitySavedataParam *param, const std::strin
if (!saveDone) {
loadedSize = LoadNotCryptedSave(param, param->dataBuf, saveData, saveSize);
}
param->dataSize = (SceSize)saveSize;
delete[] saveData;
if (loadedSize != 0) {
// Ignore error codes.
if (loadedSize != 0 && (loadedSize & 0x80000000) == 0) {
std::string tag = "LoadSaveData/" + filePath;
NotifyMemInfo(MemBlockFlags::WRITE, param->dataBuf.ptr, loadedSize, tag.c_str(), tag.size());
}
if ((loadedSize & 0x80000000) != 0)
return loadedSize;
param->dataSize = (SceSize)saveSize;
return 0;
}
@ -760,8 +766,12 @@ u32 SavedataParam::LoadCryptedSave(SceUtilitySavedataParam *param, u8 *data, con
u32 sz = 0;
if (err == 0) {
if (param->dataBuf.IsValid()) {
sz = std::min((u32)saveSize, (u32)param->dataBufSize);
memcpy(data, data_base, sz);
if ((u32)saveSize > param->dataBufSize || !Memory::IsValidRange(param->dataBuf.ptr, saveSize)) {
sz = SCE_UTILITY_SAVEDATA_ERROR_LOAD_DATA_BROKEN;
} else {
sz = (u32)saveSize;
memcpy(data, data_base, sz);
}
}
saveDone = true;
}
@ -773,9 +783,11 @@ u32 SavedataParam::LoadCryptedSave(SceUtilitySavedataParam *param, u8 *data, con
u32 SavedataParam::LoadNotCryptedSave(SceUtilitySavedataParam *param, u8 *data, u8 *saveData, int &saveSize) {
if (param->dataBuf.IsValid()) {
u32 sz = std::min((u32)saveSize, (u32)param->dataBufSize);
memcpy(data, saveData, sz);
return sz;
if ((u32)saveSize > param->dataBufSize || !Memory::IsValidRange(param->dataBuf.ptr, saveSize)) {
return SCE_UTILITY_SAVEDATA_ERROR_LOAD_DATA_BROKEN;
}
memcpy(data, saveData, saveSize);
return saveSize;
}
return 0;
}

View File

@ -132,10 +132,7 @@ void GenerateDepalShader300(ShaderWriter &writer, const DepalConfig &config) {
break;
}
float texturePixels = 256.0f;
if (config.clutFormat != GE_CMODE_32BIT_ABGR8888) {
texturePixels = 512.0f;
}
float texturePixels = 512.0f;
if (shift) {
writer.F(" index = (int(uint(index) >> uint(%d)) & 0x%02x)", shift, mask);
@ -278,11 +275,9 @@ void GenerateDepalShaderFloat(ShaderWriter &writer, const DepalConfig &config) {
break;
}
float texturePixels = 256.f;
if (config.clutFormat != GE_CMODE_32BIT_ABGR8888) {
texturePixels = 512.f;
index_multiplier *= 0.5f;
}
// We always use 512-sized textures now.
float texturePixels = 512.f;
index_multiplier *= 0.5f;
// Adjust index_multiplier, similar to the use of 15.99 instead of 16 in the ES 3 path.
// index_multiplier -= 0.01f / texturePixels;
@ -326,11 +321,7 @@ void GenerateDepalSmoothed(ShaderWriter &writer, const DepalConfig &config) {
}
writer.C(" float index = ").SampleTexture2D("tex", "v_texcoord").F(".%s * %0.1f;\n", sourceChannel, indexMultiplier);
float texturePixels = 256.f;
if (config.clutFormat != GE_CMODE_32BIT_ABGR8888) {
texturePixels = 512.f;
}
float texturePixels = 512.f;
writer.F(" float coord = (index + 0.5) * %f;\n", 1.0 / texturePixels);
writer.C(" vec4 outColor = ").SampleTexture2D("pal", "vec2(coord, 0.0)").C(";\n");
}

View File

@ -640,7 +640,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu
p.C(" if (depalShift == 5u) { index0 = t.g; }\n");
p.C(" else if (depalShift == 10u) { index0 = t.b; }\n");
p.C(" }\n");
p.F(" t = ").SampleTexture2D("pal", "vec2(index0 * factor, 0.0)").C(";\n");
p.F(" t = ").SampleTexture2D("pal", "vec2(index0 * factor * 0.5, 0.0)").C(";\n"); // 0.5 for 512-entry CLUT.
break;
case ShaderDepalMode::NORMAL:
if (doTextureProjection) {

View File

@ -666,6 +666,10 @@ static const char *reinterpretStrings[4][4] = {
// Call this after the target has been bound for rendering. For color, raster is probably always going to win over blits/copies.
void FramebufferManagerCommon::CopyToColorFromOverlappingFramebuffers(VirtualFramebuffer *dst) {
if (!useBufferedRendering_) {
return;
}
std::vector<CopySource> sources;
for (auto src : vfbs_) {
// Discard old and equal potential inputs.
@ -773,30 +777,17 @@ void FramebufferManagerCommon::CopyToColorFromOverlappingFramebuffers(VirtualFra
WARN_LOG_ONCE(bta, G3D, "WARNING: Reinterpret encountered with BlueToAlpha on");
}
if (IsBufferFormat16Bit(src->fb_format) && !IsBufferFormat16Bit(dst->fb_format)) {
// We halve the X coordinates in the destination framebuffer.
// The shader will collect two pixels worth of input data and merge into one.
dstX1 *= 0.5f;
dstX2 *= 0.5f;
} else if (!IsBufferFormat16Bit(src->fb_format) && IsBufferFormat16Bit(dst->fb_format)) {
// We double the X coordinates in the destination framebuffer.
// The shader will sample and depending on the X coordinate & 1, use the upper or lower bits.
dstX1 *= 2.0f;
dstX2 *= 2.0f;
}
// Reinterpret!
WARN_LOG_N_TIMES(reint, 5, G3D, "Reinterpret detected from %08x_%s to %08x_%s",
src->fb_address, GeBufferFormatToString(src->fb_format),
dst->fb_address, GeBufferFormatToString(dst->fb_format));
pipeline = reinterpretFromTo_[(int)src->fb_format][(int)dst->fb_format];
float scaleFactorX = 1.0f;
pipeline = GetReinterpretPipeline(src->fb_format, dst->fb_format, &scaleFactorX);
dstX1 *= 0.5f;
dstX2 *= 0.5f;
pass_name = reinterpretStrings[(int)src->fb_format][(int)dst->fb_format];
if (!pipeline) {
pipeline = draw2D_.Create2DPipeline([=](ShaderWriter &shaderWriter) -> Draw2DPipelineInfo {
return GenerateReinterpretFragmentShader(shaderWriter, src->fb_format, dst->fb_format);
});
reinterpretFromTo_[(int)src->fb_format][(int)dst->fb_format] = pipeline;
}
gpuStats.numReinterpretCopies++;
}
@ -819,6 +810,27 @@ void FramebufferManagerCommon::CopyToColorFromOverlappingFramebuffers(VirtualFra
textureCache_->ForgetLastTexture();
}
Draw2DPipeline *FramebufferManagerCommon::GetReinterpretPipeline(GEBufferFormat from, GEBufferFormat to, float *scaleFactorX) {
if (IsBufferFormat16Bit(from) && !IsBufferFormat16Bit(to)) {
// We halve the X coordinates in the destination framebuffer.
// The shader will collect two pixels worth of input data and merge into one.
*scaleFactorX = 0.5f;
} else if (!IsBufferFormat16Bit(from) && IsBufferFormat16Bit(to)) {
// We double the X coordinates in the destination framebuffer.
// The shader will sample and depending on the X coordinate & 1, use the upper or lower bits.
*scaleFactorX = 2.0f;
}
Draw2DPipeline *pipeline = reinterpretFromTo_[(int)from][(int)to];
if (!pipeline) {
pipeline = draw2D_.Create2DPipeline([=](ShaderWriter &shaderWriter) -> Draw2DPipelineInfo {
return GenerateReinterpretFragmentShader(shaderWriter, from, to);
});
reinterpretFromTo_[(int)from][(int)to] = pipeline;
}
return pipeline;
}
void FramebufferManagerCommon::DestroyFramebuf(VirtualFramebuffer *v) {
// Notify the texture cache of both the color and depth buffers.
textureCache_->NotifyFramebuffer(v, NOTIFY_FB_DESTROYED);

View File

@ -421,14 +421,15 @@ public:
// Returns the resolved framebuffer.
VirtualFramebuffer *ResolveFramebufferColorToFormat(VirtualFramebuffer *vfb, GEBufferFormat newFormat);
Draw2DPipeline *Get2DPipeline(Draw2DShader shader);
Draw2DPipeline *GetReinterpretPipeline(GEBufferFormat from, GEBufferFormat to, float *scaleFactorX);
protected:
virtual void PackFramebufferSync(VirtualFramebuffer *vfb, int x, int y, int w, int h, RasterChannel channel);
void SetViewport2D(int x, int y, int w, int h);
Draw::Texture *MakePixelTexture(const u8 *srcPixels, GEBufferFormat srcPixelFormat, int srcStride, int width, int height);
void DrawActiveTexture(float x, float y, float w, float h, float destW, float destH, float u0, float v0, float u1, float v1, int uvRotation, int flags);
Draw2DPipeline *Get2DPipeline(Draw2DShader shader);
void CopyToColorFromOverlappingFramebuffers(VirtualFramebuffer *dest);
void CopyToDepthFromOverlappingFramebuffers(VirtualFramebuffer *dest);

View File

@ -68,7 +68,7 @@ ClutTexture TextureShaderCache::GetClutTexture(GEPaletteFormat clutFormat, const
ClutTexture *tex = new ClutTexture();
Draw::TextureDesc desc{};
desc.width = maxClutEntries;
desc.width = 512; // We always use 512-sized textures here for simplicity, though the most common is that only up to 256 entries are used.
desc.height = 1;
desc.depth = 1;
desc.mipLevels = 1;

View File

@ -530,7 +530,7 @@ void LinkedShader::UpdateUniforms(u32 vertType, const ShaderID &vsid, bool useBu
ConvertMatrix4x3To4x4Transposed(leftEyeView, gstate.viewMatrix);
ConvertMatrix4x3To4x4Transposed(rightEyeView, gstate.viewMatrix);
if (!flatScreen && !is2D) {
UpdateVRView(gstate.projMatrix, leftEyeView, rightEyeView);
UpdateVRView(leftEyeView, rightEyeView);
}
render_->SetUniformM4x4Stereo("u_view", &u_view, leftEyeView, rightEyeView);
} else {

View File

@ -57,22 +57,10 @@ inline static T VecClamp(const T &v, const T &low, const T &high)
}
template<typename T>
class Vec2
{
class Vec2 {
public:
union
{
struct
{
T x,y;
};
#if defined(_M_SSE)
__m128i ivec;
__m128 vec;
#elif PPSSPP_ARCH(ARM64_NEON)
int32x4_t ivec;
float32x4_t vec;
#endif
struct {
T x,y;
};
T* AsArray() { return &x; }
@ -81,15 +69,6 @@ public:
Vec2() {}
Vec2(const T a[2]) : x(a[0]), y(a[1]) {}
Vec2(const T& _x, const T& _y) : x(_x), y(_y) {}
#if defined(_M_SSE)
Vec2(const __m128 &_vec) : vec(_vec) {}
Vec2(const __m128i &_ivec) : ivec(_ivec) {}
#elif PPSSPP_ARCH(ARM64_NEON)
Vec2(const float32x4_t &_vec) : vec(_vec) {}
#if !defined(_MSC_VER)
Vec2(const int32x4_t &_ivec) : ivec(_ivec) {}
#endif
#endif
template<typename T2>
Vec2<T2> Cast() const

View File

@ -242,7 +242,7 @@ bool BinManager::HasTextureWrite(const RasterizerState &state) {
if (!state.enableTextures)
return false;
const int textureBits = textureBitsPerPixel[state.samplerID.texfmt];
const uint8_t textureBits = textureBitsPerPixel[state.samplerID.texfmt];
for (int i = 0; i <= state.maxTexLevel; ++i) {
int byteStride = (state.texbufw[i] * textureBits) / 8;
int byteWidth = (state.samplerID.cached.sizes[i].w * textureBits) / 8;

View File

@ -78,14 +78,6 @@ static inline Vec3<int> Interpolate(const Vec3<int> &c0, const Vec3<int> &c1, co
#endif
}
static inline Vec2<float> Interpolate(const Vec2<float> &c0, const Vec2<float> &c1, const Vec2<float> &c2, int w0, int w1, int w2, float wsum) {
#if defined(_M_SSE) && !PPSSPP_ARCH(X86)
return Vec2<float>(Interpolate(c0.vec, c1.vec, c2.vec, w0, w1, w2, wsum));
#else
return (c0 * w0 + c1 * w1 + c2 * w2) * wsum;
#endif
}
static inline Vec4<float> Interpolate(const float &c0, const float &c1, const float &c2, const Vec4<float> &w0, const Vec4<float> &w1, const Vec4<float> &w2, const Vec4<float> &wsum_recip) {
#if defined(_M_SSE) && !PPSSPP_ARCH(X86)
__m128 v = _mm_mul_ps(w0.vec, _mm_set1_ps(c0));
@ -124,7 +116,7 @@ void ComputeRasterizerState(RasterizerState *state, bool throughMode) {
for (uint8_t i = 0; i <= state->maxTexLevel; i++) {
u32 texaddr = gstate.getTextureAddress(i);
state->texaddr[i] = texaddr;
state->texbufw[i] = GetTextureBufw(i, texaddr, texfmt);
state->texbufw[i] = (uint16_t)GetTextureBufw(i, texaddr, texfmt);
if (Memory::IsValidAddress(texaddr))
state->texptr[i] = Memory::GetPointerUnchecked(texaddr);
else
@ -143,9 +135,6 @@ void ComputeRasterizerState(RasterizerState *state, bool throughMode) {
state->throughMode = throughMode;
state->antialiasLines = gstate.isAntiAliasEnabled();
state->screenOffsetX = gstate.getOffsetX16();
state->screenOffsetY = gstate.getOffsetY16();
#if defined(SOFTGPU_MEMORY_TAGGING_DETAILED) || defined(SOFTGPU_MEMORY_TAGGING_BASIC)
DisplayList currentList{};
if (gpuDebug)
@ -421,7 +410,7 @@ Vec3<int> AlphaBlendingResult(const PixelFuncID &pixelID, const Vec4<int> &sourc
static inline Vec4IntResult SOFTRAST_CALL ApplyTexturing(float s, float t, int x, int y, Vec4IntArg prim_color, int texlevel, int frac_texlevel, bool bilinear, const RasterizerState &state) {
const u8 **tptr0 = const_cast<const u8 **>(&state.texptr[texlevel]);
const int *bufw0 = &state.texbufw[texlevel];
const uint16_t *bufw0 = &state.texbufw[texlevel];
if (!bilinear) {
return state.nearest(s, t, x, y, prim_color, tptr0, bufw0, texlevel, frac_texlevel, state.samplerID);
@ -1476,7 +1465,7 @@ bool GetCurrentTexture(GPUDebugBuffer &buffer, int level)
GETextureFormat texfmt = gstate.getTextureFormat();
u32 texaddr = gstate.getTextureAddress(level);
int texbufw = GetTextureBufw(level, texaddr, texfmt);
u32 texbufw = GetTextureBufw(level, texaddr, texfmt);
int w = gstate.getTextureWidth(level);
int h = gstate.getTextureHeight(level);

View File

@ -39,11 +39,9 @@ struct RasterizerState {
Sampler::LinearFunc linear;
Sampler::NearestFunc nearest;
uint32_t texaddr[8]{};
int texbufw[8]{};
uint16_t texbufw[8]{};
const u8 *texptr[8]{};
float textureLodSlope;
int screenOffsetX;
int screenOffsetY;
struct {
uint8_t maxTexLevel : 3;

View File

@ -103,7 +103,7 @@ void DrawSprite(const VertexData &v0, const VertexData &v1, const BinCoords &ran
const u8 *texptr = state.texptr[0];
GETextureFormat texfmt = state.samplerID.TexFmt();
int texbufw = state.texbufw[0];
uint16_t texbufw = state.texbufw[0];
Sampler::FetchFunc fetchFunc = Sampler::GetFetchFunc(state.samplerID);
auto &pixelID = state.pixelID;
@ -300,9 +300,9 @@ bool RectangleFastPath(const VertexData &v0, const VertexData &v1, BinManager &b
if (PSP_CoreParameter().compat.flags().DarkStalkersPresentHack && v0.texturecoords.x == 64.0f && v0.texturecoords.y == 16.0f && v1.texturecoords.x == 448.0f && v1.texturecoords.y == 240.0f) {
// check for save/load dialog.
if (!currentDialogActive) {
if (v0.screenpos.x + state.screenOffsetX == 0x7100 && v0.screenpos.y + state.screenOffsetY == 0x7780 && v1.screenpos.x + state.screenOffsetX == 0x8f00 && v1.screenpos.y + state.screenOffsetY == 0x8880) {
if (v0.screenpos.x + gstate.getOffsetX16() == 0x7100 && v0.screenpos.y + gstate.getOffsetY16() == 0x7780 && v1.screenpos.x + gstate.getOffsetX16() == 0x8f00 && v1.screenpos.y + gstate.getOffsetY16() == 0x8880) {
g_DarkStalkerStretch = DSStretch::Wide;
} else if (v0.screenpos.x + state.screenOffsetX == 0x7400 && v0.screenpos.y + state.screenOffsetY == 0x7780 && v1.screenpos.x + state.screenOffsetX == 0x8C00 && v1.screenpos.y + state.screenOffsetY == 0x8880) {
} else if (v0.screenpos.x + gstate.getOffsetX16() == 0x7400 && v0.screenpos.y + gstate.getOffsetY16() == 0x7780 && v1.screenpos.x + gstate.getOffsetX16() == 0x8C00 && v1.screenpos.y + gstate.getOffsetY16() == 0x8880) {
g_DarkStalkerStretch = DSStretch::Normal;
} else {
return false;

View File

@ -38,8 +38,8 @@ using namespace Rasterizer;
namespace Sampler {
static Vec4IntResult SOFTRAST_CALL SampleNearest(float s, float t, int x, int y, Vec4IntArg prim_color, const u8 *const *tptr, const int *bufw, int level, int levelFrac, const SamplerID &samplerID);
static Vec4IntResult SOFTRAST_CALL SampleLinear(float s, float t, int x, int y, Vec4IntArg prim_color, const u8 *const *tptr, const int *bufw, int level, int levelFrac, const SamplerID &samplerID);
static Vec4IntResult SOFTRAST_CALL SampleNearest(float s, float t, int x, int y, Vec4IntArg prim_color, const u8 *const *tptr, const uint16_t *bufw, int level, int levelFrac, const SamplerID &samplerID);
static Vec4IntResult SOFTRAST_CALL SampleLinear(float s, float t, int x, int y, Vec4IntArg prim_color, const u8 *const *tptr, const uint16_t *bufw, int level, int levelFrac, const SamplerID &samplerID);
static Vec4IntResult SOFTRAST_CALL SampleFetch(int u, int v, const u8 *tptr, int bufw, int level, const SamplerID &samplerID);
std::mutex jitCacheLock;
@ -281,7 +281,7 @@ struct Nearest4 {
};
template <int N>
inline static Nearest4 SOFTRAST_CALL SampleNearest(const int u[N], const int v[N], const u8 *srcptr, int texbufw, int level, const SamplerID &samplerID) {
inline static Nearest4 SOFTRAST_CALL SampleNearest(const int u[N], const int v[N], const u8 *srcptr, uint16_t texbufw, int level, const SamplerID &samplerID) {
Nearest4 res;
if (!srcptr) {
memset(res.v, 0, sizeof(res.v));
@ -535,7 +535,7 @@ Vec4IntResult SOFTRAST_CALL GetTextureFunctionOutput(Vec4IntArg prim_color_in, V
return ToVec4IntResult(Vec4<int>(out_rgb, out_a));
}
static Vec4IntResult SOFTRAST_CALL SampleNearest(float s, float t, int x, int y, Vec4IntArg prim_color, const u8 *const *tptr, const int *bufw, int level, int levelFrac, const SamplerID &samplerID) {
static Vec4IntResult SOFTRAST_CALL SampleNearest(float s, float t, int x, int y, Vec4IntArg prim_color, const u8 *const *tptr, const uint16_t *bufw, int level, int levelFrac, const SamplerID &samplerID) {
int u, v;
// Nearest filtering only. Round texcoords.
@ -631,7 +631,7 @@ static inline Vec4IntResult SOFTRAST_CALL GetTexelCoordinatesQuadT(int level, fl
return ApplyTexelClampQuadT(samplerID.clampT, base_v, height);
}
static Vec4IntResult SOFTRAST_CALL SampleLinearLevel(float s, float t, int x, int y, const u8 *const *tptr, const int *bufw, int texlevel, const SamplerID &samplerID) {
static Vec4IntResult SOFTRAST_CALL SampleLinearLevel(float s, float t, int x, int y, const u8 *const *tptr, const uint16_t *bufw, int texlevel, const SamplerID &samplerID) {
int frac_u, frac_v;
const Vec4<int> u = GetTexelCoordinatesQuadS(texlevel, s, frac_u, x, samplerID);
const Vec4<int> v = GetTexelCoordinatesQuadT(texlevel, t, frac_v, y, samplerID);
@ -646,7 +646,7 @@ static Vec4IntResult SOFTRAST_CALL SampleLinearLevel(float s, float t, int x, in
return ToVec4IntResult((top * (0x10 - frac_v) + bot * frac_v) / (16 * 16));
}
static Vec4IntResult SOFTRAST_CALL SampleLinear(float s, float t, int x, int y, Vec4IntArg prim_color, const u8 *const *tptr, const int *bufw, int texlevel, int levelFrac, const SamplerID &samplerID) {
static Vec4IntResult SOFTRAST_CALL SampleLinear(float s, float t, int x, int y, Vec4IntArg prim_color, const u8 *const *tptr, const uint16_t *bufw, int texlevel, int levelFrac, const SamplerID &samplerID) {
Vec4<int> c0 = SampleLinearLevel(s, t, x, y, tptr, bufw, texlevel, samplerID);
if (levelFrac) {
const Vec4<int> c1 = SampleLinearLevel(s, t, x, y, tptr + 1, bufw + 1, texlevel + 1, samplerID);

View File

@ -36,10 +36,10 @@ namespace Sampler {
typedef Rasterizer::Vec4IntResult(SOFTRAST_CALL *FetchFunc)(int u, int v, const u8 *tptr, int bufw, int level, const SamplerID &samplerID);
FetchFunc GetFetchFunc(SamplerID id);
typedef Rasterizer::Vec4IntResult (SOFTRAST_CALL *NearestFunc)(float s, float t, int x, int y, Rasterizer::Vec4IntArg prim_color, const u8 *const *tptr, const int *bufw, int level, int levelFrac, const SamplerID &samplerID);
typedef Rasterizer::Vec4IntResult (SOFTRAST_CALL *NearestFunc)(float s, float t, int x, int y, Rasterizer::Vec4IntArg prim_color, const u8 *const *tptr, const uint16_t *bufw, int level, int levelFrac, const SamplerID &samplerID);
NearestFunc GetNearestFunc(SamplerID id);
typedef Rasterizer::Vec4IntResult (SOFTRAST_CALL *LinearFunc)(float s, float t, int x, int y, Rasterizer::Vec4IntArg prim_color, const u8 *const *tptr, const int *bufw, int level, int levelFrac, const SamplerID &samplerID);
typedef Rasterizer::Vec4IntResult (SOFTRAST_CALL *LinearFunc)(float s, float t, int x, int y, Rasterizer::Vec4IntArg prim_color, const u8 *const *tptr, const uint16_t *bufw, int level, int levelFrac, const SamplerID &samplerID);
LinearFunc GetLinearFunc(SamplerID id);
void Init();

View File

@ -246,7 +246,7 @@ NearestFunc SamplerJitCache::CompileNearest(const SamplerID &id) {
auto loadPtrs = [&](bool level1) {
X64Reg bufwReg = regCache_.Alloc(RegCache::GEN_ARG_BUFW);
X64Reg bufwPtrReg = regCache_.Find(RegCache::GEN_ARG_BUFW_PTR);
MOV(32, R(bufwReg), MDisp(bufwPtrReg, level1 ? 4 : 0));
MOVZX(32, 16, bufwReg, MDisp(bufwPtrReg, level1 ? 2 : 0));
regCache_.Unlock(bufwPtrReg, RegCache::GEN_ARG_BUFW_PTR);
regCache_.Unlock(bufwReg, RegCache::GEN_ARG_BUFW);
regCache_.ForceRetain(RegCache::GEN_ARG_BUFW);
@ -713,7 +713,7 @@ LinearFunc SamplerJitCache::CompileLinear(const SamplerID &id) {
X64Reg srcReg = regCache_.Find(RegCache::GEN_ARG_TEXPTR_PTR);
X64Reg bufwReg = regCache_.Find(RegCache::GEN_ARG_BUFW_PTR);
ADD(64, R(srcArgReg), MDisp(srcReg, level1 ? 8 : 0));
MOV(32, R(bufwArgReg), MDisp(bufwReg, level1 ? 4 : 0));
MOVZX(32, 16, bufwArgReg, MDisp(bufwReg, level1 ? 2 : 0));
// Leave level/levelFrac, we just always load from RAM on Windows and lock on POSIX.
regCache_.Unlock(srcReg, RegCache::GEN_ARG_TEXPTR_PTR);
regCache_.Unlock(bufwReg, RegCache::GEN_ARG_BUFW_PTR);
@ -2995,12 +2995,13 @@ bool SamplerJitCache::Jit_PrepareDataDirectOffsets(const SamplerID &id, RegCache
if (!id.useStandardBufw || id.hasAnyMips) {
// Spread bufw into each lane.
X64Reg bufwReg = regCache_.Find(RegCache::GEN_ARG_BUFW_PTR);
if (cpu_info.bAVX2) {
VPBROADCASTD(128, bufwVecReg, MDisp(bufwReg, level1 ? 4 : 0));
if (cpu_info.bSSE4_1) {
PMOVZXWD(bufwVecReg, MDisp(bufwReg, level1 ? 2 : 0));
} else {
MOVD_xmm(bufwVecReg, MDisp(bufwReg, level1 ? 4 : 0));
PSHUFD(bufwVecReg, R(bufwVecReg), _MM_SHUFFLE(0, 0, 0, 0));
PXOR(bufwVecReg, R(bufwVecReg));
PINSRW(bufwVecReg, MDisp(bufwReg, level1 ? 2 : 0), 0);
}
PSHUFD(bufwVecReg, R(bufwVecReg), _MM_SHUFFLE(0, 0, 0, 0));
regCache_.Unlock(bufwReg, RegCache::GEN_ARG_BUFW_PTR);
if (bitsPerTexel == 4)
@ -3070,12 +3071,13 @@ bool SamplerJitCache::Jit_PrepareDataSwizzledOffsets(const SamplerID &id, RegCac
if (!id.useStandardBufw || id.hasAnyMips) {
// Spread bufw into each lane.
X64Reg bufwReg = regCache_.Find(RegCache::GEN_ARG_BUFW_PTR);
if (cpu_info.bAVX2) {
VPBROADCASTD(128, bufwVecReg, MDisp(bufwReg, level1 ? 4 : 0));
if (cpu_info.bSSE4_1) {
PMOVZXWD(bufwVecReg, MDisp(bufwReg, level1 ? 2 : 0));
} else {
MOVD_xmm(bufwVecReg, MDisp(bufwReg, level1 ? 4 : 0));
PSHUFD(bufwVecReg, R(bufwVecReg), _MM_SHUFFLE(0, 0, 0, 0));
PXOR(bufwVecReg, R(bufwVecReg));
PINSRW(bufwVecReg, MDisp(bufwReg, level1 ? 2 : 0), 0);
}
PSHUFD(bufwVecReg, R(bufwVecReg), _MM_SHUFFLE(0, 0, 0, 0));
regCache_.Unlock(bufwReg, RegCache::GEN_ARG_BUFW_PTR);
}
@ -3162,12 +3164,13 @@ bool SamplerJitCache::Jit_PrepareDataDXTOffsets(const SamplerID &id, Rasterizer:
if (!id.useStandardBufw || id.hasAnyMips) {
// Spread bufw into each lane.
X64Reg bufwReg = regCache_.Find(RegCache::GEN_ARG_BUFW_PTR);
if (cpu_info.bAVX2) {
VPBROADCASTD(128, bufwVecReg, MDisp(bufwReg, level1 ? 4 : 0));
if (cpu_info.bSSE4_1) {
PMOVZXWD(bufwVecReg, MDisp(bufwReg, level1 ? 2 : 0));
} else {
MOVD_xmm(bufwVecReg, MDisp(bufwReg, level1 ? 4 : 0));
PSHUFD(bufwVecReg, R(bufwVecReg), _MM_SHUFFLE(0, 0, 0, 0));
PXOR(bufwVecReg, R(bufwVecReg));
PINSRW(bufwVecReg, MDisp(bufwReg, level1 ? 2 : 0), 0);
}
PSHUFD(bufwVecReg, R(bufwVecReg), _MM_SHUFFLE(0, 0, 0, 0));
regCache_.Unlock(bufwReg, RegCache::GEN_ARG_BUFW_PTR);
// Divide by 4 before the multiply.

View File

@ -164,6 +164,15 @@ public:
TransformUnit transformUnit;
#if PPSSPP_ARCH(32BIT)
void *operator new(size_t s) {
return AllocateAlignedMemory(s, 16);
}
void operator delete(void *p) {
FreeAlignedMemory(p);
}
#endif
protected:
bool UpdateUseHWTessellation(bool enable) override { return false; }
};

View File

@ -374,8 +374,7 @@ enum GEMatrixType {
GE_MTX_TEXGEN,
};
enum GEComparison
{
enum GEComparison : uint8_t {
GE_COMP_NEVER = 0,
GE_COMP_ALWAYS = 1,
GE_COMP_EQUAL = 2,
@ -578,8 +577,7 @@ enum GEPrimitiveType
GE_PRIM_INVALID = -1,
};
enum GELogicOp
{
enum GELogicOp : uint8_t {
GE_LOGIC_CLEAR = 0,
GE_LOGIC_AND = 1,
GE_LOGIC_AND_REVERSE = 2,

View File

@ -1122,8 +1122,6 @@ void GameSettingsScreen::CreateViews() {
vrFieldOfView->SetEnabledPtr(&g_Config.bEnableVR);
CheckBox *vrStereo = vrSettings->Add(new CheckBox(&g_Config.bEnableStereo, vr->T("Enable stereoscopic vision (Experimental)")));
vrStereo->SetEnabledPtr(&g_Config.bEnableVR);
PopupSliderChoice *vrStereoSepararation = vrSettings->Add(new PopupSliderChoice(&g_Config.iStereoSeparation, 1, 50, vr->T("Stereo separation (differs per game)", "Stereo separation (differs per game)"), 1, screenManager(), "x"));
vrStereoSepararation->SetEnabledPtr(&g_Config.bEnableStereo);
}
}

View File

@ -251,7 +251,7 @@ private:
return nullptr;
}
const auto recentIsos = g_Config.RecentIsos();
if (index >= recentIsos.size())
if (index >= (int)recentIsos.size())
return nullptr;
return g_gameInfoCache->GetInfo(dc.GetDrawContext(), Path(recentIsos[index]), GAMEINFO_WANTBG);
}

621
assets/compatvr.ini Normal file
View File

@ -0,0 +1,621 @@
# ========================================================================================
# compatvr.ini for PPSSPP
# ========================================================================================
#
# This file is not meant to be user-editable, although is kept as a separate ini
# file instead of compiled into the code for debugging purposes.
#
# The uses cases are strict:
# * Enable fixes for things we can't reasonably emulate without completely ruining
# performance for other games, such as the screen copies in Dangan Ronpa
# * Disabling accuracy features like 16-bit depth rounding, when we can't seem to
# implement them at all in a 100% compatible way
# * Emergency game-specific compatibility fixes before releases, such as the GTA
# music problem where every attempted fix has reduced compatibility with other games
# * Enable "unsafe" performance optimizations that some games can tolerate and
# others cannot. We do not currently have any of those.
# * This file is only for VR (virtual reality). For non-VR purposes, use compat.ini.
#
# This functionality should NOT be used for any of the following:
# * Cheats
# * Fun hacks, like enlarged heads or whatever
# * Fixing general compatibility issues. First try to find a general solution. Try hard.
#
# Game IDs can be looked up at GameFAQs, for example:
# http://www.gamefaqs.com/psp/925776-grand-theft-auto-liberty-city-stories/data
# Sometimes the information may be incomplete though.
#
# ========================================================================================
# Issue numbers refer to issues on https://github.com/hrydgard/ppsspp/issues
# ========================================================================================
[UnitsPerMeter]
# Values exported from https://github.com/CarlKenner/ppsspp/tree/VR/Sys/GameSettings
ELF000000 = 10.0
JRPG00001 = 80
JRPG00002 = 80
NPEG00001 = 1.0
NPEG00003 = 1000.0
NPEG00023 = 1.0
NPEG90003 = 1.0
NPEH00003 = 30.0
NPEH00017 = 1.0
NPEH00031 = 1.0
NPEH00134 = 8.0
NPEH00135 = 1.0
NPEH00138 = 80
NPEH90011 = 100.0
NPEH90014 = 1.0
NPEH90023 = 1000.0
NPEH90028 = 128.0
NPEX00005 = 1.0
NPEZ00007 = 1.0
NPEZ00008 = 20.0
NPEZ00011 = 1.0
NPEZ00023 = 1.0
NPEZ00041 = 1.0
NPEZ00044 = 1.0
NPEZ00045 = 1.0
NPEZ00081 = 1.0
NPEZ00101 = 1.0
NPEZ00104 = 1.0
NPEZ00107 = 1.0
NPEZ00108 = 1.0
NPEZ00118 = 70.0
NPEZ00127 = 1.0
NPEZ00140 = 1.0
NPHG00002 = 1.0
NPHG00025 = 80.0
NPHH00351 = 8.0
NPJB40001 = 100.0
NPJG00004 = 1000.0
NPJG00045 = 80.0
NPJG00103 = 1.0
NPJG00122 = 100.0
NPJH00002 = 30.0
NPJH50040 = 1.0
NPJH50045 = 1000.0
NPJH50065 = 1.0
NPJH50145 = 9.0
NPJH50148 = 1.0
NPJH50180 = 1.0
NPJH50184 = 1000.0
NPJH50352 = 100
NPJH50401 = 1.0
NPJH50414 = 1.0
NPJH50443 = 100.0
NPJH50444 = 100.0
NPJH50448 = 80
NPJH50457 = 1.0
NPJH50475 = 4.0
NPJH50515 = 8.0
NPJH50625 = 1.8
NPJH50626 = 8.0
NPJH50701 = 1.0
NPJH90066 = 1.0
NPUG70008 = 1.0
NPUG80086 = 1000.0
NPUG80325 = 1.0
NPUH10006 = 30.0
NPUH10023 = 1.0
NPUH10024 = 1.0
NPUH10026 = 1.0
NPUH10034 = 1.0
NPUH10125 = 8.0
NPUH10126 = 80
NPUH90019 = 1.0
NPUH90029 = 1.0
NPUH90048 = 1.0
NPUH90067 = 128.0
NPUX80433 = 1.0
NPUZ00002 = 1.0
NPUZ00007 = 1.0
NPUZ00010 = 1.0
NPUZ00020 = 1.0
NPUZ00021 = 1.0
NPUZ00024 = 1.0
NPUZ00027 = 20.0
NPUZ00028 = 1.0
NPUZ00031 = 1.0
NPUZ00033 = 70.0
NPUZ00034 = 1.0
NPUZ00040 = 1.0
NPUZ00056 = 1.0
NPUZ00080 = 1.0
UCAS40011 = 1.0
UCAS40012 = 1.0
UCAS40018 = 9.0
UCAS40020 = 100.0
UCAS40021 = 10.0
UCAS40023 = 9.0
UCAS40024 = 0.98
UCAS40025 = 83
UCAS40026 = 0.1
UCAS40049 = 1.0
UCAS40063 = 1.0
UCAS40076 = 5.0
UCAS40089 = 9.0
UCAS40092 = 100.0
UCAS40095 = 1000.0
UCAS40098 = 0.96
UCAS40099 = 1000.0
UCAS40102 = 1.0
UCAS40113 = 1000.0
UCAS40116 = 9.0
UCAS40119 = 1000.0
UCAS40120 = 1.0
UCAS40129 = 7.0
UCAS40130 = 0.98
UCAS40145 = 1.0
UCAS40146 = 6.8
UCAS40148 = 1.0
UCAS40149 = 0.96
UCAS40156 = 9.0
UCAS40164 = 1000.0
UCAS40165 = 1000.0
UCAS40167 = 100.0
UCAS40169 = 1.0
UCAS40177 = 0.96
UCAS40179 = 1.0
UCAS40180 = 9.5
UCAS40191 = 1.0
UCAS40193 = 80.0
UCAS40198 = 1.0
UCAS40204 = 100.0
UCAS40212 = 1.0
UCAS40258 = 0.96
UCAS40265 = 1.0
UCAS40318 = 100.0
UCED00432 = 1.0
UCED00448 = 1000.0
UCED00970 = 1.0
UCED00971 = 1.0
UCED90007 = 1.0
UCES00001 = 1.0
UCES00004 = 0.1
UCES00010 = 100.0
UCES00044 = 2.0
UCES00109 = 5.0
UCES00178 = 9.0
UCES00249 = 1.0
UCES00302 = 100.0
UCES00304 = 1.0
UCES00356 = 1000.0
UCES00420 = 1.0
UCES00422 = 1000.0
UCES00423 = 1.0
UCES00465 = 1.0
UCES00842 = 1.0
UCES00995 = 80.0
UCES01245 = 1.0
UCES01312 = 80.0
UCES01401 = 1.0
UCES01421 = 100.0
UCES01473 = 1.0
UCET00179 = 5.0
UCET00247 = 9.0
UCET00357 = 1.0
UCET00424 = 1000.0
UCET00713 = 1.0
UCJB98011 = 1.0
UCJM95402 = 9.0
UCJS10007 = 1.0
UCJS10008 = 1.0
UCJS10010 = 9.0
UCJS10011 = 10.0
UCJS10017 = 0.98
UCJS10018 = 83
UCJS10019 = 0.1
UCJS10028 = 5.0
UCJS10041 = 1.0
UCJS10042 = 0.96
UCJS10047 = 9.0
UCJS10048 = 7.0
UCJS10052 = 1.0
UCJS10057 = 0.96
UCJS10061 = 9.5
UCJS10077 = 80.0
UCJS10082 = 0.96
UCJS10085 = 1.0
UCJS10092 = 1.0
UCJS10093 = 0.96
UCJS10100 = 1.0
UCJS10106 = 1.0
UCJS10114 = 1.0
UCJS18005 = 1.0
UCJS18010 = 0.98
UCJS18014 = 7.0
UCJS18015 = 0.96
UCJX90019 = 7.0
UCKS45007 = 10.0
UCKS45008 = 1.0
UCKS45011 = 9.0
UCKS45018 = 1.0
UCKS45020 = 1.0
UCKS45022 = 1.0
UCKS45027 = 1000.0
UCKS45032 = 1000.0
UCKS45034 = 9.0
UCKS45038 = 1.0
UCKS45050 = 10.0
UCKS45052 = 100.0
UCKS45056 = 6.8
UCKS45067 = 1.0
UCKS45071 = 9.5
UCKS45076 = 80.0
UCKS45120 = 1.0
UCUS98612 = 1.0
UCUS98618 = 2.0
UCUS98623 = 9.0
UCUS98632 = 1.0
UCUS98633 = 1.0
UCUS98647 = 5.0
UCUS98648 = 1.0
UCUS98653 = 1.0
UCUS98654 = 2.0
UCUS98662 = 1.0
UCUS98671 = 5.0
UCUS98681 = 1.0
UCUS98700 = 7.0
UCUS98706 = 7.0
UCUS98711 = 80.0
UCUS98712 = 1.0
UCUS98713 = 1.0
UCUS98717 = 80.0
UCUS98732 = 80.0
UCUS98737 = 1.0
UCUS98740 = 80.0
UCUS98751 = 100.0
ULAS40129 = 7.0
ULAS40155 = 1.0
ULAS42007 = 1000.0
ULAS42019 = 1.0
ULAS42035 = 930.0
ULAS42037 = 1.0
ULAS42052 = 10.0
ULAS42069 = 7.8
ULAS42072 = 1.0
ULAS42073 = 7.8
ULAS42087 = 970.0
ULAS42093 = 100.0
ULAS42097 = 10.0
ULAS42099 = 1.0
ULAS42110 = 100.0
ULAS42115 = 1.0
ULAS42117 = 1.0
ULAS42119 = 1.0
ULES00008 = 1000.0
ULES00011 = 10.0
ULES00026 = 0.1
ULES00033 = 0.005
ULES00034 = 0.005
ULES00035 = 0.005
ULES00051 = 1.0
ULES00118 = 0.1
ULES00119 = 0.1
ULES00125 = 1.0
ULES00126 = 10.0
ULES00135 = 83
ULES00144 = 1.0
ULES00151 = 1.0
ULES00153 = 83
ULES00168 = 1.0
ULES00169 = 1.0
ULES00170 = 1.0
ULES00171 = 1.0
ULES00172 = 1.0
ULES00174 = 1.0
ULES00181 = 1.0
ULES00182 = 1.0
ULES00183 = 1.0
ULES00210 = 1.0
ULES00214 = 1.0
ULES00215 = 1.0
ULES00216 = 1.0
ULES00219 = 1.0
ULES00223 = 1.0
ULES00227 = 10.0
ULES00233 = 1.0
ULES00235 = 1.0
ULES00277 = 100.0
ULES00283 = 256.0
ULES00284 = 930.0
ULES00307 = 10.0
ULES00319 = 1.0
ULES00320 = 1.0
ULES00321 = 1.0
ULES00322 = 1.0
ULES00323 = 1.0
ULES00324 = 1.0
ULES00325 = 1.0
ULES00326 = 1.0
ULES00327 = 1.0
ULES00339 = 1.0
ULES00363 = 1.0
ULES00377 = 1.0
ULES00382 = 1.0
ULES00383 = 50.0
ULES00419 = 7.8
ULES00452 = 1.0
ULES00474 = 0.1
ULES00475 = 0.1
ULES00479 = 47.0
ULES00484 = 1.0
ULES00502 = 1.0
ULES00503 = 1.0
ULES00522 = 1.0
ULES00567 = 1.0
ULES00601 = 1.0
ULES00623 = 0.01
ULES00640 = 1.0
ULES00643 = 1.05
ULES00644 = 1.05
ULES00645 = 970.0
ULES00704 = 1.0
ULES00718 = 1.0
ULES00722 = 10.0
ULES00734 = 10.0
ULES00735 = 10.0
ULES00736 = 10.0
ULES00737 = 10.0
ULES00738 = 10.0
ULES00741 = 10.0
ULES00742 = 10.0
ULES00743 = 10.0
ULES00744 = 10.0
ULES00745 = 10.0
ULES00746 = 10.0
ULES00747 = 10.0
ULES00748 = 10.0
ULES00749 = 10.0
ULES00757 = 1.0
ULES00765 = 1.0
ULES00766 = 0.95
ULES00772 = 1.0
ULES00811 = 10.0
ULES00813 = 0.5
ULES00841 = 100.0
ULES00850 = 1.0
ULES00851 = 100.0
ULES00869 = 1.0
ULES00959 = 1.0
ULES00975 = 1.0
ULES00976 = 1.0
ULES00977 = 1.0
ULES00978 = 1.0
ULES00979 = 1.0
ULES00981 = 100.0
ULES00982 = 100.0
ULES00986 = 6.8
ULES00987 = 1.0
ULES01013 = 1.0
ULES01037 = 1.0
ULES01044 = 100.0
ULES01045 = 100.0
ULES01046 = 100.0
ULES01047 = 100.0
ULES01086 = 47.0
ULES01151 = 1.0
ULES01213 = 100.0
ULES01237 = 10.0
ULES01238 = 1.0
ULES01239 = 1.0
ULES01240 = 1.0
ULES01270 = 1.0
ULES01298 = 1.0
ULES01347 = 1.0
ULES01352 = 1.0
ULES01357 = 1.0
ULES01367 = 1.0
ULES01370 = 47.0
ULES01372 = 1000.0
ULES01376 = 1000.0
ULES01381 = 128.0
ULES01417 = 9.0
ULES01422 = 1.000999
ULES01431 = 0.8
ULES01441 = 1.0
ULES01505 = 1.0
ULES01513 = 100.0
ULES01519 = 100
ULES01521 = 1.0
ULES01523 = 1.0
ULES01526 = 1.0
ULET00456 = 1.0
ULET00919 = 1.0
ULJM05001 = 1000.0
ULJM05003 = 0.1
ULJM05026 = 1.0
ULJM05036 = 1.0
ULJM05047 = 930.0
ULJM05049 = 1.0
ULJM05060 = 1.0
ULJM05082 = 1.0
ULJM05104 = 1.0
ULJM05105 = 1.0
ULJM05130 = 50.0
ULJM05149 = 1.0
ULJM05150 = 1.0
ULJM05156 = 100.0
ULJM05162 = 1.0
ULJM05176 = 1.0
ULJM05180 = 256.0
ULJM05181 = 10.0
ULJM05193 = 970.0
ULJM05194 = 1.0
ULJM05227 = 970.0
ULJM05228 = 1.0
ULJM05235 = 1.0
ULJM05241 = 6.8
ULJM05243 = 1.0
ULJM05245 = 1.0
ULJM05254 = 100.0
ULJM05255 = 1.0
ULJM05262 = 1.0
ULJM05275 = 100.0
ULJM05280 = 1.0
ULJM05281 = 1.0
ULJM05284 = 970.0
ULJM05287 = 100.0
ULJM05297 = 1.0
ULJM05302 = 1.0
ULJM05319 = 10.0
ULJM05340 = 1.0
ULJM05348 = 1.0
ULJM05369 = 1.0
ULJM05408 = 32.0
ULJM05425 = 10.0
ULJM05471 = 10.0
ULJM05472 = 3.6
ULJM05492 = 1.0
ULJM05550 = 1.0
ULJM05571 = 1.0
ULJM05600 = 1.0
ULJM05604 = 1.0
ULJM05643 = 128.0
ULJM05681 = 4.0
ULJM05775 = 1.0
ULJM05779 = 1.0
ULJM05798 = 100.0
ULJM05836 = 1.0
ULJM05848 = 1.0
ULJM05859 = 80
ULJM06034 = 1.0
ULJM08001 = 1000.0
ULJM08011 = 930.0
ULJM08027 = 10.0
ULJS00003 = 1.0
ULJS00018 = 100.0
ULJS00033 = 1.0
ULJS00048 = 1000.0
ULJS00080 = 1000.0
ULJS00086 = 1.0
ULJS00158 = 1.0
ULJS00202 = 1.0
ULJS00224 = 1000.0
ULJS00350 = 100
ULJS19001 = 1.0
ULJS19007 = 100.0
ULJS19009 = 1.0
ULJS19013 = 1000.0
ULJS19018 = 1.0
ULKS46003 = 1.0
ULKS46012 = 0.1
ULKS46021 = 1.0
ULKS46023 = 10.0
ULKS46027 = 1.0
ULKS46057 = 10.0
ULKS46065 = 930.0
ULKS46071 = 50.0
ULKS46116 = 1.0
ULKS46119 = 970.0
ULKS46122 = 32.0
ULKS46139 = 1.0
ULKS46142 = 1.0
ULKS46152 = 100.0
ULKS46155 = 100.0
ULKS46189 = 1.0
ULKS46190 = 1.0
ULKS46236 = 1.0
ULKS46240 = 1.0
ULUS10004 = 0.1
ULUS10006 = 1000.0
ULUS10014 = 0.005
ULUS10017 = 10.0
ULUS10020 = 83
ULUS10025 = 1.0
ULUS10027 = 1.0
ULUS10032 = 1.0
ULUS10034 = 1.0
ULUS10037 = 10.0
ULUS10041 = 1.0
ULUS10044 = 1.0
ULUS10050 = 10.0
ULUS10053 = 1.0
ULUS10057 = 1.0
ULUS10062 = 1.0
ULUS10063 = 1.0
ULUS10073 = 1.0
ULUS10077 = 930.0
ULUS10083 = 1.0
ULUS10091 = 10.0
ULUS10094 = 1.0
ULUS10105 = 7.8
ULUS10108 = 1.0
ULUS10110 = 256.0
ULUS10128 = 1.0
ULUS10134 = 1.0
ULUS10139 = 1000.0
ULUS10146 = 0.1
ULUS10150 = 0.01
ULUS10155 = 47.0
ULUS10156 = 1.0
ULUS10158 = 1.0
ULUS10160 = 1.0
ULUS10175 = 1.0
ULUS10176 = 1.0
ULUS10184 = 1.0
ULUS10185 = 1.0
ULUS10186 = 1.0
ULUS10202 = 970.0
ULUS10207 = 50.0
ULUS10218 = 1.05
ULUS10223 = 10.0
ULUS10227 = 1.0
ULUS10238 = 1.0
ULUS10241 = 0.95
ULUS10245 = 1.0
ULUS10247 = 10.0
ULUS10248 = 0.5
ULUS10251 = 6.8
ULUS10263 = 1.0
ULUS10266 = 100.0
ULUS10273 = 1.0
ULUS10277 = 100.0
ULUS10285 = 1.0
ULUS10295 = 1.0
ULUS10297 = 1.0
ULUS10311 = 1.0
ULUS10316 = 1.0
ULUS10319 = 10.0
ULUS10325 = 1.0
ULUS10335 = 1.0
ULUS10336 = 100.0
ULUS10345 = 100.0
ULUS10363 = 1.0
ULUS10365 = 47.0
ULUS10380 = 1.0
ULUS10391 = 100.0
ULUS10400 = 1.0
ULUS10403 = 1.0
ULUS10405 = 1.0
ULUS10419 = 10.0
ULUS10431 = 1.0
ULUS10437 = 1.0
ULUS10439 = 1.0
ULUS10450 = 1.0
ULUS10451 = 1.0
ULUS10455 = 1.0
ULUS10457 = 1.0
ULUS10463 = 3.28
ULUS10466 = 1000.0
ULUS10472 = 128.0
ULUS10486 = 3.28
ULUS10487 = 47.0
ULUS10490 = 1.0
ULUS10497 = 1.000999
ULUS10505 = 1.0
ULUS10509 = 1000.0
ULUS10512 = 1.0
ULUS10515 = 9.0
ULUS10519 = 1.0
ULUS10521 = 0.8
ULUS10538 = 1.0
ULUS10560 = 1.0
ULUS10563 = 100
ULUS10566 = 1.0
ULUS10567 = 100.0
ULUS10579 = 1.0
ULUS10592 = 1.0
ULUS90003 = 100.0

View File

@ -48,7 +48,7 @@ static bool TestSamplerJit() {
bool header = false;
u8 **tptr = new u8 *[8];
int *bufw = new int[8];
uint16_t *bufw = new uint16_t[8];
u8 *clut = new u8[1024];
memset(clut, 0, 1024);