graphics: wide guest output for native ultrawide, drop the emulated Hor+ classifier
This commit is contained in:
parent
66c42a571c
commit
1cd0113ff2
20 changed files with 141 additions and 4124 deletions
|
|
@ -49,6 +49,25 @@ bool HasNativeGuestOutputRenderer();
|
||||||
// True while the registered renderer actually replaced the last presented
|
// True while the registered renderer actually replaced the last presented
|
||||||
// frame (false when it yields to the emulated output).
|
// frame (false when it yields to the emulated output).
|
||||||
bool IsNativeGuestOutputActive();
|
bool IsNativeGuestOutputActive();
|
||||||
|
|
||||||
|
// ---- Wide guest output ----------------------------------------------------
|
||||||
|
// Display aspect the native renderer wants to draw at when it is wider than
|
||||||
|
// the guest frontbuffer's own aspect (ultrawide). 0 = disabled. Set once at
|
||||||
|
// app startup; consumed by the command processors when sizing the guest
|
||||||
|
// output for a swap.
|
||||||
|
void SetNativeGuestOutputWideAspect(double aspect);
|
||||||
|
double GetNativeGuestOutputWideAspect();
|
||||||
|
// Applies the wide aspect to this swap's guest output and display
|
||||||
|
// dimensions: widens guest_output_width to guest_output_height * aspect and
|
||||||
|
// makes the display aspect match. Only widens while a renderer is registered
|
||||||
|
// AND it served the last presented frame, so emulated fallback frames size
|
||||||
|
// back to the frontbuffer aspect and present pillarboxed by the presenter's
|
||||||
|
// letterbox path. Returns whether the output was widened; when it was and
|
||||||
|
// the renderer then yields the frame, the refresh callback must return false
|
||||||
|
// (keeping the previously presented image) instead of running the emulated
|
||||||
|
// blit, which writes frontbuffer-aspect content.
|
||||||
|
bool ApplyNativeGuestOutputWideAspect(uint32_t& guest_output_width, uint32_t guest_output_height,
|
||||||
|
uint32_t& display_width, uint32_t& display_height);
|
||||||
// native_render_suppress_emulated_draws && IsNativeGuestOutputActive():
|
// native_render_suppress_emulated_draws && IsNativeGuestOutputActive():
|
||||||
// command processors skip emulated draw/resolve execution (memexport draws,
|
// command processors skip emulated draw/resolve execution (memexport draws,
|
||||||
// fences, queries and PM4 parsing still run).
|
// fences, queries and PM4 parsing still run).
|
||||||
|
|
|
||||||
|
|
@ -612,10 +612,6 @@ class TextureCache {
|
||||||
static bool DebugIsTeamProfileBackgroundCandidateKey(const TextureKey& key);
|
static bool DebugIsTeamProfileBackgroundCandidateKey(const TextureKey& key);
|
||||||
void DebugLogTeamProfileBackgroundTextureCandidate(const char* action, uint32_t fetch_index,
|
void DebugLogTeamProfileBackgroundTextureCandidate(const char* action, uint32_t fetch_index,
|
||||||
const Texture& texture);
|
const Texture& texture);
|
||||||
bool DebugConsumeSkate3UltrawideTextureTraceLog();
|
|
||||||
void DebugLogSkate3UltrawideTextureTrace(const char* action, uint32_t fetch_index,
|
|
||||||
const TextureKey& key,
|
|
||||||
const Texture* texture = nullptr);
|
|
||||||
|
|
||||||
void UpdateTexturesTotalHostMemoryUsage(uint64_t add, uint64_t subtract);
|
void UpdateTexturesTotalHostMemoryUsage(uint64_t add, uint64_t subtract);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,183 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <array>
|
|
||||||
#include <cstdint>
|
|
||||||
#include <filesystem>
|
|
||||||
#include <optional>
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace rex::graphics::ultrawide_debug {
|
|
||||||
|
|
||||||
struct TargetKey {
|
|
||||||
std::array<uint32_t, 4> color_info{};
|
|
||||||
uint32_t depth_info = 0;
|
|
||||||
uint32_t surface_info = 0;
|
|
||||||
uint32_t viewport_x = 0;
|
|
||||||
uint32_t viewport_y = 0;
|
|
||||||
uint32_t viewport_width = 0;
|
|
||||||
uint32_t viewport_height = 0;
|
|
||||||
uint32_t color_mask = 0;
|
|
||||||
uint32_t depth_control = 0;
|
|
||||||
uint32_t pa_cl_vte_cntl = 0;
|
|
||||||
uint32_t primitive_type = 0;
|
|
||||||
uint32_t host_vertex_shader_type = 0;
|
|
||||||
uint64_t vertex_shader_hash = 0;
|
|
||||||
uint64_t pixel_shader_hash = 0;
|
|
||||||
|
|
||||||
bool operator==(const TargetKey& other) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct TargetEntry {
|
|
||||||
uint64_t hash = 0;
|
|
||||||
TargetKey key;
|
|
||||||
bool enabled = false;
|
|
||||||
bool default_enabled = false;
|
|
||||||
bool shadow_candidate = false;
|
|
||||||
uint64_t draw_count = 0;
|
|
||||||
uint64_t applied_draw_count = 0;
|
|
||||||
uint64_t last_seen_order = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class ScreenCallbackKind : uint32_t {
|
|
||||||
kWidth = 0,
|
|
||||||
kHeight = 1,
|
|
||||||
kScreenFlag = 2,
|
|
||||||
kWide = 3,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ScreenCallbackEntry {
|
|
||||||
uint64_t hash = 0;
|
|
||||||
ScreenCallbackKind kind = ScreenCallbackKind::kWidth;
|
|
||||||
uint32_t caller_lr = 0;
|
|
||||||
uint32_t last_value = 0;
|
|
||||||
uint32_t last_returned_value = 0;
|
|
||||||
bool last_spoofed = false;
|
|
||||||
bool enabled = false;
|
|
||||||
uint64_t call_count = 0;
|
|
||||||
uint64_t last_seen_order = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct GuestStoreWatchEntry {
|
|
||||||
uint64_t sequence = 0;
|
|
||||||
std::string target;
|
|
||||||
uint32_t address = 0;
|
|
||||||
uint32_t value = 0;
|
|
||||||
uint32_t caller_lr = 0;
|
|
||||||
std::string function;
|
|
||||||
std::string stack;
|
|
||||||
uint64_t count = 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
class GuestFunctionScope {
|
|
||||||
public:
|
|
||||||
explicit GuestFunctionScope(const char* function_name);
|
|
||||||
~GuestFunctionScope();
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool active_ = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class DrawBucket : uint32_t {
|
|
||||||
kMainColorDepth = 0,
|
|
||||||
kDepthOnly = 1,
|
|
||||||
kCopyResolve = 2,
|
|
||||||
kMemexport = 3,
|
|
||||||
kNoPixelShader = 4,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DrawFingerprint {
|
|
||||||
DrawBucket bucket = DrawBucket::kMainColorDepth;
|
|
||||||
uint32_t guest_render_object = 0;
|
|
||||||
uint32_t guest_render_vtable = 0;
|
|
||||||
uint32_t guest_render_target = 0;
|
|
||||||
uint64_t vertex_shader_hash = 0;
|
|
||||||
uint64_t pixel_shader_hash = 0;
|
|
||||||
uint32_t primitive_type = 0;
|
|
||||||
uint32_t vertex_count = 0;
|
|
||||||
uint32_t primitive_count = 0;
|
|
||||||
uint32_t packet_ptr = 0;
|
|
||||||
uint32_t index_guest_base = 0;
|
|
||||||
uint32_t index_length = 0;
|
|
||||||
static constexpr size_t kVertexFetchCount = 4;
|
|
||||||
uint32_t vertex_fetch_address[kVertexFetchCount] = {};
|
|
||||||
uint32_t vertex_fetch_size[kVertexFetchCount] = {};
|
|
||||||
static constexpr size_t kTextureFetchCount = 8;
|
|
||||||
uint64_t texture_key_hash[kTextureFetchCount] = {};
|
|
||||||
uint32_t texture_fetch_index[kTextureFetchCount] = {};
|
|
||||||
uint32_t texture_base_address[kTextureFetchCount] = {};
|
|
||||||
uint32_t texture_base_length[kTextureFetchCount] = {};
|
|
||||||
uint32_t texture_width[kTextureFetchCount] = {};
|
|
||||||
uint32_t texture_height[kTextureFetchCount] = {};
|
|
||||||
uint32_t texture_format[kTextureFetchCount] = {};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DrawFingerprintEntry {
|
|
||||||
DrawFingerprint fingerprint;
|
|
||||||
uint64_t hash = 0;
|
|
||||||
bool enabled = true;
|
|
||||||
uint64_t draw_count = 0;
|
|
||||||
uint64_t submitted_count = 0;
|
|
||||||
uint64_t skipped_count = 0;
|
|
||||||
uint64_t vertices = 0;
|
|
||||||
uint64_t primitives = 0;
|
|
||||||
uint64_t last_seen_order = 0;
|
|
||||||
uint64_t last_seen_ms = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class ApplyMode : uint32_t {
|
|
||||||
kTargetList = 0,
|
|
||||||
kForceAll = 1,
|
|
||||||
kForceNone = 2,
|
|
||||||
kSavedOnly = 3,
|
|
||||||
};
|
|
||||||
|
|
||||||
uint64_t HashKey(const TargetKey& key);
|
|
||||||
void NotifySkate3GameplayContext(uint32_t user_index, uint32_t context_id, uint32_t value);
|
|
||||||
bool IsSkate3GameplayUltrawideActive();
|
|
||||||
// Live value of the Skate 3 presence context 0x8001 (1 = in gameplay,
|
|
||||||
// 0 = frontend / pause menu / loading).
|
|
||||||
uint32_t Skate3GameplayContextValue();
|
|
||||||
bool ShouldApplyAndRecord(const TargetKey& key, bool default_enabled);
|
|
||||||
uint32_t ShadowMapCandidateLevel(const TargetKey& key);
|
|
||||||
bool IsShadowMapCandidate(const TargetKey& key, uint32_t mode = 1);
|
|
||||||
std::vector<TargetEntry> SnapshotTargets();
|
|
||||||
void SetTargetEnabled(uint64_t hash, bool enabled);
|
|
||||||
void SetAllTargetsEnabled(bool enabled);
|
|
||||||
void ResetTargetOverrides();
|
|
||||||
void SetTargetRecordingActive(bool active);
|
|
||||||
uint64_t HashScreenCallback(ScreenCallbackKind kind, uint32_t caller_lr);
|
|
||||||
bool RecordScreenCallback(ScreenCallbackKind kind, uint32_t caller_lr, uint32_t value);
|
|
||||||
void RecordScreenCallbackResult(ScreenCallbackKind kind, uint32_t caller_lr, uint32_t native_value,
|
|
||||||
uint32_t returned_value);
|
|
||||||
std::vector<ScreenCallbackEntry> SnapshotScreenCallbacks();
|
|
||||||
void SetScreenCallbackEnabled(uint64_t hash, bool enabled);
|
|
||||||
void SetAllScreenCallbacksEnabled(bool enabled);
|
|
||||||
void SetGuestStoreWatchTargets(uint32_t index_base, uint32_t vertex_fetch_address,
|
|
||||||
uint32_t texture_base_address, uint64_t group_hash = 0);
|
|
||||||
void ClearGuestStoreWatchTargets();
|
|
||||||
void ClearGuestStoreWatchEvents();
|
|
||||||
void SetGuestStoreWatchLogPath(const std::filesystem::path& path);
|
|
||||||
std::vector<GuestStoreWatchEntry> SnapshotGuestStoreWatchEvents();
|
|
||||||
void RecordGuestStoreU32(uint32_t address, uint32_t value, const char* function_name,
|
|
||||||
uint32_t caller_lr = 0);
|
|
||||||
void RecordDrawWatchTransition(bool present, uint64_t age, uint32_t packet_ptr,
|
|
||||||
uint32_t index_base, uint32_t vertex_fetch_address,
|
|
||||||
uint64_t group_hash);
|
|
||||||
bool IsGuestStoreWatchActive();
|
|
||||||
void SetCurrentDrawOwner(uint32_t object, uint32_t vtable, uint32_t target);
|
|
||||||
void ClearCurrentDrawOwner();
|
|
||||||
uint64_t HashDrawFingerprint(const DrawFingerprint& fingerprint);
|
|
||||||
bool RecordDrawFingerprint(const DrawFingerprint& fingerprint);
|
|
||||||
std::vector<DrawFingerprintEntry> SnapshotDrawFingerprints();
|
|
||||||
void SetDrawFingerprintEnabled(uint64_t hash, bool enabled);
|
|
||||||
void SetAllDrawFingerprintsEnabled(bool enabled);
|
|
||||||
void ResetDrawFingerprintOverrides();
|
|
||||||
void ClearDrawFingerprints();
|
|
||||||
ApplyMode GetApplyMode();
|
|
||||||
void SetApplyMode(ApplyMode mode);
|
|
||||||
void LoadBuiltInSkate3Classifier();
|
|
||||||
std::optional<std::filesystem::path> LoadTargets(const std::filesystem::path& path);
|
|
||||||
std::optional<std::filesystem::path> SaveTargets(const std::filesystem::path& path);
|
|
||||||
|
|
||||||
} // namespace rex::graphics::ultrawide_debug
|
|
||||||
19
include/rex/kernel/guest_presence.h
Normal file
19
include/rex/kernel/guest_presence.h
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
// Live guest presence context, published by XGI XUserSetContext (xam). Lives
|
||||||
|
// in the shared core library so every module (kernel, graphics backends, the
|
||||||
|
// host app) reads the same state.
|
||||||
|
|
||||||
|
namespace rex::kernel::guest_presence {
|
||||||
|
|
||||||
|
// Called from the XGI XUserSetContext handler with every context write.
|
||||||
|
// Only user 0's presence context 0x8001 is tracked; other writes are ignored.
|
||||||
|
void NotifyContext(uint32_t user_index, uint32_t context_id, uint32_t value);
|
||||||
|
|
||||||
|
// Live value of the Skate 3 presence context 0x8001 (1 = in gameplay,
|
||||||
|
// 0 = frontend / pause menu / loading).
|
||||||
|
uint32_t GameplayContextValue();
|
||||||
|
|
||||||
|
} // namespace rex::kernel::guest_presence
|
||||||
|
|
@ -1,36 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <filesystem>
|
|
||||||
#include <functional>
|
|
||||||
|
|
||||||
#include <rex/ui/imgui_dialog.h>
|
|
||||||
|
|
||||||
namespace rex::ui {
|
|
||||||
|
|
||||||
class UltrawideTargetsDialog final : public ImGuiDialog {
|
|
||||||
public:
|
|
||||||
using CloseCallback = std::function<void()>;
|
|
||||||
|
|
||||||
UltrawideTargetsDialog(ImGuiDrawer* drawer, std::filesystem::path export_path,
|
|
||||||
CloseCallback close_callback = {});
|
|
||||||
~UltrawideTargetsDialog();
|
|
||||||
|
|
||||||
void Show();
|
|
||||||
void Toggle();
|
|
||||||
void Hide();
|
|
||||||
bool visible() const { return visible_; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void OnDraw(ImGuiIO& io) override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::filesystem::path export_path_;
|
|
||||||
CloseCallback close_callback_;
|
|
||||||
bool visible_ = false;
|
|
||||||
bool show_only_seen_ = true;
|
|
||||||
bool draw_section_expanded_ = false;
|
|
||||||
bool draw_show_exact_fingerprints_ = false;
|
|
||||||
int draw_group_mode_ = 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace rex::ui
|
|
||||||
|
|
@ -11,6 +11,7 @@ add_library(rexcore OBJECT
|
||||||
exception_handler.cpp
|
exception_handler.cpp
|
||||||
filesystem.cpp
|
filesystem.cpp
|
||||||
filesystem_wildcard.cpp
|
filesystem_wildcard.cpp
|
||||||
|
guest_presence.cpp
|
||||||
logging.cpp
|
logging.cpp
|
||||||
memory.cpp
|
memory.cpp
|
||||||
mutex.cpp
|
mutex.cpp
|
||||||
|
|
@ -20,7 +21,6 @@ add_library(rexcore OBJECT
|
||||||
string_buffer.cpp
|
string_buffer.cpp
|
||||||
threading.cpp
|
threading.cpp
|
||||||
timer_queue.cpp
|
timer_queue.cpp
|
||||||
ultrawide_debug.cpp
|
|
||||||
utf8.cpp
|
utf8.cpp
|
||||||
vec128.cpp
|
vec128.cpp
|
||||||
)
|
)
|
||||||
|
|
|
||||||
24
src/core/guest_presence.cpp
Normal file
24
src/core/guest_presence.cpp
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
#include <rex/kernel/guest_presence.h>
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
|
|
||||||
|
namespace rex::kernel::guest_presence {
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
std::atomic<uint32_t> g_gameplay_context_value{0};
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
void NotifyContext(uint32_t user_index, uint32_t context_id, uint32_t value) {
|
||||||
|
constexpr uint32_t kGameplayContext = 0x8001;
|
||||||
|
if (user_index != 0 || context_id != kGameplayContext) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
g_gameplay_context_value.store(value, std::memory_order_relaxed);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t GameplayContextValue() {
|
||||||
|
return g_gameplay_context_value.load(std::memory_order_relaxed);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace rex::kernel::guest_presence
|
||||||
|
|
@ -688,16 +688,8 @@ bool ShouldCollectDrawDiagnostics() {
|
||||||
return REXCVAR_GET(perf_diagnostics) || IsCaptureRecording();
|
return REXCVAR_GET(perf_diagnostics) || IsCaptureRecording();
|
||||||
}
|
}
|
||||||
|
|
||||||
// skate3_ultrawide_trace_draws lives in another DLL, so it is reachable only
|
|
||||||
// through the by-name registry query (mutex + map lookup), far too expensive
|
|
||||||
// for the per-draw call sites of ShouldCollectDrawFingerprints(). Cache the
|
|
||||||
// value and refresh it once per frame from ResetFrameCounters().
|
|
||||||
static std::atomic<bool> g_trace_draws_cvar_cache{false};
|
|
||||||
|
|
||||||
bool ShouldCollectDrawFingerprints() {
|
bool ShouldCollectDrawFingerprints() {
|
||||||
return REXCVAR_GET(perf_draw_fingerprints) ||
|
return REXCVAR_GET(perf_draw_fingerprints) || ShouldCollectDrawDiagnostics();
|
||||||
g_trace_draws_cvar_cache.load(std::memory_order_relaxed) ||
|
|
||||||
ShouldCollectDrawDiagnostics();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t GetCounter(CounterId id) {
|
int64_t GetCounter(CounterId id) {
|
||||||
|
|
@ -705,9 +697,6 @@ int64_t GetCounter(CounterId id) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResetFrameCounters() {
|
void ResetFrameCounters() {
|
||||||
g_trace_draws_cvar_cache.store(
|
|
||||||
rex::cvar::Query<bool>("skate3_ultrawide_trace_draws"),
|
|
||||||
std::memory_order_relaxed);
|
|
||||||
for (size_t i = 0; i < kNumCounters; ++i) {
|
for (size_t i = 0; i < kNumCounters; ++i) {
|
||||||
if (kIsGauge[i]) {
|
if (kIsGauge[i]) {
|
||||||
// Gauges: snapshot the current value, don't zero
|
// Gauges: snapshot the current value, don't zero
|
||||||
|
|
|
||||||
|
|
@ -1,184 +0,0 @@
|
||||||
// Generated from skate3_ultrawide_targets.toml. Do not edit by hand.
|
|
||||||
constexpr BuiltInTargetOverride kBuiltInSkate3TargetOverrides[] = {
|
|
||||||
{UINT64_C(0xA78541591A629661), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00004000), UINT32_C(0x00004000), UINT32_C(0x000002E0), UINT32_C(0x09020258), UINT32_C(0x0000000F), UINT32_C(0x00008777), UINT32_C(0x00000300), UINT32_C(0x00000008), UINT32_C(0x00000000), UINT64_C(0x1E6883FCCDE1F688), UINT64_C(0xA4A965C189287B99)}, true},
|
|
||||||
{UINT64_C(0x9D52F6177C7B389D), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00004000), UINT32_C(0x00004000), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00008777), UINT32_C(0x00000300), UINT32_C(0x00000008), UINT32_C(0x00000000), UINT64_C(0x1E6883FCCDE1F688), UINT64_C(0xA4A965C189287B99)}, true},
|
|
||||||
{UINT64_C(0xBFD1461001CB97E4), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x08000230), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x0DFDF1BCC0E7B56D), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xC205003194EFBC71), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x08000230), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x28D0A573402806EB), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xD878108EB66E9B28), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x08000230), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x07CF21EDB84C9E22), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xF9AB52AE558D3F50), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00004000), UINT32_C(0x00004000), UINT32_C(0x00000000), UINT32_C(0x04020118), UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000300), UINT32_C(0x00000001), UINT32_C(0x00000000), UINT64_C(0xB6C9863F710683EC), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x076AF30F69242406), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00004000), UINT32_C(0x00004000), UINT32_C(0x00000000), UINT32_C(0x04020118), UINT32_C(0x00000000), UINT32_C(0x00008777), UINT32_C(0x00000300), UINT32_C(0x00000008), UINT32_C(0x00000000), UINT64_C(0x1E6883FCCDE1F688), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xA4EF713C0B27236D), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00004000), UINT32_C(0x00004000), UINT32_C(0x00000000), UINT32_C(0x08000230), UINT32_C(0x00000000), UINT32_C(0x00008777), UINT32_C(0x00000300), UINT32_C(0x00000008), UINT32_C(0x00000000), UINT64_C(0x1E6883FCCDE1F688), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x8197FF5E7840DA63), {SemanticViewportClass::kSquare, UINT32_C(0x00000800), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x0000000F), UINT32_C(0x00700730), UINT32_C(0x0000043F), UINT32_C(0x00000006), UINT32_C(0x00000000), UINT64_C(0x9971A6822FCF2DD2), UINT64_C(0x12049EA773BAF206)}, true},
|
|
||||||
{UINT64_C(0xCE27E0AA3C30B48A), {SemanticViewportClass::kSquare, UINT32_C(0x00000800), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x01799B5C04C8EFE8), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xDD4117074EF2EAA6), {SemanticViewportClass::kSquare, UINT32_C(0x00000800), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x1F005A21696CC37E), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xFDC400257C26BEFC), {SemanticViewportClass::kSquare, UINT32_C(0x00000800), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x38B43E35C163614C), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x61EFEEA3DF226046), {SemanticViewportClass::kSquare, UINT32_C(0x00000800), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x1153D3552EF6E624), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x40E624D71F989930), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00004000), UINT32_C(0x00004000), UINT32_C(0x00000000), UINT32_C(0x0C020320), UINT32_C(0x00000000), UINT32_C(0x00008777), UINT32_C(0x00000300), UINT32_C(0x00000008), UINT32_C(0x00000000), UINT64_C(0x1E6883FCCDE1F688), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xEF3B5EA129E40669), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00004000), UINT32_C(0x00004000), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00008777), UINT32_C(0x00000300), UINT32_C(0x00000008), UINT32_C(0x00000000), UINT64_C(0x1E6883FCCDE1F688), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xEB009E6404D91B5A), {SemanticViewportClass::kSquare, UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x0000000F), UINT32_C(0x00700730), UINT32_C(0x0000043F), UINT32_C(0x00000006), UINT32_C(0x00000000), UINT64_C(0x9971A6822FCF2DD2), UINT64_C(0x70E709E9650F8CC0)}, true},
|
|
||||||
{UINT64_C(0x30625B4C1DF99FE8), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x08000230), UINT32_C(0x0000000F), UINT32_C(0x00700730), UINT32_C(0x0000043F), UINT32_C(0x00000006), UINT32_C(0x00000000), UINT64_C(0x9971A6822FCF2DD2), UINT64_C(0x8E01B3337D22E487)}, true},
|
|
||||||
{UINT64_C(0xA9446AF4EF2988DA), {SemanticViewportClass::kSquare, UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x1F005A21696CC37E), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xF82D5E2AA3448EC8), {SemanticViewportClass::kSquare, UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x38B43E35C163614C), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xCDB5E7DDBF3745FA), {SemanticViewportClass::kSquare, UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x1153D3552EF6E624), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x586B971BC5301FD6), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x0000000F), UINT32_C(0x00700730), UINT32_C(0x0000043F), UINT32_C(0x00000006), UINT32_C(0x00000000), UINT64_C(0x9971A6822FCF2DD2), UINT64_C(0xDCFF2237FACA6FA2)}, true},
|
|
||||||
{UINT64_C(0x5A53AE14E6682AF0), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x08000230), UINT32_C(0x0000000F), UINT32_C(0x00700730), UINT32_C(0x0000043F), UINT32_C(0x00000006), UINT32_C(0x00000000), UINT64_C(0x9971A6822FCF2DD2), UINT64_C(0x6D81B22A5A72F2F7)}, true},
|
|
||||||
{UINT64_C(0x9B7DAC17F3087CA7), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x8A6134DE7D8980C0), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x56CF04EDC1C67AD2), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x1F005A21696CC37E), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x630D4F6C8FF3BAC3), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xC0A7FEA59D737772), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xF3FB10C786C01BBF), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xAAE4AE2E54C97D0F), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x2B13F106B03A4C7D), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x69162B400E55DAC4), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xE47983C5D73AB140), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x38B43E35C163614C), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x0B7CE4C6F4A49838), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00004000), UINT32_C(0x00004000), UINT32_C(0x000002D0), UINT32_C(0x14000500), UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000300), UINT32_C(0x00000001), UINT32_C(0x00000000), UINT64_C(0xB6C9863F710683EC), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x99340CC09E2F9371), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000A00), UINT32_C(0x000005A0), UINT32_C(0x000002D0), UINT32_C(0x14000500), UINT32_C(0x0000000F), UINT32_C(0x00700732), UINT32_C(0x0000043F), UINT32_C(0x0000000D), UINT32_C(0x00000000), UINT64_C(0x8F9F6723F328A425), UINT64_C(0xAA0DF76CD5E0EDC6)}, true},
|
|
||||||
{UINT64_C(0xE4F667D1EF0C3541), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000A00), UINT32_C(0x000005A0), UINT32_C(0x000002D0), UINT32_C(0x14000500), UINT32_C(0x0000000F), UINT32_C(0x00700732), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xA43EDAB8CF26AC43), UINT64_C(0x1C8C6412B70D4904)}, true},
|
|
||||||
{UINT64_C(0x4CC45A2F1E231172), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000A00), UINT32_C(0x000005A0), UINT32_C(0x000002D0), UINT32_C(0x14000500), UINT32_C(0x0000000F), UINT32_C(0x00700730), UINT32_C(0x0000043F), UINT32_C(0x0000000D), UINT32_C(0x00000000), UINT64_C(0xA43EDAB8CF26AC43), UINT64_C(0x1C8C6412B70D4904)}, true},
|
|
||||||
{UINT64_C(0x6ACFCA21C84DD04F), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00004000), UINT32_C(0x00004000), UINT32_C(0x000002D0), UINT32_C(0x0A020280), UINT32_C(0x00000000), UINT32_C(0x00008777), UINT32_C(0x00000300), UINT32_C(0x00000008), UINT32_C(0x00000000), UINT64_C(0x1E6883FCCDE1F688), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xEC8FBC04212C0A4B), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00004000), UINT32_C(0x00004000), UINT32_C(0x000002D0), UINT32_C(0x0A020280), UINT32_C(0x00000000), UINT32_C(0x00000076), UINT32_C(0x00000300), UINT32_C(0x00000008), UINT32_C(0x00000000), UINT64_C(0x1E6883FCCDE1F688), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xD541A82D0F859592), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00004000), UINT32_C(0x00004000), UINT32_C(0x000002E0), UINT32_C(0x09020258), UINT32_C(0x00000000), UINT32_C(0x00000076), UINT32_C(0x00000300), UINT32_C(0x00000008), UINT32_C(0x00000000), UINT64_C(0x1E6883FCCDE1F688), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xE5F9E8A8BD7B81FF), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00004000), UINT32_C(0x00004000), UINT32_C(0x000002E0), UINT32_C(0x120004B0), UINT32_C(0x00000000), UINT32_C(0x00000076), UINT32_C(0x00000300), UINT32_C(0x00000008), UINT32_C(0x00000000), UINT64_C(0x1E6883FCCDE1F688), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xE380D9E97118C6B7), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120004B0), UINT32_C(0x0000000F), UINT32_C(0x00700730), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x156953004B00BE2F), UINT64_C(0x6122239794A98F31)}, true},
|
|
||||||
{UINT64_C(0xAB60CA4C0329178E), {SemanticViewportClass::kUnknown, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000040), UINT32_C(0x00000020), UINT32_C(0x000002E0), UINT32_C(0x00800050), UINT32_C(0x0000000F), UINT32_C(0x00700730), UINT32_C(0x0000043F), UINT32_C(0x00000006), UINT32_C(0x00000000), UINT64_C(0x08016D40A0EF5371), UINT64_C(0x3A7C78D0EB806EE8)}, true},
|
|
||||||
{UINT64_C(0xD59F8C3273E11AB5), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000090), UINT32_C(0x00000050), UINT32_C(0x000002E0), UINT32_C(0x01800050), UINT32_C(0x0000000F), UINT32_C(0x00700730), UINT32_C(0x0000043F), UINT32_C(0x00000006), UINT32_C(0x00000000), UINT64_C(0x08016D40A0EF5371), UINT64_C(0x3A7C78D0EB806EE8)}, true},
|
|
||||||
{UINT64_C(0x2769C85DCDEB8FDC), {SemanticViewportClass::kUnknown, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000040), UINT32_C(0x00000020), UINT32_C(0x000002E0), UINT32_C(0x00800050), UINT32_C(0x0000000F), UINT32_C(0x00700730), UINT32_C(0x0000043F), UINT32_C(0x00000006), UINT32_C(0x00000000), UINT64_C(0x08016D40A0EF5371), UINT64_C(0xE12EB29D7EA6D021)}, true},
|
|
||||||
{UINT64_C(0x79A2F6E528FFF85B), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000090), UINT32_C(0x00000050), UINT32_C(0x000002E0), UINT32_C(0x01800050), UINT32_C(0x0000000F), UINT32_C(0x00700730), UINT32_C(0x0000043F), UINT32_C(0x00000006), UINT32_C(0x00000000), UINT64_C(0x08016D40A0EF5371), UINT64_C(0xE12EB29D7EA6D021)}, true},
|
|
||||||
{UINT64_C(0xE25A14DA07768B39), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000240), UINT32_C(0x00000140), UINT32_C(0x000002E0), UINT32_C(0x04800140), UINT32_C(0x0000000F), UINT32_C(0x00700730), UINT32_C(0x0000043F), UINT32_C(0x00000006), UINT32_C(0x00000000), UINT64_C(0x34FDABFF54D0767C), UINT64_C(0x670F9657E351B89B)}, true},
|
|
||||||
{UINT64_C(0xD899F54B1EFCB5C4), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00004000), UINT32_C(0x00004000), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000300), UINT32_C(0x00000001), UINT32_C(0x00000000), UINT64_C(0xB6C9863F710683EC), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x1591D381BF0A7CE5), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700732), UINT32_C(0x0000043F), UINT32_C(0x00000006), UINT32_C(0x00000000), UINT64_C(0x2A6DB4A54C1D6A44), UINT64_C(0x06CA19234014B7CF)}, true},
|
|
||||||
{UINT64_C(0x199AA29FA7991FC5), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700732), UINT32_C(0x0000043F), UINT32_C(0x00000006), UINT32_C(0x00000000), UINT64_C(0x2A6DB4A54C1D6A44), UINT64_C(0xEFAEF20D9DD3A856)}, true},
|
|
||||||
{UINT64_C(0x85508A201CA4F08B), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700732), UINT32_C(0x0000043F), UINT32_C(0x0000000D), UINT32_C(0x00000000), UINT64_C(0x229B213C18BF3580), UINT64_C(0x002060C7FFA5DBEE)}, true},
|
|
||||||
{UINT64_C(0x01A2EDFB77F55C72), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xC186F78859736B49), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x4098E5BF99169505), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xB814BA67EA32F032), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x9D3ACA8E7E627D61), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00708733), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xC186F78859736B49), UINT64_C(0xEB864605A91539ED)}, true},
|
|
||||||
{UINT64_C(0x96D40D4C80EFF24A), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00708733), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xB814BA67EA32F032), UINT64_C(0xE1D8B5E58C05821E)}, true},
|
|
||||||
{UINT64_C(0x1FC318709FD6C1D9), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x4DA02D43D609305C), UINT64_C(0x826E70D1F5709AB4)}, true},
|
|
||||||
{UINT64_C(0x7154460DEA2784F2), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x87E91F0B7DE6C7A5), UINT64_C(0xBD90261648A8EE85)}, true},
|
|
||||||
{UINT64_C(0xD2593ADB4AABB99E), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x4884B48A4C4D42BD), UINT64_C(0x7386295CA842ED62)}, true},
|
|
||||||
{UINT64_C(0xED4AE420F8A90FAF), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x4DA02D43D609305C), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xB3F551C98DA3B0D8), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x87E91F0B7DE6C7A5), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xF2CC74A09A11CAB3), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x4884B48A4C4D42BD), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x15C0DC717C5BE5C0), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x129E7F5770905F10), UINT64_C(0x437E40C3B326C513)}, true},
|
|
||||||
{UINT64_C(0x50A5FDF3723B2EE6), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00708736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xBBD7F3BD8E43C865), UINT64_C(0x26A449F09A551230)}, true},
|
|
||||||
{UINT64_C(0xDD5AABF82064D371), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x11D7AC81789C78E2), UINT64_C(0x0D70BBC32834DD35)}, true},
|
|
||||||
{UINT64_C(0x34F99C310F21DAE1), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x4DA02D43D609305C), UINT64_C(0x826E70D1F5709AB4)}, true},
|
|
||||||
{UINT64_C(0x623695D495D11C5A), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x87E91F0B7DE6C7A5), UINT64_C(0xBD90261648A8EE85)}, true},
|
|
||||||
{UINT64_C(0xEA1E4969126AB23C), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x5678306911DBFA21), UINT64_C(0x0BFC7C383593DB01)}, true},
|
|
||||||
{UINT64_C(0x05CC09312C3E9F9B), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xB59486CC29609065), UINT64_C(0x300AB8E7F58DD49E)}, true},
|
|
||||||
{UINT64_C(0x66DE18BBF0EC8645), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xEECAE2FDF2D987A8), UINT64_C(0x903FD6B5FDBD396C)}, true},
|
|
||||||
{UINT64_C(0x771C5EDB6865E300), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x10807D45C83F929C), UINT64_C(0xAA010FA0ACB4A2DE)}, true},
|
|
||||||
{UINT64_C(0x0D8656F581B26A36), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x4884B48A4C4D42BD), UINT64_C(0x7386295CA842ED62)}, true},
|
|
||||||
{UINT64_C(0x82D90DCCF0EF67D4), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x6D83BC72961EFDD6), UINT64_C(0x703CCA8334D5F0D3)}, true},
|
|
||||||
{UINT64_C(0x77FFFC7414262CCC), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x80F5E44CF8F8C0F6), UINT64_C(0x6A7FC4375C8A174E)}, true},
|
|
||||||
{UINT64_C(0x4DB8FFE5868CE91E), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xB56724DBA4CA4FE0), UINT64_C(0xC24E796B8CA7A91A)}, true},
|
|
||||||
{UINT64_C(0x6FA9EAA188A8E9A8), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x2645EEDA2D96AD00), UINT64_C(0x4E669779FCFA28A7)}, true},
|
|
||||||
{UINT64_C(0xD62FCC7C5DA7DF5F), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x3E6FCA0DE0B3A8C2), UINT64_C(0xB3F33593C6D09C78)}, true},
|
|
||||||
{UINT64_C(0xA2476D49450F3D33), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xA0BE8B27220B13DA), UINT64_C(0xAE440AA8E3BD1EFF)}, true},
|
|
||||||
{UINT64_C(0x11A78BDBB7A54683), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x843B72BABFC575D2), UINT64_C(0x273A3914C45D195F)}, true},
|
|
||||||
{UINT64_C(0x4878EFC57C23F637), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x77B1A22643B2D4A5), UINT64_C(0x2650312EFC7A723E)}, true},
|
|
||||||
{UINT64_C(0x3CBC4808BED3C0CE), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xF98383D7822FCD4B), UINT64_C(0xB8659B1565935E42)}, true},
|
|
||||||
{UINT64_C(0x157511950F5C4257), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x57FCA2530F71C768), UINT64_C(0x31E37C33EEAE5603)}, true},
|
|
||||||
{UINT64_C(0x67D5ABC6E2419EBC), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xFF866FD9D067A561), UINT64_C(0x31E37C33EEAE5603)}, true},
|
|
||||||
{UINT64_C(0x1CF9353AA1132855), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xBF42AC470AA4CE13), UINT64_C(0xFF772F11F9DA66C7)}, true},
|
|
||||||
{UINT64_C(0xC59FCB667E0B50CA), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xB35C2C3AC53D594A), UINT64_C(0x59F928CA74FC1F1B)}, true},
|
|
||||||
{UINT64_C(0xD2B3995707485985), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x2BA7E44E7E1A1176), UINT64_C(0x4CDED5DED927F9B0)}, true},
|
|
||||||
{UINT64_C(0x8B1DB6B090F019E4), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xF91B29D8FC044DBF), UINT64_C(0x959B4F51AB838BB0)}, true},
|
|
||||||
{UINT64_C(0x3F5A4F2F89867D02), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x112A2355CC0D704D), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x1D77B495DAD1A0ED), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xB4E21448711110DE), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x576ABA2EB83FD092), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x9176F3F9F09C4B6D), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xC4D3A56D246F5008), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00004000), UINT32_C(0x00004000), UINT32_C(0x000002E0), UINT32_C(0x09020258), UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000300), UINT32_C(0x00000001), UINT32_C(0x00000000), UINT64_C(0xB6C9863F710683EC), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x3E9C933709DBFC34), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700732), UINT32_C(0x0000043F), UINT32_C(0x00000006), UINT32_C(0x00000000), UINT64_C(0x2A6DB4A54C1D6A44), UINT64_C(0x06CA19234014B7CF)}, true},
|
|
||||||
{UINT64_C(0x1043548A365028B4), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700732), UINT32_C(0x0000043F), UINT32_C(0x00000006), UINT32_C(0x00000000), UINT64_C(0x2A6DB4A54C1D6A44), UINT64_C(0xEFAEF20D9DD3A856)}, true},
|
|
||||||
{UINT64_C(0xE44B22B012480B7E), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700732), UINT32_C(0x0000043F), UINT32_C(0x0000000D), UINT32_C(0x00000000), UINT64_C(0x229B213C18BF3580), UINT64_C(0x002060C7FFA5DBEE)}, true},
|
|
||||||
{UINT64_C(0xDF2B9CC0644CF96B), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xC186F78859736B49), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xE53ACE77F5E03E94), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xB814BA67EA32F032), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x07F4727750423C34), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00708733), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xC186F78859736B49), UINT64_C(0xEB864605A91539ED)}, true},
|
|
||||||
{UINT64_C(0xBAF6F0A8238A1617), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00708733), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xB814BA67EA32F032), UINT64_C(0xE1D8B5E58C05821E)}, true},
|
|
||||||
{UINT64_C(0x95825DA3BEB63618), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x4DA02D43D609305C), UINT64_C(0x826E70D1F5709AB4)}, true},
|
|
||||||
{UINT64_C(0xA86486AAEC6B8FD3), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x87E91F0B7DE6C7A5), UINT64_C(0xBD90261648A8EE85)}, true},
|
|
||||||
{UINT64_C(0x219888D0C81A4EBB), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x4884B48A4C4D42BD), UINT64_C(0x7386295CA842ED62)}, true},
|
|
||||||
{UINT64_C(0xFE2CEB59D8971A5A), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x4DA02D43D609305C), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x6DBBC8AC52778C65), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x87E91F0B7DE6C7A5), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xF8D6304318883E2E), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x4884B48A4C4D42BD), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x6F421B04AD229861), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x129E7F5770905F10), UINT64_C(0x437E40C3B326C513)}, true},
|
|
||||||
{UINT64_C(0xBE24F96A2F86A743), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00708736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xBBD7F3BD8E43C865), UINT64_C(0x26A449F09A551230)}, true},
|
|
||||||
{UINT64_C(0xBC63805B609732D4), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x11D7AC81789C78E2), UINT64_C(0x0D70BBC32834DD35)}, true},
|
|
||||||
{UINT64_C(0xF88AEB71252E4AC0), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x4DA02D43D609305C), UINT64_C(0x826E70D1F5709AB4)}, true},
|
|
||||||
{UINT64_C(0x045001575D46C1BB), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x87E91F0B7DE6C7A5), UINT64_C(0xBD90261648A8EE85)}, true},
|
|
||||||
{UINT64_C(0xB48E7907D9CC5CDD), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x5678306911DBFA21), UINT64_C(0x0BFC7C383593DB01)}, true},
|
|
||||||
{UINT64_C(0x6C53B91F9E7CDEEA), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xB59486CC29609065), UINT64_C(0x300AB8E7F58DD49E)}, true},
|
|
||||||
{UINT64_C(0x1A2A2338B4866624), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xEECAE2FDF2D987A8), UINT64_C(0x903FD6B5FDBD396C)}, true},
|
|
||||||
{UINT64_C(0xAD058C3644007689), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x10807D45C83F929C), UINT64_C(0xAA010FA0ACB4A2DE)}, true},
|
|
||||||
{UINT64_C(0xA376541F441E4FB3), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x4884B48A4C4D42BD), UINT64_C(0x7386295CA842ED62)}, true},
|
|
||||||
{UINT64_C(0x5B5BDF4A7233BCB5), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x6D83BC72961EFDD6), UINT64_C(0x703CCA8334D5F0D3)}, true},
|
|
||||||
{UINT64_C(0x1D397F204E732829), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x80F5E44CF8F8C0F6), UINT64_C(0x6A7FC4375C8A174E)}, true},
|
|
||||||
{UINT64_C(0x5E9A899407A60B07), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xB56724DBA4CA4FE0), UINT64_C(0xC24E796B8CA7A91A)}, true},
|
|
||||||
{UINT64_C(0xBFF2A6E479D2494D), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x2645EEDA2D96AD00), UINT64_C(0x4E669779FCFA28A7)}, true},
|
|
||||||
{UINT64_C(0x0562682FA93BDFC6), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x3E6FCA0DE0B3A8C2), UINT64_C(0xB3F33593C6D09C78)}, true},
|
|
||||||
{UINT64_C(0x5933941C92C6ACE2), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xA0BE8B27220B13DA), UINT64_C(0xAE440AA8E3BD1EFF)}, true},
|
|
||||||
{UINT64_C(0x5490C50558B0A6FA), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x843B72BABFC575D2), UINT64_C(0x273A3914C45D195F)}, true},
|
|
||||||
{UINT64_C(0x8E3E16B4041D10A6), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x77B1A22643B2D4A5), UINT64_C(0x2650312EFC7A723E)}, true},
|
|
||||||
{UINT64_C(0x80D634DEEEFA3023), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xF98383D7822FCD4B), UINT64_C(0xB8659B1565935E42)}, true},
|
|
||||||
{UINT64_C(0x3B4A27CE871F46DE), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x57FCA2530F71C768), UINT64_C(0x31E37C33EEAE5603)}, true},
|
|
||||||
{UINT64_C(0xAFD8D05CE702C08D), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xFF866FD9D067A561), UINT64_C(0x31E37C33EEAE5603)}, true},
|
|
||||||
{UINT64_C(0xFB8DCC055DF6E894), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xBF42AC470AA4CE13), UINT64_C(0xFF772F11F9DA66C7)}, true},
|
|
||||||
{UINT64_C(0x86158F7A9968A9FF), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xB35C2C3AC53D594A), UINT64_C(0x59F928CA74FC1F1B)}, true},
|
|
||||||
{UINT64_C(0x546215D3B88C4748), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x2BA7E44E7E1A1176), UINT64_C(0x4CDED5DED927F9B0)}, true},
|
|
||||||
{UINT64_C(0xF6B8FF0D0BDCD5AD), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xF91B29D8FC044DBF), UINT64_C(0x959B4F51AB838BB0)}, true},
|
|
||||||
{UINT64_C(0x4F1CF2D9F10DDC4F), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x112A2355CC0D704D), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x67D152C6CBD00FD8), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xB4E21448711110DE), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x09BC09F4487FDEEF), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x9176F3F9F09C4B6D), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xEEAE693F419ED9C4), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00004000), UINT32_C(0x00004000), UINT32_C(0x000002D0), UINT32_C(0x14000500), UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000300), UINT32_C(0x00000001), UINT32_C(0x00000000), UINT64_C(0xB6C9863F710683EC), UINT64_C(0xA4A965C189287B99)}, true},
|
|
||||||
{UINT64_C(0xC4EC310C78501C89), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x11D7AC81789C78E2), UINT64_C(0x0D70BBC32834DD35)}, true},
|
|
||||||
{UINT64_C(0x57C306778FFCE634), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x11D7AC81789C78E2), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x7E8329B3B34B568C), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x11D7AC81789C78E2), UINT64_C(0x0D70BBC32834DD35)}, true},
|
|
||||||
{UINT64_C(0x9AF67C1814B20861), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x11D7AC81789C78E2), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xBCF17602372C8923), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x768D0C1832BAA99F), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x863A82C331CA4E7A), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xDD8686FDE7D4FE2F), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xA1039E2BA9F6F0F2), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x1153D3552EF6E624), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xD30D492BB72A8E84), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x5678306911DBFA21), UINT64_C(0x0BFC7C383593DB01)}, true},
|
|
||||||
{UINT64_C(0x6C53DC64C88E5653), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xB59486CC29609065), UINT64_C(0x300AB8E7F58DD49E)}, true},
|
|
||||||
{UINT64_C(0x112DABFB9C0D2C5D), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xEECAE2FDF2D987A8), UINT64_C(0x903FD6B5FDBD396C)}, true},
|
|
||||||
{UINT64_C(0x75445340AA61B6B8), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x10807D45C83F929C), UINT64_C(0xAA010FA0ACB4A2DE)}, true},
|
|
||||||
{UINT64_C(0xFBFF33846B090543), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x5678306911DBFA21), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x19B440C9ECEB7000), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xB59486CC29609065), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x7A1B51CF16B6E6BA), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xEECAE2FDF2D987A8), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xF122FFFE0AC6ACA0), {SemanticViewportClass::kDoubleWideGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000280), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x10807D45C83F929C), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x46DAB5A8908F95E5), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x5678306911DBFA21), UINT64_C(0x0BFC7C383593DB01)}, true},
|
|
||||||
{UINT64_C(0x3F49FEE14362C5E2), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xB59486CC29609065), UINT64_C(0x300AB8E7F58DD49E)}, true},
|
|
||||||
{UINT64_C(0x69EF120F538756DC), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xEECAE2FDF2D987A8), UINT64_C(0x903FD6B5FDBD396C)}, true},
|
|
||||||
{UINT64_C(0xEADF80DF6BCFBDA1), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000007), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x10807D45C83F929C), UINT64_C(0xAA010FA0ACB4A2DE)}, true},
|
|
||||||
{UINT64_C(0x130AEC24E5FEB916), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x5678306911DBFA21), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x544BEB932F0B2CCD), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xB59486CC29609065), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x457ECAD3E8859627), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xEECAE2FDF2D987A8), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0xD465D0FF609B8C01), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x10807D45C83F929C), UINT64_C(0x0000000000000000)}, true},
|
|
||||||
{UINT64_C(0x992F65716DDE5AB0), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00004000), UINT32_C(0x00004000), UINT32_C(0x000002E0), UINT32_C(0x120104B0), UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000300), UINT32_C(0x00000001), UINT32_C(0x00000000), UINT64_C(0xB6C9863F710683EC), UINT64_C(0xA4A965C189287B99)}, true},
|
|
||||||
{UINT64_C(0x47CEC4DBD2618777), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000A00), UINT32_C(0x000005A0), UINT32_C(0x000002D0), UINT32_C(0x14000500), UINT32_C(0x0000000F), UINT32_C(0x00700732), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x3D5BF97DD0CF2BF4), UINT64_C(0xB1592798F0CD1839)}, true},
|
|
||||||
{UINT64_C(0x16721B512CC8E52A), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000A00), UINT32_C(0x000005A0), UINT32_C(0x000002D0), UINT32_C(0x14000500), UINT32_C(0x0000000F), UINT32_C(0x00700736), UINT32_C(0x0000043F), UINT32_C(0x0000000D), UINT32_C(0x00000000), UINT64_C(0xE91029D930637F6E), UINT64_C(0x38818B3E2ED482F4)}, true},
|
|
||||||
{UINT64_C(0xA2D3BF5F1FAE89A5), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x08000230), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x5AB7345B9857FD4B), UINT64_C(0x0000000000000000)}, false},
|
|
||||||
{UINT64_C(0x6F2FE2DB5E2C9D9B), {SemanticViewportClass::kSquare, UINT32_C(0x00000800), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x8A6134DE7D8980C0), UINT64_C(0x0000000000000000)}, false},
|
|
||||||
{UINT64_C(0x3819C68257AAB4A7), {SemanticViewportClass::kSquare, UINT32_C(0x00000800), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xC0A7FEA59D737772), UINT64_C(0x0000000000000000)}, false},
|
|
||||||
{UINT64_C(0x161CCBE6FB7FA2CB), {SemanticViewportClass::kSquare, UINT32_C(0x00000800), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xAAE4AE2E54C97D0F), UINT64_C(0x0000000000000000)}, false},
|
|
||||||
{UINT64_C(0x0C945E0D516ACB09), {SemanticViewportClass::kSquare, UINT32_C(0x00000800), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x69162B400E55DAC4), UINT64_C(0x0000000000000000)}, false},
|
|
||||||
{UINT64_C(0x593760193C97EA86), {SemanticViewportClass::kSquare, UINT32_C(0x00000800), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xDD8686FDE7D4FE2F), UINT64_C(0x0000000000000000)}, false},
|
|
||||||
{UINT64_C(0x1760A25BDB3C3A8F), {SemanticViewportClass::kSquare, UINT32_C(0x00000800), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x768D0C1832BAA99F), UINT64_C(0x0000000000000000)}, false},
|
|
||||||
{UINT64_C(0xF43F611A283B53B4), {SemanticViewportClass::kSquare, UINT32_C(0x00000800), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x3F7D7B06780F7147), UINT64_C(0x0000000000000000)}, false},
|
|
||||||
{UINT64_C(0xD760920DBAB9A3BF), {SemanticViewportClass::kSquare, UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x8A6134DE7D8980C0), UINT64_C(0x0000000000000000)}, false},
|
|
||||||
{UINT64_C(0x26BDC6C599B4969B), {SemanticViewportClass::kSquare, UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xC0A7FEA59D737772), UINT64_C(0x0000000000000000)}, false},
|
|
||||||
{UINT64_C(0x0B1AAB009E382577), {SemanticViewportClass::kSquare, UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xAAE4AE2E54C97D0F), UINT64_C(0x0000000000000000)}, false},
|
|
||||||
{UINT64_C(0xA965E653AFB7AA55), {SemanticViewportClass::kSquare, UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x69162B400E55DAC4), UINT64_C(0x0000000000000000)}, false},
|
|
||||||
{UINT64_C(0xCF98B5A98C16103B), {SemanticViewportClass::kSquare, UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0x768D0C1832BAA99F), UINT64_C(0x0000000000000000)}, false},
|
|
||||||
{UINT64_C(0x1287298BB43864D2), {SemanticViewportClass::kSquare, UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x00000400), UINT32_C(0x00000400), UINT32_C(0x00000000), UINT32_C(0x18000640), UINT32_C(0x00000000), UINT32_C(0x00708737), UINT32_C(0x0000043F), UINT32_C(0x00000004), UINT32_C(0x00000000), UINT64_C(0xDD8686FDE7D4FE2F), UINT64_C(0x0000000000000000)}, false},
|
|
||||||
{UINT64_C(0xB8ED22303014A9A0), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000A00), UINT32_C(0x000005A0), UINT32_C(0x000002D0), UINT32_C(0x14000500), UINT32_C(0x0000000F), UINT32_C(0x00700730), UINT32_C(0x0000043F), UINT32_C(0x00000006), UINT32_C(0x00000000), UINT64_C(0x47A7554B0F7A34EC), UINT64_C(0xC9BD70547A68F4C5)}, false},
|
|
||||||
{UINT64_C(0xAE5EF820D5073D51), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120004B0), UINT32_C(0x0000000F), UINT32_C(0x00700770), UINT32_C(0x0000043F), UINT32_C(0x0000000D), UINT32_C(0x00000000), UINT64_C(0x3EC739DF445745A9), UINT64_C(0x36F744866629EE18)}, false},
|
|
||||||
{UINT64_C(0xE28F8BEB4E09C12D), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120004B0), UINT32_C(0x0000000F), UINT32_C(0x00700770), UINT32_C(0x0000043F), UINT32_C(0x0000000D), UINT32_C(0x00000000), UINT64_C(0x3EC739DF445745A9), UINT64_C(0x7AF459B0BFF69478)}, false},
|
|
||||||
{UINT64_C(0xBFC1B2D8F2E33B38), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000900), UINT32_C(0x00000500), UINT32_C(0x000002E0), UINT32_C(0x120004B0), UINT32_C(0x0000000F), UINT32_C(0x00700730), UINT32_C(0x0000043F), UINT32_C(0x00000006), UINT32_C(0x00000000), UINT64_C(0x8895AB90906ECBC1), UINT64_C(0x5928557DC4F52989)}, false},
|
|
||||||
{UINT64_C(0x9560A636E29DFA8A), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000240), UINT32_C(0x00000140), UINT32_C(0x000002E0), UINT32_C(0x04800140), UINT32_C(0x0000000F), UINT32_C(0x00700730), UINT32_C(0x0000043F), UINT32_C(0x00000006), UINT32_C(0x00000000), UINT64_C(0x08016D40A0EF5371), UINT64_C(0x8064167EECA65C8D)}, false},
|
|
||||||
{UINT64_C(0x130889F224084C65), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000240), UINT32_C(0x00000140), UINT32_C(0x000002E0), UINT32_C(0x04800140), UINT32_C(0x0000000F), UINT32_C(0x00700730), UINT32_C(0x0000043F), UINT32_C(0x00000006), UINT32_C(0x00000000), UINT64_C(0x08016D40A0EF5371), UINT64_C(0x35754B7A87E5683D)}, false},
|
|
||||||
{UINT64_C(0xAD7D02EB7119AD40), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000240), UINT32_C(0x00000140), UINT32_C(0x000002E0), UINT32_C(0x04800140), UINT32_C(0x0000000F), UINT32_C(0x00700730), UINT32_C(0x0000043F), UINT32_C(0x00000006), UINT32_C(0x00000000), UINT64_C(0x08016D40A0EF5371), UINT64_C(0x3A7C78D0EB806EE8)}, false},
|
|
||||||
{UINT64_C(0xCC1AC526FE146AB0), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000A00), UINT32_C(0x000005A0), UINT32_C(0x000002D0), UINT32_C(0x14000500), UINT32_C(0x0000000F), UINT32_C(0x00700730), UINT32_C(0x0000043F), UINT32_C(0x0000000D), UINT32_C(0x00000000), UINT64_C(0x3D5BF97DD0CF2BF4), UINT64_C(0xB1592798F0CD1839)}, false},
|
|
||||||
{UINT64_C(0x6329B6390DA4F1F9), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00004000), UINT32_C(0x00004000), UINT32_C(0x000002D0), UINT32_C(0x0A020280), UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000300), UINT32_C(0x00000001), UINT32_C(0x00000000), UINT64_C(0xB6C9863F710683EC), UINT64_C(0x0000000000000000)}, false},
|
|
||||||
{UINT64_C(0x4001CB4958EAF13D), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00004000), UINT32_C(0x00004000), UINT32_C(0x000002D0), UINT32_C(0x0A020280), UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000300), UINT32_C(0x00000001), UINT32_C(0x00000000), UINT64_C(0xB6C9863F710683EC), UINT64_C(0xA4A965C189287B99)}, false},
|
|
||||||
{UINT64_C(0xAF9DF4D3A87129B8), {SemanticViewportClass::kGameAspect, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000A00), UINT32_C(0x000005A0), UINT32_C(0x000002D0), UINT32_C(0x14000500), UINT32_C(0x0000000F), UINT32_C(0x00700730), UINT32_C(0x0000043F), UINT32_C(0x0000000D), UINT32_C(0x00000000), UINT64_C(0x166196AE4F110875), UINT64_C(0x39004B0872361843)}, false},
|
|
||||||
{UINT64_C(0xBD81D7A062FC455D), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00004000), UINT32_C(0x00004000), UINT32_C(0x000002E0), UINT32_C(0x120004B0), UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00000300), UINT32_C(0x00000001), UINT32_C(0x00000000), UINT64_C(0xB6C9863F710683EC), UINT64_C(0x0000000000000000)}, false},
|
|
||||||
{UINT64_C(0x73EBDF3D39AFE8D4), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00004000), UINT32_C(0x00004000), UINT32_C(0x000002E0), UINT32_C(0x120004B0), UINT32_C(0x0000000F), UINT32_C(0x00008777), UINT32_C(0x00000300), UINT32_C(0x00000008), UINT32_C(0x00000000), UINT64_C(0x1E6883FCCDE1F688), UINT64_C(0xA4A965C189287B99)}, false},
|
|
||||||
{UINT64_C(0x8CC88D3928860FC0), {SemanticViewportClass::kSquare, UINT32_C(0x00000000), UINT32_C(0x00000000), UINT32_C(0x00004000), UINT32_C(0x00004000), UINT32_C(0x000002D0), UINT32_C(0x0A020280), UINT32_C(0x0000000F), UINT32_C(0x00008777), UINT32_C(0x00000300), UINT32_C(0x00000008), UINT32_C(0x00000000), UINT64_C(0x1E6883FCCDE1F688), UINT64_C(0xA4A965C189287B99)}, false},
|
|
||||||
};
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -49,18 +49,6 @@ REXCVAR_DEFINE_BOOL(draw_resolution_scaled_texture_offsets, true, "GPU/Shader",
|
||||||
REXCVAR_DEFINE_BOOL(occlusion_query_enable, true, "GPU", "Enable host occlusion query handling")
|
REXCVAR_DEFINE_BOOL(occlusion_query_enable, true, "GPU", "Enable host occlusion query handling")
|
||||||
.lifecycle(rex::cvar::Lifecycle::kHotReload);
|
.lifecycle(rex::cvar::Lifecycle::kHotReload);
|
||||||
|
|
||||||
// Skate 3 Hor+ ultrawide classifier controls shared by every graphics backend.
|
|
||||||
// Defined here (not per backend) so builds with several backends compiled in
|
|
||||||
// register them exactly once.
|
|
||||||
REXCVAR_DEFINE_BOOL(skate3_ultrawide_skip_shadow_targets, true, "Skate 3",
|
|
||||||
"Do not apply Skate 3 Hor+ NDC correction while rendering likely shadow maps")
|
|
||||||
.lifecycle(rex::cvar::Lifecycle::kHotReload);
|
|
||||||
REXCVAR_DEFINE_INT32(skate3_ultrawide_shadow_skip_mode, 2, "Skate 3",
|
|
||||||
"Shadow pass skip mode: 1 = square atlases, 2 = plus large offscreen, "
|
|
||||||
"3 = plus all depth-only")
|
|
||||||
.range(1, 3)
|
|
||||||
.lifecycle(rex::cvar::Lifecycle::kHotReload);
|
|
||||||
|
|
||||||
REXCVAR_DEFINE_STRING(readback_resolve, "none", "GPU",
|
REXCVAR_DEFINE_STRING(readback_resolve, "none", "GPU",
|
||||||
"Controls CPU readback of render-to-texture resolve results.\n"
|
"Controls CPU readback of render-to-texture resolve results.\n"
|
||||||
" none: Disable readback (default)\n"
|
" none: Disable readback (default)\n"
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,6 @@
|
||||||
#include <rex/graphics/d3d12/shader.h>
|
#include <rex/graphics/d3d12/shader.h>
|
||||||
#include <rex/graphics/flags.h>
|
#include <rex/graphics/flags.h>
|
||||||
#include <rex/graphics/registers.h>
|
#include <rex/graphics/registers.h>
|
||||||
#include <rex/graphics/ultrawide_debug.h>
|
|
||||||
#include <rex/graphics/util/draw.h>
|
#include <rex/graphics/util/draw.h>
|
||||||
#include <rex/graphics/xenos.h>
|
#include <rex/graphics/xenos.h>
|
||||||
#include <rex/kernel/xboxkrnl/video.h>
|
#include <rex/kernel/xboxkrnl/video.h>
|
||||||
|
|
@ -58,18 +57,6 @@ REXCVAR_DEFINE_BOOL(d3d12_gpu_timestamp_buckets, false, "GPU/D3D12",
|
||||||
"the breakdown in the FPS overlay and a periodic profile log")
|
"the breakdown in the FPS overlay and a periodic profile log")
|
||||||
.lifecycle(rex::cvar::Lifecycle::kHotReload);
|
.lifecycle(rex::cvar::Lifecycle::kHotReload);
|
||||||
|
|
||||||
// Defined in graphics/command_processor.cpp, shared with the Vulkan backend.
|
|
||||||
REXCVAR_DECLARE(bool, skate3_ultrawide_skip_shadow_targets);
|
|
||||||
REXCVAR_DECLARE(int32_t, skate3_ultrawide_shadow_skip_mode);
|
|
||||||
REXCVAR_DEFINE_BOOL(skate3_ultrawide_fake_occlusion_queries, false, "Skate 3",
|
|
||||||
"Return positive visibility query results while Skate 3 Hor+ ultrawide is "
|
|
||||||
"active so side-of-frame assets remain resident")
|
|
||||||
.lifecycle(rex::cvar::Lifecycle::kHotReload);
|
|
||||||
REXCVAR_DEFINE_INT32(skate3_ultrawide_fake_occlusion_sample_count, 1000, "Skate 3",
|
|
||||||
"Sample count returned by Skate 3 ultrawide visibility query faking")
|
|
||||||
.range(1, 1000000)
|
|
||||||
.lifecycle(rex::cvar::Lifecycle::kHotReload);
|
|
||||||
|
|
||||||
namespace rex::graphics::d3d12 {
|
namespace rex::graphics::d3d12 {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
@ -82,154 +69,6 @@ bool IsGameplayStateActive(const system::KernelState* kernel_state) {
|
||||||
return gameplay_context && *gameplay_context == 1;
|
return gameplay_context && *gameplay_context == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Skate3UltrawideDrawState {
|
|
||||||
bool correction_active = false;
|
|
||||||
bool skip_shadow_targets = false;
|
|
||||||
uint32_t shadow_skip_mode = 1;
|
|
||||||
float hor_plus_scale = 1.0f;
|
|
||||||
};
|
|
||||||
|
|
||||||
double GetSkate3UltrawideTargetAspect(const ui::Presenter* presenter = nullptr) {
|
|
||||||
if (!rex::cvar::Query<bool>("skate3_ultrawide") ||
|
|
||||||
!ultrawide_debug::IsSkate3GameplayUltrawideActive()) {
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr double kBaseAspect = 16.0 / 9.0;
|
|
||||||
uint32_t surface_width = 0;
|
|
||||||
uint32_t surface_height = 0;
|
|
||||||
if (presenter && presenter->GetSurfacePaintConnectionSize(surface_width, surface_height) &&
|
|
||||||
surface_width && surface_height) {
|
|
||||||
const double surface_aspect = double(surface_width) / double(surface_height);
|
|
||||||
if (surface_aspect > kBaseAspect + 0.01) {
|
|
||||||
return std::clamp(surface_aspect, kBaseAspect, 8.0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const double target_aspect = rex::cvar::Query<double>("skate3_ultrawide_target_aspect");
|
|
||||||
return target_aspect > kBaseAspect + 0.01 ? std::clamp(target_aspect, kBaseAspect, 8.0) : 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ApplySkate3UltrawidePresenterAspect(const ui::Presenter* presenter, uint32_t& display_width,
|
|
||||||
uint32_t& display_height) {
|
|
||||||
const double target_aspect = GetSkate3UltrawideTargetAspect(presenter);
|
|
||||||
if (target_aspect <= 0.0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
rex::cvar::SetFlagByName("skate3_ultrawide_target_aspect", std::to_string(target_aspect));
|
|
||||||
|
|
||||||
display_height =
|
|
||||||
uint32_t(std::clamp(rex::cvar::Query<int32_t>("skate3_ultrawide_base_height"), 480, 2160));
|
|
||||||
display_width =
|
|
||||||
uint32_t(std::clamp(target_aspect * double(display_height) + 0.5, 1.0, 4095.0));
|
|
||||||
}
|
|
||||||
|
|
||||||
float ComputeSkate3UltrawideHorPlusScale() {
|
|
||||||
const double manual_scale = rex::cvar::Query<double>("skate3_ultrawide_hor_plus_scale");
|
|
||||||
if (manual_scale > 0.0) {
|
|
||||||
return float(std::clamp(manual_scale, 0.25, 4.0));
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr double kBaseAspect = 16.0 / 9.0;
|
|
||||||
double aspect = GetSkate3UltrawideTargetAspect();
|
|
||||||
if (aspect <= 0.0) {
|
|
||||||
const int32_t display_width = REXCVAR_GET(video_mode_width);
|
|
||||||
const int32_t display_height = REXCVAR_GET(video_mode_height);
|
|
||||||
if (display_width <= 0 || display_height <= 0) {
|
|
||||||
return 1.0f;
|
|
||||||
}
|
|
||||||
aspect = double(display_width) / double(display_height);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aspect <= kBaseAspect + 0.01f) {
|
|
||||||
return 1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
return float(std::clamp(kBaseAspect / aspect, 0.25, 1.0));
|
|
||||||
}
|
|
||||||
|
|
||||||
Skate3UltrawideDrawState QuerySkate3UltrawideDrawState() {
|
|
||||||
Skate3UltrawideDrawState state;
|
|
||||||
state.correction_active = rex::cvar::Query<bool>("skate3_ultrawide") &&
|
|
||||||
rex::cvar::Query<bool>("skate3_ultrawide_hor_plus") &&
|
|
||||||
ultrawide_debug::IsSkate3GameplayUltrawideActive() &&
|
|
||||||
!rex::cvar::Query<bool>("skate3_ultrawide_disable_ndc_correction");
|
|
||||||
if (!state.correction_active) {
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
state.hor_plus_scale = ComputeSkate3UltrawideHorPlusScale();
|
|
||||||
state.skip_shadow_targets = REXCVAR_GET(skate3_ultrawide_skip_shadow_targets);
|
|
||||||
state.shadow_skip_mode = uint32_t(REXCVAR_GET(skate3_ultrawide_shadow_skip_mode));
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
Skate3UltrawideDrawState SnapshotSkate3UltrawideDrawState(uint64_t frame) {
|
|
||||||
constexpr uint64_t kUncachedFrame = ~uint64_t(0);
|
|
||||||
if (frame == kUncachedFrame) {
|
|
||||||
return QuerySkate3UltrawideDrawState();
|
|
||||||
}
|
|
||||||
|
|
||||||
thread_local uint64_t cached_frame = 0;
|
|
||||||
thread_local Skate3UltrawideDrawState cached_state;
|
|
||||||
if (cached_frame != frame) {
|
|
||||||
cached_state = QuerySkate3UltrawideDrawState();
|
|
||||||
cached_frame = frame;
|
|
||||||
}
|
|
||||||
return cached_state;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ShouldFakeSkate3UltrawideOcclusionQueries() {
|
|
||||||
const Skate3UltrawideDrawState state = SnapshotSkate3UltrawideDrawState(~uint64_t(0));
|
|
||||||
return rex::cvar::Query<bool>("skate3_ultrawide_fake_occlusion_queries") &&
|
|
||||||
state.correction_active && state.hor_plus_scale < 0.999f;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsSkate3UltrawideDisplayViewport(const draw_util::ViewportInfo& viewport_info) {
|
|
||||||
const uint32_t width = viewport_info.xy_extent[0];
|
|
||||||
const uint32_t height = viewport_info.xy_extent[1];
|
|
||||||
if (!width || !height) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const uint64_t scaled_width = uint64_t(width) * 9;
|
|
||||||
const uint64_t scaled_height = uint64_t(height) * 16;
|
|
||||||
const uint64_t difference =
|
|
||||||
scaled_width > scaled_height ? scaled_width - scaled_height : scaled_height - scaled_width;
|
|
||||||
return difference <= scaled_height / 20;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ShouldApplySkate3UltrawideHorPlus(
|
|
||||||
const ultrawide_debug::TargetKey& target_key, bool primitive_polygonal,
|
|
||||||
const draw_util::ViewportInfo& viewport_info, reg::RB_DEPTHCONTROL normalized_depth_control,
|
|
||||||
const Skate3UltrawideDrawState& ultrawide_state) {
|
|
||||||
if (!ultrawide_state.correction_active) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const bool default_enabled = primitive_polygonal && normalized_depth_control.z_enable &&
|
|
||||||
IsSkate3UltrawideDisplayViewport(viewport_info);
|
|
||||||
const bool selected = ultrawide_debug::ShouldApplyAndRecord(target_key, default_enabled);
|
|
||||||
if (selected && ultrawide_state.skip_shadow_targets &&
|
|
||||||
ultrawide_debug::IsShadowMapCandidate(target_key, ultrawide_state.shadow_skip_mode)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return selected;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Frame-cached read of the cross-TU draw trace flag - the registry Query is a
|
|
||||||
// mutex + string hash, too expensive to run for every draw.
|
|
||||||
bool QuerySkate3UltrawideTraceDraws(uint64_t frame) {
|
|
||||||
thread_local uint64_t cached_frame = UINT64_MAX;
|
|
||||||
thread_local bool cached_value = false;
|
|
||||||
if (cached_frame != frame) {
|
|
||||||
cached_value = rex::cvar::Query<bool>("skate3_ultrawide_trace_draws");
|
|
||||||
cached_frame = frame;
|
|
||||||
}
|
|
||||||
return cached_value;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef REXGLUE_ENABLE_PERF_COUNTERS
|
#ifdef REXGLUE_ENABLE_PERF_COUNTERS
|
||||||
class ScopedDrawStageTimer {
|
class ScopedDrawStageTimer {
|
||||||
public:
|
public:
|
||||||
|
|
@ -419,19 +258,6 @@ bool D3D12CommandProcessor::ExecutePacketType3_EVENT_WRITE_ZPD(memory::RingBuffe
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (ShouldFakeSkate3UltrawideOcclusionQueries()) {
|
|
||||||
if (active_occlusion_query_.valid) {
|
|
||||||
uint32_t host_index = active_occlusion_query_.host_index;
|
|
||||||
active_occlusion_query_ = {};
|
|
||||||
if (occlusion_query_heap_ && BeginSubmission(true)) {
|
|
||||||
deferred_command_list_.D3DEndQuery(occlusion_query_heap_.Get(), D3D12_QUERY_TYPE_OCCLUSION,
|
|
||||||
host_index);
|
|
||||||
EndSubmission(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return write_fake_result(REXCVAR_GET(skate3_ultrawide_fake_occlusion_sample_count));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Native guest-output renderer active: the framebuffer-sized draws between
|
// Native guest-output renderer active: the framebuffer-sized draws between
|
||||||
// query begin/end are suppressed, so a real host occlusion query reports 0
|
// query begin/end are suppressed, so a real host occlusion query reports 0
|
||||||
// samples. The game gates world rendering on these results; event-ad
|
// samples. The game gates world rendering on these results; event-ad
|
||||||
|
|
@ -2339,13 +2165,17 @@ void D3D12CommandProcessor::IssueSwap(uint32_t frontbuffer_ptr, uint32_t frontbu
|
||||||
kernel::xboxkrnl::VdQueryVideoMode(&video_mode);
|
kernel::xboxkrnl::VdQueryVideoMode(&video_mode);
|
||||||
uint32_t display_width = std::max(uint32_t(1), uint32_t(video_mode.display_width));
|
uint32_t display_width = std::max(uint32_t(1), uint32_t(video_mode.display_width));
|
||||||
uint32_t display_height = std::max(uint32_t(1), uint32_t(video_mode.display_height));
|
uint32_t display_height = std::max(uint32_t(1), uint32_t(video_mode.display_height));
|
||||||
ApplySkate3UltrawidePresenterAspect(presenter, display_width, display_height);
|
// Ultrawide: while the native renderer is serving frames, allocate the
|
||||||
|
// guest output at the wide display aspect; emulated frames keep the
|
||||||
|
// frontbuffer aspect and present pillarboxed.
|
||||||
|
const bool native_wide_output = ApplyNativeGuestOutputWideAspect(
|
||||||
|
guest_output_width, guest_output_height, display_width, display_height);
|
||||||
|
|
||||||
presenter->RefreshGuestOutput(
|
presenter->RefreshGuestOutput(
|
||||||
guest_output_width, guest_output_height, display_width, display_height,
|
guest_output_width, guest_output_height, display_width, display_height,
|
||||||
[this, &swap_texture_srv_desc, frontbuffer_format, swap_texture_resource, guest_output_width,
|
[this, &swap_texture_srv_desc, frontbuffer_format, swap_texture_resource, guest_output_width,
|
||||||
guest_output_height, display_width,
|
guest_output_height, display_width, display_height,
|
||||||
display_height](ui::Presenter::GuestOutputRefreshContext& context) -> bool {
|
native_wide_output](ui::Presenter::GuestOutputRefreshContext& context) -> bool {
|
||||||
const ui::d3d12::D3D12Provider& provider = GetD3D12Provider();
|
const ui::d3d12::D3D12Provider& provider = GetD3D12Provider();
|
||||||
ID3D12Device* device = provider.GetDevice();
|
ID3D12Device* device = provider.GetDevice();
|
||||||
|
|
||||||
|
|
@ -2427,6 +2257,12 @@ void D3D12CommandProcessor::IssueSwap(uint32_t frontbuffer_ptr, uint32_t frontbu
|
||||||
EndSubmission(true);
|
EndSubmission(true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (native_wide_output) {
|
||||||
|
// The renderer yielded but the output was sized wide for it; the
|
||||||
|
// emulated blit writes frontbuffer-aspect content, so keep the
|
||||||
|
// previously presented image and resize on the next refresh.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Upload the new gamma ramp, using the upload buffer for the current
|
// Upload the new gamma ramp, using the upload buffer for the current
|
||||||
|
|
@ -3146,71 +2982,6 @@ bool D3D12CommandProcessor::IssueDraw(xenos::PrimitiveType primitive_type, uint3
|
||||||
// Must not call anything that may change the primitive topology from now on!
|
// Must not call anything that may change the primitive topology from now on!
|
||||||
|
|
||||||
const uint32_t host_draw_vertex_count = primitive_processing_result.host_draw_vertex_count;
|
const uint32_t host_draw_vertex_count = primitive_processing_result.host_draw_vertex_count;
|
||||||
const uint32_t skate3_ultrawide_draw_primitive_count = draw_util::EstimatePrimitiveCount(
|
|
||||||
primitive_processing_result.host_primitive_type, host_draw_vertex_count);
|
|
||||||
bool skate3_ultrawide_submit_draw = true;
|
|
||||||
// Frame-cached: the registry Query takes the registry mutex and hashes the
|
|
||||||
// name, far too expensive for a per-draw debug-flag check.
|
|
||||||
if (QuerySkate3UltrawideTraceDraws(frame_current_)) {
|
|
||||||
ultrawide_debug::DrawFingerprint fingerprint;
|
|
||||||
fingerprint.bucket =
|
|
||||||
memexport_used
|
|
||||||
? ultrawide_debug::DrawBucket::kMemexport
|
|
||||||
: (edram_mode == xenos::EdramMode::kDepthOnly
|
|
||||||
? ultrawide_debug::DrawBucket::kDepthOnly
|
|
||||||
: (pixel_shader == nullptr ? ultrawide_debug::DrawBucket::kNoPixelShader
|
|
||||||
: ultrawide_debug::DrawBucket::kMainColorDepth));
|
|
||||||
fingerprint.vertex_shader_hash = vertex_shader->ucode_data_hash();
|
|
||||||
fingerprint.pixel_shader_hash = pixel_shader ? pixel_shader->ucode_data_hash() : 0;
|
|
||||||
fingerprint.primitive_type = uint32_t(primitive_processing_result.host_primitive_type);
|
|
||||||
fingerprint.vertex_count = host_draw_vertex_count;
|
|
||||||
fingerprint.primitive_count = skate3_ultrawide_draw_primitive_count;
|
|
||||||
fingerprint.packet_ptr = current_packet_ptr_;
|
|
||||||
if (index_buffer_info) {
|
|
||||||
fingerprint.index_guest_base = index_buffer_info->guest_base;
|
|
||||||
fingerprint.index_length = uint32_t(index_buffer_info->length);
|
|
||||||
}
|
|
||||||
const Shader::ConstantRegisterMap& constant_map = vertex_shader->constant_register_map();
|
|
||||||
size_t fetch_count = 0;
|
|
||||||
for (uint32_t i = 0; i < rex::countof(constant_map.vertex_fetch_bitmap); ++i) {
|
|
||||||
uint32_t fetch_bits = constant_map.vertex_fetch_bitmap[i];
|
|
||||||
uint32_t bit = 0;
|
|
||||||
while (fetch_count < ultrawide_debug::DrawFingerprint::kVertexFetchCount &&
|
|
||||||
rex::bit_scan_forward(fetch_bits, &bit)) {
|
|
||||||
fetch_bits &= ~(uint32_t(1) << bit);
|
|
||||||
xenos::xe_gpu_vertex_fetch_t fetch = regs.GetVertexFetch(i * 32 + bit);
|
|
||||||
fingerprint.vertex_fetch_address[fetch_count] = fetch.address << 2;
|
|
||||||
fingerprint.vertex_fetch_size[fetch_count] = fetch.size << 2;
|
|
||||||
++fetch_count;
|
|
||||||
}
|
|
||||||
if (fetch_count >= ultrawide_debug::DrawFingerprint::kVertexFetchCount) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
size_t texture_count = 0;
|
|
||||||
uint32_t texture_bits = used_texture_mask;
|
|
||||||
uint32_t texture_index = 0;
|
|
||||||
while (texture_count < ultrawide_debug::DrawFingerprint::kTextureFetchCount &&
|
|
||||||
rex::bit_scan_forward(texture_bits, &texture_index)) {
|
|
||||||
texture_bits &= ~(UINT32_C(1) << texture_index);
|
|
||||||
TextureCache::DebugActiveTextureBinding binding;
|
|
||||||
if (!texture_cache_->DebugGetActiveTextureBinding(texture_index, binding)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
fingerprint.texture_key_hash[texture_count] = binding.key_hash;
|
|
||||||
fingerprint.texture_fetch_index[texture_count] = binding.fetch_index;
|
|
||||||
fingerprint.texture_base_address[texture_count] = binding.base_address;
|
|
||||||
fingerprint.texture_base_length[texture_count] = binding.base_length;
|
|
||||||
fingerprint.texture_width[texture_count] = binding.width;
|
|
||||||
fingerprint.texture_height[texture_count] = binding.height;
|
|
||||||
fingerprint.texture_format[texture_count] = binding.format;
|
|
||||||
++texture_count;
|
|
||||||
}
|
|
||||||
skate3_ultrawide_submit_draw = ultrawide_debug::RecordDrawFingerprint(fingerprint);
|
|
||||||
}
|
|
||||||
if (!skate3_ultrawide_submit_draw) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
const rex::perf::DrawBucket draw_bucket =
|
const rex::perf::DrawBucket draw_bucket =
|
||||||
memexport_used
|
memexport_used
|
||||||
? rex::perf::DrawBucket::kMemexport
|
? rex::perf::DrawBucket::kMemexport
|
||||||
|
|
@ -4637,37 +4408,10 @@ void D3D12CommandProcessor::UpdateSystemConstantValues(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Conversion to Direct3D 12 normalized device coordinates.
|
// Conversion to Direct3D 12 normalized device coordinates.
|
||||||
ultrawide_debug::TargetKey skate3_ultrawide_target_key;
|
|
||||||
for (uint32_t i = 0; i < 4; ++i) {
|
|
||||||
skate3_ultrawide_target_key.color_info[i] = color_infos[i].value;
|
|
||||||
}
|
|
||||||
skate3_ultrawide_target_key.depth_info = rb_depth_info.value;
|
|
||||||
skate3_ultrawide_target_key.surface_info = rb_surface_info.value;
|
|
||||||
skate3_ultrawide_target_key.viewport_x = viewport_info.xy_offset[0];
|
|
||||||
skate3_ultrawide_target_key.viewport_y = viewport_info.xy_offset[1];
|
|
||||||
skate3_ultrawide_target_key.viewport_width = viewport_info.xy_extent[0];
|
|
||||||
skate3_ultrawide_target_key.viewport_height = viewport_info.xy_extent[1];
|
|
||||||
skate3_ultrawide_target_key.color_mask = normalized_color_mask;
|
|
||||||
skate3_ultrawide_target_key.depth_control = normalized_depth_control.value;
|
|
||||||
skate3_ultrawide_target_key.pa_cl_vte_cntl = pa_cl_vte_cntl.value;
|
|
||||||
skate3_ultrawide_target_key.primitive_type = uint32_t(vgt_draw_initiator.prim_type);
|
|
||||||
skate3_ultrawide_target_key.host_vertex_shader_type = uint32_t(host_vertex_shader_type);
|
|
||||||
skate3_ultrawide_target_key.vertex_shader_hash = vertex_shader_hash;
|
|
||||||
skate3_ultrawide_target_key.pixel_shader_hash = pixel_shader_hash;
|
|
||||||
const Skate3UltrawideDrawState skate3_ultrawide_state =
|
|
||||||
SnapshotSkate3UltrawideDrawState(frame_current_);
|
|
||||||
const bool skate3_ultrawide_hor_plus_draw = ShouldApplySkate3UltrawideHorPlus(
|
|
||||||
skate3_ultrawide_target_key, primitive_polygonal, viewport_info, normalized_depth_control,
|
|
||||||
skate3_ultrawide_state);
|
|
||||||
const float skate3_ultrawide_hor_plus_scale =
|
|
||||||
skate3_ultrawide_hor_plus_draw ? skate3_ultrawide_state.hor_plus_scale : 1.0f;
|
|
||||||
for (uint32_t i = 0; i < 3; ++i) {
|
for (uint32_t i = 0; i < 3; ++i) {
|
||||||
const float ndc_scale =
|
dirty |= system_constants_.ndc_scale[i] != viewport_info.ndc_scale[i];
|
||||||
i == 0 ? viewport_info.ndc_scale[i] * skate3_ultrawide_hor_plus_scale
|
|
||||||
: viewport_info.ndc_scale[i];
|
|
||||||
dirty |= system_constants_.ndc_scale[i] != ndc_scale;
|
|
||||||
dirty |= system_constants_.ndc_offset[i] != viewport_info.ndc_offset[i];
|
dirty |= system_constants_.ndc_offset[i] != viewport_info.ndc_offset[i];
|
||||||
system_constants_.ndc_scale[i] = ndc_scale;
|
system_constants_.ndc_scale[i] = viewport_info.ndc_scale[i];
|
||||||
system_constants_.ndc_offset[i] = viewport_info.ndc_offset[i];
|
system_constants_.ndc_offset[i] = viewport_info.ndc_offset[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
#include <rex/graphics/native_guest_renderer.h>
|
#include <rex/graphics/native_guest_renderer.h>
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
|
@ -114,6 +115,41 @@ bool IsNativeGuestOutputActive() {
|
||||||
return g_native_output_active.load(std::memory_order_relaxed);
|
return g_native_output_active.load(std::memory_order_relaxed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
std::atomic<double> g_wide_aspect{0.0};
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
void SetNativeGuestOutputWideAspect(double aspect) {
|
||||||
|
g_wide_aspect.store(aspect > 0.0 ? aspect : 0.0, std::memory_order_relaxed);
|
||||||
|
}
|
||||||
|
|
||||||
|
double GetNativeGuestOutputWideAspect() {
|
||||||
|
return g_wide_aspect.load(std::memory_order_relaxed);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ApplyNativeGuestOutputWideAspect(uint32_t& guest_output_width, uint32_t guest_output_height,
|
||||||
|
uint32_t& display_width, uint32_t& display_height) {
|
||||||
|
const double aspect = g_wide_aspect.load(std::memory_order_relaxed);
|
||||||
|
if (aspect <= 0.0 || !guest_output_width || !guest_output_height ||
|
||||||
|
!HasNativeGuestOutputRenderer() ||
|
||||||
|
!g_native_output_active.load(std::memory_order_relaxed)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// Even width keeps every half-resolution derived target (bloom, SSAO,
|
||||||
|
// menu snapshots) an exact divide.
|
||||||
|
uint32_t wide_width =
|
||||||
|
uint32_t(std::clamp(aspect * double(guest_output_height) + 0.5, 1.0, 16384.0)) & ~1u;
|
||||||
|
if (wide_width <= guest_output_width) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
guest_output_width = wide_width;
|
||||||
|
// The display aspect is the actual pixel aspect: the presenter maps the
|
||||||
|
// wide image edge-to-edge on a matching window.
|
||||||
|
display_width = guest_output_width;
|
||||||
|
display_height = guest_output_height;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool ShouldSuppressEmulatedDraws() {
|
bool ShouldSuppressEmulatedDraws() {
|
||||||
return REXCVAR_GET(native_render_suppress_emulated_draws) &&
|
return REXCVAR_GET(native_render_suppress_emulated_draws) &&
|
||||||
g_native_output_active.load(std::memory_order_relaxed);
|
g_native_output_active.load(std::memory_order_relaxed);
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,6 @@
|
||||||
#include <rex/graphics/pipeline/texture/info.h>
|
#include <rex/graphics/pipeline/texture/info.h>
|
||||||
#include <rex/graphics/pipeline/texture/util.h>
|
#include <rex/graphics/pipeline/texture/util.h>
|
||||||
#include <rex/graphics/register_file.h>
|
#include <rex/graphics/register_file.h>
|
||||||
#include <rex/graphics/ultrawide_debug.h>
|
|
||||||
#include <rex/graphics/xenos.h>
|
#include <rex/graphics/xenos.h>
|
||||||
#include <rex/logging.h>
|
#include <rex/logging.h>
|
||||||
#include <rex/math.h>
|
#include <rex/math.h>
|
||||||
|
|
@ -108,25 +107,6 @@ REXCVAR_DEFINE_INT32(vulkan_debug_log_team_profile_background_bindings_remaining
|
||||||
.lifecycle(rex::cvar::Lifecycle::kHotReload)
|
.lifecycle(rex::cvar::Lifecycle::kHotReload)
|
||||||
.debug_only();
|
.debug_only();
|
||||||
|
|
||||||
REXCVAR_DEFINE_INT32(skate3_ultrawide_texture_trace_remaining, 0, "Skate 3/Ultrawide",
|
|
||||||
"Log this many Skate 3 texture lifecycle events for ultrawide pop-in tracing")
|
|
||||||
.range(0, 1000000)
|
|
||||||
.lifecycle(rex::cvar::Lifecycle::kHotReload);
|
|
||||||
|
|
||||||
REXCVAR_DEFINE_BOOL(skate3_ultrawide_texture_trace_bind_keys, false, "Skate 3/Ultrawide",
|
|
||||||
"Include high-frequency texture bind-key churn in ultrawide texture tracing")
|
|
||||||
.lifecycle(rex::cvar::Lifecycle::kHotReload);
|
|
||||||
|
|
||||||
REXCVAR_DEFINE_BOOL(skate3_ultrawide_texture_trace_scaled_resolve, false, "Skate 3/Ultrawide",
|
|
||||||
"Include scaled render-to-texture resolve targets in ultrawide texture tracing")
|
|
||||||
.lifecycle(rex::cvar::Lifecycle::kHotReload);
|
|
||||||
|
|
||||||
REXCVAR_DEFINE_BOOL(skate3_ultrawide_ignore_streamer_texture_invalidations, false,
|
|
||||||
"Skate 3/Ultrawide",
|
|
||||||
"Diagnostic: keep host textures resident when guest streamer writes from "
|
|
||||||
"82CD4300 invalidate watched texture pages")
|
|
||||||
.lifecycle(rex::cvar::Lifecycle::kHotReload);
|
|
||||||
|
|
||||||
REXCVAR_DEFINE_BOOL(pre_mask_resolve_l2_block, true, "GPU",
|
REXCVAR_DEFINE_BOOL(pre_mask_resolve_l2_block, true, "GPU",
|
||||||
"Pre-mask scaled resolve L2 blocks to the write range before iterating");
|
"Pre-mask scaled resolve L2 blocks to the write range before iterating");
|
||||||
|
|
||||||
|
|
@ -344,9 +324,6 @@ void TextureCache::CompletedSubmissionUpdated(uint64_t completed_submission_inde
|
||||||
assert_true(found_texture_it != textures_.end());
|
assert_true(found_texture_it != textures_.end());
|
||||||
if (found_texture_it != textures_.end()) {
|
if (found_texture_it != textures_.end()) {
|
||||||
assert_true(found_texture_it->second.get() == texture);
|
assert_true(found_texture_it->second.get() == texture);
|
||||||
DebugLogSkate3UltrawideTextureTrace(limit_hard_exceeded ? "destroy-hard-limit"
|
|
||||||
: "destroy-soft-limit",
|
|
||||||
UINT32_MAX, texture->key(), texture);
|
|
||||||
textures_.erase(found_texture_it);
|
textures_.erase(found_texture_it);
|
||||||
// `texture` is invalid now.
|
// `texture` is invalid now.
|
||||||
}
|
}
|
||||||
|
|
@ -517,11 +494,6 @@ bool TextureCache::CommitPreparedTextureLoad(const PendingTextureLoad& pending_l
|
||||||
// not up to date anymore.
|
// not up to date anymore.
|
||||||
texture.MakeUpToDateAndWatch(global_critical_region_.Acquire());
|
texture.MakeUpToDateAndWatch(global_critical_region_.Acquire());
|
||||||
texture.LogAction("Loaded");
|
texture.LogAction("Loaded");
|
||||||
DebugLogSkate3UltrawideTextureTrace(pending_load.load_base
|
|
||||||
? (pending_load.load_mips ? "loaded-base-mips"
|
|
||||||
: "loaded-base")
|
|
||||||
: "loaded-mips",
|
|
||||||
UINT32_MAX, texture.key(), &texture);
|
|
||||||
DebugLogTeamProfileBackgroundTextureCandidate("loaded", UINT32_MAX, texture);
|
DebugLogTeamProfileBackgroundTextureCandidate("loaded", UINT32_MAX, texture);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -598,7 +570,6 @@ void TextureCache::RequestTextures(uint32_t used_texture_mask) {
|
||||||
if (!binding.key.is_valid) {
|
if (!binding.key.is_valid) {
|
||||||
if (old_key.is_valid) {
|
if (old_key.is_valid) {
|
||||||
bindings_changed |= index_bit;
|
bindings_changed |= index_bit;
|
||||||
DebugLogSkate3UltrawideTextureTrace("unbind-invalid-fetch", index, old_key);
|
|
||||||
}
|
}
|
||||||
binding.Reset();
|
binding.Reset();
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -660,15 +631,6 @@ void TextureCache::RequestTextures(uint32_t used_texture_mask) {
|
||||||
if (load_signed_data) {
|
if (load_signed_data) {
|
||||||
queue_pending_texture_load(binding.texture_signed);
|
queue_pending_texture_load(binding.texture_signed);
|
||||||
}
|
}
|
||||||
if (key_changed) {
|
|
||||||
DebugLogSkate3UltrawideTextureTrace("bind-key", index, binding.key,
|
|
||||||
binding.texture ? binding.texture
|
|
||||||
: binding.texture_signed);
|
|
||||||
} else if (bindings_changed & index_bit) {
|
|
||||||
DebugLogSkate3UltrawideTextureTrace("bind-view", index, binding.key,
|
|
||||||
binding.texture ? binding.texture
|
|
||||||
: binding.texture_signed);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
COUNT_profile_set("gpu/texture_cache/request_textures_pending_load_count",
|
COUNT_profile_set("gpu/texture_cache/request_textures_pending_load_count",
|
||||||
|
|
@ -901,90 +863,6 @@ bool TextureCache::DebugFindTeamProfileBackgroundBinding(uint32_t used_texture_m
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TextureCache::DebugConsumeSkate3UltrawideTextureTraceLog() {
|
|
||||||
int32_t remaining = REXCVAR_GET(skate3_ultrawide_texture_trace_remaining);
|
|
||||||
if (remaining <= 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
REXCVAR_SET(skate3_ultrawide_texture_trace_remaining, remaining - 1);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TextureCache::DebugLogSkate3UltrawideTextureTrace(const char* action, uint32_t fetch_index,
|
|
||||||
const TextureKey& key,
|
|
||||||
const Texture* texture) {
|
|
||||||
const bool is_bind_action = std::string_view(action).starts_with("bind-");
|
|
||||||
if (is_bind_action && !REXCVAR_GET(skate3_ultrawide_texture_trace_bind_keys)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (key.is_valid && key.scaled_resolve &&
|
|
||||||
!REXCVAR_GET(skate3_ultrawide_texture_trace_scaled_resolve)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!key.is_valid) {
|
|
||||||
if (!DebugConsumeSkate3UltrawideTextureTraceLog()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
REXGPU_WARN("Skate3 texture trace: action={}, submission={}, fetch={}, invalid-key", action,
|
|
||||||
current_submission_index_, fetch_index == UINT32_MAX ? -1 : int32_t(fetch_index));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const FormatInfo* format_info = FormatInfo::Get(key.format);
|
|
||||||
const uint64_t key_hash = TextureKey::Hasher{}(key);
|
|
||||||
uint32_t guest_base_size = 0;
|
|
||||||
uint32_t guest_mips_size = 0;
|
|
||||||
if (texture) {
|
|
||||||
guest_base_size = texture->GetGuestBaseSize();
|
|
||||||
guest_mips_size = texture->GetGuestMipsSize();
|
|
||||||
} else {
|
|
||||||
const texture_util::TextureGuestLayout fallback_layout = key.GetGuestLayout();
|
|
||||||
guest_base_size = fallback_layout.base.level_data_extent_bytes;
|
|
||||||
guest_mips_size = fallback_layout.mips_total_extent_bytes;
|
|
||||||
}
|
|
||||||
const uint32_t host_width = key.GetWidth() * (key.scaled_resolve ? draw_resolution_scale_x_ : 1);
|
|
||||||
const uint32_t host_height =
|
|
||||||
key.GetHeight() * (key.scaled_resolve ? draw_resolution_scale_y_ : 1);
|
|
||||||
|
|
||||||
if (!DebugConsumeSkate3UltrawideTextureTraceLog()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto& invalidation_diagnostics =
|
|
||||||
rex::memory::GetPhysicalMemoryInvalidationDiagnostics();
|
|
||||||
if (std::string_view(action).starts_with("invalidate-") && invalidation_diagnostics.valid) {
|
|
||||||
REXGPU_WARN(
|
|
||||||
"Skate3 texture trace: action={}, submission={}, fetch={}, key={:016X}, scaled={}, {} "
|
|
||||||
"{}x{}x{} host={}x{} {}, base={:08X}+{:X}, mips={:08X}+{:X}, mip_max={}, pitch={}, "
|
|
||||||
"outdated={:X}, host_mem_kb={}, write_va={:08X}, write_phys={:08X}+{:X}, "
|
|
||||||
"thread={:08X}, lr={:08X}, stack={:08X}, exact={}, unprotect={}",
|
|
||||||
action, current_submission_index_, fetch_index == UINT32_MAX ? -1 : int32_t(fetch_index),
|
|
||||||
key_hash, bool(key.scaled_resolve), key.tiled ? "tiled" : "linear", key.GetWidth(),
|
|
||||||
key.GetHeight(), key.GetDepthOrArraySize(), host_width, host_height,
|
|
||||||
format_info ? format_info->name : "unknown", key.base_page << 12, guest_base_size,
|
|
||||||
key.mip_page << 12, guest_mips_size, key.mip_max_level, key.pitch << 5,
|
|
||||||
texture ? texture->outdated_mask() : 0,
|
|
||||||
texture ? uint32_t((texture->GetHostMemoryUsage() + 1023) >> 10) : 0,
|
|
||||||
invalidation_diagnostics.virtual_address, invalidation_diagnostics.physical_address,
|
|
||||||
invalidation_diagnostics.length, invalidation_diagnostics.thread_id,
|
|
||||||
invalidation_diagnostics.lr, invalidation_diagnostics.stack,
|
|
||||||
invalidation_diagnostics.exact_range, invalidation_diagnostics.unprotect);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
REXGPU_WARN(
|
|
||||||
"Skate3 texture trace: action={}, submission={}, fetch={}, key={:016X}, scaled={}, {} "
|
|
||||||
"{}x{}x{} host={}x{} {}, base={:08X}+{:X}, mips={:08X}+{:X}, mip_max={}, pitch={}, "
|
|
||||||
"outdated={:X}, host_mem_kb={}",
|
|
||||||
action, current_submission_index_, fetch_index == UINT32_MAX ? -1 : int32_t(fetch_index),
|
|
||||||
key_hash, bool(key.scaled_resolve), key.tiled ? "tiled" : "linear", key.GetWidth(),
|
|
||||||
key.GetHeight(), key.GetDepthOrArraySize(), host_width, host_height,
|
|
||||||
format_info ? format_info->name : "unknown", key.base_page << 12, guest_base_size,
|
|
||||||
key.mip_page << 12, guest_mips_size, key.mip_max_level, key.pitch << 5,
|
|
||||||
texture ? texture->outdated_mask() : 0,
|
|
||||||
texture ? uint32_t((texture->GetHostMemoryUsage() + 1023) >> 10) : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void TextureCache::DebugLogTeamProfileBackgroundTextureCandidate(const char* action,
|
void TextureCache::DebugLogTeamProfileBackgroundTextureCandidate(const char* action,
|
||||||
uint32_t fetch_index,
|
uint32_t fetch_index,
|
||||||
const Texture& texture) {
|
const Texture& texture) {
|
||||||
|
|
@ -1380,26 +1258,6 @@ void TextureCache::Texture::MarkAsUsed() {
|
||||||
void TextureCache::Texture::WatchCallback(
|
void TextureCache::Texture::WatchCallback(
|
||||||
[[maybe_unused]] const std::unique_lock<std::recursive_mutex>& global_lock, bool is_mip,
|
[[maybe_unused]] const std::unique_lock<std::recursive_mutex>& global_lock, bool is_mip,
|
||||||
bool invalidated_by_gpu) {
|
bool invalidated_by_gpu) {
|
||||||
const auto& invalidation_diagnostics =
|
|
||||||
rex::memory::GetPhysicalMemoryInvalidationDiagnostics();
|
|
||||||
const bool ignore_skate3_streamer_invalidation =
|
|
||||||
!invalidated_by_gpu && REXCVAR_GET(skate3_ultrawide_ignore_streamer_texture_invalidations) &&
|
|
||||||
invalidation_diagnostics.valid && invalidation_diagnostics.lr == 0x82CD4300;
|
|
||||||
if (ignore_skate3_streamer_invalidation) {
|
|
||||||
texture_cache().DebugLogSkate3UltrawideTextureTrace(
|
|
||||||
is_mip ? "suppress-streamer-mips" : "suppress-streamer-base", UINT32_MAX, key(), this);
|
|
||||||
if (is_mip) {
|
|
||||||
mips_watch_handle_ = nullptr;
|
|
||||||
} else {
|
|
||||||
base_watch_handle_ = nullptr;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
texture_cache().DebugLogSkate3UltrawideTextureTrace(
|
|
||||||
invalidated_by_gpu ? (is_mip ? "invalidate-gpu-mips" : "invalidate-gpu-base")
|
|
||||||
: (is_mip ? "invalidate-cpu-mips" : "invalidate-cpu-base"),
|
|
||||||
UINT32_MAX, key(), this);
|
|
||||||
texture_cache().DebugLogTeamProfileBackgroundTextureCandidate(
|
texture_cache().DebugLogTeamProfileBackgroundTextureCandidate(
|
||||||
invalidated_by_gpu ? (is_mip ? "invalidate-gpu-mips" : "invalidate-gpu-base")
|
invalidated_by_gpu ? (is_mip ? "invalidate-gpu-mips" : "invalidate-gpu-base")
|
||||||
: (is_mip ? "invalidate-cpu-mips" : "invalidate-cpu-base"),
|
: (is_mip ? "invalidate-cpu-mips" : "invalidate-cpu-base"),
|
||||||
|
|
@ -1427,11 +1285,6 @@ void TextureCache::WatchCallback(const std::unique_lock<std::recursive_mutex>& g
|
||||||
|
|
||||||
void TextureCache::DestroyAllTextures(bool from_destructor) {
|
void TextureCache::DestroyAllTextures(bool from_destructor) {
|
||||||
ResetTextureBindings(from_destructor);
|
ResetTextureBindings(from_destructor);
|
||||||
if (!from_destructor) {
|
|
||||||
for (const auto& [key, texture] : textures_) {
|
|
||||||
DebugLogSkate3UltrawideTextureTrace("destroy-clear", UINT32_MAX, key, texture.get());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
textures_.clear();
|
textures_.clear();
|
||||||
COUNT_profile_set("gpu/texture_cache/textures", 0);
|
COUNT_profile_set("gpu/texture_cache/textures", 0);
|
||||||
}
|
}
|
||||||
|
|
@ -1554,7 +1407,6 @@ TextureCache::Texture* TextureCache::FindOrCreateTexture(TextureKey key) {
|
||||||
}
|
}
|
||||||
COUNT_profile_set("gpu/texture_cache/textures", textures_.size());
|
COUNT_profile_set("gpu/texture_cache/textures", textures_.size());
|
||||||
texture->LogAction("Created");
|
texture->LogAction("Created");
|
||||||
DebugLogSkate3UltrawideTextureTrace("create", UINT32_MAX, texture->key(), texture);
|
|
||||||
DebugLogTeamProfileBackgroundTextureCandidate("create", UINT32_MAX, *texture);
|
DebugLogTeamProfileBackgroundTextureCandidate("create", UINT32_MAX, *texture);
|
||||||
return texture;
|
return texture;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,6 @@
|
||||||
#include <rex/graphics/pipeline/shader/shader.h>
|
#include <rex/graphics/pipeline/shader/shader.h>
|
||||||
#include <rex/graphics/pipeline/shader/spirv_translator.h>
|
#include <rex/graphics/pipeline/shader/spirv_translator.h>
|
||||||
#include <rex/graphics/registers.h>
|
#include <rex/graphics/registers.h>
|
||||||
#include <rex/graphics/ultrawide_debug.h>
|
|
||||||
#include <rex/graphics/vulkan/command_processor.h>
|
#include <rex/graphics/vulkan/command_processor.h>
|
||||||
#include <rex/graphics/vulkan/pipeline_cache.h>
|
#include <rex/graphics/vulkan/pipeline_cache.h>
|
||||||
#include <rex/graphics/vulkan/render_target_cache.h>
|
#include <rex/graphics/vulkan/render_target_cache.h>
|
||||||
|
|
@ -161,15 +160,6 @@ REXCVAR_DEFINE_INT32(vulkan_gpu_clock_log_interval_frames, 0, "GPU/Vulkan",
|
||||||
.debug_only()
|
.debug_only()
|
||||||
.lifecycle(rex::cvar::Lifecycle::kHotReload);
|
.lifecycle(rex::cvar::Lifecycle::kHotReload);
|
||||||
|
|
||||||
// The shared Skate 3 Hor+ classifier cvars (skate3_ultrawide_skip_shadow_targets,
|
|
||||||
// skate3_ultrawide_shadow_skip_mode) live in graphics/command_processor.cpp so
|
|
||||||
// every backend sees one registration; the queries below resolve them by name.
|
|
||||||
REXCVAR_DEFINE_BOOL(skate3_ultrawide_skip_screen_space_targets, false, "Skate 3",
|
|
||||||
"Exclude screen-space/orthographic (pre-divided XY) passes from Skate 3 Hor+ "
|
|
||||||
"NDC correction. Off by default so the Vulkan default classifier matches the "
|
|
||||||
"Direct3D 12 build; enable if menu/HUD fragments appear in the side areas")
|
|
||||||
.lifecycle(rex::cvar::Lifecycle::kHotReload);
|
|
||||||
|
|
||||||
namespace rex::graphics::vulkan {
|
namespace rex::graphics::vulkan {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
@ -243,160 +233,6 @@ bool IsGameplayStateActive(const system::KernelState* kernel_state) {
|
||||||
return gameplay_context && *gameplay_context == 1;
|
return gameplay_context && *gameplay_context == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Skate3UltrawideDrawState {
|
|
||||||
bool correction_active = false;
|
|
||||||
bool skip_shadow_targets = false;
|
|
||||||
bool skip_screen_space_targets = false;
|
|
||||||
uint32_t shadow_skip_mode = 1;
|
|
||||||
float hor_plus_scale = 1.0f;
|
|
||||||
};
|
|
||||||
|
|
||||||
double GetSkate3UltrawideTargetAspect(const ui::Presenter* presenter = nullptr) {
|
|
||||||
if (!rex::cvar::Query<bool>("skate3_ultrawide") ||
|
|
||||||
!ultrawide_debug::IsSkate3GameplayUltrawideActive()) {
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr double kBaseAspect = 16.0 / 9.0;
|
|
||||||
uint32_t surface_width = 0;
|
|
||||||
uint32_t surface_height = 0;
|
|
||||||
if (presenter && presenter->GetSurfacePaintConnectionSize(surface_width, surface_height) &&
|
|
||||||
surface_width && surface_height) {
|
|
||||||
const double surface_aspect = double(surface_width) / double(surface_height);
|
|
||||||
if (surface_aspect > kBaseAspect + 0.01) {
|
|
||||||
return std::clamp(surface_aspect, kBaseAspect, 8.0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const double target_aspect = rex::cvar::Query<double>("skate3_ultrawide_target_aspect");
|
|
||||||
return target_aspect > kBaseAspect + 0.01 ? std::clamp(target_aspect, kBaseAspect, 8.0) : 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ApplySkate3UltrawidePresenterAspect(const ui::Presenter* presenter, uint32_t& display_width,
|
|
||||||
uint32_t& display_height) {
|
|
||||||
const double target_aspect = GetSkate3UltrawideTargetAspect(presenter);
|
|
||||||
if (target_aspect <= 0.0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
rex::cvar::SetFlagByName("skate3_ultrawide_target_aspect", std::to_string(target_aspect));
|
|
||||||
|
|
||||||
display_height =
|
|
||||||
uint32_t(std::clamp(rex::cvar::Query<int32_t>("skate3_ultrawide_base_height"), 480, 2160));
|
|
||||||
display_width =
|
|
||||||
uint32_t(std::clamp(target_aspect * double(display_height) + 0.5, 1.0, 4095.0));
|
|
||||||
}
|
|
||||||
|
|
||||||
float ComputeSkate3UltrawideHorPlusScale() {
|
|
||||||
const double manual_scale = rex::cvar::Query<double>("skate3_ultrawide_hor_plus_scale");
|
|
||||||
if (manual_scale > 0.0) {
|
|
||||||
return float(std::clamp(manual_scale, 0.25, 4.0));
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr double kBaseAspect = 16.0 / 9.0;
|
|
||||||
double aspect = GetSkate3UltrawideTargetAspect();
|
|
||||||
if (aspect <= 0.0) {
|
|
||||||
const int32_t display_width = REXCVAR_GET(video_mode_width);
|
|
||||||
const int32_t display_height = REXCVAR_GET(video_mode_height);
|
|
||||||
if (display_width <= 0 || display_height <= 0) {
|
|
||||||
return 1.0f;
|
|
||||||
}
|
|
||||||
aspect = double(display_width) / double(display_height);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aspect <= kBaseAspect + 0.01f) {
|
|
||||||
return 1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
return float(std::clamp(kBaseAspect / aspect, 0.25, 1.0));
|
|
||||||
}
|
|
||||||
|
|
||||||
Skate3UltrawideDrawState QuerySkate3UltrawideDrawState() {
|
|
||||||
Skate3UltrawideDrawState state;
|
|
||||||
state.correction_active = rex::cvar::Query<bool>("skate3_ultrawide") &&
|
|
||||||
rex::cvar::Query<bool>("skate3_ultrawide_hor_plus") &&
|
|
||||||
ultrawide_debug::IsSkate3GameplayUltrawideActive() &&
|
|
||||||
!rex::cvar::Query<bool>("skate3_ultrawide_disable_ndc_correction");
|
|
||||||
if (!state.correction_active) {
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
state.hor_plus_scale = ComputeSkate3UltrawideHorPlusScale();
|
|
||||||
state.skip_shadow_targets = rex::cvar::Query<bool>("skate3_ultrawide_skip_shadow_targets");
|
|
||||||
state.skip_screen_space_targets =
|
|
||||||
rex::cvar::Query<bool>("skate3_ultrawide_skip_screen_space_targets");
|
|
||||||
state.shadow_skip_mode = uint32_t(std::clamp(
|
|
||||||
rex::cvar::Query<int32_t>("skate3_ultrawide_shadow_skip_mode"), 1, 3));
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
Skate3UltrawideDrawState SnapshotSkate3UltrawideDrawState(uint64_t frame) {
|
|
||||||
thread_local uint64_t cached_frame = 0;
|
|
||||||
thread_local Skate3UltrawideDrawState cached_state;
|
|
||||||
if (cached_frame != frame) {
|
|
||||||
cached_state = QuerySkate3UltrawideDrawState();
|
|
||||||
cached_frame = frame;
|
|
||||||
}
|
|
||||||
return cached_state;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Frame-cached read of the cross-TU draw trace flag - the registry Query is a
|
|
||||||
// mutex + string hash, too expensive to run for every draw.
|
|
||||||
bool QuerySkate3UltrawideTraceDraws(uint64_t frame) {
|
|
||||||
thread_local uint64_t cached_frame = UINT64_MAX;
|
|
||||||
thread_local bool cached_value = false;
|
|
||||||
if (cached_frame != frame) {
|
|
||||||
cached_value = rex::cvar::Query<bool>("skate3_ultrawide_trace_draws");
|
|
||||||
cached_frame = frame;
|
|
||||||
}
|
|
||||||
return cached_value;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsSkate3UltrawideDisplayViewport(const draw_util::ViewportInfo& viewport_info) {
|
|
||||||
const uint32_t width = viewport_info.xy_extent[0];
|
|
||||||
const uint32_t height = viewport_info.xy_extent[1];
|
|
||||||
if (!width || !height) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const uint64_t scaled_width = uint64_t(width) * 9;
|
|
||||||
const uint64_t scaled_height = uint64_t(height) * 16;
|
|
||||||
const uint64_t difference =
|
|
||||||
scaled_width > scaled_height ? scaled_width - scaled_height : scaled_height - scaled_width;
|
|
||||||
return difference <= scaled_height / 20;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ShouldApplySkate3UltrawideHorPlus(
|
|
||||||
const ultrawide_debug::TargetKey& target_key, bool primitive_polygonal,
|
|
||||||
Shader::HostVertexShaderType host_vertex_shader_type, reg::PA_CL_VTE_CNTL pa_cl_vte_cntl,
|
|
||||||
const draw_util::ViewportInfo& viewport_info,
|
|
||||||
reg::RB_DEPTHCONTROL normalized_depth_control,
|
|
||||||
const Skate3UltrawideDrawState& ultrawide_state) {
|
|
||||||
if (!ultrawide_state.correction_active) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The base classifier matches the Direct3D 12 build exactly. Pre-divided XY
|
|
||||||
// (screen-space/orthographic passes), non-kVertex host shaders, and depth
|
|
||||||
// passes without a depth write can leak widening into the side areas as
|
|
||||||
// menu/HUD fragments; excluding them is gated behind
|
|
||||||
// skate3_ultrawide_skip_screen_space_targets (off by default) so the Vulkan
|
|
||||||
// default matches the D3D12-tuned target list unless opted in.
|
|
||||||
const bool screen_space_pass =
|
|
||||||
host_vertex_shader_type != Shader::HostVertexShaderType::kVertex ||
|
|
||||||
!normalized_depth_control.z_write_enable || pa_cl_vte_cntl.vtx_xy_fmt;
|
|
||||||
const bool default_enabled =
|
|
||||||
primitive_polygonal && normalized_depth_control.z_enable &&
|
|
||||||
IsSkate3UltrawideDisplayViewport(viewport_info) &&
|
|
||||||
!(ultrawide_state.skip_screen_space_targets && screen_space_pass);
|
|
||||||
const bool selected = ultrawide_debug::ShouldApplyAndRecord(target_key, default_enabled);
|
|
||||||
if (selected && ultrawide_state.skip_shadow_targets &&
|
|
||||||
ultrawide_debug::IsShadowMapCandidate(target_key, ultrawide_state.shadow_skip_mode)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return selected;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsInGameContextActive(const system::KernelState* kernel_state) {
|
bool IsInGameContextActive(const system::KernelState* kernel_state) {
|
||||||
if (!kernel_state) {
|
if (!kernel_state) {
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -2954,13 +2790,17 @@ void VulkanCommandProcessor::IssueSwap(uint32_t frontbuffer_ptr, uint32_t frontb
|
||||||
kernel::xboxkrnl::VdQueryVideoMode(&video_mode);
|
kernel::xboxkrnl::VdQueryVideoMode(&video_mode);
|
||||||
uint32_t display_width = std::max(uint32_t(1), uint32_t(video_mode.display_width));
|
uint32_t display_width = std::max(uint32_t(1), uint32_t(video_mode.display_width));
|
||||||
uint32_t display_height = std::max(uint32_t(1), uint32_t(video_mode.display_height));
|
uint32_t display_height = std::max(uint32_t(1), uint32_t(video_mode.display_height));
|
||||||
ApplySkate3UltrawidePresenterAspect(presenter, display_width, display_height);
|
// Ultrawide: while the native renderer is serving frames, allocate the
|
||||||
|
// guest output at the wide display aspect; emulated frames keep the
|
||||||
|
// frontbuffer aspect and present pillarboxed.
|
||||||
|
const bool native_wide_output = ApplyNativeGuestOutputWideAspect(
|
||||||
|
guest_output_width, guest_output_height, display_width, display_height);
|
||||||
|
|
||||||
presenter->RefreshGuestOutput(
|
presenter->RefreshGuestOutput(
|
||||||
guest_output_width, guest_output_height, display_width, display_height,
|
guest_output_width, guest_output_height, display_width, display_height,
|
||||||
[this, guest_output_width, guest_output_height, display_width, display_height,
|
[this, guest_output_width, guest_output_height, display_width, display_height,
|
||||||
frontbuffer_format, swap_texture_view, swap_post_effect,
|
frontbuffer_format, swap_texture_view, swap_post_effect, swap_source_needs_rb_swap,
|
||||||
swap_source_needs_rb_swap](ui::Presenter::GuestOutputRefreshContext& context) -> bool {
|
native_wide_output](ui::Presenter::GuestOutputRefreshContext& context) -> bool {
|
||||||
// In case the swap command is the only one in the frame.
|
// In case the swap command is the only one in the frame.
|
||||||
if (!BeginSubmission(true)) {
|
if (!BeginSubmission(true)) {
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -3028,6 +2868,12 @@ void VulkanCommandProcessor::IssueSwap(uint32_t frontbuffer_ptr, uint32_t frontb
|
||||||
// the gamma pass below records into the same deferred command
|
// the gamma pass below records into the same deferred command
|
||||||
// buffer.
|
// buffer.
|
||||||
NativeRhiEndFrame(native_rhi_device_);
|
NativeRhiEndFrame(native_rhi_device_);
|
||||||
|
if (native_wide_output) {
|
||||||
|
// The output was sized wide for the native renderer; the
|
||||||
|
// emulated blit writes frontbuffer-aspect content, so keep the
|
||||||
|
// previously presented image and resize on the next refresh.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool swap_source_requires_compute_rb_swap =
|
bool swap_source_requires_compute_rb_swap =
|
||||||
|
|
@ -5086,69 +4932,6 @@ bool VulkanCommandProcessor::IssueDraw(xenos::PrimitiveType prim_type, uint32_t
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool skate3_ultrawide_submit_draw = true;
|
|
||||||
// Frame-cached: the registry Query takes the registry mutex and hashes the
|
|
||||||
// name, far too expensive for a per-draw debug-flag check.
|
|
||||||
if (QuerySkate3UltrawideTraceDraws(frame_current_)) {
|
|
||||||
ultrawide_debug::DrawFingerprint fingerprint;
|
|
||||||
fingerprint.bucket =
|
|
||||||
memexport_writes_possible
|
|
||||||
? ultrawide_debug::DrawBucket::kMemexport
|
|
||||||
: (edram_mode == xenos::EdramMode::kDepthOnly
|
|
||||||
? ultrawide_debug::DrawBucket::kDepthOnly
|
|
||||||
: (pixel_shader == nullptr ? ultrawide_debug::DrawBucket::kNoPixelShader
|
|
||||||
: ultrawide_debug::DrawBucket::kMainColorDepth));
|
|
||||||
fingerprint.vertex_shader_hash = vertex_shader->ucode_data_hash();
|
|
||||||
fingerprint.pixel_shader_hash = pixel_shader ? pixel_shader->ucode_data_hash() : 0;
|
|
||||||
fingerprint.primitive_type = uint32_t(primitive_processing_result.host_primitive_type);
|
|
||||||
fingerprint.vertex_count = host_draw_vertex_count;
|
|
||||||
fingerprint.primitive_count = host_draw_primitive_count;
|
|
||||||
fingerprint.packet_ptr = current_packet_ptr_;
|
|
||||||
if (index_buffer_info) {
|
|
||||||
fingerprint.index_guest_base = index_buffer_info->guest_base;
|
|
||||||
fingerprint.index_length = uint32_t(index_buffer_info->length);
|
|
||||||
}
|
|
||||||
const Shader::ConstantRegisterMap& constant_map = vertex_shader->constant_register_map();
|
|
||||||
size_t fetch_count = 0;
|
|
||||||
for (uint32_t i = 0; i < rex::countof(constant_map.vertex_fetch_bitmap); ++i) {
|
|
||||||
uint32_t fetch_bits = constant_map.vertex_fetch_bitmap[i];
|
|
||||||
uint32_t bit = 0;
|
|
||||||
while (fetch_count < ultrawide_debug::DrawFingerprint::kVertexFetchCount &&
|
|
||||||
rex::bit_scan_forward(fetch_bits, &bit)) {
|
|
||||||
fetch_bits &= ~(uint32_t(1) << bit);
|
|
||||||
xenos::xe_gpu_vertex_fetch_t fetch = regs.GetVertexFetch(i * 32 + bit);
|
|
||||||
fingerprint.vertex_fetch_address[fetch_count] = fetch.address << 2;
|
|
||||||
fingerprint.vertex_fetch_size[fetch_count] = fetch.size << 2;
|
|
||||||
++fetch_count;
|
|
||||||
}
|
|
||||||
if (fetch_count >= ultrawide_debug::DrawFingerprint::kVertexFetchCount) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
size_t texture_count = 0;
|
|
||||||
uint32_t texture_bits = used_texture_mask;
|
|
||||||
uint32_t texture_index = 0;
|
|
||||||
while (texture_count < ultrawide_debug::DrawFingerprint::kTextureFetchCount &&
|
|
||||||
rex::bit_scan_forward(texture_bits, &texture_index)) {
|
|
||||||
texture_bits &= ~(UINT32_C(1) << texture_index);
|
|
||||||
TextureCache::DebugActiveTextureBinding binding;
|
|
||||||
if (!texture_cache_->DebugGetActiveTextureBinding(texture_index, binding)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
fingerprint.texture_key_hash[texture_count] = binding.key_hash;
|
|
||||||
fingerprint.texture_fetch_index[texture_count] = binding.fetch_index;
|
|
||||||
fingerprint.texture_base_address[texture_count] = binding.base_address;
|
|
||||||
fingerprint.texture_base_length[texture_count] = binding.base_length;
|
|
||||||
fingerprint.texture_width[texture_count] = binding.width;
|
|
||||||
fingerprint.texture_height[texture_count] = binding.height;
|
|
||||||
fingerprint.texture_format[texture_count] = binding.format;
|
|
||||||
++texture_count;
|
|
||||||
}
|
|
||||||
skate3_ultrawide_submit_draw = ultrawide_debug::RecordDrawFingerprint(fingerprint);
|
|
||||||
}
|
|
||||||
if (!skate3_ultrawide_submit_draw) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
pre_draw_stage_timer.Stop();
|
pre_draw_stage_timer.Stop();
|
||||||
|
|
||||||
// Draw.
|
// Draw.
|
||||||
|
|
@ -8238,39 +8021,10 @@ void VulkanCommandProcessor::UpdateSystemConstantValues(
|
||||||
system_constants_.tessellation_factor_range_max = tessellation_factor_max;
|
system_constants_.tessellation_factor_range_max = tessellation_factor_max;
|
||||||
|
|
||||||
// Conversion to host normalized device coordinates.
|
// Conversion to host normalized device coordinates.
|
||||||
ultrawide_debug::TargetKey skate3_ultrawide_target_key;
|
|
||||||
for (uint32_t i = 0; i < 4; ++i) {
|
|
||||||
skate3_ultrawide_target_key.color_info[i] = color_infos[i].value;
|
|
||||||
}
|
|
||||||
skate3_ultrawide_target_key.depth_info = rb_depth_info.value;
|
|
||||||
skate3_ultrawide_target_key.surface_info = rb_surface_info.value;
|
|
||||||
skate3_ultrawide_target_key.viewport_x = viewport_info.xy_offset[0];
|
|
||||||
skate3_ultrawide_target_key.viewport_y = viewport_info.xy_offset[1];
|
|
||||||
skate3_ultrawide_target_key.viewport_width = viewport_info.xy_extent[0];
|
|
||||||
skate3_ultrawide_target_key.viewport_height = viewport_info.xy_extent[1];
|
|
||||||
skate3_ultrawide_target_key.color_mask = normalized_color_mask;
|
|
||||||
skate3_ultrawide_target_key.depth_control = normalized_depth_control.value;
|
|
||||||
skate3_ultrawide_target_key.pa_cl_vte_cntl = pa_cl_vte_cntl.value;
|
|
||||||
skate3_ultrawide_target_key.primitive_type = uint32_t(vgt_draw_initiator.prim_type);
|
|
||||||
skate3_ultrawide_target_key.host_vertex_shader_type =
|
|
||||||
uint32_t(primitive_processing_result.host_vertex_shader_type);
|
|
||||||
skate3_ultrawide_target_key.vertex_shader_hash = vertex_shader_hash;
|
|
||||||
skate3_ultrawide_target_key.pixel_shader_hash = pixel_shader_hash;
|
|
||||||
const Skate3UltrawideDrawState skate3_ultrawide_state =
|
|
||||||
SnapshotSkate3UltrawideDrawState(frame_current_);
|
|
||||||
const bool skate3_ultrawide_hor_plus_draw = ShouldApplySkate3UltrawideHorPlus(
|
|
||||||
skate3_ultrawide_target_key, primitive_polygonal,
|
|
||||||
primitive_processing_result.host_vertex_shader_type, pa_cl_vte_cntl, viewport_info,
|
|
||||||
normalized_depth_control, skate3_ultrawide_state);
|
|
||||||
const float skate3_ultrawide_hor_plus_scale =
|
|
||||||
skate3_ultrawide_hor_plus_draw ? skate3_ultrawide_state.hor_plus_scale : 1.0f;
|
|
||||||
for (uint32_t i = 0; i < 3; ++i) {
|
for (uint32_t i = 0; i < 3; ++i) {
|
||||||
const float ndc_scale =
|
dirty |= system_constants_.ndc_scale[i] != viewport_info.ndc_scale[i];
|
||||||
i == 0 ? viewport_info.ndc_scale[i] * skate3_ultrawide_hor_plus_scale
|
|
||||||
: viewport_info.ndc_scale[i];
|
|
||||||
dirty |= system_constants_.ndc_scale[i] != ndc_scale;
|
|
||||||
dirty |= system_constants_.ndc_offset[i] != viewport_info.ndc_offset[i];
|
dirty |= system_constants_.ndc_offset[i] != viewport_info.ndc_offset[i];
|
||||||
system_constants_.ndc_scale[i] = ndc_scale;
|
system_constants_.ndc_scale[i] = viewport_info.ndc_scale[i];
|
||||||
system_constants_.ndc_offset[i] = viewport_info.ndc_offset[i];
|
system_constants_.ndc_offset[i] = viewport_info.ndc_offset[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,8 +14,8 @@
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
|
||||||
#include <rex/cvar.h>
|
#include <rex/cvar.h>
|
||||||
#include <rex/graphics/ultrawide_debug.h>
|
|
||||||
#include <rex/input/input.h>
|
#include <rex/input/input.h>
|
||||||
|
#include <rex/kernel/guest_presence.h>
|
||||||
#include <rex/kernel/xam/input_injection.h>
|
#include <rex/kernel/xam/input_injection.h>
|
||||||
#include <rex/logging.h>
|
#include <rex/logging.h>
|
||||||
#include <rex/thread.h>
|
#include <rex/thread.h>
|
||||||
|
|
@ -49,8 +49,7 @@ X_HRESULT XgiApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,
|
||||||
uint32_t context_value = memory::load_and_swap<uint32_t>(buffer + 20);
|
uint32_t context_value = memory::load_and_swap<uint32_t>(buffer + 20);
|
||||||
auto old_value = kernel_state_->GetUserContext(user_index, context_id);
|
auto old_value = kernel_state_->GetUserContext(user_index, context_id);
|
||||||
kernel_state_->SetUserContext(user_index, context_id, context_value);
|
kernel_state_->SetUserContext(user_index, context_id, context_value);
|
||||||
rex::graphics::ultrawide_debug::NotifySkate3GameplayContext(user_index, context_id,
|
rex::kernel::guest_presence::NotifyContext(user_index, context_id, context_value);
|
||||||
context_value);
|
|
||||||
if (rex::cvar::Query<bool>("skate3_demo_path") && user_index == 0 &&
|
if (rex::cvar::Query<bool>("skate3_demo_path") && user_index == 0 &&
|
||||||
context_id == 0x8001) {
|
context_id == 0x8001) {
|
||||||
// Boot automation is strictly ONE-SHOT: the dialog A auto-tap exists
|
// Boot automation is strictly ONE-SHOT: the dialog A auto-tap exists
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,6 @@
|
||||||
#include <rex/graphics/flags.h>
|
#include <rex/graphics/flags.h>
|
||||||
#include <rex/graphics/graphics_system.h>
|
#include <rex/graphics/graphics_system.h>
|
||||||
#include <rex/graphics/pipeline/texture/info.h>
|
#include <rex/graphics/pipeline/texture/info.h>
|
||||||
#include <rex/graphics/ultrawide_debug.h>
|
|
||||||
#include <rex/graphics/video_mode_util.h>
|
#include <rex/graphics/video_mode_util.h>
|
||||||
#include <rex/graphics/xenos.h>
|
#include <rex/graphics/xenos.h>
|
||||||
#include <rex/kernel/xboxkrnl/private.h>
|
#include <rex/kernel/xboxkrnl/private.h>
|
||||||
|
|
@ -41,24 +40,18 @@ constexpr uint32_t kDisplayGammaType = 2;
|
||||||
constexpr double kDisplayGammaPower = 2.22222233;
|
constexpr double kDisplayGammaPower = 2.22222233;
|
||||||
constexpr double kSkate3BaseAspect = 16.0 / 9.0;
|
constexpr double kSkate3BaseAspect = 16.0 / 9.0;
|
||||||
|
|
||||||
bool Skate3UltrawidePresentationActive() {
|
// Ultrawide keeps the guest on a standard 16:9 video mode: the widening is
|
||||||
|
// done natively (wide guest output + Hor+ projection), never by handing the
|
||||||
|
// game a wide mode.
|
||||||
|
bool Skate3UltrawideConfigured() {
|
||||||
return rex::cvar::Query<bool>("skate3_ultrawide") &&
|
return rex::cvar::Query<bool>("skate3_ultrawide") &&
|
||||||
rex::graphics::ultrawide_debug::IsSkate3GameplayUltrawideActive() &&
|
|
||||||
rex::cvar::Query<double>("skate3_ultrawide_target_aspect") >
|
|
||||||
kSkate3BaseAspect + 0.01;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Skate3UltrawideConfiguredBeforeGameplay() {
|
|
||||||
return rex::cvar::Query<bool>("skate3_ultrawide") &&
|
|
||||||
!rex::graphics::ultrawide_debug::IsSkate3GameplayUltrawideActive() &&
|
|
||||||
rex::cvar::Query<double>("skate3_ultrawide_target_aspect") >
|
rex::cvar::Query<double>("skate3_ultrawide_target_aspect") >
|
||||||
kSkate3BaseAspect + 0.01;
|
kSkate3BaseAspect + 0.01;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t GetConfiguredVideoModeWidth() {
|
uint32_t GetConfiguredVideoModeWidth() {
|
||||||
int32_t configured_width = REXCVAR_GET(video_mode_width);
|
int32_t configured_width = REXCVAR_GET(video_mode_width);
|
||||||
if (!rex::cvar::HasNonDefaultValue("video_mode_width") &&
|
if (!rex::cvar::HasNonDefaultValue("video_mode_width") && !Skate3UltrawideConfigured()) {
|
||||||
!Skate3UltrawidePresentationActive() && !Skate3UltrawideConfiguredBeforeGameplay()) {
|
|
||||||
if (rex::cvar::HasNonDefaultValue("window_width") && REXCVAR_GET(window_width) > 0) {
|
if (rex::cvar::HasNonDefaultValue("window_width") && REXCVAR_GET(window_width) > 0) {
|
||||||
configured_width = REXCVAR_GET(window_width);
|
configured_width = REXCVAR_GET(window_width);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -75,8 +68,7 @@ uint32_t GetConfiguredVideoModeWidth() {
|
||||||
|
|
||||||
uint32_t GetConfiguredVideoModeHeight() {
|
uint32_t GetConfiguredVideoModeHeight() {
|
||||||
int32_t configured_height = REXCVAR_GET(video_mode_height);
|
int32_t configured_height = REXCVAR_GET(video_mode_height);
|
||||||
if (!rex::cvar::HasNonDefaultValue("video_mode_height") &&
|
if (!rex::cvar::HasNonDefaultValue("video_mode_height") && !Skate3UltrawideConfigured()) {
|
||||||
!Skate3UltrawidePresentationActive() && !Skate3UltrawideConfiguredBeforeGameplay()) {
|
|
||||||
if (rex::cvar::HasNonDefaultValue("window_height") && REXCVAR_GET(window_height) > 0) {
|
if (rex::cvar::HasNonDefaultValue("window_height") && REXCVAR_GET(window_height) > 0) {
|
||||||
configured_height = REXCVAR_GET(window_height);
|
configured_height = REXCVAR_GET(window_height);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,6 @@ set(REXUI_OVERLAY_SOURCES
|
||||||
overlay/wizard_screen.cpp
|
overlay/wizard_screen.cpp
|
||||||
overlay/simple_settings_overlay.cpp
|
overlay/simple_settings_overlay.cpp
|
||||||
overlay/settings_overlay.cpp
|
overlay/settings_overlay.cpp
|
||||||
overlay/ultrawide_targets_overlay.cpp
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Vulkan UI backend
|
# Vulkan UI backend
|
||||||
|
|
|
||||||
|
|
@ -1364,7 +1364,9 @@ void SimpleSettingsDialog::BuildRows(std::vector<RowSpec>& rows, int category) {
|
||||||
RowSpec row;
|
RowSpec row;
|
||||||
row.kind = RowSpec::kEnum;
|
row.kind = RowSpec::kEnum;
|
||||||
row.label = "Aspect Ratio";
|
row.label = "Aspect Ratio";
|
||||||
row.desc = "21:9 widens the world rendering for ultrawide displays.";
|
row.desc =
|
||||||
|
"21:9 widens the world rendering for ultrawide displays. Requires "
|
||||||
|
"the native renderer; the emulated renderer presents 16:9.";
|
||||||
row.value_note = "21:9 is experimental";
|
row.value_note = "21:9 is experimental";
|
||||||
for (const char* label : kAspectRatioLabels) {
|
for (const char* label : kAspectRatioLabels) {
|
||||||
row.options.push_back(label);
|
row.options.push_back(label);
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
Loading…
Add table
Reference in a new issue