Merge branch 'master' into config_openxr_update

This commit is contained in:
Lubos committed 2022-12-07 21:56:55 +01:00
commit 13ca232fc0
111 files changed
+5411 -832

No files matched your search

+7 -5
View File
@@ -884,7 +884,7 @@ add_library(cityhash STATIC
ext/cityhash/city.h
ext/cityhash/citycrc.h
)
include_directories(ext/cityhash)
target_include_directories(cityhash PRIVATE ext/cityhash)
if(NOT MSVC)
# These can be fast even for debug.
@@ -1360,7 +1360,7 @@ add_library(kirk STATIC
ext/libkirk/kirk_engine.c
ext/libkirk/kirk_engine.h
)
include_directories(ext/libkirk)
target_include_directories(kirk PRIVATE ext/libkirk)
add_library(sfmt19937 STATIC
ext/sfmt19937/SFMT.c
@@ -1369,19 +1369,20 @@ add_library(sfmt19937 STATIC
ext/sfmt19937/SFMT-params.h
ext/sfmt19937/SFMT-params19937.h
)
include_directories(ext/sfmt19937)
target_compile_definitions(sfmt19937 PRIVATE SFMT_MEXP=19937)
target_include_directories(sfmt19937 PRIVATE ext/sfmt19937)
add_library(xbrz STATIC
ext/xbrz/xbrz.cpp
ext/xbrz/xbrz.h
)
include_directories(ext/xbrz)
target_include_directories(xbrz PRIVATE ext/xbrz)
add_library(xxhash STATIC
ext/xxhash.c
ext/xxhash.h
)
include_directories(ext/xxhash)
target_include_directories(xxhash PRIVATE ext/xxhash)
set(CoreExtra)
set(CoreExtraLibs)
@@ -2067,6 +2068,7 @@ if(USE_SYSTEM_ZSTD)
target_link_libraries(${CoreLibName} ${ZSTD_LIBRARY})
else()
set(ZSTD_BUILD_PROGRAMS OFF CACHE BOOL "we don't need zstd programs" FORCE)
set(ZSTD_LEGACY_SUPPORT OFF CACHE BOOL "we don't use any old zstd files" FORCE)
add_subdirectory(ext/zstd/build/cmake EXCLUDE_FROM_ALL)
set(CoreExtraLibs ${CoreExtraLibs} libzstd_static)
include_directories(ext/zstd/lib)
+6
View File
@@ -16,3 +16,9 @@ typedef unsigned int Color;
inline Color darkenColor(Color color) {
return (color & 0xFF000000) | ((color >> 1) & 0x7F7F7F);
}
inline Color lightenColor(Color color) {
color = ~color;
color = (color & 0xFF000000) | ((color >> 1) & 0x7F7F7F);
return ~color;
}
+16
View File
@@ -101,6 +101,14 @@ inline u16 RGBA8888ToRGBA5551(u32 value) {
return (u16)(r | g | b | a);
}
// Used in fast sprite path.
inline u16 RGBA8888ToRGBA555X(u32 value) {
u32 r = (value >> 3) & 0x1F;
u32 g = (value >> 6) & (0x1F << 5);
u32 b = (value >> 9) & (0x1F << 10);
return (u16)(r | g | b);
}
inline u16 RGBA8888ToRGBA4444(u32 value) {
const u32 c = value >> 4;
const u16 r = (c >> 0) & 0x000F;
@@ -110,6 +118,14 @@ inline u16 RGBA8888ToRGBA4444(u32 value) {
return r | g | b | a;
}
inline u16 RGBA8888ToRGBA444X(u32 value) {
const u32 c = value >> 4;
const u16 r = (c >> 0) & 0x000F;
const u16 g = (c >> 4) & 0x00F0;
const u16 b = (c >> 8) & 0x0F00;
return r | g | b;
}
// convert image to 8888, parallelizable
// TODO: Implement these in terms of the conversion functions below.
void convert4444_gl(u16* data, u32* out, int width, int l, int u);
+21 -8
View File
@@ -174,6 +174,19 @@ std::string* Section::GetLine(const char* key, std::string* valueOut, std::strin
return 0;
}
const std::string* Section::GetLine(const char* key, std::string* valueOut, std::string* commentOut) const
{
for (std::vector<std::string>::const_iterator iter = lines.begin(); iter != lines.end(); ++iter)
{
const std::string& line = *iter;
std::string lineKey;
ParseLine(line, &lineKey, valueOut, commentOut);
if (!strcasecmp(lineKey.c_str(), key))
return &line;
}
return 0;
}
void Section::Set(const char* key, uint32_t newValue) {
Set(key, StringFromFormat("0x%08x", newValue).c_str());
}
@@ -218,7 +231,7 @@ void Section::Set(const char* key, const std::string& newValue, const std::strin
Delete(key);
}
bool Section::Get(const char* key, std::string* value, const char* defaultValue)
bool Section::Get(const char* key, std::string* value, const char* defaultValue) const
{
const std::string* line = GetLine(key, value, 0);
if (!line)
@@ -275,7 +288,7 @@ void Section::AddComment(const std::string &comment) {
lines.emplace_back("# " + comment);
}
bool Section::Get(const char* key, std::vector<std::string>& values)
bool Section::Get(const char* key, std::vector<std::string>& values) const
{
std::string temp;
bool retval = Get(key, &temp, 0);
@@ -303,7 +316,7 @@ bool Section::Get(const char* key, std::vector<std::string>& values)
return true;
}
bool Section::Get(const char* key, int* value, int defaultValue)
bool Section::Get(const char* key, int* value, int defaultValue) const
{
std::string temp;
bool retval = Get(key, &temp, 0);
@@ -313,7 +326,7 @@ bool Section::Get(const char* key, int* value, int defaultValue)
return false;
}
bool Section::Get(const char* key, uint32_t* value, uint32_t defaultValue)
bool Section::Get(const char* key, uint32_t* value, uint32_t defaultValue) const
{
std::string temp;
bool retval = Get(key, &temp, 0);
@@ -323,7 +336,7 @@ bool Section::Get(const char* key, uint32_t* value, uint32_t defaultValue)
return false;
}
bool Section::Get(const char* key, uint64_t* value, uint64_t defaultValue)
bool Section::Get(const char* key, uint64_t* value, uint64_t defaultValue) const
{
std::string temp;
bool retval = Get(key, &temp, 0);
@@ -333,7 +346,7 @@ bool Section::Get(const char* key, uint64_t* value, uint64_t defaultValue)
return false;
}
bool Section::Get(const char* key, bool* value, bool defaultValue)
bool Section::Get(const char* key, bool* value, bool defaultValue) const
{
std::string temp;
bool retval = Get(key, &temp, 0);
@@ -343,7 +356,7 @@ bool Section::Get(const char* key, bool* value, bool defaultValue)
return false;
}
bool Section::Get(const char* key, float* value, float defaultValue)
bool Section::Get(const char* key, float* value, float defaultValue) const
{
std::string temp;
bool retval = Get(key, &temp, 0);
@@ -353,7 +366,7 @@ bool Section::Get(const char* key, float* value, float defaultValue)
return false;
}
bool Section::Get(const char* key, double* value, double defaultValue)
bool Section::Get(const char* key, double* value, double defaultValue) const
{
std::string temp;
bool retval = Get(key, &temp, 0);
+11 -9
View File
@@ -25,14 +25,16 @@ public:
std::map<std::string, std::string> ToMap() const;
std::string* GetLine(const char* key, std::string* valueOut, std::string* commentOut);
std::string *GetLine(const char* key, std::string* valueOut, std::string* commentOut);
const std::string *GetLine(const char* key, std::string* valueOut, std::string* commentOut) const;
void Set(const char* key, const char* newValue);
void Set(const char* key, const std::string& newValue, const std::string& defaultValue);
void Set(const std::string &key, const std::string &value) {
Set(key.c_str(), value.c_str());
}
bool Get(const char* key, std::string* value, const char* defaultValue);
bool Get(const char* key, std::string* value, const char* defaultValue) const;
void Set(const char* key, uint32_t newValue);
void Set(const char* key, uint64_t newValue);
@@ -57,13 +59,13 @@ public:
void AddComment(const std::string &comment);
bool Get(const char* key, int* value, int defaultValue = 0);
bool Get(const char* key, uint32_t* value, uint32_t defaultValue = 0);
bool Get(const char* key, uint64_t* value, uint64_t defaultValue = 0);
bool Get(const char* key, bool* value, bool defaultValue = false);
bool Get(const char* key, float* value, float defaultValue = false);
bool Get(const char* key, double* value, double defaultValue = false);
bool Get(const char* key, std::vector<std::string>& values);
bool Get(const char* key, int* value, int defaultValue = 0) const;
bool Get(const char* key, uint32_t* value, uint32_t defaultValue = 0) const;
bool Get(const char* key, uint64_t* value, uint64_t defaultValue = 0) const;
bool Get(const char* key, bool* value, bool defaultValue = false) const;
bool Get(const char* key, float* value, float defaultValue = false) const;
bool Get(const char* key, double* value, double defaultValue = false) const;
bool Get(const char* key, std::vector<std::string>& values) const;
bool operator < (const Section& other) const {
return name_ < other.name_;
+2 -3
View File
@@ -46,9 +46,8 @@ void DoSet(PointerWrap &p, std::set<T> &x) {
Do(p, *itr++);
}
break;
default:
ERROR_LOG(SAVESTATE, "Savestate error: invalid mode %d.", p.mode);
case PointerWrap::MODE_NOOP:
break;
}
}
+4 -1
View File
@@ -76,7 +76,7 @@ PointerWrapSection PointerWrap::Section(const char *title, int minVer, int ver)
return PointerWrapSection(*this, -1, title);
}
if (!checkpoints_[curCheckpoint_].Matches(marker, offset)) {
WARN_LOG(SAVESTATE, "Checkpoint mismatch during write! Section %s but expected %s, offset %d but expected %d", title, marker, offset, (int)checkpoints_[curCheckpoint_].offset);
WARN_LOG(SAVESTATE, "Checkpoint mismatch during write! Section %s but expected %s, offset %d but expected %d", title, marker, (int)offset, (int)checkpoints_[curCheckpoint_].offset);
if (curCheckpoint_ > 1) {
WARN_LOG(SAVESTATE, "Previous checkpoint: %s (%d)", checkpoints_[curCheckpoint_ - 1].title, (int)checkpoints_[curCheckpoint_ - 1].offset);
}
@@ -171,6 +171,7 @@ void Do(PointerWrap &p, std::string &x) {
case PointerWrap::MODE_READ: x = (char*)*p.ptr; break;
case PointerWrap::MODE_WRITE: memcpy(*p.ptr, x.c_str(), stringLen); break;
case PointerWrap::MODE_MEASURE: break;
case PointerWrap::MODE_NOOP: break;
case PointerWrap::MODE_VERIFY: _dbg_assert_msg_(!strcmp(x.c_str(), (char*)*p.ptr), "Savestate verification failure: \"%s\" != \"%s\" (at %p).\n", x.c_str(), (char *)*p.ptr, p.ptr); break;
}
(*p.ptr) += stringLen;
@@ -198,6 +199,7 @@ void Do(PointerWrap &p, std::wstring &x) {
case PointerWrap::MODE_READ: x = read(); break;
case PointerWrap::MODE_WRITE: memcpy(*p.ptr, x.c_str(), stringLen); break;
case PointerWrap::MODE_MEASURE: break;
case PointerWrap::MODE_NOOP: break;
case PointerWrap::MODE_VERIFY: _dbg_assert_msg_(x == read(), "Savestate verification failure: \"%ls\" != \"%ls\" (at %p).\n", x.c_str(), read().c_str(), p.ptr); break;
}
(*p.ptr) += stringLen;
@@ -225,6 +227,7 @@ void Do(PointerWrap &p, std::u16string &x) {
case PointerWrap::MODE_READ: x = read(); break;
case PointerWrap::MODE_WRITE: memcpy(*p.ptr, x.c_str(), stringLen); break;
case PointerWrap::MODE_MEASURE: break;
case PointerWrap::MODE_NOOP: break;
case PointerWrap::MODE_VERIFY: _dbg_assert_msg_(x == read(), "Savestate verification failure: (at %p).\n", p.ptr); break;
}
(*p.ptr) += stringLen;
+43 -8
View File
@@ -312,10 +312,6 @@ void PopupScreen::TriggerFinish(DialogResult result) {
}
}
void PopupScreen::resized() {
RecreateViews();
}
void PopupScreen::CreateViews() {
using namespace UI;
UIContext &dc = *screenManager()->getUIContext();
@@ -336,7 +332,9 @@ void PopupScreen::CreateViews() {
box_->SetDropShadowExpand(std::max(dp_xres, dp_yres));
View *title = new PopupHeader(title_);
box_->Add(title);
if (HasTitleBar()) {
box_->Add(title);
}
CreatePopupContents(box_);
root_->SetDefaultFocusView(box_);
@@ -403,6 +401,39 @@ UI::EventReturn ListPopupScreen::OnListChoice(UI::EventParams &e) {
namespace UI {
PopupContextMenuScreen::PopupContextMenuScreen(const ContextMenuItem *items, size_t itemCount, I18NCategory *category, UI::View *sourceView)
: PopupScreen("", "", ""), items_(items), itemCount_(itemCount), category_(category), sourceView_(sourceView)
{
enabled_.resize(itemCount, true);
SetPopupOrigin(sourceView);
}
void PopupContextMenuScreen::CreatePopupContents(UI::ViewGroup *parent) {
for (size_t i = 0; i < itemCount_; i++) {
if (items_[i].imageID) {
Choice *choice = new Choice(category_->T(items_[i].text), ImageID(items_[i].imageID));
parent->Add(choice);
if (enabled_[i]) {
choice->OnClick.Add([=](EventParams &p) {
TriggerFinish(DR_OK);
p.a = (uint32_t)i;
OnChoice.Dispatch(p);
return EVENT_DONE;
});
}
else {
choice->SetEnabled(false);
}
}
}
// Hacky: Override the position to look like a popup menu.
AnchorLayoutParams *ap = (AnchorLayoutParams *)parent->GetLayoutParams();
ap->center = false;
ap->left = sourceView_->GetBounds().x;
ap->top = sourceView_->GetBounds().y2();
}
std::string ChopTitle(const std::string &title) {
size_t pos = title.find('\n');
if (pos != title.npos) {
@@ -814,7 +845,7 @@ void AbstractChoiceWithValueDisplay::GetContentDimensionsBySpec(const UIContext
const std::string valueText = ValueText();
int paddingX = 12;
// Assume we want at least 20% of the size for the label, at a minimum.
float availWidth = (horiz.size - paddingX * 2) * 0.8f;
float availWidth = (horiz.size - paddingX * 2) * (text_.empty() ? 1.0f : 0.8f);
if (availWidth < 0) {
availWidth = 65535.0f;
}
@@ -826,11 +857,15 @@ void AbstractChoiceWithValueDisplay::GetContentDimensionsBySpec(const UIContext
valueW += paddingX;
// Give the choice itself less space to grow in, so it shrinks if needed.
MeasureSpec horizLabel = horiz;
horizLabel.size -= valueW;
// MeasureSpec horizLabel = horiz;
// horizLabel.size -= valueW;
Choice::GetContentDimensionsBySpec(dc, horiz, vert, w, h);
w += valueW;
// Fill out anyway if there's space.
if (horiz.type == AT_MOST && w < horiz.size) {
w = horiz.size;
}
h = std::max(h, valueH);
}
+36 -4
View File
@@ -76,7 +76,6 @@ public:
virtual bool isTransparent() const override { return true; }
virtual bool touch(const TouchInput &touch) override;
virtual bool key(const KeyInput &key) override;
virtual void resized() override;
virtual void TriggerFinish(DialogResult result) override;
@@ -91,6 +90,7 @@ protected:
virtual bool ShowButtons() const { return true; }
virtual bool CanComplete(DialogResult result) { return true; }
virtual void OnCompleted(DialogResult result) {}
virtual bool HasTitleBar() const { return true; }
const std::string &Title() { return title_; }
virtual void update() override;
@@ -250,7 +250,7 @@ public:
Event OnChange;
private:
virtual void OnCompleted(DialogResult result) override;
void OnCompleted(DialogResult result) override;
TextEdit *edit_;
std::string *value_;
std::string textEditValue_;
@@ -258,13 +258,45 @@ private:
int maxLen_;
};
// TODO: Break out a lot of popup stuff from UIScreen.h.
struct ContextMenuItem {
const char *text;
const char *imageID;
};
// Once a selection has been made,
class PopupContextMenuScreen : public PopupScreen {
public:
PopupContextMenuScreen(const ContextMenuItem *items, size_t itemCount, I18NCategory *category, UI::View *sourceView);
void CreatePopupContents(ViewGroup *parent) override;
const char *tag() const override { return "ContextMenuPopup"; }
void SetEnabled(size_t index, bool enabled) {
enabled_[index] = enabled;
}
UI::Event OnChoice;
protected:
bool HasTitleBar() const { return false; }
private:
const ContextMenuItem *items_;
size_t itemCount_;
I18NCategory *category_;
UI::View *sourceView_;
std::vector<bool> enabled_;
};
class AbstractChoiceWithValueDisplay : public UI::Choice {
public:
AbstractChoiceWithValueDisplay(const std::string &text, LayoutParams *layoutParams = nullptr)
: Choice(text, layoutParams) {
}
virtual void Draw(UIContext &dc) override;
void Draw(UIContext &dc) override;
void GetContentDimensionsBySpec(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert, float &w, float &h) const override;
protected:
@@ -463,8 +495,8 @@ public:
private:
std::string ValueText() const override;
int *iValue_ = nullptr;
std::string *sValue_ = nullptr;
int *iValue_ = nullptr;
const char *category_ = nullptr;
std::string (*translateCallback_)(const char *value) = nullptr;
};
+65 -17
View File
@@ -16,6 +16,7 @@
#include "Common/System/System.h"
#include "Common/TimeUtil.h"
#include "Common/StringUtils.h"
#include "Common/Log.h"
namespace UI {
@@ -24,7 +25,6 @@ static constexpr float MIN_TEXT_SCALE = 0.8f;
static constexpr float MAX_ITEM_SIZE = 65535.0f;
void MeasureBySpec(Size sz, float contentWidth, MeasureSpec spec, float *measured) {
*measured = sz;
if (sz == WRAP_CONTENT) {
if (spec.type == UNSPECIFIED)
*measured = contentWidth;
@@ -40,6 +40,8 @@ void MeasureBySpec(Size sz, float contentWidth, MeasureSpec spec, float *measure
*measured = spec.size;
} else if (spec.type == EXACTLY || (spec.type == AT_MOST && *measured > spec.size)) {
*measured = spec.size;
} else {
*measured = sz;
}
}
@@ -413,6 +415,7 @@ void ClickableItem::GetContentDimensions(const UIContext &dc, float &w, float &h
ClickableItem::ClickableItem(LayoutParams *layoutParams) : Clickable(layoutParams) {
if (!layoutParams) {
// The default LayoutParams assigned by View::View defaults to WRAP_CONTENT/WRAP_CONTENT.
if (layoutParams_->width == WRAP_CONTENT)
layoutParams_->width = FILL_PARENT;
}
@@ -497,6 +500,7 @@ void Choice::Draw(UIContext &dc) {
if (image_.isValid()) {
const AtlasImage *image = dc.Draw()->GetAtlas()->getImage(image_);
_dbg_assert_(image);
paddingX += image->w + 6;
availWidth -= image->w + 6;
// TODO: Use scale rotation and flip here as well (DrawImageRotated is always ALIGN_CENTER for now)
@@ -696,28 +700,55 @@ void CheckBox::Draw(UIContext &dc) {
if (!IsEnabled()) {
style = dc.theme->itemDisabledStyle;
}
if (HasFocus()) {
style = dc.theme->itemFocusedStyle;
}
if (down_) {
style = dc.theme->itemDownStyle;
ImageID image = Toggled() ? dc.theme->checkOn : dc.theme->checkOff;
// In image mode, light up instead of showing a checkbox.
if (imageID_.isValid()) {
image = imageID_;
if (Toggled()) {
if (HasFocus()) {
style = dc.theme->itemDownStyle;
} else {
style = dc.theme->itemFocusedStyle;
}
} else {
if (HasFocus()) {
style = dc.theme->itemDownStyle;
} else {
style = dc.theme->itemStyle;
}
}
if (down_) {
style.background.color = lightenColor(style.background.color);
}
} else {
if (HasFocus()) {
style = dc.theme->itemFocusedStyle;
}
if (down_) {
style = dc.theme->itemDownStyle;
}
}
dc.SetFontStyle(dc.theme->uiFont);
ClickableItem::Draw(dc);
DrawBG(dc, style);
ImageID image = Toggled() ? dc.theme->checkOn : dc.theme->checkOff;
float imageW, imageH;
dc.Draw()->MeasureImage(image, &imageW, &imageH);
const int paddingX = 12;
// Padding right of the checkbox image too.
const float availWidth = bounds_.w - paddingX * 2 - imageW - paddingX;
float scale = CalculateTextScale(dc, availWidth);
dc.SetFontScale(scale, scale);
Bounds textBounds(bounds_.x + paddingX, bounds_.y, availWidth, bounds_.h);
dc.DrawTextRect(text_.c_str(), textBounds, style.fgColor, ALIGN_VCENTER | FLAG_WRAP_TEXT);
if (!text_.empty()) {
float scale = CalculateTextScale(dc, availWidth);
dc.SetFontScale(scale, scale);
Bounds textBounds(bounds_.x + paddingX, bounds_.y, availWidth, bounds_.h);
dc.DrawTextRect(text_.c_str(), textBounds, style.fgColor, ALIGN_VCENTER | FLAG_WRAP_TEXT);
}
dc.Draw()->DrawImage(image, bounds_.x2() - paddingX, bounds_.centerY(), 1.0f, style.fgColor, ALIGN_RIGHT | ALIGN_VCENTER);
dc.SetFontScale(1.0f, 1.0f);
}
@@ -743,24 +774,41 @@ float CheckBox::CalculateTextScale(const UIContext &dc, float availWidth) const
void CheckBox::GetContentDimensions(const UIContext &dc, float &w, float &h) const {
ImageID image = Toggled() ? dc.theme->checkOn : dc.theme->checkOff;
if (imageID_.isValid()) {
image = imageID_;
}
float imageW, imageH;
dc.Draw()->MeasureImage(image, &imageW, &imageH);
const int paddingX = 12;
if (imageID_.isValid()) {
w = imageW + paddingX * 2;
h = std::max(imageH, ITEM_HEIGHT);
return;
}
// The below code is kinda wacky, we shouldn't involve bounds_ here.
// Padding right of the checkbox image too.
float availWidth = bounds_.w - paddingX * 2 - imageW - paddingX;
if (availWidth < 0.0f) {
// Let it have as much space as it needs.
availWidth = MAX_ITEM_SIZE;
}
float scale = CalculateTextScale(dc, availWidth);
float actualWidth, actualHeight;
Bounds availBounds(0, 0, availWidth, bounds_.h);
dc.MeasureTextRect(dc.theme->uiFont, scale, scale, text_.c_str(), (int)text_.size(), availBounds, &actualWidth, &actualHeight, ALIGN_VCENTER | FLAG_WRAP_TEXT);
if (!text_.empty()) {
float scale = CalculateTextScale(dc, availWidth);
float actualWidth, actualHeight;
Bounds availBounds(0, 0, availWidth, bounds_.h);
dc.MeasureTextRect(dc.theme->uiFont, scale, scale, text_.c_str(), (int)text_.size(), availBounds, &actualWidth, &actualHeight, ALIGN_VCENTER | FLAG_WRAP_TEXT);
h = std::max(actualHeight, ITEM_HEIGHT);
} else {
h = std::max(imageH, ITEM_HEIGHT);
}
w = bounds_.w;
h = std::max(actualHeight, ITEM_HEIGHT);
}
void BitCheckBox::Toggle() {
+8 -1
View File
@@ -827,11 +827,17 @@ private:
class CheckBox : public ClickableItem {
public:
CheckBox(bool *toggle, const std::string &text, const std::string &smallText = "", LayoutParams *layoutParams = 0)
CheckBox(bool *toggle, const std::string &text, const std::string &smallText = "", LayoutParams *layoutParams = nullptr)
: ClickableItem(layoutParams), toggle_(toggle), text_(text), smallText_(smallText) {
OnClick.Handle(this, &CheckBox::OnClicked);
}
// Image-only "checkbox", lights up instead of showing a checkmark.
CheckBox(bool *toggle, ImageID imageID, LayoutParams *layoutParams = nullptr)
: ClickableItem(layoutParams), toggle_(toggle), imageID_(imageID) {
OnClick.Handle(this, &CheckBox::OnClicked);
}
void Draw(UIContext &dc) override;
std::string DescribeText() const override;
void GetContentDimensions(const UIContext &dc, float &w, float &h) const override;
@@ -846,6 +852,7 @@ private:
bool *toggle_;
std::string text_;
std::string smallText_;
ImageID imageID_;
};
class BitCheckBox : public CheckBox {
+18 -5
View File
@@ -100,7 +100,11 @@ bool ViewGroup::Touch(const TouchInput &input) {
}
}
}
return any;
if (clickableBackground_) {
return any || bounds_.Contains(input.x, input.y);
} else {
return any;
}
}
void ViewGroup::Query(float x, float y, std::vector<View *> &list) {
@@ -510,8 +514,9 @@ void LinearLayout::Measure(const UIContext &dc, MeasureSpec horiz, MeasureSpec v
float sum = 0.0f;
float maxOther = 0.0f;
float totalWeight = 0.0f;
float weightSum = 0.0f;
float weightZeroSum = 0.0f;
float weightSum = 0.0f; // Total sum of weights
float weightZeroSum = 0.0f; // Sum of sizes of things with weight 0.0, a bit confusingly named
int numVisible = 0;
@@ -589,8 +594,11 @@ void LinearLayout::Measure(const UIContext &dc, MeasureSpec horiz, MeasureSpec v
for (View *view : views_) {
if (view->GetVisibility() == V_GONE)
continue;
const LinearLayoutParams *linLayoutParams = view->GetLayoutParams()->As<LinearLayoutParams>();
// FILL_PARENT is not appropriate in this direction. It gets ignored though.
// We have a bit too many of these due to the hack in the ClickableItem constructor.
// _dbg_assert_(view->GetLayoutParams()->width != UI::FILL_PARENT);
const LinearLayoutParams *linLayoutParams = view->GetLayoutParams()->As<LinearLayoutParams>();
if (linLayoutParams && linLayoutParams->weight > 0.0f) {
Margins margins = defaultMargins_;
if (linLayoutParams->HasMargins())
@@ -634,8 +642,11 @@ void LinearLayout::Measure(const UIContext &dc, MeasureSpec horiz, MeasureSpec v
for (View *view : views_) {
if (view->GetVisibility() == V_GONE)
continue;
const LinearLayoutParams *linLayoutParams = view->GetLayoutParams()->As<LinearLayoutParams>();
// FILL_PARENT is not appropriate in this direction. It gets ignored though.
// We have a bit too many of these due to the hack in the ClickableItem constructor.
// _dbg_assert_(view->GetLayoutParams()->height != UI::FILL_PARENT);
const LinearLayoutParams *linLayoutParams = view->GetLayoutParams()->As<LinearLayoutParams>();
if (linLayoutParams && linLayoutParams->weight > 0.0f) {
Margins margins = defaultMargins_;
if (linLayoutParams->HasMargins())
@@ -645,6 +656,7 @@ void LinearLayout::Measure(const UIContext &dc, MeasureSpec horiz, MeasureSpec v
h = MeasureSpec(AT_MOST, measuredWidth_);
float unit = (allowedHeight - weightZeroSum) / weightSum;
if (weightSum == 0.0f) {
// We must have gotten an inf.
unit = 1.0f;
}
MeasureSpec v(AT_MOST, unit * linLayoutParams->weight - margins.vert());
@@ -1589,6 +1601,7 @@ StickyChoice *ChoiceStrip::Choice(int index) {
return static_cast<StickyChoice *>(views_[index]);
return nullptr;
}
ListView::ListView(ListAdaptor *a, std::set<int> hidden, LayoutParams *layoutParams)
: ScrollView(ORIENT_VERTICAL, layoutParams), adaptor_(a), maxHeight_(0), hidden_(hidden) {
+2
View File
@@ -78,6 +78,7 @@ public:
void SetHasDropShadow(bool has) { hasDropShadow_ = has; }
void SetDropShadowExpand(float s) { dropShadowExpand_ = s; }
void SetExclusiveTouch(bool exclusive) { exclusiveTouch_ = exclusive; }
void SetClickableBackground(bool clickableBackground) { clickableBackground_ = clickableBackground; }
void Lock() { modifyLock_.lock(); }
void Unlock() { modifyLock_.unlock(); }
@@ -96,6 +97,7 @@ protected:
Drawable bg_;
float dropShadowExpand_ = 0.0f;
bool hasDropShadow_ = false;
bool clickableBackground_ = false;
bool clip_ = false;
bool exclusiveTouch_ = false;
};
+1 -1
View File
@@ -141,7 +141,7 @@ void InitVROnAndroid(void* vm, void* activity, const char* system, int version,
//Set platform flags
if (strcmp(vendor, "PICO") == 0) {
VR_SetPlatformFLag(VR_PLATFORM_CONTROLLER_PICO, true);
VR_SetPlatformFLag(VR_PLATFORM_PICO_INIT, true);
VR_SetPlatformFLag(VR_PLATFORM_INSTANCE_EXT, true);
} else if ((strcmp(vendor, "META") == 0) || (strcmp(vendor, "OCULUS") == 0)) {
VR_SetPlatformFLag(VR_PLATFORM_CONTROLLER_QUEST, true);
VR_SetPlatformFLag(VR_PLATFORM_PERFORMANCE_EXT, true);
+4 -55
View File
@@ -9,34 +9,6 @@
#include <unistd.h>
#endif
enum ConfigsSetEXT {
UNREAL_VERSION = 0,
TRACKING_ORIGIN,
OPENGL_NOERROR,
ENABLE_SIX_DOF,
PRESENTATION_FLAG,
ENABLE_CPT,
PLATFORM,
FOVEATION_LEVEL,
SET_DISPLAY_RATE = 8,
MRC_TEXTURE_ID = 9,
};
enum PxrTrackingDof {
PXR_TRACKING_3DOF = 0,
PXR_TRACKING_6DOF = 1
};
typedef XrResult (XRAPI_PTR *PFN_xrSetEngineVersionPico)(XrInstance instance,const char* version);
typedef XrResult (XRAPI_PTR *PFN_xrStartCVControllerThreadPico)(XrInstance instance,int headSensorState, int handSensorState);
typedef XrResult (XRAPI_PTR *PFN_xrStopCVControllerThreadPico)(XrInstance instance,int headSensorState, int handSensorState);
typedef XrResult (XRAPI_PTR *PFN_xrSetConfigPICO) (XrSession instance, enum ConfigsSetEXT configIndex, const char *configData);
PFN_xrSetConfigPICO pfnXrSetConfigPICO = nullptr;
PFN_xrSetEngineVersionPico pfnXrSetEngineVersionPico = nullptr;
PFN_xrStartCVControllerThreadPico pfnXrStartCVControllerThreadPico = nullptr;
PFN_xrStopCVControllerThreadPico pfnXrStopCVControllerThreadPico = nullptr;
static bool vr_platform[VR_PLATFORM_MAX];
static engine_t vr_engine;
int vr_initialized = 0;
@@ -76,18 +48,13 @@ void VR_Init( void* system, const char* name, int version ) {
}
extensions.push_back(XR_KHR_COMPOSITION_LAYER_CYLINDER_EXTENSION_NAME);
#ifdef ANDROID
if (VR_GetPlatformFlag(VR_PLATFORM_INSTANCE_EXT)) {
extensions.push_back(XR_KHR_ANDROID_CREATE_INSTANCE_EXTENSION_NAME);
}
if (VR_GetPlatformFlag(VR_PLATFORM_PERFORMANCE_EXT)) {
extensions.push_back(XR_EXT_PERFORMANCE_SETTINGS_EXTENSION_NAME);
extensions.push_back(XR_KHR_ANDROID_THREAD_SETTINGS_EXTENSION_NAME);
}
if (VR_GetPlatformFlag(VR_PLATFORM_PICO_INIT)) {
extensions.push_back(XR_KHR_ANDROID_CREATE_INSTANCE_EXTENSION_NAME);
extensions.push_back("XR_PICO_android_controller_function_ext_enable");
extensions.push_back("XR_PICO_view_state_ext_enable");
extensions.push_back("XR_PICO_frame_end_info_ext");
extensions.push_back("XR_PICO_configs_ext");
extensions.push_back("XR_PICO_reset_sensor");
}
#endif
// Create the OpenXR instance.
@@ -112,7 +79,7 @@ void VR_Init( void* system, const char* name, int version ) {
#ifdef ANDROID
XrInstanceCreateInfoAndroidKHR instanceCreateInfoAndroid = {XR_TYPE_INSTANCE_CREATE_INFO_ANDROID_KHR};
if (VR_GetPlatformFlag(VR_PLATFORM_PICO_INIT)) {
if (VR_GetPlatformFlag(VR_PLATFORM_INSTANCE_EXT)) {
ovrJava* java = (ovrJava*)system;
instanceCreateInfoAndroid.applicationVM = java->Vm;
instanceCreateInfoAndroid.applicationActivity = java->ActivityObject;
@@ -129,15 +96,6 @@ void VR_Init( void* system, const char* name, int version ) {
XRLoadInstanceFunctions(vr_engine.appState.Instance);
if (VR_GetPlatformFlag(VR_PLATFORM_PICO_INIT)) {
xrGetInstanceProcAddr(vr_engine.appState.Instance, "xrSetEngineVersionPico", (PFN_xrVoidFunction*)(&pfnXrSetEngineVersionPico));
xrGetInstanceProcAddr(vr_engine.appState.Instance, "xrStartCVControllerThreadPico", (PFN_xrVoidFunction*)(&pfnXrStartCVControllerThreadPico));
xrGetInstanceProcAddr(vr_engine.appState.Instance, "xrStopCVControllerThreadPico", (PFN_xrVoidFunction*)(&pfnXrStopCVControllerThreadPico));
xrGetInstanceProcAddr(vr_engine.appState.Instance,"xrSetConfigPICO", (PFN_xrVoidFunction*)(&pfnXrSetConfigPICO));
if (pfnXrSetEngineVersionPico != nullptr) pfnXrSetEngineVersionPico(vr_engine.appState.Instance, "2.8.0.1");
if (pfnXrStartCVControllerThreadPico != nullptr) pfnXrStartCVControllerThreadPico(vr_engine.appState.Instance, PXR_TRACKING_6DOF, PXR_TRACKING_6DOF);
}
XrInstanceProperties instanceInfo;
instanceInfo.type = XR_TYPE_INSTANCE_PROPERTIES;
instanceInfo.next = NULL;
@@ -196,12 +154,6 @@ void VR_Init( void* system, const char* name, int version ) {
void VR_Destroy( engine_t* engine ) {
if (engine == &vr_engine) {
if (VR_GetPlatformFlag(VR_PLATFORM_PICO_INIT)) {
if (pfnXrStopCVControllerThreadPico != nullptr) {
pfnXrStopCVControllerThreadPico(engine->appState.Instance, PXR_TRACKING_6DOF, PXR_TRACKING_6DOF);
}
}
xrDestroyInstance(engine->appState.Instance);
ovrApp_Destroy(&engine->appState);
}
@@ -246,9 +198,6 @@ void VR_EnterVR( engine_t* engine, XrGraphicsBindingVulkanKHR* graphicsBindingVu
ALOGE("Failed to create XR session: %d.", initResult);
exit(1);
}
if (VR_GetPlatformFlag(VR_PLATFORM_PICO_INIT)) {
pfnXrSetConfigPICO(engine->appState.Session, TRACKING_ORIGIN, "1");
}
// Create a space to the first path
XrReferenceSpaceCreateInfo spaceCreateInfo = {};
+1 -1
View File
@@ -121,8 +121,8 @@ typedef struct {
enum VRPlatformFlag {
VR_PLATFORM_CONTROLLER_PICO,
VR_PLATFORM_CONTROLLER_QUEST,
VR_PLATFORM_INSTANCE_EXT,
VR_PLATFORM_PERFORMANCE_EXT,
VR_PLATFORM_PICO_INIT,
VR_PLATFORM_RENDERER_VULKAN,
VR_PLATFORM_TRACKING_FLOOR,
VR_PLATFORM_MAX
+15 -10
View File
@@ -1127,9 +1127,10 @@ static int DefaultSystemParamLanguage() {
int defaultLang = PSP_SYSTEMPARAM_LANGUAGE_ENGLISH;
if (g_Config.bFirstRun) {
// TODO: Be smart about same language, different country
auto langValuesMapping = GetLangValuesMapping();
if (langValuesMapping.find(g_Config.sLanguageIni) != langValuesMapping.end()) {
defaultLang = langValuesMapping[g_Config.sLanguageIni].second;
auto &langValuesMapping = g_Config.GetLangValuesMapping();
auto iter = langValuesMapping.find(g_Config.sLanguageIni);
if (iter != langValuesMapping.end()) {
defaultLang = iter->second.second;
}
}
return defaultLang;
@@ -1276,14 +1277,12 @@ Config::~Config() {
delete private_;
}
std::map<std::string, std::pair<std::string, int>> GetLangValuesMapping() {
std::map<std::string, std::pair<std::string, int>> langValuesMapping;
void Config::LoadLangValuesMapping() {
IniFile mapping;
mapping.LoadFromVFS("langregion.ini");
std::vector<std::string> keys;
mapping.GetKeys("LangRegionNames", keys);
std::map<std::string, int> langCodeMapping;
langCodeMapping["JAPANESE"] = PSP_SYSTEMPARAM_LANGUAGE_JAPANESE;
langCodeMapping["ENGLISH"] = PSP_SYSTEMPARAM_LANGUAGE_ENGLISH;
@@ -1298,8 +1297,8 @@ std::map<std::string, std::pair<std::string, int>> GetLangValuesMapping() {
langCodeMapping["CHINESE_TRADITIONAL"] = PSP_SYSTEMPARAM_LANGUAGE_CHINESE_TRADITIONAL;
langCodeMapping["CHINESE_SIMPLIFIED"] = PSP_SYSTEMPARAM_LANGUAGE_CHINESE_SIMPLIFIED;
Section *langRegionNames = mapping.GetOrCreateSection("LangRegionNames");
Section *systemLanguage = mapping.GetOrCreateSection("SystemLanguage");
const Section *langRegionNames = mapping.GetOrCreateSection("LangRegionNames");
const Section *systemLanguage = mapping.GetOrCreateSection("SystemLanguage");
for (size_t i = 0; i < keys.size(); i++) {
std::string langName;
@@ -1309,9 +1308,15 @@ std::map<std::string, std::pair<std::string, int>> GetLangValuesMapping() {
int iLangCode = PSP_SYSTEMPARAM_LANGUAGE_ENGLISH;
if (langCodeMapping.find(langCode) != langCodeMapping.end())
iLangCode = langCodeMapping[langCode];
langValuesMapping[keys[i]] = std::make_pair(langName, iLangCode);
langValuesMapping_[keys[i]] = std::make_pair(langName, iLangCode);
}
return langValuesMapping;
}
const std::map<std::string, std::pair<std::string, int>> &Config::GetLangValuesMapping() {
if (langValuesMapping_.empty()) {
LoadLangValuesMapping();
}
return langValuesMapping_;
}
void Config::Reload() {
+4 -1
View File
@@ -568,21 +568,24 @@ public:
bool HasRecentIsos() const;
void ClearRecentIsos();
const std::map<std::string, std::pair<std::string, int>> &GetLangValuesMapping();
protected:
void LoadStandardControllerIni();
void LoadLangValuesMapping();
private:
bool reload_ = false;
std::string gameId_;
std::string gameIdTitle_;
std::vector<std::string> recentIsos;
std::map<std::string, std::pair<std::string, int>> langValuesMapping_;
Path iniFilename_;
Path controllerIniFilename_;
Path searchPath_;
ConfigPrivate *private_ = nullptr;
};
std::map<std::string, std::pair<std::string, int>> GetLangValuesMapping();
std::string CreateRandMAC();
// TODO: Find a better place for this.
+1 -1
View File
@@ -346,7 +346,7 @@ int PSPOskDialog::Init(u32 oskPtr) {
inputChars += c;
}
languageMapping = GetLangValuesMapping();
languageMapping = g_Config.GetLangValuesMapping();
// Eat any keys pressed before the dialog inited.
UpdateButtons();
+2
View File
@@ -335,6 +335,8 @@ static void DoMemoryVoid(PointerWrap &p, uint32_t start, uint32_t size) {
_dbg_assert_msg_(d[i] == storage[i], "Savestate verification failure: %d (0x%X) (at %p) != %d (0x%X) (at %p).\n", d[i], d[i], &d[i], storage[i], storage[i], &storage[i]);
}, 0, size, 128);
break;
case PointerWrap::MODE_NOOP:
break;
}
storage += size;
}
+2 -2
View File
@@ -19,11 +19,11 @@
// Postprocessing shader manager
// For FXAA, "Natural", bloom, B&W, cross processing and whatnot.
#pragma once
#include <string>
#include <vector>
#include "Common/Data/Format/IniFile.h"
struct ShaderInfo {
Path iniFile; // which ini file was this definition in? So we can write settings back later
std::string section; // ini file section. This is saved.
-5
View File
@@ -173,11 +173,6 @@ u32 GPU_GLES::CheckGPUFeatures() const {
if (gl_extensions.ARB_texture_float || gl_extensions.OES_texture_float)
features |= GPU_USE_TEXTURE_FLOAT;
// The Phantasy Star hack :(
if (PSP_CoreParameter().compat.flags().DepthRangeHack && (features & GPU_USE_ACCURATE_DEPTH) == 0) {
features |= GPU_USE_DEPTH_RANGE_HACK;
}
if (!draw_->GetShaderLanguageDesc().bitwiseOps) {
features |= GPU_USE_FRAGMENT_TEST_CACHE;
}
-32
View File
@@ -319,38 +319,6 @@ static inline void FlipProjMatrix(Matrix4x4 &in, bool useBufferedRendering) {
in[8] = -in[8];
in[12] = -in[12];
}
// In Phantasy Star Portable 2, depth range sometimes goes negative and is clamped by glDepthRange to 0,
// causing graphics clipping glitch (issue #1788). This hack modifies the projection matrix to work around it.
if (gstate_c.Use(GPU_USE_DEPTH_RANGE_HACK)) {
float zScale = gstate.getViewportZScale() / 65535.0f;
float zCenter = gstate.getViewportZCenter() / 65535.0f;
// if far depth range < 0
if (zCenter + zScale < 0.0f) {
// if perspective projection
if (in[11] < 0.0f) {
float depthMax = gstate.getDepthRangeMax() / 65535.0f;
float depthMin = gstate.getDepthRangeMin() / 65535.0f;
float a = in[10];
float b = in[14];
float n = b / (a - 1.0f);
float f = b / (a + 1.0f);
f = (n * f) / (n + ((zCenter + zScale) * (n - f) / (depthMax - depthMin)));
a = (n + f) / (n - f);
b = (2.0f * n * f) / (n - f);
if (!my_isnan(a) && !my_isnan(b)) {
in[10] = a;
in[14] = b;
}
}
}
}
}
static inline bool GuessVRDrawingHUD(bool is2D, bool flatScreen) {
+5
View File
@@ -3537,6 +3537,11 @@ u32 GPUCommon::CheckGPUFeatures() const {
features |= GPU_USE_CLEAR_RAM_HACK;
}
// Even without depth clamp, force accurate depth on for some games that break without it.
if (PSP_CoreParameter().compat.flags().DepthRangeHack) {
features |= GPU_USE_ACCURATE_DEPTH;
}
return features;
}
+1 -1
View File
@@ -265,7 +265,7 @@ protected:
void DeviceLost() override;
void DeviceRestore() override;
void ClearCacheNextFrame();
void ClearCacheNextFrame() override;
virtual void CheckRenderResized();
+3 -3
View File
@@ -375,7 +375,7 @@ static const char *const gpuUseFlagNames[32] = {
"GPU_USE_VS_RANGE_CULLING",
"GPU_USE_BLEND_MINMAX",
"GPU_USE_LOGIC_OP",
"GPU_USE_DEPTH_RANGE_HACK",
"N/A",
"GPU_USE_TEXTURE_NPOT",
"GPU_USE_ANISOTROPY",
"GPU_USE_CLEAR_RAM_HACK",
@@ -388,7 +388,7 @@ static const char *const gpuUseFlagNames[32] = {
"GPU_USE_DEPTH_TEXTURE",
"GPU_USE_ACCURATE_DEPTH",
"GPU_USE_GS_CULLING",
"GPU_USE_REVERSE_COLOR_ORDER",
"N/A",
"GPU_USE_FRAMEBUFFER_FETCH",
"GPU_SCALE_DEPTH_FROM_24BIT_TO_16BIT",
"GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT",
@@ -409,4 +409,4 @@ const char *GpuUseFlagToString(int useFlag) {
} else {
return "N/A";
}
}
}
+1 -1
View File
@@ -478,7 +478,7 @@ enum {
GPU_USE_VS_RANGE_CULLING = FLAG_BIT(3),
GPU_USE_BLEND_MINMAX = FLAG_BIT(4),
GPU_USE_LOGIC_OP = FLAG_BIT(5),
GPU_USE_DEPTH_RANGE_HACK = FLAG_BIT(6),
// Bit 6 is free.
GPU_USE_TEXTURE_NPOT = FLAG_BIT(7),
GPU_USE_ANISOTROPY = FLAG_BIT(8),
GPU_USE_CLEAR_RAM_HACK = FLAG_BIT(9),
+1 -3
View File
@@ -172,9 +172,7 @@ void BinManager::UpdateState() {
creatingState_ = true;
stateIndex_ = (uint16_t)states_.Push(RasterizerState());
// When new funcs are compiled, we need to flush if WX exclusive.
ComputeRasterizerState(&states_[stateIndex_], [&]() {
Flush("compile");
});
ComputeRasterizerState(&states_[stateIndex_], this);
states_[stateIndex_].samplerID.cached.clut = cluts_[clutIndex_].readable;
creatingState_ = false;
+17 -7
View File
@@ -20,6 +20,7 @@
#include "Common/Data/Convert/ColorConv.h"
#include "Core/Config.h"
#include "GPU/GPUState.h"
#include "GPU/Software/BinManager.h"
#include "GPU/Software/DrawPixel.h"
#include "GPU/Software/FuncId.h"
#include "GPU/Software/Rasterizer.h"
@@ -707,8 +708,8 @@ void SOFTRAST_CALL DrawSinglePixel(int x, int y, int z, int fog, Vec4IntArg colo
SetPixelColor(fbFormat, pixelID.cached.framebufStride, x, y, new_color, old_color, targetWriteMask);
}
SingleFunc GetSingleFunc(const PixelFuncID &id, std::function<void()> flushForCompile) {
SingleFunc jitted = jitCache->GetSingle(id, flushForCompile);
SingleFunc GetSingleFunc(const PixelFuncID &id, BinManager *binner) {
SingleFunc jitted = jitCache->GetSingle(id, binner);
if (jitted) {
return jitted;
}
@@ -743,11 +744,15 @@ SingleFunc PixelJitCache::GenericSingle(const PixelFuncID &id) {
return nullptr;
}
thread_local PixelJitCache::LastCache PixelJitCache::lastSingle_;
// 256k should be plenty of space for plenty of variations.
PixelJitCache::PixelJitCache() : CodeBlock(1024 * 64 * 4), cache_(64) {
lastSingle_.gen = -1;
}
void PixelJitCache::Clear() {
clearGen_++;
CodeBlock::Clear();
cache_.Clear();
addresses_.clear();
@@ -786,26 +791,29 @@ void PixelJitCache::Flush() {
compileQueue_.clear();
}
SingleFunc PixelJitCache::GetSingle(const PixelFuncID &id, std::function<void()> flushForCompile) {
SingleFunc PixelJitCache::GetSingle(const PixelFuncID &id, BinManager *binner) {
if (!g_Config.bSoftwareRenderingJit)
return nullptr;
std::unique_lock<std::mutex> guard(jitCacheLock);
const size_t key = std::hash<PixelFuncID>()(id);
if (lastSingle_.Match(key, clearGen_))
return lastSingle_.func;
std::unique_lock<std::mutex> guard(jitCacheLock);
auto it = cache_.Get(key);
if (it != nullptr) {
lastSingle_.Set(key, it, clearGen_);
return it;
}
if (!flushForCompile) {
if (!binner) {
// Can't compile, let's try to do it later when there's an opportunity.
compileQueue_.insert(id);
return nullptr;
}
guard.unlock();
flushForCompile();
binner->Flush("compile");
guard.lock();
for (const auto &queued : compileQueue_) {
@@ -820,7 +828,9 @@ SingleFunc PixelJitCache::GetSingle(const PixelFuncID &id, std::function<void()>
if (!cache_.Get(key))
Compile(id);
return cache_.Get(key);
it = cache_.Get(key);
lastSingle_.Set(key, it, clearGen_);
return it;
}
void PixelJitCache::Compile(const PixelFuncID &id) {
+22 -3
View File
@@ -19,7 +19,6 @@
#include "ppsspp_config.h"
#include <functional>
#include <string>
#include <vector>
#include <unordered_map>
@@ -29,6 +28,8 @@
#include "GPU/Software/FuncId.h"
#include "GPU/Software/RasterizerRegCache.h"
class BinManager;
namespace Rasterizer {
// Our std::unordered_map argument will ignore the alignment attribute, but that doesn't matter.
@@ -39,7 +40,7 @@ namespace Rasterizer {
#endif
typedef void (SOFTRAST_CALL *SingleFunc)(int x, int y, int z, int fog, Vec4IntArg color_in, const PixelFuncID &pixelID);
SingleFunc GetSingleFunc(const PixelFuncID &id, std::function<void()> flushForCompile);
SingleFunc GetSingleFunc(const PixelFuncID &id, BinManager *binner);
void Init();
void FlushJit();
@@ -64,7 +65,7 @@ public:
PixelJitCache();
// Returns a pointer to the code to run.
SingleFunc GetSingle(const PixelFuncID &id, std::function<void()> flushForCompile);
SingleFunc GetSingle(const PixelFuncID &id, BinManager *binner);
SingleFunc GenericSingle(const PixelFuncID &id);
void Clear() override;
void Flush();
@@ -108,9 +109,27 @@ private:
bool Jit_ConvertFrom5551(const PixelFuncID &id, RegCache::Reg colorReg, RegCache::Reg temp1Reg, RegCache::Reg temp2Reg, bool keepAlpha);
bool Jit_ConvertFrom4444(const PixelFuncID &id, RegCache::Reg colorReg, RegCache::Reg temp1Reg, RegCache::Reg temp2Reg, bool keepAlpha);
struct LastCache {
size_t key;
SingleFunc func;
int gen = -1;
bool Match(size_t k, int g) const {
return key == k && gen == g;
}
void Set(size_t k, SingleFunc f, int g) {
key = k;
func = f;
gen = g;
}
};
DenseHashMap<size_t, SingleFunc, nullptr> cache_;
std::unordered_map<PixelFuncID, const u8 *> addresses_;
std::unordered_set<PixelFuncID> compileQueue_;
int clearGen_ = 0;
static thread_local LastCache lastSingle_;
const u8 *constBlendHalf_11_4s_ = nullptr;
const u8 *constBlendInvert_11_4s_ = nullptr;
+76 -16
View File
@@ -93,15 +93,15 @@ static inline Vec4<float> Interpolate(const float &c0, const float &c1, const fl
return Interpolate(c0, c1, c2, w0.Cast<float>(), w1.Cast<float>(), w2.Cast<float>(), wsum_recip);
}
void ComputeRasterizerState(RasterizerState *state, std::function<void()> flushForCompile) {
void ComputeRasterizerState(RasterizerState *state, BinManager *binner) {
ComputePixelFuncID(&state->pixelID);
state->drawPixel = Rasterizer::GetSingleFunc(state->pixelID, flushForCompile);
state->drawPixel = Rasterizer::GetSingleFunc(state->pixelID, binner);
state->enableTextures = gstate.isTextureMapEnabled() && !state->pixelID.clearMode;
if (state->enableTextures) {
ComputeSamplerID(&state->samplerID);
state->linear = Sampler::GetLinearFunc(state->samplerID, flushForCompile);
state->nearest = Sampler::GetNearestFunc(state->samplerID, flushForCompile);
state->linear = Sampler::GetLinearFunc(state->samplerID, binner);
state->nearest = Sampler::GetNearestFunc(state->samplerID, binner);
// Since the definitions are the same, just force this setting using the func pointer.
if (g_Config.iTexFiltering == TEX_FILTER_FORCE_LINEAR) {
@@ -224,24 +224,34 @@ static bool CheckClutAlphaFull(RasterizerState *state) {
if (samplerID.hasClutMask)
count = std::min(count, ((samplerID.cached.clutFormat >> 8) & 0xFF) + 1);
u32 alphaSum = 0xFFFFFFFF;
if (samplerID.ClutFmt() == GE_CMODE_32BIT_ABGR8888) {
CheckMask32((const uint32_t *)samplerID.cached.clut, count, &alphaSum);
} else {
CheckMask16((const uint16_t *)samplerID.cached.clut, count, &alphaSum);
}
bool onlyFull = true;
switch (samplerID.ClutFmt()) {
case GE_CMODE_16BIT_BGR5650:
break;
case GE_CMODE_16BIT_ABGR5551:
onlyFull = CheckAlpha16((const uint16_t *)samplerID.cached.clut, count, 0x8000) == CHECKALPHA_FULL;
onlyFull = (alphaSum & 0x8000) != 0;
break;
case GE_CMODE_16BIT_ABGR4444:
onlyFull = CheckAlpha16((const uint16_t *)samplerID.cached.clut, count, 0xF000) == CHECKALPHA_FULL;
onlyFull = (alphaSum & 0xF000) == 0xF000;
break;
case GE_CMODE_32BIT_ABGR8888:
onlyFull = CheckAlpha32((const uint32_t *)samplerID.cached.clut, count, 0xFF000000) == CHECKALPHA_FULL;
onlyFull = (alphaSum & 0xFF000000) == 0xFF000000;
break;
}
// Might just be different patterns, but if alphaSum != 0, it can't contain zero.
if (alphaSum != 0)
state->flags |= RasterizerStateFlags::CLUT_ALPHA_NON_ZERO;
if (!onlyFull)
state->flags |= RasterizerStateFlags::CLUT_ALPHA_NON_FULL;
state->flags |= RasterizerStateFlags::CLUT_ALPHA_CHECKED;
@@ -290,6 +300,37 @@ static RasterizerStateFlags DetectStateOptimizations(RasterizerState *state) {
}
}
if (alphaBlend && (needTextureAlpha || !alphaFull)) {
// Okay, we're blending, and we need to. Are we alpha testing?
GEComparison alphaTestFunc = pixelID.AlphaTestFunc();
if (state->flags & RasterizerStateFlags::OPTIMIZED_ALPHATEST_OFF_NE)
alphaTestFunc = GE_COMP_NOTEQUAL;
if (state->flags & RasterizerStateFlags::OPTIMIZED_ALPHATEST_OFF_GT)
alphaTestFunc = GE_COMP_GREATER;
if (state->flags & RasterizerStateFlags::OPTIMIZED_ALPHATEST_ON)
alphaTestFunc = GE_COMP_ALWAYS;
PixelBlendFactor src = pixelID.AlphaBlendSrc();
PixelBlendFactor dst = pixelID.AlphaBlendDst();
if (state->flags & RasterizerStateFlags::OPTIMIZED_BLEND_SRC)
src = PixelBlendFactor::SRCALPHA;
if (state->flags & RasterizerStateFlags::OPTIMIZED_BLEND_DST)
dst = PixelBlendFactor::INVSRCALPHA;
if (alphaTestFunc == GE_COMP_ALWAYS && src == PixelBlendFactor::SRCALPHA && dst == PixelBlendFactor::INVSRCALPHA) {
bool usesClut = (samplerID.texfmt & 4) != 0;
bool couldHaveZeroTexAlpha = true;
if (usesClut && CheckClutAlphaFull(state))
couldHaveZeroTexAlpha = false;
if (state->flags & RasterizerStateFlags::CLUT_ALPHA_NON_ZERO)
couldHaveZeroTexAlpha = false;
// Blending is expensive, since we read the target. Force alpha testing on.
if (!pixelID.depthWrite && !pixelID.stencilTest && couldHaveZeroTexAlpha)
optimize |= RasterizerStateFlags::OPTIMIZED_ALPHATEST_ON;
}
}
bool applyFog = pixelID.applyFog || (state->flags & RasterizerStateFlags::OPTIMIZED_FOG_OFF);
if (applyFog) {
bool hasFog = state->flags & RasterizerStateFlags::VERTEX_HAS_FOG;
@@ -319,10 +360,17 @@ static RasterizerStateFlags DetectStateOptimizations(RasterizerState *state) {
// > 16, 8, or similar are also very common.
if (state->flags & RasterizerStateFlags::OPTIMIZED_ALPHATEST_OFF_GT)
alphaTestFunc = GE_COMP_GREATER;
if (state->flags & RasterizerStateFlags::OPTIMIZED_ALPHATEST_ON)
alphaTestFunc = GE_COMP_ALWAYS;
bool alphaTest = (alphaTestFunc == GE_COMP_NOTEQUAL || alphaTestFunc == GE_COMP_GREATER) && pixelID.alphaTestRef < 0xFF && !state->pixelID.hasAlphaTestMask;
if (alphaTest && CheckClutAlphaFull(state))
optimize |= alphaTestFunc == GE_COMP_NOTEQUAL ? RasterizerStateFlags::OPTIMIZED_ALPHATEST_OFF_NE : RasterizerStateFlags::OPTIMIZED_ALPHATEST_OFF_GT;
if (alphaTest) {
bool canSkipAlphaTest = CheckClutAlphaFull(state);
if ((state->flags & RasterizerStateFlags::CLUT_ALPHA_NON_ZERO) && pixelID.alphaTestRef == 0)
canSkipAlphaTest = true;
if (canSkipAlphaTest)
optimize |= alphaTestFunc == GE_COMP_NOTEQUAL ? RasterizerStateFlags::OPTIMIZED_ALPHATEST_OFF_NE : RasterizerStateFlags::OPTIMIZED_ALPHATEST_OFF_GT;
}
}
}
@@ -359,6 +407,13 @@ static bool ApplyStateOptimizations(RasterizerState *state, const RasterizerStat
pixelID.alphaTestFunc = GE_COMP_NOTEQUAL;
else if (state->flags & RasterizerStateFlags::OPTIMIZED_ALPHATEST_OFF_GT)
pixelID.alphaTestFunc = GE_COMP_GREATER;
else if (optimize & RasterizerStateFlags::OPTIMIZED_ALPHATEST_ON) {
pixelID.alphaTestFunc = GE_COMP_NOTEQUAL;
pixelID.alphaTestRef = 0;
pixelID.hasAlphaTestMask = false;
} else if (state->flags & RasterizerStateFlags::OPTIMIZED_ALPHATEST_ON) {
pixelID.alphaTestFunc = GE_COMP_ALWAYS;
}
SingleFunc drawPixel = Rasterizer::GetSingleFunc(pixelID, nullptr);
// Can't compile during runtime. This failing is a bit of a problem when undoing...
@@ -1116,7 +1171,7 @@ void DrawRectangle(const VertexData &v0, const VertexData &v1, const BinCoords &
std::string ztag = StringFromFormat("DisplayListRZ_%08x", state.listPC);
#endif
for (int64_t curY = minY; curY <= maxY; curY += SCREEN_SCALE_FACTOR * 2, rowST += sty) {
for (int64_t curY = minY; curY < maxY; curY += SCREEN_SCALE_FACTOR * 2, rowST += sty) {
DrawingCoords p = TransformUnit::ScreenToDrawing(minX, curY);
int scissorY2 = curY + SCREEN_SCALE_FACTOR > maxY ? -1 : 0;
@@ -1124,7 +1179,7 @@ void DrawRectangle(const VertexData &v0, const VertexData &v1, const BinCoords &
Vec4<int> scissor_step = Vec4<int>(0, -(SCREEN_SCALE_FACTOR * 2), 0, -(SCREEN_SCALE_FACTOR * 2));
Vec2f st = rowST;
for (int64_t curX = minX; curX <= maxX; curX += SCREEN_SCALE_FACTOR * 2,
for (int64_t curX = minX; curX < maxX; curX += SCREEN_SCALE_FACTOR * 2,
st += stx,
scissor_mask += scissor_step,
p.x = (p.x + 2) & 0x3FF) {
@@ -1292,7 +1347,8 @@ void ClearRectangle(const VertexData &v0, const VertexData &v1, const BinCoords
minY += SCREEN_SCALE_FACTOR;
const DrawingCoords pprime = TransformUnit::ScreenToDrawing(minX, minY);
const DrawingCoords pend = TransformUnit::ScreenToDrawing(maxX, maxY);
// Only include the end pixel when it's >= 0.5.
const DrawingCoords pend = TransformUnit::ScreenToDrawing(maxX - SCREEN_SCALE_FACTOR / 2, maxY - SCREEN_SCALE_FACTOR / 2);
auto &pixelID = state.pixelID;
auto &samplerID = state.samplerID;
@@ -1641,10 +1697,14 @@ bool GetCurrentTexture(GPUDebugBuffer &buffer, int level)
ComputeSamplerID(&id);
id.cached.clut = clut;
Sampler::FetchFunc sampler = Sampler::GetFetchFunc(id, [] {
if (gpuDebug)
gpuDebug->DispatchFlush();
});
// Slight annoyance, we may have to force a compile.
Sampler::FetchFunc sampler = Sampler::GetFetchFunc(id, nullptr);
if (!sampler) {
Sampler::FlushJit();
sampler = Sampler::GetFetchFunc(id, nullptr);
if (!sampler)
return false;
}
u8 *texptr = Memory::GetPointerWrite(texaddr);
u32 *row = (u32 *)buffer.GetData();
+5 -2
View File
@@ -30,6 +30,7 @@
struct GPUDebugBuffer;
struct BinCoords;
class BinManager;
namespace Rasterizer {
@@ -42,6 +43,7 @@ enum class RasterizerStateFlags {
CLUT_ALPHA_CHECKED = 0x0010,
CLUT_ALPHA_NON_FULL = 0x0020,
CLUT_ALPHA_NON_ZERO = 0x0040,
VERTEX_FLAT_RESET = VERTEX_NON_FULL_WHITE | VERTEX_ALPHA_NON_FULL | VERTEX_ALPHA_NON_ZERO | VERTEX_HAS_FOG,
@@ -53,9 +55,10 @@ enum class RasterizerStateFlags {
OPTIMIZED_FOG_OFF = 0x0020'0000,
OPTIMIZED_ALPHATEST_OFF_NE = 0x0040'0000,
OPTIMIZED_ALPHATEST_OFF_GT = 0x0080'0000,
OPTIMIZED_ALPHATEST_ON = 0x0100'0000,
// Anything that changes the actual pixel or sampler func.
OPTIMIZED_PIXELID = OPTIMIZED_BLEND_SRC | OPTIMIZED_BLEND_DST | OPTIMIZED_BLEND_OFF | OPTIMIZED_FOG_OFF | RasterizerStateFlags::OPTIMIZED_ALPHATEST_OFF_NE | RasterizerStateFlags::OPTIMIZED_ALPHATEST_OFF_GT,
OPTIMIZED_PIXELID = OPTIMIZED_BLEND_SRC | OPTIMIZED_BLEND_DST | OPTIMIZED_BLEND_OFF | OPTIMIZED_FOG_OFF | OPTIMIZED_ALPHATEST_OFF_NE | OPTIMIZED_ALPHATEST_OFF_GT | OPTIMIZED_ALPHATEST_ON,
OPTIMIZED_SAMPLERID = OPTIMIZED_TEXREPLACE,
INVALID = 0x7FFFFFFF,
@@ -98,7 +101,7 @@ struct RasterizerState {
}
};
void ComputeRasterizerState(RasterizerState *state, std::function<void()> flushForCompile);
void ComputeRasterizerState(RasterizerState *state, BinManager *binner);
void CalculateRasterStateFlags(RasterizerState *state, const VertexData &v0);
void CalculateRasterStateFlags(RasterizerState *state, const VertexData &v0, const VertexData &v1, bool forceFlat);
void CalculateRasterStateFlags(RasterizerState *state, const VertexData &v0, const VertexData &v1, const VertexData &v2);
+233 -81
View File
@@ -72,17 +72,59 @@ static uint32_t StandardAlphaBlend(uint32_t source, uint32_t dst) {
}
// Through mode, with the specific Darkstalker settings.
inline void DrawSinglePixel5551(u16 *pixel, const u32 color_in) {
template <GEBufferFormat fmt, bool alphaBlend>
static inline void DrawSinglePixel(u16 *pixel, const u32 color_in) {
u32 new_color;
// Because of this check, we only support src.a / 1-src.a blending.
if ((color_in >> 24) == 255) {
// We take advantage of short circuiting by checking the constant (template) value first.
if (!alphaBlend || (color_in >> 24) == 255) {
new_color = color_in & 0xFFFFFF;
} else {
const u32 old_color = RGBA5551ToRGBA8888(*pixel);
u32 old_color;
switch (fmt) {
case GE_FORMAT_565:
old_color = RGB565ToRGBA8888(*pixel);
break;
case GE_FORMAT_5551:
old_color = RGBA5551ToRGBA8888(*pixel);
break;
case GE_FORMAT_4444:
old_color = RGBA4444ToRGBA8888(*pixel);
break;
default:
break;
}
new_color = StandardAlphaBlend(color_in, old_color);
}
new_color |= (*pixel & 0x8000) ? 0xff000000 : 0x00000000;
*pixel = RGBA8888ToRGBA5551(new_color);
switch (fmt) {
case GE_FORMAT_565:
*pixel = RGBA8888ToRGB565(new_color);
break;
case GE_FORMAT_5551:
*pixel = RGBA8888ToRGBA555X(new_color) | (*pixel & 0x8000);
break;
case GE_FORMAT_4444:
*pixel = RGBA8888ToRGBA444X(new_color) | (*pixel & 0xF000);
break;
default:
break;
}
}
template <bool alphaBlend>
static inline void DrawSinglePixel32(u32 *pixel, const u32 color_in) {
u32 new_color;
// Because of this check, we only support src.a / 1-src.a blending.
if ((color_in >> 24) == 255 || !alphaBlend) {
new_color = color_in & 0xFFFFFF;
} else {
const u32 old_color = *pixel;
new_color = StandardAlphaBlend(color_in, old_color);
}
new_color |= *pixel & 0xFF000000;
*pixel = new_color;
}
// Check if we can safely ignore the alpha test, assuming standard alpha blending.
@@ -108,18 +150,18 @@ static inline bool AlphaTestIsNeedless(const PixelFuncID &pixelID) {
return false;
}
bool UseDrawSinglePixel5551(const PixelFuncID &pixelID) {
static bool UseDrawSinglePixel(const PixelFuncID &pixelID) {
if (pixelID.clearMode || pixelID.colorTest || pixelID.stencilTest)
return false;
if (!AlphaTestIsNeedless(pixelID) || pixelID.DepthTestFunc() != GE_COMP_ALWAYS)
return false;
if (pixelID.FBFormat() != GE_FORMAT_5551 || !pixelID.alphaBlend)
return false;
// We skip blending when alpha = FF, so we can't allow other blend modes.
if (pixelID.AlphaBlendEq() != GE_BLENDMODE_MUL_AND_ADD || pixelID.AlphaBlendSrc() != PixelBlendFactor::SRCALPHA)
return false;
if (pixelID.AlphaBlendDst() != PixelBlendFactor::INVSRCALPHA)
return false;
if (pixelID.alphaBlend) {
if (pixelID.AlphaBlendEq() != GE_BLENDMODE_MUL_AND_ADD || pixelID.AlphaBlendSrc() != PixelBlendFactor::SRCALPHA)
return false;
if (pixelID.AlphaBlendDst() != PixelBlendFactor::INVSRCALPHA)
return false;
}
if (pixelID.dithering || pixelID.applyLogicOp || pixelID.applyColorWriteMask)
return false;
@@ -156,6 +198,111 @@ static inline Vec4IntResult SOFTRAST_CALL ModulateRGBA(Vec4IntArg prim_in, Vec4I
return ToVec4IntResult(out);
}
template <GEBufferFormat fmt, bool isWhite, bool alphaBlend>
static void DrawSpriteTex(const DrawingCoords &pos0, const DrawingCoords &pos1, int s_start, int t_start, int ds, int dt, u32 color0, const RasterizerState &state, Sampler::FetchFunc fetchFunc) {
const u8 *texptr = state.texptr[0];
uint16_t texbufw = state.texbufw[0];
int t = t_start;
const Vec4<int> c0 = Vec4<int>::FromRGBA(color0);
for (int y = pos0.y; y < pos1.y; y++) {
int s = s_start;
u16 *pixel16 = fb.Get16Ptr(pos0.x, y, state.pixelID.cached.framebufStride);
u32 *pixel32 = fb.Get32Ptr(pos0.x, y, state.pixelID.cached.framebufStride);
for (int x = pos0.x; x < pos1.x; x++) {
Vec4<int> tex_color = fetchFunc(s, t, texptr, texbufw, 0, state.samplerID);
if (isWhite) {
if (!alphaBlend || tex_color.a() != 0) {
u32 tex_color32 = tex_color.ToRGBA();
if (fmt == GE_FORMAT_8888)
DrawSinglePixel32<alphaBlend>(pixel32, tex_color32);
else
DrawSinglePixel<fmt, alphaBlend>(pixel16, tex_color32);
}
} else {
Vec4<int> prim_color = c0;
prim_color = Vec4<int>(ModulateRGBA(ToVec4IntArg(prim_color), ToVec4IntArg(tex_color), state.samplerID));
if (!alphaBlend || prim_color.a() > 0) {
if (fmt == GE_FORMAT_8888)
DrawSinglePixel32<alphaBlend>(pixel32, prim_color.ToRGBA());
else
DrawSinglePixel<fmt, alphaBlend>(pixel16, prim_color.ToRGBA());
}
}
s += ds;
if (fmt == GE_FORMAT_8888)
pixel32++;
else
pixel16++;
}
t += dt;
}
}
template <bool isWhite, bool alphaBlend>
static void DrawSpriteTex(const DrawingCoords &pos0, const DrawingCoords &pos1, int s_start, int t_start, int ds, int dt, u32 color0, const RasterizerState &state, Sampler::FetchFunc fetchFunc) {
switch (state.pixelID.FBFormat()) {
case GE_FORMAT_565:
DrawSpriteTex<GE_FORMAT_565, isWhite, alphaBlend>(pos0, pos1, s_start, t_start, ds, dt, color0, state, fetchFunc);
break;
case GE_FORMAT_5551:
DrawSpriteTex<GE_FORMAT_5551, isWhite, alphaBlend>(pos0, pos1, s_start, t_start, ds, dt, color0, state, fetchFunc);
break;
case GE_FORMAT_4444:
DrawSpriteTex<GE_FORMAT_4444, isWhite, alphaBlend>(pos0, pos1, s_start, t_start, ds, dt, color0, state, fetchFunc);
break;
case GE_FORMAT_8888:
DrawSpriteTex<GE_FORMAT_8888, isWhite, alphaBlend>(pos0, pos1, s_start, t_start, ds, dt, color0, state, fetchFunc);
break;
default:
// Invalid, don't draw anything...
break;
}
}
template <GEBufferFormat fmt, bool alphaBlend>
static void DrawSpriteNoTex(const DrawingCoords &pos0, const DrawingCoords &pos1, u32 color0, const RasterizerState &state) {
if (alphaBlend && Vec4<int>::FromRGBA(color0).a() == 0)
return;
for (int y = pos0.y; y < pos1.y; y++) {
if (fmt == GE_FORMAT_8888) {
u32 *pixel = fb.Get32Ptr(pos0.x, y, state.pixelID.cached.framebufStride);
for (int x = pos0.x; x < pos1.x; x++) {
DrawSinglePixel32<alphaBlend>(pixel, color0);
pixel++;
}
} else {
u16 *pixel = fb.Get16Ptr(pos0.x, y, state.pixelID.cached.framebufStride);
for (int x = pos0.x; x < pos1.x; x++) {
DrawSinglePixel<fmt, alphaBlend>(pixel, color0);
pixel++;
}
}
}
}
template <bool alphaBlend>
static void DrawSpriteNoTex(const DrawingCoords &pos0, const DrawingCoords &pos1, u32 color0, const RasterizerState &state) {
switch (state.pixelID.FBFormat()) {
case GE_FORMAT_565:
DrawSpriteNoTex<GE_FORMAT_565, alphaBlend>(pos0, pos1, color0, state);
break;
case GE_FORMAT_5551:
DrawSpriteNoTex<GE_FORMAT_5551, alphaBlend>(pos0, pos1, color0, state);
break;
case GE_FORMAT_4444:
DrawSpriteNoTex<GE_FORMAT_4444, alphaBlend>(pos0, pos1, color0, state);
break;
case GE_FORMAT_8888:
DrawSpriteNoTex<GE_FORMAT_8888, alphaBlend>(pos0, pos1, color0, state);
break;
default:
// Invalid, don't draw anything...
break;
}
}
void DrawSprite(const VertexData &v0, const VertexData &v1, const BinCoords &range, const RasterizerState &state) {
const u8 *texptr = state.texptr[0];
@@ -211,40 +358,17 @@ void DrawSprite(const VertexData &v0, const VertexData &v1, const BinCoords &ran
pos0.y = scissorTL.y;
}
if (UseDrawSinglePixel5551(pixelID) && samplerID.TexFunc() == GE_TEXFUNC_MODULATE && samplerID.useTextureAlpha) {
if (isWhite) {
int t = t_start;
for (int y = pos0.y; y < pos1.y; y++) {
int s = s_start;
u16 *pixel = fb.Get16Ptr(pos0.x, y, pixelID.cached.framebufStride);
for (int x = pos0.x; x < pos1.x; x++) {
u32 tex_color = Vec4<int>(fetchFunc(s, t, texptr, texbufw, 0, state.samplerID)).ToRGBA();
if (tex_color & 0xFF000000) {
DrawSinglePixel5551(pixel, tex_color);
}
s += ds;
pixel++;
}
t += dt;
}
if (UseDrawSinglePixel(pixelID) && (samplerID.TexFunc() == GE_TEXFUNC_MODULATE || samplerID.TexFunc() == GE_TEXFUNC_REPLACE) && samplerID.useTextureAlpha) {
if (isWhite || samplerID.TexFunc() == GE_TEXFUNC_REPLACE) {
if (pixelID.alphaBlend)
DrawSpriteTex<true, true>(pos0, pos1, s_start, t_start, ds, dt, v1.color0, state, fetchFunc);
else
DrawSpriteTex<true, false>(pos0, pos1, s_start, t_start, ds, dt, v1.color0, state, fetchFunc);
} else {
int t = t_start;
const Vec4<int> c0 = Vec4<int>::FromRGBA(v1.color0);
for (int y = pos0.y; y < pos1.y; y++) {
int s = s_start;
u16 *pixel = fb.Get16Ptr(pos0.x, y, pixelID.cached.framebufStride);
for (int x = pos0.x; x < pos1.x; x++) {
Vec4<int> prim_color = c0;
Vec4<int> tex_color = fetchFunc(s, t, texptr, texbufw, 0, state.samplerID);
prim_color = Vec4<int>(ModulateRGBA(ToVec4IntArg(prim_color), ToVec4IntArg(tex_color), state.samplerID));
if (prim_color.a() > 0) {
DrawSinglePixel5551(pixel, prim_color.ToRGBA());
}
s += ds;
pixel++;
}
t += dt;
}
if (pixelID.alphaBlend)
DrawSpriteTex<false, true>(pos0, pos1, s_start, t_start, ds, dt, v1.color0, state, fetchFunc);
else
DrawSpriteTex<false, false>(pos0, pos1, s_start, t_start, ds, dt, v1.color0, state, fetchFunc);
}
} else {
float dsf = ds * (1.0f / (float)(1 << state.samplerID.width0Shift));
@@ -286,17 +410,11 @@ void DrawSprite(const VertexData &v0, const VertexData &v1, const BinCoords &ran
if (pos1.y > scissorBR.y) pos1.y = scissorBR.y + 1;
if (pos0.x < scissorTL.x) pos0.x = scissorTL.x;
if (pos0.y < scissorTL.y) pos0.y = scissorTL.y;
if (UseDrawSinglePixel5551(pixelID)) {
if (Vec4<int>::FromRGBA(v1.color0).a() == 0)
return;
for (int y = pos0.y; y < pos1.y; y++) {
u16 *pixel = fb.Get16Ptr(pos0.x, y, pixelID.cached.framebufStride);
for (int x = pos0.x; x < pos1.x; x++) {
DrawSinglePixel5551(pixel, v1.color0);
pixel++;
}
}
if (UseDrawSinglePixel(pixelID)) {
if (pixelID.alphaBlend)
DrawSpriteNoTex<true>(pos0, pos1, v1.color0, state);
else
DrawSpriteNoTex<false>(pos0, pos1, v1.color0, state);
} else if (pixelID.earlyZChecks) {
const Vec4<int> prim_color = Vec4<int>::FromRGBA(v1.color0);
for (int y = pos0.y; y < pos1.y; y++) {
@@ -319,12 +437,14 @@ void DrawSprite(const VertexData &v0, const VertexData &v1, const BinCoords &ran
#if defined(SOFTGPU_MEMORY_TAGGING_BASIC) || defined(SOFTGPU_MEMORY_TAGGING_DETAILED)
uint32_t bpp = pixelID.FBFormat() == GE_FORMAT_8888 ? 4 : 2;
std::string tag = StringFromFormat("DisplayListR_%08x", state.listPC);
std::string ztag = StringFromFormat("DisplayListRZ_%08x", state.listPC);
char tag[64]{};
// char ztag[64]{};
int tagLen = snprintf(tag, sizeof(tag), "DisplayListR_%08x", state.listPC);
// int ztagLen = snprintf(ztag, sizeof(ztag), "DisplayListRZ_%08x", state.listPC);
for (int y = pos0.y; y < pos1.y; y++) {
uint32_t row = gstate.getFrameBufAddress() + y * pixelID.cached.framebufStride * bpp;
NotifyMemInfo(MemBlockFlags::WRITE, row + pos0.x * bpp, (pos1.x - pos0.x) * bpp, tag.c_str(), tag.size());
NotifyMemInfo(MemBlockFlags::WRITE, row + pos0.x * bpp, (pos1.x - pos0.x) * bpp, tag, tagLen);
}
#endif
}
@@ -344,24 +464,6 @@ bool RectangleFastPath(const VertexData &v0, const VertexData &v1, BinManager &b
const RasterizerState &state = binner.State();
g_DarkStalkerStretch = DSStretch::Off;
// Check for 1:1 texture mapping. In that case we can call DrawSprite.
int xdiff = v1.screenpos.x - v0.screenpos.x;
int ydiff = v1.screenpos.y - v0.screenpos.y;
int udiff = (v1.texturecoords.x - v0.texturecoords.x) * (float)SCREEN_SCALE_FACTOR;
int vdiff = (v1.texturecoords.y - v0.texturecoords.y) * (float)SCREEN_SCALE_FACTOR;
bool coord_check =
(xdiff == udiff || xdiff == -udiff) &&
(ydiff == vdiff || ydiff == -vdiff);
// Currently only works for TL/BR, which is the most common but not required.
bool orient_check = xdiff >= 0 && ydiff >= 0;
// We already have a fast path for clear in ClearRectangle.
bool state_check = state.throughMode && !state.pixelID.clearMode && !state.samplerID.hasAnyMips && NoClampOrWrap(state, v0.texturecoords.uv()) && NoClampOrWrap(state, v1.texturecoords.uv());
// This doesn't work well with offset drawing, see #15876. Through never has a subpixel offset.
bool subpixel_check = ((v0.screenpos.x | v0.screenpos.y | v1.screenpos.x | v1.screenpos.y) & 0xF) == 0;
if ((coord_check || !state.enableTextures) && orient_check && state_check && subpixel_check) {
binner.AddSprite(v0, v1);
return true;
}
// Eliminate the stretch blit in DarkStalkers.
// We compensate for that when blitting the framebuffer in SoftGpu.cpp.
@@ -389,9 +491,44 @@ bool RectangleFastPath(const VertexData &v0, const VertexData &v1, BinManager &b
g_needsClearAfterDialog = true;
}
}
// Check for 1:1 texture mapping. In that case we can call DrawSprite.
int xdiff = v1.screenpos.x - v0.screenpos.x;
int ydiff = v1.screenpos.y - v0.screenpos.y;
int udiff = (v1.texturecoords.x - v0.texturecoords.x) * (float)SCREEN_SCALE_FACTOR;
int vdiff = (v1.texturecoords.y - v0.texturecoords.y) * (float)SCREEN_SCALE_FACTOR;
// Currently only works for TL/BR, which is the most common but not required.
bool orient_check = xdiff >= 0 && ydiff >= 0;
// We already have a fast path for clear in ClearRectangle.
bool state_check = state.throughMode && !state.pixelID.clearMode && !state.samplerID.hasAnyMips && !state.textureProj;
bool coord_check = true;
if (state.enableTextures) {
state_check = state_check && NoClampOrWrap(state, v0.texturecoords.uv()) && NoClampOrWrap(state, v1.texturecoords.uv());
coord_check = (xdiff == udiff || xdiff == -udiff) && (ydiff == vdiff || ydiff == -vdiff);
}
// This doesn't work well with offset drawing, see #15876. Through never has a subpixel offset.
bool subpixel_check = ((v0.screenpos.x | v0.screenpos.y | v1.screenpos.x | v1.screenpos.y) & 0xF) == 0;
if (coord_check && orient_check && state_check && subpixel_check) {
binner.AddSprite(v0, v1);
return true;
}
return false;
}
static bool IsCoordRectangleCompatible(const RasterizerState &state, const ClipVertexData &data) {
if (!state.throughMode) {
// See AreCoordsRectangleCompatible() for most of these, this just checks the main vert.
if (data.OutsideRange())
return false;
if (data.clippos.w < 0.0f)
return false;
if (data.clippos.z < -data.clippos.w)
return false;
}
return true;
}
static bool AreCoordsRectangleCompatible(const RasterizerState &state, const ClipVertexData &data0, const ClipVertexData &data1) {
if (data1.v.color0 != data0.v.color0)
return false;
@@ -404,7 +541,7 @@ static bool AreCoordsRectangleCompatible(const RasterizerState &state, const Cli
if (data1.v.color1 != data0.v.color1)
return false;
// This means it should be culled, outside range.
if (data1.OutsideRange() || data0.OutsideRange())
if (data1.OutsideRange())
return false;
// Do we have to think about perspective correction or slope mip level?
if (state.enableTextures && data1.clippos.w != data0.clippos.w) {
@@ -413,6 +550,12 @@ static bool AreCoordsRectangleCompatible(const RasterizerState &state, const Cli
if (data1.clippos.w - halftexel > data0.clippos.w || data1.clippos.w + halftexel < data0.clippos.w)
return false;
}
// We might need to cull this if all verts have negative w, which doesn't seem to happen for rectangles.
if (data1.clippos.w < 0.0f)
return false;
// And we also may need to clip, even if flat.
if (data1.clippos.z < -data1.clippos.w)
return false;
// If we're projecting textures, only allow an exact match for simplicity.
if (state.enableTextures && data1.v.texturecoords.q() != data0.v.texturecoords.q())
return false;
@@ -427,10 +570,13 @@ static bool AreCoordsRectangleCompatible(const RasterizerState &state, const Cli
}
bool DetectRectangleFromStrip(const RasterizerState &state, const ClipVertexData data[4], int *tlIndex, int *brIndex) {
if (!IsCoordRectangleCompatible(state, data[0]))
return false;
// Color and Z must be flat. Also find the TL and BR meanwhile.
int tl = 0, br = 0;
for (int i = 1; i < 4; ++i) {
if (!AreCoordsRectangleCompatible(state, data[i], data[0]))
if (!AreCoordsRectangleCompatible(state, data[0], data[i]))
return false;
if (data[i].v.screenpos.x <= data[tl].v.screenpos.x && data[i].v.screenpos.y <= data[tl].v.screenpos.y)
@@ -483,10 +629,13 @@ bool DetectRectangleFromStrip(const RasterizerState &state, const ClipVertexData
}
bool DetectRectangleFromFan(const RasterizerState &state, const ClipVertexData *data, int *tlIndex, int *brIndex) {
if (!IsCoordRectangleCompatible(state, data[0]))
return false;
// Color and Z must be flat.
int tl = 0, br = 0;
for (int i = 1; i < 4; ++i) {
if (!AreCoordsRectangleCompatible(state, data[i], data[0]))
if (!AreCoordsRectangleCompatible(state, data[0], data[i]))
return false;
if (data[i].v.screenpos.x <= data[tl].v.screenpos.x && data[i].v.screenpos.y <= data[tl].v.screenpos.y)
@@ -534,10 +683,13 @@ bool DetectRectangleFromFan(const RasterizerState &state, const ClipVertexData *
}
bool DetectRectangleFromPair(const RasterizerState &state, const ClipVertexData data[6], int *tlIndex, int *brIndex) {
if (!IsCoordRectangleCompatible(state, data[0]))
return false;
// Color and Z must be flat. Also find the TL and BR meanwhile.
int tl = 0, br = 0;
for (int i = 1; i < 6; ++i) {
if (!AreCoordsRectangleCompatible(state, data[i], data[0]))
if (!AreCoordsRectangleCompatible(state, data[0], data[i]))
return false;
if (data[i].v.screenpos.x <= data[tl].v.screenpos.x && data[i].v.screenpos.y <= data[tl].v.screenpos.y)
+51 -20
View File
@@ -25,6 +25,7 @@
#include "Core/Reporting.h"
#include "GPU/Common/TextureDecoder.h"
#include "GPU/GPUState.h"
#include "GPU/Software/BinManager.h"
#include "GPU/Software/Rasterizer.h"
#include "GPU/Software/RasterizerRegCache.h"
#include "GPU/Software/Sampler.h"
@@ -67,9 +68,9 @@ bool DescribeCodePtr(const u8 *ptr, std::string &name) {
return true;
}
NearestFunc GetNearestFunc(SamplerID id, std::function<void()> flushForCompile) {
NearestFunc GetNearestFunc(SamplerID id, BinManager *binner) {
id.linear = false;
NearestFunc jitted = jitCache->GetNearest(id, flushForCompile);
NearestFunc jitted = jitCache->GetNearest(id, binner);
if (jitted) {
return jitted;
}
@@ -77,9 +78,9 @@ NearestFunc GetNearestFunc(SamplerID id, std::function<void()> flushForCompile)
return &SampleNearest;
}
LinearFunc GetLinearFunc(SamplerID id, std::function<void()> flushForCompile) {
LinearFunc GetLinearFunc(SamplerID id, BinManager *binner) {
id.linear = true;
LinearFunc jitted = jitCache->GetLinear(id, flushForCompile);
LinearFunc jitted = jitCache->GetLinear(id, binner);
if (jitted) {
return jitted;
}
@@ -87,9 +88,9 @@ LinearFunc GetLinearFunc(SamplerID id, std::function<void()> flushForCompile) {
return &SampleLinear;
}
FetchFunc GetFetchFunc(SamplerID id, std::function<void()> flushForCompile) {
FetchFunc GetFetchFunc(SamplerID id, BinManager *binner) {
id.fetch = true;
FetchFunc jitted = jitCache->GetFetch(id, flushForCompile);
FetchFunc jitted = jitCache->GetFetch(id, binner);
if (jitted) {
return jitted;
}
@@ -97,11 +98,19 @@ FetchFunc GetFetchFunc(SamplerID id, std::function<void()> flushForCompile) {
return &SampleFetch;
}
thread_local SamplerJitCache::LastCache SamplerJitCache::lastFetch_;
thread_local SamplerJitCache::LastCache SamplerJitCache::lastNearest_;
thread_local SamplerJitCache::LastCache SamplerJitCache::lastLinear_;
// 256k should be enough.
SamplerJitCache::SamplerJitCache() : Rasterizer::CodeBlock(1024 * 64 * 4), cache_(64) {
lastFetch_.gen = -1;
lastNearest_.gen = -1;
lastLinear_.gen = -1;
}
void SamplerJitCache::Clear() {
clearGen_++;
CodeBlock::Clear();
cache_.Clear();
addresses_.clear();
@@ -153,25 +162,20 @@ void SamplerJitCache::Flush() {
compileQueue_.clear();
}
NearestFunc SamplerJitCache::GetByID(const SamplerID &id, std::function<void()> flushForCompile) {
if (!g_Config.bSoftwareRenderingJit)
return nullptr;
NearestFunc SamplerJitCache::GetByID(const SamplerID &id, size_t key, BinManager *binner) {
std::unique_lock<std::mutex> guard(jitCacheLock);
const size_t key = std::hash<SamplerID>()(id);
auto it = cache_.Get(key);
if (it != nullptr)
return it;
if (!flushForCompile) {
if (!binner) {
// Can't compile, let's try to do it later when there's an opportunity.
compileQueue_.insert(id);
return nullptr;
}
guard.unlock();
flushForCompile();
binner->Flush("compile");
guard.lock();
for (const auto &queued : compileQueue_) {
@@ -189,16 +193,43 @@ NearestFunc SamplerJitCache::GetByID(const SamplerID &id, std::function<void()>
return cache_.Get(key);
}
NearestFunc SamplerJitCache::GetNearest(const SamplerID &id, std::function<void()> flushForCompile) {
return (NearestFunc)GetByID(id, flushForCompile);
NearestFunc SamplerJitCache::GetNearest(const SamplerID &id, BinManager *binner) {
if (!g_Config.bSoftwareRenderingJit)
return nullptr;
const size_t key = std::hash<SamplerID>()(id);
if (lastNearest_.Match(key, clearGen_))
return (NearestFunc)lastNearest_.func;
auto func = GetByID(id, key, binner);
lastNearest_.Set(key, func, clearGen_);
return (NearestFunc)func;
}
LinearFunc SamplerJitCache::GetLinear(const SamplerID &id, std::function<void()> flushForCompile) {
return (LinearFunc)GetByID(id, flushForCompile);
LinearFunc SamplerJitCache::GetLinear(const SamplerID &id, BinManager *binner) {
if (!g_Config.bSoftwareRenderingJit)
return nullptr;
const size_t key = std::hash<SamplerID>()(id);
if (lastLinear_.Match(key, clearGen_))
return (LinearFunc)lastLinear_.func;
auto func = GetByID(id, key, binner);
lastLinear_.Set(key, func, clearGen_);
return (LinearFunc)func;
}
FetchFunc SamplerJitCache::GetFetch(const SamplerID &id, std::function<void()> flushForCompile) {
return (FetchFunc)GetByID(id, flushForCompile);
FetchFunc SamplerJitCache::GetFetch(const SamplerID &id, BinManager *binner) {
if (!g_Config.bSoftwareRenderingJit)
return nullptr;
const size_t key = std::hash<SamplerID>()(id);
if (lastFetch_.Match(key, clearGen_))
return (FetchFunc)lastFetch_.func;
auto func = GetByID(id, key, binner);
lastFetch_.Set(key, func, clearGen_);
return (FetchFunc)func;
}
void SamplerJitCache::Compile(const SamplerID &id) {
+29 -8
View File
@@ -19,7 +19,6 @@
#include "ppsspp_config.h"
#include <functional>
#include <unordered_map>
#include <unordered_set>
#include "Common/Data/Collections/Hashmaps.h"
@@ -27,6 +26,8 @@
#include "GPU/Software/FuncId.h"
#include "GPU/Software/RasterizerRegCache.h"
class BinManager;
namespace Sampler {
// Our std::unordered_map argument will ignore the alignment attribute, but that doesn't matter.
@@ -37,13 +38,13 @@ namespace Sampler {
#endif
typedef Rasterizer::Vec4IntResult(SOFTRAST_CALL *FetchFunc)(int u, int v, const u8 *tptr, int bufw, int level, const SamplerID &samplerID);
FetchFunc GetFetchFunc(SamplerID id, std::function<void()> flushForCompile);
FetchFunc GetFetchFunc(SamplerID id, BinManager *binner);
typedef Rasterizer::Vec4IntResult (SOFTRAST_CALL *NearestFunc)(float s, float t, Rasterizer::Vec4IntArg prim_color, const u8 *const *tptr, const uint16_t *bufw, int level, int levelFrac, const SamplerID &samplerID);
NearestFunc GetNearestFunc(SamplerID id, std::function<void()> flushForCompile);
NearestFunc GetNearestFunc(SamplerID id, BinManager *binner);
typedef Rasterizer::Vec4IntResult (SOFTRAST_CALL *LinearFunc)(float s, float t, Rasterizer::Vec4IntArg prim_color, const u8 *const *tptr, const uint16_t *bufw, int level, int levelFrac, const SamplerID &samplerID);
LinearFunc GetLinearFunc(SamplerID id, std::function<void()> flushForCompile);
LinearFunc GetLinearFunc(SamplerID id, BinManager *binner);
void Init();
void FlushJit();
@@ -56,9 +57,9 @@ public:
SamplerJitCache();
// Returns a pointer to the code to run.
NearestFunc GetNearest(const SamplerID &id, std::function<void()> flushForCompile);
LinearFunc GetLinear(const SamplerID &id, std::function<void()> flushForCompile);
FetchFunc GetFetch(const SamplerID &id, std::function<void()> flushForCompile);
NearestFunc GetNearest(const SamplerID &id, BinManager *binner);
LinearFunc GetLinear(const SamplerID &id, BinManager *binner);
FetchFunc GetFetch(const SamplerID &id, BinManager *binner);
void Clear() override;
void Flush();
@@ -66,7 +67,7 @@ public:
private:
void Compile(const SamplerID &id);
NearestFunc GetByID(const SamplerID &id, std::function<void()> flushForCompile);
NearestFunc GetByID(const SamplerID &id, size_t key, BinManager *binner);
FetchFunc CompileFetch(const SamplerID &id);
NearestFunc CompileNearest(const SamplerID &id);
LinearFunc CompileLinear(const SamplerID &id);
@@ -127,9 +128,29 @@ private:
const u8 *const5551Swizzle_ = nullptr;
const u8 *const5650Swizzle_ = nullptr;
struct LastCache {
size_t key;
NearestFunc func;
int gen = -1;
bool Match(size_t k, int g) const {
return key == k && gen == g;
}
void Set(size_t k, NearestFunc f, int g) {
key = k;
func = f;
gen = g;
}
};
DenseHashMap<size_t, NearestFunc, nullptr> cache_;
std::unordered_map<SamplerID, const u8 *> addresses_;
std::unordered_set<SamplerID> compileQueue_;
int clearGen_ = 0;
static thread_local LastCache lastFetch_;
static thread_local LastCache lastNearest_;
static thread_local LastCache lastLinear_;
};
#if defined(__clang__) || defined(__GNUC__)
+3 -4
View File
@@ -569,10 +569,9 @@ void TransformUnit::SubmitPrimitive(const void* vertices, const void* indices, G
// Some games send rectangles as a series of regular triangles.
// We look for this, but only in throughmode.
ClipVertexData buf[6];
int buf_index = data_index_;
for (int i = 0; i < data_index_; ++i) {
buf[i] = data_[i];
}
// Could start at data_index_ and copy to buf, but there's little reason.
int buf_index = 0;
_assert_(data_index_ == 0);
for (int vtx = 0; vtx < vertex_count; ++vtx) {
buf[buf_index++] = vreader.Read(vtx);
+150 -12
View File
@@ -23,6 +23,7 @@
#include "Common/Render/DrawBuffer.h"
#include "Common/UI/Context.h"
#include "Common/UI/View.h"
#include "Common/UI/UIScreen.h"
#include "Common/Math/math_util.h"
#include "Common/System/Display.h"
#include "Common/System/NativeApp.h"
@@ -37,14 +38,14 @@
#include "Core/System.h"
#include "GPU/Common/FramebufferManagerCommon.h"
#include "GPU/Common/PresentationCommon.h"
#include "GPU/Common/PostShader.h"
static const int leftColumnWidth = 200;
static const float orgRatio = 1.764706f; // 480.0 / 272.0
enum Mode {
MODE_MOVE,
MODE_RESIZE,
MODE_INACTIVE = 0,
MODE_MOVE = 1,
MODE_RESIZE = 2,
};
static Bounds FRectToBounds(FRect rc) {
@@ -149,6 +150,7 @@ void DisplayLayoutScreen::dialogFinished(const Screen *dialog, DialogResult resu
}
UI::EventReturn DisplayLayoutScreen::OnPostProcShaderChange(UI::EventParams &e) {
// Remove the virtual "Off" entry. TODO: Get rid of it generally.
g_Config.vPostShaderNames.erase(std::remove(g_Config.vPostShaderNames.begin(), g_Config.vPostShaderNames.end(), "Off"), g_Config.vPostShaderNames.end());
NativeMessageReceived("gpu_configChanged", "");
@@ -162,7 +164,13 @@ UI::EventReturn DisplayLayoutScreen::OnPostProcShaderChange(UI::EventParams &e)
}
static std::string PostShaderTranslateName(const char *value) {
auto gr = GetI18NCategory("Graphics");
auto ps = GetI18NCategory("PostShaders");
if (!strcmp(value, "Off")) {
// Off is a legacy fake item (gonna migrate off it later).
return gr->T("Add postprocessing shader");
}
const ShaderInfo *info = GetPostShaderInfo(value);
if (info) {
return ps->T(value, info ? info->name.c_str() : value);
@@ -195,14 +203,16 @@ void DisplayLayoutScreen::CreateViews() {
// impossible.
root_->SetExclusiveTouch(true);
ScrollView *leftScrollView = new ScrollView(ORIENT_VERTICAL, new AnchorLayoutParams(300.0f, FILL_PARENT, 10.f, 10.f, NONE, 10.f, false));
ScrollView *leftScrollView = new ScrollView(ORIENT_VERTICAL, new AnchorLayoutParams(400.0f, FILL_PARENT, 10.f, 10.f, NONE, 10.f, false));
ViewGroup *leftColumn = new LinearLayout(ORIENT_VERTICAL);
leftScrollView->Add(leftColumn);
leftScrollView->SetClickableBackground(true);
root_->Add(leftScrollView);
ScrollView *rightScrollView = new ScrollView(ORIENT_VERTICAL, new AnchorLayoutParams(300.0f, FILL_PARENT, NONE, 10.f, 10.f, 10.f, false));
ViewGroup *rightColumn = new LinearLayout(ORIENT_VERTICAL);
rightScrollView->Add(rightColumn);
rightScrollView->SetClickableBackground(true);
root_->Add(rightScrollView);
LinearLayout *bottomControls = new LinearLayout(ORIENT_HORIZONTAL, new AnchorLayoutParams(NONE, NONE, NONE, 10.0f, false));
@@ -219,6 +229,7 @@ void DisplayLayoutScreen::CreateViews() {
aspectRatio->SetLiveUpdate(true);
mode_ = new ChoiceStrip(ORIENT_HORIZONTAL, new LinearLayoutParams(WRAP_CONTENT, WRAP_CONTENT));
mode_->AddChoice(di->T("Inactive"));
mode_->AddChoice(di->T("Move"));
mode_->AddChoice(di->T("Resize"));
mode_->SetSelection(0, false);
@@ -251,8 +262,6 @@ void DisplayLayoutScreen::CreateViews() {
static const char *bufFilters[] = { "Linear", "Nearest", };
leftColumn->Add(new PopupMultiChoice(&g_Config.iBufFilter, gr->T("Screen Scaling Filter"), bufFilters, 1, ARRAY_SIZE(bufFilters), gr->GetName(), screenManager()));
leftColumn->Add(new ItemHeader(gr->T("Postprocessing effect")));
Draw::DrawContext *draw = screenManager()->getDrawContext();
bool multiViewSupported = draw->GetDeviceCaps().multiViewSupported;
@@ -261,15 +270,33 @@ void DisplayLayoutScreen::CreateViews() {
return g_Config.bStereoRendering && multiViewSupported;
};
leftColumn->Add(new ItemHeader(gr->T("Postprocessing shaders")));
std::set<std::string> alreadyAddedShader;
settingsVisible_.resize(g_Config.vPostShaderNames.size());
static ContextMenuItem postShaderContextMenu[] = {
{ "Move Up", "I_ARROW_UP" },
{ "Move Down", "I_ARROW_DOWN" },
{ "Remove", "I_TRASHCAN" },
};
for (int i = 0; i < (int)g_Config.vPostShaderNames.size() + 1 && i < ARRAY_SIZE(shaderNames_); ++i) {
// Vector element pointer get invalidated on resize, cache name to have always a valid reference in the rendering thread
shaderNames_[i] = i == g_Config.vPostShaderNames.size() ? "Off" : g_Config.vPostShaderNames[i];
leftColumn->Add(new ItemHeader(StringFromFormat("%s #%d", gr->T("Postprocessing Shader"), i + 1)));
postProcChoice_ = leftColumn->Add(new ChoiceWithValueDisplay(&shaderNames_[i], "", &PostShaderTranslateName));
LinearLayout *shaderRow = new LinearLayout(ORIENT_HORIZONTAL, new LinearLayoutParams(UI::FILL_PARENT, UI::WRAP_CONTENT));
shaderRow->SetSpacing(4.0f);
leftColumn->Add(shaderRow);
if (shaderNames_[i] != "Off") {
postProcChoice_ = shaderRow->Add(new ChoiceWithValueDisplay(&shaderNames_[i], "", &PostShaderTranslateName, new LinearLayoutParams(1.0f)));
} else {
postProcChoice_ = shaderRow->Add(new Choice(ImageID("I_PLUS")));
}
postProcChoice_->OnClick.Add([=](EventParams &e) {
auto gr = GetI18NCategory("Graphics");
auto procScreen = new PostProcScreen(gr->T("Postprocessing Shader"), i, false);
auto procScreen = new PostProcScreen(gr->T("Postprocessing shaders"), i, false);
procScreen->SetHasDropShadow(false);
procScreen->OnChoice.Handle(this, &DisplayLayoutScreen::OnPostProcShaderChange);
if (e.v)
@@ -281,25 +308,90 @@ void DisplayLayoutScreen::CreateViews() {
return !g_Config.bSkipBufferEffects && !enableStereo();
});
if (i < g_Config.vPostShaderNames.size()) {
bool hasSettings = false;
std::vector<const ShaderInfo *> shaderChain = GetPostShaderChain(g_Config.vPostShaderNames[i]);
for (auto shaderInfo : shaderChain) {
for (size_t i = 0; i < ARRAY_SIZE(shaderInfo->settings); ++i) {
auto &setting = shaderInfo->settings[i];
if (!setting.name.empty()) {
hasSettings = true;
break;
}
}
}
if (hasSettings) {
CheckBox *checkBox = new CheckBox(&settingsVisible_[i], ImageID("I_SLIDERS"), new LinearLayoutParams(0.0f));
auto settingsButton = shaderRow->Add(checkBox);
settingsButton->OnClick.Add([=](EventParams &e) {
RecreateViews();
return UI::EVENT_DONE;
});
}
auto removeButton = shaderRow->Add(new Choice(ImageID("I_TRASHCAN"), new LinearLayoutParams(0.0f)));
removeButton->OnClick.Add([=](EventParams &e) -> UI::EventReturn {
g_Config.vPostShaderNames.erase(g_Config.vPostShaderNames.begin() + i);
NativeMessageReceived("gpu_configChanged", "");
RecreateViews();
return UI::EVENT_DONE;
});
auto moreButton = shaderRow->Add(new Choice(ImageID("I_THREE_DOTS"), new LinearLayoutParams(0.0f)));
moreButton->OnClick.Add([=](EventParams &e) -> UI::EventReturn {
PopupContextMenuScreen *contextMenu = new UI::PopupContextMenuScreen(postShaderContextMenu, ARRAY_SIZE(postShaderContextMenu), di.get(), moreButton);
screenManager()->push(contextMenu);
contextMenu->SetEnabled(0, i > 0);
contextMenu->SetEnabled(1, i < g_Config.vPostShaderNames.size() - 1);
contextMenu->OnChoice.Add([=](EventParams &e) -> UI::EventReturn {
switch (e.a) {
case 0: // Move up
std::swap(g_Config.vPostShaderNames[i - 1], g_Config.vPostShaderNames[i]);
break;
case 1: // Move down
std::swap(g_Config.vPostShaderNames[i], g_Config.vPostShaderNames[i + 1]);
break;
case 2: // Remove
g_Config.vPostShaderNames.erase(g_Config.vPostShaderNames.begin() + i);
break;
default:
return UI::EVENT_DONE;
}
NativeMessageReceived("gpu_configChanged", "");
RecreateViews();
return UI::EVENT_DONE;
});
return UI::EVENT_DONE;
});
}
// No need for settings on the last one.
if (i == g_Config.vPostShaderNames.size())
continue;
auto shaderChain = GetPostShaderChain(g_Config.vPostShaderNames[i]);
if (!settingsVisible_[i])
continue;
std::vector<const ShaderInfo *> shaderChain = GetPostShaderChain(g_Config.vPostShaderNames[i]);
for (auto shaderInfo : shaderChain) {
// Disable duplicated shader slider
bool duplicated = alreadyAddedShader.find(shaderInfo->section) != alreadyAddedShader.end();
alreadyAddedShader.insert(shaderInfo->section);
LinearLayout *settingContainer = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(UI::FILL_PARENT, UI::WRAP_CONTENT, UI::Margins(24.0f, 0.0f, 0.0f, 0.0f)));
leftColumn->Add(settingContainer);
for (size_t i = 0; i < ARRAY_SIZE(shaderInfo->settings); ++i) {
auto &setting = shaderInfo->settings[i];
if (!setting.name.empty()) {
// This map lookup will create the setting in the mPostShaderSetting map if it doesn't exist, with a default value of 0.0.
auto &value = g_Config.mPostShaderSetting[StringFromFormat("%sSettingValue%d", shaderInfo->section.c_str(), i + 1)];
if (duplicated) {
auto sliderName = StringFromFormat("%s %s", ps->T(setting.name), ps->T("(duplicated setting, previous slider will be used)"));
PopupSliderChoiceFloat *settingValue = leftColumn->Add(new PopupSliderChoiceFloat(&value, setting.minValue, setting.maxValue, sliderName, setting.step, screenManager()));
PopupSliderChoiceFloat *settingValue = settingContainer->Add(new PopupSliderChoiceFloat(&value, setting.minValue, setting.maxValue, sliderName, setting.step, screenManager()));
settingValue->SetEnabled(false);
} else {
PopupSliderChoiceFloat *settingValue = leftColumn->Add(new PopupSliderChoiceFloat(&value, setting.minValue, setting.maxValue, ps->T(setting.name), setting.step, screenManager()));
PopupSliderChoiceFloat *settingValue = settingContainer->Add(new PopupSliderChoiceFloat(&value, setting.minValue, setting.maxValue, ps->T(setting.name), setting.step, screenManager()));
settingValue->SetLiveUpdate(true);
settingValue->SetHasDropShadow(false);
settingValue->SetEnabledFunc([=] {
@@ -313,3 +405,49 @@ void DisplayLayoutScreen::CreateViews() {
root_->Add(new DisplayLayoutBackground(mode_, new AnchorLayoutParams(FILL_PARENT, FILL_PARENT, 0.0f, 0.0f, 0.0f, 0.0f)));
}
void PostProcScreen::CreateViews() {
auto ps = GetI18NCategory("PostShaders");
ReloadAllPostShaderInfo(screenManager()->getDrawContext());
shaders_ = GetAllPostShaderInfo();
std::vector<std::string> items;
int selected = -1;
const std::string selectedName = id_ >= (int)g_Config.vPostShaderNames.size() ? "Off" : g_Config.vPostShaderNames[id_];
for (int i = 0; i < (int)shaders_.size(); i++) {
if (!shaders_[i].visible)
continue;
if (shaders_[i].isStereo != showStereoShaders_)
continue;
if (shaders_[i].section == selectedName)
selected = (int)indexTranslation_.size();
items.push_back(ps->T(shaders_[i].section.c_str(), shaders_[i].name.c_str()));
indexTranslation_.push_back(i);
}
adaptor_ = UI::StringVectorListAdaptor(items, selected);
ListPopupScreen::CreateViews();
}
void PostProcScreen::OnCompleted(DialogResult result) {
if (result != DR_OK)
return;
const std::string &value = shaders_[indexTranslation_[listView_->GetSelected()]].section;
// I feel this logic belongs more in the caller, but eh...
if (showStereoShaders_) {
if (g_Config.sStereoToMonoShader != value) {
g_Config.sStereoToMonoShader = value;
NativeMessageReceived("gpu_configChanged", "");
}
} else {
if (id_ < (int)g_Config.vPostShaderNames.size()) {
if (g_Config.vPostShaderNames[id_] != value) {
g_Config.vPostShaderNames[id_] = value;
NativeMessageReceived("gpu_configChanged", "");
}
}
else {
g_Config.vPostShaderNames.push_back(value);
NativeMessageReceived("gpu_configChanged", "");
}
}
}
+23
View File
@@ -17,8 +17,12 @@
#pragma once
#include <deque>
#include "Common/UI/View.h"
#include "Common/UI/ViewGroup.h"
#include "GPU/Common/PostShader.h"
#include "MiscScreens.h"
class DisplayLayoutScreen : public UIDialogScreenWithGameBackground {
@@ -45,4 +49,23 @@ private:
UI::ChoiceStrip *mode_ = nullptr;
UI::Choice *postProcChoice_ = nullptr;
std::string shaderNames_[256];
std::deque<bool> settingsVisible_; // vector<bool> is an insane bitpacked specialization!
};
class PostProcScreen : public ListPopupScreen {
public:
PostProcScreen(const std::string &title, int id, bool showStereoShaders)
: ListPopupScreen(title), id_(id), showStereoShaders_(showStereoShaders) { }
void CreateViews() override;
const char *tag() const override { return "PostProc"; }
private:
void OnCompleted(DialogResult result) override;
bool ShowButtons() const override { return true; }
std::vector<ShaderInfo> shaders_;
int id_;
bool showStereoShaders_;
std::vector<int> indexTranslation_;
};
+24 -20
View File
@@ -846,7 +846,30 @@ void GameSettingsScreen::CreateViews() {
LinearLayout *systemSettings = AddTab("GameSettingsSystem", ms->T("System"));
systemSettings->Add(new ItemHeader(sy->T("UI")));
systemSettings->Add(new Choice(sy->T("Language")))->OnClick.Handle(this, &GameSettingsScreen::OnLanguage);
auto langCodeToName = [](const char *value) -> std::string {
auto &mapping = g_Config.GetLangValuesMapping();
auto iter = mapping.find(value);
if (iter != mapping.end()) {
return iter->second.first;
}
return value;
};
systemSettings->Add(new ChoiceWithValueDisplay(&g_Config.sLanguageIni, sy->T("Language"), langCodeToName))->OnClick.Add([&](UI::EventParams &e) {
auto sy = GetI18NCategory("System");
auto langScreen = new NewLanguageScreen(sy->T("Language"));
langScreen->OnChoice.Add([&](UI::EventParams &e) {
screenManager()->RecreateAllViews();
if (host)
host->UpdateUI();
return UI::EVENT_DONE;
});
if (e.v)
langScreen->SetPopupOrigin(e.v);
screenManager()->push(langScreen);
return UI::EVENT_DONE;
});
systemSettings->Add(new CheckBox(&g_Config.bUISound, sy->T("UI Sound")));
const Path bgPng = GetSysDirectory(DIRECTORY_SYSTEM) / "background.png";
const Path bgJpg = GetSysDirectory(DIRECTORY_SYSTEM) / "background.jpg";
@@ -1609,25 +1632,6 @@ UI::EventReturn GameSettingsScreen::OnChangeMacAddress(UI::EventParams &e) {
return UI::EVENT_DONE;
}
UI::EventReturn GameSettingsScreen::OnLanguage(UI::EventParams &e) {
auto sy = GetI18NCategory("System");
auto langScreen = new NewLanguageScreen(sy->T("Language"));
langScreen->OnChoice.Handle(this, &GameSettingsScreen::OnLanguageChange);
if (e.v)
langScreen->SetPopupOrigin(e.v);
screenManager()->push(langScreen);
return UI::EVENT_DONE;
}
UI::EventReturn GameSettingsScreen::OnLanguageChange(UI::EventParams &e) {
screenManager()->RecreateAllViews();
if (host) {
host->UpdateUI();
}
return UI::EVENT_DONE;
}
UI::EventReturn GameSettingsScreen::OnTextureShader(UI::EventParams &e) {
auto gr = GetI18NCategory("Graphics");
auto shaderScreen = new TextureShaderScreen(gr->T("Texture Shader"));
-4
View File
@@ -80,15 +80,11 @@ private:
UI::EventReturn OnControlMapping(UI::EventParams &e);
UI::EventReturn OnCalibrateAnalogs(UI::EventParams &e);
UI::EventReturn OnTouchControlLayout(UI::EventParams &e);
UI::EventReturn OnDumpNextFrameToLog(UI::EventParams &e);
UI::EventReturn OnTiltTypeChange(UI::EventParams &e);
UI::EventReturn OnTiltCustomize(UI::EventParams &e);
// Global settings handlers
UI::EventReturn OnLanguage(UI::EventParams &e);
UI::EventReturn OnLanguageChange(UI::EventParams &e);
UI::EventReturn OnAutoFrameskip(UI::EventParams &e);
UI::EventReturn OnPostProcShaderChange(UI::EventParams &e);
UI::EventReturn OnTextureShader(UI::EventParams &e);
UI::EventReturn OnTextureShaderChange(UI::EventParams &e);
UI::EventReturn OnDeveloperTools(UI::EventParams &e);
+9 -44
View File
@@ -551,45 +551,6 @@ void PromptScreen::TriggerFinish(DialogResult result) {
UIDialogScreenWithBackground::TriggerFinish(result);
}
PostProcScreen::PostProcScreen(const std::string &title, int id, bool showStereoShaders) : ListPopupScreen(title), id_(id), showStereoShaders_(showStereoShaders) { }
void PostProcScreen::CreateViews() {
auto ps = GetI18NCategory("PostShaders");
ReloadAllPostShaderInfo(screenManager()->getDrawContext());
shaders_ = GetAllPostShaderInfo();
std::vector<std::string> items;
int selected = -1;
const std::string selectedName = id_ >= (int)g_Config.vPostShaderNames.size() ? "Off" : g_Config.vPostShaderNames[id_];
for (int i = 0; i < (int)shaders_.size(); i++) {
if (!shaders_[i].visible)
continue;
if (shaders_[i].isStereo != showStereoShaders_)
continue;
if (shaders_[i].section == selectedName)
selected = (int)indexTranslation_.size();
items.push_back(ps->T(shaders_[i].section.c_str(), shaders_[i].name.c_str()));
indexTranslation_.push_back(i);
}
adaptor_ = UI::StringVectorListAdaptor(items, selected);
ListPopupScreen::CreateViews();
}
void PostProcScreen::OnCompleted(DialogResult result) {
if (result != DR_OK)
return;
const std::string &value = shaders_[indexTranslation_[listView_->GetSelected()]].section;
// I feel this logic belongs more in the caller, but eh...
if (showStereoShaders_) {
g_Config.sStereoToMonoShader = value;
} else {
if (id_ < (int)g_Config.vPostShaderNames.size())
g_Config.vPostShaderNames[id_] = value;
else
g_Config.vPostShaderNames.push_back(value);
}
}
TextureShaderScreen::TextureShaderScreen(const std::string &title) : ListPopupScreen(title) {}
void TextureShaderScreen::CreateViews() {
@@ -619,7 +580,7 @@ NewLanguageScreen::NewLanguageScreen(const std::string &title) : ListPopupScreen
#ifdef _MSC_VER
#pragma warning(disable:4566)
#endif
langValuesMapping = GetLangValuesMapping();
auto &langValuesMapping = g_Config.GetLangValuesMapping();
std::vector<File::FileInfo> tempLangs;
VFSGetFileListing("lang", &tempLangs, "ini");
@@ -655,11 +616,12 @@ NewLanguageScreen::NewLanguageScreen(const std::string &title) : ListPopupScreen
std::string buttonTitle = lang.name;
if (!code.empty()) {
if (langValuesMapping.find(code) == langValuesMapping.end()) {
auto iter = langValuesMapping.find(code);
if (iter == langValuesMapping.end()) {
// No title found, show locale code
buttonTitle = code;
} else {
buttonTitle = langValuesMapping[code].first;
buttonTitle = iter->second.first;
}
}
if (g_Config.sLanguageIni == code)
@@ -700,11 +662,14 @@ void NewLanguageScreen::OnCompleted(DialogResult result) {
if (iniLoadedSuccessfully) {
// Dunno what else to do here.
if (langValuesMapping.find(code) == langValuesMapping.end()) {
auto &langValuesMapping = g_Config.GetLangValuesMapping();
auto iter = langValuesMapping.find(code);
if (iter == langValuesMapping.end()) {
// Fallback to English
g_Config.iLanguage = PSP_SYSTEMPARAM_LANGUAGE_ENGLISH;
} else {
g_Config.iLanguage = langValuesMapping[code].second;
g_Config.iLanguage = iter->second.second;
}
RecreateViews();
} else {
-19
View File
@@ -106,28 +106,9 @@ public:
private:
void OnCompleted(DialogResult result) override;
bool ShowButtons() const override { return true; }
std::map<std::string, std::pair<std::string, int>> langValuesMapping;
std::map<std::string, std::string> titleCodeMapping;
std::vector<File::FileInfo> langs_;
};
class PostProcScreen : public ListPopupScreen {
public:
PostProcScreen(const std::string &title, int id, bool showStereoShaders);
void CreateViews() override;
const char *tag() const override { return "PostProc"; }
private:
void OnCompleted(DialogResult result) override;
bool ShowButtons() const override { return true; }
std::vector<ShaderInfo> shaders_;
int id_;
bool showStereoShaders_;
std::vector<int> indexTranslation_;
};
class TextureShaderScreen : public ListPopupScreen {
public:
TextureShaderScreen(const std::string &title);
+3 -3
View File
@@ -1064,7 +1064,7 @@ void TakeScreenshot() {
}
void RenderOverlays(UIContext *dc, void *userdata) {
// Thin bar at the top of the screen like Chrome.
// Thin bar at the top of the screen.
std::vector<float> progress = g_DownloadManager.GetCurrentProgress();
if (!progress.empty()) {
static const uint32_t colors[4] = {
@@ -1091,8 +1091,8 @@ void RenderOverlays(UIContext *dc, void *userdata) {
}
void NativeRender(GraphicsContext *graphicsContext) {
_assert_(graphicsContext != nullptr);
_assert_(screenManager != nullptr);
_dbg_assert_(graphicsContext != nullptr);
_dbg_assert_(screenManager != nullptr);
g_GameManager.Update();
+1 -86
View File
@@ -154,68 +154,6 @@ namespace MainWindow {
AppendMenu(helpMenu, MF_STRING | MF_BYCOMMAND, ID_HELP_ABOUT, aboutPPSSPP.c_str());
}
void UpdateDynamicMenuCheckmarks(HMENU menu) {
int item = ID_SHADERS_BASE + 1;
for (size_t i = 0; i < availableShaders.size(); i++) {
bool checked = false;
if (g_Config.vPostShaderNames.empty() && availableShaders[i] == "Off")
checked = true;
else if (g_Config.vPostShaderNames.size() == 1 && availableShaders[i] == g_Config.vPostShaderNames[0])
checked = true;
CheckMenuItem(menu, item++, checked ? MF_CHECKED : MF_UNCHECKED);
}
}
bool CreateShadersSubmenu(HMENU menu) {
// NOTE: We do not load this until translations are loaded!
if (!I18NCategoryLoaded("PostShaders"))
return false;
// We only reload this initially and when a menu is actually opened.
if (!menuShaderInfoLoaded) {
// This is on Windows where we don't currently blacklist any vendors, or similar.
// TODO: Figure out how to have the GPU data while reloading the post shader info.
ReloadAllPostShaderInfo(nullptr);
menuShaderInfoLoaded = true;
}
std::vector<ShaderInfo> info = GetAllPostShaderInfo();
if (menuShaderInfo.size() == info.size() && std::equal(info.begin(), info.end(), menuShaderInfo.begin())) {
return false;
}
auto ps = GetI18NCategory("PostShaders");
HMENU shaderMenu = GetSubmenuById(menu, ID_OPTIONS_SHADER_MENU);
EmptySubMenu(shaderMenu);
int item = ID_SHADERS_BASE + 1;
const char *translatedShaderName = nullptr;
availableShaders.clear();
for (auto i = info.begin(); i != info.end(); ++i) {
if (!i->visible)
continue;
int checkedStatus = MF_UNCHECKED;
availableShaders.push_back(i->section);
if (g_Config.vPostShaderNames.empty() && i->section == "Off") {
checkedStatus = MF_CHECKED;
} else if (g_Config.vPostShaderNames.size() == 1 && g_Config.vPostShaderNames[0] == i->section) {
checkedStatus = MF_CHECKED;
}
translatedShaderName = ps->T(i->section.c_str(), i->name.c_str());
AppendMenu(shaderMenu, MF_STRING | MF_BYPOSITION | checkedStatus, item++, ConvertUTF8ToWString(translatedShaderName).c_str());
}
menuShaderInfo = info;
return true;
}
static void TranslateMenuItem(const HMENU hMenu, const int menuID, const std::wstring& accelerator = L"", const char *key = nullptr) {
auto des = GetI18NCategory("DesktopUI");
@@ -302,7 +240,6 @@ namespace MainWindow {
// Skip display multipliers x1-x10
TranslateMenuItem(menu, ID_OPTIONS_FULLSCREEN, g_Config.bSystemControls ? L"\tAlt+Return, F11" : L"");
TranslateMenuItem(menu, ID_OPTIONS_VSYNC);
TranslateMenuItem(menu, ID_OPTIONS_SHADER_MENU);
TranslateMenuItem(menu, ID_OPTIONS_SCREEN_MENU, g_Config.bSystemControls ? L"\tCtrl+1" : L"");
TranslateMenuItem(menu, ID_OPTIONS_SCREENAUTO);
// Skip rendering resolution 2x-5x..
@@ -360,10 +297,6 @@ namespace MainWindow {
changed = true;
}
if (CreateShadersSubmenu(menu)) {
changed = true;
}
if (changed) {
DrawMenuBar(hWnd);
}
@@ -1034,25 +967,8 @@ namespace MainWindow {
break;
default:
{
// Handle the dynamic shader switching here.
// The Menu ID is contained in wParam, so subtract
// ID_SHADERS_BASE and an additional 1 off it.
u32 index = (wParam - ID_SHADERS_BASE - 1);
if (index < availableShaders.size()) {
g_Config.vPostShaderNames.clear();
if (availableShaders[index] != "Off")
g_Config.vPostShaderNames.push_back(availableShaders[index]);
g_Config.bShaderChainRequires60FPS = PostShaderChainRequires60FPS(GetFullPostShadersChain(g_Config.vPostShaderNames));
NativeMessageReceived("gpu_renderResized", "");
NativeMessageReceived("postshader_updated", "");
break;
}
MessageBox(hWnd, L"Unimplemented", L"Sorry", 0);
}
break;
break;
}
}
@@ -1329,7 +1245,6 @@ namespace MainWindow {
EnableMenuItem(menu, ID_DEBUG_GEDEBUGGER, MF_GRAYED);
#endif
UpdateDynamicMenuCheckmarks(menu);
UpdateCommands();
}
-4
View File
@@ -553,10 +553,6 @@ BEGIN
MENUITEM "Fullscreen", ID_OPTIONS_FULLSCREEN
MENUITEM "VSync", ID_OPTIONS_VSYNC
MENUITEM "Skip Buffer Effects", ID_OPTIONS_SKIP_BUFFER_EFFECTS
POPUP "Postprocessing Shader", ID_OPTIONS_SHADER_MENU
BEGIN
MENUITEM "", 0, MFT_SEPARATOR
END
POPUP "Rendering Resolution", ID_OPTIONS_SCREEN_MENU
BEGIN
MENUITEM "Auto", ID_OPTIONS_SCREENAUTO
-2
View File
@@ -118,8 +118,6 @@
#define IDC_GEDBG_PRIMCOUNTER 1201
#define IDC_BUTTON_SEARCH 1204
#define ID_SHADERS_BASE 5000
#define ID_FILE_EXIT 40000
#define ID_DEBUG_SAVEMAPFILE 40001
#define ID_DISASM_RUNTOHERE 40004
+5 -3
View File
@@ -192,7 +192,6 @@ Pause = ‎&إيقاف مؤقت
Pause When Not Focused = ‎&إيقاف مؤقت حينما لا يكون مفعلاً
Portrait = ‎لوحة
Portrait reversed = ‎لوحة معكوسة
Postprocessing Shader = Postprocessin&g shader
PPSSPP Forums = ‎PPSSPP &منتديات
Record = ‎&تسجيل
Record Audio = ‎تسجيل &الصوت
@@ -322,6 +321,8 @@ Load completed = ‎التحميل إكتمل.
Loading = ‎تحميل\nمن فضلك إنتظر...
LoadingFailed = ‎غير قادر علي تحميل البيانات.
Move = ‎تحريك
Move Down = Move Down
Move Up = Move Up
Network Connection = ‎إتصال الشبكة
NEW DATA = ‎بيانات جديدة
No = ‎لا
@@ -329,6 +330,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = ‎حسناً
Old savedata detected = ‎بيانات حفظ قديمة قد إكتشفت
Options = ‎إعدادات
Remove = Remove
Reset = ‎إستعادة
Resize = ‎تغيير الحجم
Retry = ‎حاول مجدداً
@@ -536,8 +538,7 @@ Overlay Information = ‎معلومات النسق
Partial Stretch = ‎تمطيط جزئي
Percent of FPS = Percent of FPS
Performance = ‎الأداء
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Postprocessing shader
Postprocessing shaders = Postprocessing shaders
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1050,6 +1051,7 @@ CPU Name = Name
D3DCompiler Version = D3DCompiler version
Debug = Debug
Debugger Present = Debugger present
Depth buffer format = Depth buffer format
Device Info = Device info
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &Pause
Pause When Not Focused = &Pause When Not Focused
Portrait = Portrait
Portrait reversed = Portrait reversed
Postprocessing Shader = Postprocessin&g Shader
PPSSPP Forums = PPSSPP &Forums
Record = &Record
Record Audio = Record &audio
@@ -314,6 +313,8 @@ Load completed = Yükləmə Tamamlandı
Loading = Yüklənir\nZəhmət Olmasa Gözləyin...
LoadingFailed = Unable to load data.
Move = Move
Move Down = Move Down
Move Up = Move Up
Network Connection = Network Connection
NEW DATA = NEW DATA
No = Xeyir
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = OK
Old savedata detected = Old savedata detected
Options = Options
Remove = Remove
Reset = Reset
Resize = Resize
Retry = Retry
@@ -528,8 +530,7 @@ Overlay Information = Overlay information
Partial Stretch = Partial stretch
Percent of FPS = Percent of FPS
Performance = Performance
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Postprocessing shader
Postprocessing shaders = Postprocessing shaders
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1042,6 +1043,7 @@ CPU Name = Name
D3DCompiler Version = D3DCompiler version
Debug = Debug
Debugger Present = Debugger present
Depth buffer format = Depth buffer format
Device Info = Device info
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &Pause
Pause When Not Focused = Пауза, когато не фокусиран
Portrait = Portrait
Portrait reversed = Portrait reversed
Postprocessing Shader = Postprocessin&g Shader
PPSSPP Forums = PPSSPP &форум
Record = &Record
Record Audio = Record &audio
@@ -314,6 +313,8 @@ Load completed = Зареждането завършено.
Loading = Зареждане\nМоля изчакайте...
LoadingFailed = Unable to load data.
Move = Преместване
Move Down = Move Down
Move Up = Move Up
Network Connection = Мрежова връзка
NEW DATA = Нови данни
No = Не
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = OK
Old savedata detected = Old savedata detected
Options = Options
Remove = Remove
Reset = Reset
Resize = Преоразмеряване
Retry = Нов опит
@@ -528,8 +530,7 @@ Overlay Information = Обща информация
Partial Stretch = Partial stretch
Percent of FPS = Percent of FPS
Performance = Performance
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Postprocessing shader
Postprocessing shaders = Postprocessing shaders
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1042,6 +1043,7 @@ CPU Name = Name
D3DCompiler Version = D3DCompiler version
Debug = Debug
Debugger Present = Debugger present
Depth buffer format = Depth buffer format
Device Info = Device info
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &Pausa
Pause When Not Focused = &Pausa quan es canviï de finestra
Portrait = Vertical
Portrait reversed = Vertical invertit
Postprocessing Shader = &Shader de postprocessat
PPSSPP Forums = &Fòrums de PPSSPP
Record = Enregistreu
Record Audio = Enregistreu Àudio
@@ -314,6 +313,8 @@ Load completed = Carrega completada
Loading = Carregant\nEspera un moment...
LoadingFailed = Unable to load data.
Move = Move
Move Down = Move Down
Move Up = Move Up
Network Connection = Network Connection
NEW DATA = NEW DATA
No = No
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = OK
Old savedata detected = Old savedata detected
Options = Options
Remove = Remove
Reset = Reset
Resize = Resize
Retry = Retry
@@ -528,8 +530,7 @@ Overlay Information = Overlay information
Partial Stretch = Partial stretch
Percent of FPS = Percent of FPS
Performance = Performance
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Postprocessing shader
Postprocessing shaders = Postprocessing shaders
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1042,6 +1043,7 @@ CPU Name = Name
D3DCompiler Version = D3DCompiler version
Debug = Debug
Debugger Present = Debugger present
Depth buffer format = Depth buffer format
Device Info = Device info
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &Pozastavit
Pause When Not Focused = &Pozastavit pokud okno není zaměřeno
Portrait = Na výšku
Portrait reversed = Na výšku obráceně
Postprocessing Shader = &Shader následného zpracování
PPSSPP Forums = &Fóra PPSSPP
Record = &Record
Record Audio = Record &audio
@@ -314,6 +313,8 @@ Load completed = Načítání dokončeno.
Loading = Načítání\nČekejte prosím...
LoadingFailed = Nelze načíst data.
Move = Přesunout
Move Down = Move Down
Move Up = Move Up
Network Connection = Síťové připojení
NEW DATA = NOVÁ DATA
No = Ne
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = OK
Old savedata detected = Zjištěna stará uložená data
Options = Volby
Remove = Remove
Reset = Resetovat
Resize = Velikost
Retry = Zkusit znovu
@@ -528,8 +530,7 @@ Overlay Information = Informace v překryvu
Partial Stretch = Částečné roztažení
Percent of FPS = Percent of FPS
Performance = Výkon
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Shader následného zpracování
Postprocessing shaders = Shader následného zpracování
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1042,6 +1043,7 @@ CPU Name = Name
D3DCompiler Version = D3DCompiler version
Debug = Debug
Debugger Present = Debugger present
Depth buffer format = Depth buffer format
Device Info = Device info
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &Pause
Pause When Not Focused = P&ause når ikke i fokus
Portrait = Portræt
Portrait reversed = Omvendt portræt
Postprocessing Shader = Efterbehandlin&gs shader
PPSSPP Forums = PPSSPP &forum
Record = Optag
Record Audio = Optag Lyd
@@ -314,6 +313,8 @@ Load completed = Hentet.
Loading = Henter\nVent venligst...
LoadingFailed = Ikke muligt at indlæse data.
Move = Flyt
Move Down = Move Down
Move Up = Move Up
Network Connection = Netværksforbindelse
NEW DATA = NY DATA
No = Nej
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = OK
Old savedata detected = Gamle savedata fundet
Options = Optioner
Remove = Remove
Reset = Nulstil
Resize = Størrelse
Retry = Prøv igen
@@ -528,8 +530,7 @@ Overlay Information = Overlay information
Partial Stretch = Delvis strukket
Percent of FPS = Percent of FPS
Performance = Ydelse
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Efterbehandlings shader
Postprocessing shaders = Efterbehandlings-shaders
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1042,6 +1043,7 @@ CPU Name = Name
D3DCompiler Version = D3DCompiler version
Debug = Debug
Debugger Present = Debugger present
Depth buffer format = Depth buffer format
Device Info = Device info
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = Pause
Pause When Not Focused = Pausieren im Hintergrund
Portrait = Hochformat
Portrait reversed = Hochformat umgedreht
Postprocessing Shader = Nachbearbeitungs-Shader
PPSSPP Forums = PPSSPP Forum
Record = Aufzeichnung
Record Audio = Ton aufzeichnen
@@ -314,6 +313,8 @@ Load completed = Laden abgeschlossen
Loading = Laden\nBitte warten...
LoadingFailed = Daten konnten nicht geladen werden.
Move = Bewegen
Move Down = Move Down
Move Up = Move Up
Network Connection = Netzwerkverbindung
NEW DATA = Neue Daten
No = Nein
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = OK
Old savedata detected = Alter Speicherstand entdeckt
Options = Optionen
Remove = Remove
Reset = Zurücksetzen
Resize = Größe ändern
Retry = Wiederholen
@@ -528,8 +530,7 @@ Overlay Information = Eingeblendete Informationen
Partial Stretch = Teilweise strecken
Percent of FPS = Prozent an FPS
Performance = Leistung
Postprocessing effect = Nachbearbeitungs-Effekte
Postprocessing Shader = Nachbearbeitungs-Shader
Postprocessing shaders = Nachbearbeitungs-Shader
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Kann Framerate smoother in Spielen machen, die eine niedrige Framerate haben.
@@ -1042,6 +1043,7 @@ CPU Name = Name
D3DCompiler Version = D3DCompiler version
Debug = Debug
Debugger Present = Debugger vorhanden
Depth buffer format = Depth buffer format
Device Info = Geräteinfo
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &Paus
Pause When Not Focused = &Pause When Not Focused
Portrait = Portrait
Portrait reversed = Portrait reversed
Postprocessing Shader = Postprocessin&g Shader
PPSSPP Forums = PPSSPP &Forumna
Record = &Record
Record Audio = Record &audio
@@ -314,6 +313,8 @@ Load completed = Tibukka'mi.
Loading = Dibukka'i\nTajammi...
LoadingFailed = Unable to load data.
Move = Move
Move Down = Move Down
Move Up = Move Up
Network Connection = Network Connection
NEW DATA = DATA baru
No = Edda mane
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = Okemi mane
Old savedata detected = Old savedata detected
Options = Options
Remove = Remove
Reset = Reset
Resize = Resize
Retry = Retry
@@ -528,8 +530,7 @@ Overlay Information = Pempakitan Overlay
Partial Stretch = Partial stretch
Percent of FPS = Percent of FPS
Performance = Performance
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Postprocessing shader
Postprocessing shaders = Postprocessing shaders
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1042,6 +1043,7 @@ CPU Name = Name
D3DCompiler Version = D3DCompiler version
Debug = Debug
Debugger Present = Debugger present
Depth buffer format = Depth buffer format
Device Info = Device info
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -208,7 +208,6 @@ Pause = &Pause
Pause When Not Focused = &Pause when not focused
Portrait = Portrait
Portrait reversed = Portrait reversed
Postprocessing Shader = Postprocessin&g shader
PPSSPP Forums = PPSSPP &forums
Record = &Record
Record Audio = Record &audio
@@ -338,6 +337,8 @@ Load completed = Load completed.
Loading = Loading\nPlease Wait...
LoadingFailed = Unable to load data.
Move = Move
Move Up = Move Up
Move Down = Move Down
Network Connection = Network Connection
NEW DATA = NEW DATA
No = No
@@ -345,6 +346,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = OK
Old savedata detected = Old savedata detected
Options = Options
Remove = Remove
Reset = Reset
Resize = Resize
Retry = Retry
@@ -552,8 +554,7 @@ Overlay Information = Overlay information
Partial Stretch = Partial stretch
Percent of FPS = Percent of FPS
Performance = Performance
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Postprocessing shader
Postprocessing shaders = Postprocessing shaders
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1059,6 +1060,7 @@ CPU Name = Name
D3DCompiler Version = D3DCompiler version
Debug = Debug
Debugger Present = Debugger present
Depth buffer format = Depth buffer format
Device Info = Device info
Directories = Directories
Display Information = Display information
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &Pausar
Pause When Not Focused = &Pausar al cambiar de ventana
Portrait = &Vertical
Portrait reversed = Vertical &invertido
Postprocessing Shader = &Shader de postprocesado
PPSSPP Forums = &Foro de PPSSPP
Record = G&rabar
Record Audio = Grabar &audio
@@ -314,6 +313,8 @@ Load completed = Carga completada.
Loading = Cargando\nEspera un momento...
LoadingFailed = Los datos del juego no se pudieron cargar.
Move = Posición
Move Down = Move Down
Move Up = Move Up
Network Connection = Conexión de red
NEW DATA = NUEVOS DATOS DE PARTIDA
No = No
@@ -321,6 +322,7 @@ ObtainingIP = Obteniendo direcciónnn IP.\nPor favor espera...
OK = Aceptar
Old savedata detected = Se han detectado datos del juego antiguos.
Options = Opciones
Remove = Remove
Reset = Reiniciar
Resize = Tamaño
Retry = Reintentar
@@ -528,8 +530,7 @@ Overlay Information = Información en pantalla
Partial Stretch = Estirado parcial
Percent of FPS = % de FPS
Performance = Rendimiento
Postprocessing effect = Efecto de postprocesado
Postprocessing Shader = Shader de postprocesado
Postprocessing shaders = Shaders de postprocesado
Recreate Activity = Recrear actividad
Render duplicate frames to 60hz = Renderizar cuadros duplicados a 60Hz
RenderDuplicateFrames Tip = Puede hacer la imagen más fluida in juegos con una tasa de cuadros más baja.
@@ -1042,6 +1043,7 @@ CPU Name = Nombre
D3DCompiler Version = Versión del compilador D3D
Debug = Desarrollo
Debugger Present = Depurador presente
Depth buffer format = Depth buffer format
Device Info = Info. del dispositivo
Directories = Directorios
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &Pausar
Pause When Not Focused = &Pausar al cambiar de ventana
Portrait = Retrato
Portrait reversed = Retrato inverso
Postprocessing Shader = &Shader de postprocesado
PPSSPP Forums = &Foro de PPSSPP
Record = G&rabar
Record Audio = Grabar &audio
@@ -314,6 +313,8 @@ Load completed = Datos cargados.
Loading = Cargando\nPor favor espere...
LoadingFailed = Los datos del juego no se pudieron cargar.
Move = Mover
Move Down = Move Down
Move Up = Move Up
Network Connection = Conexión de red
NEW DATA = CREAR DATOS
No = No
@@ -321,6 +322,7 @@ ObtainingIP = Obteniendo dirección IP.\nEspera un momento...
OK = OK
Old savedata detected = Se han detectado datos del juego antiguos.
Options = Opciones
Remove = Remove
Reset = Reiniciar
Resize = Tamaño
Retry = Reintentar
@@ -528,8 +530,7 @@ Overlay Information = Información en pantalla
Partial Stretch = Estirado parcial
Percent of FPS = % de FPS
Performance = Rendimiento
Postprocessing effect = Efectos de postprocesado
Postprocessing Shader = Shader de postprocesado
Postprocessing shaders = Shaders de postprocesado
Recreate Activity = Recrear actividad
Render duplicate frames to 60hz = Procesar cuadros duplicados a 60 Hz
RenderDuplicateFrames Tip = Puede hacer que la fluidez sea más suave en juegos con tasas de cuadros bajas.
@@ -1042,6 +1043,7 @@ CPU Name = Nombre
D3DCompiler Version = Versión del compilador D3D
Debug = Desarrollo
Debugger Present = Depurador presente
Depth buffer format = Depth buffer format
Device Info = Info de dispositivo
Directories = Directorios
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = ‎مکث
Pause When Not Focused = ‎هنگامی که پنجره فعال نباشد بازی متوقف شود
Portrait = ‎عمودی
Portrait reversed = ‎عمودی وارونه
Postprocessing Shader = ‎اضافه کردن افکت
PPSSPP Forums = ‎PPSSPP انجمن های
Record = ‎ضبط کردن
Record Audio = ‎ضبط صدا
@@ -314,6 +313,8 @@ Load completed = ‎.بارگیری نکمیل شد
Loading = ‎درحال بارگیری\n...منتظر بمانید
LoadingFailed = Unable to load data.
Move = Move
Move Down = Move Down
Move Up = Move Up
Network Connection = Network Connection
NEW DATA = ‎دیتای جدید
No = ‎خیر
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = ‎تایید
Old savedata detected = Old savedata detected
Options = Options
Remove = Remove
Reset = Reset
Resize = Resize
Retry = Retry
@@ -528,8 +530,7 @@ Overlay Information = ‎Overlay اطلاعات
Partial Stretch = ‎کشیدگی جزئی
Percent of FPS = Percent of FPS
Performance = Performance
Postprocessing effect = Postprocessing effects
Postprocessing Shader = ‎افکت پس-پردازش
Postprocessing shaders = ‎افکت پس-پردازش
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1042,6 +1043,7 @@ CPU Name = Name
D3DCompiler Version = D3DCompiler version
Debug = Debug
Debugger Present = Debugger present
Depth buffer format = Depth buffer format
Device Info = Device info
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &Pause
Pause When Not Focused = &Pause When Not Focused
Portrait = Portrait
Portrait reversed = Portrait reversed
Postprocessing Shader = Postprocessin&g Shader
PPSSPP Forums = PPSSPP &Forums
Record = &Record
Record Audio = Record &audio
@@ -314,6 +313,8 @@ Load completed = Lataus onnistui.
Loading = Ladataan\nOdota...
LoadingFailed = Unable to load data.
Move = Move
Move Down = Move Down
Move Up = Move Up
Network Connection = Network Connection
NEW DATA = NEW DATA
No = Ei
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = OK
Old savedata detected = Old savedata detected
Options = Options
Remove = Remove
Reset = Reset
Resize = Resize
Retry = Retry
@@ -528,8 +530,7 @@ Overlay Information = Overlay information
Partial Stretch = Partial stretch
Percent of FPS = Percent of FPS
Performance = Performance
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Postprocessing shader
Postprocessing shaders = Postprocessing shaders
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1042,6 +1043,7 @@ CPU Name = Name
D3DCompiler Version = D3DCompiler version
Debug = Debug
Debugger Present = Debugger present
Depth buffer format = Depth buffer format
Device Info = Device info
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &Pause
Pause When Not Focused = Mettre en pa&use si pas au premier plan
Portrait = Portrait
Portrait reversed = Portrait inversé
Postprocessing Shader = S&haders de post-traitement
PPSSPP Forums = Visiter le &forum de PPSSPP
Record = E&nregistrer
Record Audio = Enregistrer le &son
@@ -314,6 +313,8 @@ Load completed = Chargement terminé.
Loading = Chargement\nVeuillez patienter...
LoadingFailed = Chargement impossible.
Move = Déplacer
Move Down = Move Down
Move Up = Move Up
Network Connection = Connexion réseau
NEW DATA = NOUVELLES DONNÉES
No = Non
@@ -321,6 +322,7 @@ ObtainingIP = Obtention de l'adresse IP\nVeuillez patienter...
OK = OK
Old savedata detected = Ancienne sauvegarde détectée
Options = Options
Remove = Remove
Reset = Remise à 0
Resize = Zoomer
Retry = Réessayer
@@ -528,8 +530,7 @@ Overlay Information = Informations incrustées à l'écran
Partial Stretch = Étirement partiel
Percent of FPS = Pourcentage de FPS
Performance = Performances
Postprocessing effect = Effets de post-traitement
Postprocessing Shader = Shaders de post-traitement
Postprocessing shaders = Shaders de post-traitement
Recreate Activity = Recréer l'animation
Render duplicate frames to 60hz = Dupliquer les images pour atteindre 60 Hz
RenderDuplicateFrames Tip = Peut améliorer la fluidité dans les jeux qui fonctionnent à des fréquences d'images plus faibles
@@ -1033,6 +1034,7 @@ CPU Name = Nom
D3DCompiler Version = Version de D3DCompiler
Debug = Débogage
Debugger Present = Débogueur présent
Depth buffer format = Depth buffer format
Device Info = Informations sur l'appareil
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &Pausar
Pause When Not Focused = &Pausar ó cambiar de ventá
Portrait = Portrait
Portrait reversed = Portrait reversed
Postprocessing Shader = &Shader de postprocesado
PPSSPP Forums = &Foro de PPSSPP
Record = &Record
Record Audio = Record &audio
@@ -314,6 +313,8 @@ Load completed = Carga completada.
Loading = Cargando\nAgarda un momento...
LoadingFailed = Os datos nom se puideron cargar.
Move = Posición
Move Down = Move Down
Move Up = Move Up
Network Connection = Conexión de rede
NEW DATA = NOVOS DATOS
No = Non
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = Aceptar
Old savedata detected = Detectados datos de gardado antigos.
Options = Options
Remove = Remove
Reset = Reiniciar
Resize = Tamaño
Retry = Reintentar
@@ -528,8 +530,7 @@ Overlay Information = Información en pantalla
Partial Stretch = Partial stretch
Percent of FPS = Percent of FPS
Performance = Rendemento
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Shader de postprocesado
Postprocessing shaders = Shaders de postprocesado
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1042,6 +1043,7 @@ CPU Name = Name
D3DCompiler Version = D3DCompiler version
Debug = Debug
Debugger Present = Debugger present
Depth buffer format = Depth buffer format
Device Info = Device info
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &Πάυση
Pause When Not Focused = Παύση σε κατάσταση παρασκηνίου
Portrait = Κατακόρυφο προσανατολισμός
Portrait reversed = Αντεστραμένος κατακόρυφος προσανατολισμός
Postprocessing Shader = Shader Μετεπεξεργασίας
PPSSPP Forums = PPSSPP &Forum
Record = Καταγραφή
Record Audio = Καταγραφή Ήχου
@@ -314,6 +313,8 @@ Load completed = ΦΟΡΤΩΣΗ ΟΛΟΚΛΗΡΩΘΗΚΕ
Loading = ΦΟΡΤΩΣΗ\nΠΑΡΑΚΑΛΩ ΠΕΡΙΜΕΝΕΤΕ...
LoadingFailed = ΑΔΥΝΑΜΙΑ ΦΟΡΤΩΣΗΣ ΔΕΔΟΜΕΝΩΝ.
Move = ΜΕΤΑΚΙΝΗΣΗ
Move Down = Move Down
Move Up = Move Up
Network Connection = ΣΥΝΔΕΣΗ ΔΙΚΤΥΟΥ
NEW DATA = ΝΕΑ ΔΕΔΟΜΕΝΑ
No = ΟΧΙ
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = OK
Old savedata detected = Εντοπίστηκαν παλαιά αρχεία αποθήκευσης
Options = ΕΠΙΛΟΓΕΣ
Remove = Remove
Reset = ΕΠΑΝΑΦΟΡΑ
Resize = ΑΛΛΑΓΗ ΜΕΓΕΘΟΥΣ
Retry = ΕΠΑΝΑΛΗΨΗ
@@ -528,8 +530,7 @@ Overlay Information = Πληροφορίες Οθόνης
Partial Stretch = Μερική επέκταση
Percent of FPS = Percent of FPS
Performance = Επίδοσεις
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Shader Μετεπεξεργασίας
Postprocessing shaders = Shaders Μετεπεξεργασίας
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1042,6 +1043,7 @@ CPU Name = Όνομα
D3DCompiler Version = Έκδοση D3DCompiler
Debug = Εντοπισμός σφαλμάτων
Debugger Present = Παρουσία πρόγραμματος εντοπισμού σφαλμάτων
Depth buffer format = Depth buffer format
Device Info = Πληροφορίες συσκευής
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &השהה
Pause When Not Focused = &Pause When Not Focused
Portrait = Portrait
Portrait reversed = Portrait reversed
Postprocessing Shader = Postprocessin&g Shader
PPSSPP Forums = PPSSPP &Forums
Record = &Record
Record Audio = Record &audio
@@ -314,6 +313,8 @@ Load completed = .המלשוה הניעט
Loading = ...ןתמה אנא ...ןעוט
LoadingFailed = Unable to load data.
Move = Move
Move Down = Move Down
Move Up = Move Up
Network Connection = Network Connection
NEW DATA = םישדח םינותנ
No = אל
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = רדסב
Old savedata detected = Old savedata detected
Options = Options
Remove = Remove
Reset = Reset
Resize = Resize
Retry = Retry
@@ -528,8 +530,7 @@ Overlay Information = כיסוי מידע
Partial Stretch = Partial stretch
Percent of FPS = Percent of FPS
Performance = Performance
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Postprocessing shader
Postprocessing shaders = Postprocessing shaders
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1042,6 +1043,7 @@ CPU Name = Name
D3DCompiler Version = D3DCompiler version
Debug = Debug
Debugger Present = Debugger present
Depth buffer format = Depth buffer format
Device Info = Device info
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &Pause
Pause When Not Focused = &Pause When Not Focused
Portrait = Portrait
Portrait reversed = Portrait reversed
Postprocessing Shader = Postprocessin&g Shader
PPSSPP Forums = PPSSPP &Forums
Record = &Record
Record Audio = Record &audio
@@ -314,6 +313,8 @@ Load completed = .המלשוה הניעט
Loading = ...ןתמה אנא ...ןעוט
LoadingFailed = Unable to load data.
Move = Move
Move Down = Move Down
Move Up = Move Up
Network Connection = Network Connection
NEW DATA = םישדח םינותנ
No = אל
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = רדסב
Old savedata detected = Old savedata detected
Options = Options
Remove = Remove
Reset = Reset
Resize = Resize
Retry = Retry
@@ -528,8 +530,7 @@ Overlay Information = עדימ יוסיכ
Partial Stretch = Partial stretch
Percent of FPS = Percent of FPS
Performance = Performance
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Postprocessing shader
Postprocessing shaders = Postprocessing shaders
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1042,6 +1043,7 @@ CPU Name = Name
D3DCompiler Version = D3DCompiler version
Debug = Debug
Debugger Present = Debugger present
Depth buffer format = Depth buffer format
Device Info = Device info
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &Pauza
Pause When Not Focused = &Pauziraj kad nije fokusirano
Portrait = Portret
Portrait reversed = Obrnuti portret
Postprocessing Shader = Postupa&k sjenčanja
PPSSPP Forums = PPSSPP &forumi
Record = &Snimaj
Record Audio = Snimaj &zvuk
@@ -314,6 +313,8 @@ Load completed = Učitavanje dovršeno.
Loading = Učitavanje\nPričekajte...
LoadingFailed = Nije moguće učitati datu.
Move = Pomakni
Move Down = Move Down
Move Up = Move Up
Network Connection = Internetska veza
NEW DATA = NOVA DATA
No = Ne
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = OK
Old savedata detected = Uočena stara savedata
Options = Opcije
Remove = Remove
Reset = Reset
Resize = Resize
Retry = Ponovi
@@ -528,8 +530,7 @@ Overlay Information = Prekrivanje informacija
Partial Stretch = Djelomično rastezanje
Percent of FPS = Postotak FPS-a
Performance = Performansa
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Sjenčanje poslije procesa
Postprocessing shaders = Sjenčanje poslije procesa
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Izlgađiva frameove u igrama koje ih jako malo imaju
@@ -1042,6 +1043,7 @@ CPU Name = Ime
D3DCompiler Version = D3DCompiler verzija
Debug = Otklanjanje grešaka
Debugger Present = Otklanjivač grešaka prisutan
Depth buffer format = Depth buffer format
Device Info = Informacije o uređaju
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &Szünet
Pause When Not Focused = &Szüneteltetés, ha nincs fókuszban
Portrait = Álló
Portrait reversed = Fordított álló
Postprocessing Shader = Utóeffektező shader
PPSSPP Forums = PPSSPP &fórum
Record = &Felvétel
Record Audio = &Hang felvétele
@@ -314,6 +313,8 @@ Load completed = Betöltve.
Loading = Betöltés\nKérlek várj...
LoadingFailed = Betöltés sikertelen.
Move = Mozgat
Move Down = Move Down
Move Up = Move Up
Network Connection = Hálózati kapcsolat
NEW DATA = ÚJ MENTÉS
No = Nem
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = OK
Old savedata detected = Régi mentés észlelve
Options = Opciók
Remove = Remove
Reset = Visszaállít
Resize = Átméretez
Retry = Újra
@@ -528,8 +530,7 @@ Overlay Information = Overlay információk
Partial Stretch = Részleges nyújtás
Percent of FPS = FPS százalékában
Performance = Teljesítmény
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Utóeffektező shader
Postprocessing shaders = Utóeffektező shaders
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Képkockák duplázása 60 Hz rendereléshez
RenderDuplicateFrames Tip = Simábbá teheti az alacsonyabb képkocka számon futó játékok kirajzolását
@@ -1042,6 +1043,7 @@ CPU Name = Név
D3DCompiler Version = D3DCompiler verzió
Debug = Hibakeresés
Debugger Present = Debugger jelen
Depth buffer format = Depth buffer format
Device Info = Eszközinfó
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = Jeda
Pause When Not Focused = Jeda ketika tidak fokus
Portrait = Tegak
Portrait reversed = Tegak terbalik
Postprocessing Shader = Pemrosesan shader
PPSSPP Forums = &Forum PPSSPP
Record = Rekam
Record Audio = Rekam suara
@@ -314,6 +313,8 @@ Load completed = Selesai memuat.
Loading = Memuat\nMohon Tunggu...
LoadingFailed = Tidak dapat memuat data.
Move = Pindah
Move Down = Move Down
Move Up = Move Up
Network Connection = Koneksi Jaringan
NEW DATA = DATA BARU
No = Tidak
@@ -321,6 +322,7 @@ ObtainingIP = Mendapatkan alamat IP.\nHarap tunggu...
OK = Oke
Old savedata detected = Simpanan data lama terdeteksi
Options = Pilihan
Remove = Remove
Reset = Atur ulang
Resize = Atur ulang ukuran
Retry = Coba lagi
@@ -528,8 +530,7 @@ Overlay Information = Tampilan Informasi
Partial Stretch = Peregangan sebagian
Percent of FPS = Persen FPS
Performance = Kinerja
Postprocessing effect = Efek pemrosesan
Postprocessing Shader = Pemrosesan shader
Postprocessing shaders = Pemrosesan shaders
Recreate Activity = Buat ulang aktivitas
Render duplicate frames to 60hz = Pelukisan bingkai duplikat menjadi 60 Hz
RenderDuplicateFrames Tip = Dapat membuat laju bingkai lebih lancar dalam permainan yang berjalan pada laju bingkai yang lebih rendah
@@ -1042,6 +1043,7 @@ CPU Name = Nama CPU
D3DCompiler Version = Versi D3DCompiler
Debug = Awakutu
Debugger Present = Pengawakutu tersedia
Depth buffer format = Depth buffer format
Device Info = Info perangkat
Directories = Direktori
Display Color Formats = Format warna tampilan
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = Pausa
Pause When Not Focused = Pausa quando non attivo
Portrait = Ritratto
Portrait reversed = Ritratto invertito
Postprocessing Shader = Shader di post-elaborazione
PPSSPP Forums = Forum PPSSPP
Record = Registra
Record Audio = Registra Audio
@@ -314,6 +313,8 @@ Load completed = Caricamento completato.
Loading = Caricamento in corso.\nAttendere, prego...
LoadingFailed = Impossibile caricare i dati.
Move = Sposta
Move Down = Move Down
Move Up = Move Up
Network Connection = Connessione di Rete
NEW DATA = NUOVI DATI
No = No
@@ -321,6 +322,7 @@ ObtainingIP = Cerco di ottenere l'indirizzo IP.\nAttendere, prego...
OK = OK
Old savedata detected = Rilevati vecchi dati salvati
Options = Opzioni
Remove = Remove
Reset = Reset
Resize = Ridimensiona
Retry = Riprova
@@ -529,8 +531,7 @@ Overlay Information = Copri Informazioni
Partial Stretch = Estensione Parziale
Percent of FPS = Percentuale di FPS
Performance = Prestazioni
Postprocessing effect = Effetti di post-elaborazione
Postprocessing Shader = Shader di post-elaborazione
Postprocessing shaders = Shader di post-elaborazione
Recreate Activity = Ricrea l'animazione
Render duplicate frames to 60hz = Duplica i frame da renderizzare a 60 Hz
RenderDuplicateFrames Tip = Può migliorare la fluidità nei giochi che funzionano a frame rate inferiori
@@ -1043,6 +1044,7 @@ CPU Name = Nome
D3DCompiler Version = Versione D3DCompiler
Debug = Debug
Debugger Present = Debugger presente
Depth buffer format = Depth buffer format
Device Info = Informazioni dispositivo
Directories = Cartelle
Display Color Formats = Formati colore di visualizzazione
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = 一時停止(&P)
Pause When Not Focused = 非フォーカス時は一時停止する(&P)
Portrait = 縦
Portrait reversed = 縦 (反転)
Postprocessing Shader = 後処理シェーダ(&G)
PPSSPP Forums = PPSSPPフォーラム(&F)
Record = 記録(&R)
Record Audio = オーディオを記録する(&A)
@@ -314,6 +313,8 @@ Load completed = ロードが完了しました。
Loading = ロード中です。\nしばらくお待ちください...
LoadingFailed = データをロードできませんでした。
Move = 移動
Move Down = Move Down
Move Up = Move Up
Network Connection = ネットワーク接続
NEW DATA = 新しいデータ
No = いいえ
@@ -321,6 +322,7 @@ ObtainingIP = IPアドレスの取得中。 \nしばらくお待ちください.
OK = OK
Old savedata detected = 古いセーブデータを検出しました
Options = オプション
Remove = Remove
Reset = リセット
Resize = リサイズ
Retry = リトライ
@@ -528,8 +530,7 @@ Overlay Information = オーバーレイ表示
Partial Stretch = 部分的に拡大
Percent of FPS = FPS中のパーセント
Performance = パフォーマンス
Postprocessing effect = 後処理エフェクト
Postprocessing Shader = 後処理シェーダ
Postprocessing shaders = 後処理シェーダ
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = フレームを複製して60Hzでレンダリングする
RenderDuplicateFrames Tip = フレームレートが低いゲームでフレームレートをよりスムーズにできます
@@ -1042,6 +1043,7 @@ CPU Name = CPU名
D3DCompiler Version = D3DCompilerバージョン
Debug = デバッグ
Debugger Present = デバッガーあり
Depth buffer format = Depth buffer format
Device Info = デバイス情報
Directories = ディレクトリ
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &Ngaso
Pause When Not Focused = &Ngaso Nalika Ora Fokus
Portrait = Portrait
Portrait reversed = Portrait reversed
Postprocessing Shader = Ngatifke Shader
PPSSPP Forums = &Forum PPSSPP
Record = &Record
Record Audio = Record &audio
@@ -314,6 +313,8 @@ Load completed = Mbukak rampung.
Loading = Mbukak\nMohon nteni...
LoadingFailed = Ora biso mbukak data.
Move = Pindahno
Move Down = Move Down
Move Up = Move Up
Network Connection = Koneksi Jaringan
NEW DATA = DATA ANYAR
No = Ora
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = He.eh
Old savedata detected = Simpenan lawas terdeteksi
Options = Opsi
Remove = Remove
Reset = Ngreset
Resize = Ubah Ukuran
Retry = Jajal Maning
@@ -528,8 +530,7 @@ Overlay Information = Informasi numpuki
Partial Stretch = Partial stretch
Percent of FPS = Percent of FPS
Performance = Kinerja
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Postprocessing shader
Postprocessing shaders = Postprocessing shaders
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1042,6 +1043,7 @@ CPU Name = Name
D3DCompiler Version = D3DCompiler version
Debug = Debug
Debugger Present = Debugger present
Depth buffer format = Depth buffer format
Device Info = Device info
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = 일시 정지(&P)
Pause When Not Focused = 포커싱되지 않았을 때 일시 정지(&P)
Portrait = 세로방향
Portrait reversed = 세로방향 반전
Postprocessing Shader = 후처리 셰이더(&G)
PPSSPP Forums = PPSSPP 포럼(&F)
Record = 녹음(&R)
Record Audio = 사운드 녹음(&A)
@@ -314,6 +313,8 @@ Load completed = 불러오기가 완료되었습니다.
Loading = 로딩 중\n잠시만 기다려 주세요...
LoadingFailed = 데이터를 불러올 수 없습니다.
Move = 이동
Move Down = Move Down
Move Up = Move Up
Network Connection = 네트워크 연결
NEW DATA = 새로운 데이터
No = 아니오
@@ -321,6 +322,7 @@ ObtainingIP = IP 주소를 가져오는 중입니다.\n잠시만 기다려 주
OK = 확인
Old savedata detected = 오래된 저장 데이터 감지됨
Options = 옵션
Remove = Remove
Reset = 재설정
Resize = 크기 조정
Retry = 재시도
@@ -528,8 +530,7 @@ Overlay Information = 오버레이 정보
Partial Stretch = 부분 늘이기
Percent of FPS = FPS 비율
Performance = 성능
Postprocessing effect = 후처리 효과
Postprocessing Shader = 후처리 쉐이더
Postprocessing shaders = 후처리 쉐이더
Recreate Activity = 활동 재생성
Render duplicate frames to 60hz = 중복 프레임을 60Hz로 렌더링
RenderDuplicateFrames Tip = 낮은 프레임 속도에서 실행되는 게임에서 프레임 속도를 더 부드럽게 만들 수 있습니다.
@@ -1055,6 +1056,7 @@ CPU Name = 이름
D3DCompiler Version = D3D컴파일러 버전
Debug = 디버그
Debugger Present = 디버거 탐지
Depth buffer format = Depth buffer format
Device Info = 장치 정보
Directories = 디렉토리
Display Information = 정보 표시
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &ຢຸດຊົ່ວຄາວ
Pause When Not Focused = &ຢຸດຊົ່ວຄາວເມື່ອບໍ່ໄດ້ຫຼິ້ນ
Portrait = ແນວຕັ້ງ
Portrait reversed = ກັບດ້ານແນວຕັ້ງ
Postprocessing Shader = &ຂະບວນການເຮັດວຽກໄລ່ປັບເສດແສງສີ
PPSSPP Forums = &ຟໍຣຳ PPSSPP
Record = ການບັນທຶກ
Record Audio = ບັນທຶກສຽງ
@@ -314,6 +313,8 @@ Load completed = ໂຫຼດຂໍ້ມູນສຳເລັດ
Loading = ກຳລັງໂຫຼດ\nກະລຸນາລໍຖ້າ...
LoadingFailed = ບໍ່ສາມາດໂຫຼດຂໍ້ມູນ.
Move = ເຄື່ອນຍ້າຍ
Move Down = Move Down
Move Up = Move Up
Network Connection = ການເຊື່ອມຕໍ່ເຄື່ອຂ່າຍ
NEW DATA = ຂໍ້ມູນໃໝ່
No = ບໍ່ແມ່ນ
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = ຕົກລົງ
Old savedata detected = ກວດພົບຂໍ້ມູນເຊບເກົ່າ
Options = ໂຕເລືອກ
Remove = Remove
Reset = ຕັ້ງຄ່າໃໝ່
Resize = ປັບຂະໜາດ
Retry = ລອງໃໝ່ອີກຄັ້ງ
@@ -528,8 +530,7 @@ Overlay Information = ການສະແດງຂໍ້ມູນຊ້ອນທ
Partial Stretch = ແນວຕັ້ງດຶງເຕັມຈໍ
Percent of FPS = Percent of FPS
Performance = ປະສິດທິພາບ
Postprocessing effect = Postprocessing effects
Postprocessing Shader = ຂະບວນການເຮັດວຽກໄລ່ປັບເສດສີ
Postprocessing shaders = ຂະບວນການເຮັດວຽກໄລ່ປັບເສດສີ
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1042,6 +1043,7 @@ CPU Name = Name
D3DCompiler Version = D3DCompiler version
Debug = Debug
Debugger Present = Debugger present
Depth buffer format = Depth buffer format
Device Info = Device info
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &Pauzė
Pause When Not Focused = &Stabdyti kai nefokusuota
Portrait = Portrait
Portrait reversed = Portrait reversed
Postprocessing Shader = Postprocessin&g Shader
PPSSPP Forums = PPSSPP &Forumai
Record = &Record
Record Audio = Record &audio
@@ -314,6 +313,8 @@ Load completed = Krovimas baigtas.
Loading = Kraunama\nPrašome palaukti...
LoadingFailed = Neįmanoma krauti duomenų.
Move = Perkelti
Move Down = Move Down
Move Up = Move Up
Network Connection = Interneto tinklas
NEW DATA = NAUJI DUOMENYS
No = Ne
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = Gerai
Old savedata detected = Aptikti seniau išsaugoti duomenys
Options = Options
Remove = Remove
Reset = Perkrauti
Resize = Perkeisti dydį
Retry = Pabandyti dar kartą
@@ -528,8 +530,7 @@ Overlay Information = Užkadrinė informacija
Partial Stretch = Partial stretch
Percent of FPS = Percent of FPS
Performance = Greitis
Postprocessing effect = Postprocessing effects
Postprocessing Shader = "Įdėjiniminio" krovimo "šešėliai" (FX)
Postprocessing shaders = "Įdėjiniminio" krovimo "šešėliai" (FX)
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1042,6 +1043,7 @@ CPU Name = Name
D3DCompiler Version = D3DCompiler version
Debug = Debug
Debugger Present = Debugger present
Depth buffer format = Depth buffer format
Device Info = Device info
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &Jeda
Pause When Not Focused = &Jeda ketika tidak difokus
Portrait = Portrait
Portrait reversed = Portrait songsang
Postprocessing Shader = Shader pasc&apemprosesan
PPSSPP Forums = PPSSPP &Forum
Record = &Rakam
Record Audio = Rakam &audio
@@ -314,6 +313,8 @@ Load completed = Memuat selesai.
Loading = Memuat\nSila tunggu...
LoadingFailed = Unable to load data.
Move = Move
Move Down = Move Down
Move Up = Move Up
Network Connection = Network Connection
NEW DATA = DATA BAHARU
No = Tidak
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = OK
Old savedata detected = Old savedata detected
Options = Options
Remove = Remove
Reset = Mula semula
Resize = Resize
Retry = Cuba semula
@@ -528,8 +530,7 @@ Overlay Information = Maklumat pertindihan
Partial Stretch = Partial stretch
Percent of FPS = Percent of FPS
Performance = Prestasi
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Pascapemprosesan Shader
Postprocessing shaders = Pascapemprosesan Shaders
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1042,6 +1043,7 @@ CPU Name = Name
D3DCompiler Version = D3DCompiler version
Debug = Debug
Debugger Present = Debugger present
Depth buffer format = Depth buffer format
Device Info = Device info
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &Pauzeren
Pause When Not Focused = &Pauzeren wanneer venster inactief is
Portrait = Portret
Portrait reversed = Omgekeerd portret
Postprocessing Shader = &Nabewerkingsshader
PPSSPP Forums = &PPSSPP-forum
Record = Opnemen
Record Audio = Audio opnemen
@@ -314,6 +313,8 @@ Load completed = Het laden is voltooid.
Loading = Bezig met laden...\nEen ogenblik geduld.
LoadingFailed = Kan de data niet laden.
Move = Slepen
Move Down = Move Down
Move Up = Move Up
Network Connection = Netwerkverbinding
NEW DATA = NIEUWE DATA
No = Nee
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = OK
Old savedata detected = Oude savedata gedetecteerd
Options = Opties
Remove = Remove
Reset = Herstellen
Resize = Schalen
Retry = Opnieuw
@@ -528,8 +530,7 @@ Overlay Information = Informatie op het scherm
Partial Stretch = Gedeeltelijk uitrekken
Percent of FPS = Percent of FPS
Performance = Prestaties
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Nabewerkingsshader
Postprocessing shaders = Nabewerkingsshaders
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1042,6 +1043,7 @@ CPU Name = Naam
D3DCompiler Version = D3DCompiler version
Debug = Fouten opsporen
Debugger Present = Foutopsporing aanwezig
Depth buffer format = Depth buffer format
Device Info = Apparaatinformatie
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &Pause
Pause When Not Focused = &Pause When Not Focused
Portrait = Portrait
Portrait reversed = Portrait reversed
Postprocessing Shader = Postprocessin&g Shader
PPSSPP Forums = PPSSPP &Forums
Record = &Record
Record Audio = Record &audio
@@ -314,6 +313,8 @@ Load completed = Ferdig lastet.
Loading = Laster\nVent litt...
LoadingFailed = Unable to load data.
Move = Move
Move Down = Move Down
Move Up = Move Up
Network Connection = Network Connection
NEW DATA = NEW DATA
No = Nei
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = OK
Old savedata detected = Old savedata detected
Options = Options
Remove = Remove
Reset = Reset
Resize = Resize
Retry = Retry
@@ -528,8 +530,7 @@ Overlay Information = Overlay information
Partial Stretch = Partial stretch
Percent of FPS = Percent of FPS
Performance = Performance
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Postprocessing shader
Postprocessing shaders = Postprocessing shaders
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1042,6 +1043,7 @@ CPU Name = Name
D3DCompiler Version = D3DCompiler version
Debug = Debug
Debugger Present = Debugger present
Depth buffer format = Depth buffer format
Device Info = Device info
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = Pauza
Pause When Not Focused = Pauzuj, gdy okno nieaktywne
Portrait = Pionowo
Portrait reversed = Odwrócone pionowo
Postprocessing Shader = Efekty wizualne shaderów
PPSSPP Forums = Forum PPSSPP
Record = &Nagrywaj
Record Audio = Nagrywaj &dźwięk
@@ -314,6 +313,8 @@ Load completed = Ładowanie zakończone.
Loading = Ładowanie\nProszę czekać...
LoadingFailed = Nie można wczytać danych.
Move = Przenieś
Move Down = Move Down
Move Up = Move Up
Network Connection = Połączenie sieciowe
NEW DATA = NOWE DANE
No = Nie
@@ -321,6 +322,7 @@ ObtainingIP = Uzyskiwanie adresu IP.\nProszę czekać...
OK = OK
Old savedata detected = Wykryto stary zapis gry
Options = Opcje
Remove = Remove
Reset = Resetuj
Resize = Przeskaluj
Retry = Spróbuj ponownie
@@ -528,8 +530,7 @@ Overlay Information = Nakładka informacyjna
Partial Stretch = Częściowe rozciągnięcie
Percent of FPS = Procent FPS
Performance = Wydajność
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Efekty wizualne shaderów
Postprocessing shaders = Efekty wizualne shaderów
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1042,6 +1043,7 @@ CPU Name = Nazwa
D3DCompiler Version = Wersja D3DCompiler
Debug = Debug
Debugger Present = Debugger obecny
Depth buffer format = Depth buffer format
Device Info = Inf. o urządzeniu
Directories = Directories
Display Color Formats = Display Color Formats
+42 -40
View File
@@ -149,7 +149,7 @@ Refresh Rate = Taxa de atualização
About PPSSPP... = &Sobre o PPSSPP...
Auto = &Auto
Auto Max Quality = Auto-maximizar a &qualidade
Backend = Backend de &renderização (Reinicia o PPSSPP)
Backend = Backend da &renderização (Reinicia o PPSSPP)
Bicubic = &Bi-cúbico
Break = Parar
Break on Load = Parar ao carregar
@@ -159,11 +159,11 @@ Debugging = &Debug
Deposterize = &Deposterizar
Direct3D9 = Direct3D &9
Direct3D11 = Direct3D &11
Disassembly = &Disassembly...
Disassembly = &Fazer Disassembly...
Discord = Discord
Display Layout && Effects = Exibir o editor do esquema...
Display Layout && Effects = Exibir esquema && efeitos...
Display Rotation = Rotação da exibição
Dump Next Frame to Log = D&umpar o frame seguinte no log
Dump Next Frame to Log = D&umpar o frame seguinte no registro
Emulation = &Emulação
Enable Cheats = Ativar &trapaças
Enable Sound = Ativar s&om
@@ -188,7 +188,7 @@ Landscape reversed = Paisagem invertida
Language... = Id&ioma...
Linear = &Linear
Load = &Carregar...
Load .sym File... = Carreg&ar arquivo .sym
Load .sym File... = Carreg&ar arquivo .sym...
Load Map File... = Carregar &arquivo do mapa...
Load State = C&arregar o state
Load State File... = &Carregar arquivo do state...
@@ -196,7 +196,7 @@ Log Console = &Console dos logs
Memory View... = Visualização da &memória...
More Settings... = &Mais configurações...
Nearest = &Mais próximo
Skip Buffer Effects = &Ignorar efeitos do buffer (sem buffer, mais rápido)
Skip Buffer Effects = &Ignorar efeitos do buffer
Off = &Desligado
Open Chat = Abrir Bate-Papo
Open Directory... = Abrir &diretório...
@@ -208,7 +208,6 @@ Pause = &Pausar
Pause When Not Focused = &Pausar quando não focado
Portrait = Retrato
Portrait reversed = Retrato invertido
Postprocessing Shader = Shader de pós-processamento
PPSSPP Forums = Fórums do &PPSSPP
Record = &Gravar
Record Audio = Gravar &áudio
@@ -254,31 +253,31 @@ Current = Atual
Dev Tools = Ferramentas de desenvolvimento
DevMenu = Menu do DEV
Disabled JIT functionality = Funcionalidade do JIT desativada
Draw Frametimes Graph = Desenhar gráfico dos tempos dos frames
Dump Decrypted Eboot = Dumpar EBOOT.BIN decriptado no boot do jogo
Dump next frame to log = Dumpa o próximo frame no log
Draw Frametimes Graph = Desenhar o gráfico dos tempos dos frames
Dump Decrypted Eboot = Dumpar o EBOOT.BIN decriptado na inicialização do jogo
Dump next frame to log = Dumpar o frame seguinte no registro
Enable driver bug workarounds = Ativar soluções alternativas pros bugs dos drivers
Enable Logging = Ativar log do debug
Enable Logging = Ativar o registro do debug
Enter address = Inserir endereço
FPU = FPU
Framedump tests = Testes dos dumps dos frames
Frame Profiler = Analista dos frames
GPU Driver Test = Teste do driver da GPU
GPU Profile = Perfil da GPU
GPU log profiler = Criador do Perfil do Registro da GPU
GPU log profiler = Criador do perfil do registro da GPU
Jit Compare = Comparar JIT
JIT debug tools = Ferramentas de debug do JIT
Log Dropped Frame Statistics = Pôr no log as estátisticas da queda dos frames
Log Level = Nível do log
Log View = Visualização do log
Logging Channels = Canais do log
Log Dropped Frame Statistics = Pôr no registro as estátisticas da queda dos frames
Log Level = Nível do registro
Log View = Visualização do registro
Logging Channels = Canais do registro
Next = Próximo
No block = Nenhum bloco
Prev = Anterior
Random = Aleatório
Replace textures = Substituir texturas
Reset = Resetar
Reset limited logging = Resetar o log limitado
Reset limited logging = Resetar o registro limitado
RestoreDefaultSettings = Você tem certeza que você quer restaurar todas as configurações de volta aos padrões delas?\nAs configurações do mapeamento dos controles não são mudadas.\nVocê não pode desfazer isto.\nPor favor reinicie o PPSSPP para as mudanças terem efeito.
RestoreGameDefaultSettings = Você tem certeza que você quer restaurar as configurações específicas do jogo\nde volta para os padrões do PPSSPP?
Resume = Resumo
@@ -338,6 +337,8 @@ Load completed = Carregamento completado.
Loading = Carregando\nPor favor espere...
LoadingFailed = Incapaz de carregar os dados.
Move = Mover
Move Down = Move Down
Move Up = Move Up
Network Connection = Conexão de rede
NEW DATA = NOVOS DADOS
No = Não
@@ -345,6 +346,7 @@ ObtainingIP = Obtendo endereço de IP.\nPor favor espere...
OK = Ok
Old savedata detected = Dados antigos do save detectados
Options = Opções
Remove = Remove
Reset = Resetar
Resize = Redimensionar
Retry = Tentar de novo
@@ -480,7 +482,7 @@ Aggressive = Agressivo
Alternative Speed = Velocidade alternativa (em %, 0 = ilimitada)
Alternative Speed 2 = Velocidade alternativa 2 (em %, 0 = ilimitada)
Anisotropic Filtering = Filtragem anisotrópica
Aspect Ratio = Aspect Ratio
Aspect Ratio = Proporção do Aspecto
Auto = Auto
Auto (1:1) = Auto (1:1)
Auto (same as Rendering) = Auto (a mesma que a da resolução de renderização)
@@ -490,6 +492,7 @@ Auto Scaling = Auto-redimensionamento
Backend = Backend
Balanced = Balanceado
Bicubic = Bi-cúbico
GPUReadbackRequired = Aviso: Este jogo requer "Ignorar Leituras da GPU" pra ser configurado como Desligado.
Both = Ambos
Buffer graphics commands (faster, input lag) = Buffer dos comandos dos gráficos (mais rápido, atraso na entrada dos dados)
BufferedRenderingRequired = Aviso: Este jogo requer que o "modo de renderização" esteja definido "com buffer".
@@ -500,7 +503,7 @@ Cardboard Screen X Shift = Deslocamento do X (em % do espaço vazio)
Cardboard Screen Y Shift = Deslocamento do Y (em % do espaço vazio)
Cardboard VR Settings = Configurações do Google VR Cardboard
Cheats = Trapaças
CPU Core = Core da CPU
CPU Core = Núcleo da CPU
Debugging = Debugging
DefaultCPUClockRequired = Aviso: Este jogo requer que o clock da CPU esteja definido como padrão.
Deposterize = Deposterizar
@@ -509,7 +512,7 @@ Device = Dispositivo
Direct3D 9 = Direct3D 9
Direct3D 11 = Direct3D 11
Disabled = Desativado
Display Layout && Effects = Exibe o editor dos esquemas
Display Layout && Effects = Exibir esquema && efeitos
Display Resolution (HW scaler) = Resolução da tela (Dimensionador do hardware)
Enable Cardboard VR = Ativa o VR Cardboard
FPS = FPS
@@ -517,8 +520,7 @@ Frame Rate Control = Controle da taxa dos frames
Frame Skipping = Pulo dos frames
Frame Skipping Type = Tipo de pulo dos frames
FullScreen = Tela cheia
Geometry shader culling = Geometry shader culling
GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off.
Geometry shader culling = Abate do shader da geometria
Hack Settings = Configurações dos hacks (pode causar erros gráficos)
Hardware Tessellation = Tesselação por hardware
Hardware Transform = Transformação por hardware
@@ -543,7 +545,7 @@ Must Restart = Você deve reiniciar o PPSSPP pra esta mudança ter efeito.
Native device resolution = Resolução nativa do dispositivo
Nearest = Mais próximo
No buffer = Sem buffer
Skip Buffer Effects = Ignorar efeitos do buffer (sem buffer, mais rápido)
Skip Buffer Effects = Ignorar efeitos do buffer
None = Nenhum
Number of Frames = Número de frames
Off = Desligado
@@ -552,8 +554,7 @@ Overlay Information = Informações da sobreposição
Partial Stretch = Esticamento parcial
Percent of FPS = Porcentagem dos FPS
Performance = Performance
Postprocessing effect = Efeitos de pós-processamento
Postprocessing Shader = Shader de pós-processamento
Postprocessing shaders = Shaders de pós-processamento
Recreate Activity = Recriar atividade
Render duplicate frames to 60hz = Renderizar frames duplicados a 60 Hz
RenderDuplicateFrames Tip = Pode tornar a taxa dos frames mais suave em jogos que executam em taxas de frames menores
@@ -565,15 +566,15 @@ Safe = Seguro
Screen Scaling Filter = Filtro do dimensionamento da tela
Show Debug Statistics = Mostrar estatísticas do debug
Show FPS Counter = Mostrar contador de FPS
Skip GPU Readbacks = Skip GPU Readbacks
Skip GPU Readbacks = Ignorar Leituras da GPU
Software Rendering = Renderização por software (lento)
Software Skinning = Skinning via software
SoftwareSkinning Tip = Combina os desenhos dos modelos de skinning na CPU, mais rápido na maioria dos jogos
Speed = Velocidade
Speed Hacks = Speed Hacks (pode causar erros gráficos)
Stereo display shader = Stereo display shader
Stereo rendering = Stereo rendering
Stretch = Esticamento
Speed Hacks = Hacks de Velocidade (podem causar erros de renderização!)
Stereo display shader = Shader de exbição do estéreo
Stereo rendering = Renderização do estéreo
Stretch = Esticar
Texture Filter = Filtragem das texturas
Texture Filtering = Filtragem das texturas
Texture Scaling = Dimensionamento das texturas
@@ -587,7 +588,7 @@ Upscale Type = Tipo de ampliação
UpscaleLevel Tip = Pesado pra CPU - alguns dimensionamentos podem ser atrasados pra evitar travamentos
Use all displays = Usar todas as telas
Vertex Cache = Cache do vértice
VertexCache Tip = Mais rápido, mas pode causar tremulação temporária
VertexCache Tip = Mais rápido mas pode causar tremulação temporária
VSync = VSync
Vulkan = Vulkan
Window Size = Tamanho da janela
@@ -621,7 +622,7 @@ Browse = Procurar...
Buy PPSSPP Gold = Comprar o PPSSPP Gold
Choose folder = Escolher pasta
Credits = Créditos
PPSSPP Homebrew Store = Armazém dos Homebrews do PPSSPP
PPSSPP Homebrew Store = Loja dos Homebrews do PPSSPP
Exit = Sair
Game Settings = Configurações
Games = Jogos
@@ -744,9 +745,9 @@ Bottom Right = A direita do rodapé
Center Left = Centralizar a esquerda
Center Right = Centralizar a direita
Change Mac Address = Mudar o endereço do MAC
ChangeMacSaveConfirm = Gerar um novo endereço pro MAC?
ChangeMacSaveWarning = Alguns jogos verificam o endereço do MAC quando carregam os dados do save então isto pode quebrar os saves antigos.
Change proAdhocServer Address = Mudar o endereço de IP do servidor Ad Hoc PRO (localhost = múltiplas instâncias)
ChangeMacSaveConfirm = Generate a new MAC address?
ChangeMacSaveWarning = Some games verify the MAC address when loading savedata, so this may break old saves.
Chat = Bate-papo
Chat Button Position = Posição do botão de bate-papo
Chat Here = Bata-papo aqui
@@ -827,13 +828,13 @@ Bloom = Bloom
Brightness = Brilho
Cartoon = Cartoon
ColorCorrection = Correção das cores
ColorPreservation = Color preservation
ColorPreservation = Preservação das cores
Contrast = Contraste
CRT = Scanlines do CRT
FXAA = Anti-aliasing do FXAA
Gamma = Gama
Grayscale = Tons de cinza
GreenLevel = GreenLevel
GreenLevel = Nível verde
Intensity = Intensidade
InverseColors = Cores invertidas
Natural = Cores naturais
@@ -841,11 +842,11 @@ NaturalA = Cores naturais (sem borrão)
Off = Desligado
Power = Energia
PSPColor = Cor do PSP
RedBlue = Red/Blue glasses
RedBlue = Óculos Vermelhos/Azuis
Saturation = Saturação
Scanlines = Scanlines (CRT)
Sharpen = Aprimorado
SideBySide = Side by side (SBS)
SideBySide = Lado a lado (SBS)
SSAA(Gauss) = Super-amostragem do AA (Gauss)
Tex4xBRZ = 4xBRZ
TexMMPX = MMPX
@@ -1059,6 +1060,7 @@ CPU Name = Nome
D3DCompiler Version = Versão do compilador D3D
Debug = Debug
Debugger Present = Debugger presente
Depth buffer format = Depth buffer format
Device Info = Informação do dispositivo
Directories = Diretórios
Display Information = Informação da tela
@@ -1110,8 +1112,6 @@ AVI Dump started. = Dump do AVI iniciado
AVI Dump stopped. = Dump do AVI parado
Cache ISO in RAM = Pôr a ISO inteira na RAM
Change CPU Clock = Mudar o clock da CPU do PSP emulado (instável)
Game crashed = Game crashed
Language = Idioma
Memory Stick folder = Pasta do cartão de memória
Memory Stick size = Tamanho do cartão de memória
Change Nickname = Mudar apelido
@@ -1144,6 +1144,7 @@ Fast Memory = Memória rápida (instável)
Floating symbols = Símbolos flutuantes
Force real clock sync (slower, less lag) = Forçar sincronização com o relógio real (mais lento, menos atrasos)
frames, 0:off = frames, 0 = Desligado
Game crashed = O jogo teve um crash
Games list settings = Configurações da lista de jogos
General = Geral
Grid icon size = Tamanho do ícone da grade
@@ -1154,6 +1155,7 @@ Increase size = Aumentar tamanho
Interpreter = Interpretador
IO timing method = Método de cronometragem da E/S
IR Interpreter = Interpretador do IR
Language = Idioma
Memory Stick Folder = Pasta do cartão de memória
Memory Stick inserted = Cartão de memória inserido
MHz, 0:default = MHz, 0 = padrão
+5 -3
View File
@@ -208,7 +208,6 @@ Pause = &Pausar
Pause When Not Focused = &Pausar quando não focado
Portrait = Retrato
Portrait reversed = Retrato invertido
Postprocessing Shader = Shader de Pós-Processamento
PPSSPP Forums = Fórums do &PPSSPP
Record = &Gravar
Record Audio = Gravar &Áudio
@@ -338,6 +337,8 @@ Load completed = Carregamento completado.
Loading = Carregando\nPor favor espere...
LoadingFailed = Incapaz de carregar os dados.
Move = Mover
Move Down = Move Down
Move Up = Move Up
Network Connection = Conexão de rede
NEW DATA = NOVOS DADOS
No = Não
@@ -345,6 +346,7 @@ ObtainingIP = Obtendo o Endereço de IP.\nPor favor espere...
OK = Ok
Old savedata detected = Dados antigos do save detectados
Options = Opções
Remove = Remove
Reset = Reiniciar
Resize = Redimensionar
Retry = Tentar de novo
@@ -552,8 +554,7 @@ Overlay Information = Informações da sobreposição
Partial Stretch = Esticamento Parcial
Percent of FPS = Percentagem dos FPS
Performance = Performance
Postprocessing effect = Efeitos de Pós-Processamento
Postprocessing Shader = Shader de Pós-Processamento
Postprocessing shaders = Shaders de Pós-Processamento
Recreate Activity = Recriar atividade
Render duplicate frames to 60hz = Renderizar quadros duplicados a 60 Hz
RenderDuplicateFrames Tip = Pode tornar a taxa dos quadros mais suave em jogos que executam em taxas de quadros menores
@@ -1059,6 +1060,7 @@ CPU Name = Nome
D3DCompiler Version = Versão do compilador D3D
Debug = Debug
Debugger Present = Depurador presente
Depth buffer format = Depth buffer format
Device Info = Informação do dispositivo
Directories = Diretórios
Display Information = Informação da tela
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &Pause
Pause When Not Focused = &Pause When Not Focused
Portrait = Portrait
Portrait reversed = Portrait reversed
Postprocessing Shader = Postprocessin&g Shader
PPSSPP Forums = PPSSPP &Forums
Record = &Record
Record Audio = Record &audio
@@ -314,6 +313,8 @@ Load completed = Încărcare Completă
Loading = Se încarcă\nAșteptați...
LoadingFailed = Nu s-au putut încărca datele.
Move = Mișcă
Move Down = Move Down
Move Up = Move Up
Network Connection = Conexiune la rețea
NEW DATA = DATE NOI
No = Nu
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = OK
Old savedata detected = Date vechi salvate detectate
Options = Options
Remove = Remove
Reset = Resetare
Resize = Modificare marime
Retry = Reîncearcă
@@ -528,8 +530,7 @@ Overlay Information = Informație suprapusă
Partial Stretch = Partial stretch
Percent of FPS = Percent of FPS
Performance = Performanță
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Shader postprocesare
Postprocessing shaders = Shaders postprocesare
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1042,6 +1043,7 @@ CPU Name = Name
D3DCompiler Version = D3DCompiler version
Debug = Debug
Debugger Present = Debugger present
Depth buffer format = Depth buffer format
Device Info = Device info
Directories = Directories
Display Color Formats = Display Color Formats
+4 -3
View File
@@ -184,7 +184,6 @@ Pause = &Пауза
Pause When Not Focused = &Пауза, когда окно не в фокусе
Portrait = Портретная
Portrait reversed = Портретная (перевернутая)
Postprocessing Shader = &Постобработка (шейдер)
PPSSPP Forums = &Форум PPSSPP
Record = &Запись
Record Audio = Запись &звука
@@ -314,6 +313,8 @@ Load completed = Загрузка завершена
Loading = Загрузка\nПожалуйста, подождите...
LoadingFailed = Невозможно загрузить даные.
Move = Положение
Move Down = Move Down
Move Up = Move Up
Network Connection = Сетевое подключение
NEW DATA = Новое сохранение
No = Нет
@@ -321,6 +322,7 @@ ObtainingIP = Получение IP-адреса.\nПожалуйста, под
OK = OK
Old savedata detected = Старый формат сохранений обнаружен
Options = Опции
Remove = Remove
Reset = Сбросить
Resize = Размер
Retry = Снова
@@ -528,8 +530,7 @@ Overlay Information = Информация в оверлее
Partial Stretch = Частичное растягивание
Percent of FPS = Процент от FPS
Performance = Производительность
Postprocessing effect = Эффекты постобработки
Postprocessing Shader = Постобработка (шейдер)
Postprocessing shaders = Постобработка (шейдер)
Recreate Activity = Создать активность заново
Render duplicate frames to 60hz = Рендеринг дублирующихся кадров до 60 Гц
RenderDuplicateFrames Tip = Может сгладить частоту кадров в тех играх, где она низкая
+57 -55
View File
@@ -1,7 +1,7 @@
[Audio]
Alternate speed volume = Volym vid alternativ hastighet
Audio backend = Uppspelningsteknik (ändring kräver omstart!)
Audio Error = Audio Error
Audio Error = Ljudfel
AudioBufferingForBluetooth = Bluetooth-friendly buffer (slower)
Auto = Auto
Device = Enhet
@@ -31,12 +31,12 @@ Auto-rotation speed = Auto-rotation speed
Auto-switch = Auto-switch
Base tilt position = Base tilt position
Binds = Binds
Button Binding = Button Binding
Button Binding = Knapp-bindning
Button Opacity = Knappgenomskinlighet
Button style = Knappstil
Calibrate Analog Stick = Kalibrera analog styrspak
Calibrate D-Pad = Kalibrera D-pad
Calibrated = Calibrated
Calibrated = Kalibrerad
Calibration = Kalibrering
Circular stick input = Circular stick input
Classic = Klassisk
@@ -49,13 +49,13 @@ Customize tilt = Anpassa tilt...
D-PAD = D-Pad
Deadzone radius = Deadzone-radie
Disable D-Pad diagonals (4-way touch) = Slå av D-Pad-diagonaler (4-vägs touch)
Disable diagonal input = Disable diagonal input
Disable diagonal input = Blockera diagonal input
Double tap = Double tap
Enable gesture control = Enable gesture control
Enable gesture control = Get-kontroll
Enable standard shortcut keys = Enable standard shortcut keys
Gesture = Gesture
Gesture mapping = Gesture mapping
Glowing borders = Glowing borders
Gesture mapping = Gest-mappning
Glowing borders = Lysande kanter
HapticFeedback = Haptic feedback (vibration)
Hide touch analog stick background circle = Hide touch analog stick background circle
Icon = Icon
@@ -83,7 +83,7 @@ Portrait Reversed = Porträtt omvänt
PSP Action Buttons = PSP action-knappar
Raw input = Raw input
Repeat mode = Repeat mode
Reset to defaults = Reset to defaults
Reset to defaults = Återställ till standardvärden
Screen aligned to ground = Screen aligned to ground
Screen at right angle to ground = Screen at right angle to ground
Screen Rotation = Skärmrotation
@@ -93,8 +93,8 @@ Sensitivity = Känslighet
Shape = Shape
Show Touch Pause Menu Button = Show Touch Pause Menu Button
Swipe = Swipe
Swipe sensitivity = Swipe sensitivity
Swipe smoothing = Swipe smoothing
Swipe sensitivity = Swipe-känslighet
Swipe smoothing = Swipe-utjämning
Thin borders = Tunna kanter
Tilt Base Radius = Tilt base radius
Tilt Input Type = Lutningstyp
@@ -139,7 +139,7 @@ Disassembly = Disassemblera
Discord = Discord
Display Layout && Effects = Skärmlayout && effekter...
Display Rotation = Skärmrotation
Dump Next Frame to Log = Dump Next Frame to Log
Dump Next Frame to Log = Dumpa nästa frame till loggen
Emulation = Emulering
Enable Cheats = Fusk
Enable Sound = Ljud
@@ -147,7 +147,7 @@ Exit = Avsluta
Extract File... = Extrahera fil...
File = Arkiv
Frame Skipping = Frameskipping
Frame Skipping Type = Frame skipping type
Frame Skipping Type = Typ av frame-skippning
Fullscreen = Fullskärm
Game Settings = Inställningar
GE Debugger... = GE Debugger...
@@ -172,9 +172,9 @@ Log Console = Loggkonsol
Memory View... = Minnesvy...
More Settings... = Mer inställningar...
Nearest = Nearest
Skip Buffer Effects = &Skip buffer effects
Skip Buffer Effects = &Skippa buffereffekter
Off = Off
Open Chat = Open Chat
Open Chat = Öppna chat
Open Directory... = Öppna mapp...
Open from MS:/PSP/GAME... = Öppna från MS:/PSP/GAME...
Open Memory Stick = Öppna Memory Stick
@@ -184,7 +184,6 @@ Pause = Paus
Pause When Not Focused = Pausa vid tappat fokus
Portrait = Porträtt
Portrait reversed = Porträtt omvänt
Postprocessing Shader = Postprocessing Shader
PPSSPP Forums = PPSSPP-forum
Record = &Record
Record Audio = Record &audio
@@ -229,11 +228,11 @@ Create/Open textures.ini file for current game = Create/Open textures.ini file f
Current = Aktuellt
Dev Tools = Development tools
DevMenu = DevMenu
Disabled JIT functionality = Disabled JIT functionality
Draw Frametimes Graph = Draw frametimes graph
Disabled JIT functionality = Avstängd JIT-funktionalitet
Draw Frametimes Graph = Rita upp graf över frame-tider
Dump Decrypted Eboot = Dumpa decrypterad EBOOT.BIN när spelet startar
Dump next frame to log = Dumpa nästa frame till log
Enable driver bug workarounds = Enable driver bug workarounds
Enable driver bug workarounds = Tillåt workarounds för drivrutins-buggar
Enable Logging = Debugloggning
Enter address = Address
FPU = FPU
@@ -269,15 +268,15 @@ Texture ini file created = Texture ini file created
Texture Replacement = Ersätt texturer
Toggle Audio Debug = Toggla audio debug
Toggle Freeze = Toggla freeze
Touchscreen Test = Touchscreen test
Touchscreen Test = Touchskärm-test
VFPU = VFPU
[Dialog]
* PSP res = * PSP res
Active = Active
Active = Aktiv
Back = Tillbaka
Cancel = Avbryt
Center = Center
Center = Centrera
ChangingGPUBackends = PPSSPP måste starta om för att byta GPU-backend. Vill du starta om nu?
ChangingInflightFrames = Changing graphics command buffering requires PPSSPP to restart. Restart now?
Channel: = Channel:
@@ -285,12 +284,12 @@ Choose PPSSPP save folder = Välj folder att spara i
Confirm Overwrite = Vill du skriva över datan?
Confirm Save = Vill du spara denna data?
ConfirmLoad = Ladda denna data?
ConnectingAP = Connecting to the access point.\nPlease wait...
ConnectingPleaseWait = Connecting.\nPlease wait...
ConnectionName = Connection name
Corrupted Data = Corrupted data
Delete = Ta bort
Delete all = Ta bort allt
ConnectingAP = Kopplar upp till acceesspunkten.\nVänta...
ConnectingPleaseWait = Kopplar upp.\nVänta...
ConnectionName = Uppkopplingsnamn
Corrupted Data = Korrupt data
Delete = Radera
Delete all = Radera allt
Delete completed = Borttaget.
DeleteConfirm = All sparad data tas bort.\nÄr du säker på att du vill göra detta?
DeleteConfirmAll = Vill du verkligen ta bort all\nsparad data för spelet?
@@ -307,20 +306,23 @@ Filter = Filter
Finish = Färdig
GE Frame Dumps = GE Frame Dumps
Grid = Grid
Inactive = Inactive
InternalError = An internal error has occurred.
Inactive = Inaktiv
InternalError = Ett internt fel har upptäckts.
Load = Ladda
Load completed = Laddat.
Loading = Laddar\nVänta...
LoadingFailed = Kunde inte ladda data.
Move = Flytta
Move Down = Flytta ner
Move Up = Flytta upp
Network Connection = Nätverksuppkoppling
NEW DATA = NY DATA
No = Nej
ObtainingIP = Obtaining IP address.\nPlease wait...
OK = OK
Old savedata detected = Old savedata detected
Options = Options
Old savedata detected = Gammal savedata upptäckt
Options = Inställningar
Remove = Ta bort
Reset = Återställ
Resize = Ändra storlek
Retry = Försök igen
@@ -328,7 +330,7 @@ Save = Spara
Save completed = Sparat.
Saving = Sparar\nVänta...
SavingFailed = Kunde inte spara data.
Search = Search
Search = Sök
Select = Välj
Shift = Skift
Skip = Skip
@@ -336,20 +338,20 @@ Snap = Snap
Space = Mellanslag
SSID = SSID
Submit = Skicka
Supported = Supported
Supported = Stödd
There is no data = Det finns ingen data.
Toggle All = Vänd alla
Toggle List = Toggle list
Unsupported = Unsupported
Unsupported = Stöds ej
When you save, it will load on a PSP, but not an older PPSSPP = When you save, it will load on a PSP, but not an older PPSSPP
When you save, it will not work on outdated PSP Firmware anymore = When you save, it will not work on outdated PSP firmware anymore
Yes = Ja
Zoom = Zoom
Zoom = Zooma
[Error]
7z file detected (Require 7-Zip) = file is compressed (7z).\nPlease decompress first (try 7-Zip or WinRAR).
A PSP game couldn't be found on the disc. = A PSP game couldn't be found on the disc.
Cannot boot ELF located outside mountRoot. = Cannot boot ELF located outside mountRoot.
A PSP game couldn't be found on the disc. = Kunde inte hitta ett PSP-spel på skivavbildningen.
Cannot boot ELF located outside mountRoot. = Kan inte boota en ELF som ligger utanför mountRoot.
Could not save screenshot file = Misslyckades spara skärmdump.
D3D9or11 = Direct3D 9? (or "no" for Direct3D 11)
D3D11CompilerMissing = D3DCompiler_47.dll saknas. Installera, eller tryck Ja för att försöka igen med Direct3D 9 istället.
@@ -372,7 +374,7 @@ GenericOpenGLError = Failed initializing graphics. Try upgrading your graphics d
GenericVulkanError = Failed initializing graphics. Try upgrading your graphics drivers.\n\nWould you like to try switching to OpenGL?\n\nError message:
InsufficientOpenGLDriver = Otillräckligt OpenGL-stöd detekterat!\n\nYour GPU reports that it does not support OpenGL 2.0. Would you like to try using DirectX instead?\n\nDirectX is currently compatible with less games, but on your GPU it may be the only choice.\n\nVisit the forums at https://forums.ppsspp.org for more information.\n\n
Just a directory. = Endast en katalog.
Missing key = Missing key
Missing key = Nyckel saknas
MsgErrorCode = Error code:
MsgErrorSavedataDataBroken = Save data was corrupt.
MsgErrorSavedataMSFull = Memory Stick full. Check your storage space.
@@ -405,7 +407,7 @@ ZIP file detected (Require WINRAR) = file is compressed (ZIP).\nPlease decompres
[Game]
Asia = Asia
Calculate CRC = Calculate CRC
Calculate CRC = Räkna ut CRC
ConfirmDelete = Ta bort
Create Game Config = Skapa spelconfig
Create Shortcut = Skapa genväg
@@ -490,11 +492,11 @@ Display Resolution (HW scaler) = Skärmupplösning (HW scaler)
Enable Cardboard VR = Enable Cardboard VR
FPS = FPS
Frame Rate Control = Framerate-kontroll
Frame Skipping = Frameskipping
Frame Skipping = Frame-skipping
Frame Skipping Type = Frame skipping type
FullScreen = Fullskärm
Geometry shader culling = Geoshader-klippning
GPUReadbackRequired = Warning: This game requires "Skip GPU Readbacks" to be set to Off.
GPUReadbackRequired = Varning: Detta spel kräver att 'Skippa dataläsningar från GPU:n' är avstängt.
Hack Settings = Hack-inställningar (kan orsaka problem)
Hardware Tessellation = Hårdvarutessellering
Hardware Transform = Hårdvarutransform
@@ -518,7 +520,7 @@ Mode = Mode
Must Restart = Starta om PPSSPP för att ändringen ska få effekt.
Native device resolution = Native device resolution
Nearest = Närmast
No buffer = No buffer
No buffer = Ingen buffer
Skip Buffer Effects = Skippa buffereffekter (snabbare, risk för fel)
None = Inget
Number of Frames = Antal frames
@@ -528,14 +530,13 @@ Overlay Information = Overlay-information
Partial Stretch = Partial stretch
Percent of FPS = Procent av FPS
Performance = Prestanda
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Postprocessing-Shader
Postprocessing shaders = Postprocessing-Shaders
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
Rendering Mode = Renderingsläge
Rendering Resolution = Renderingsupplösning
RenderingMode NonBuffered Tip = Faster, but nothing may draw in some games
RenderingMode NonBuffered Tip = Snabbare, men grafik kan gå sönder
Rotation = Rotation
Safe = Safe
Screen Scaling Filter = Skärmskalningsfilter
@@ -549,7 +550,7 @@ Speed = Hastighet
Speed Hacks = Speed-hacks (kan orsaka renderingsproblem)
Stereo display shader = Stereo display shader
Stereo rendering = Stereo-rendering
Stretch = Stretch
Stretch = Sträck ut
Texture Filter = Texturfilter
Texture Filtering = Texturfiltrering
Texture Scaling = Texturskalning
@@ -622,7 +623,7 @@ Audio = Ljud
Controls = Kontroll
Graphics = Grafik
Networking = Nätverk
Search = Search
Search = Sök
System = System
Tools = Verktyg
@@ -994,15 +995,15 @@ LoadStateWrongVersion = Misslyckades ladda state: Savestate is for an older vers
norewind = No rewind save states available.
Playing = Playing
PressESC = Tryck ESC för att öppna pausemenyn.
replaceTextures_false = Textures no longer are being replaced.
replaceTextures_true = Texture replacement is enabled.
replaceTextures_false = Texturer ersätts inte längre.
replaceTextures_true = Textur-ersättning är igång.
Save State Failed = Misslyckades spara state!
Saved State = State sparat
saveNewTextures_false = Texture saving was disabled.
saveNewTextures_true = Textures will now be saved to your storage.
SpeedCustom2 = Speed: alternate 2
SpeedCustom2 = Speed: alternativ 2
standard = Hastighet: standard
State load undone = State load undone
State load undone = State load ogjort
Untitled PSP game = Untitled PSP game
[Search]
@@ -1042,6 +1043,7 @@ CPU Name = Name
D3DCompiler Version = D3DCompiler version
Debug = Debug
Debugger Present = Debugger present
Depth buffer format = Depth buffer format
Device Info = Device info
Directories = Directories
Display Color Formats = Display Color Formats
@@ -1096,7 +1098,7 @@ Color Saturation = Färgmättnad
Color Tint = Färgförskjutning
Error: load undo state is from a different game = Error: load undo state is from a different game
Failed to load state for load undo. Error in the file system. = Failed to load state for load undo. Error in the file system.
Floating symbols = Floating symbols
Floating symbols = Flytande symboler
Game crashed = Game crashed
Memory Stick folder = Memory Stick-mapp
Memory Stick size = Memory Stick-storlek
@@ -1139,7 +1141,7 @@ IO timing method = IO-timingsmetod
IR Interpreter = IR interpreter
Language = Språk
Memory Stick Folder = Memory Stick-mapp
Memory Stick inserted = Memory Stick insatt
Memory Stick inserted = Memory Stick isatt
MHz, 0:default = MHz, 0 = standard
MMDDYYYY = MMDDYYYY
Moving background = Rörlig bakgrund
@@ -1180,7 +1182,7 @@ Sustained performance mode = Sustained performance mode
Theme = Tema
Time Format = Tidsformat
UI = Användargränssnitt
UI background animation = UI background animation
UI background animation = Bakgrundsanimering
UI Sound = Ljud i användargränssnittet
undo %c = backup %c
USB = USB
@@ -1192,7 +1194,7 @@ Use X to confirm = Använd X för att bekräfta
VersionCheck = Kolla efter nya versioner av PPSSPP
WARNING: Android battery save mode is on = WARNING: Android battery save mode is On
WARNING: Battery save mode is on = WARNING: Battery save mode is on
Waves = Waves
Waves = Vågor
YYYYMMDD = YYYYMMDD
[TextureShaders]
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = Pause
Pause When Not Focused = Ihinto kapag hindi naka pokus
Portrait = Patayo
Portrait reversed = Pabaliktad na patayo
Postprocessing Shader = Postprocessing Shader
PPSSPP Forums = PPSSPP Forums
Record = Record
Record Audio = Record audio
@@ -314,6 +313,8 @@ Load completed = Kumpletong na-i load.
Loading = Sandali lamang...
LoadingFailed = Loading ng datos ay pumalya.
Move = Galawin
Move Down = Move Down
Move Up = Move Up
Network Connection = Network Connection
NEW DATA = BAGONG DATOS
No = Hindi
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = Sige
Old savedata detected = Nahanap ang lumang savedata
Options = Options
Remove = Remove
Reset = Ibalik
Resize = Resize
Retry = Ulitin
@@ -528,8 +530,7 @@ Overlay Information = Overlay na impormasyon
Partial Stretch = Parsiyal na unatin
Percent of FPS = Porsiyento ng FPS
Performance = Performance
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Postprocessing shader
Postprocessing shaders = Postprocessing shaders
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1042,6 +1043,7 @@ CPU Name = Name
D3DCompiler Version = D3DCompiler version
Debug = Debug
Debugger Present = Debugger present
Depth buffer format = Depth buffer format
Device Info = Device info
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = หยุดชั่วคราว
Pause When Not Focused = หยุดชั่วคราวเมื่อไม่ได้เล่น
Portrait = แนวตั้ง
Portrait reversed = แนวตั้งกลับด้าน
Postprocessing Shader = กระบวนการทำงานปรับเฉดแสงสี
PPSSPP Forums = เว็บ PPSSPP Forums
Record = การอัดบันทึก
Record Audio = อัดบันทึกเสียง
@@ -314,6 +313,8 @@ Load completed = โหลดข้อมูลสำเร็จ
Loading = กำลังโหลด\nโปรดรอ...
LoadingFailed = ไม่สามารถโหลดข้อมูลนี้ได้
Move = ย้าย
Move Down = Move Down
Move Up = Move Up
Network Connection = การเชื่อมต่อเครือข่าย
NEW DATA = ข้อมูลใหม่
No = ไม่ใช่
@@ -321,6 +322,7 @@ ObtainingIP = กำลังรับไอพี\nโปรดรอสัก
OK = ตกลง
Old savedata detected = ตรวจพบข้อมูลเซฟเก่า
Options = ตัวเลือก
Remove = Remove
Reset = ตั้งค่าใหม่
Resize = ขนาด
Retry = ลองใหม่
@@ -528,8 +530,7 @@ Overlay Information = การแสดงข้อมูลซ้อนทั
Partial Stretch = แนวตั้งดึงเต็มจอ
Percent of FPS = อิงจากเปอร์เซ็นต์เฟรมต่อวิ
Performance = ประสิทธิภาพ
Postprocessing effect = กระบวนการทำงานปรับเอฟเฟ็คท์
Postprocessing Shader = กระบวนการทำงานปรับเฉดแสงสี
Postprocessing shaders = กระบวนการทำงานปรับเฉดแสงสี
Recreate Activity = สร้างกิจกรรมใหม่
Render duplicate frames to 60hz = แสดงผลเฟรมซ้ำให้ถึง 60 เฮิร์ตซ
RenderDuplicateFrames Tip = ช่วยให้ภาพดูลื่นตาขึ้น ในเกมที่ใช้เฟรมเรทต่ำ
@@ -1042,6 +1043,7 @@ CPU Name = ชื่อหน่วยประมวลผลหลัก
D3DCompiler Version = เวอร์ชั่นตัวคอมไพล์ของ D3D
Debug = แก้ไขบั๊ก
Debugger Present = ตัวช่วยแก้ไขบั๊ก
Depth buffer format = Depth buffer format
Device Info = ข้อมูลอุปกรณ์
Directories = เส้นทางเก็บข้อมูล
Display Color Formats = รูปแบบสีของหน้าจอแสดงผล
+5 -3
View File
@@ -186,7 +186,6 @@ Pause = PPSSPP Menüsü
Pause When Not Focused = &Başka programa geçildiğinde duraklat
Portrait = Dikey
Portrait reversed = Ters Dikey
Postprocessing Shader = Postprocessin&g Shader
PPSSPP Forums = PPSSPP Forumları
Record = Kayıt
Record Audio = Ses Kaydet
@@ -316,6 +315,8 @@ Load completed = Yükleme tamamlandı.
Loading = Yükleniyor\nLütfen Bekleyin...
LoadingFailed = Veri yüklenemedi.
Move = Taşı
Move Down = Move Down
Move Up = Move Up
Network Connection = Ağ Bağlantısı
NEW DATA = YENİ VERİ
No = Hayır
@@ -323,6 +324,7 @@ ObtainingIP = IP adresi alınıyor.\nLütfen bekleyin...
OK = Tamam
Old savedata detected = Eski kayıt bulundu.
Options = Ayarlar
Remove = Remove
Reset = Sıfırla
Resize = Yeniden Boyutlandır
Retry = Yeniden Dene
@@ -530,8 +532,7 @@ Overlay Information = Ek Bilgi
Partial Stretch = Tam ekran (kısmi sünme)
Percent of FPS = FPS yüzdesi
Performance = Performans
Postprocessing effect = Postprocessing efektleri
Postprocessing Shader = Postprocessing gölgelendiricisi
Postprocessing shaders = Postprocessing gölgelendiricisi
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Yinelenen kareleri 60Hz'de işleyin
RenderDuplicateFrames Tip = Daha düşük kare hızlarında çalışan oyunlarda kare hızını düzeltebilir
@@ -1043,6 +1044,7 @@ CPU Name = Ad
D3DCompiler Version = D3DCompiler sürümü
Debug = Hata Ayıklama
Debugger Present = Hata ayıklayıcı var
Depth buffer format = Depth buffer format
Device Info = Cihaz bilgisi
Directories = Dizinler
Display Color Formats = Renk Biçimlerini Görüntüle
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = &Пауза
Pause When Not Focused = &Пауза коли вікно не в фокусі
Portrait = Портретне
Portrait reversed = Портретна (перевернуто)
Postprocessing Shader = &Подальша обробка (шейдер)
PPSSPP Forums = &Форум PPSSPP
Record = &Запис
Record Audio = Запис &аудіо
@@ -314,6 +313,8 @@ Load completed = Завантаження завершене
Loading = Завантаження\nБудь ласка, зачекайте...
LoadingFailed = Не вдалося завантажити дані.
Move = Положення
Move Down = Move Down
Move Up = Move Up
Network Connection = Підключення до мережі
NEW DATA = Нове збереження
No = Ні
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = OK
Old savedata detected = Виявлено старий формат збережень
Options = Опції:
Remove = Remove
Reset = Скинути
Resize = Розмір
Retry = Повторити
@@ -528,8 +530,7 @@ Overlay Information = Інформація про накладення
Partial Stretch = Часткове розтягнення
Percent of FPS = Відсоток FPS
Performance = Продуктивність
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Шейдери
Postprocessing shaders = &Подальша обробка (шейдер)
Recreate Activity = Відтворити діяльність
Render duplicate frames to 60hz = Відображення повторюваних кадрів до 60 Гц
RenderDuplicateFrames Tip = Можна зробити більш плавний кадр в іграх, які працюють у нижчих кадрах
@@ -1042,6 +1043,7 @@ CPU Name = Назва
D3DCompiler Version = Версія D3DCompiler
Debug = Налагодження
Debugger Present = Присутній налагоджувач
Depth buffer format = Depth buffer format
Device Info = Інформація про пристрій
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = Tạm dừng
Pause When Not Focused = Dừng trò chơi khi "ko tập trung"
Portrait = Chiều dọc
Portrait reversed = Chiều dọc đảo ngược
Postprocessing Shader = Xử lý hậu đổ bóng
PPSSPP Forums = Diễn đàn PPSSPP
Record = Ghi lại
Record Audio = Ghi âm thanh
@@ -314,6 +313,8 @@ Load completed = Đã load xong.
Loading = Đang load\nXin đợi...
LoadingFailed = Không thể load dữ liệu này.
Move = Di chuyển
Move Down = Move Down
Move Up = Move Up
Network Connection = Kết nối mạng
NEW DATA = DỮ LIỆU MỚI
No = Không
@@ -321,6 +322,7 @@ ObtainingIP = Obtaining IP address.\nPlease wait...
OK = OK
Old savedata detected = Phát hiện dữ liệu cũ
Options = Tùy chọn
Remove = Remove
Reset = Mặc định
Resize = Thay đổi kích thước
Retry = Thử lại
@@ -528,8 +530,7 @@ Overlay Information = Hiển thị thông tin trên màn hình
Partial Stretch = Từng phần dãn ra
Percent of FPS = Percent of FPS
Performance = Hiệu năng
Postprocessing effect = Postprocessing effects
Postprocessing Shader = Xử lý hậu đổ bóng
Postprocessing shaders = Xử lý hậu đổ bóng
Recreate Activity = Recreate activity
Render duplicate frames to 60hz = Render duplicate frames to 60 Hz
RenderDuplicateFrames Tip = Can make framerate smoother in games that run at lower framerates
@@ -1042,6 +1043,7 @@ CPU Name = Tên
D3DCompiler Version = D3DCompiler version
Debug = Debug
Debugger Present = Debugger present
Depth buffer format = Depth buffer format
Device Info = Thông tin thiết bị
Directories = Directories
Display Color Formats = Display Color Formats
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = 暂停 (&P)
Pause When Not Focused = 后台运行时自动暂停 (&P)
Portrait = 纵向
Portrait reversed = 纵向反转
Postprocessing Shader = 后处理着色器 (&g)
PPSSPP Forums = PPSSPP官方论坛 (&F)
Record = 录制 (&R)
Record Audio = 录制音频 (&A)
@@ -314,6 +313,8 @@ Load completed = 已载入。
Loading = 载入中\n请稍候...
LoadingFailed = 无法载入存档。
Move = 移动
Move Down = Move Down
Move Up = Move Up
Network Connection = 网络连接
NEW DATA = 新建存档
No = 否
@@ -321,6 +322,7 @@ ObtainingIP = 获取IP地址.\n请稍候...
OK = 确定
Old savedata detected = 检测到旧版本的存档数据
Options = 选项
Remove = Remove
Reset = 重置
Resize = 调整大小
Retry = 重试
@@ -528,8 +530,7 @@ Overlay Information = 叠加信息
Partial Stretch = 部分拉伸
Percent of FPS = 帧率的百分比
Performance = 性能
Postprocessing effect = 滤镜效果
Postprocessing Shader = 后处理着色器
Postprocessing shaders = 后处理着色器
Recreate Activity = 重建进程
Render duplicate frames to 60hz = 渲染重复帧至60Hz
RenderDuplicateFrames Tip = 在较低帧率的游戏中可以使帧速率更平滑
@@ -1036,6 +1037,7 @@ CPU Name = CPU 名称
D3DCompiler Version = D3DCompiler版本
Debug = 调试
Debugger Present = 调试器已连接
Depth buffer format = Depth buffer format
Device Info = 设备信息
Directories = 路径
Display Color Formats = 显示颜色格式
+5 -3
View File
@@ -184,7 +184,6 @@ Pause = 暫停 (&P)
Pause When Not Focused = 未聚焦時暫停 (&P)
Portrait = 直向
Portrait reversed = 直向反轉
Postprocessing Shader = 後處理著色器 (&G)
PPSSPP Forums = PPSSPP 論壇 (&F)
Record = 錄製 (&R)
Record Audio = 錄製音訊 (&A)
@@ -314,6 +313,8 @@ Load completed = 載入完成
Loading = 正在載入\n請稍候…
LoadingFailed = 無法載入資料
Move = 移動
Move Down = Move Down
Move Up = Move Up
Network Connection = 網路連線
NEW DATA = 新存檔
No = 否
@@ -321,6 +322,7 @@ ObtainingIP = 正在取得 IP 位址\n請稍候…
OK = 確定
Old savedata detected = 偵測到舊版存檔資料
Options = 選項
Remove = Remove
Reset = 重設
Resize = 調整大小
Retry = 重試
@@ -528,8 +530,7 @@ Overlay Information = 覆疊資訊
Partial Stretch = 部分延展
Percent of FPS = FPS 百分比
Performance = 效能
Postprocessing effect = 後處理效果
Postprocessing Shader = 後處理著色器
Postprocessing shaders = 後處理著色器
Recreate Activity = 重新建立活動
Render duplicate frames to 60hz = 轉譯重複影格至 60 Hz
RenderDuplicateFrames Tip = 可以使以較低影格速率執行的遊戲更加順暢
@@ -1035,6 +1036,7 @@ CPU Name = CPU 名稱
D3DCompiler Version = D3DCompiler 版本
Debug = 偵錯
Debugger Present = 偵錯工具呈現
Depth buffer format = Depth buffer format
Device Info = 裝置資訊
Directories = 目錄
Display Information = 顯示器資訊
Binary file not shown.
Binary file not shown.
+8 -8
View File
@@ -231,7 +231,7 @@
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
<PreprocessorDefinitions>ZSTD_MULTITHREAD=1;ZSTD_LEGACY_SUPPORT=5;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>ZSTD_MULTITHREAD=1;ZSTD_LEGACY_SUPPORT=0;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
@@ -250,7 +250,7 @@
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
<PreprocessorDefinitions>ZSTD_MULTITHREAD=1;ZSTD_LEGACY_SUPPORT=5;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>ZSTD_MULTITHREAD=1;ZSTD_LEGACY_SUPPORT=0;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
@@ -267,7 +267,7 @@
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
<PreprocessorDefinitions>ZSTD_MULTITHREAD=1;ZSTD_LEGACY_SUPPORT=5;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>ZSTD_MULTITHREAD=1;ZSTD_LEGACY_SUPPORT=0;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
@@ -284,7 +284,7 @@
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
<PreprocessorDefinitions>ZSTD_MULTITHREAD=1;ZSTD_LEGACY_SUPPORT=5;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>ZSTD_MULTITHREAD=1;ZSTD_LEGACY_SUPPORT=0;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
@@ -304,7 +304,7 @@
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>ZSTD_MULTITHREAD=1;ZSTD_LEGACY_SUPPORT=5;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>ZSTD_MULTITHREAD=1;ZSTD_LEGACY_SUPPORT=0;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<EnablePREfast>false</EnablePREfast>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
@@ -330,7 +330,7 @@
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>ZSTD_MULTITHREAD=1;ZSTD_LEGACY_SUPPORT=5;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>ZSTD_MULTITHREAD=1;ZSTD_LEGACY_SUPPORT=0;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<TreatWarningAsError>false</TreatWarningAsError>
<EnablePREfast>false</EnablePREfast>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
@@ -356,7 +356,7 @@
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>ZSTD_MULTITHREAD=1;ZSTD_LEGACY_SUPPORT=5;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>ZSTD_MULTITHREAD=1;ZSTD_LEGACY_SUPPORT=0;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<TreatWarningAsError>false</TreatWarningAsError>
<EnablePREfast>false</EnablePREfast>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
@@ -382,7 +382,7 @@
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>ZSTD_MULTITHREAD=1;ZSTD_LEGACY_SUPPORT=5;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>ZSTD_MULTITHREAD=1;ZSTD_LEGACY_SUPPORT=0;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<TreatWarningAsError>false</TreatWarningAsError>
<EnablePREfast>false</EnablePREfast>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
Binary file not shown.
+2306 -44
View File
File diff suppressed because it is too large. Load diff
+172 -20
View File
@@ -2,7 +2,7 @@
#define OPENXR_PLATFORM_H_ 1
/*
** Copyright (c) 2017-2021, The Khronos Group Inc.
** Copyright (c) 2017-2022, The Khronos Group Inc.
**
** SPDX-License-Identifier: Apache-2.0 OR MIT
*/
@@ -35,11 +35,13 @@ typedef enum XrAndroidThreadTypeKHR {
typedef XrResult (XRAPI_PTR *PFN_xrSetAndroidApplicationThreadKHR)(XrSession session, XrAndroidThreadTypeKHR threadType, uint32_t threadId);
#ifndef XR_NO_PROTOTYPES
#ifdef XR_EXTENSION_PROTOTYPES
XRAPI_ATTR XrResult XRAPI_CALL xrSetAndroidApplicationThreadKHR(
XrSession session,
XrAndroidThreadTypeKHR threadType,
uint32_t threadId);
#endif
#endif /* XR_EXTENSION_PROTOTYPES */
#endif /* !XR_NO_PROTOTYPES */
#endif /* XR_USE_PLATFORM_ANDROID */
#ifdef XR_USE_PLATFORM_ANDROID
@@ -50,12 +52,14 @@ XRAPI_ATTR XrResult XRAPI_CALL xrSetAndroidApplicationThreadKHR(
typedef XrResult (XRAPI_PTR *PFN_xrCreateSwapchainAndroidSurfaceKHR)(XrSession session, const XrSwapchainCreateInfo* info, XrSwapchain* swapchain, jobject* surface);
#ifndef XR_NO_PROTOTYPES
#ifdef XR_EXTENSION_PROTOTYPES
XRAPI_ATTR XrResult XRAPI_CALL xrCreateSwapchainAndroidSurfaceKHR(
XrSession session,
const XrSwapchainCreateInfo* info,
XrSwapchain* swapchain,
jobject* surface);
#endif
#endif /* XR_EXTENSION_PROTOTYPES */
#endif /* !XR_NO_PROTOTYPES */
#endif /* XR_USE_PLATFORM_ANDROID */
#ifdef XR_USE_PLATFORM_ANDROID
@@ -63,6 +67,7 @@ XRAPI_ATTR XrResult XRAPI_CALL xrCreateSwapchainAndroidSurfaceKHR(
#define XR_KHR_android_create_instance 1
#define XR_KHR_android_create_instance_SPEC_VERSION 3
#define XR_KHR_ANDROID_CREATE_INSTANCE_EXTENSION_NAME "XR_KHR_android_create_instance"
// XrInstanceCreateInfoAndroidKHR extends XrInstanceCreateInfo
typedef struct XrInstanceCreateInfoAndroidKHR {
XrStructureType type;
const void* XR_MAY_ALIAS next;
@@ -75,7 +80,7 @@ typedef struct XrInstanceCreateInfoAndroidKHR {
#ifdef XR_USE_GRAPHICS_API_VULKAN
#define XR_KHR_vulkan_swapchain_format_list 1
#define XR_KHR_vulkan_swapchain_format_list_SPEC_VERSION 3
#define XR_KHR_vulkan_swapchain_format_list_SPEC_VERSION 4
#define XR_KHR_VULKAN_SWAPCHAIN_FORMAT_LIST_EXTENSION_NAME "XR_KHR_vulkan_swapchain_format_list"
typedef struct XrVulkanSwapchainFormatListCreateInfoKHR {
XrStructureType type;
@@ -89,9 +94,10 @@ typedef struct XrVulkanSwapchainFormatListCreateInfoKHR {
#ifdef XR_USE_GRAPHICS_API_OPENGL
#define XR_KHR_opengl_enable 1
#define XR_KHR_opengl_enable_SPEC_VERSION 9
#define XR_KHR_opengl_enable_SPEC_VERSION 10
#define XR_KHR_OPENGL_ENABLE_EXTENSION_NAME "XR_KHR_opengl_enable"
#ifdef XR_USE_PLATFORM_WIN32
// XrGraphicsBindingOpenGLWin32KHR extends XrSessionCreateInfo
typedef struct XrGraphicsBindingOpenGLWin32KHR {
XrStructureType type;
const void* XR_MAY_ALIAS next;
@@ -101,6 +107,7 @@ typedef struct XrGraphicsBindingOpenGLWin32KHR {
#endif // XR_USE_PLATFORM_WIN32
#ifdef XR_USE_PLATFORM_XLIB
// XrGraphicsBindingOpenGLXlibKHR extends XrSessionCreateInfo
typedef struct XrGraphicsBindingOpenGLXlibKHR {
XrStructureType type;
const void* XR_MAY_ALIAS next;
@@ -113,6 +120,7 @@ typedef struct XrGraphicsBindingOpenGLXlibKHR {
#endif // XR_USE_PLATFORM_XLIB
#ifdef XR_USE_PLATFORM_XCB
// XrGraphicsBindingOpenGLXcbKHR extends XrSessionCreateInfo
typedef struct XrGraphicsBindingOpenGLXcbKHR {
XrStructureType type;
const void* XR_MAY_ALIAS next;
@@ -126,6 +134,7 @@ typedef struct XrGraphicsBindingOpenGLXcbKHR {
#endif // XR_USE_PLATFORM_XCB
#ifdef XR_USE_PLATFORM_WAYLAND
// XrGraphicsBindingOpenGLWaylandKHR extends XrSessionCreateInfo
typedef struct XrGraphicsBindingOpenGLWaylandKHR {
XrStructureType type;
const void* XR_MAY_ALIAS next;
@@ -149,19 +158,22 @@ typedef struct XrGraphicsRequirementsOpenGLKHR {
typedef XrResult (XRAPI_PTR *PFN_xrGetOpenGLGraphicsRequirementsKHR)(XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsOpenGLKHR* graphicsRequirements);
#ifndef XR_NO_PROTOTYPES
#ifdef XR_EXTENSION_PROTOTYPES
XRAPI_ATTR XrResult XRAPI_CALL xrGetOpenGLGraphicsRequirementsKHR(
XrInstance instance,
XrSystemId systemId,
XrGraphicsRequirementsOpenGLKHR* graphicsRequirements);
#endif
#endif /* XR_EXTENSION_PROTOTYPES */
#endif /* !XR_NO_PROTOTYPES */
#endif /* XR_USE_GRAPHICS_API_OPENGL */
#ifdef XR_USE_GRAPHICS_API_OPENGL_ES
#define XR_KHR_opengl_es_enable 1
#define XR_KHR_opengl_es_enable_SPEC_VERSION 7
#define XR_KHR_opengl_es_enable_SPEC_VERSION 8
#define XR_KHR_OPENGL_ES_ENABLE_EXTENSION_NAME "XR_KHR_opengl_es_enable"
#ifdef XR_USE_PLATFORM_ANDROID
// XrGraphicsBindingOpenGLESAndroidKHR extends XrSessionCreateInfo
typedef struct XrGraphicsBindingOpenGLESAndroidKHR {
XrStructureType type;
const void* XR_MAY_ALIAS next;
@@ -187,18 +199,21 @@ typedef struct XrGraphicsRequirementsOpenGLESKHR {
typedef XrResult (XRAPI_PTR *PFN_xrGetOpenGLESGraphicsRequirementsKHR)(XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsOpenGLESKHR* graphicsRequirements);
#ifndef XR_NO_PROTOTYPES
#ifdef XR_EXTENSION_PROTOTYPES
XRAPI_ATTR XrResult XRAPI_CALL xrGetOpenGLESGraphicsRequirementsKHR(
XrInstance instance,
XrSystemId systemId,
XrGraphicsRequirementsOpenGLESKHR* graphicsRequirements);
#endif
#endif /* XR_EXTENSION_PROTOTYPES */
#endif /* !XR_NO_PROTOTYPES */
#endif /* XR_USE_GRAPHICS_API_OPENGL_ES */
#ifdef XR_USE_GRAPHICS_API_VULKAN
#define XR_KHR_vulkan_enable 1
#define XR_KHR_vulkan_enable_SPEC_VERSION 7
#define XR_KHR_vulkan_enable_SPEC_VERSION 8
#define XR_KHR_VULKAN_ENABLE_EXTENSION_NAME "XR_KHR_vulkan_enable"
// XrGraphicsBindingVulkanKHR extends XrSessionCreateInfo
typedef struct XrGraphicsBindingVulkanKHR {
XrStructureType type;
const void* XR_MAY_ALIAS next;
@@ -228,6 +243,7 @@ typedef XrResult (XRAPI_PTR *PFN_xrGetVulkanGraphicsDeviceKHR)(XrInstance instan
typedef XrResult (XRAPI_PTR *PFN_xrGetVulkanGraphicsRequirementsKHR)(XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsVulkanKHR* graphicsRequirements);
#ifndef XR_NO_PROTOTYPES
#ifdef XR_EXTENSION_PROTOTYPES
XRAPI_ATTR XrResult XRAPI_CALL xrGetVulkanInstanceExtensionsKHR(
XrInstance instance,
XrSystemId systemId,
@@ -252,14 +268,16 @@ XRAPI_ATTR XrResult XRAPI_CALL xrGetVulkanGraphicsRequirementsKHR(
XrInstance instance,
XrSystemId systemId,
XrGraphicsRequirementsVulkanKHR* graphicsRequirements);
#endif
#endif /* XR_EXTENSION_PROTOTYPES */
#endif /* !XR_NO_PROTOTYPES */
#endif /* XR_USE_GRAPHICS_API_VULKAN */
#ifdef XR_USE_GRAPHICS_API_D3D11
#define XR_KHR_D3D11_enable 1
#define XR_KHR_D3D11_enable_SPEC_VERSION 5
#define XR_KHR_D3D11_enable_SPEC_VERSION 9
#define XR_KHR_D3D11_ENABLE_EXTENSION_NAME "XR_KHR_D3D11_enable"
// XrGraphicsBindingD3D11KHR extends XrSessionCreateInfo
typedef struct XrGraphicsBindingD3D11KHR {
XrStructureType type;
const void* XR_MAY_ALIAS next;
@@ -282,18 +300,21 @@ typedef struct XrGraphicsRequirementsD3D11KHR {
typedef XrResult (XRAPI_PTR *PFN_xrGetD3D11GraphicsRequirementsKHR)(XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsD3D11KHR* graphicsRequirements);
#ifndef XR_NO_PROTOTYPES
#ifdef XR_EXTENSION_PROTOTYPES
XRAPI_ATTR XrResult XRAPI_CALL xrGetD3D11GraphicsRequirementsKHR(
XrInstance instance,
XrSystemId systemId,
XrGraphicsRequirementsD3D11KHR* graphicsRequirements);
#endif
#endif /* XR_EXTENSION_PROTOTYPES */
#endif /* !XR_NO_PROTOTYPES */
#endif /* XR_USE_GRAPHICS_API_D3D11 */
#ifdef XR_USE_GRAPHICS_API_D3D12
#define XR_KHR_D3D12_enable 1
#define XR_KHR_D3D12_enable_SPEC_VERSION 7
#define XR_KHR_D3D12_enable_SPEC_VERSION 9
#define XR_KHR_D3D12_ENABLE_EXTENSION_NAME "XR_KHR_D3D12_enable"
// XrGraphicsBindingD3D12KHR extends XrSessionCreateInfo
typedef struct XrGraphicsBindingD3D12KHR {
XrStructureType type;
const void* XR_MAY_ALIAS next;
@@ -317,11 +338,13 @@ typedef struct XrGraphicsRequirementsD3D12KHR {
typedef XrResult (XRAPI_PTR *PFN_xrGetD3D12GraphicsRequirementsKHR)(XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsD3D12KHR* graphicsRequirements);
#ifndef XR_NO_PROTOTYPES
#ifdef XR_EXTENSION_PROTOTYPES
XRAPI_ATTR XrResult XRAPI_CALL xrGetD3D12GraphicsRequirementsKHR(
XrInstance instance,
XrSystemId systemId,
XrGraphicsRequirementsD3D12KHR* graphicsRequirements);
#endif
#endif /* XR_EXTENSION_PROTOTYPES */
#endif /* !XR_NO_PROTOTYPES */
#endif /* XR_USE_GRAPHICS_API_D3D12 */
#ifdef XR_USE_PLATFORM_WIN32
@@ -333,6 +356,7 @@ typedef XrResult (XRAPI_PTR *PFN_xrConvertWin32PerformanceCounterToTimeKHR)(XrIn
typedef XrResult (XRAPI_PTR *PFN_xrConvertTimeToWin32PerformanceCounterKHR)(XrInstance instance, XrTime time, LARGE_INTEGER* performanceCounter);
#ifndef XR_NO_PROTOTYPES
#ifdef XR_EXTENSION_PROTOTYPES
XRAPI_ATTR XrResult XRAPI_CALL xrConvertWin32PerformanceCounterToTimeKHR(
XrInstance instance,
const LARGE_INTEGER* performanceCounter,
@@ -342,7 +366,8 @@ XRAPI_ATTR XrResult XRAPI_CALL xrConvertTimeToWin32PerformanceCounterKHR(
XrInstance instance,
XrTime time,
LARGE_INTEGER* performanceCounter);
#endif
#endif /* XR_EXTENSION_PROTOTYPES */
#endif /* !XR_NO_PROTOTYPES */
#endif /* XR_USE_PLATFORM_WIN32 */
#ifdef XR_USE_TIMESPEC
@@ -354,6 +379,7 @@ typedef XrResult (XRAPI_PTR *PFN_xrConvertTimespecTimeToTimeKHR)(XrInstance inst
typedef XrResult (XRAPI_PTR *PFN_xrConvertTimeToTimespecTimeKHR)(XrInstance instance, XrTime time, struct timespec* timespecTime);
#ifndef XR_NO_PROTOTYPES
#ifdef XR_EXTENSION_PROTOTYPES
XRAPI_ATTR XrResult XRAPI_CALL xrConvertTimespecTimeToTimeKHR(
XrInstance instance,
const struct timespec* timespecTime,
@@ -363,7 +389,8 @@ XRAPI_ATTR XrResult XRAPI_CALL xrConvertTimeToTimespecTimeKHR(
XrInstance instance,
XrTime time,
struct timespec* timespecTime);
#endif
#endif /* XR_EXTENSION_PROTOTYPES */
#endif /* !XR_NO_PROTOTYPES */
#endif /* XR_USE_TIMESPEC */
#ifdef XR_USE_PLATFORM_ANDROID
@@ -383,7 +410,7 @@ typedef struct XrLoaderInitInfoAndroidKHR {
#ifdef XR_USE_GRAPHICS_API_VULKAN
#define XR_KHR_vulkan_enable2 1
#define XR_KHR_vulkan_enable2_SPEC_VERSION 1
#define XR_KHR_vulkan_enable2_SPEC_VERSION 2
#define XR_KHR_VULKAN_ENABLE2_EXTENSION_NAME "XR_KHR_vulkan_enable2"
typedef XrFlags64 XrVulkanInstanceCreateFlagsKHR;
@@ -427,12 +454,13 @@ typedef XrSwapchainImageVulkanKHR XrSwapchainImageVulkan2KHR;
typedef XrGraphicsRequirementsVulkanKHR XrGraphicsRequirementsVulkan2KHR;
typedef XrResult (XRAPI_PTR *PFN_xrCreateVulkanInstanceKHR)(XrInstance instance, const XrVulkanInstanceCreateInfoKHR*createInfo, VkInstance* vulkanInstance, VkResult* vulkanResult);
typedef XrResult (XRAPI_PTR *PFN_xrCreateVulkanInstanceKHR)(XrInstance instance, const XrVulkanInstanceCreateInfoKHR* createInfo, VkInstance* vulkanInstance, VkResult* vulkanResult);
typedef XrResult (XRAPI_PTR *PFN_xrCreateVulkanDeviceKHR)(XrInstance instance, const XrVulkanDeviceCreateInfoKHR* createInfo, VkDevice* vulkanDevice, VkResult* vulkanResult);
typedef XrResult (XRAPI_PTR *PFN_xrGetVulkanGraphicsDevice2KHR)(XrInstance instance, const XrVulkanGraphicsDeviceGetInfoKHR* getInfo, VkPhysicalDevice* vulkanPhysicalDevice);
typedef XrResult (XRAPI_PTR *PFN_xrGetVulkanGraphicsRequirements2KHR)(XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsVulkanKHR* graphicsRequirements);
#ifndef XR_NO_PROTOTYPES
#ifdef XR_EXTENSION_PROTOTYPES
XRAPI_ATTR XrResult XRAPI_CALL xrCreateVulkanInstanceKHR(
XrInstance instance,
const XrVulkanInstanceCreateInfoKHR* createInfo,
@@ -454,7 +482,8 @@ XRAPI_ATTR XrResult XRAPI_CALL xrGetVulkanGraphicsRequirements2KHR(
XrInstance instance,
XrSystemId systemId,
XrGraphicsRequirementsVulkanKHR* graphicsRequirements);
#endif
#endif /* XR_EXTENSION_PROTOTYPES */
#endif /* !XR_NO_PROTOTYPES */
#endif /* XR_USE_GRAPHICS_API_VULKAN */
#ifdef XR_USE_PLATFORM_EGL
@@ -462,6 +491,7 @@ XRAPI_ATTR XrResult XRAPI_CALL xrGetVulkanGraphicsRequirements2KHR(
#define XR_MNDX_egl_enable 1
#define XR_MNDX_egl_enable_SPEC_VERSION 1
#define XR_MNDX_EGL_ENABLE_EXTENSION_NAME "XR_MNDX_egl_enable"
// XrGraphicsBindingEGLMNDX extends XrSessionCreateInfo
typedef struct XrGraphicsBindingEGLMNDX {
XrStructureType type;
const void* XR_MAY_ALIAS next;
@@ -482,6 +512,7 @@ typedef XrResult (XRAPI_PTR *PFN_xrCreateSpatialAnchorFromPerceptionAnchorMSFT)(
typedef XrResult (XRAPI_PTR *PFN_xrTryGetPerceptionAnchorFromSpatialAnchorMSFT)(XrSession session, XrSpatialAnchorMSFT anchor, IUnknown** perceptionAnchor);
#ifndef XR_NO_PROTOTYPES
#ifdef XR_EXTENSION_PROTOTYPES
XRAPI_ATTR XrResult XRAPI_CALL xrCreateSpatialAnchorFromPerceptionAnchorMSFT(
XrSession session,
IUnknown* perceptionAnchor,
@@ -491,7 +522,8 @@ XRAPI_ATTR XrResult XRAPI_CALL xrTryGetPerceptionAnchorFromSpatialAnchorMSFT(
XrSession session,
XrSpatialAnchorMSFT anchor,
IUnknown** perceptionAnchor);
#endif
#endif /* XR_EXTENSION_PROTOTYPES */
#endif /* !XR_NO_PROTOTYPES */
#endif /* XR_USE_PLATFORM_WIN32 */
#ifdef XR_USE_PLATFORM_WIN32
@@ -500,6 +532,7 @@ XRAPI_ATTR XrResult XRAPI_CALL xrTryGetPerceptionAnchorFromSpatialAnchorMSFT(
#define XR_MSFT_holographic_window_attachment_SPEC_VERSION 1
#define XR_MSFT_HOLOGRAPHIC_WINDOW_ATTACHMENT_EXTENSION_NAME "XR_MSFT_holographic_window_attachment"
#ifdef XR_USE_PLATFORM_WIN32
// XrHolographicWindowAttachmentMSFT extends XrSessionCreateInfo
typedef struct XrHolographicWindowAttachmentMSFT {
XrStructureType type;
const void* XR_MAY_ALIAS next;
@@ -522,6 +555,7 @@ static const XrAndroidSurfaceSwapchainFlagsFB XR_ANDROID_SURFACE_SWAPCHAIN_SYNCH
static const XrAndroidSurfaceSwapchainFlagsFB XR_ANDROID_SURFACE_SWAPCHAIN_USE_TIMESTAMPS_BIT_FB = 0x00000002;
#ifdef XR_USE_PLATFORM_ANDROID
// XrAndroidSurfaceSwapchainCreateInfoFB extends XrSwapchainCreateInfo
typedef struct XrAndroidSurfaceSwapchainCreateInfoFB {
XrStructureType type;
const void* XR_MAY_ALIAS next;
@@ -531,6 +565,124 @@ typedef struct XrAndroidSurfaceSwapchainCreateInfoFB {
#endif /* XR_USE_PLATFORM_ANDROID */
#ifdef XR_USE_PLATFORM_WIN32
#define XR_OCULUS_audio_device_guid 1
#define XR_OCULUS_audio_device_guid_SPEC_VERSION 1
#define XR_OCULUS_AUDIO_DEVICE_GUID_EXTENSION_NAME "XR_OCULUS_audio_device_guid"
#define XR_MAX_AUDIO_DEVICE_STR_SIZE_OCULUS 128
typedef XrResult (XRAPI_PTR *PFN_xrGetAudioOutputDeviceGuidOculus)(XrInstance instance, wchar_t buffer[XR_MAX_AUDIO_DEVICE_STR_SIZE_OCULUS]);
typedef XrResult (XRAPI_PTR *PFN_xrGetAudioInputDeviceGuidOculus)(XrInstance instance, wchar_t buffer[XR_MAX_AUDIO_DEVICE_STR_SIZE_OCULUS]);
#ifndef XR_NO_PROTOTYPES
#ifdef XR_EXTENSION_PROTOTYPES
XRAPI_ATTR XrResult XRAPI_CALL xrGetAudioOutputDeviceGuidOculus(
XrInstance instance,
wchar_t buffer[XR_MAX_AUDIO_DEVICE_STR_SIZE_OCULUS]);
XRAPI_ATTR XrResult XRAPI_CALL xrGetAudioInputDeviceGuidOculus(
XrInstance instance,
wchar_t buffer[XR_MAX_AUDIO_DEVICE_STR_SIZE_OCULUS]);
#endif /* XR_EXTENSION_PROTOTYPES */
#endif /* !XR_NO_PROTOTYPES */
#endif /* XR_USE_PLATFORM_WIN32 */
#ifdef XR_USE_GRAPHICS_API_VULKAN
#define XR_FB_foveation_vulkan 1
#define XR_FB_foveation_vulkan_SPEC_VERSION 1
#define XR_FB_FOVEATION_VULKAN_EXTENSION_NAME "XR_FB_foveation_vulkan"
// XrSwapchainImageFoveationVulkanFB extends XrSwapchainImageVulkanKHR
typedef struct XrSwapchainImageFoveationVulkanFB {
XrStructureType type;
void* XR_MAY_ALIAS next;
VkImage image;
uint32_t width;
uint32_t height;
} XrSwapchainImageFoveationVulkanFB;
#endif /* XR_USE_GRAPHICS_API_VULKAN */
#ifdef XR_USE_PLATFORM_ANDROID
#define XR_FB_swapchain_update_state_android_surface 1
#define XR_FB_swapchain_update_state_android_surface_SPEC_VERSION 1
#define XR_FB_SWAPCHAIN_UPDATE_STATE_ANDROID_SURFACE_EXTENSION_NAME "XR_FB_swapchain_update_state_android_surface"
#ifdef XR_USE_PLATFORM_ANDROID
typedef struct XrSwapchainStateAndroidSurfaceDimensionsFB {
XrStructureType type;
void* XR_MAY_ALIAS next;
uint32_t width;
uint32_t height;
} XrSwapchainStateAndroidSurfaceDimensionsFB;
#endif // XR_USE_PLATFORM_ANDROID
#endif /* XR_USE_PLATFORM_ANDROID */
#ifdef XR_USE_GRAPHICS_API_OPENGL_ES
#define XR_FB_swapchain_update_state_opengl_es 1
#define XR_FB_swapchain_update_state_opengl_es_SPEC_VERSION 1
#define XR_FB_SWAPCHAIN_UPDATE_STATE_OPENGL_ES_EXTENSION_NAME "XR_FB_swapchain_update_state_opengl_es"
#ifdef XR_USE_GRAPHICS_API_OPENGL_ES
typedef struct XrSwapchainStateSamplerOpenGLESFB {
XrStructureType type;
void* XR_MAY_ALIAS next;
EGLenum minFilter;
EGLenum magFilter;
EGLenum wrapModeS;
EGLenum wrapModeT;
EGLenum swizzleRed;
EGLenum swizzleGreen;
EGLenum swizzleBlue;
EGLenum swizzleAlpha;
float maxAnisotropy;
XrColor4f borderColor;
} XrSwapchainStateSamplerOpenGLESFB;
#endif // XR_USE_GRAPHICS_API_OPENGL_ES
#endif /* XR_USE_GRAPHICS_API_OPENGL_ES */
#ifdef XR_USE_GRAPHICS_API_VULKAN
#define XR_FB_swapchain_update_state_vulkan 1
#define XR_FB_swapchain_update_state_vulkan_SPEC_VERSION 1
#define XR_FB_SWAPCHAIN_UPDATE_STATE_VULKAN_EXTENSION_NAME "XR_FB_swapchain_update_state_vulkan"
#ifdef XR_USE_GRAPHICS_API_VULKAN
typedef struct XrSwapchainStateSamplerVulkanFB {
XrStructureType type;
void* XR_MAY_ALIAS next;
VkFilter minFilter;
VkFilter magFilter;
VkSamplerMipmapMode mipmapMode;
VkSamplerAddressMode wrapModeS;
VkSamplerAddressMode wrapModeT;
VkComponentSwizzle swizzleRed;
VkComponentSwizzle swizzleGreen;
VkComponentSwizzle swizzleBlue;
VkComponentSwizzle swizzleAlpha;
float maxAnisotropy;
XrColor4f borderColor;
} XrSwapchainStateSamplerVulkanFB;
#endif // XR_USE_GRAPHICS_API_VULKAN
#endif /* XR_USE_GRAPHICS_API_VULKAN */
#ifdef XR_USE_GRAPHICS_API_VULKAN
#define XR_META_vulkan_swapchain_create_info 1
#define XR_META_vulkan_swapchain_create_info_SPEC_VERSION 1
#define XR_META_VULKAN_SWAPCHAIN_CREATE_INFO_EXTENSION_NAME "XR_META_vulkan_swapchain_create_info"
// XrVulkanSwapchainCreateInfoMETA extends XrSwapchainCreateInfo
typedef struct XrVulkanSwapchainCreateInfoMETA {
XrStructureType type;
const void* XR_MAY_ALIAS next;
VkImageCreateFlags additionalCreateFlags;
VkImageUsageFlags additionalUsageFlags;
} XrVulkanSwapchainCreateInfoMETA;
#endif /* XR_USE_GRAPHICS_API_VULKAN */
#ifdef __cplusplus
}
#endif
+1 -1
View File
@@ -1,5 +1,5 @@
/*
** Copyright (c) 2017-2021, The Khronos Group Inc.
** Copyright (c) 2017-2022, The Khronos Group Inc.
**
** SPDX-License-Identifier: Apache-2.0 OR MIT
*/
File diff suppressed because it is too large. Load diff
+24
View File
@@ -597,6 +597,7 @@ static void check_variables(CoreParameter &coreParam)
int iInternalResolution_prev;
int iTexScalingType_prev;
int iTexScalingLevel_prev;
int iMultiSampleLevel_prev;
var.key = "ppsspp_language";
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
@@ -745,6 +746,21 @@ static void check_variables(CoreParameter &coreParam)
g_Config.iInternalResolution = 10;
}
var.key = "ppsspp_mulitsample_level";
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
{
iMultiSampleLevel_prev = g_Config.iMultiSampleLevel;
if (!strcmp(var.value, "Disabled"))
g_Config.iMultiSampleLevel = 0;
else if (!strcmp(var.value, "x2"))
g_Config.iMultiSampleLevel = 1;
else if (!strcmp(var.value, "x4"))
g_Config.iMultiSampleLevel = 2;
else if (!strcmp(var.value, "x8"))
g_Config.iMultiSampleLevel = 3;
}
var.key = "ppsspp_skip_buffer_effects";
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
{
@@ -1134,6 +1150,14 @@ static void check_variables(CoreParameter &coreParam)
}
}
if (g_Config.iMultiSampleLevel != iMultiSampleLevel_prev && PSP_IsInited())
{
if (gpu)
{
gpu->NotifyRenderResized();
}
}
if (updateAvInfo)
{
retro_system_av_info avInfo;
+16
View File
@@ -283,6 +283,22 @@ struct retro_core_option_v2_definition option_defs_us[] = {
},
"480x272"
},
{
"ppsspp_mulitsample_level",
"MSAA Antialiasing (Vulkan Only)",
NULL,
NULL,
NULL,
"video",
{
{"Disabled", NULL},
{"x2", NULL},
{"x4", NULL},
{"x8", NULL},
{NULL, NULL}
},
"Disabled"
},
{
"ppsspp_skip_buffer_effects",
"Skip Buffer Effects",
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Loaded 100 of 111 files, more files were not shown because too many files have changed in this diff. Show more