Merge branch 'master' into vulkan

This commit is contained in:
Triang3l 2022-05-03 00:13:17 +03:00
commit b88f715140
112 changed files with 26403 additions and 1451 deletions

View File

@ -85,6 +85,7 @@ public abstract class WindowedAppActivity extends Activity {
}
// Used from the native WindowedAppContext. May be called from non-UI threads.
@SuppressWarnings("UnusedDeclaration")
protected void postInvalidateWindowSurface() {
if (mWindowSurfaceView == null) {
return;

176
src/xenia/base/chrono.h Normal file
View File

@ -0,0 +1,176 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#ifndef XENIA_BASE_CHRONO_H_
#define XENIA_BASE_CHRONO_H_
#include <chrono>
#include <cstdint>
// https://github.com/HowardHinnant/date/commit/5ba1c1ad8514362dba596f228eb20eb13f63d948#r33275526
#define HAS_UNCAUGHT_EXCEPTIONS 1
#include "third_party/date/include/date/tz.h"
#include "xenia/base/clock.h"
namespace xe {
using hundrednano = std::ratio<1, 10000000>;
namespace chrono {
using hundrednanoseconds = std::chrono::duration<int64_t, hundrednano>;
// https://docs.microsoft.com/en-us/windows/win32/sysinfo/converting-a-time-t-value-to-a-file-time
// Don't forget the 89 leap days.
static constexpr std::chrono::seconds seconds_1601_to_1970 =
(396 * 365 + 89) * std::chrono::seconds(60 * 60 * 24);
// TODO(JoelLinn) define xstead_clock xsystem_clock etc.
namespace internal {
// Trick to reduce code duplication and keep all the chrono template magic
// working
enum class Domain {
// boring host clock:
Host,
// adheres to guest scaling (differrent speed, changing clock drift etc):
Guest
};
template <Domain domain_>
struct NtSystemClock {
using rep = int64_t;
using period = hundrednano;
using duration = hundrednanoseconds;
using time_point = std::chrono::time_point<NtSystemClock<domain_>>;
// This really depends on the context the clock is used in:
// static constexpr bool is_steady = false;
public:
// The delta between std::chrono::system_clock (Jan 1 1970) and NT file
// time (Jan 1 1601), in seconds. In the spec std::chrono::system_clock's
// epoch is undefined, but C++20 cements it as Jan 1 1970.
static constexpr std::chrono::seconds unix_epoch_delta() {
using std::chrono::steady_clock;
auto filetime_epoch = date::year{1601} / date::month{1} / date::day{1};
auto system_clock_epoch = date::year{1970} / date::month{1} / date::day{1};
auto fp = static_cast<date::sys_seconds>(
static_cast<date::sys_days>(filetime_epoch));
auto sp = static_cast<date::sys_seconds>(
static_cast<date::sys_days>(system_clock_epoch));
return fp.time_since_epoch() - sp.time_since_epoch();
}
public:
static constexpr uint64_t to_file_time(time_point const& tp) noexcept {
return static_cast<uint64_t>(tp.time_since_epoch().count());
}
static constexpr time_point from_file_time(uint64_t const& tp) noexcept {
return time_point{duration{tp}};
}
// To convert XSystemClock to sys, do clock_cast<WinSystemTime>(tp) first
// SFINAE hack https://stackoverflow.com/a/58813009
template <Domain domain_fresh_ = domain_>
static constexpr std::enable_if_t<domain_fresh_ == Domain::Host,
std::chrono::system_clock::time_point>
to_sys(const time_point& tp) {
using sys_duration = std::chrono::system_clock::duration;
using sys_time = std::chrono::system_clock::time_point;
auto dp = tp;
dp += unix_epoch_delta();
auto cdp = std::chrono::time_point_cast<sys_duration>(dp);
return sys_time{cdp.time_since_epoch()};
}
template <Domain domain_fresh_ = domain_>
static constexpr std::enable_if_t<domain_fresh_ == Domain::Host, time_point>
from_sys(const std::chrono::system_clock::time_point& tp) {
auto ctp = std::chrono::time_point_cast<duration>(tp);
auto dp = time_point{ctp.time_since_epoch()};
dp -= unix_epoch_delta();
return dp;
}
[[nodiscard]] static time_point now() noexcept {
if constexpr (domain_ == Domain::Host) {
// QueryHostSystemTime() returns windows epoch times even on POSIX
return from_file_time(Clock::QueryHostSystemTime());
} else if constexpr (domain_ == Domain::Guest) {
return from_file_time(Clock::QueryGuestSystemTime());
}
}
};
} // namespace internal
// Unscaled system clock which can be used for filetime <-> system_clock
// conversion
using WinSystemClock = internal::NtSystemClock<internal::Domain::Host>;
// Guest system clock, scaled
using XSystemClock = internal::NtSystemClock<internal::Domain::Guest>;
} // namespace chrono
} // namespace xe
namespace date {
template <>
struct clock_time_conversion<::xe::chrono::WinSystemClock,
::xe::chrono::XSystemClock> {
using WClock_ = ::xe::chrono::WinSystemClock;
using XClock_ = ::xe::chrono::XSystemClock;
template <typename Duration>
typename WClock_::time_point operator()(
const std::chrono::time_point<XClock_, Duration>& t) const {
// Consult chrono_steady_cast.h for explanation on this:
std::atomic_thread_fence(std::memory_order_acq_rel);
auto w_now = WClock_::now();
auto x_now = XClock_::now();
std::atomic_thread_fence(std::memory_order_acq_rel);
auto delta = (t - x_now);
if (!::cvars::clock_no_scaling) {
delta = std::chrono::floor<WClock_::duration>(
delta * xe::Clock::guest_time_scalar());
}
return w_now + delta;
}
};
template <>
struct clock_time_conversion<::xe::chrono::XSystemClock,
::xe::chrono::WinSystemClock> {
using WClock_ = ::xe::chrono::WinSystemClock;
using XClock_ = ::xe::chrono::XSystemClock;
template <typename Duration>
typename XClock_::time_point operator()(
const std::chrono::time_point<WClock_, Duration>& t) const {
// Consult chrono_steady_cast.h for explanation on this:
std::atomic_thread_fence(std::memory_order_acq_rel);
auto w_now = WClock_::now();
auto x_now = XClock_::now();
std::atomic_thread_fence(std::memory_order_acq_rel);
xe::chrono::hundrednanoseconds delta = (t - w_now);
if (!::cvars::clock_no_scaling) {
delta = std::chrono::floor<WClock_::duration>(
delta / xe::Clock::guest_time_scalar());
}
return x_now + delta;
}
};
} // namespace date
#endif

View File

@ -0,0 +1,76 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#ifndef XENIA_BASE_CHRONO_STEADY_CAST_H_
#define XENIA_BASE_CHRONO_STEADY_CAST_H_
#include <atomic>
#include "xenia/base/chrono.h"
// This is in a separate header because casting to and from steady time points
// usually doesn't make sense and is imprecise. However, NT uses the FileTime
// epoch as a steady clock in waits. In such cases, include this header and use
// clock_cast<>().
namespace date {
// This conveniently works only for Host time domain because Guest needs
// additional scaling. Convert XSystemClock to WinSystemClock first if
// necessary.
template <>
struct clock_time_conversion<::xe::chrono::WinSystemClock,
std::chrono::steady_clock> {
// using NtSystemClock_ = ::xe::chrono::internal::NtSystemClock<domain_>;
using WinSystemClock_ = ::xe::chrono::WinSystemClock;
using steady_clock_ = std::chrono::steady_clock;
template <typename Duration>
typename WinSystemClock_::time_point operator()(
const std::chrono::time_point<steady_clock_, Duration>& t) const {
// Since there is no known epoch for steady_clock and even if, since it can
// progress differently than other common clocks (e.g. stopping when the
// computer is suspended), we need to use now() which introduces
// imprecision.
// Memory fences to keep the clock fetches close together to
// minimize drift. This pattern was benchmarked to give the lowest
// conversion error: error = sty_tpoint -
// clock_cast<sty>(clock_cast<nt>(sty_tpoint));
std::atomic_thread_fence(std::memory_order_acq_rel);
auto steady_now = steady_clock_::now();
auto nt_now = WinSystemClock_::now();
std::atomic_thread_fence(std::memory_order_acq_rel);
auto delta = std::chrono::floor<WinSystemClock_::duration>(t - steady_now);
return nt_now + delta;
}
};
template <>
struct clock_time_conversion<std::chrono::steady_clock,
::xe::chrono::WinSystemClock> {
using WinSystemClock_ = ::xe::chrono::WinSystemClock;
using steady_clock_ = std::chrono::steady_clock;
template <typename Duration>
steady_clock_::time_point operator()(
const std::chrono::time_point<WinSystemClock_, Duration>& t) const {
std::atomic_thread_fence(std::memory_order_acq_rel);
auto steady_now = steady_clock_::now();
auto nt_now = WinSystemClock_::now();
std::atomic_thread_fence(std::memory_order_acq_rel);
auto delta = t - nt_now;
return steady_now + delta;
}
};
} // namespace date
#endif

View File

@ -2,7 +2,7 @@
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2019 Ben Vanik. All rights reserved. *
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
@ -10,6 +10,7 @@
#ifndef XENIA_BASE_CLOCK_H_
#define XENIA_BASE_CLOCK_H_
#include <chrono>
#include <cstdint>
#include "xenia/base/cvar.h"
@ -24,6 +25,8 @@ DECLARE_bool(clock_source_raw);
namespace xe {
// chrono APIs in xenia/base/chrono.h are preferred
class Clock {
public:
// Host ticks-per-second. Generally QueryHostTickFrequency should be used.

View File

@ -1,111 +0,0 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#include "xenia/base/delay_scheduler.h"
#include "xenia/base/assert.h"
#include "xenia/base/logging.h"
namespace xe::internal {
DelaySchedulerBase::~DelaySchedulerBase() {
if (call_on_destruct_) {
for (auto& slot : deletion_queue_) {
// No thread safety in destructors anyway
if (slot.state == State::kWaiting) {
callback_(slot.info);
}
}
}
}
void DelaySchedulerBase::Collect() {
static_assert(atomic_state_t::is_always_lock_free,
"Locks are unsafe to use with thread suspension");
for (auto& slot : deletion_queue_) {
TryCollectOne_impl(slot);
}
}
bool DelaySchedulerBase::TryCollectOne_impl(deletion_record_t& slot) {
auto now = clock::now();
auto state = State::kWaiting;
// Try to lock the waiting slot for reading the other fields
if (slot.state.compare_exchange_strong(state, State::kDeleting,
std::memory_order_acq_rel)) {
if (now > slot.due) {
// Time has passed, call back now
callback_(slot.info);
slot.info = nullptr;
slot.state.store(State::kFree, std::memory_order_release);
return true;
} else {
// Oops it's not yet due
slot.state.store(State::kWaiting, std::memory_order_release);
}
}
return false;
}
void DelaySchedulerBase::ScheduleAt_impl(
void* info, const clock::time_point& timeout_time) {
bool first_pass = true;
if (info == nullptr) {
return;
}
for (;;) {
if (TryScheduleAt_impl(info, timeout_time)) {
return;
}
if (first_pass) {
first_pass = false;
XELOGE(
"`DelayScheduler::ScheduleAt(...)` stalled: list is full! Find out "
"why or increase `MAX_QUEUE`.");
}
}
}
bool DelaySchedulerBase::TryScheduleAt_impl(
void* info, const clock::time_point& timeout_time) {
if (info == nullptr) {
return false;
}
for (auto& slot : deletion_queue_) {
// Clean up due item
TryCollectOne_impl(slot);
if (TryScheduleAtOne_impl(slot, info, timeout_time)) {
return true;
}
}
return false;
}
bool DelaySchedulerBase::TryScheduleAtOne_impl(deletion_record_t& slot,
void* info,
clock::time_point due) {
auto state = State::kFree;
if (slot.state.compare_exchange_strong(state, State::kInitializing,
std::memory_order_acq_rel)) {
slot.info = info;
slot.due = due;
slot.state.store(State::kWaiting, std::memory_order_release);
return true;
}
return false;
}
} // namespace xe::internal

View File

@ -1,142 +0,0 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#ifndef XENIA_BASE_DELAY_SCHEDULER_H_
#define XENIA_BASE_DELAY_SCHEDULER_H_
#include <atomic>
#include <chrono>
#include <cstddef>
#include <functional>
#include <vector>
namespace xe {
namespace internal {
// Put the implementation in a non templated base class to reduce compile time
// and code duplication
class DelaySchedulerBase {
protected: // Types
enum class State : uint_least8_t {
kFree = 0, // Slot is unsued
kInitializing, // Slot is reserved and currently written to by a thread
kWaiting, // The slot contains a pointer scheduled for deletion
kDeleting // A thread is currently deleting the pointer
};
using atomic_state_t = std::atomic<State>;
using clock = std::chrono::steady_clock;
struct deletion_record_t {
atomic_state_t state;
void* info;
clock::time_point due;
};
using deletion_queue_t = std::vector<deletion_record_t>;
using callback_t = std::function<void(void*)>;
public:
/// Check all scheduled items in the queue and free any that are due using
/// `callback(info);`. Call this to reliably collect all due wait items in the
/// queue.
void Collect();
size_t size() { return deletion_queue_.size(); }
protected: // Implementation
DelaySchedulerBase(size_t queue_size, callback_t callback,
bool call_on_destruct)
: deletion_queue_(queue_size),
callback_(callback),
call_on_destruct_(call_on_destruct) {}
virtual ~DelaySchedulerBase();
void ScheduleAt_impl(void* info, const clock::time_point& timeout_time);
[[nodiscard]] bool TryScheduleAt_impl(void* info,
const clock::time_point& timeout_time);
/// Checks if the slot is due and if so, call back for it.
bool TryCollectOne_impl(deletion_record_t& slot);
[[nodiscard]] bool TryScheduleAtOne_impl(deletion_record_t& slot, void* info,
clock::time_point due);
private:
deletion_queue_t deletion_queue_;
callback_t callback_;
bool call_on_destruct_;
};
} // namespace internal
/// A lazy scheduler/timer.
/// Will wait at least the specified duration before invoking the callbacks but
/// might wait until it is destructed. Lockless thread-safe, will spinlock
/// though if the wait queue is full (except for `Try`... methods). Might use
/// any thread that calls any member to invoke callbacks of due wait items.
template <typename INFO>
class DelayScheduler : internal::DelaySchedulerBase {
public:
DelayScheduler(size_t queue_size, std::function<void(INFO*)> callback,
bool call_on_destruct)
: DelaySchedulerBase(
queue_size,
[callback](void* info) { callback(reinterpret_cast<INFO*>(info)); },
call_on_destruct){};
DelayScheduler(const DelayScheduler&) = delete;
DelayScheduler& operator=(const DelayScheduler&) = delete;
virtual ~DelayScheduler() {}
// From base class:
// void Collect();
/// Schedule an object for deletion at some point after `timeout_time` using
/// `callback(info);`. Will collect any wait items it encounters which can be
/// 0 or all, use `Collect()` to collect all due wait items. Blocks until a
/// free wait slot is found.
template <class Clock, class Duration>
void ScheduleAt(
INFO* info,
const std::chrono::time_point<Clock, Duration>& timeout_time) {
ScheduleAt(info,
std::chrono::time_point_cast<clock::time_point>(timeout_time));
}
/// Like `ScheduleAt` but does not block on full list.
template <class Clock, class Duration>
[[nodiscard]] bool TryScheduleAt(
INFO* info,
const std::chrono::time_point<Clock, Duration>& timeout_time) {
return TryScheduleAt(
info, std::chrono::time_point_cast<clock::time_point>(timeout_time));
}
void ScheduleAt(INFO* info, const clock::time_point& timeout_time) {
ScheduleAt_impl(info, timeout_time);
}
[[nodiscard]] bool TryScheduleAt(INFO* info,
const clock::time_point& timeout_time) {
return TryScheduleAt_impl(info, timeout_time);
}
/// Schedule a callback at some point after `rel_time` has passed.
template <class Rep, class Period>
void ScheduleAfter(INFO* info,
const std::chrono::duration<Rep, Period>& rel_time) {
ScheduleAt(info,
clock::now() + std::chrono::ceil<clock::duration>(rel_time));
}
/// Like `ScheduleAfter` but does not block.
template <class Rep, class Period>
[[nodiscard]] bool TryScheduleAfter(
INFO* info, const std::chrono::duration<Rep, Period>& rel_time) {
return TryScheduleAt(
info, clock::now() + std::chrono::ceil<clock::duration>(rel_time));
}
};
} // namespace xe
#endif

View File

@ -1,69 +0,0 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2014 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#include "xenia/base/math.h"
namespace xe {
// TODO(benvanik): replace with alternate implementation.
// XMConvertFloatToHalf
// Copyright (c) Microsoft Corporation. All rights reserved.
uint16_t float_to_half(float value) {
uint32_t Result;
uint32_t IValue = (reinterpret_cast<uint32_t*>(&value))[0];
uint32_t Sign = (IValue & 0x80000000U) >> 16U;
IValue = IValue & 0x7FFFFFFFU; // Hack off the sign
if (IValue > 0x47FFEFFFU) {
// The number is too large to be represented as a half. Saturate to
// infinity.
Result = 0x7FFFU;
} else {
if (IValue < 0x38800000U) {
// The number is too small to be represented as a normalized half.
// Convert it to a denormalized value.
uint32_t Shift = 113U - (IValue >> 23U);
IValue = (0x800000U | (IValue & 0x7FFFFFU)) >> Shift;
} else {
// Rebias the exponent to represent the value as a normalized half.
IValue += 0xC8000000U;
}
Result = ((IValue + 0x0FFFU + ((IValue >> 13U) & 1U)) >> 13U) & 0x7FFFU;
}
return (uint16_t)(Result | Sign);
}
// TODO(benvanik): replace with alternate implementation.
// XMConvertHalfToFloat
// Copyright (c) Microsoft Corporation. All rights reserved.
float half_to_float(uint16_t value) {
uint32_t Mantissa = (uint32_t)(value & 0x03FF);
uint32_t Exponent;
if ((value & 0x7C00) != 0) {
// The value is normalized
Exponent = (uint32_t)((value >> 10) & 0x1F);
} else if (Mantissa != 0) {
// The value is denormalized
// Normalize the value in the resulting float
Exponent = 1;
do {
Exponent--;
Mantissa <<= 1;
} while ((Mantissa & 0x0400) == 0);
Mantissa &= 0x03FF;
} else {
// The value is zero
Exponent = (uint32_t)-112;
}
uint32_t Result = ((value & 0x8000) << 16) | // Sign
((Exponent + 112) << 23) | // Exponent
(Mantissa << 13); // Mantissa
return *reinterpret_cast<float*>(&Result);
}
} // namespace xe

View File

@ -378,8 +378,65 @@ int64_t m128_i64(const __m128& v) {
}
#endif
uint16_t float_to_half(float value);
float half_to_float(uint16_t value);
// Similar to the C++ implementation of XMConvertFloatToHalf and
// XMConvertHalfToFloat from DirectXMath 3.00 (pre-3.04, which switched from the
// Xenos encoding to IEEE 754), with the extended range instead of infinity and
// NaN, and optionally with denormalized numbers - as used in vpkd3d128 (no
// denormals, rounding towards zero) and on the Xenos (GL_OES_texture_float
// alternative encoding).
inline uint16_t float_to_xenos_half(float value, bool preserve_denormal = false,
bool round_to_nearest_even = false) {
uint32_t integer_value = *reinterpret_cast<const uint32_t*>(&value);
uint32_t abs_value = integer_value & 0x7FFFFFFFu;
uint32_t result;
if (abs_value >= 0x47FFE000u) {
// Saturate.
result = 0x7FFFu;
} else {
if (abs_value < 0x38800000u) {
// The number is too small to be represented as a normalized half.
if (preserve_denormal) {
uint32_t shift =
std::min(uint32_t(113u - (abs_value >> 23u)), uint32_t(24u));
result = (0x800000u | (abs_value & 0x7FFFFFu)) >> shift;
} else {
result = 0u;
}
} else {
// Rebias the exponent to represent the value as a normalized half.
result = abs_value + 0xC8000000u;
}
if (round_to_nearest_even) {
result += 0xFFFu + ((result >> 13u) & 1u);
}
result = (result >> 13u) & 0x7FFFu;
}
return uint16_t(result | ((integer_value & 0x80000000u) >> 16u));
}
inline float xenos_half_to_float(uint16_t value,
bool preserve_denormal = false) {
uint32_t mantissa = value & 0x3FFu;
uint32_t exponent = (value >> 10u) & 0x1Fu;
if (!exponent) {
if (!preserve_denormal) {
mantissa = 0;
} else if (mantissa) {
// Normalize the value in the resulting float.
// do { Exponent--; Mantissa <<= 1; } while ((Mantissa & 0x0400) == 0)
uint32_t mantissa_lzcnt = xe::lzcnt(mantissa) - (32u - 11u);
exponent = uint32_t(1 - int32_t(mantissa_lzcnt));
mantissa = (mantissa << mantissa_lzcnt) & 0x3FFu;
}
if (!mantissa) {
exponent = uint32_t(-112);
}
}
uint32_t result = (uint32_t(value & 0x8000u) << 16u) |
((exponent + 112u) << 23u) | (mantissa << 13u);
return *reinterpret_cast<const float*>(&result);
}
// https://locklessinc.com/articles/sat_arithmetic/
template <typename T>

View File

@ -0,0 +1,148 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#include "xenia/base/chrono.h"
#define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER
#include "third_party/catch/include/catch.hpp"
namespace xe::base::test {
// If the tests run fast, the time duration may be zero. So we artificially
// raise it to allow for some error.
template <typename _Rep, typename _Period>
auto dur_bound(std::chrono::duration<_Rep, _Period> dur) {
using namespace std::chrono_literals;
return std::max<std::common_type_t<std::chrono::milliseconds,
std::chrono::duration<_Rep, _Period>>>(
dur, 1ms);
}
TEST_CASE("WinSystemClock <-> system_clock", "[clock_cast]") {
using namespace xe::chrono;
using namespace date;
using sys_clock = std::chrono::system_clock;
// First check some assumptions made in chrono.h
SECTION("C++20 unix epoch") {
auto epoch = date::year{1970} / date::month{1} / date::day{1};
std::chrono::system_clock::time_point epoch_tp{
static_cast<date::sys_days>(epoch)};
REQUIRE(epoch_tp.time_since_epoch().count() == 0);
}
SECTION("Epoch delta") {
std::chrono::seconds sys_delta = WinSystemClock::unix_epoch_delta();
REQUIRE(sys_delta.count() == INT64_C(-11644473600));
}
SECTION("1993/12/21") {
static constexpr sys_days sys(1993_y / dec / 21);
static constexpr auto wsys = WinSystemClock::from_sys(sys);
REQUIRE(wsys.time_since_epoch().count() == 124009056000000000);
REQUIRE(clock_cast<sys_clock>(wsys) == sys);
REQUIRE(clock_cast<WinSystemClock>(sys) == wsys);
}
SECTION("2100/3/1") {
static constexpr sys_days sys(2100_y / mar / 1);
static constexpr auto wsys = WinSystemClock::from_sys(sys);
REQUIRE(wsys.time_since_epoch().count() == 157520160000000000);
REQUIRE(clock_cast<sys_clock>(wsys) == sys);
REQUIRE(clock_cast<WinSystemClock>(sys) == wsys);
}
}
TEST_CASE("WinSystemClock <-> XSystemClock", "[clock_cast]") {
using namespace std::chrono_literals;
using namespace xe::chrono;
using namespace date;
using sys_clock = std::chrono::system_clock;
SECTION("1993/12/21, clock_no_scaling = true") {
static constexpr sys_days sys(1993_y / dec / 21);
cvars::clock_no_scaling = true;
Clock::set_guest_time_scalar(1.0);
static constexpr auto wsys = WinSystemClock::from_sys(sys);
auto start = std::chrono::system_clock::now();
auto xsys = date::clock_cast<XSystemClock>(wsys);
auto wxsys = date::clock_cast<WinSystemClock>(xsys);
auto duration = dur_bound(std::chrono::system_clock::now() - start);
auto error = wsys.time_since_epoch() - wxsys.time_since_epoch();
REQUIRE(error < duration);
REQUIRE(error > -duration);
}
SECTION("1993/12/21, clock_no_scaling = false") {
static constexpr sys_days sys(1993_y / dec / 21);
cvars::clock_no_scaling = false;
Clock::set_guest_time_scalar(1.0);
static constexpr auto wsys = WinSystemClock::from_sys(sys);
auto start = std::chrono::system_clock::now();
auto xsys = date::clock_cast<XSystemClock>(wsys);
auto wxsys = date::clock_cast<WinSystemClock>(xsys);
auto duration = dur_bound(std::chrono::system_clock::now() - start);
auto error1 = wsys.time_since_epoch() - xsys.time_since_epoch();
auto error2 = xsys.time_since_epoch() - wxsys.time_since_epoch();
auto error3 = wsys - wxsys;
REQUIRE(error1 < 10ms);
REQUIRE(error1 > -10ms);
REQUIRE(error2 < 10ms);
REQUIRE(error2 > -10ms);
REQUIRE(error3 < duration);
REQUIRE(error3 > -duration);
}
}
} // namespace xe::base::test
// only make these available now
#include "xenia/base/chrono_steady_cast.h"
namespace xe::base::test {
TEST_CASE("WinSystemClock <-> steady_clock", "[clock_cast]") {
using namespace xe::chrono;
using namespace date;
using sty_clock = std::chrono::steady_clock;
// steady conversion is mostly used to convert wait times
SECTION("now") {
auto sty = sty_clock::now();
// Because steady casts are imprecise, we need to allow some margin of error
auto start = sty_clock::now();
auto wsty = clock_cast<WinSystemClock>(sty);
auto sty2 = clock_cast<sty_clock>(wsty);
auto duration = dur_bound(sty_clock::now() - start).count();
auto error = std::abs((sty2 - sty).count());
REQUIRE(error <= duration);
}
}
} // namespace xe::base::test

View File

@ -11,8 +11,11 @@
#include "xenia/base/threading.h"
#define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER
#include "third_party/catch/include/catch.hpp"
#include "third_party/disruptorplus/include/disruptorplus/spin_wait.hpp"
namespace xe {
namespace base {
namespace test {
@ -24,12 +27,12 @@ template <class Clock, class Duration, class Predicate>
bool spin_wait_until(
const std::chrono::time_point<Clock, Duration>& timeout_time,
Predicate stop_waiting) {
disruptorplus::spin_wait spinner;
while (!stop_waiting()) {
if (std::chrono::steady_clock::now() >= timeout_time) {
return false;
}
// Needed for valgrind because it basically runs one thread:
MaybeYield();
spinner.spin_once();
}
return true;
}
@ -42,9 +45,9 @@ bool spin_wait_for(const std::chrono::duration<Rep, Period>& rel_time,
template <class Predicate>
void spin_wait(Predicate stop_waiting) {
disruptorplus::spin_wait spinner;
while (!stop_waiting()) {
// Needed for valgrind because it basically runs one thread:
MaybeYield();
spinner.spin_once();
}
}
@ -241,8 +244,63 @@ TEST_CASE("HighResolutionTimer") {
REQUIRE(counter2 <= ratio2 + 1);
}
// TODO(bwrsandman): Check on which thread callbacks are executed when
// spawned from differing threads
// Test many timers
{
const auto interval = 50ms;
const size_t timer_count = 128;
std::atomic<uint64_t> counter(0);
auto cb = [&counter, &timer_thread] {
++counter;
REQUIRE(Thread::GetCurrentThread() == timer_thread);
};
std::vector<std::unique_ptr<HighResolutionTimer>> timers;
auto start = std::chrono::steady_clock::now();
for (size_t i = 0; i < timer_count; i++) {
timers.emplace_back(HighResolutionTimer::CreateRepeating(interval, cb));
}
Sleep(wait_time);
timers.clear();
auto duration = std::chrono::steady_clock::now() - start;
REQUIRE(duration.count() >= wait_time.count());
auto ratio = static_cast<uint64_t>(timer_count * duration / interval);
REQUIRE(counter >= ratio - timer_count);
REQUIRE(counter <= ratio + timer_count);
}
// Check timer order
{
constexpr size_t timer_count = 16;
using pair_t = std::pair<std::atomic<uint64_t>,
std::chrono::high_resolution_clock::time_point>;
std::array<pair_t, timer_count> time_points{};
auto start = std::chrono::steady_clock::now();
auto gen_callback = [&timer_thread, &time_points](size_t i) {
return [&timer_thread, &time_points, i]() {
auto& pair = time_points[i];
if (pair.first.fetch_add(1) == 1) {
pair.second = std::chrono::high_resolution_clock::now();
pair.first++;
}
REQUIRE(Thread::GetCurrentThread() == timer_thread);
};
};
std::vector<std::unique_ptr<HighResolutionTimer>> timers;
for (size_t i = 0; i < timer_count; i++) {
timers.emplace_back(HighResolutionTimer::CreateRepeating(
10ms * (timer_count - i), gen_callback(timer_count - i - 1)));
}
REQUIRE(spin_wait_for(2s, [&] {
return std::all_of(time_points.cbegin(), time_points.cend(),
[](auto& pair) { return pair.first >= 3; });
}));
timers.clear();
REQUIRE(std::is_sorted(
time_points.cbegin(), time_points.cend(),
[](auto& left, auto& right) { return left.second < right.second; }));
}
}
TEST_CASE("Wait on Multiple Handles", "[wait]") {
@ -731,8 +789,8 @@ TEST_CASE("Wait on Timer", "[timer]") {
REQUIRE(timer);
result = Wait(timer.get(), false, 1ms);
REQUIRE(result == WaitResult::kTimeout);
REQUIRE(timer->SetOnce(1ms)); // Signals it
result = Wait(timer.get(), false, 2ms);
REQUIRE(timer->SetOnceAfter(1ms)); // Signals it
result = Wait(timer.get(), false, 20ms);
REQUIRE(result == WaitResult::kSuccess);
result = Wait(timer.get(), false, 1ms);
REQUIRE(result == WaitResult::kSuccess); // Did not reset
@ -742,21 +800,20 @@ TEST_CASE("Wait on Timer", "[timer]") {
REQUIRE(timer);
result = Wait(timer.get(), false, 1ms);
REQUIRE(result == WaitResult::kTimeout);
REQUIRE(timer->SetOnce(1ms)); // Signals it
result = Wait(timer.get(), false, 2ms);
REQUIRE(timer->SetOnceAfter(1ms)); // Signals it
result = Wait(timer.get(), false, 20ms);
REQUIRE(result == WaitResult::kSuccess);
result = Wait(timer.get(), false, 1ms);
REQUIRE(result == WaitResult::kTimeout); // Did reset
// TODO(bwrsandman): This test unexpectedly fails under windows
// Test long due time
// timer = Timer::CreateSynchronizationTimer();
// REQUIRE(timer->SetOnce(10s));
// result = Wait(timer.get(), false, 10ms); // Still signals under windows
// REQUIRE(result == WaitResult::kTimeout);
timer = Timer::CreateSynchronizationTimer();
REQUIRE(timer->SetOnceAfter(10s));
result = Wait(timer.get(), false, 10ms);
REQUIRE(result == WaitResult::kTimeout);
// Test Repeating
REQUIRE(timer->SetRepeating(1ms, 10ms));
REQUIRE(timer->SetRepeatingAfter(1ms, 10ms));
for (int i = 0; i < 10; ++i) {
result = Wait(timer.get(), false, 20ms);
INFO(i);
@ -777,12 +834,12 @@ TEST_CASE("Wait on Timer", "[timer]") {
result = Wait(timer.get(), false, 20ms);
REQUIRE(result == WaitResult::kTimeout);
// Cancel with SetOnce
REQUIRE(timer->SetRepeating(1ms, 10ms));
REQUIRE(timer->SetRepeatingAfter(1ms, 10ms));
for (int i = 0; i < 10; ++i) {
result = Wait(timer.get(), false, 20ms);
REQUIRE(result == WaitResult::kSuccess);
}
REQUIRE(timer->SetOnce(1ms));
REQUIRE(timer->SetOnceAfter(1ms));
result = Wait(timer.get(), false, 20ms);
REQUIRE(result == WaitResult::kSuccess); // Signal from Set Once
result = Wait(timer.get(), false, 20ms);
@ -804,7 +861,7 @@ TEST_CASE("Wait on Multiple Timers", "[timer]") {
REQUIRE(any_result.second == 0);
// Some signaled
REQUIRE(timer1->SetOnce(1ms));
REQUIRE(timer1->SetOnceAfter(1ms));
all_result = WaitAll({timer0.get(), timer1.get()}, false, 100ms);
REQUIRE(all_result == WaitResult::kTimeout);
any_result = WaitAny({timer0.get(), timer1.get()}, false, 100ms);
@ -812,11 +869,11 @@ TEST_CASE("Wait on Multiple Timers", "[timer]") {
REQUIRE(any_result.second == 1);
// All signaled
REQUIRE(timer0->SetOnce(1ms));
REQUIRE(timer0->SetOnceAfter(1ms));
all_result = WaitAll({timer0.get(), timer1.get()}, false, 100ms);
REQUIRE(all_result == WaitResult::kSuccess);
REQUIRE(timer0->SetOnce(1ms));
Sleep(1ms);
REQUIRE(timer0->SetOnceAfter(1ms));
Sleep(2ms);
any_result = WaitAny({timer0.get(), timer1.get()}, false, 100ms);
REQUIRE(any_result.first == WaitResult::kSuccess);
REQUIRE(any_result.second == 0);

View File

@ -25,8 +25,10 @@
#include <vector>
#include "xenia/base/assert.h"
#include "xenia/base/chrono.h"
#include "xenia/base/literals.h"
#include "xenia/base/platform.h"
#include "xenia/base/threading_timer_queue.h"
namespace xe {
namespace threading {
@ -141,18 +143,38 @@ bool FreeTlsHandle(TlsHandle handle);
uintptr_t GetTlsValue(TlsHandle handle);
bool SetTlsValue(TlsHandle handle, uintptr_t value);
// A high-resolution timer capable of firing at millisecond-precision.
// All timers created in this way are executed in the same thread so
// callbacks must be kept short or else all timers will be impacted.
// A high-resolution timer capable of firing at millisecond-precision. All
// timers created in this way are executed in the same thread so callbacks must
// be kept short or else all timers will be impacted. This is a simplified
// wrapper around QueueTimerRecurring which automatically cancels the timer on
// destruction.
class HighResolutionTimer {
HighResolutionTimer(std::chrono::milliseconds interval,
std::function<void()> callback) {
assert_not_null(callback);
wait_item_ = QueueTimerRecurring(
[callback = std::move(callback)](void*) { callback(); }, nullptr,
TimerQueueWaitItem::clock::now(), interval);
}
public:
virtual ~HighResolutionTimer() = default;
~HighResolutionTimer() {
if (auto wait_item = wait_item_.lock()) {
wait_item->Disarm();
}
}
// Creates a new repeating timer with the given period.
// The given function will be called back as close to the given period as
// possible.
static std::unique_ptr<HighResolutionTimer> CreateRepeating(
std::chrono::milliseconds period, std::function<void()> callback);
std::chrono::milliseconds period, std::function<void()> callback) {
return std::unique_ptr<HighResolutionTimer>(
new HighResolutionTimer(period, std::move(callback)));
}
private:
std::weak_ptr<TimerQueueWaitItem> wait_item_;
};
// Results for a WaitHandle operation.
@ -317,6 +339,13 @@ class Mutant : public WaitHandle {
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms687012(v=vs.85).aspx
class Timer : public WaitHandle {
public:
// Make vtable entries for both so we can defer conversions and only do them
// if really necessary (let the calling code what clock it prefers). Windows
// kernel sync primitives will work with WinSystemClock while our own
// implementation works with steady_clock.
using WClock_ = xe::chrono::WinSystemClock;
using GClock_ = std::chrono::steady_clock; // generic
// Creates a timer whose state remains signaled until SetOnce() or
// SetRepeating() is called to establish a new due time.
static std::unique_ptr<Timer> CreateManualResetTimer();
@ -329,7 +358,11 @@ class Timer : public WaitHandle {
// timer is signaled and the thread that set the timer calls the optional
// completion routine.
// Returns true on success.
virtual bool SetOnce(std::chrono::nanoseconds due_time,
virtual bool SetOnceAfter(xe::chrono::hundrednanoseconds rel_time,
std::function<void()> opt_callback = nullptr) = 0;
virtual bool SetOnceAt(WClock_::time_point due_time,
std::function<void()> opt_callback = nullptr) = 0;
virtual bool SetOnceAt(GClock_::time_point due_time,
std::function<void()> opt_callback = nullptr) = 0;
// Activates the specified waitable timer. When the due time arrives, the
@ -337,17 +370,15 @@ class Timer : public WaitHandle {
// completion routine. A periodic timer automatically reactivates each time
// the period elapses, until the timer is canceled or reset.
// Returns true on success.
virtual bool SetRepeating(std::chrono::nanoseconds due_time,
virtual bool SetRepeatingAfter(
xe::chrono::hundrednanoseconds rel_time, std::chrono::milliseconds period,
std::function<void()> opt_callback = nullptr) = 0;
virtual bool SetRepeatingAt(WClock_::time_point due_time,
std::chrono::milliseconds period,
std::function<void()> opt_callback = nullptr) = 0;
virtual bool SetRepeatingAt(GClock_::time_point due_time,
std::chrono::milliseconds period,
std::function<void()> opt_callback = nullptr) = 0;
template <typename Rep, typename Period>
bool SetRepeating(std::chrono::nanoseconds due_time,
std::chrono::duration<Rep, Period> period,
std::function<void()> opt_callback = nullptr) {
return SetRepeating(
due_time, std::chrono::duration_cast<std::chrono::milliseconds>(period),
std::move(opt_callback));
}
// Stops the timer before it can be set to the signaled state and cancels
// outstanding callbacks. Threads performing a wait operation on the timer

View File

@ -10,8 +10,9 @@
#include "xenia/base/threading.h"
#include "xenia/base/assert.h"
#include "xenia/base/delay_scheduler.h"
#include "xenia/base/chrono_steady_cast.h"
#include "xenia/base/platform.h"
#include "xenia/base/threading_timer_queue.h"
#include <pthread.h>
#include <sched.h>
@ -78,47 +79,6 @@ void AndroidShutdown() {
}
#endif
// This is separately allocated for each (`HighResolution`)`Timer` object. It
// will be cleaned up some time (`timers_garbage_collector_delay`) after the
// posix timer was canceled because posix `timer_delete(...)` does not remove
// pending timer signals.
// https://stackoverflow.com/questions/49756114/linux-timer-pending-signal
struct timer_callback_info_t {
std::atomic_bool disarmed;
#if !XE_HAS_SIGEV_THREAD_ID
pthread_t target_thread;
#endif
std::function<void()> callback;
void* userdata;
timer_callback_info_t(std::function<void()> callback)
: disarmed(false),
#if !XE_HAS_SIGEV_THREAD_ID
target_thread(),
#endif
callback(callback),
userdata(nullptr) {
}
};
// GC for timer signal info structs:
constexpr uint_fast8_t timers_garbage_collector_scale_ =
#if XE_HAS_SIGEV_THREAD_ID
1;
#else
2;
#endif
DelayScheduler<timer_callback_info_t> timers_garbage_collector_(
512 * timers_garbage_collector_scale_,
[](timer_callback_info_t* info) {
assert_not_null(info);
delete info;
},
true);
// Delay we have to assume it takes to clear all pending signals (maximum):
constexpr auto timers_garbage_collector_delay =
std::chrono::milliseconds(100 * timers_garbage_collector_scale_);
template <typename _Rep, typename _Period>
inline timespec DurationToTimeSpec(
std::chrono::duration<_Rep, _Period> duration) {
@ -133,8 +93,6 @@ inline timespec DurationToTimeSpec(
// gdb tip, for SIG = SIGRTMIN + SignalType : handle SIG nostop
// lldb tip, for SIG = SIGRTMIN + SignalType : process handle SIG -s false
enum class SignalType {
kHighResolutionTimer,
kTimer,
kThreadSuspend,
kThreadUserCallback,
#if XE_PLATFORM_ANDROID
@ -232,71 +190,6 @@ bool SetTlsValue(TlsHandle handle, uintptr_t value) {
reinterpret_cast<void*>(value)) == 0;
}
class PosixHighResolutionTimer : public HighResolutionTimer {
public:
explicit PosixHighResolutionTimer(std::function<void()> callback)
: valid_(false) {
callback_info_ = new timer_callback_info_t(std::move(callback));
}
~PosixHighResolutionTimer() override {
if (valid_) {
callback_info_->disarmed = true;
timer_delete(timerid_);
// Deliberately leaks memory when wait queue is full instead of blogs,
// check logs
static_cast<void>(timers_garbage_collector_.TryScheduleAfter(
callback_info_, timers_garbage_collector_delay));
} else {
delete callback_info_;
}
}
bool Initialize(std::chrono::milliseconds period) {
if (valid_) {
// Double initialization
assert_always();
return false;
}
// Create timer
sigevent sev{};
#if XE_HAS_SIGEV_THREAD_ID
sev.sigev_notify = SIGEV_SIGNAL | SIGEV_THREAD_ID;
sev.sigev_notify_thread_id = gettid();
#else
sev.sigev_notify = SIGEV_SIGNAL;
callback_info_->target_thread = pthread_self();
#endif
sev.sigev_signo = GetSystemSignal(SignalType::kHighResolutionTimer);
sev.sigev_value.sival_ptr = callback_info_;
if (timer_create(CLOCK_MONOTONIC, &sev, &timerid_) == -1) return false;
// Start timer
itimerspec its{};
its.it_value = DurationToTimeSpec(period);
its.it_interval = its.it_value;
valid_ = timer_settime(timerid_, 0, &its, nullptr) != -1;
if (!valid_) {
timer_delete(timerid_);
}
return valid_;
}
private:
timer_callback_info_t* callback_info_;
timer_t timerid_;
bool valid_; // all values for timer_t are legal so we need this
};
std::unique_ptr<HighResolutionTimer> HighResolutionTimer::CreateRepeating(
std::chrono::milliseconds period, std::function<void()> callback) {
install_signal_handler(SignalType::kHighResolutionTimer);
auto timer = std::make_unique<PosixHighResolutionTimer>(std::move(callback));
if (!timer->Initialize(period)) {
return nullptr;
}
return std::move(timer);
}
class PosixConditionBase {
public:
virtual bool Signal() = 0;
@ -495,10 +388,7 @@ template <>
class PosixCondition<Timer> : public PosixConditionBase {
public:
explicit PosixCondition(bool manual_reset)
: timer_(nullptr),
callback_info_(nullptr),
signal_(false),
manual_reset_(manual_reset) {}
: callback_(nullptr), signal_(false), manual_reset_(manual_reset) {}
virtual ~PosixCondition() { Cancel(); }
@ -509,58 +399,55 @@ class PosixCondition<Timer> : public PosixConditionBase {
return true;
}
// TODO(bwrsandman): due_times of under 1ms deadlock under travis
// TODO(joellinn): This is likely due to deadlock on mutex_ if Signal() is
// called from signal_handler running in Thread A while thread A was still in
// Set(...) routine inside the lock
bool Set(std::chrono::nanoseconds due_time, std::chrono::milliseconds period,
std::function<void()> opt_callback = nullptr) {
void SetOnce(std::chrono::steady_clock::time_point due_time,
std::function<void()> opt_callback) {
Cancel();
std::lock_guard<std::mutex> lock(mutex_);
callback_info_ = new timer_callback_info_t(std::move(opt_callback));
callback_info_->userdata = this;
callback_ = std::move(opt_callback);
signal_ = false;
// Create timer
sigevent sev{};
#if XE_HAS_SIGEV_THREAD_ID
sev.sigev_notify = SIGEV_SIGNAL | SIGEV_THREAD_ID;
sev.sigev_notify_thread_id = gettid();
#else
sev.sigev_notify = SIGEV_SIGNAL;
callback_info_->target_thread = pthread_self();
#endif
sev.sigev_signo = GetSystemSignal(SignalType::kTimer);
sev.sigev_value.sival_ptr = callback_info_;
if (timer_create(CLOCK_MONOTONIC, &sev, &timer_) == -1) {
delete callback_info_;
return false;
wait_item_ = QueueTimerOnce(&CompletionRoutine, this, due_time);
}
// Start timer
itimerspec its{};
its.it_value = DurationToTimeSpec(due_time);
its.it_interval = DurationToTimeSpec(period);
return timer_settime(timer_, 0, &its, nullptr) == 0;
}
void SetRepeating(std::chrono::steady_clock::time_point due_time,
std::chrono::milliseconds period,
std::function<void()> opt_callback) {
Cancel();
bool Cancel() {
std::lock_guard<std::mutex> lock(mutex_);
bool result = true;
if (timer_) {
callback_info_->disarmed = true;
result = timer_delete(timer_) == 0;
timer_ = nullptr;
static_cast<void>(timers_garbage_collector_.TryScheduleAfter(
callback_info_, timers_garbage_collector_delay));
callback_info_ = nullptr;
callback_ = std::move(opt_callback);
signal_ = false;
wait_item_ =
QueueTimerRecurring(&CompletionRoutine, this, due_time, period);
}
void Cancel() {
if (auto wait_item = wait_item_.lock()) {
wait_item->Disarm();
}
return result;
}
void* native_handle() const override {
return reinterpret_cast<void*>(timer_);
assert_always();
return nullptr;
}
private:
static void CompletionRoutine(void* userdata) {
assert_not_null(userdata);
auto timer = reinterpret_cast<PosixCondition<Timer>*>(userdata);
timer->Signal();
// As the callback may reset the timer, store local.
std::function<void()> callback;
{
std::lock_guard<std::mutex> lock(timer->mutex_);
callback = timer->callback_;
}
if (callback) {
callback();
}
}
private:
@ -570,8 +457,8 @@ class PosixCondition<Timer> : public PosixConditionBase {
signal_ = false;
}
}
timer_t timer_;
timer_callback_info_t* callback_info_;
std::weak_ptr<TimerQueueWaitItem> wait_item_;
std::function<void()> callback_;
volatile bool signal_;
const bool manual_reset_;
};
@ -1072,29 +959,57 @@ std::unique_ptr<Mutant> Mutant::Create(bool initial_owner) {
}
class PosixTimer : public PosixConditionHandle<Timer> {
using WClock_ = Timer::WClock_;
using GClock_ = Timer::GClock_;
public:
explicit PosixTimer(bool manual_reset) : PosixConditionHandle(manual_reset) {}
~PosixTimer() override = default;
bool SetOnce(std::chrono::nanoseconds due_time,
std::function<void()> opt_callback) override {
return handle_.Set(due_time, std::chrono::milliseconds::zero(),
bool SetOnceAfter(xe::chrono::hundrednanoseconds rel_time,
std::function<void()> opt_callback = nullptr) override {
return SetOnceAt(GClock_::now() + rel_time, std::move(opt_callback));
}
bool SetOnceAt(WClock_::time_point due_time,
std::function<void()> opt_callback = nullptr) override {
return SetOnceAt(date::clock_cast<GClock_>(due_time),
std::move(opt_callback));
};
bool SetOnceAt(GClock_::time_point due_time,
std::function<void()> opt_callback = nullptr) override {
handle_.SetOnce(due_time, std::move(opt_callback));
return true;
}
bool SetRepeatingAfter(
xe::chrono::hundrednanoseconds rel_time, std::chrono::milliseconds period,
std::function<void()> opt_callback = nullptr) override {
return SetRepeatingAt(GClock_::now() + rel_time, period,
std::move(opt_callback));
}
bool SetRepeating(std::chrono::nanoseconds due_time,
bool SetRepeatingAt(WClock_::time_point due_time,
std::chrono::milliseconds period,
std::function<void()> opt_callback) override {
return handle_.Set(due_time, period, std::move(opt_callback));
std::function<void()> opt_callback = nullptr) override {
return SetRepeatingAt(date::clock_cast<GClock_>(due_time), period,
std::move(opt_callback));
}
bool SetRepeatingAt(GClock_::time_point due_time,
std::chrono::milliseconds period,
std::function<void()> opt_callback = nullptr) override {
handle_.SetRepeating(due_time, period, std::move(opt_callback));
return true;
}
bool Cancel() override {
handle_.Cancel();
return true;
}
bool Cancel() override { return handle_.Cancel(); }
};
std::unique_ptr<Timer> Timer::CreateManualResetTimer() {
install_signal_handler(SignalType::kTimer);
return std::make_unique<PosixTimer>(true);
}
std::unique_ptr<Timer> Timer::CreateSynchronizationTimer() {
install_signal_handler(SignalType::kTimer);
return std::make_unique<PosixTimer>(false);
}
@ -1252,53 +1167,6 @@ void set_name(const std::string_view name) {
static void signal_handler(int signal, siginfo_t* info, void* /*context*/) {
switch (GetSystemSignalType(signal)) {
case SignalType::kHighResolutionTimer: {
assert_not_null(info->si_value.sival_ptr);
auto timer_info =
reinterpret_cast<timer_callback_info_t*>(info->si_value.sival_ptr);
if (!timer_info->disarmed) {
#if XE_HAS_SIGEV_THREAD_ID
{
#else
if (pthread_self() != timer_info->target_thread) {
sigval info_inner{};
info_inner.sival_ptr = timer_info;
const auto queueres = pthread_sigqueue(
timer_info->target_thread,
GetSystemSignal(SignalType::kHighResolutionTimer), info_inner);
assert_zero(queueres);
} else {
#endif
timer_info->callback();
}
}
} break;
case SignalType::kTimer: {
assert_not_null(info->si_value.sival_ptr);
auto timer_info =
reinterpret_cast<timer_callback_info_t*>(info->si_value.sival_ptr);
if (!timer_info->disarmed) {
assert_not_null(timer_info->userdata);
auto timer = static_cast<PosixCondition<Timer>*>(timer_info->userdata);
#if XE_HAS_SIGEV_THREAD_ID
{
#else
if (pthread_self() != timer_info->target_thread) {
sigval info_inner{};
info_inner.sival_ptr = timer_info;
const auto queueres =
pthread_sigqueue(timer_info->target_thread,
GetSystemSignal(SignalType::kTimer), info_inner);
assert_zero(queueres);
} else {
#endif
timer->Signal();
if (timer_info->callback) {
timer_info->callback();
}
}
}
} break;
case SignalType::kThreadSuspend: {
assert_not_null(current_thread_);
current_thread_->WaitSuspended();

View File

@ -0,0 +1,213 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#include <algorithm>
#include <forward_list>
#include "third_party/disruptorplus/include/disruptorplus/multi_threaded_claim_strategy.hpp"
#include "third_party/disruptorplus/include/disruptorplus/ring_buffer.hpp"
#include "third_party/disruptorplus/include/disruptorplus/sequence_barrier.hpp"
#include "third_party/disruptorplus/include/disruptorplus/spin_wait.hpp"
#include "third_party/disruptorplus/include/disruptorplus/spin_wait_strategy.hpp"
#include "xenia/base/assert.h"
#include "xenia/base/threading.h"
#include "xenia/base/threading_timer_queue.h"
namespace dp = disruptorplus;
namespace xe {
namespace threading {
using WaitItem = TimerQueueWaitItem;
class TimerQueue {
public:
using clock = WaitItem::clock;
static_assert(clock::is_steady);
public:
TimerQueue()
: buffer_(kWaitCount),
wait_strategy_(),
claim_strategy_(kWaitCount, wait_strategy_),
consumed_(wait_strategy_),
shutdown_(false) {
claim_strategy_.add_claim_barrier(consumed_);
dispatch_thread_ = std::thread(&TimerQueue::TimerThreadMain, this);
}
~TimerQueue() {
shutdown_.store(true, std::memory_order_release);
// Kick dispatch thread to check shutdown flag
auto wait_item = std::make_shared<WaitItem>(nullptr, nullptr, this,
clock::time_point::min(),
clock::duration::zero());
wait_item->Disarm();
QueueTimer(std::move(wait_item));
dispatch_thread_.join();
}
void TimerThreadMain() {
dp::sequence_t next_sequence = 0;
const auto comp = [](const std::shared_ptr<WaitItem>& left,
const std::shared_ptr<WaitItem>& right) {
return left->due_ < right->due_;
};
xe::threading::set_name("xe::threading::TimerQueue");
while (!shutdown_.load(std::memory_order_relaxed)) {
{
// Consume new wait items and add them to sorted wait queue
dp::sequence_t available = claim_strategy_.wait_until_published(
next_sequence, next_sequence - 1,
wait_queue_.empty() ? clock::time_point::max()
: wait_queue_.front()->due_);
// Check for timeout
if (available != next_sequence - 1) {
std::forward_list<std::shared_ptr<WaitItem>> wait_items;
do {
wait_items.push_front(std::move(buffer_[next_sequence]));
} while (next_sequence++ != available);
consumed_.publish(available);
wait_items.sort(comp);
wait_queue_.merge(wait_items, comp);
}
}
{
// Check wait queue, invoke callbacks and reschedule
std::forward_list<std::shared_ptr<WaitItem>> wait_items;
while (!wait_queue_.empty() &&
wait_queue_.front()->due_ <= clock::now()) {
auto wait_item = std::move(wait_queue_.front());
wait_queue_.pop_front();
// Ensure that it isn't disarmed
auto state = WaitItem::State::kIdle;
if (wait_item->state_.compare_exchange_strong(
state, WaitItem::State::kInCallback,
std::memory_order_acq_rel)) {
// Possibility to dispatch to a thread pool here
assert_not_null(wait_item->callback_);
wait_item->callback_(wait_item->userdata_);
if (wait_item->interval_ != clock::duration::zero() &&
wait_item->state_.load(std::memory_order_acquire) !=
WaitItem::State::kInCallbackSelfDisarmed) {
// Item is recurring and didn't self-disarm during callback:
wait_item->due_ += wait_item->interval_;
wait_item->state_.store(WaitItem::State::kIdle,
std::memory_order_release);
wait_items.push_front(std::move(wait_item));
} else {
wait_item->state_.store(WaitItem::State::kDisarmed,
std::memory_order_release);
}
} else {
// Specifically, kInCallback is illegal here
assert_true(WaitItem::State::kDisarmed == state);
}
}
wait_items.sort(comp);
wait_queue_.merge(wait_items, comp);
}
}
}
std::weak_ptr<WaitItem> QueueTimer(std::shared_ptr<WaitItem> wait_item) {
auto wait_item_weak = std::weak_ptr<WaitItem>(wait_item);
// Mitigate callback flooding
wait_item->due_ =
std::max(clock::now() - wait_item->interval_, wait_item->due_);
auto sequence = claim_strategy_.claim_one();
buffer_[sequence] = std::move(wait_item);
claim_strategy_.publish(sequence);
return wait_item_weak;
}
const std::thread& dispatch_thread() const { return dispatch_thread_; }
private:
// This ring buffer will be used to introduce timers queued by the public API
static constexpr size_t kWaitCount = 512;
dp::ring_buffer<std::shared_ptr<WaitItem>> buffer_;
dp::spin_wait_strategy wait_strategy_;
dp::multi_threaded_claim_strategy<dp::spin_wait_strategy> claim_strategy_;
dp::sequence_barrier<dp::spin_wait_strategy> consumed_;
// This is a _sorted_ (ascending due_) list of active timers managed by a
// dedicated thread
std::forward_list<std::shared_ptr<WaitItem>> wait_queue_;
std::atomic_bool shutdown_;
std::thread dispatch_thread_;
};
xe::threading::TimerQueue timer_queue_;
void TimerQueueWaitItem::Disarm() {
State state;
// Special case for calling from a callback itself
if (std::this_thread::get_id() == parent_queue_->dispatch_thread().get_id()) {
state = State::kInCallback;
if (state_.compare_exchange_strong(state, State::kInCallbackSelfDisarmed,
std::memory_order_acq_rel)) {
// If we are self disarming from the callback set this special state and
// exit
return;
}
// Normal case can handle the rest
}
dp::spin_wait spinner;
state = State::kIdle;
// Classes which hold WaitItems will often call Disarm() to cancel them during
// destruction. This may lead to race conditions when the dispatch thread
// executes a callback which accesses memory that is freed simultaneously due
// to this. Therefore, we need to guarantee that no callbacks will be running
// once Disarm() has returned.
while (!state_.compare_exchange_weak(state, State::kDisarmed,
std::memory_order_acq_rel)) {
if (state == State::kDisarmed) {
// Do not break for kInCallbackSelfDisarmed and keep spinning in order to
// meet guarantees
break;
}
state = State::kIdle;
spinner.spin_once();
}
}
std::weak_ptr<WaitItem> QueueTimerOnce(std::function<void(void*)> callback,
void* userdata,
WaitItem::clock::time_point due) {
return timer_queue_.QueueTimer(
std::make_shared<WaitItem>(std::move(callback), userdata, &timer_queue_,
due, WaitItem::clock::duration::zero()));
}
std::weak_ptr<WaitItem> QueueTimerRecurring(
std::function<void(void*)> callback, void* userdata,
WaitItem::clock::time_point due, WaitItem::clock::duration interval) {
return timer_queue_.QueueTimer(std::make_shared<WaitItem>(
std::move(callback), userdata, &timer_queue_, due, interval));
}
} // namespace threading
} // namespace xe

View File

@ -0,0 +1,79 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#ifndef XENIA_BASE_THREADING_TIMER_QUEUE_H_
#define XENIA_BASE_THREADING_TIMER_QUEUE_H_
#include <atomic>
#include <chrono>
#include <functional>
#include <memory>
// This is a platform independent implementation of a timer queue similar to
// Windows CreateTimerQueueTimer with WT_EXECUTEINTIMERTHREAD.
namespace xe::threading {
class TimerQueue;
struct TimerQueueWaitItem {
using clock = std::chrono::steady_clock;
TimerQueueWaitItem(std::function<void(void*)> callback, void* userdata,
TimerQueue* parent_queue, clock::time_point due,
clock::duration interval)
: callback_(std::move(callback)),
userdata_(userdata),
parent_queue_(parent_queue),
due_(due),
interval_(interval),
state_(State::kIdle) {}
// Cancel the pending wait item. No callbacks will be running after this call.
// The function blocks if a callback is running and returns only after the
// callback has finished (except when called from the corresponding callback
// itself, where it will mark the wait item for disarmament and return
// immediately). Deadlocks are possible when a lock is held during disamament
// and the corresponding callback is running concurrently, trying to acquire
// said lock.
void Disarm();
friend TimerQueue;
private:
enum class State : uint_least8_t {
kIdle = 0, // Waiting for the due time
kInCallback, // Callback is being executed
kInCallbackSelfDisarmed, // Callback is being executed and disarmed itself
kDisarmed // Disarmed, waiting for destruction
};
static_assert(std::atomic<State>::is_always_lock_free);
std::function<void(void*)> callback_;
void* userdata_;
TimerQueue* parent_queue_;
clock::time_point due_;
clock::duration interval_; // zero if not recurring
std::atomic<State> state_;
};
std::weak_ptr<TimerQueueWaitItem> QueueTimerOnce(
std::function<void(void*)> callback, void* userdata,
TimerQueueWaitItem::clock::time_point due);
// Callback is first executed at due, then again repeatedly after interval
// passes (unless interval == 0). The first callback will be scheduled at
// `max(now() - interval, due)` to mitigate callback flooding.
std::weak_ptr<TimerQueueWaitItem> QueueTimerRecurring(
std::function<void(void*)> callback, void* userdata,
TimerQueueWaitItem::clock::time_point due,
TimerQueueWaitItem::clock::duration interval);
} // namespace xe::threading
#endif

View File

@ -8,9 +8,11 @@
*/
#include "xenia/base/assert.h"
#include "xenia/base/chrono_steady_cast.h"
#include "xenia/base/logging.h"
#include "xenia/base/platform_win.h"
#include "xenia/base/threading.h"
#include "xenia/base/threading_timer_queue.h"
#define LOG_LASTERROR() \
{ XELOGI("Win32 Error 0x{:08X} in " __FUNCTION__ "(...)", GetLastError()); }
@ -112,48 +114,6 @@ bool SetTlsValue(TlsHandle handle, uintptr_t value) {
return TlsSetValue(handle, reinterpret_cast<void*>(value)) ? true : false;
}
class Win32HighResolutionTimer : public HighResolutionTimer {
public:
Win32HighResolutionTimer(std::function<void()> callback)
: callback_(std::move(callback)) {}
~Win32HighResolutionTimer() override {
if (valid_) {
DeleteTimerQueueTimer(nullptr, handle_, INVALID_HANDLE_VALUE);
handle_ = nullptr;
}
}
bool Initialize(std::chrono::milliseconds period) {
if (valid_) {
// Double initialization
assert_always();
return false;
}
valid_ = !!CreateTimerQueueTimer(
&handle_, nullptr,
[](PVOID param, BOOLEAN timer_or_wait_fired) {
auto timer = reinterpret_cast<Win32HighResolutionTimer*>(param);
timer->callback_();
},
this, 0, DWORD(period.count()), WT_EXECUTEINTIMERTHREAD);
return valid_;
}
private:
std::function<void()> callback_;
HANDLE handle_ = nullptr;
bool valid_ = false; // Documentation does not state which HANDLE is invalid
};
std::unique_ptr<HighResolutionTimer> HighResolutionTimer::CreateRepeating(
std::chrono::milliseconds period, std::function<void()> callback) {
auto timer = std::make_unique<Win32HighResolutionTimer>(std::move(callback));
if (!timer->Initialize(period)) {
return nullptr;
}
return std::move(timer);
}
template <typename T>
class Win32Handle : public T {
public:
@ -317,15 +277,28 @@ std::unique_ptr<Mutant> Mutant::Create(bool initial_owner) {
}
class Win32Timer : public Win32Handle<Timer> {
using WClock_ = Timer::WClock_;
using GClock_ = Timer::GClock_;
public:
explicit Win32Timer(HANDLE handle) : Win32Handle(handle) {}
~Win32Timer() = default;
bool SetOnce(std::chrono::nanoseconds due_time,
bool SetOnceAfter(xe::chrono::hundrednanoseconds rel_time,
std::function<void()> opt_callback) override {
return SetOnceAt(WClock_::now() + rel_time, std::move(opt_callback));
}
bool SetOnceAt(GClock_::time_point due_time,
std::function<void()> opt_callback) override {
return SetOnceAt(date::clock_cast<WClock_>(due_time),
std::move(opt_callback));
}
bool SetOnceAt(WClock_::time_point due_time,
std::function<void()> opt_callback) override {
std::lock_guard<std::mutex> lock(mutex_);
callback_ = std::move(opt_callback);
LARGE_INTEGER due_time_li;
due_time_li.QuadPart = due_time.count() / 100;
due_time_li.QuadPart = WClock_::to_file_time(due_time);
auto completion_routine =
callback_ ? reinterpret_cast<PTIMERAPCROUTINE>(CompletionRoutine)
: NULL;
@ -334,13 +307,26 @@ class Win32Timer : public Win32Handle<Timer> {
? true
: false;
}
bool SetRepeating(std::chrono::nanoseconds due_time,
bool SetRepeatingAfter(
xe::chrono::hundrednanoseconds rel_time, std::chrono::milliseconds period,
std::function<void()> opt_callback = nullptr) override {
return SetRepeatingAt(WClock_::now() + rel_time, period,
std::move(opt_callback));
}
bool SetRepeatingAt(GClock_::time_point due_time,
std::chrono::milliseconds period,
std::function<void()> opt_callback = nullptr) {
return SetRepeatingAt(date::clock_cast<WClock_>(due_time), period,
std::move(opt_callback));
}
bool SetRepeatingAt(WClock_::time_point due_time,
std::chrono::milliseconds period,
std::function<void()> opt_callback) override {
std::lock_guard<std::mutex> lock(mutex_);
callback_ = std::move(opt_callback);
LARGE_INTEGER due_time_li;
due_time_li.QuadPart = due_time.count() / 100;
due_time_li.QuadPart = WClock_::to_file_time(due_time);
auto completion_routine =
callback_ ? reinterpret_cast<PTIMERAPCROUTINE>(CompletionRoutine)
: NULL;
@ -349,6 +335,7 @@ class Win32Timer : public Win32Handle<Timer> {
? true
: false;
}
bool Cancel() override {
// Reset the callback immediately so that any completions don't call it.
std::lock_guard<std::mutex> lock(mutex_);

View File

@ -1574,7 +1574,11 @@ EMITTER_OPCODE_TABLE(OPCODE_EXTRACT, EXTRACT_I8, EXTRACT_I16, EXTRACT_I32);
struct SPLAT_I8 : Sequence<SPLAT_I8, I<OPCODE_SPLAT, V128Op, I8Op>> {
static void Emit(X64Emitter& e, const EmitArgType& i) {
if (i.src1.is_constant) {
// TODO(benvanik): faster constant splats.
if (e.IsFeatureEnabled(kX64EmitGFNI)) {
e.pxor(e.xmm0, e.xmm0);
e.gf2p8affineqb(i.dest, e.xmm0, i.src1.constant());
return;
}
e.mov(e.eax, i.src1.constant());
e.vmovd(e.xmm0, e.eax);
} else {

View File

@ -22,6 +22,7 @@
#include "xenia/gpu/d3d12/d3d12_shader.h"
#include "xenia/gpu/draw_util.h"
#include "xenia/gpu/gpu_flags.h"
#include "xenia/gpu/registers.h"
#include "xenia/gpu/xenos.h"
#include "xenia/ui/d3d12/d3d12_presenter.h"
#include "xenia/ui/d3d12/d3d12_util.h"
@ -846,7 +847,8 @@ bool D3D12CommandProcessor::SetupContext() {
// Initialize the render target cache before configuring binding - need to
// know if using rasterizer-ordered views for the bindless root signature.
render_target_cache_ = std::make_unique<D3D12RenderTargetCache>(
*register_file_, *this, trace_writer_, bindless_resources_used_);
*register_file_, *memory_, trace_writer_, *this,
bindless_resources_used_);
if (!render_target_cache_->Initialize()) {
XELOGE("Failed to initialize the render target cache");
return false;
@ -2127,13 +2129,16 @@ bool D3D12CommandProcessor::IssueDraw(xenos::PrimitiveType primitive_type,
return true;
}
reg::RB_DEPTHCONTROL normalized_depth_control =
draw_util::GetNormalizedDepthControl(regs);
// Shader modifications.
DxbcShaderTranslator::Modification vertex_shader_modification =
pipeline_cache_->GetCurrentVertexShaderModification(
*vertex_shader, primitive_processing_result.host_vertex_shader_type);
DxbcShaderTranslator::Modification pixel_shader_modification =
pixel_shader
? pipeline_cache_->GetCurrentPixelShaderModification(*pixel_shader)
pixel_shader ? pipeline_cache_->GetCurrentPixelShaderModification(
*pixel_shader, normalized_depth_control)
: DxbcShaderTranslator::Modification(0);
// Set up the render targets - this may perform dispatches and draws.
@ -2142,7 +2147,8 @@ bool D3D12CommandProcessor::IssueDraw(xenos::PrimitiveType primitive_type,
regs, pixel_shader->writes_color_targets())
: 0;
if (!render_target_cache_->Update(is_rasterization_done,
normalized_color_mask)) {
normalized_depth_control,
normalized_color_mask, *vertex_shader)) {
return false;
}
@ -2173,8 +2179,8 @@ bool D3D12CommandProcessor::IssueDraw(xenos::PrimitiveType primitive_type,
ID3D12RootSignature* root_signature;
if (!pipeline_cache_->ConfigurePipeline(
vertex_shader_translation, pixel_shader_translation,
primitive_processing_result, normalized_color_mask,
bound_depth_and_color_render_target_bits,
primitive_processing_result, normalized_depth_control,
normalized_color_mask, bound_depth_and_color_render_target_bits,
bound_depth_and_color_render_target_formats, &pipeline_handle,
&root_signature)) {
return false;
@ -2206,6 +2212,7 @@ bool D3D12CommandProcessor::IssueDraw(xenos::PrimitiveType primitive_type,
draw_util::GetHostViewportInfo(
regs, resolution_scale_x, resolution_scale_y, true,
D3D12_VIEWPORT_BOUNDS_MAX, D3D12_VIEWPORT_BOUNDS_MAX, false,
normalized_depth_control,
host_render_targets_used &&
(depth_float24_conversion ==
RenderTargetCache::DepthFloat24Conversion::kOnOutputTruncating ||
@ -2221,7 +2228,8 @@ bool D3D12CommandProcessor::IssueDraw(xenos::PrimitiveType primitive_type,
scissor.extent[1] *= resolution_scale_y;
// Update viewport, scissor, blend factor and stencil reference.
UpdateFixedFunctionState(viewport_info, scissor, primitive_polygonal);
UpdateFixedFunctionState(viewport_info, scissor, primitive_polygonal,
normalized_depth_control);
// Update system constants before uploading them.
// TODO(Triang3l): With ROV, pass the disabled render target mask for safety.
@ -2229,7 +2237,7 @@ bool D3D12CommandProcessor::IssueDraw(xenos::PrimitiveType primitive_type,
memexport_used, primitive_polygonal,
primitive_processing_result.line_loop_closing_index,
primitive_processing_result.host_index_endian, viewport_info,
used_texture_mask, normalized_color_mask);
used_texture_mask, normalized_depth_control, normalized_color_mask);
// Update constant buffers, descriptors and root parameters.
if (!UpdateBindings(vertex_shader, pixel_shader, root_signature)) {
@ -3029,7 +3037,8 @@ void D3D12CommandProcessor::ClearCommandAllocatorCache() {
void D3D12CommandProcessor::UpdateFixedFunctionState(
const draw_util::ViewportInfo& viewport_info,
const draw_util::Scissor& scissor, bool primitive_polygonal) {
const draw_util::Scissor& scissor, bool primitive_polygonal,
reg::RB_DEPTHCONTROL normalized_depth_control) {
#if XE_UI_D3D12_FINE_GRAINED_DRAW_SCOPES
SCOPE_profile_cpu_f("gpu");
#endif // XE_UI_D3D12_FINE_GRAINED_DRAW_SCOPES
@ -3077,8 +3086,7 @@ void D3D12CommandProcessor::UpdateFixedFunctionState(
// choose the back face one only if drawing only back faces.
Register stencil_ref_mask_reg;
auto pa_su_sc_mode_cntl = regs.Get<reg::PA_SU_SC_MODE_CNTL>();
if (primitive_polygonal &&
draw_util::GetDepthControlForCurrentEdramMode(regs).backface_enable &&
if (primitive_polygonal && normalized_depth_control.backface_enable &&
pa_su_sc_mode_cntl.cull_front && !pa_su_sc_mode_cntl.cull_back) {
stencil_ref_mask_reg = XE_GPU_REG_RB_STENCILREFMASK_BF;
} else {
@ -3099,6 +3107,7 @@ void D3D12CommandProcessor::UpdateSystemConstantValues(
bool shared_memory_is_uav, bool primitive_polygonal,
uint32_t line_loop_closing_index, xenos::Endian index_endian,
const draw_util::ViewportInfo& viewport_info, uint32_t used_texture_mask,
reg::RB_DEPTHCONTROL normalized_depth_control,
uint32_t normalized_color_mask) {
#if XE_UI_D3D12_FINE_GRAINED_DRAW_SCOPES
SCOPE_profile_cpu_f("gpu");
@ -3113,7 +3122,6 @@ void D3D12CommandProcessor::UpdateSystemConstantValues(
float rb_alpha_ref = regs[XE_GPU_REG_RB_ALPHA_REF].f32;
auto rb_colorcontrol = regs.Get<reg::RB_COLORCONTROL>();
auto rb_depth_info = regs.Get<reg::RB_DEPTH_INFO>();
auto rb_depthcontrol = draw_util::GetDepthControlForCurrentEdramMode(regs);
auto rb_stencilrefmask = regs.Get<reg::RB_STENCILREFMASK>();
auto rb_stencilrefmask_bf =
regs.Get<reg::RB_STENCILREFMASK>(XE_GPU_REG_RB_STENCILREFMASK_BF);
@ -3155,8 +3163,8 @@ void D3D12CommandProcessor::UpdateSystemConstantValues(
// Disable depth and stencil if it aliases a color render target (for
// instance, during the XBLA logo in 58410954, though depth writing is already
// disabled there).
bool depth_stencil_enabled =
rb_depthcontrol.stencil_enable || rb_depthcontrol.z_enable;
bool depth_stencil_enabled = normalized_depth_control.stencil_enable ||
normalized_depth_control.z_enable;
if (edram_rov_used && depth_stencil_enabled) {
for (uint32_t i = 0; i < 4; ++i) {
if (rb_depth_info.depth_base == color_infos[i].color_base &&
@ -3229,10 +3237,10 @@ void D3D12CommandProcessor::UpdateSystemConstantValues(
}
if (edram_rov_used && depth_stencil_enabled) {
flags |= DxbcShaderTranslator::kSysFlag_ROVDepthStencil;
if (rb_depthcontrol.z_enable) {
flags |= uint32_t(rb_depthcontrol.zfunc)
if (normalized_depth_control.z_enable) {
flags |= uint32_t(normalized_depth_control.zfunc)
<< DxbcShaderTranslator::kSysFlag_ROVDepthPassIfLess_Shift;
if (rb_depthcontrol.z_write_enable) {
if (normalized_depth_control.z_write_enable) {
flags |= DxbcShaderTranslator::kSysFlag_ROVDepthWrite;
}
} else {
@ -3242,7 +3250,7 @@ void D3D12CommandProcessor::UpdateSystemConstantValues(
DxbcShaderTranslator::kSysFlag_ROVDepthPassIfEqual |
DxbcShaderTranslator::kSysFlag_ROVDepthPassIfGreater;
}
if (rb_depthcontrol.stencil_enable) {
if (normalized_depth_control.stencil_enable) {
flags |= DxbcShaderTranslator::kSysFlag_ROVStencilTest;
}
// Hint - if not applicable to the shader, will not have effect.
@ -3526,7 +3534,7 @@ void D3D12CommandProcessor::UpdateSystemConstantValues(
poly_offset_back_offset;
system_constants_.edram_poly_offset_back_offset = poly_offset_back_offset;
if (depth_stencil_enabled && rb_depthcontrol.stencil_enable) {
if (depth_stencil_enabled && normalized_depth_control.stencil_enable) {
dirty |= system_constants_.edram_stencil_front_reference !=
rb_stencilrefmask.stencilref;
system_constants_.edram_stencil_front_reference =
@ -3540,12 +3548,12 @@ void D3D12CommandProcessor::UpdateSystemConstantValues(
system_constants_.edram_stencil_front_write_mask =
rb_stencilrefmask.stencilwritemask;
uint32_t stencil_func_ops =
(rb_depthcontrol.value >> 8) & ((1 << 12) - 1);
(normalized_depth_control.value >> 8) & ((1 << 12) - 1);
dirty |=
system_constants_.edram_stencil_front_func_ops != stencil_func_ops;
system_constants_.edram_stencil_front_func_ops = stencil_func_ops;
if (primitive_polygonal && rb_depthcontrol.backface_enable) {
if (primitive_polygonal && normalized_depth_control.backface_enable) {
dirty |= system_constants_.edram_stencil_back_reference !=
rb_stencilrefmask_bf.stencilref;
system_constants_.edram_stencil_back_reference =
@ -3559,7 +3567,7 @@ void D3D12CommandProcessor::UpdateSystemConstantValues(
system_constants_.edram_stencil_back_write_mask =
rb_stencilrefmask_bf.stencilwritemask;
uint32_t stencil_func_ops_bf =
(rb_depthcontrol.value >> 20) & ((1 << 12) - 1);
(normalized_depth_control.value >> 20) & ((1 << 12) - 1);
dirty |= system_constants_.edram_stencil_back_func_ops !=
stencil_func_ops_bf;
system_constants_.edram_stencil_back_func_ops = stencil_func_ops_bf;

View File

@ -30,6 +30,7 @@
#include "xenia/gpu/draw_util.h"
#include "xenia/gpu/dxbc_shader.h"
#include "xenia/gpu/dxbc_shader_translator.h"
#include "xenia/gpu/registers.h"
#include "xenia/gpu/xenos.h"
#include "xenia/kernel/kernel_state.h"
#include "xenia/ui/d3d12/d3d12_descriptor_heap_pool.h"
@ -349,13 +350,15 @@ class D3D12CommandProcessor : public CommandProcessor {
void UpdateFixedFunctionState(const draw_util::ViewportInfo& viewport_info,
const draw_util::Scissor& scissor,
bool primitive_polygonal);
bool primitive_polygonal,
reg::RB_DEPTHCONTROL normalized_depth_control);
void UpdateSystemConstantValues(bool shared_memory_is_uav,
bool primitive_polygonal,
uint32_t line_loop_closing_index,
xenos::Endian index_endian,
const draw_util::ViewportInfo& viewport_info,
uint32_t used_texture_mask,
reg::RB_DEPTHCONTROL normalized_depth_control,
uint32_t normalized_color_mask);
bool UpdateBindings(const D3D12Shader* vertex_shader,
const D3D12Shader* pixel_shader,

View File

@ -1249,10 +1249,12 @@ void D3D12RenderTargetCache::BeginSubmission() {
}
}
bool D3D12RenderTargetCache::Update(bool is_rasterization_done,
uint32_t shader_writes_color_targets) {
bool D3D12RenderTargetCache::Update(
bool is_rasterization_done, reg::RB_DEPTHCONTROL normalized_depth_control,
uint32_t shader_writes_color_targets, const Shader& vertex_shader) {
if (!RenderTargetCache::Update(is_rasterization_done,
shader_writes_color_targets)) {
normalized_depth_control,
shader_writes_color_targets, vertex_shader)) {
return false;
}
switch (GetPath()) {

View File

@ -43,10 +43,10 @@ class D3D12CommandProcessor;
class D3D12RenderTargetCache final : public RenderTargetCache {
public:
D3D12RenderTargetCache(const RegisterFile& register_file,
const Memory& memory, TraceWriter& trace_writer,
D3D12CommandProcessor& command_processor,
TraceWriter& trace_writer,
bool bindless_resources_used)
: RenderTargetCache(register_file),
: RenderTargetCache(register_file, memory, &trace_writer),
command_processor_(command_processor),
trace_writer_(trace_writer),
bindless_resources_used_(bindless_resources_used) {}
@ -64,7 +64,9 @@ class D3D12RenderTargetCache final : public RenderTargetCache {
uint32_t GetResolutionScaleY() const override { return resolution_scale_y_; }
bool Update(bool is_rasterization_done,
uint32_t shader_writes_color_targets) override;
reg::RB_DEPTHCONTROL normalized_depth_control,
uint32_t shader_writes_color_targets,
const Shader& vertex_shader) override;
void InvalidateCommandListRenderTargets() {
are_current_command_list_render_targets_valid_ = false;

View File

@ -22,9 +22,12 @@ namespace xe {
namespace gpu {
namespace d3d12 {
D3D12Shader::D3D12Shader(xenos::ShaderType shader_type, uint64_t data_hash,
const uint32_t* dword_ptr, uint32_t dword_count)
: DxbcShader(shader_type, data_hash, dword_ptr, dword_count) {}
D3D12Shader::D3D12Shader(xenos::ShaderType shader_type,
uint64_t ucode_data_hash, const uint32_t* ucode_dwords,
size_t ucode_dword_count,
std::endian ucode_source_endian)
: DxbcShader(shader_type, ucode_data_hash, ucode_dwords, ucode_dword_count,
ucode_source_endian) {}
void D3D12Shader::D3D12Translation::DisassembleDxbcAndDxil(
const ui::d3d12::D3D12Provider& provider, bool disassemble_dxbc,

View File

@ -33,8 +33,9 @@ class D3D12Shader : public DxbcShader {
IDxcCompiler* dxc_compiler = nullptr);
};
D3D12Shader(xenos::ShaderType shader_type, uint64_t data_hash,
const uint32_t* dword_ptr, uint32_t dword_count);
D3D12Shader(xenos::ShaderType shader_type, uint64_t ucode_data_hash,
const uint32_t* ucode_dwords, size_t ucode_dword_count,
std::endian ucode_source_endian = std::endian::big);
// For owning subsystem like the pipeline cache, accessors for unique
// identifiers (used instead of hashes to make sure collisions can't happen)

View File

@ -36,6 +36,7 @@
#include "xenia/gpu/d3d12/d3d12_render_target_cache.h"
#include "xenia/gpu/draw_util.h"
#include "xenia/gpu/gpu_flags.h"
#include "xenia/gpu/registers.h"
#include "xenia/gpu/xenos.h"
#include "xenia/ui/d3d12/d3d12_util.h"
@ -896,7 +897,8 @@ PipelineCache::GetCurrentVertexShaderModification(
}
DxbcShaderTranslator::Modification
PipelineCache::GetCurrentPixelShaderModification(const Shader& shader) const {
PipelineCache::GetCurrentPixelShaderModification(
const Shader& shader, reg::RB_DEPTHCONTROL normalized_depth_control) const {
assert_true(shader.type() == xenos::ShaderType::kPixel);
assert_true(shader.is_ucode_analyzed());
const auto& regs = register_file_;
@ -915,7 +917,7 @@ PipelineCache::GetCurrentPixelShaderModification(const Shader& shader) const {
RenderTargetCache::DepthFloat24Conversion::kOnOutputTruncating ||
depth_float24_conversion ==
RenderTargetCache::DepthFloat24Conversion::kOnOutputRounding) &&
draw_util::GetDepthControlForCurrentEdramMode(regs).z_enable &&
normalized_depth_control.z_enable &&
regs.Get<reg::RB_DEPTH_INFO>().depth_format ==
xenos::DepthRenderTargetFormat::kD24FS8) {
modification.pixel.depth_stencil_mode =
@ -941,6 +943,7 @@ bool PipelineCache::ConfigurePipeline(
D3D12Shader::D3D12Translation* vertex_shader,
D3D12Shader::D3D12Translation* pixel_shader,
const PrimitiveProcessor::ProcessingResult& primitive_processing_result,
reg::RB_DEPTHCONTROL normalized_depth_control,
uint32_t normalized_color_mask,
uint32_t bound_depth_and_color_render_target_bits,
const uint32_t* bound_depth_and_color_render_target_formats,
@ -1013,7 +1016,8 @@ bool PipelineCache::ConfigurePipeline(
PipelineRuntimeDescription runtime_description;
if (!GetCurrentStateDescription(
vertex_shader, pixel_shader, primitive_processing_result,
normalized_color_mask, bound_depth_and_color_render_target_bits,
normalized_depth_control, normalized_color_mask,
bound_depth_and_color_render_target_bits,
bound_depth_and_color_render_target_formats, runtime_description)) {
return false;
}
@ -1280,6 +1284,7 @@ bool PipelineCache::GetCurrentStateDescription(
D3D12Shader::D3D12Translation* vertex_shader,
D3D12Shader::D3D12Translation* pixel_shader,
const PrimitiveProcessor::ProcessingResult& primitive_processing_result,
reg::RB_DEPTHCONTROL normalized_depth_control,
uint32_t normalized_color_mask,
uint32_t bound_depth_and_color_render_target_bits,
const uint32_t* bound_depth_and_color_render_target_formats,
@ -1483,18 +1488,16 @@ bool PipelineCache::GetCurrentStateDescription(
// Depth/stencil. No stencil, always passing depth test and no depth writing
// means depth disabled.
if (bound_depth_and_color_render_target_bits & 1) {
auto rb_depthcontrol =
draw_util::GetDepthControlForCurrentEdramMode(regs);
if (rb_depthcontrol.z_enable) {
description_out.depth_func = rb_depthcontrol.zfunc;
description_out.depth_write = rb_depthcontrol.z_write_enable;
if (normalized_depth_control.z_enable) {
description_out.depth_func = normalized_depth_control.zfunc;
description_out.depth_write = normalized_depth_control.z_write_enable;
} else {
description_out.depth_func = xenos::CompareFunction::kAlways;
}
if (rb_depthcontrol.stencil_enable) {
if (normalized_depth_control.stencil_enable) {
description_out.stencil_enable = 1;
bool stencil_backface_enable =
primitive_polygonal && rb_depthcontrol.backface_enable;
primitive_polygonal && normalized_depth_control.backface_enable;
// Per-face masks not supported by Direct3D 12, choose the back face
// ones only if drawing only back faces.
Register stencil_ref_mask_reg;
@ -1507,18 +1510,23 @@ bool PipelineCache::GetCurrentStateDescription(
regs.Get<reg::RB_STENCILREFMASK>(stencil_ref_mask_reg);
description_out.stencil_read_mask = stencil_ref_mask.stencilmask;
description_out.stencil_write_mask = stencil_ref_mask.stencilwritemask;
description_out.stencil_front_fail_op = rb_depthcontrol.stencilfail;
description_out.stencil_front_fail_op =
normalized_depth_control.stencilfail;
description_out.stencil_front_depth_fail_op =
rb_depthcontrol.stencilzfail;
description_out.stencil_front_pass_op = rb_depthcontrol.stencilzpass;
description_out.stencil_front_func = rb_depthcontrol.stencilfunc;
normalized_depth_control.stencilzfail;
description_out.stencil_front_pass_op =
normalized_depth_control.stencilzpass;
description_out.stencil_front_func =
normalized_depth_control.stencilfunc;
if (stencil_backface_enable) {
description_out.stencil_back_fail_op = rb_depthcontrol.stencilfail_bf;
description_out.stencil_back_fail_op =
normalized_depth_control.stencilfail_bf;
description_out.stencil_back_depth_fail_op =
rb_depthcontrol.stencilzfail_bf;
normalized_depth_control.stencilzfail_bf;
description_out.stencil_back_pass_op =
rb_depthcontrol.stencilzpass_bf;
description_out.stencil_back_func = rb_depthcontrol.stencilfunc_bf;
normalized_depth_control.stencilzpass_bf;
description_out.stencil_back_func =
normalized_depth_control.stencilfunc_bf;
} else {
description_out.stencil_back_fail_op =
description_out.stencil_front_fail_op;

View File

@ -31,6 +31,7 @@
#include "xenia/gpu/gpu_flags.h"
#include "xenia/gpu/primitive_processor.h"
#include "xenia/gpu/register_file.h"
#include "xenia/gpu/registers.h"
#include "xenia/gpu/xenos.h"
#include "xenia/ui/d3d12/d3d12_api.h"
@ -74,7 +75,8 @@ class PipelineCache {
const Shader& shader,
Shader::HostVertexShaderType host_vertex_shader_type) const;
DxbcShaderTranslator::Modification GetCurrentPixelShaderModification(
const Shader& shader) const;
const Shader& shader,
reg::RB_DEPTHCONTROL normalized_depth_control) const;
// If draw_util::IsRasterizationPotentiallyDone is false, the pixel shader
// MUST be made nullptr BEFORE calling this!
@ -82,6 +84,7 @@ class PipelineCache {
D3D12Shader::D3D12Translation* vertex_shader,
D3D12Shader::D3D12Translation* pixel_shader,
const PrimitiveProcessor::ProcessingResult& primitive_processing_result,
reg::RB_DEPTHCONTROL normalized_depth_control,
uint32_t normalized_color_mask,
uint32_t bound_depth_and_color_render_target_bits,
const uint32_t* bound_depth_and_color_render_targets_formats,
@ -248,6 +251,7 @@ class PipelineCache {
D3D12Shader::D3D12Translation* vertex_shader,
D3D12Shader::D3D12Translation* pixel_shader,
const PrimitiveProcessor::ProcessingResult& primitive_processing_result,
reg::RB_DEPTHCONTROL normalized_depth_control,
uint32_t normalized_color_mask,
uint32_t bound_depth_and_color_render_target_bits,
const uint32_t* bound_depth_and_color_render_target_formats,

View File

@ -0,0 +1,350 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#include "xenia/gpu/draw_extent_estimator.h"
#include <algorithm>
#include <cfloat>
#include <cstdint>
#include "xenia/base/assert.h"
#include "xenia/base/cvar.h"
#include "xenia/base/profiling.h"
#include "xenia/gpu/registers.h"
#include "xenia/gpu/ucode.h"
#include "xenia/gpu/xenos.h"
#include "xenia/ui/graphics_util.h"
DEFINE_bool(
execute_unclipped_draw_vs_on_cpu, true,
"Execute the vertex shader for draws with clipping disabled, primarily "
"screen-space draws (such as clears), on the CPU when possible to estimate "
"the extent of the EDRAM involved in the draw.\n"
"Enabling this may significantly improve GPU performance as otherwise up "
"to the entire EDRAM may be considered used in draws without clipping, "
"potentially resulting in spurious EDRAM range ownership transfer round "
"trips between host render targets.\n"
"Also, on hosts where certain render target formats have to be emulated in "
"a lossy way (for instance, 16-bit fixed-point via 16-bit floating-point), "
"this prevents corruption of other render targets located after the "
"current ones in the EDRAM by lossy range ownership transfers done for "
"those draws.",
"GPU");
DEFINE_bool(
execute_unclipped_draw_vs_on_cpu_with_scissor, false,
"Don't restrict the usage of execute_unclipped_draw_vs_on_cpu to only "
"non-scissored draws (with the right and the bottom sides of the scissor "
"rectangle at 8192 or beyond) even though if the scissor rectangle is "
"present, it's usually sufficient for esimating the height of the render "
"target.\n"
"Enabling this may cause excessive processing of vertices on the CPU, as "
"some games draw rectangles (for their UI, for instance) without clipping, "
"but with a proper scissor rectangle.",
"GPU");
namespace xe {
namespace gpu {
void DrawExtentEstimator::PositionYExportSink::Export(
ucode::ExportRegister export_register, const float* value,
uint32_t value_mask) {
if (export_register == ucode::ExportRegister::kVSPosition) {
if (value_mask & 0b0010) {
position_y_ = value[1];
}
if (value_mask & 0b1000) {
position_w_ = value[3];
}
} else if (export_register ==
ucode::ExportRegister::kVSPointSizeEdgeFlagKillVertex) {
if (value_mask & 0b0001) {
point_size_ = value[0];
}
if (value_mask & 0b0100) {
vertex_kill_ = *reinterpret_cast<const uint32_t*>(&value[2]);
}
}
}
uint32_t DrawExtentEstimator::EstimateVertexMaxY(const Shader& vertex_shader) {
SCOPE_profile_cpu_f("gpu");
const RegisterFile& regs = register_file_;
auto vgt_draw_initiator = regs.Get<reg::VGT_DRAW_INITIATOR>();
if (!vgt_draw_initiator.num_indices) {
return 0;
}
if (vgt_draw_initiator.source_select != xenos::SourceSelect::kDMA &&
vgt_draw_initiator.source_select != xenos::SourceSelect::kAutoIndex) {
// TODO(Triang3l): Support immediate indices.
return xenos::kTexture2DCubeMaxWidthHeight;
}
// Not reproducing tessellation.
if (xenos::IsMajorModeExplicit(vgt_draw_initiator.major_mode,
vgt_draw_initiator.prim_type) &&
regs.Get<reg::VGT_OUTPUT_PATH_CNTL>().path_select ==
xenos::VGTOutputPath::kTessellationEnable) {
return xenos::kTexture2DCubeMaxWidthHeight;
}
assert_true(vertex_shader.type() == xenos::ShaderType::kVertex);
assert_true(vertex_shader.is_ucode_analyzed());
if (!ShaderInterpreter::CanInterpretShader(vertex_shader)) {
return xenos::kTexture2DCubeMaxWidthHeight;
}
auto vgt_dma_size = regs.Get<reg::VGT_DMA_SIZE>();
union {
const void* index_buffer;
const uint16_t* index_buffer_16;
const uint32_t* index_buffer_32;
};
xenos::Endian index_endian = vgt_dma_size.swap_mode;
if (vgt_draw_initiator.source_select == xenos::SourceSelect::kDMA) {
xenos::IndexFormat index_format = vgt_draw_initiator.index_size;
uint32_t index_buffer_base = regs[XE_GPU_REG_VGT_DMA_BASE].u32;
uint32_t index_buffer_read_count =
std::min(vgt_draw_initiator.num_indices, vgt_dma_size.num_words);
if (vgt_draw_initiator.index_size == xenos::IndexFormat::kInt16) {
// Handle the index endianness to same way as the PrimitiveProcessor.
if (index_endian == xenos::Endian::k8in32) {
index_endian = xenos::Endian::k8in16;
} else if (index_endian == xenos::Endian::k16in32) {
index_endian = xenos::Endian::kNone;
}
index_buffer_base &= ~uint32_t(sizeof(uint16_t) - 1);
if (trace_writer_) {
trace_writer_->WriteMemoryRead(
index_buffer_base, sizeof(uint16_t) * index_buffer_read_count);
}
} else {
assert_true(vgt_draw_initiator.index_size == xenos::IndexFormat::kInt32);
index_buffer_base &= ~uint32_t(sizeof(uint32_t) - 1);
if (trace_writer_) {
trace_writer_->WriteMemoryRead(
index_buffer_base, sizeof(uint32_t) * index_buffer_read_count);
}
}
index_buffer = memory_.TranslatePhysical(index_buffer_base);
}
auto pa_su_sc_mode_cntl = regs.Get<reg::PA_SU_SC_MODE_CNTL>();
uint32_t reset_index =
regs.Get<reg::VGT_MULTI_PRIM_IB_RESET_INDX>().reset_indx;
uint32_t index_offset = regs.Get<reg::VGT_INDX_OFFSET>().indx_offset;
uint32_t min_index = regs.Get<reg::VGT_MIN_VTX_INDX>().min_indx;
uint32_t max_index = regs.Get<reg::VGT_MAX_VTX_INDX>().max_indx;
auto pa_cl_vte_cntl = regs.Get<reg::PA_CL_VTE_CNTL>();
float viewport_y_scale = pa_cl_vte_cntl.vport_y_scale_ena
? regs[XE_GPU_REG_PA_CL_VPORT_YSCALE].f32
: 1.0f;
float viewport_y_offset = pa_cl_vte_cntl.vport_y_offset_ena
? regs[XE_GPU_REG_PA_CL_VPORT_YOFFSET].f32
: 0.0f;
int32_t point_vertex_min_diameter_float = 0;
int32_t point_vertex_max_diameter_float = 0;
float point_constant_radius_y = 0.0f;
if (vgt_draw_initiator.prim_type == xenos::PrimitiveType::kPointList) {
auto pa_su_point_minmax = regs.Get<reg::PA_SU_POINT_MINMAX>();
*reinterpret_cast<float*>(&point_vertex_min_diameter_float) =
float(pa_su_point_minmax.min_size) * (2.0f / 16.0f);
*reinterpret_cast<float*>(&point_vertex_max_diameter_float) =
float(pa_su_point_minmax.max_size) * (2.0f / 16.0f);
point_constant_radius_y =
float(regs.Get<reg::PA_SU_POINT_SIZE>().height) * (1.0f / 16.0f);
}
float max_y = -FLT_MAX;
shader_interpreter_.SetShader(vertex_shader);
PositionYExportSink position_y_export_sink;
shader_interpreter_.SetExportSink(&position_y_export_sink);
for (uint32_t i = 0; i < vgt_draw_initiator.num_indices; ++i) {
uint32_t vertex_index;
if (vgt_draw_initiator.source_select == xenos::SourceSelect::kDMA) {
if (i < vgt_dma_size.num_words) {
if (vgt_draw_initiator.index_size == xenos::IndexFormat::kInt16) {
vertex_index = index_buffer_16[i];
} else {
vertex_index = index_buffer_32[i];
}
// The Xenos only uses 24 bits of the index (reset_indx is 24-bit).
vertex_index = xenos::GpuSwap(vertex_index, index_endian) & 0xFFFFFF;
} else {
vertex_index = 0;
}
if (pa_su_sc_mode_cntl.multi_prim_ib_ena && vertex_index == reset_index) {
continue;
}
} else {
assert_true(vgt_draw_initiator.source_select ==
xenos::SourceSelect::kAutoIndex);
vertex_index = i;
}
vertex_index =
std::min(max_index,
std::max(min_index, (vertex_index + index_offset) & 0xFFFFFF));
position_y_export_sink.Reset();
shader_interpreter_.temp_registers()[0] = float(vertex_index);
shader_interpreter_.Execute();
if (position_y_export_sink.vertex_kill().has_value() &&
(position_y_export_sink.vertex_kill().value() & ~(UINT32_C(1) << 31))) {
continue;
}
if (!position_y_export_sink.position_y().has_value()) {
continue;
}
float vertex_y = position_y_export_sink.position_y().value();
if (!pa_cl_vte_cntl.vtx_xy_fmt) {
if (!position_y_export_sink.position_w().has_value()) {
continue;
}
vertex_y /= position_y_export_sink.position_w().value();
}
vertex_y = vertex_y * viewport_y_scale + viewport_y_offset;
if (vgt_draw_initiator.prim_type == xenos::PrimitiveType::kPointList) {
float point_radius_y;
if (position_y_export_sink.point_size().has_value()) {
// Vertex-specified diameter. Clamped effectively as a signed integer in
// the hardware, -NaN, -Infinity ... -0 to the minimum, +Infinity, +NaN
// to the maximum.
point_radius_y = position_y_export_sink.point_size().value();
*reinterpret_cast<int32_t*>(&point_radius_y) = std::min(
point_vertex_max_diameter_float,
std::max(point_vertex_min_diameter_float,
*reinterpret_cast<const int32_t*>(&point_radius_y)));
point_radius_y *= 0.5f;
} else {
// Constant radius.
point_radius_y = point_constant_radius_y;
}
vertex_y += point_radius_y;
}
// std::max is `a < b ? b : a`, thus in case of NaN, the first argument is
// always returned - max_y, which is initialized to a normalized value.
max_y = std::max(max_y, vertex_y);
}
shader_interpreter_.SetExportSink(nullptr);
int32_t max_y_24p8 = ui::FloatToD3D11Fixed16p8(max_y);
// 16p8 range is -32768 to 32767+255/256, but it's stored as uint32_t here,
// as 24p8, so overflowing up to -8388608 to 8388608+255/256 is safe. The
// range of the window offset plus the half-pixel offset is -16384 to 16384.5,
// so it's safe to add both - adding it will neither move the 16p8 clamping
// bounds -32768 and 32767+255/256 into the 0...8192 screen space range, nor
// cause 24p8 overflow.
if (!regs.Get<reg::PA_SU_VTX_CNTL>().pix_center) {
max_y_24p8 += 128;
}
if (pa_su_sc_mode_cntl.vtx_window_offset_enable) {
max_y_24p8 += regs.Get<reg::PA_SC_WINDOW_OFFSET>().window_y_offset * 256;
}
// Top-left rule - .5 exclusive without MSAA, 1. exclusive with MSAA.
auto rb_surface_info = regs.Get<reg::RB_SURFACE_INFO>();
return (uint32_t(std::max(int32_t(0), max_y_24p8)) +
((rb_surface_info.msaa_samples == xenos::MsaaSamples::k1X) ? 127
: 255)) >>
8;
}
uint32_t DrawExtentEstimator::EstimateMaxY(bool try_to_estimate_vertex_max_y,
const Shader& vertex_shader) {
SCOPE_profile_cpu_f("gpu");
const RegisterFile& regs = register_file_;
auto pa_sc_window_offset = regs.Get<reg::PA_SC_WINDOW_OFFSET>();
int32_t window_y_offset = pa_sc_window_offset.window_y_offset;
// Scissor.
auto pa_sc_window_scissor_br = regs.Get<reg::PA_SC_WINDOW_SCISSOR_BR>();
int32_t scissor_bottom = int32_t(pa_sc_window_scissor_br.br_y);
bool scissor_window_offset =
!regs.Get<reg::PA_SC_WINDOW_SCISSOR_TL>().window_offset_disable;
if (scissor_window_offset) {
scissor_bottom += window_y_offset;
}
auto pa_sc_screen_scissor_br = regs.Get<reg::PA_SC_SCREEN_SCISSOR_BR>();
scissor_bottom = std::min(scissor_bottom, pa_sc_screen_scissor_br.br_y);
uint32_t max_y = uint32_t(std::max(scissor_bottom, int32_t(0)));
if (regs.Get<reg::PA_CL_CLIP_CNTL>().clip_disable) {
// Actual extent from the vertices.
if (try_to_estimate_vertex_max_y &&
cvars::execute_unclipped_draw_vs_on_cpu) {
bool estimate_vertex_max_y;
if (cvars::execute_unclipped_draw_vs_on_cpu_with_scissor) {
estimate_vertex_max_y = true;
} else {
estimate_vertex_max_y = false;
if (scissor_bottom >= xenos::kTexture2DCubeMaxWidthHeight) {
// Handle just the usual special 8192x8192 case in Direct3D 9 - 8192
// may be a normal render target height (80x8192 is well within the
// EDRAM size, for instance), no need to process the vertices on the
// CPU in this case.
int32_t scissor_right = int32_t(pa_sc_window_scissor_br.br_x);
if (scissor_window_offset) {
scissor_right += pa_sc_window_offset.window_x_offset;
}
scissor_right = std::min(scissor_right, pa_sc_screen_scissor_br.br_x);
if (scissor_right >= xenos::kTexture2DCubeMaxWidthHeight) {
estimate_vertex_max_y = true;
}
}
}
if (estimate_vertex_max_y) {
max_y = std::min(max_y, EstimateVertexMaxY(vertex_shader));
}
}
} else {
// Viewport. Though the Xenos itself doesn't have an implicit viewport
// scissor (it's set by Direct3D 9 when a viewport is used), on hosts, it
// usually exists and can't be disabled.
auto pa_cl_vte_cntl = regs.Get<reg::PA_CL_VTE_CNTL>();
float viewport_bottom = 0.0f;
// First calculate all the integer.0 or integer.5 offsetting exactly at full
// precision.
if (regs.Get<reg::PA_SU_SC_MODE_CNTL>().vtx_window_offset_enable) {
viewport_bottom += float(window_y_offset);
}
if (!regs.Get<reg::PA_SU_VTX_CNTL>().pix_center) {
viewport_bottom += 0.5f;
}
// Then apply the floating-point viewport offset.
if (pa_cl_vte_cntl.vport_y_offset_ena) {
viewport_bottom += regs[XE_GPU_REG_PA_CL_VPORT_YOFFSET].f32;
}
viewport_bottom += pa_cl_vte_cntl.vport_y_scale_ena
? std::abs(regs[XE_GPU_REG_PA_CL_VPORT_YSCALE].f32)
: 1.0f;
// Using floor, or, rather, truncation (because maxing with zero anyway)
// similar to how viewport scissoring behaves on real AMD, Intel and Nvidia
// GPUs on Direct3D 12 (but not WARP), also like in
// draw_util::GetHostViewportInfo.
// max(0.0f, viewport_bottom) to drop NaN and < 0 - max picks the first
// argument in the !(a < b) case (always for NaN), min as float (max_y is
// well below 2^24) to safely drop very large values.
max_y = uint32_t(std::min(float(max_y), std::max(0.0f, viewport_bottom)));
}
return max_y;
}
} // namespace gpu
} // namespace xe

View File

@ -0,0 +1,76 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#ifndef XENIA_GPU_DRAW_EXTENT_ESTIMATOR_H_
#define XENIA_GPU_DRAW_EXTENT_ESTIMATOR_H_
#include <cstdint>
#include <optional>
#include "xenia/gpu/register_file.h"
#include "xenia/gpu/shader.h"
#include "xenia/gpu/shader_interpreter.h"
#include "xenia/gpu/trace_writer.h"
#include "xenia/memory.h"
namespace xe {
namespace gpu {
class DrawExtentEstimator {
public:
DrawExtentEstimator(const RegisterFile& register_file, const Memory& memory,
TraceWriter* trace_writer)
: register_file_(register_file),
memory_(memory),
trace_writer_(trace_writer),
shader_interpreter_(register_file, memory) {
shader_interpreter_.SetTraceWriter(trace_writer);
}
// The shader must have its ucode analyzed.
uint32_t EstimateVertexMaxY(const Shader& vertex_shader);
uint32_t EstimateMaxY(bool try_to_estimate_vertex_max_y,
const Shader& vertex_shader);
private:
class PositionYExportSink : public ShaderInterpreter::ExportSink {
public:
void Export(ucode::ExportRegister export_register, const float* value,
uint32_t value_mask) override;
void Reset() {
position_y_.reset();
position_w_.reset();
point_size_.reset();
vertex_kill_.reset();
}
const std::optional<float>& position_y() const { return position_y_; }
const std::optional<float>& position_w() const { return position_w_; }
const std::optional<float>& point_size() const { return point_size_; }
const std::optional<uint32_t>& vertex_kill() const { return vertex_kill_; }
private:
std::optional<float> position_y_;
std::optional<float> position_w_;
std::optional<float> point_size_;
std::optional<uint32_t> vertex_kill_;
};
const RegisterFile& register_file_;
const Memory& memory_;
TraceWriter* trace_writer_;
ShaderInterpreter shader_interpreter_;
};
} // namespace gpu
} // namespace xe
#endif // XENIA_GPU_DRAW_EXTENT_ESTIMATOR_H_

View File

@ -63,6 +63,27 @@ bool IsRasterizationPotentiallyDone(const RegisterFile& regs,
return true;
}
reg::RB_DEPTHCONTROL GetNormalizedDepthControl(const RegisterFile& regs) {
xenos::ModeControl edram_mode = regs.Get<reg::RB_MODECONTROL>().edram_mode;
if (edram_mode != xenos::ModeControl::kColorDepth &&
edram_mode != xenos::ModeControl::kDepth) {
// Both depth and stencil disabled (EDRAM depth and stencil ignored).
reg::RB_DEPTHCONTROL disabled;
disabled.value = 0;
return disabled;
}
reg::RB_DEPTHCONTROL depthcontrol = regs.Get<reg::RB_DEPTHCONTROL>();
// For more reliable skipping of depth render target management for draws not
// requiring depth.
if (depthcontrol.z_enable && !depthcontrol.z_write_enable &&
depthcontrol.zfunc == xenos::CompareFunction::kAlways) {
depthcontrol.z_enable = 0;
}
// Stencil is more complex and is expected to be usually enabled explicitly
// when needed.
return depthcontrol;
}
// https://docs.microsoft.com/en-us/windows/win32/api/d3d11/ne-d3d11-d3d11_standard_multisample_quality_levels
const int8_t kD3D10StandardSamplePositions2x[2][2] = {{4, 4}, {-4, -4}};
const int8_t kD3D10StandardSamplePositions4x[4][2] = {
@ -148,6 +169,7 @@ bool IsPixelShaderNeededWithRasterization(const Shader& shader,
void GetHostViewportInfo(const RegisterFile& regs, uint32_t resolution_scale_x,
uint32_t resolution_scale_y, bool origin_bottom_left,
uint32_t x_max, uint32_t y_max, bool allow_reverse_z,
reg::RB_DEPTHCONTROL normalized_depth_control,
bool convert_z_to_float24, bool full_float24_in_0_to_1,
bool pixel_shader_writes_depth,
ViewportInfo& viewport_info_out) {
@ -497,7 +519,7 @@ void GetHostViewportInfo(const RegisterFile& regs, uint32_t resolution_scale_x,
}
}
if (GetDepthControlForCurrentEdramMode(regs).z_enable &&
if (normalized_depth_control.z_enable &&
regs.Get<reg::RB_DEPTH_INFO>().depth_format ==
xenos::DepthRenderTargetFormat::kD24FS8) {
if (convert_z_to_float24) {

View File

@ -84,18 +84,7 @@ bool IsRasterizationPotentiallyDone(const RegisterFile& regs,
extern const int8_t kD3D10StandardSamplePositions2x[2][2];
extern const int8_t kD3D10StandardSamplePositions4x[4][2];
inline reg::RB_DEPTHCONTROL GetDepthControlForCurrentEdramMode(
const RegisterFile& regs) {
xenos::ModeControl edram_mode = regs.Get<reg::RB_MODECONTROL>().edram_mode;
if (edram_mode != xenos::ModeControl::kColorDepth &&
edram_mode != xenos::ModeControl::kDepth) {
// Both depth and stencil disabled (EDRAM depth and stencil ignored).
reg::RB_DEPTHCONTROL disabled;
disabled.value = 0;
return disabled;
}
return regs.Get<reg::RB_DEPTHCONTROL>();
}
reg::RB_DEPTHCONTROL GetNormalizedDepthControl(const RegisterFile& regs);
constexpr float GetD3D10PolygonOffsetFactor(
xenos::DepthRenderTargetFormat depth_format, bool float24_as_0_to_0_5) {
@ -183,6 +172,7 @@ struct ViewportInfo {
void GetHostViewportInfo(const RegisterFile& regs, uint32_t resolution_scale_x,
uint32_t resolution_scale_y, bool origin_bottom_left,
uint32_t x_max, uint32_t y_max, bool allow_reverse_z,
reg::RB_DEPTHCONTROL normalized_depth_control,
bool convert_z_to_float24, bool full_float24_in_0_to_1,
bool pixel_shader_writes_depth,
ViewportInfo& viewport_info_out);

View File

@ -14,9 +14,11 @@
namespace xe {
namespace gpu {
DxbcShader::DxbcShader(xenos::ShaderType shader_type, uint64_t data_hash,
const uint32_t* dword_ptr, uint32_t dword_count)
: Shader(shader_type, data_hash, dword_ptr, dword_count) {}
DxbcShader::DxbcShader(xenos::ShaderType shader_type, uint64_t ucode_data_hash,
const uint32_t* ucode_dwords, size_t ucode_dword_count,
std::endian ucode_source_endian)
: Shader(shader_type, ucode_data_hash, ucode_dwords, ucode_dword_count,
ucode_source_endian) {}
Shader::Translation* DxbcShader::CreateTranslationInstance(
uint64_t modification) {

View File

@ -28,8 +28,9 @@ class DxbcShader : public Shader {
: Translation(shader, modification) {}
};
DxbcShader(xenos::ShaderType shader_type, uint64_t data_hash,
const uint32_t* dword_ptr, uint32_t dword_count);
DxbcShader(xenos::ShaderType shader_type, uint64_t ucode_data_hash,
const uint32_t* ucode_dwords, size_t ucode_dword_count,
std::endian ucode_source_endian = std::endian::big);
// Resource bindings are gathered after the successful translation of any
// modification for simplicity of translation (and they don't depend on

View File

@ -273,6 +273,36 @@ void DxbcShaderTranslator::ConvertPWLGamma(
accumulator_src);
}
void DxbcShaderTranslator::RemapAndConvertVertexIndices(
uint32_t dest_temp, uint32_t dest_temp_components, const dxbc::Src& src) {
dxbc::Dest dest(dxbc::Dest::R(dest_temp, dest_temp_components));
dxbc::Src dest_src(dxbc::Src::R(dest_temp));
// Add the base vertex index.
a_.OpIAdd(dest, src,
LoadSystemConstant(SystemConstants::Index::kVertexIndexOffset,
offsetof(SystemConstants, vertex_index_offset),
dxbc::Src::kXXXX));
// Mask since the GPU only uses the lower 24 bits of the vertex index (tested
// on an Adreno 200 phone). `((index & 0xFFFFFF) + offset) & 0xFFFFFF` is the
// same as `(index + offset) & 0xFFFFFF`.
a_.OpAnd(dest, dest_src, dxbc::Src::LU(xenos::kVertexIndexMask));
// Clamp after offsetting.
a_.OpUMax(dest, dest_src,
LoadSystemConstant(SystemConstants::Index::kVertexIndexMinMax,
offsetof(SystemConstants, vertex_index_min),
dxbc::Src::kXXXX));
a_.OpUMin(dest, dest_src,
LoadSystemConstant(SystemConstants::Index::kVertexIndexMinMax,
offsetof(SystemConstants, vertex_index_max),
dxbc::Src::kXXXX));
// Convert to float.
a_.OpUToF(dest, dest_src);
}
void DxbcShaderTranslator::StartVertexShader_LoadVertexIndex() {
if (register_count() < 1) {
return;
@ -348,29 +378,9 @@ void DxbcShaderTranslator::StartVertexShader_LoadVertexIndex() {
}
}
// Add the base vertex index.
a_.OpIAdd(index_dest, index_src,
LoadSystemConstant(SystemConstants::Index::kVertexIndexOffset,
offsetof(SystemConstants, vertex_index_offset),
dxbc::Src::kXXXX));
// Mask since the GPU only uses the lower 24 bits of the vertex index (tested
// on an Adreno 200 phone). `((index & 0xFFFFFF) + offset) & 0xFFFFFF` is the
// same as `(index + offset) & 0xFFFFFF`.
a_.OpAnd(index_dest, index_src, dxbc::Src::LU(xenos::kVertexIndexMask));
// Clamp the vertex index after offsetting.
a_.OpUMax(index_dest, index_src,
LoadSystemConstant(SystemConstants::Index::kVertexIndexMinMax,
offsetof(SystemConstants, vertex_index_min),
dxbc::Src::kXXXX));
a_.OpUMin(index_dest, index_src,
LoadSystemConstant(SystemConstants::Index::kVertexIndexMinMax,
offsetof(SystemConstants, vertex_index_max),
dxbc::Src::kXXXX));
// Convert to float.
a_.OpUToF(index_dest, index_src);
// Remap the index to the needed range and convert it to floating-point.
RemapAndConvertVertexIndices(index_dest.index_1d_.index_,
index_dest.write_mask_, index_src);
if (uses_register_dynamic_addressing) {
// Store to indexed GPR 0 in x0[0].
@ -435,11 +445,11 @@ void DxbcShaderTranslator::StartVertexOrDomainShader() {
: dxbc::Dest::R(0, 0b0111),
dxbc::Src::VDomain(0b000110));
if (register_count() >= 2) {
// Copy the primitive index to r1.x as a float.
// Remap and write the primitive index to r1.x as floating-point.
uint32_t primitive_id_temp =
uses_register_dynamic_addressing ? PushSystemTemp() : 1;
in_primitive_id_used_ = true;
a_.OpUToF(dxbc::Dest::R(primitive_id_temp, 0b0001),
RemapAndConvertVertexIndices(primitive_id_temp, 0b0001,
dxbc::Src::VPrim());
if (uses_register_dynamic_addressing) {
a_.OpMov(dxbc::Dest::X(0, 1, 0b0001),
@ -518,11 +528,13 @@ void DxbcShaderTranslator::StartVertexOrDomainShader() {
a_.OpMov(uses_register_dynamic_addressing ? dxbc::Dest::X(0, 0, 0b0110)
: dxbc::Dest::R(0, 0b0110),
dxbc::Src::VDomain(0b010000));
// Copy the primitive index to r0.x as a float.
// Remap and write the primitive index to r0.x as floating-point.
// 4D5307F1 ground quad patches use the primitive index offset.
uint32_t primitive_id_temp =
uses_register_dynamic_addressing ? PushSystemTemp() : 0;
in_primitive_id_used_ = true;
a_.OpUToF(dxbc::Dest::R(primitive_id_temp, 0b0001), dxbc::Src::VPrim());
RemapAndConvertVertexIndices(primitive_id_temp, 0b0001,
dxbc::Src::VPrim());
if (uses_register_dynamic_addressing) {
a_.OpMov(dxbc::Dest::X(0, 0, 0b0001),
dxbc::Src::R(primitive_id_temp, dxbc::Src::kXXXX));
@ -694,6 +706,12 @@ void DxbcShaderTranslator::StartPixelShader() {
a_.OpEndIf();
// ZW - UV within a point sprite in the absolute value, at centroid if
// requested for the interpolator.
// TODO(Triang3l): Are centroid point coordinates possible in the hardware
// at all? ps_param_gen is not a triangle-IJ-interpolated value
// apparently, rather, it replaces the value in the shader input.
// TODO(Triang3l): Saturate to avoid negative point coordinates (the sign
// bit is used for the primitive type indicator) in case of extrapolation
// when the center is not covered with MSAA.
dxbc::Dest point_coord_r_zw_dest(dxbc::Dest::R(param_gen_temp, 0b1100));
dxbc::Src point_coord_v_xxxy_src(dxbc::Src::V(
uint32_t(InOutRegister::kPSInPointParameters), 0b01000000));
@ -711,6 +729,7 @@ void DxbcShaderTranslator::StartPixelShader() {
// At centroid.
a_.OpEvalCentroid(point_coord_r_zw_dest, point_coord_v_xxxy_src);
a_.OpEndIf();
// TODO(Triang3l): Point / line primitive type flags to the sign bits.
// Write ps_param_gen to the specified GPR.
dxbc::Src param_gen_src(dxbc::Src::R(param_gen_temp));
if (uses_register_dynamic_addressing) {
@ -968,12 +987,12 @@ void DxbcShaderTranslator::CompleteVertexOrDomainShader() {
dxbc::Src::R(system_temp_position_));
// Assuming SV_CullDistance was zeroed earlier in this function.
// Kill the primitive if needed - check if the shader wants to kill.
// TODO(Triang3l): Find if the condition is actually the flag being non-zero.
a_.OpNE(temp_x_dest,
// Kill the primitive if needed - check if the shader wants to kill (bits
// 0:30 of the vertex kill register are not zero).
a_.OpAnd(temp_x_dest,
dxbc::Src::R(system_temp_point_size_edge_flag_kill_vertex_,
dxbc::Src::kZZZZ),
dxbc::Src::LF(0.0f));
dxbc::Src::LU(UINT32_C(0x7FFFFFFF)));
a_.OpIf(true, temp_x_src);
{
// Extract the killing condition.
@ -1331,12 +1350,12 @@ dxbc::Src DxbcShaderTranslator::LoadOperand(const InstructionOperand& operand,
dxbc::Index index(operand.storage_index);
switch (operand.storage_addressing_mode) {
case InstructionStorageAddressingMode::kStatic:
case InstructionStorageAddressingMode::kAbsolute:
break;
case InstructionStorageAddressingMode::kAddressAbsolute:
case InstructionStorageAddressingMode::kAddressRegisterRelative:
index = dxbc::Index(system_temp_ps_pc_p0_a0_, 3, operand.storage_index);
break;
case InstructionStorageAddressingMode::kAddressRelative:
case InstructionStorageAddressingMode::kLoopRelative:
index = dxbc::Index(system_temp_aL_, 0, operand.storage_index);
break;
}
@ -1365,7 +1384,7 @@ dxbc::Src DxbcShaderTranslator::LoadOperand(const InstructionOperand& operand,
src = dxbc::Src::R(temp);
} else {
assert_true(operand.storage_addressing_mode ==
InstructionStorageAddressingMode::kStatic);
InstructionStorageAddressingMode::kAbsolute);
src = dxbc::Src::R(index.index_);
}
} break;
@ -1376,7 +1395,7 @@ dxbc::Src DxbcShaderTranslator::LoadOperand(const InstructionOperand& operand,
const Shader::ConstantRegisterMap& constant_register_map =
current_shader().constant_register_map();
if (operand.storage_addressing_mode ==
InstructionStorageAddressingMode::kStatic) {
InstructionStorageAddressingMode::kAbsolute) {
uint32_t float_constant_index =
constant_register_map.GetPackedFloatConstantIndex(
operand.storage_index);
@ -1429,13 +1448,13 @@ void DxbcShaderTranslator::StoreResult(const InstructionResult& result,
if (current_shader().uses_register_dynamic_addressing()) {
dxbc::Index register_index(result.storage_index);
switch (result.storage_addressing_mode) {
case InstructionStorageAddressingMode::kStatic:
case InstructionStorageAddressingMode::kAbsolute:
break;
case InstructionStorageAddressingMode::kAddressAbsolute:
case InstructionStorageAddressingMode::kAddressRegisterRelative:
register_index =
dxbc::Index(system_temp_ps_pc_p0_a0_, 3, result.storage_index);
break;
case InstructionStorageAddressingMode::kAddressRelative:
case InstructionStorageAddressingMode::kLoopRelative:
register_index =
dxbc::Index(system_temp_aL_, 0, result.storage_index);
break;
@ -1443,7 +1462,7 @@ void DxbcShaderTranslator::StoreResult(const InstructionResult& result,
dest = dxbc::Dest::X(0, register_index);
} else {
assert_true(result.storage_addressing_mode ==
InstructionStorageAddressingMode::kStatic);
InstructionStorageAddressingMode::kAbsolute);
dest = dxbc::Dest::R(result.storage_index);
}
break;
@ -1786,6 +1805,8 @@ void DxbcShaderTranslator::ProcessLoopStartInstruction(
}
// Break if the loop counter is 0 (since the condition is checked in the end).
// TODO(Triang3l): Move this before pushing and address loading. This won't
// pop if the counter is 0.
a_.OpIf(false, dxbc::Src::R(system_temp_loop_count_, dxbc::Src::kXXXX));
JumpToLabel(instr.loop_skip_address);
a_.OpEndIf();

View File

@ -756,6 +756,13 @@ class DxbcShaderTranslator : public ShaderTranslator {
uint32_t factor_component);
// Writing the prologue.
// Applies the offset to vertex or tessellation patch indices in the source
// components, restricts them to the minimum and the maximum index values, and
// converts them to floating-point. The destination may be the same as the
// source.
void RemapAndConvertVertexIndices(uint32_t dest_temp,
uint32_t dest_temp_components,
const dxbc::Src& src);
void StartVertexShader_LoadVertexIndex();
void StartVertexOrDomainShader();
void StartDomainShader();

View File

@ -28,7 +28,7 @@ void DxbcShaderTranslator::ProcessVectorAluOperation(
uint32_t used_result_components =
instr.vector_and_constant_result.GetUsedResultComponents();
if (!used_result_components &&
!AluVectorOpHasSideEffects(instr.vector_opcode)) {
!ucode::GetAluVectorOpcodeInfo(instr.vector_opcode).changed_state) {
return;
}

View File

@ -222,7 +222,8 @@ bool PrimitiveProcessor::Process(ProcessingResult& result_out) {
// Parse the primitive type and the tessellation state (VGT_OUTPUT_PATH_CNTL
// is only used in the explicit major mode) - there are cases in games when
// this register is left over after usage of tessellation in draws that don't
// need it.
// need it. Also perform needed vertex count adjustments based on the
// primitive type.
xenos::PrimitiveType guest_primitive_type = vgt_draw_initiator.prim_type;
xenos::PrimitiveType host_primitive_type = guest_primitive_type;
bool tessellation_enabled =
@ -233,6 +234,7 @@ bool PrimitiveProcessor::Process(ProcessingResult& result_out) {
xenos::TessellationMode tessellation_mode =
regs.Get<reg::VGT_HOS_CNTL>().tess_mode;
Shader::HostVertexShaderType host_vertex_shader_type;
uint32_t guest_draw_vertex_count = vgt_draw_initiator.num_indices;
if (tessellation_enabled) {
// Currently only supporting tessellation in known cases for safety, and not
// yet converting patch strips / fans to patch lists until games using them
@ -289,12 +291,29 @@ bool PrimitiveProcessor::Process(ProcessingResult& result_out) {
// - 4D5307ED - water - adaptive.
host_vertex_shader_type =
Shader::HostVertexShaderType::kTriangleDomainPatchIndexed;
// See the comment about the rounding for kQuadPatch.
guest_draw_vertex_count =
xe::round_up(guest_draw_vertex_count, uint32_t(3), false);
break;
case xenos::PrimitiveType::kQuadPatch:
// - 4D5307F1 - continuous.
// - 4D5307F1 - ground - continuous.
// - 4D5307F2 - garden ground - adaptive.
host_vertex_shader_type =
Shader::HostVertexShaderType::kQuadDomainPatchIndexed;
// While it's known that num_indices represents the control point count
// (4D5307E6, for example, for water triangle patches, performs N
// invocations of the memexporting shader calculating the edge
// tessellation factors for one patch, and then draws the water with
// num_indices = 3 * N), 4D5307F1 ground is drawn with num_indices = 1
// rather than 4. Unlike Direct3D 11 tessellation, where the patch count
// is `floor(vertex count / control points per patch)`, on the Xenos,
// the count appears to be `ceil` of that value (like a
// `for (i = 0; i < num_indices; i += 4)` loop is used to emit the
// patches). It's unlikely, however, that this adjustment should also be
// done for regular primitive types with tessellation enabled, as
// they're handled as usual primitive topologies, just post-tessellated.
guest_draw_vertex_count =
xe::align(guest_draw_vertex_count, uint32_t(4));
break;
default:
// TODO(Triang3l): Support line patches.
@ -346,7 +365,17 @@ bool PrimitiveProcessor::Process(ProcessingResult& result_out) {
}
// Process the indices.
uint32_t guest_draw_vertex_count = vgt_draw_initiator.num_indices;
auto vgt_dma_size = regs.Get<reg::VGT_DMA_SIZE>();
if (vgt_draw_initiator.source_select == xenos::SourceSelect::kDMA &&
guest_draw_vertex_count > vgt_dma_size.num_words) {
XELOGW(
"Primitive processor: {} vertices attempted to be drawn with an index "
"buffer only containing {}. Should be fetching zero indices instead of "
"overflowing ones, but this is a rare situation, so not handled yet. "
"Report the game to Xenia developers!",
guest_draw_vertex_count, vgt_dma_size.num_words);
guest_draw_vertex_count = vgt_dma_size.num_words;
}
uint32_t line_loop_closing_index = 0;
uint32_t guest_index_base;
CachedResult cacheable;
@ -420,9 +449,6 @@ bool PrimitiveProcessor::Process(ProcessingResult& result_out) {
uint32_t(vgt_draw_initiator.source_select));
return false;
}
auto vgt_dma_size = regs.Get<reg::VGT_DMA_SIZE>();
xenos::IndexFormat guest_index_format = vgt_draw_initiator.index_size;
cacheable.host_index_format = guest_index_format;
// Normalize the endian and the reset index.
@ -490,15 +516,6 @@ bool PrimitiveProcessor::Process(ProcessingResult& result_out) {
}
// Get the index buffer memory range.
if (guest_draw_vertex_count > vgt_dma_size.num_words) {
XELOGW(
"Primitive processor: {} vertices attempted to be drawn with an "
"index buffer only containing {}. Should be fetching zero indices "
"instead of overflowing ones, but this is a rare situation, so not "
"handled yet. Report the game to Xenia developers!",
guest_draw_vertex_count, vgt_dma_size.num_words);
guest_draw_vertex_count = vgt_dma_size.num_words;
}
uint32_t index_size_log2 =
guest_index_format == xenos::IndexFormat::kInt16 ? 1 : 2;
// The base should already be aligned, but aligning here too for safety.

View File

@ -130,22 +130,70 @@ union alignas(uint32_t) SQ_CONTEXT_MISC {
uint32_t sc_output_screen_xy : 1; // +1
xenos::SampleControl sc_sample_cntl : 2; // +2
uint32_t : 4; // +4
// Pixel shader interpolator (according to the XNA microcode compiler) index
// to write pixel parameters to. So far have been able to find the following
// usage:
// Pixel shader interpolator (according to the XNA microcode compiler -
// limited to the interpolator count, 16, not the total register count of
// 64) index to write pixel parameters to.
// See https://portal.unifiedpatents.com/ptab/case/IPR2015-00325 Exhibit
// 2039 R400 Sequencer Specification 2.11 (a significantly early version of
// the specification, however) section 19.2 "Sprites/ XY screen coordinates/
// FB information" for additional details.
// * |XY| - position on screen (vPos - the XNA microcode compiler translates
// ps_3_0 vPos directly to this, so at least in Direct3D 9 pixel center
// mode, this contains 0, 1, 2, not 0.5, 1.5, 2.5). flto also said in the
// Freedreno IRC that it's .0 even in OpenGL:
// https://dri.freedesktop.org/~cbrill/dri-log/?channel=freedreno&date=2020-04-19
// (on Android, according to LG P705 GL_OES_get_program_binary
// disassembly, gl_FragCoord.xy is |r0.xy| * c221.xy + c222.zw - haven't
// been able to dump the constant values by exploiting a huge uniform
// array, but flto says c222.zw contains tile offset plus 0.5).
// * Sign bit of X - is front face (vFace), non-negative for front face,
// negative for back face (used with `rcpc` in shaders to take signedness
// of 0 into account in `cndge`).
// * |ZW| - UV within a point sprite (sign meaning is unknown so far).
// According to the actual usage, in the final version of the hardware,
// the screen coordinates are passed to the shader directly as floats
// (contrary to what's written in the early 2.11 version of the sequencer
// specification from IPR2015-00325, where the coordinates are specified
// to be 2^23-biased, essentially packed as integers in the low mantissa
// bits of 2^23).
// * On Android, according to LG P705 - checked on the driver V@6.0 AU@
// (CL@3050818) - GL_OES_get_program_binary disassembly, gl_FragCoord.xy
// is |r0.xy| * c221.xy + c222.zw. Though we haven't yet been able to
// dump the actual constant values by exploiting a huge uniform array,
// but flto says c222.zw contains tile offset plus 0.5. It also appears
// that the multiplication by c221.xy is done to flip the direction of
// the Y axis in gl_FragCoord (c221.y is probably -1). According to the
// tests performed with triangles and point sprites, the hardware uses
// the top-left rasterization rule just like Direct3D (tie-breaking
// sample coverage towards gl_FragCoord.-x+y, while Direct3D tie-breaks
// towards VPOS.-x-y), and the R400 / Z430 doesn't seem to have the
// equivalent of R5xx's SC_EDGERULE register for configuring this).
// Also, both OpenGL and apparently Direct3D 9 define the point sprite V
// coordinate to be 0 in the top, and 1 in the bottom (but OpenGL
// gl_FragCoord.y is towards the top, while Direct3D 9's VPOS.y is
// towards the bottom), gl_PointCoord.y is |PsParamGen.w| directly, and
// the R400 / Z430 doesn't appear to have an equivalent of R6xx's
// SPI_INTERP_CONTROL_0::PNT_SPRITE_TOP_1 for toggling the direction.
// So, it looks like the internal screen coordinates in the official
// OpenGL ES 2.0 driver are still top-to-bottom like in Direct3D, but
// gl_FragCoord.y is flipped in the shader code so it's bottom-to-top
// as OpenGL specifies.
// https://docs.microsoft.com/en-us/windows/win32/direct3d9/point-sprites
// * |ZW| - UV within a point sprite, [0, 1]. In OpenGL ES 2.0, this is
// interpreted directly as gl_PointCoord, with the directions matching the
// OpenGL ES 2.0 specification - 0 in the top (towards +gl_FragCoord.y in
// OpenGL ES bottom-to-top screen coordinates - but towards -PsParamGen.y
// likely, see the explanation of gl_FragCoord.xy above), 1 in the bottom
// (towards -gl_FragCoord.y, or +PsParamGen.y likely). The point sprite
// coordinates are exposed differently on the Xbox 360 and the PC
// Direct3D 9 - the Xbox 360 passes the whole PsParamGen register via the
// SPRITETEXCOORD input semantic directly (unlike on the PC, where point
// sprite coordinates are written to XY of TEXCOORD0), and shaders should
// take abs(SPRITETEXCOORD.zw) explicitly.
// https://shawnhargreaves.com/blog/point-sprites-on-xbox.html
// 4D5307F1 has snowflake point sprites with an asymmetric texture.
// * Sign bit of X - is front face (according to the disassembly of vFace
// and gl_FrontFacing usage), non-negative for front face, negative for
// back face (used with `rcpc` in shaders to take signedness of 0 into
// account in `cndge`).
// * Sign bit of Y - is the primitive type a point (according to the
// IPR2015-00325 sequencer specification), negative for a point,
// non-negative for other primitive types.
// * Sign bit of Z - is the primitive type a line (according to the
// IPR2015-00325 sequencer specification), negative for a line,
// non-negative for other primitive types.
uint32_t param_gen_pos : 8; // +8
uint32_t perfcounter_ref : 1; // +16
uint32_t yeild_optimize : 1; // +17 sic
@ -167,6 +215,31 @@ union alignas(uint32_t) SQ_INTERPOLATOR_CNTL {
};
static_assert_size(SQ_INTERPOLATOR_CNTL, sizeof(uint32_t));
union alignas(uint32_t) SQ_VS_CONST {
uint32_t value;
struct {
uint32_t base : 9; // +0
uint32_t : 3; // +9
// Vec4 count minus one.
uint32_t size : 9; // 12
};
static constexpr Register register_index = XE_GPU_REG_SQ_VS_CONST;
};
static_assert_size(SQ_VS_CONST, sizeof(uint32_t));
// Same as SQ_VS_CONST.
union alignas(uint32_t) SQ_PS_CONST {
uint32_t value;
struct {
uint32_t base : 9; // +0
uint32_t : 3; // +9
// Vec4 count minus one.
uint32_t size : 9; // 12
};
static constexpr Register register_index = XE_GPU_REG_SQ_PS_CONST;
};
static_assert_size(SQ_PS_CONST, sizeof(uint32_t));
/*******************************************************************************
__ _____ ___ _____ _____ __
\ \ / / __| _ \_ _| __\ \/ /
@ -309,7 +382,7 @@ static_assert_size(VGT_HOS_CNTL, sizeof(uint32_t));
union alignas(uint32_t) PA_SU_POINT_MINMAX {
uint32_t value;
struct {
// Radius, 12.4 fixed point.
// For per-vertex size specification, radius (1/2 size), 12.4 fixed point.
uint32_t min_size : 16; // +0
uint32_t max_size : 16; // +16
};
@ -548,6 +621,10 @@ union alignas(uint32_t) RB_COLORCONTROL {
uint32_t alpha_to_mask_enable : 1; // +4
// Everything in between was added on Adreno.
uint32_t : 19; // +5
// TODO(Triang3l): Redo these tests and possibly flip these vertically in
// the comment and in the actual implementation. It appears that
// gl_FragCoord.y is mirrored as opposed to the actual screen coordinates in
// the rasterizer (see the SQ_CONTEXT_MISC::param_gen_pos comment here).
// According to tests on an Adreno 200 device (LG Optimus L7), done by
// drawing 0.5x0.5 rectangles in different corners of four pixels in a quad
// to a multisampled GLSurfaceView, the coverage mask is the following for 4

View File

@ -2,7 +2,7 @@
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2021 Ben Vanik. All rights reserved. *
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
@ -22,7 +22,6 @@
#include "xenia/base/logging.h"
#include "xenia/base/math.h"
#include "xenia/gpu/draw_util.h"
#include "xenia/gpu/gpu_flags.h"
#include "xenia/gpu/register_file.h"
#include "xenia/gpu/registers.h"
#include "xenia/gpu/xenos.h"
@ -143,6 +142,19 @@ DEFINE_bool(
"-1...1, remap -32...32 to -1...1 to use the full possible range of "
"values, at the expense of multiplicative blending correctness.",
"GPU");
// Enabled by default as the GPU is overall usually the bottleneck when the
// pixel shader interlock render backend implementation is used, anything that
// may improve GPU performance is favorable.
DEFINE_bool(
execute_unclipped_draw_vs_on_cpu_for_psi_render_backend, true,
"If execute_unclipped_draw_vs_on_cpu is enabled, execute the vertex shader "
"for unclipped draws on the CPU even when using the pixel shader interlock "
"(rasterizer-ordered view) implementation of the render backend on the "
"host, for which no expensive copying between host render targets is "
"needed when the ownership of a EDRAM range is changed.\n"
"If this is enabled, excessive barriers may be eliminated when switching "
"between different render targets in separate EDRAM locations.",
"GPU");
namespace xe {
namespace gpu {
@ -366,7 +378,9 @@ void RenderTargetCache::ClearCache() {
void RenderTargetCache::BeginFrame() { ResetAccumulatedRenderTargets(); }
bool RenderTargetCache::Update(bool is_rasterization_done,
uint32_t normalized_color_mask) {
reg::RB_DEPTHCONTROL normalized_depth_control,
uint32_t normalized_color_mask,
const Shader& vertex_shader) {
const RegisterFile& regs = register_file();
bool interlock_barrier_only = GetPath() == Path::kPixelShaderInterlock;
@ -429,8 +443,8 @@ bool RenderTargetCache::Update(bool is_rasterization_done,
uint32_t rts_are_64bpp = 0;
uint32_t color_rts_are_gamma = 0;
if (is_rasterization_done) {
auto rb_depthcontrol = draw_util::GetDepthControlForCurrentEdramMode(regs);
if (rb_depthcontrol.z_enable || rb_depthcontrol.stencil_enable) {
if (normalized_depth_control.z_enable ||
normalized_depth_control.stencil_enable) {
depth_and_color_rts_used_bits |= 1;
auto rb_depth_info = regs.Get<reg::RB_DEPTH_INFO>();
// std::min for safety, to avoid negative numbers in case it's completely
@ -555,47 +569,13 @@ bool RenderTargetCache::Update(bool is_rasterization_done,
// Estimate height used by render targets (for color for writes, for depth /
// stencil for both reads and writes) from various sources.
uint32_t height_used =
GetRenderTargetHeight(pitch_tiles_at_32bpp, msaa_samples);
int32_t window_y_offset =
regs.Get<reg::PA_SC_WINDOW_OFFSET>().window_y_offset;
if (!regs.Get<reg::PA_CL_CLIP_CNTL>().clip_disable) {
auto pa_cl_vte_cntl = regs.Get<reg::PA_CL_VTE_CNTL>();
float viewport_bottom = 0.0f;
// First calculate all the integer.0 or integer.5 offsetting exactly at full
// precision.
if (regs.Get<reg::PA_SU_SC_MODE_CNTL>().vtx_window_offset_enable) {
viewport_bottom += float(window_y_offset);
}
if (cvars::half_pixel_offset &&
!regs.Get<reg::PA_SU_VTX_CNTL>().pix_center) {
viewport_bottom += 0.5f;
}
// Then apply the floating-point viewport offset.
if (pa_cl_vte_cntl.vport_y_offset_ena) {
viewport_bottom += regs[XE_GPU_REG_PA_CL_VPORT_YOFFSET].f32;
}
viewport_bottom += pa_cl_vte_cntl.vport_y_scale_ena
? std::abs(regs[XE_GPU_REG_PA_CL_VPORT_YSCALE].f32)
: 1.0f;
// Using floor, or, rather, truncation (because maxing with zero anyway)
// similar to how viewport scissoring behaves on real AMD, Intel and Nvidia
// GPUs on Direct3D 12, also like in draw_util::GetHostViewportInfo.
// max(0.0f, viewport_bottom) to drop NaN and < 0 - max picks the first
// argument in the !(a < b) case (always for NaN), min as float (height_used
// is well below 2^24) to safely drop very large values.
height_used =
uint32_t(std::min(float(height_used), std::max(0.0f, viewport_bottom)));
}
int32_t scissor_bottom =
int32_t(regs.Get<reg::PA_SC_WINDOW_SCISSOR_BR>().br_y);
if (!regs.Get<reg::PA_SC_WINDOW_SCISSOR_TL>().window_offset_disable) {
scissor_bottom += window_y_offset;
}
scissor_bottom =
std::min(scissor_bottom, regs.Get<reg::PA_SC_SCREEN_SCISSOR_BR>().br_y);
height_used =
std::min(height_used, uint32_t(std::max(scissor_bottom, int32_t(0))));
uint32_t height_used = std::min(
GetRenderTargetHeight(pitch_tiles_at_32bpp, msaa_samples),
draw_extent_estimator_.EstimateMaxY(
interlock_barrier_only
? cvars::execute_unclipped_draw_vs_on_cpu_for_psi_render_backend
: true,
vertex_shader));
// Sorted by EDRAM base and then by index in the pipeline - for simplicity,
// treat render targets placed closer to the end of the EDRAM as truncating

View File

@ -2,7 +2,7 @@
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2021 Ben Vanik. All rights reserved. *
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
@ -21,8 +21,11 @@
#include "third_party/fmt/include/fmt/format.h"
#include "xenia/base/assert.h"
#include "xenia/base/cvar.h"
#include "xenia/gpu/draw_extent_estimator.h"
#include "xenia/gpu/draw_util.h"
#include "xenia/gpu/register_file.h"
#include "xenia/gpu/registers.h"
#include "xenia/gpu/shader.h"
#include "xenia/gpu/xenos.h"
DECLARE_bool(depth_transfer_not_equal_test);
@ -215,7 +218,9 @@ class RenderTargetCache {
virtual void BeginFrame();
virtual bool Update(bool is_rasterization_done,
uint32_t normalized_color_mask);
reg::RB_DEPTHCONTROL normalized_depth_control,
uint32_t normalized_color_mask,
const Shader& vertex_shader);
// Returns bits where 0 is whether a depth render target is currently bound on
// the host and 1... are whether the same applies to color render targets, and
@ -226,8 +231,10 @@ class RenderTargetCache {
uint32_t* depth_and_color_formats_out = nullptr) const;
protected:
RenderTargetCache(const RegisterFile& register_file)
: register_file_(register_file) {}
RenderTargetCache(const RegisterFile& register_file, const Memory& memory,
TraceWriter* trace_writer)
: register_file_(register_file),
draw_extent_estimator_(register_file, memory, trace_writer) {}
const RegisterFile& register_file() const { return register_file_; }
@ -606,6 +613,8 @@ class RenderTargetCache {
private:
const RegisterFile& register_file_;
DrawExtentEstimator draw_extent_estimator_;
// For host render targets.
struct OwnershipRange {

View File

@ -25,11 +25,17 @@ namespace gpu {
using namespace ucode;
Shader::Shader(xenos::ShaderType shader_type, uint64_t ucode_data_hash,
const uint32_t* ucode_dwords, size_t ucode_dword_count)
const uint32_t* ucode_dwords, size_t ucode_dword_count,
std::endian ucode_source_endian)
: shader_type_(shader_type), ucode_data_hash_(ucode_data_hash) {
// We keep ucode data in host native format so it's easier to work with.
ucode_data_.resize(ucode_dword_count);
if (std::endian::native != ucode_source_endian) {
xe::copy_and_swap(ucode_data_.data(), ucode_dwords, ucode_dword_count);
} else {
std::memcpy(ucode_data_.data(), ucode_dwords,
sizeof(uint32_t) * ucode_dword_count);
}
}
Shader::~Shader() {

View File

@ -19,6 +19,7 @@
#include <utility>
#include <vector>
#include "xenia/base/byte_order.h"
#include "xenia/base/math.h"
#include "xenia/base/string_buffer.h"
#include "xenia/gpu/ucode.h"
@ -44,7 +45,7 @@ namespace gpu {
enum class InstructionStorageTarget {
// Result is not stored.
kNone,
// Result is stored to a temporary register indexed by storage_index [0-31].
// Result is stored to a temporary register indexed by storage_index [0-63].
kRegister,
// Result is stored into a vertex shader interpolator export [0-15].
kInterpolator,
@ -85,11 +86,13 @@ constexpr uint32_t GetInstructionStorageTargetUsedComponentCount(
enum class InstructionStorageAddressingMode {
// The storage index is not dynamically addressed.
kStatic,
kAbsolute,
// The storage index is addressed by a0.
kAddressAbsolute,
// Float constants only.
kAddressRegisterRelative,
// The storage index is addressed by aL.
kAddressRelative,
// Float constants and temporary registers only.
kLoopRelative,
};
// Describes the source value of a particular component.
@ -111,6 +114,12 @@ enum class SwizzleSource {
constexpr SwizzleSource GetSwizzleFromComponentIndex(uint32_t i) {
return static_cast<SwizzleSource>(i);
}
constexpr SwizzleSource GetSwizzledAluSourceComponent(
uint32_t swizzle, uint32_t component_index) {
return GetSwizzleFromComponentIndex(
ucode::AluInstruction::GetSwizzledComponentIndex(swizzle,
component_index));
}
inline char GetCharForComponentIndex(uint32_t i) {
const static char kChars[] = {'x', 'y', 'z', 'w'};
return kChars[i];
@ -127,7 +136,7 @@ struct InstructionResult {
uint32_t storage_index = 0;
// How the storage index is dynamically addressed, if it is.
InstructionStorageAddressingMode storage_addressing_mode =
InstructionStorageAddressingMode::kStatic;
InstructionStorageAddressingMode::kAbsolute;
// True to clamp the result value to [0-1].
bool is_clamped = false;
// Defines whether each output component is written, though this is from the
@ -191,9 +200,9 @@ struct InstructionResult {
};
enum class InstructionStorageSource {
// Source is stored in a temporary register indexed by storage_index [0-31].
// Source is stored in a temporary register indexed by storage_index [0-63].
kRegister,
// Source is stored in a float constant indexed by storage_index [0-511].
// Source is stored in a float constant indexed by storage_index [0-255].
kConstantFloat,
// Source is stored in a vertex fetch constant indexed by storage_index
// [0-95].
@ -210,7 +219,7 @@ struct InstructionOperand {
uint32_t storage_index = 0;
// How the storage index is dynamically addressed, if it is.
InstructionStorageAddressingMode storage_addressing_mode =
InstructionStorageAddressingMode::kStatic;
InstructionStorageAddressingMode::kAbsolute;
// True to negate the operand value.
bool is_negated = false;
// True to take the absolute value of the source (before any negation).
@ -293,8 +302,9 @@ struct ParsedExecInstruction {
// Whether this exec ends the shader.
bool is_end = false;
// Whether to reset the current predicate.
bool clean = true;
// Whether the hardware doesn't have to wait for the predicate to be updated
// after this exec.
bool is_predicate_clean = true;
// ?
bool is_yield = false;
@ -552,12 +562,12 @@ struct ParsedAluInstruction {
// instruction even if only constants are being exported. The XNA disassembler
// falls back to displaying the whole vector operation, even if only constant
// components are written, if the scalar operation is a nop or if the vector
// operation has side effects (but if the scalar operation isn't nop, it
// outputs the entire constant mask in the scalar operation destination).
// Normally the XNA disassembler outputs the constant mask in both vector and
// scalar operations, but that's not required by assembler, so it doesn't
// really matter whether it's specified in the vector operation, in the scalar
// operation, or in both.
// operation changes a0, p0 or kills pixels (but if the scalar operation isn't
// nop, it outputs the entire constant mask in the scalar operation
// destination). Normally the XNA disassembler outputs the constant mask in
// both vector and scalar operations, but that's not required by assembler, so
// it doesn't really matter whether it's specified in the vector operation, in
// the scalar operation, or in both.
InstructionResult vector_and_constant_result;
// Describes how the scalar operation result is stored.
InstructionResult scalar_result;
@ -582,8 +592,8 @@ struct ParsedAluInstruction {
// will result in the same microcode (since instructions with just an empty
// write mask may have different values in other fields).
// This is for disassembly! Translators should use the write masks and
// AluVectorOpHasSideEffects to skip operations, as this only covers one very
// specific nop format!
// the changed state bits in the opcode info to skip operations, as this only
// covers one very specific nop format!
bool IsVectorOpDefaultNop() const;
// Whether the scalar part of the instruction is the same as if it was omitted
// in the assembly (if compiled or assembled with the Xbox 360 shader
@ -805,8 +815,11 @@ class Shader {
std::string host_disassembly_;
};
// ucode_source_endian specifies the endianness of the ucode_dwords argument -
// inside the Shader, the ucode will be stored with the native byte order.
Shader(xenos::ShaderType shader_type, uint64_t ucode_data_hash,
const uint32_t* ucode_dwords, size_t ucode_dword_count);
const uint32_t* ucode_dwords, size_t ucode_dword_count,
std::endian ucode_source_endian = std::endian::big);
virtual ~Shader();
// Whether the shader is identified as a vertex or pixel shader.
@ -904,6 +917,12 @@ class Shader {
// True if the current shader has any `kill` instructions.
bool kills_pixels() const { return kills_pixels_; }
// True if the shader has any texture-related instructions (any fetch
// instructions other than vertex fetch) writing any non-constant components.
bool uses_texture_fetch_instruction_results() const {
return uses_texture_fetch_instruction_results_;
}
// True if the shader overrides the pixel depth.
bool writes_depth() const { return writes_depth_; }
@ -992,6 +1011,7 @@ class Shader {
uint32_t register_static_address_bound_ = 0;
bool uses_register_dynamic_addressing_ = false;
bool kills_pixels_ = false;
bool uses_texture_fetch_instruction_results_ = false;
bool writes_depth_ = false;
uint32_t writes_color_targets_ = 0b0000;

View File

@ -36,6 +36,11 @@ DEFINE_path(shader_input, "", "Input shader binary file path.", "GPU");
DEFINE_string(shader_input_type, "",
"'vs', 'ps', or unspecified to infer from the given filename.",
"GPU");
DEFINE_bool(
shader_input_little_endian, false,
"Whether the input shader binary is little-endian (from an Arm device with "
"the Qualcomm Adreno 200, for instance).",
"GPU");
DEFINE_path(shader_output, "", "Output shader file path.", "GPU");
DEFINE_string(shader_output_type, "ucode",
"Translator to use: [ucode, spirv, spirvtext, dxbc, dxbctext].",
@ -107,7 +112,9 @@ int shader_compiler_main(const std::vector<std::string>& args) {
// TODO(benvanik): hash? need to return the data to big-endian format first.
uint64_t ucode_data_hash = 0;
auto shader = std::make_unique<Shader>(
shader_type, ucode_data_hash, ucode_dwords.data(), ucode_dwords.size());
shader_type, ucode_data_hash, ucode_dwords.data(), ucode_dwords.size(),
cvars::shader_input_little_endian ? std::endian::little
: std::endian::big);
StringBuffer ucode_disasm_buffer;
shader->AnalyzeUcode(ucode_disasm_buffer);

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,149 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#ifndef XENIA_GPU_SHADER_INTERPRETER_H_
#define XENIA_GPU_SHADER_INTERPRETER_H_
#include <algorithm>
#include <cstddef>
#include <cstdint>
#include "xenia/base/assert.h"
#include "xenia/gpu/register_file.h"
#include "xenia/gpu/shader.h"
#include "xenia/gpu/trace_writer.h"
#include "xenia/gpu/ucode.h"
#include "xenia/gpu/xenos.h"
#include "xenia/memory.h"
namespace xe {
namespace gpu {
class ShaderInterpreter {
public:
ShaderInterpreter(const RegisterFile& register_file, const Memory& memory)
: register_file_(register_file), memory_(memory) {}
class ExportSink {
public:
virtual ~ExportSink() = default;
virtual void AllocExport(ucode::AllocType type, uint32_t size) {}
virtual void Export(ucode::ExportRegister export_register,
const float* value, uint32_t value_mask) {}
};
void SetTraceWriter(TraceWriter* new_trace_writer) {
trace_writer_ = new_trace_writer;
}
ExportSink* GetExportSink() const { return export_sink_; }
void SetExportSink(ExportSink* new_export_sink) {
export_sink_ = new_export_sink;
}
const float* temp_registers() const { return &temp_registers_[0][0]; }
float* temp_registers() { return &temp_registers_[0][0]; }
static bool CanInterpretShader(const Shader& shader) {
assert_true(shader.is_ucode_analyzed());
// Texture instructions are not very common in vertex shaders (and not used
// in Direct3D 9's internal rectangles such as clears) and are extremely
// complex, not implemented.
if (shader.uses_texture_fetch_instruction_results()) {
return false;
}
return true;
}
void SetShader(xenos::ShaderType shader_type, const uint32_t* ucode) {
shader_type_ = shader_type;
ucode_ = ucode;
}
void SetShader(const Shader& shader) {
assert_true(CanInterpretShader(shader));
SetShader(shader.type(), shader.ucode_dwords());
}
void Execute();
private:
struct State {
ucode::VertexFetchInstruction vfetch_full_last;
uint32_t vfetch_address_dwords;
float previous_scalar;
uint32_t call_stack_depth;
uint32_t call_return_addresses[4];
uint32_t loop_stack_depth;
xenos::LoopConstant loop_constants[4];
uint32_t loop_iterators[4];
int32_t address_register;
bool predicate;
void Reset() { std::memset(this, 0, sizeof(*this)); }
int32_t GetLoopAddress() const {
assert_true(loop_stack_depth && loop_stack_depth < 4);
if (!loop_stack_depth || loop_stack_depth >= 4) {
return 0;
}
xenos::LoopConstant loop_constant = loop_constants[loop_stack_depth];
// Clamp to the real range specified in the IPR2015-00325 sequencer
// specification.
// https://portal.unifiedpatents.com/ptab/case/IPR2015-00325
return std::min(
INT32_C(256),
std::max(INT32_C(-256),
int32_t(int32_t(loop_iterators[loop_stack_depth]) *
loop_constant.step +
loop_constant.start)));
}
};
static float FlushDenormal(float value) {
uint32_t bits = *reinterpret_cast<const uint32_t*>(&value);
bits &= (bits & UINT32_C(0x7F800000)) ? ~UINT32_C(0) : (UINT32_C(1) << 31);
return *reinterpret_cast<const float*>(&bits);
}
const float* GetTempRegister(uint32_t address, bool is_relative) const {
return temp_registers_[(
int32_t(address) + (is_relative ? state_.GetLoopAddress() : 0) & 63)];
}
// For simplicity (due to writability), not bounds-checking.
float* GetTempRegister(uint32_t address, bool is_relative) {
return temp_registers_[(
int32_t(address) + (is_relative ? state_.GetLoopAddress() : 0) & 63)];
}
const float* GetFloatConstant(uint32_t address, bool is_relative,
bool relative_address_is_a0) const;
void ExecuteAluInstruction(ucode::AluInstruction instr);
void StoreFetchResult(uint32_t dest, bool is_dest_relative, uint32_t swizzle,
const float* value);
void ExecuteVertexFetchInstruction(ucode::VertexFetchInstruction instr);
const RegisterFile& register_file_;
const Memory& memory_;
TraceWriter* trace_writer_ = nullptr;
ExportSink* export_sink_ = nullptr;
xenos::ShaderType shader_type_ = xenos::ShaderType::kVertex;
const uint32_t* ucode_ = nullptr;
// For both inputs and locals.
float temp_registers_[64][4];
State state_;
};
} // namespace gpu
} // namespace xe
#endif // XENIA_GPU_SHADER_INTERPRETER_H_

View File

@ -247,22 +247,18 @@ void Shader::GatherExecInformation(
if (sequence & 0b10) {
ucode_disasm_buffer.Append(" serialize\n ");
}
const uint32_t* op_ptr = ucode_data_.data() + instr_offset * 3;
if (sequence & 0b01) {
auto fetch_opcode = FetchOpcode(ucode_data_[instr_offset * 3] & 0x1F);
if (fetch_opcode == FetchOpcode::kVertexFetch) {
auto& op = *reinterpret_cast<const VertexFetchInstruction*>(
ucode_data_.data() + instr_offset * 3);
GatherVertexFetchInformation(op, previous_vfetch_full,
auto& op = *reinterpret_cast<const FetchInstruction*>(op_ptr);
if (op.opcode() == FetchOpcode::kVertexFetch) {
GatherVertexFetchInformation(op.vertex_fetch(), previous_vfetch_full,
ucode_disasm_buffer);
} else {
auto& op = *reinterpret_cast<const TextureFetchInstruction*>(
ucode_data_.data() + instr_offset * 3);
GatherTextureFetchInformation(op, unique_texture_bindings,
ucode_disasm_buffer);
GatherTextureFetchInformation(
op.texture_fetch(), unique_texture_bindings, ucode_disasm_buffer);
}
} else {
auto& op = *reinterpret_cast<const AluInstruction*>(ucode_data_.data() +
instr_offset * 3);
auto& op = *reinterpret_cast<const AluInstruction*>(op_ptr);
GatherAluInstructionInformation(op, memexport_alloc_current_count,
memexport_eA_written,
ucode_disasm_buffer);
@ -338,6 +334,10 @@ void Shader::GatherTextureFetchInformation(const TextureFetchInstruction& op,
GatherOperandInformation(binding.fetch_instr.operands[i]);
}
if (binding.fetch_instr.result.GetUsedResultComponents()) {
uses_texture_fetch_instruction_results_ = true;
}
switch (op.opcode()) {
case FetchOpcode::kSetTextureLod:
case FetchOpcode::kSetTextureGradientsHorz:
@ -374,9 +374,12 @@ void Shader::GatherAluInstructionInformation(
ParseAluInstruction(op, type(), instr);
instr.Disassemble(&ucode_disasm_buffer);
kills_pixels_ = kills_pixels_ ||
ucode::AluVectorOpcodeIsKill(op.vector_opcode()) ||
ucode::AluScalarOpcodeIsKill(op.scalar_opcode());
kills_pixels_ =
kills_pixels_ ||
(ucode::GetAluVectorOpcodeInfo(op.vector_opcode()).changed_state &
ucode::kAluOpChangedStatePixelKill) ||
(ucode::GetAluScalarOpcodeInfo(op.scalar_opcode()).changed_state &
ucode::kAluOpChangedStatePixelKill);
GatherAluResultInformation(instr.vector_and_constant_result,
memexport_alloc_current_count);
@ -420,7 +423,7 @@ void Shader::GatherOperandInformation(const InstructionOperand& operand) {
switch (operand.storage_source) {
case InstructionStorageSource::kRegister:
if (operand.storage_addressing_mode ==
InstructionStorageAddressingMode::kStatic) {
InstructionStorageAddressingMode::kAbsolute) {
register_static_address_bound_ =
std::max(register_static_address_bound_,
operand.storage_index + uint32_t(1));
@ -430,7 +433,7 @@ void Shader::GatherOperandInformation(const InstructionOperand& operand) {
break;
case InstructionStorageSource::kConstantFloat:
if (operand.storage_addressing_mode ==
InstructionStorageAddressingMode::kStatic) {
InstructionStorageAddressingMode::kAbsolute) {
// Store used float constants before translating so the
// translator can use tightly packed indices if not dynamically
// indexed.
@ -457,7 +460,7 @@ void Shader::GatherFetchResultInformation(const InstructionResult& result) {
// operand.
assert_true(result.storage_target == InstructionStorageTarget::kRegister);
if (result.storage_addressing_mode ==
InstructionStorageAddressingMode::kStatic) {
InstructionStorageAddressingMode::kAbsolute) {
register_static_address_bound_ = std::max(
register_static_address_bound_, result.storage_index + uint32_t(1));
} else {
@ -473,7 +476,7 @@ void Shader::GatherAluResultInformation(
switch (result.storage_target) {
case InstructionStorageTarget::kRegister:
if (result.storage_addressing_mode ==
InstructionStorageAddressingMode::kStatic) {
InstructionStorageAddressingMode::kAbsolute) {
register_static_address_bound_ = std::max(
register_static_address_bound_, result.storage_index + uint32_t(1));
} else {
@ -663,7 +666,7 @@ void ParseControlFlowExec(const ControlFlowExecInstruction& cf,
instr.instruction_count = cf.count();
instr.type = ParsedExecInstruction::Type::kUnconditional;
instr.is_end = cf.opcode() == ControlFlowOpcode::kExecEnd;
instr.clean = cf.clean();
instr.is_predicate_clean = cf.is_predicate_clean();
instr.is_yield = cf.is_yield();
instr.sequence = cf.sequence();
}
@ -690,7 +693,7 @@ void ParseControlFlowCondExec(const ControlFlowCondExecInstruction& cf,
switch (cf.opcode()) {
case ControlFlowOpcode::kCondExec:
case ControlFlowOpcode::kCondExecEnd:
instr.clean = false;
instr.is_predicate_clean = false;
break;
default:
break;
@ -711,7 +714,7 @@ void ParseControlFlowCondExecPred(const ControlFlowCondExecPredInstruction& cf,
instr.type = ParsedExecInstruction::Type::kPredicated;
instr.condition = cf.condition();
instr.is_end = cf.opcode() == ControlFlowOpcode::kCondExecPredEnd;
instr.clean = cf.clean();
instr.is_predicate_clean = cf.is_predicate_clean();
instr.is_yield = cf.is_yield();
instr.sequence = cf.sequence();
}
@ -789,28 +792,24 @@ void ShaderTranslator::TranslateExecInstructions(
for (uint32_t instr_offset = instr.instruction_address;
instr_offset < instr.instruction_address + instr.instruction_count;
++instr_offset, sequence >>= 2) {
const uint32_t* op_ptr = ucode_dwords + instr_offset * 3;
if (sequence & 0b01) {
auto fetch_opcode =
static_cast<FetchOpcode>(ucode_dwords[instr_offset * 3] & 0x1F);
if (fetch_opcode == FetchOpcode::kVertexFetch) {
auto& op = *reinterpret_cast<const VertexFetchInstruction*>(
ucode_dwords + instr_offset * 3);
auto& op = *reinterpret_cast<const FetchInstruction*>(op_ptr);
if (op.opcode() == FetchOpcode::kVertexFetch) {
const VertexFetchInstruction& vfetch_op = op.vertex_fetch();
ParsedVertexFetchInstruction vfetch_instr;
if (ParseVertexFetchInstruction(op, previous_vfetch_full_,
if (ParseVertexFetchInstruction(vfetch_op, previous_vfetch_full_,
vfetch_instr)) {
previous_vfetch_full_ = op;
previous_vfetch_full_ = vfetch_op;
}
ProcessVertexFetchInstruction(vfetch_instr);
} else {
auto& op = *reinterpret_cast<const TextureFetchInstruction*>(
ucode_dwords + instr_offset * 3);
ParsedTextureFetchInstruction tfetch_instr;
ParseTextureFetchInstruction(op, tfetch_instr);
ParseTextureFetchInstruction(op.texture_fetch(), tfetch_instr);
ProcessTextureFetchInstruction(tfetch_instr);
}
} else {
auto& op = *reinterpret_cast<const AluInstruction*>(ucode_dwords +
instr_offset * 3);
auto& op = *reinterpret_cast<const AluInstruction*>(op_ptr);
ParsedAluInstruction alu_instr;
ParseAluInstruction(op, current_shader().type(), alu_instr);
ProcessAluInstruction(alu_instr);
@ -826,25 +825,40 @@ static void ParseFetchInstructionResult(uint32_t dest, uint32_t swizzle,
result.storage_index = dest;
result.is_clamped = false;
result.storage_addressing_mode =
is_relative ? InstructionStorageAddressingMode::kAddressRelative
: InstructionStorageAddressingMode::kStatic;
is_relative ? InstructionStorageAddressingMode::kLoopRelative
: InstructionStorageAddressingMode::kAbsolute;
result.original_write_mask = 0b1111;
for (int i = 0; i < 4; ++i) {
switch (swizzle & 0x7) {
case 4:
case 6:
result.components[i] = SwizzleSource::k0;
SwizzleSource component_source = SwizzleSource::k0;
ucode::FetchDestinationSwizzle component_swizzle =
ucode::GetFetchDestinationComponentSwizzle(swizzle, i);
switch (component_swizzle) {
case ucode::FetchDestinationSwizzle::kX:
component_source = SwizzleSource::kX;
break;
case 5:
result.components[i] = SwizzleSource::k1;
case ucode::FetchDestinationSwizzle::kY:
component_source = SwizzleSource::kY;
break;
case 7:
result.original_write_mask &= ~uint32_t(1 << i);
case ucode::FetchDestinationSwizzle::kZ:
component_source = SwizzleSource::kZ;
break;
case ucode::FetchDestinationSwizzle::kW:
component_source = SwizzleSource::kW;
break;
case ucode::FetchDestinationSwizzle::k1:
component_source = SwizzleSource::k1;
break;
case ucode::FetchDestinationSwizzle::kKeep:
result.original_write_mask &= ~(UINT32_C(1) << i);
break;
default:
result.components[i] = GetSwizzleFromComponentIndex(swizzle & 0x3);
// ucode::FetchDestinationSwizzle::k0 or the invalid swizzle 6.
// TODO(Triang3l): Find the correct handling of the invalid swizzle 6.
assert_true(component_swizzle == ucode::FetchDestinationSwizzle::k0);
component_source = SwizzleSource::k0;
break;
}
swizzle >>= 3;
result.components[i] = component_source;
}
}
@ -867,8 +881,8 @@ bool ParseVertexFetchInstruction(const VertexFetchInstruction& op,
src_op.storage_index = full_op.src();
src_op.storage_addressing_mode =
full_op.is_src_relative()
? InstructionStorageAddressingMode::kAddressRelative
: InstructionStorageAddressingMode::kStatic;
? InstructionStorageAddressingMode::kLoopRelative
: InstructionStorageAddressingMode::kAbsolute;
src_op.is_negated = false;
src_op.is_absolute_value = false;
src_op.component_count = 1;
@ -962,8 +976,8 @@ void ParseTextureFetchInstruction(const TextureFetchInstruction& op,
src_op.storage_source = InstructionStorageSource::kRegister;
src_op.storage_index = op.src();
src_op.storage_addressing_mode =
op.is_src_relative() ? InstructionStorageAddressingMode::kAddressRelative
: InstructionStorageAddressingMode::kStatic;
op.is_src_relative() ? InstructionStorageAddressingMode::kLoopRelative
: InstructionStorageAddressingMode::kAbsolute;
src_op.is_negated = false;
src_op.is_absolute_value = false;
src_op.component_count =
@ -1048,187 +1062,54 @@ uint32_t ParsedTextureFetchInstruction::GetNonZeroResultComponents() const {
return result.GetUsedResultComponents() & components;
}
struct AluOpcodeInfo {
const char* name;
uint32_t argument_count;
uint32_t src_swizzle_component_count;
};
static const AluOpcodeInfo alu_vector_opcode_infos[0x20] = {
{"add", 2, 4}, // 0
{"mul", 2, 4}, // 1
{"max", 2, 4}, // 2
{"min", 2, 4}, // 3
{"seq", 2, 4}, // 4
{"sgt", 2, 4}, // 5
{"sge", 2, 4}, // 6
{"sne", 2, 4}, // 7
{"frc", 1, 4}, // 8
{"trunc", 1, 4}, // 9
{"floor", 1, 4}, // 10
{"mad", 3, 4}, // 11
{"cndeq", 3, 4}, // 12
{"cndge", 3, 4}, // 13
{"cndgt", 3, 4}, // 14
{"dp4", 2, 4}, // 15
{"dp3", 2, 4}, // 16
{"dp2add", 3, 4}, // 17
{"cube", 2, 4}, // 18
{"max4", 1, 4}, // 19
{"setp_eq_push", 2, 4}, // 20
{"setp_ne_push", 2, 4}, // 21
{"setp_gt_push", 2, 4}, // 22
{"setp_ge_push", 2, 4}, // 23
{"kill_eq", 2, 4}, // 24
{"kill_gt", 2, 4}, // 25
{"kill_ge", 2, 4}, // 26
{"kill_ne", 2, 4}, // 27
{"dst", 2, 4}, // 28
{"maxa", 2, 4}, // 29
};
static const AluOpcodeInfo alu_scalar_opcode_infos[0x40] = {
{"adds", 1, 2}, // 0
{"adds_prev", 1, 1}, // 1
{"muls", 1, 2}, // 2
{"muls_prev", 1, 1}, // 3
{"muls_prev2", 1, 2}, // 4
{"maxs", 1, 2}, // 5
{"mins", 1, 2}, // 6
{"seqs", 1, 1}, // 7
{"sgts", 1, 1}, // 8
{"sges", 1, 1}, // 9
{"snes", 1, 1}, // 10
{"frcs", 1, 1}, // 11
{"truncs", 1, 1}, // 12
{"floors", 1, 1}, // 13
{"exp", 1, 1}, // 14
{"logc", 1, 1}, // 15
{"log", 1, 1}, // 16
{"rcpc", 1, 1}, // 17
{"rcpf", 1, 1}, // 18
{"rcp", 1, 1}, // 19
{"rsqc", 1, 1}, // 20
{"rsqf", 1, 1}, // 21
{"rsq", 1, 1}, // 22
{"maxas", 1, 2}, // 23
{"maxasf", 1, 2}, // 24
{"subs", 1, 2}, // 25
{"subs_prev", 1, 1}, // 26
{"setp_eq", 1, 1}, // 27
{"setp_ne", 1, 1}, // 28
{"setp_gt", 1, 1}, // 29
{"setp_ge", 1, 1}, // 30
{"setp_inv", 1, 1}, // 31
{"setp_pop", 1, 1}, // 32
{"setp_clr", 0, 0}, // 33
{"setp_rstr", 1, 1}, // 34
{"kills_eq", 1, 1}, // 35
{"kills_gt", 1, 1}, // 36
{"kills_ge", 1, 1}, // 37
{"kills_ne", 1, 1}, // 38
{"kills_one", 1, 1}, // 39
{"sqrt", 1, 1}, // 40
{"UNKNOWN", 0, 0}, // 41
{"mulsc", 2, 1}, // 42
{"mulsc", 2, 1}, // 43
{"addsc", 2, 1}, // 44
{"addsc", 2, 1}, // 45
{"subsc", 2, 1}, // 46
{"subsc", 2, 1}, // 47
{"sin", 1, 1}, // 48
{"cos", 1, 1}, // 49
{"retain_prev", 0, 0}, // 50
};
static void ParseAluInstructionOperand(const AluInstruction& op, uint32_t i,
uint32_t swizzle_component_count,
InstructionOperand& out_op) {
int const_slot = 0;
switch (i) {
case 2:
const_slot = op.src_is_temp(1) ? 0 : 1;
break;
case 3:
const_slot = op.src_is_temp(1) && op.src_is_temp(2) ? 0 : 1;
break;
}
out_op.is_negated = op.src_negate(i);
uint32_t reg = op.src_reg(i);
if (op.src_is_temp(i)) {
out_op.storage_source = InstructionStorageSource::kRegister;
out_op.storage_index = reg & 0x1F;
out_op.is_absolute_value = (reg & 0x80) == 0x80;
out_op.storage_index = AluInstruction::src_temp_reg(reg);
out_op.is_absolute_value = AluInstruction::is_src_temp_value_absolute(reg);
out_op.storage_addressing_mode =
(reg & 0x40) ? InstructionStorageAddressingMode::kAddressRelative
: InstructionStorageAddressingMode::kStatic;
AluInstruction::is_src_temp_relative(reg)
? InstructionStorageAddressingMode::kLoopRelative
: InstructionStorageAddressingMode::kAbsolute;
} else {
out_op.storage_source = InstructionStorageSource::kConstantFloat;
out_op.storage_index = reg;
if ((const_slot == 0 && op.is_const_0_addressed()) ||
(const_slot == 1 && op.is_const_1_addressed())) {
if (op.is_address_relative()) {
if (op.src_const_is_addressed(i)) {
if (op.is_const_address_register_relative()) {
out_op.storage_addressing_mode =
InstructionStorageAddressingMode::kAddressAbsolute;
InstructionStorageAddressingMode::kAddressRegisterRelative;
} else {
out_op.storage_addressing_mode =
InstructionStorageAddressingMode::kAddressRelative;
InstructionStorageAddressingMode::kLoopRelative;
}
} else {
out_op.storage_addressing_mode =
InstructionStorageAddressingMode::kStatic;
InstructionStorageAddressingMode::kAbsolute;
}
out_op.is_absolute_value = op.abs_constants();
}
out_op.component_count = swizzle_component_count;
uint32_t swizzle = op.src_swizzle(i);
if (swizzle_component_count == 1) {
uint32_t a = ((swizzle >> 6) + 3) & 0x3;
out_op.components[0] = GetSwizzleFromComponentIndex(a);
// Scalar `a` (W).
out_op.components[0] = GetSwizzledAluSourceComponent(swizzle, 3);
} else if (swizzle_component_count == 2) {
uint32_t a = ((swizzle >> 6) + 3) & 0x3;
uint32_t b = ((swizzle >> 0) + 0) & 0x3;
out_op.components[0] = GetSwizzleFromComponentIndex(a);
out_op.components[1] = GetSwizzleFromComponentIndex(b);
// Scalar left-hand `a` (W) and right-hand `b` (X).
out_op.components[0] = GetSwizzledAluSourceComponent(swizzle, 3);
out_op.components[1] = GetSwizzledAluSourceComponent(swizzle, 0);
} else if (swizzle_component_count == 3) {
assert_always();
} else if (swizzle_component_count == 4) {
for (uint32_t j = 0; j < swizzle_component_count; ++j, swizzle >>= 2) {
out_op.components[j] = GetSwizzleFromComponentIndex((swizzle + j) & 0x3);
for (uint32_t j = 0; j < swizzle_component_count; ++j) {
out_op.components[j] = GetSwizzledAluSourceComponent(swizzle, j);
}
}
}
static void ParseAluInstructionOperandSpecial(
const AluInstruction& op, InstructionStorageSource storage_source,
uint32_t reg, bool negate, int const_slot, uint32_t component_index,
InstructionOperand& out_op) {
out_op.is_negated = negate;
out_op.is_absolute_value = op.abs_constants();
out_op.storage_source = storage_source;
if (storage_source == InstructionStorageSource::kRegister) {
out_op.storage_index = reg & 0x7F;
out_op.storage_addressing_mode = InstructionStorageAddressingMode::kStatic;
} else {
out_op.storage_index = reg;
if ((const_slot == 0 && op.is_const_0_addressed()) ||
(const_slot == 1 && op.is_const_1_addressed())) {
if (op.is_address_relative()) {
out_op.storage_addressing_mode =
InstructionStorageAddressingMode::kAddressAbsolute;
} else {
out_op.storage_addressing_mode =
InstructionStorageAddressingMode::kAddressRelative;
}
} else {
out_op.storage_addressing_mode =
InstructionStorageAddressingMode::kStatic;
}
}
out_op.component_count = 1;
out_op.components[0] = GetSwizzleFromComponentIndex(component_index);
}
bool ParsedAluInstruction::IsVectorOpDefaultNop() const {
if (vector_opcode != ucode::AluVectorOpcode::kMax ||
vector_and_constant_result.original_write_mask ||
@ -1237,14 +1118,14 @@ bool ParsedAluInstruction::IsVectorOpDefaultNop() const {
InstructionStorageSource::kRegister ||
vector_operands[0].storage_index != 0 ||
vector_operands[0].storage_addressing_mode !=
InstructionStorageAddressingMode::kStatic ||
InstructionStorageAddressingMode::kAbsolute ||
vector_operands[0].is_negated || vector_operands[0].is_absolute_value ||
!vector_operands[0].IsStandardSwizzle() ||
vector_operands[1].storage_source !=
InstructionStorageSource::kRegister ||
vector_operands[1].storage_index != 0 ||
vector_operands[1].storage_addressing_mode !=
InstructionStorageAddressingMode::kStatic ||
InstructionStorageAddressingMode::kAbsolute ||
vector_operands[1].is_negated || vector_operands[1].is_absolute_value ||
!vector_operands[1].IsStandardSwizzle()) {
return false;
@ -1253,7 +1134,7 @@ bool ParsedAluInstruction::IsVectorOpDefaultNop() const {
InstructionStorageTarget::kRegister) {
if (vector_and_constant_result.storage_index != 0 ||
vector_and_constant_result.storage_addressing_mode !=
InstructionStorageAddressingMode::kStatic) {
InstructionStorageAddressingMode::kAbsolute) {
return false;
}
} else {
@ -1323,21 +1204,22 @@ void ParseAluInstruction(const AluInstruction& op,
// Vector operation and constant 0/1 writes.
instr.vector_opcode = op.vector_opcode();
const auto& vector_opcode_info =
alu_vector_opcode_infos[uint32_t(instr.vector_opcode)];
ucode::AluVectorOpcode vector_opcode = op.vector_opcode();
instr.vector_opcode = vector_opcode;
const ucode::AluVectorOpcodeInfo& vector_opcode_info =
ucode::GetAluVectorOpcodeInfo(vector_opcode);
instr.vector_opcode_name = vector_opcode_info.name;
instr.vector_and_constant_result.storage_target = storage_target;
instr.vector_and_constant_result.storage_addressing_mode =
InstructionStorageAddressingMode::kStatic;
InstructionStorageAddressingMode::kAbsolute;
if (is_export) {
instr.vector_and_constant_result.storage_index = storage_index_export;
} else {
instr.vector_and_constant_result.storage_index = op.vector_dest();
if (op.is_vector_dest_relative()) {
instr.vector_and_constant_result.storage_addressing_mode =
InstructionStorageAddressingMode::kAddressRelative;
InstructionStorageAddressingMode::kLoopRelative;
}
}
instr.vector_and_constant_result.is_clamped = op.vector_clamp();
@ -1355,31 +1237,30 @@ void ParseAluInstruction(const AluInstruction& op,
instr.vector_and_constant_result.components[i] = component;
}
instr.vector_operand_count = vector_opcode_info.argument_count;
instr.vector_operand_count = vector_opcode_info.GetOperandCount();
for (uint32_t i = 0; i < instr.vector_operand_count; ++i) {
InstructionOperand& vector_operand = instr.vector_operands[i];
ParseAluInstructionOperand(op, i + 1,
vector_opcode_info.src_swizzle_component_count,
vector_operand);
ParseAluInstructionOperand(op, i + 1, 4, vector_operand);
}
// Scalar operation.
instr.scalar_opcode = op.scalar_opcode();
const auto& scalar_opcode_info =
alu_scalar_opcode_infos[uint32_t(instr.scalar_opcode)];
ucode::AluScalarOpcode scalar_opcode = op.scalar_opcode();
instr.scalar_opcode = scalar_opcode;
const ucode::AluScalarOpcodeInfo& scalar_opcode_info =
ucode::GetAluScalarOpcodeInfo(scalar_opcode);
instr.scalar_opcode_name = scalar_opcode_info.name;
instr.scalar_result.storage_target = storage_target;
instr.scalar_result.storage_addressing_mode =
InstructionStorageAddressingMode::kStatic;
InstructionStorageAddressingMode::kAbsolute;
if (is_export) {
instr.scalar_result.storage_index = storage_index_export;
} else {
instr.scalar_result.storage_index = op.scalar_dest();
if (op.is_scalar_dest_relative()) {
instr.scalar_result.storage_addressing_mode =
InstructionStorageAddressingMode::kAddressRelative;
InstructionStorageAddressingMode::kLoopRelative;
}
}
instr.scalar_result.is_clamped = op.scalar_clamp();
@ -1388,27 +1269,49 @@ void ParseAluInstruction(const AluInstruction& op,
instr.scalar_result.components[i] = GetSwizzleFromComponentIndex(i);
}
instr.scalar_operand_count = scalar_opcode_info.argument_count;
instr.scalar_operand_count = scalar_opcode_info.operand_count;
if (instr.scalar_operand_count) {
if (instr.scalar_operand_count == 1) {
ParseAluInstructionOperand(op, 3,
scalar_opcode_info.src_swizzle_component_count,
ParseAluInstructionOperand(
op, 3, scalar_opcode_info.single_operand_is_two_component ? 2 : 1,
instr.scalar_operands[0]);
} else {
// Constant and temporary register.
bool src3_negate = op.src_negate(3);
uint32_t src3_swizzle = op.src_swizzle(3);
uint32_t component_a = ((src3_swizzle >> 6) + 3) & 0x3;
uint32_t component_b = ((src3_swizzle >> 0) + 0) & 0x3;
uint32_t reg2 = (src3_swizzle & 0x3C) | (op.src_is_temp(3) << 1) |
(static_cast<int>(op.scalar_opcode()) & 1);
int const_slot = (op.src_is_temp(1) || op.src_is_temp(2)) ? 1 : 0;
ParseAluInstructionOperandSpecial(
op, InstructionStorageSource::kConstantFloat, op.src_reg(3),
op.src_negate(3), 0, component_a, instr.scalar_operands[0]);
// Left-hand constant operand (`a` - W swizzle).
InstructionOperand& const_op = instr.scalar_operands[0];
const_op.is_negated = src3_negate;
const_op.is_absolute_value = op.abs_constants();
const_op.storage_source = InstructionStorageSource::kConstantFloat;
const_op.storage_index = op.src_reg(3);
if (op.src_const_is_addressed(3)) {
if (op.is_const_address_register_relative()) {
const_op.storage_addressing_mode =
InstructionStorageAddressingMode::kAddressRegisterRelative;
} else {
const_op.storage_addressing_mode =
InstructionStorageAddressingMode::kLoopRelative;
}
} else {
const_op.storage_addressing_mode =
InstructionStorageAddressingMode::kAbsolute;
}
const_op.component_count = 1;
const_op.components[0] = GetSwizzledAluSourceComponent(src3_swizzle, 3);
ParseAluInstructionOperandSpecial(op, InstructionStorageSource::kRegister,
reg2, op.src_negate(3), const_slot,
component_b, instr.scalar_operands[1]);
// Right-hand temporary register operand (`b` - X swizzle).
InstructionOperand& temp_op = instr.scalar_operands[1];
temp_op.is_negated = src3_negate;
temp_op.is_absolute_value = op.abs_constants();
temp_op.storage_source = InstructionStorageSource::kRegister;
temp_op.storage_index = op.scalar_const_reg_op_src_temp_reg();
temp_op.storage_addressing_mode =
InstructionStorageAddressingMode::kAbsolute;
temp_op.component_count = 1;
temp_op.components[0] = GetSwizzledAluSourceComponent(src3_swizzle, 0);
}
}
}
@ -1421,7 +1324,7 @@ bool ParsedAluInstruction::IsScalarOpDefaultNop() const {
if (scalar_result.storage_target == InstructionStorageTarget::kRegister) {
if (scalar_result.storage_index != 0 ||
scalar_result.storage_addressing_mode !=
InstructionStorageAddressingMode::kStatic) {
InstructionStorageAddressingMode::kAbsolute) {
return false;
}
}
@ -1434,7 +1337,7 @@ bool ParsedAluInstruction::IsNop() const {
return scalar_opcode == ucode::AluScalarOpcode::kRetainPrev &&
!scalar_result.GetUsedWriteMask() &&
!vector_and_constant_result.GetUsedWriteMask() &&
!ucode::AluVectorOpHasSideEffects(vector_opcode);
!ucode::GetAluVectorOpcodeInfo(vector_opcode).changed_state;
}
uint32_t ParsedAluInstruction::GetMemExportStreamConstant() const {
@ -1446,7 +1349,7 @@ uint32_t ParsedAluInstruction::GetMemExportStreamConstant() const {
vector_operands[2].storage_source ==
InstructionStorageSource::kConstantFloat &&
vector_operands[2].storage_addressing_mode ==
InstructionStorageAddressingMode::kStatic &&
InstructionStorageAddressingMode::kAbsolute &&
vector_operands[2].IsStandardSwizzle() &&
!vector_operands[2].is_negated && !vector_operands[2].is_absolute_value) {
return vector_operands[2].storage_index;

View File

@ -57,13 +57,13 @@ void DisassembleResultOperand(const InstructionResult& result,
}
if (uses_storage_index) {
switch (result.storage_addressing_mode) {
case InstructionStorageAddressingMode::kStatic:
case InstructionStorageAddressingMode::kAbsolute:
out->AppendFormat("{}", result.storage_index);
break;
case InstructionStorageAddressingMode::kAddressAbsolute:
case InstructionStorageAddressingMode::kAddressRegisterRelative:
out->AppendFormat("[{}+a0]", result.storage_index);
break;
case InstructionStorageAddressingMode::kAddressRelative:
case InstructionStorageAddressingMode::kLoopRelative:
out->AppendFormat("[{}+aL]", result.storage_index);
break;
}
@ -109,17 +109,17 @@ void DisassembleSourceOperand(const InstructionOperand& op, StringBuffer* out) {
out->Append("_abs");
}
switch (op.storage_addressing_mode) {
case InstructionStorageAddressingMode::kStatic:
case InstructionStorageAddressingMode::kAbsolute:
if (op.is_absolute_value) {
out->AppendFormat("[{}]", op.storage_index);
} else {
out->AppendFormat("{}", op.storage_index);
}
break;
case InstructionStorageAddressingMode::kAddressAbsolute:
case InstructionStorageAddressingMode::kAddressRegisterRelative:
out->AppendFormat("[{}+a0]", op.storage_index);
break;
case InstructionStorageAddressingMode::kAddressRelative:
case InstructionStorageAddressingMode::kLoopRelative:
out->AppendFormat("[{}+aL]", op.storage_index);
break;
}
@ -148,17 +148,19 @@ void ParsedExecInstruction::Disassemble(StringBuffer* out) const {
out->AppendFormat("{}", opcode_name);
break;
case Type::kConditional:
out->AppendFormat(" {} ", opcode_name);
if (!condition) {
out->Append('!');
}
out->AppendFormat("b{}", bool_constant_index);
out->AppendFormat(" {} {}b{}", opcode_name, condition ? "" : "!",
bool_constant_index);
break;
}
if (is_yield) {
out->Append(", Yield=true");
if (type == Type::kConditional) {
// For `exec` or `(p0) exec` (but not `cexec`), "unexpected token ','" if
// preceded by a comma.
out->Append(',');
}
if (!clean) {
out->Append(" Yield=true");
}
if (!is_predicate_clean) {
out->Append(" // PredicateClean=false");
}
out->Append('\n');

View File

@ -161,7 +161,7 @@ or [precise(x)] r0.x, r0.y, r0.x
if_nz r0.x
ret
endif
lt [precise(x)] r0.x, l(0.000000), v[0][16].z
ge [precise(x)] r0.x, v[0][16].z, l(0.000000)
movc [precise(x)] r1.x, r0.x, v[0][16].z, CB0[0][8].w
movc [precise(y)] r1.y, r0.x, v[0][16].z, CB0[0][9].w
max [precise(xy)] r0.xy, r1.xyxx, CB0[0][10].xxxx
@ -273,10 +273,10 @@ ret
const BYTE primitive_point_list_gs[] =
{
68, 88, 66, 67, 6, 119,
40, 99, 120, 121, 153, 224,
111, 77, 187, 15, 15, 245,
37, 128, 1, 0, 0, 0,
68, 88, 66, 67, 93, 92,
207, 129, 65, 238, 95, 209,
216, 127, 85, 211, 22, 177,
159, 238, 1, 0, 0, 0,
136, 29, 0, 0, 5, 0,
0, 0, 52, 0, 0, 0,
184, 10, 0, 0, 248, 12,
@ -1070,12 +1070,12 @@ const BYTE primitive_point_list_gs[] =
31, 0, 4, 3, 10, 0,
16, 0, 0, 0, 0, 0,
62, 0, 0, 1, 21, 0,
0, 1, 49, 0, 8, 8,
0, 1, 29, 0, 8, 8,
18, 0, 16, 0, 0, 0,
0, 0, 42, 16, 32, 0,
0, 0, 0, 0, 16, 0,
0, 0, 1, 64, 0, 0,
0, 0, 0, 0, 42, 16,
32, 0, 0, 0, 0, 0,
16, 0, 0, 0, 55, 0,
0, 0, 0, 0, 55, 0,
8, 12, 18, 0, 16, 0,
1, 0, 0, 0, 10, 0,
16, 0, 0, 0, 0, 0,

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,992 @@
#if 0
//
// Generated by Microsoft (R) HLSL Shader Compiler 10.1
//
//
// Buffer Definitions:
//
// cbuffer xe_texture_load_constants
// {
//
// uint xe_texture_load_is_tiled_3d_endian_scale;// Offset: 0 Size: 4
// uint xe_texture_load_guest_offset; // Offset: 4 Size: 4
// uint xe_texture_load_guest_pitch_aligned;// Offset: 8 Size: 4
// uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset: 12 Size: 4
// uint3 xe_texture_load_size_blocks; // Offset: 16 Size: 12
// uint xe_texture_load_host_offset; // Offset: 28 Size: 4
// uint xe_texture_load_host_pitch; // Offset: 32 Size: 4
// uint xe_texture_load_height_texels;// Offset: 36 Size: 4 [unused]
//
// }
//
//
// Resource Bindings:
//
// Name Type Format Dim ID HLSL Bind Count
// ------------------------------ ---------- ------- ----------- ------- -------------- ------
// xe_texture_load_source texture uint4 buf T0 t0 1
// xe_texture_load_dest UAV uint4 buf U0 u0 1
// xe_texture_load_constants cbuffer NA NA CB0 cb0 1
//
//
//
// Input signature:
//
// Name Index Mask Register SysValue Format Used
// -------------------- ----- ------ -------- -------- ------- ------
// no Input
//
// Output signature:
//
// Name Index Mask Register SysValue Format Used
// -------------------- ----- ------ -------- -------- ------- ------
// no Output
cs_5_1
dcl_globalFlags refactoringAllowed
dcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0
dcl_resource_buffer (uint,uint,uint,uint) T0[0:0], space=0
dcl_uav_typed_buffer (uint,uint,uint,uint) U0[0:0], space=0
dcl_input vThreadID.xyz
dcl_temps 5
dcl_thread_group 2, 32, 1
ishl r0.x, vThreadID.x, l(4)
mov r0.y, vThreadID.y
uge r0.yz, r0.xxyx, CB0[0][1].xxyx
or r0.y, r0.z, r0.y
if_nz r0.y
ret
endif
ishl r0.y, r0.x, l(1)
imad r0.z, vThreadID.z, CB0[0][1].y, vThreadID.y
imad r0.z, r0.z, CB0[0][2].x, r0.y
iadd r0.z, r0.z, CB0[0][1].w
and r0.w, CB0[0][0].x, l(1)
if_nz r0.w
and r1.x, CB0[0][0].x, l(2)
if_nz r1.x
ishr r1.xyz, vThreadID.yzyy, l(4, 2, 3, 0)
ushr r2.xy, CB0[0][0].wzww, l(4, 5, 0, 0)
imad r1.x, r1.y, r2.x, r1.x
ibfe r1.w, l(27), l(1), vThreadID.x
imad r1.x, r1.x, r2.y, r1.w
ishl r1.w, vThreadID.y, l(9)
ishr r1.w, r1.w, l(6)
iadd r1.y, r1.y, r1.z
and r1.zw, r1.yyyw, l(0, 0, 1, 48)
ishr r2.x, r0.x, l(3)
bfi r1.y, l(1), l(1), r1.y, l(0)
iadd r1.y, r1.y, r2.x
bfi r1.y, l(2), l(1), r1.y, l(0)
iadd r1.y, r1.y, r1.z
bfi r1.xz, l(21, 0, 21, 0), l(9, 0, 12, 0), r1.xxxx, l(0, 0, 0, 0)
imad r1.xz, r1.wwww, l(2, 0, 16, 0), r1.xxzx
bfi r1.xz, l(2, 0, 2, 0), l(7, 0, 10, 0), vThreadID.zzzz, r1.xxzx
bfi r1.w, l(1), l(4), vThreadID.y, l(0)
ubfe r2.x, l(3), l(6), r1.x
and r2.y, r1.y, l(4)
bfi r1.y, l(2), l(8), r1.y, l(0)
imad r1.y, r2.x, l(32), r1.y
imad r1.y, r2.y, l(4), r1.y
bfi r1.xz, l(5, 0, 5, 0), l(0, 0, 3, 0), r1.wwww, r1.xxzx
bfi r1.y, l(9), l(3), r1.y, r1.z
bfi r1.x, l(6), l(0), r1.x, r1.y
else
ibfe r1.y, l(27), l(1), vThreadID.x
ishr r1.zw, vThreadID.yyyy, l(0, 0, 5, 2)
ushr r2.x, CB0[0][0].z, l(5)
imad r1.y, r1.z, r2.x, r1.y
bfi r2.xyz, l(4, 4, 4, 0), l(4, 7, 6, 0), vThreadID.yyyy, l(0, 0, 0, 0)
bfi r2.xyz, l(24, 24, 24, 0), l(8, 11, 10, 0), r1.yyyy, r2.xyzx
ishl r1.y, vThreadID.y, l(7)
and r1.y, r1.y, l(2048)
bfi r1.y, l(12), l(0), r1.y, r2.y
and r1.z, r2.z, l(1792)
iadd r1.y, r1.y, r1.z
and r1.z, r1.w, l(2)
ishr r0.x, r0.x, l(3)
iadd r0.x, r0.x, r1.z
bfi r0.x, l(2), l(6), r0.x, l(0)
iadd r0.x, r1.y, r0.x
bfi r1.x, l(6), l(0), r2.x, r0.x
endif
else
imad r0.x, vThreadID.z, CB0[0][0].w, vThreadID.y
imad r1.x, r0.x, CB0[0][0].z, r0.y
endif
iadd r0.x, r1.x, CB0[0][0].y
ushr r0.xz, r0.xxzx, l(4, 0, 4, 0)
ubfe r0.y, l(2), l(2), CB0[0][0].x
ld r1.xyzw, r0.xxxx, T0[0].xyzw
ieq r0.y, r0.y, l(1)
if_nz r0.y
ishl r2.xyzw, r1.xyzw, l(8, 8, 8, 8)
and r2.xyzw, r2.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)
ushr r3.xyzw, r1.xyzw, l(8, 8, 8, 8)
and r3.xyzw, r3.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)
iadd r1.xyzw, r2.xyzw, r3.xyzw
endif
and r2.xyzw, r1.xyzw, l(0x0000ffff, 0x0000ffff, 0x0000ffff, 0x0000ffff)
utof r2.xyzw, r2.xyzw
mul r2.xyzw, r2.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)
ushr r1.xyzw, r1.xyzw, l(16, 16, 16, 16)
utof r1.xyzw, r1.xyzw
mul r1.xyzw, r1.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)
f32tof16 r2.xyzw, r2.xyzw
f32tof16 r1.xyzw, r1.xyzw
imad r1.xyzw, r1.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r2.xyzw
store_uav_typed U0[0].xyzw, r0.zzzz, r1.xyzw
iadd r1.x, r0.z, l(1)
if_nz r0.w
mov r0.w, l(64)
else
mov r0.w, l(16)
endif
ushr r0.w, r0.w, l(4)
iadd r0.x, r0.w, r0.x
ld r2.xyzw, r0.xxxx, T0[0].xyzw
if_nz r0.y
ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)
and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)
ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)
and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)
iadd r2.xyzw, r3.xyzw, r4.xyzw
endif
and r3.xyzw, r2.xyzw, l(0x0000ffff, 0x0000ffff, 0x0000ffff, 0x0000ffff)
utof r3.xyzw, r3.xyzw
mul r3.xyzw, r3.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)
ushr r2.xyzw, r2.xyzw, l(16, 16, 16, 16)
utof r2.xyzw, r2.xyzw
mul r2.xyzw, r2.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)
f32tof16 r3.xyzw, r3.xyzw
f32tof16 r2.xyzw, r2.xyzw
imad r2.xyzw, r2.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r3.xyzw
store_uav_typed U0[0].xyzw, r1.xxxx, r2.xyzw
ret
// Approximately 113 instruction slots used
#endif
const BYTE texture_load_r16_unorm_float_cs[] =
{
68, 88, 66, 67, 123, 10,
201, 118, 4, 125, 207, 228,
231, 50, 233, 244, 245, 16,
251, 18, 1, 0, 0, 0,
68, 19, 0, 0, 5, 0,
0, 0, 52, 0, 0, 0,
32, 4, 0, 0, 48, 4,
0, 0, 64, 4, 0, 0,
168, 18, 0, 0, 82, 68,
69, 70, 228, 3, 0, 0,
1, 0, 0, 0, 252, 0,
0, 0, 3, 0, 0, 0,
60, 0, 0, 0, 1, 5,
83, 67, 0, 5, 0, 0,
185, 3, 0, 0, 19, 19,
68, 37, 60, 0, 0, 0,
24, 0, 0, 0, 40, 0,
0, 0, 40, 0, 0, 0,
36, 0, 0, 0, 12, 0,
0, 0, 0, 0, 0, 0,
180, 0, 0, 0, 2, 0,
0, 0, 4, 0, 0, 0,
1, 0, 0, 0, 255, 255,
255, 255, 0, 0, 0, 0,
1, 0, 0, 0, 12, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 203, 0,
0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 1, 0,
0, 0, 255, 255, 255, 255,
0, 0, 0, 0, 1, 0,
0, 0, 12, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 224, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0,
1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
120, 101, 95, 116, 101, 120,
116, 117, 114, 101, 95, 108,
111, 97, 100, 95, 115, 111,
117, 114, 99, 101, 0, 120,
101, 95, 116, 101, 120, 116,
117, 114, 101, 95, 108, 111,
97, 100, 95, 100, 101, 115,
116, 0, 120, 101, 95, 116,
101, 120, 116, 117, 114, 101,
95, 108, 111, 97, 100, 95,
99, 111, 110, 115, 116, 97,
110, 116, 115, 0, 171, 171,
224, 0, 0, 0, 8, 0,
0, 0, 20, 1, 0, 0,
48, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
84, 2, 0, 0, 0, 0,
0, 0, 4, 0, 0, 0,
2, 0, 0, 0, 132, 2,
0, 0, 0, 0, 0, 0,
255, 255, 255, 255, 0, 0,
0, 0, 255, 255, 255, 255,
0, 0, 0, 0, 168, 2,
0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 2, 0,
0, 0, 132, 2, 0, 0,
0, 0, 0, 0, 255, 255,
255, 255, 0, 0, 0, 0,
255, 255, 255, 255, 0, 0,
0, 0, 197, 2, 0, 0,
8, 0, 0, 0, 4, 0,
0, 0, 2, 0, 0, 0,
132, 2, 0, 0, 0, 0,
0, 0, 255, 255, 255, 255,
0, 0, 0, 0, 255, 255,
255, 255, 0, 0, 0, 0,
233, 2, 0, 0, 12, 0,
0, 0, 4, 0, 0, 0,
2, 0, 0, 0, 132, 2,
0, 0, 0, 0, 0, 0,
255, 255, 255, 255, 0, 0,
0, 0, 255, 255, 255, 255,
0, 0, 0, 0, 27, 3,
0, 0, 16, 0, 0, 0,
12, 0, 0, 0, 2, 0,
0, 0, 64, 3, 0, 0,
0, 0, 0, 0, 255, 255,
255, 255, 0, 0, 0, 0,
255, 255, 255, 255, 0, 0,
0, 0, 100, 3, 0, 0,
28, 0, 0, 0, 4, 0,
0, 0, 2, 0, 0, 0,
132, 2, 0, 0, 0, 0,
0, 0, 255, 255, 255, 255,
0, 0, 0, 0, 255, 255,
255, 255, 0, 0, 0, 0,
128, 3, 0, 0, 32, 0,
0, 0, 4, 0, 0, 0,
2, 0, 0, 0, 132, 2,
0, 0, 0, 0, 0, 0,
255, 255, 255, 255, 0, 0,
0, 0, 255, 255, 255, 255,
0, 0, 0, 0, 155, 3,
0, 0, 36, 0, 0, 0,
4, 0, 0, 0, 0, 0,
0, 0, 132, 2, 0, 0,
0, 0, 0, 0, 255, 255,
255, 255, 0, 0, 0, 0,
255, 255, 255, 255, 0, 0,
0, 0, 120, 101, 95, 116,
101, 120, 116, 117, 114, 101,
95, 108, 111, 97, 100, 95,
105, 115, 95, 116, 105, 108,
101, 100, 95, 51, 100, 95,
101, 110, 100, 105, 97, 110,
95, 115, 99, 97, 108, 101,
0, 100, 119, 111, 114, 100,
0, 171, 0, 0, 19, 0,
1, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 125, 2,
0, 0, 120, 101, 95, 116,
101, 120, 116, 117, 114, 101,
95, 108, 111, 97, 100, 95,
103, 117, 101, 115, 116, 95,
111, 102, 102, 115, 101, 116,
0, 120, 101, 95, 116, 101,
120, 116, 117, 114, 101, 95,
108, 111, 97, 100, 95, 103,
117, 101, 115, 116, 95, 112,
105, 116, 99, 104, 95, 97,
108, 105, 103, 110, 101, 100,
0, 120, 101, 95, 116, 101,
120, 116, 117, 114, 101, 95,
108, 111, 97, 100, 95, 103,
117, 101, 115, 116, 95, 122,
95, 115, 116, 114, 105, 100,
101, 95, 98, 108, 111, 99,
107, 95, 114, 111, 119, 115,
95, 97, 108, 105, 103, 110,
101, 100, 0, 120, 101, 95,
116, 101, 120, 116, 117, 114,
101, 95, 108, 111, 97, 100,
95, 115, 105, 122, 101, 95,
98, 108, 111, 99, 107, 115,
0, 117, 105, 110, 116, 51,
0, 171, 171, 171, 1, 0,
19, 0, 1, 0, 3, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
55, 3, 0, 0, 120, 101,
95, 116, 101, 120, 116, 117,
114, 101, 95, 108, 111, 97,
100, 95, 104, 111, 115, 116,
95, 111, 102, 102, 115, 101,
116, 0, 120, 101, 95, 116,
101, 120, 116, 117, 114, 101,
95, 108, 111, 97, 100, 95,
104, 111, 115, 116, 95, 112,
105, 116, 99, 104, 0, 120,
101, 95, 116, 101, 120, 116,
117, 114, 101, 95, 108, 111,
97, 100, 95, 104, 101, 105,
103, 104, 116, 95, 116, 101,
120, 101, 108, 115, 0, 77,
105, 99, 114, 111, 115, 111,
102, 116, 32, 40, 82, 41,
32, 72, 76, 83, 76, 32,
83, 104, 97, 100, 101, 114,
32, 67, 111, 109, 112, 105,
108, 101, 114, 32, 49, 48,
46, 49, 0, 171, 171, 171,
73, 83, 71, 78, 8, 0,
0, 0, 0, 0, 0, 0,
8, 0, 0, 0, 79, 83,
71, 78, 8, 0, 0, 0,
0, 0, 0, 0, 8, 0,
0, 0, 83, 72, 69, 88,
96, 14, 0, 0, 81, 0,
5, 0, 152, 3, 0, 0,
106, 8, 0, 1, 89, 0,
0, 7, 70, 142, 48, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
3, 0, 0, 0, 0, 0,
0, 0, 88, 8, 0, 7,
70, 126, 48, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 68, 68,
0, 0, 0, 0, 0, 0,
156, 8, 0, 7, 70, 238,
49, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 68, 68, 0, 0,
0, 0, 0, 0, 95, 0,
0, 2, 114, 0, 2, 0,
104, 0, 0, 2, 5, 0,
0, 0, 155, 0, 0, 4,
2, 0, 0, 0, 32, 0,
0, 0, 1, 0, 0, 0,
41, 0, 0, 6, 18, 0,
16, 0, 0, 0, 0, 0,
10, 0, 2, 0, 1, 64,
0, 0, 4, 0, 0, 0,
54, 0, 0, 4, 34, 0,
16, 0, 0, 0, 0, 0,
26, 0, 2, 0, 80, 0,
0, 9, 98, 0, 16, 0,
0, 0, 0, 0, 6, 1,
16, 0, 0, 0, 0, 0,
6, 129, 48, 0, 0, 0,
0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 60, 0,
0, 7, 34, 0, 16, 0,
0, 0, 0, 0, 42, 0,
16, 0, 0, 0, 0, 0,
26, 0, 16, 0, 0, 0,
0, 0, 31, 0, 4, 3,
26, 0, 16, 0, 0, 0,
0, 0, 62, 0, 0, 1,
21, 0, 0, 1, 41, 0,
0, 7, 34, 0, 16, 0,
0, 0, 0, 0, 10, 0,
16, 0, 0, 0, 0, 0,
1, 64, 0, 0, 1, 0,
0, 0, 35, 0, 0, 9,
66, 0, 16, 0, 0, 0,
0, 0, 42, 0, 2, 0,
26, 128, 48, 0, 0, 0,
0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 26, 0,
2, 0, 35, 0, 0, 11,
66, 0, 16, 0, 0, 0,
0, 0, 42, 0, 16, 0,
0, 0, 0, 0, 10, 128,
48, 0, 0, 0, 0, 0,
0, 0, 0, 0, 2, 0,
0, 0, 26, 0, 16, 0,
0, 0, 0, 0, 30, 0,
0, 9, 66, 0, 16, 0,
0, 0, 0, 0, 42, 0,
16, 0, 0, 0, 0, 0,
58, 128, 48, 0, 0, 0,
0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 1, 0,
0, 9, 130, 0, 16, 0,
0, 0, 0, 0, 10, 128,
48, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 1, 64, 0, 0,
1, 0, 0, 0, 31, 0,
4, 3, 58, 0, 16, 0,
0, 0, 0, 0, 1, 0,
0, 9, 18, 0, 16, 0,
1, 0, 0, 0, 10, 128,
48, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 1, 64, 0, 0,
2, 0, 0, 0, 31, 0,
4, 3, 10, 0, 16, 0,
1, 0, 0, 0, 42, 0,
0, 9, 114, 0, 16, 0,
1, 0, 0, 0, 150, 5,
2, 0, 2, 64, 0, 0,
4, 0, 0, 0, 2, 0,
0, 0, 3, 0, 0, 0,
0, 0, 0, 0, 85, 0,
0, 12, 50, 0, 16, 0,
2, 0, 0, 0, 182, 143,
48, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 2, 64, 0, 0,
4, 0, 0, 0, 5, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 35, 0,
0, 9, 18, 0, 16, 0,
1, 0, 0, 0, 26, 0,
16, 0, 1, 0, 0, 0,
10, 0, 16, 0, 2, 0,
0, 0, 10, 0, 16, 0,
1, 0, 0, 0, 139, 0,
0, 8, 130, 0, 16, 0,
1, 0, 0, 0, 1, 64,
0, 0, 27, 0, 0, 0,
1, 64, 0, 0, 1, 0,
0, 0, 10, 0, 2, 0,
35, 0, 0, 9, 18, 0,
16, 0, 1, 0, 0, 0,
10, 0, 16, 0, 1, 0,
0, 0, 26, 0, 16, 0,
2, 0, 0, 0, 58, 0,
16, 0, 1, 0, 0, 0,
41, 0, 0, 6, 130, 0,
16, 0, 1, 0, 0, 0,
26, 0, 2, 0, 1, 64,
0, 0, 9, 0, 0, 0,
42, 0, 0, 7, 130, 0,
16, 0, 1, 0, 0, 0,
58, 0, 16, 0, 1, 0,
0, 0, 1, 64, 0, 0,
6, 0, 0, 0, 30, 0,
0, 7, 34, 0, 16, 0,
1, 0, 0, 0, 26, 0,
16, 0, 1, 0, 0, 0,
42, 0, 16, 0, 1, 0,
0, 0, 1, 0, 0, 10,
194, 0, 16, 0, 1, 0,
0, 0, 86, 13, 16, 0,
1, 0, 0, 0, 2, 64,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0,
0, 0, 48, 0, 0, 0,
42, 0, 0, 7, 18, 0,
16, 0, 2, 0, 0, 0,
10, 0, 16, 0, 0, 0,
0, 0, 1, 64, 0, 0,
3, 0, 0, 0, 140, 0,
0, 11, 34, 0, 16, 0,
1, 0, 0, 0, 1, 64,
0, 0, 1, 0, 0, 0,
1, 64, 0, 0, 1, 0,
0, 0, 26, 0, 16, 0,
1, 0, 0, 0, 1, 64,
0, 0, 0, 0, 0, 0,
30, 0, 0, 7, 34, 0,
16, 0, 1, 0, 0, 0,
26, 0, 16, 0, 1, 0,
0, 0, 10, 0, 16, 0,
2, 0, 0, 0, 140, 0,
0, 11, 34, 0, 16, 0,
1, 0, 0, 0, 1, 64,
0, 0, 2, 0, 0, 0,
1, 64, 0, 0, 1, 0,
0, 0, 26, 0, 16, 0,
1, 0, 0, 0, 1, 64,
0, 0, 0, 0, 0, 0,
30, 0, 0, 7, 34, 0,
16, 0, 1, 0, 0, 0,
26, 0, 16, 0, 1, 0,
0, 0, 42, 0, 16, 0,
1, 0, 0, 0, 140, 0,
0, 20, 82, 0, 16, 0,
1, 0, 0, 0, 2, 64,
0, 0, 21, 0, 0, 0,
0, 0, 0, 0, 21, 0,
0, 0, 0, 0, 0, 0,
2, 64, 0, 0, 9, 0,
0, 0, 0, 0, 0, 0,
12, 0, 0, 0, 0, 0,
0, 0, 6, 0, 16, 0,
1, 0, 0, 0, 2, 64,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
35, 0, 0, 12, 82, 0,
16, 0, 1, 0, 0, 0,
246, 15, 16, 0, 1, 0,
0, 0, 2, 64, 0, 0,
2, 0, 0, 0, 0, 0,
0, 0, 16, 0, 0, 0,
0, 0, 0, 0, 6, 2,
16, 0, 1, 0, 0, 0,
140, 0, 0, 16, 82, 0,
16, 0, 1, 0, 0, 0,
2, 64, 0, 0, 2, 0,
0, 0, 0, 0, 0, 0,
2, 0, 0, 0, 0, 0,
0, 0, 2, 64, 0, 0,
7, 0, 0, 0, 0, 0,
0, 0, 10, 0, 0, 0,
0, 0, 0, 0, 166, 10,
2, 0, 6, 2, 16, 0,
1, 0, 0, 0, 140, 0,
0, 10, 130, 0, 16, 0,
1, 0, 0, 0, 1, 64,
0, 0, 1, 0, 0, 0,
1, 64, 0, 0, 4, 0,
0, 0, 26, 0, 2, 0,
1, 64, 0, 0, 0, 0,
0, 0, 138, 0, 0, 9,
18, 0, 16, 0, 2, 0,
0, 0, 1, 64, 0, 0,
3, 0, 0, 0, 1, 64,
0, 0, 6, 0, 0, 0,
10, 0, 16, 0, 1, 0,
0, 0, 1, 0, 0, 7,
34, 0, 16, 0, 2, 0,
0, 0, 26, 0, 16, 0,
1, 0, 0, 0, 1, 64,
0, 0, 4, 0, 0, 0,
140, 0, 0, 11, 34, 0,
16, 0, 1, 0, 0, 0,
1, 64, 0, 0, 2, 0,
0, 0, 1, 64, 0, 0,
8, 0, 0, 0, 26, 0,
16, 0, 1, 0, 0, 0,
1, 64, 0, 0, 0, 0,
0, 0, 35, 0, 0, 9,
34, 0, 16, 0, 1, 0,
0, 0, 10, 0, 16, 0,
2, 0, 0, 0, 1, 64,
0, 0, 32, 0, 0, 0,
26, 0, 16, 0, 1, 0,
0, 0, 35, 0, 0, 9,
34, 0, 16, 0, 1, 0,
0, 0, 26, 0, 16, 0,
2, 0, 0, 0, 1, 64,
0, 0, 4, 0, 0, 0,
26, 0, 16, 0, 1, 0,
0, 0, 140, 0, 0, 17,
82, 0, 16, 0, 1, 0,
0, 0, 2, 64, 0, 0,
5, 0, 0, 0, 0, 0,
0, 0, 5, 0, 0, 0,
0, 0, 0, 0, 2, 64,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 3, 0,
0, 0, 0, 0, 0, 0,
246, 15, 16, 0, 1, 0,
0, 0, 6, 2, 16, 0,
1, 0, 0, 0, 140, 0,
0, 11, 34, 0, 16, 0,
1, 0, 0, 0, 1, 64,
0, 0, 9, 0, 0, 0,
1, 64, 0, 0, 3, 0,
0, 0, 26, 0, 16, 0,
1, 0, 0, 0, 42, 0,
16, 0, 1, 0, 0, 0,
140, 0, 0, 11, 18, 0,
16, 0, 1, 0, 0, 0,
1, 64, 0, 0, 6, 0,
0, 0, 1, 64, 0, 0,
0, 0, 0, 0, 10, 0,
16, 0, 1, 0, 0, 0,
26, 0, 16, 0, 1, 0,
0, 0, 18, 0, 0, 1,
139, 0, 0, 8, 34, 0,
16, 0, 1, 0, 0, 0,
1, 64, 0, 0, 27, 0,
0, 0, 1, 64, 0, 0,
1, 0, 0, 0, 10, 0,
2, 0, 42, 0, 0, 9,
194, 0, 16, 0, 1, 0,
0, 0, 86, 5, 2, 0,
2, 64, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
5, 0, 0, 0, 2, 0,
0, 0, 85, 0, 0, 9,
18, 0, 16, 0, 2, 0,
0, 0, 42, 128, 48, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
1, 64, 0, 0, 5, 0,
0, 0, 35, 0, 0, 9,
34, 0, 16, 0, 1, 0,
0, 0, 42, 0, 16, 0,
1, 0, 0, 0, 10, 0,
16, 0, 2, 0, 0, 0,
26, 0, 16, 0, 1, 0,
0, 0, 140, 0, 0, 19,
114, 0, 16, 0, 2, 0,
0, 0, 2, 64, 0, 0,
4, 0, 0, 0, 4, 0,
0, 0, 4, 0, 0, 0,
0, 0, 0, 0, 2, 64,
0, 0, 4, 0, 0, 0,
7, 0, 0, 0, 6, 0,
0, 0, 0, 0, 0, 0,
86, 5, 2, 0, 2, 64,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
140, 0, 0, 17, 114, 0,
16, 0, 2, 0, 0, 0,
2, 64, 0, 0, 24, 0,
0, 0, 24, 0, 0, 0,
24, 0, 0, 0, 0, 0,
0, 0, 2, 64, 0, 0,
8, 0, 0, 0, 11, 0,
0, 0, 10, 0, 0, 0,
0, 0, 0, 0, 86, 5,
16, 0, 1, 0, 0, 0,
70, 2, 16, 0, 2, 0,
0, 0, 41, 0, 0, 6,
34, 0, 16, 0, 1, 0,
0, 0, 26, 0, 2, 0,
1, 64, 0, 0, 7, 0,
0, 0, 1, 0, 0, 7,
34, 0, 16, 0, 1, 0,
0, 0, 26, 0, 16, 0,
1, 0, 0, 0, 1, 64,
0, 0, 0, 8, 0, 0,
140, 0, 0, 11, 34, 0,
16, 0, 1, 0, 0, 0,
1, 64, 0, 0, 12, 0,
0, 0, 1, 64, 0, 0,
0, 0, 0, 0, 26, 0,
16, 0, 1, 0, 0, 0,
26, 0, 16, 0, 2, 0,
0, 0, 1, 0, 0, 7,
66, 0, 16, 0, 1, 0,
0, 0, 42, 0, 16, 0,
2, 0, 0, 0, 1, 64,
0, 0, 0, 7, 0, 0,
30, 0, 0, 7, 34, 0,
16, 0, 1, 0, 0, 0,
26, 0, 16, 0, 1, 0,
0, 0, 42, 0, 16, 0,
1, 0, 0, 0, 1, 0,
0, 7, 66, 0, 16, 0,
1, 0, 0, 0, 58, 0,
16, 0, 1, 0, 0, 0,
1, 64, 0, 0, 2, 0,
0, 0, 42, 0, 0, 7,
18, 0, 16, 0, 0, 0,
0, 0, 10, 0, 16, 0,
0, 0, 0, 0, 1, 64,
0, 0, 3, 0, 0, 0,
30, 0, 0, 7, 18, 0,
16, 0, 0, 0, 0, 0,
10, 0, 16, 0, 0, 0,
0, 0, 42, 0, 16, 0,
1, 0, 0, 0, 140, 0,
0, 11, 18, 0, 16, 0,
0, 0, 0, 0, 1, 64,
0, 0, 2, 0, 0, 0,
1, 64, 0, 0, 6, 0,
0, 0, 10, 0, 16, 0,
0, 0, 0, 0, 1, 64,
0, 0, 0, 0, 0, 0,
30, 0, 0, 7, 18, 0,
16, 0, 0, 0, 0, 0,
26, 0, 16, 0, 1, 0,
0, 0, 10, 0, 16, 0,
0, 0, 0, 0, 140, 0,
0, 11, 18, 0, 16, 0,
1, 0, 0, 0, 1, 64,
0, 0, 6, 0, 0, 0,
1, 64, 0, 0, 0, 0,
0, 0, 10, 0, 16, 0,
2, 0, 0, 0, 10, 0,
16, 0, 0, 0, 0, 0,
21, 0, 0, 1, 18, 0,
0, 1, 35, 0, 0, 9,
18, 0, 16, 0, 0, 0,
0, 0, 42, 0, 2, 0,
58, 128, 48, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 26, 0,
2, 0, 35, 0, 0, 11,
18, 0, 16, 0, 1, 0,
0, 0, 10, 0, 16, 0,
0, 0, 0, 0, 42, 128,
48, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 26, 0, 16, 0,
0, 0, 0, 0, 21, 0,
0, 1, 30, 0, 0, 9,
18, 0, 16, 0, 0, 0,
0, 0, 10, 0, 16, 0,
1, 0, 0, 0, 26, 128,
48, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 85, 0, 0, 10,
82, 0, 16, 0, 0, 0,
0, 0, 6, 2, 16, 0,
0, 0, 0, 0, 2, 64,
0, 0, 4, 0, 0, 0,
0, 0, 0, 0, 4, 0,
0, 0, 0, 0, 0, 0,
138, 0, 0, 11, 34, 0,
16, 0, 0, 0, 0, 0,
1, 64, 0, 0, 2, 0,
0, 0, 1, 64, 0, 0,
2, 0, 0, 0, 10, 128,
48, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 45, 0, 0, 8,
242, 0, 16, 0, 1, 0,
0, 0, 6, 0, 16, 0,
0, 0, 0, 0, 70, 126,
32, 0, 0, 0, 0, 0,
0, 0, 0, 0, 32, 0,
0, 7, 34, 0, 16, 0,
0, 0, 0, 0, 26, 0,
16, 0, 0, 0, 0, 0,
1, 64, 0, 0, 1, 0,
0, 0, 31, 0, 4, 3,
26, 0, 16, 0, 0, 0,
0, 0, 41, 0, 0, 10,
242, 0, 16, 0, 2, 0,
0, 0, 70, 14, 16, 0,
1, 0, 0, 0, 2, 64,
0, 0, 8, 0, 0, 0,
8, 0, 0, 0, 8, 0,
0, 0, 8, 0, 0, 0,
1, 0, 0, 10, 242, 0,
16, 0, 2, 0, 0, 0,
70, 14, 16, 0, 2, 0,
0, 0, 2, 64, 0, 0,
0, 255, 0, 255, 0, 255,
0, 255, 0, 255, 0, 255,
0, 255, 0, 255, 85, 0,
0, 10, 242, 0, 16, 0,
3, 0, 0, 0, 70, 14,
16, 0, 1, 0, 0, 0,
2, 64, 0, 0, 8, 0,
0, 0, 8, 0, 0, 0,
8, 0, 0, 0, 8, 0,
0, 0, 1, 0, 0, 10,
242, 0, 16, 0, 3, 0,
0, 0, 70, 14, 16, 0,
3, 0, 0, 0, 2, 64,
0, 0, 255, 0, 255, 0,
255, 0, 255, 0, 255, 0,
255, 0, 255, 0, 255, 0,
30, 0, 0, 7, 242, 0,
16, 0, 1, 0, 0, 0,
70, 14, 16, 0, 2, 0,
0, 0, 70, 14, 16, 0,
3, 0, 0, 0, 21, 0,
0, 1, 1, 0, 0, 10,
242, 0, 16, 0, 2, 0,
0, 0, 70, 14, 16, 0,
1, 0, 0, 0, 2, 64,
0, 0, 255, 255, 0, 0,
255, 255, 0, 0, 255, 255,
0, 0, 255, 255, 0, 0,
86, 0, 0, 5, 242, 0,
16, 0, 2, 0, 0, 0,
70, 14, 16, 0, 2, 0,
0, 0, 56, 0, 0, 10,
242, 0, 16, 0, 2, 0,
0, 0, 70, 14, 16, 0,
2, 0, 0, 0, 2, 64,
0, 0, 128, 0, 128, 55,
128, 0, 128, 55, 128, 0,
128, 55, 128, 0, 128, 55,
85, 0, 0, 10, 242, 0,
16, 0, 1, 0, 0, 0,
70, 14, 16, 0, 1, 0,
0, 0, 2, 64, 0, 0,
16, 0, 0, 0, 16, 0,
0, 0, 16, 0, 0, 0,
16, 0, 0, 0, 86, 0,
0, 5, 242, 0, 16, 0,
1, 0, 0, 0, 70, 14,
16, 0, 1, 0, 0, 0,
56, 0, 0, 10, 242, 0,
16, 0, 1, 0, 0, 0,
70, 14, 16, 0, 1, 0,
0, 0, 2, 64, 0, 0,
128, 0, 128, 55, 128, 0,
128, 55, 128, 0, 128, 55,
128, 0, 128, 55, 130, 0,
0, 5, 242, 0, 16, 0,
2, 0, 0, 0, 70, 14,
16, 0, 2, 0, 0, 0,
130, 0, 0, 5, 242, 0,
16, 0, 1, 0, 0, 0,
70, 14, 16, 0, 1, 0,
0, 0, 35, 0, 0, 12,
242, 0, 16, 0, 1, 0,
0, 0, 70, 14, 16, 0,
1, 0, 0, 0, 2, 64,
0, 0, 0, 0, 1, 0,
0, 0, 1, 0, 0, 0,
1, 0, 0, 0, 1, 0,
70, 14, 16, 0, 2, 0,
0, 0, 164, 0, 0, 8,
242, 224, 33, 0, 0, 0,
0, 0, 0, 0, 0, 0,
166, 10, 16, 0, 0, 0,
0, 0, 70, 14, 16, 0,
1, 0, 0, 0, 30, 0,
0, 7, 18, 0, 16, 0,
1, 0, 0, 0, 42, 0,
16, 0, 0, 0, 0, 0,
1, 64, 0, 0, 1, 0,
0, 0, 31, 0, 4, 3,
58, 0, 16, 0, 0, 0,
0, 0, 54, 0, 0, 5,
130, 0, 16, 0, 0, 0,
0, 0, 1, 64, 0, 0,
64, 0, 0, 0, 18, 0,
0, 1, 54, 0, 0, 5,
130, 0, 16, 0, 0, 0,
0, 0, 1, 64, 0, 0,
16, 0, 0, 0, 21, 0,
0, 1, 85, 0, 0, 7,
130, 0, 16, 0, 0, 0,
0, 0, 58, 0, 16, 0,
0, 0, 0, 0, 1, 64,
0, 0, 4, 0, 0, 0,
30, 0, 0, 7, 18, 0,
16, 0, 0, 0, 0, 0,
58, 0, 16, 0, 0, 0,
0, 0, 10, 0, 16, 0,
0, 0, 0, 0, 45, 0,
0, 8, 242, 0, 16, 0,
2, 0, 0, 0, 6, 0,
16, 0, 0, 0, 0, 0,
70, 126, 32, 0, 0, 0,
0, 0, 0, 0, 0, 0,
31, 0, 4, 3, 26, 0,
16, 0, 0, 0, 0, 0,
41, 0, 0, 10, 242, 0,
16, 0, 3, 0, 0, 0,
70, 14, 16, 0, 2, 0,
0, 0, 2, 64, 0, 0,
8, 0, 0, 0, 8, 0,
0, 0, 8, 0, 0, 0,
8, 0, 0, 0, 1, 0,
0, 10, 242, 0, 16, 0,
3, 0, 0, 0, 70, 14,
16, 0, 3, 0, 0, 0,
2, 64, 0, 0, 0, 255,
0, 255, 0, 255, 0, 255,
0, 255, 0, 255, 0, 255,
0, 255, 85, 0, 0, 10,
242, 0, 16, 0, 4, 0,
0, 0, 70, 14, 16, 0,
2, 0, 0, 0, 2, 64,
0, 0, 8, 0, 0, 0,
8, 0, 0, 0, 8, 0,
0, 0, 8, 0, 0, 0,
1, 0, 0, 10, 242, 0,
16, 0, 4, 0, 0, 0,
70, 14, 16, 0, 4, 0,
0, 0, 2, 64, 0, 0,
255, 0, 255, 0, 255, 0,
255, 0, 255, 0, 255, 0,
255, 0, 255, 0, 30, 0,
0, 7, 242, 0, 16, 0,
2, 0, 0, 0, 70, 14,
16, 0, 3, 0, 0, 0,
70, 14, 16, 0, 4, 0,
0, 0, 21, 0, 0, 1,
1, 0, 0, 10, 242, 0,
16, 0, 3, 0, 0, 0,
70, 14, 16, 0, 2, 0,
0, 0, 2, 64, 0, 0,
255, 255, 0, 0, 255, 255,
0, 0, 255, 255, 0, 0,
255, 255, 0, 0, 86, 0,
0, 5, 242, 0, 16, 0,
3, 0, 0, 0, 70, 14,
16, 0, 3, 0, 0, 0,
56, 0, 0, 10, 242, 0,
16, 0, 3, 0, 0, 0,
70, 14, 16, 0, 3, 0,
0, 0, 2, 64, 0, 0,
128, 0, 128, 55, 128, 0,
128, 55, 128, 0, 128, 55,
128, 0, 128, 55, 85, 0,
0, 10, 242, 0, 16, 0,
2, 0, 0, 0, 70, 14,
16, 0, 2, 0, 0, 0,
2, 64, 0, 0, 16, 0,
0, 0, 16, 0, 0, 0,
16, 0, 0, 0, 16, 0,
0, 0, 86, 0, 0, 5,
242, 0, 16, 0, 2, 0,
0, 0, 70, 14, 16, 0,
2, 0, 0, 0, 56, 0,
0, 10, 242, 0, 16, 0,
2, 0, 0, 0, 70, 14,
16, 0, 2, 0, 0, 0,
2, 64, 0, 0, 128, 0,
128, 55, 128, 0, 128, 55,
128, 0, 128, 55, 128, 0,
128, 55, 130, 0, 0, 5,
242, 0, 16, 0, 3, 0,
0, 0, 70, 14, 16, 0,
3, 0, 0, 0, 130, 0,
0, 5, 242, 0, 16, 0,
2, 0, 0, 0, 70, 14,
16, 0, 2, 0, 0, 0,
35, 0, 0, 12, 242, 0,
16, 0, 2, 0, 0, 0,
70, 14, 16, 0, 2, 0,
0, 0, 2, 64, 0, 0,
0, 0, 1, 0, 0, 0,
1, 0, 0, 0, 1, 0,
0, 0, 1, 0, 70, 14,
16, 0, 3, 0, 0, 0,
164, 0, 0, 8, 242, 224,
33, 0, 0, 0, 0, 0,
0, 0, 0, 0, 6, 0,
16, 0, 1, 0, 0, 0,
70, 14, 16, 0, 2, 0,
0, 0, 62, 0, 0, 1,
83, 84, 65, 84, 148, 0,
0, 0, 113, 0, 0, 0,
5, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0,
4, 0, 0, 0, 36, 0,
0, 0, 23, 0, 0, 0,
5, 0, 0, 0, 6, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 2, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
3, 0, 0, 0, 0, 0,
0, 0, 4, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 2, 0, 0, 0
};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,664 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 10
; Bound: 25179
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %5663 "main" %gl_GlobalInvocationID
OpExecutionMode %5663 LocalSize 2 32 1
OpMemberDecorate %_struct_1161 0 Offset 0
OpMemberDecorate %_struct_1161 1 Offset 4
OpMemberDecorate %_struct_1161 2 Offset 8
OpMemberDecorate %_struct_1161 3 Offset 12
OpMemberDecorate %_struct_1161 4 Offset 16
OpMemberDecorate %_struct_1161 5 Offset 28
OpMemberDecorate %_struct_1161 6 Offset 32
OpMemberDecorate %_struct_1161 7 Offset 36
OpDecorate %_struct_1161 Block
OpDecorate %5245 DescriptorSet 2
OpDecorate %5245 Binding 0
OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
OpDecorate %_runtimearr_v4uint ArrayStride 16
OpMemberDecorate %_struct_1972 0 NonReadable
OpMemberDecorate %_struct_1972 0 Offset 0
OpDecorate %_struct_1972 BufferBlock
OpDecorate %5134 DescriptorSet 0
OpDecorate %5134 Binding 0
OpDecorate %_runtimearr_v4uint_0 ArrayStride 16
OpMemberDecorate %_struct_1973 0 NonWritable
OpMemberDecorate %_struct_1973 0 Offset 0
OpDecorate %_struct_1973 BufferBlock
OpDecorate %4218 DescriptorSet 1
OpDecorate %4218 Binding 0
OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%v4uint = OpTypeVector %uint 4
%int = OpTypeInt 32 1
%v2int = OpTypeVector %int 2
%v3int = OpTypeVector %int 3
%bool = OpTypeBool
%v3uint = OpTypeVector %uint 3
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%float_n1 = OpConstant %float -1
%1284 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1
%v4int = OpTypeVector %int 4
%int_16 = OpConstant %int 16
%float_3_05185094en05 = OpConstant %float 3.05185094e-05
%uint_0 = OpConstant %uint 0
%v2float = OpTypeVector %float 2
%uint_1 = OpConstant %uint 1
%uint_2 = OpConstant %uint 2
%uint_3 = OpConstant %uint 3
%uint_16711935 = OpConstant %uint 16711935
%uint_8 = OpConstant %uint 8
%uint_4278255360 = OpConstant %uint 4278255360
%int_5 = OpConstant %int 5
%uint_5 = OpConstant %uint 5
%uint_7 = OpConstant %uint 7
%int_7 = OpConstant %int 7
%int_14 = OpConstant %int 14
%int_2 = OpConstant %int 2
%int_n16 = OpConstant %int -16
%int_1 = OpConstant %int 1
%int_15 = OpConstant %int 15
%int_4 = OpConstant %int 4
%int_n512 = OpConstant %int -512
%int_3 = OpConstant %int 3
%int_448 = OpConstant %int 448
%int_8 = OpConstant %int 8
%int_6 = OpConstant %int 6
%int_63 = OpConstant %int 63
%uint_4 = OpConstant %uint 4
%int_268435455 = OpConstant %int 268435455
%int_n2 = OpConstant %int -2
%uint_32 = OpConstant %uint 32
%uint_64 = OpConstant %uint 64
%_struct_1161 = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint
%_ptr_Uniform__struct_1161 = OpTypePointer Uniform %_struct_1161
%5245 = OpVariable %_ptr_Uniform__struct_1161 Uniform
%int_0 = OpConstant %int 0
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
%v2uint = OpTypeVector %uint 2
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
%2612 = OpConstantComposite %v3uint %uint_4 %uint_0 %uint_0
%v2bool = OpTypeVector %bool 2
%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint
%_struct_1972 = OpTypeStruct %_runtimearr_v4uint
%_ptr_Uniform__struct_1972 = OpTypePointer Uniform %_struct_1972
%5134 = OpVariable %_ptr_Uniform__struct_1972 Uniform
%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint
%_struct_1973 = OpTypeStruct %_runtimearr_v4uint_0
%_ptr_Uniform__struct_1973 = OpTypePointer Uniform %_struct_1973
%4218 = OpVariable %_ptr_Uniform__struct_1973 Uniform
%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_2 %uint_32 %uint_1
%2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935
%317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8
%1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360
%770 = OpConstantComposite %v4int %int_16 %int_16 %int_16 %int_16
%uint_16 = OpConstant %uint 16
%5663 = OpFunction %void None %1282
%15110 = OpLabel
OpSelectionMerge %19578 None
OpSwitch %uint_0 %15137
%15137 = OpLabel
%12591 = OpLoad %v3uint %gl_GlobalInvocationID
%10229 = OpShiftLeftLogical %v3uint %12591 %2612
%25178 = OpAccessChain %_ptr_Uniform_v3uint %5245 %int_4
%22965 = OpLoad %v3uint %25178
%18835 = OpVectorShuffle %v2uint %10229 %10229 0 1
%6626 = OpVectorShuffle %v2uint %22965 %22965 0 1
%17032 = OpUGreaterThanEqual %v2bool %18835 %6626
%24679 = OpAny %bool %17032
OpSelectionMerge %6282 DontFlatten
OpBranchConditional %24679 %21992 %6282
%21992 = OpLabel
OpBranch %19578
%6282 = OpLabel
%6795 = OpBitcast %v3int %10229
%18792 = OpAccessChain %_ptr_Uniform_uint %5245 %int_6
%9788 = OpLoad %uint %18792
%20376 = OpCompositeExtract %uint %22965 1
%14692 = OpCompositeExtract %int %6795 0
%22810 = OpIMul %int %14692 %int_2
%6362 = OpCompositeExtract %int %6795 2
%14505 = OpBitcast %int %20376
%11279 = OpIMul %int %6362 %14505
%17598 = OpCompositeExtract %int %6795 1
%22228 = OpIAdd %int %11279 %17598
%22405 = OpBitcast %int %9788
%24535 = OpIMul %int %22228 %22405
%7061 = OpIAdd %int %22810 %24535
%19270 = OpBitcast %uint %7061
%19460 = OpAccessChain %_ptr_Uniform_uint %5245 %int_5
%22875 = OpLoad %uint %19460
%8517 = OpIAdd %uint %19270 %22875
%21670 = OpShiftRightLogical %uint %8517 %uint_4
%20950 = OpAccessChain %_ptr_Uniform_uint %5245 %int_0
%21411 = OpLoad %uint %20950
%6381 = OpBitwiseAnd %uint %21411 %uint_1
%10467 = OpINotEqual %bool %6381 %uint_0
OpSelectionMerge %23266 DontFlatten
OpBranchConditional %10467 %10108 %10765
%10108 = OpLabel
%23508 = OpBitwiseAnd %uint %21411 %uint_2
%16300 = OpINotEqual %bool %23508 %uint_0
OpSelectionMerge %7691 DontFlatten
OpBranchConditional %16300 %12129 %25128
%12129 = OpLabel
%18210 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%15627 = OpLoad %uint %18210
%22624 = OpAccessChain %_ptr_Uniform_uint %5245 %int_3
%21535 = OpLoad %uint %22624
%14923 = OpShiftRightArithmetic %int %17598 %int_4
%18773 = OpShiftRightArithmetic %int %6362 %int_2
%18759 = OpShiftRightLogical %uint %21535 %uint_4
%6314 = OpBitcast %int %18759
%21281 = OpIMul %int %18773 %6314
%15143 = OpIAdd %int %14923 %21281
%9032 = OpShiftRightLogical %uint %15627 %uint_5
%14593 = OpBitcast %int %9032
%8436 = OpIMul %int %15143 %14593
%12986 = OpShiftRightArithmetic %int %14692 %int_5
%24558 = OpIAdd %int %12986 %8436
%8797 = OpShiftLeftLogical %int %24558 %uint_7
%11510 = OpBitwiseAnd %int %8797 %int_268435455
%18938 = OpShiftLeftLogical %int %11510 %int_1
%19768 = OpBitwiseAnd %int %14692 %int_7
%12600 = OpBitwiseAnd %int %17598 %int_6
%17741 = OpShiftLeftLogical %int %12600 %int_2
%17227 = OpIAdd %int %19768 %17741
%7048 = OpShiftLeftLogical %int %17227 %uint_7
%24035 = OpShiftRightArithmetic %int %7048 %int_6
%8725 = OpShiftRightArithmetic %int %17598 %int_3
%13731 = OpIAdd %int %8725 %18773
%23052 = OpBitwiseAnd %int %13731 %int_1
%16658 = OpShiftRightArithmetic %int %14692 %int_3
%18794 = OpShiftLeftLogical %int %23052 %int_1
%13501 = OpIAdd %int %16658 %18794
%19165 = OpBitwiseAnd %int %13501 %int_3
%21578 = OpShiftLeftLogical %int %19165 %int_1
%15435 = OpIAdd %int %23052 %21578
%13150 = OpBitwiseAnd %int %24035 %int_n16
%20336 = OpIAdd %int %18938 %13150
%23345 = OpShiftLeftLogical %int %20336 %int_1
%23274 = OpBitwiseAnd %int %24035 %int_15
%10332 = OpIAdd %int %23345 %23274
%18356 = OpBitwiseAnd %int %6362 %int_3
%21579 = OpShiftLeftLogical %int %18356 %uint_7
%16727 = OpIAdd %int %10332 %21579
%19166 = OpBitwiseAnd %int %17598 %int_1
%21580 = OpShiftLeftLogical %int %19166 %int_4
%16728 = OpIAdd %int %16727 %21580
%20438 = OpBitwiseAnd %int %15435 %int_1
%9987 = OpShiftLeftLogical %int %20438 %int_3
%13106 = OpShiftRightArithmetic %int %16728 %int_6
%14038 = OpBitwiseAnd %int %13106 %int_7
%13330 = OpIAdd %int %9987 %14038
%23346 = OpShiftLeftLogical %int %13330 %int_3
%23217 = OpBitwiseAnd %int %15435 %int_n2
%10908 = OpIAdd %int %23346 %23217
%23347 = OpShiftLeftLogical %int %10908 %int_2
%23218 = OpBitwiseAnd %int %16728 %int_n512
%10909 = OpIAdd %int %23347 %23218
%23348 = OpShiftLeftLogical %int %10909 %int_3
%24224 = OpBitwiseAnd %int %16728 %int_63
%21741 = OpIAdd %int %23348 %24224
OpBranch %7691
%25128 = OpLabel
%6796 = OpBitcast %v2int %18835
%18793 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%11954 = OpLoad %uint %18793
%18756 = OpCompositeExtract %int %6796 0
%19701 = OpShiftRightArithmetic %int %18756 %int_5
%10055 = OpCompositeExtract %int %6796 1
%16476 = OpShiftRightArithmetic %int %10055 %int_5
%23373 = OpShiftRightLogical %uint %11954 %uint_5
%6315 = OpBitcast %int %23373
%21319 = OpIMul %int %16476 %6315
%16222 = OpIAdd %int %19701 %21319
%19086 = OpShiftLeftLogical %int %16222 %uint_8
%10934 = OpBitwiseAnd %int %18756 %int_7
%12601 = OpBitwiseAnd %int %10055 %int_14
%17742 = OpShiftLeftLogical %int %12601 %int_2
%17303 = OpIAdd %int %10934 %17742
%6375 = OpShiftLeftLogical %int %17303 %uint_1
%10161 = OpBitwiseAnd %int %6375 %int_n16
%12150 = OpShiftLeftLogical %int %10161 %int_1
%15436 = OpIAdd %int %19086 %12150
%13207 = OpBitwiseAnd %int %6375 %int_15
%19760 = OpIAdd %int %15436 %13207
%18357 = OpBitwiseAnd %int %10055 %int_1
%21581 = OpShiftLeftLogical %int %18357 %int_4
%16729 = OpIAdd %int %19760 %21581
%20514 = OpBitwiseAnd %int %16729 %int_n512
%9238 = OpShiftLeftLogical %int %20514 %int_3
%18995 = OpBitwiseAnd %int %10055 %int_16
%12151 = OpShiftLeftLogical %int %18995 %int_7
%16730 = OpIAdd %int %9238 %12151
%19167 = OpBitwiseAnd %int %16729 %int_448
%21582 = OpShiftLeftLogical %int %19167 %int_2
%16708 = OpIAdd %int %16730 %21582
%20611 = OpBitwiseAnd %int %10055 %int_8
%16831 = OpShiftRightArithmetic %int %20611 %int_2
%7916 = OpShiftRightArithmetic %int %18756 %int_3
%13750 = OpIAdd %int %16831 %7916
%21587 = OpBitwiseAnd %int %13750 %int_3
%21583 = OpShiftLeftLogical %int %21587 %int_6
%15437 = OpIAdd %int %16708 %21583
%14157 = OpBitwiseAnd %int %16729 %int_63
%12098 = OpIAdd %int %15437 %14157
OpBranch %7691
%7691 = OpLabel
%10540 = OpPhi %int %21741 %12129 %12098 %25128
OpBranch %23266
%10765 = OpLabel
%20632 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%15628 = OpLoad %uint %20632
%21275 = OpAccessChain %_ptr_Uniform_uint %5245 %int_3
%13550 = OpLoad %uint %21275
%15070 = OpBitcast %int %13550
%18927 = OpIMul %int %6362 %15070
%8334 = OpIAdd %int %18927 %17598
%8952 = OpBitcast %int %15628
%7839 = OpIMul %int %8334 %8952
%7984 = OpIAdd %int %22810 %7839
OpBranch %23266
%23266 = OpLabel
%19748 = OpPhi %int %10540 %7691 %7984 %10765
%24922 = OpAccessChain %_ptr_Uniform_uint %5245 %int_1
%7502 = OpLoad %uint %24922
%15686 = OpBitcast %int %7502
%15579 = OpIAdd %int %15686 %19748
%18556 = OpBitcast %uint %15579
%21493 = OpShiftRightLogical %uint %18556 %uint_4
%14997 = OpShiftRightLogical %uint %21411 %uint_2
%8394 = OpBitwiseAnd %uint %14997 %uint_3
%20727 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %21493
%9605 = OpLoad %v4uint %20727
%21106 = OpIEqual %bool %8394 %uint_1
OpSelectionMerge %12537 None
OpBranchConditional %21106 %10583 %12537
%10583 = OpLabel
%18271 = OpBitwiseAnd %v4uint %9605 %2510
%9425 = OpShiftLeftLogical %v4uint %18271 %317
%20652 = OpBitwiseAnd %v4uint %9605 %1838
%17549 = OpShiftRightLogical %v4uint %20652 %317
%16376 = OpBitwiseOr %v4uint %9425 %17549
OpBranch %12537
%12537 = OpLabel
%12106 = OpPhi %v4uint %9605 %23266 %16376 %10583
%15375 = OpBitcast %v4int %12106
%16910 = OpShiftLeftLogical %v4int %15375 %770
%16536 = OpShiftRightArithmetic %v4int %16910 %770
%10903 = OpConvertSToF %v4float %16536
%20413 = OpVectorTimesScalar %v4float %10903 %float_3_05185094en05
%23989 = OpExtInst %v4float %1 FMax %1284 %20413
%14338 = OpShiftRightArithmetic %v4int %15375 %770
%6607 = OpConvertSToF %v4float %14338
%18247 = OpVectorTimesScalar %v4float %6607 %float_3_05185094en05
%24070 = OpExtInst %v4float %1 FMax %1284 %18247
%24330 = OpCompositeExtract %float %23989 0
%14319 = OpCompositeExtract %float %24070 0
%19232 = OpCompositeConstruct %v2float %24330 %14319
%8561 = OpExtInst %uint %1 PackHalf2x16 %19232
%23487 = OpCompositeExtract %float %23989 1
%14759 = OpCompositeExtract %float %24070 1
%19233 = OpCompositeConstruct %v2float %23487 %14759
%8562 = OpExtInst %uint %1 PackHalf2x16 %19233
%23488 = OpCompositeExtract %float %23989 2
%14760 = OpCompositeExtract %float %24070 2
%19234 = OpCompositeConstruct %v2float %23488 %14760
%8563 = OpExtInst %uint %1 PackHalf2x16 %19234
%23489 = OpCompositeExtract %float %23989 3
%14761 = OpCompositeExtract %float %24070 3
%19213 = OpCompositeConstruct %v2float %23489 %14761
%8430 = OpExtInst %uint %1 PackHalf2x16 %19213
%15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430
%17859 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %21670
OpStore %17859 %15035
%15044 = OpIAdd %uint %21670 %int_1
%18776 = OpSelect %uint %10467 %uint_64 %uint_16
%11803 = OpShiftRightLogical %uint %18776 %uint_4
%13947 = OpIAdd %uint %21493 %11803
%22298 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %13947
%6578 = OpLoad %v4uint %22298
OpSelectionMerge %12538 None
OpBranchConditional %21106 %10584 %12538
%10584 = OpLabel
%18272 = OpBitwiseAnd %v4uint %6578 %2510
%9426 = OpShiftLeftLogical %v4uint %18272 %317
%20653 = OpBitwiseAnd %v4uint %6578 %1838
%17550 = OpShiftRightLogical %v4uint %20653 %317
%16377 = OpBitwiseOr %v4uint %9426 %17550
OpBranch %12538
%12538 = OpLabel
%12107 = OpPhi %v4uint %6578 %12537 %16377 %10584
%15376 = OpBitcast %v4int %12107
%16911 = OpShiftLeftLogical %v4int %15376 %770
%16537 = OpShiftRightArithmetic %v4int %16911 %770
%10904 = OpConvertSToF %v4float %16537
%20414 = OpVectorTimesScalar %v4float %10904 %float_3_05185094en05
%23990 = OpExtInst %v4float %1 FMax %1284 %20414
%14339 = OpShiftRightArithmetic %v4int %15376 %770
%6608 = OpConvertSToF %v4float %14339
%18248 = OpVectorTimesScalar %v4float %6608 %float_3_05185094en05
%24071 = OpExtInst %v4float %1 FMax %1284 %18248
%24331 = OpCompositeExtract %float %23990 0
%14320 = OpCompositeExtract %float %24071 0
%19235 = OpCompositeConstruct %v2float %24331 %14320
%8564 = OpExtInst %uint %1 PackHalf2x16 %19235
%23490 = OpCompositeExtract %float %23990 1
%14762 = OpCompositeExtract %float %24071 1
%19236 = OpCompositeConstruct %v2float %23490 %14762
%8565 = OpExtInst %uint %1 PackHalf2x16 %19236
%23491 = OpCompositeExtract %float %23990 2
%14763 = OpCompositeExtract %float %24071 2
%19237 = OpCompositeConstruct %v2float %23491 %14763
%8566 = OpExtInst %uint %1 PackHalf2x16 %19237
%23492 = OpCompositeExtract %float %23990 3
%14764 = OpCompositeExtract %float %24071 3
%19214 = OpCompositeConstruct %v2float %23492 %14764
%8431 = OpExtInst %uint %1 PackHalf2x16 %19214
%15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431
%20158 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %15044
OpStore %20158 %15036
OpBranch %19578
%19578 = OpLabel
OpReturn
OpFunctionEnd
#endif
const uint32_t texture_load_r16_snorm_float_cs[] = {
0x07230203, 0x00010000, 0x0008000A, 0x0000625B, 0x00000000, 0x00020011,
0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,
0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,
0x00000011, 0x00000002, 0x00000020, 0x00000001, 0x00050048, 0x00000489,
0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001,
0x00000023, 0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023,
0x00000008, 0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C,
0x00050048, 0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048,
0x00000489, 0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489,
0x00000006, 0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007,
0x00000023, 0x00000024, 0x00030047, 0x00000489, 0x00000002, 0x00040047,
0x0000147D, 0x00000022, 0x00000002, 0x00040047, 0x0000147D, 0x00000021,
0x00000000, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,
0x000007DC, 0x00000006, 0x00000010, 0x00040048, 0x000007B4, 0x00000000,
0x00000019, 0x00050048, 0x000007B4, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B4, 0x00000003, 0x00040047, 0x0000140E, 0x00000022,
0x00000000, 0x00040047, 0x0000140E, 0x00000021, 0x00000000, 0x00040047,
0x000007DD, 0x00000006, 0x00000010, 0x00040048, 0x000007B5, 0x00000000,
0x00000018, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B5, 0x00000003, 0x00040047, 0x0000107A, 0x00000022,
0x00000001, 0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047,
0x00000BB1, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,
0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,
0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,
0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,
0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,
0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00030016, 0x0000000D,
0x00000020, 0x00040017, 0x0000001D, 0x0000000D, 0x00000004, 0x0004002B,
0x0000000D, 0x00000341, 0xBF800000, 0x0007002C, 0x0000001D, 0x00000504,
0x00000341, 0x00000341, 0x00000341, 0x00000341, 0x00040017, 0x0000001A,
0x0000000C, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A3B, 0x00000010,
0x0004002B, 0x0000000D, 0x00000A38, 0x38000100, 0x0004002B, 0x0000000B,
0x00000A0A, 0x00000000, 0x00040017, 0x00000013, 0x0000000D, 0x00000002,
0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B,
0x00000A10, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003,
0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B,
0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00,
0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000B,
0x00000A19, 0x00000005, 0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007,
0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C,
0x00000A35, 0x0000000E, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002,
0x0004002B, 0x0000000C, 0x000009DB, 0xFFFFFFF0, 0x0004002B, 0x0000000C,
0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A39, 0x0000000F,
0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,
0x0000040B, 0xFFFFFE00, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003,
0x0004002B, 0x0000000C, 0x00000388, 0x000001C0, 0x0004002B, 0x0000000C,
0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006,
0x0004002B, 0x0000000C, 0x00000AC8, 0x0000003F, 0x0004002B, 0x0000000B,
0x00000A16, 0x00000004, 0x0004002B, 0x0000000C, 0x0000078B, 0x0FFFFFFF,
0x0004002B, 0x0000000C, 0x00000A05, 0xFFFFFFFE, 0x0004002B, 0x0000000B,
0x00000A6A, 0x00000020, 0x0004002B, 0x0000000B, 0x00000ACA, 0x00000040,
0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B,
0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706,
0x00000002, 0x00000489, 0x0004003B, 0x00000706, 0x0000147D, 0x00000002,
0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x00040020, 0x00000288,
0x00000002, 0x0000000B, 0x00040020, 0x00000291, 0x00000002, 0x00000014,
0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040020, 0x00000292,
0x00000001, 0x00000014, 0x0004003B, 0x00000292, 0x00000F48, 0x00000001,
0x0006002C, 0x00000014, 0x00000A34, 0x00000A16, 0x00000A0A, 0x00000A0A,
0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0003001D, 0x000007DC,
0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A31,
0x00000002, 0x000007B4, 0x0004003B, 0x00000A31, 0x0000140E, 0x00000002,
0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD,
0x00040020, 0x00000A32, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A32,
0x0000107A, 0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017,
0x0006002C, 0x00000014, 0x00000BB1, 0x00000A10, 0x00000A6A, 0x00000A0D,
0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6,
0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22,
0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD,
0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x0000001A, 0x00000302,
0x00000A3B, 0x00000A3B, 0x00000A3B, 0x00000A3B, 0x0004002B, 0x0000000B,
0x00000A3A, 0x00000010, 0x00050036, 0x00000008, 0x0000161F, 0x00000000,
0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000,
0x000300FB, 0x00000A0A, 0x00003B21, 0x000200F8, 0x00003B21, 0x0004003D,
0x00000014, 0x0000312F, 0x00000F48, 0x000500C4, 0x00000014, 0x000027F5,
0x0000312F, 0x00000A34, 0x00050041, 0x00000291, 0x0000625A, 0x0000147D,
0x00000A17, 0x0004003D, 0x00000014, 0x000059B5, 0x0000625A, 0x0007004F,
0x00000011, 0x00004993, 0x000027F5, 0x000027F5, 0x00000000, 0x00000001,
0x0007004F, 0x00000011, 0x000019E2, 0x000059B5, 0x000059B5, 0x00000000,
0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x00004993, 0x000019E2,
0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x0000188A,
0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x0000188A, 0x000200F8,
0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x0000188A, 0x0004007C,
0x00000016, 0x00001A8B, 0x000027F5, 0x00050041, 0x00000288, 0x00004968,
0x0000147D, 0x00000A1D, 0x0004003D, 0x0000000B, 0x0000263C, 0x00004968,
0x00050051, 0x0000000B, 0x00004F98, 0x000059B5, 0x00000001, 0x00050051,
0x0000000C, 0x00003964, 0x00001A8B, 0x00000000, 0x00050084, 0x0000000C,
0x0000591A, 0x00003964, 0x00000A11, 0x00050051, 0x0000000C, 0x000018DA,
0x00001A8B, 0x00000002, 0x0004007C, 0x0000000C, 0x000038A9, 0x00004F98,
0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051,
0x0000000C, 0x000044BE, 0x00001A8B, 0x00000001, 0x00050080, 0x0000000C,
0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C, 0x00005785,
0x0000263C, 0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785,
0x00050080, 0x0000000C, 0x00001B95, 0x0000591A, 0x00005FD7, 0x0004007C,
0x0000000B, 0x00004B46, 0x00001B95, 0x00050041, 0x00000288, 0x00004C04,
0x0000147D, 0x00000A1A, 0x0004003D, 0x0000000B, 0x0000595B, 0x00004C04,
0x00050080, 0x0000000B, 0x00002145, 0x00004B46, 0x0000595B, 0x000500C2,
0x0000000B, 0x000054A6, 0x00002145, 0x00000A16, 0x00050041, 0x00000288,
0x000051D6, 0x0000147D, 0x00000A0B, 0x0004003D, 0x0000000B, 0x000053A3,
0x000051D6, 0x000500C7, 0x0000000B, 0x000018ED, 0x000053A3, 0x00000A0D,
0x000500AB, 0x00000009, 0x000028E3, 0x000018ED, 0x00000A0A, 0x000300F7,
0x00005AE2, 0x00000002, 0x000400FA, 0x000028E3, 0x0000277C, 0x00002A0D,
0x000200F8, 0x0000277C, 0x000500C7, 0x0000000B, 0x00005BD4, 0x000053A3,
0x00000A10, 0x000500AB, 0x00000009, 0x00003FAC, 0x00005BD4, 0x00000A0A,
0x000300F7, 0x00001E0B, 0x00000002, 0x000400FA, 0x00003FAC, 0x00002F61,
0x00006228, 0x000200F8, 0x00002F61, 0x00050041, 0x00000288, 0x00004722,
0x0000147D, 0x00000A11, 0x0004003D, 0x0000000B, 0x00003D0B, 0x00004722,
0x00050041, 0x00000288, 0x00005860, 0x0000147D, 0x00000A14, 0x0004003D,
0x0000000B, 0x0000541F, 0x00005860, 0x000500C3, 0x0000000C, 0x00003A4B,
0x000044BE, 0x00000A17, 0x000500C3, 0x0000000C, 0x00004955, 0x000018DA,
0x00000A11, 0x000500C2, 0x0000000B, 0x00004947, 0x0000541F, 0x00000A16,
0x0004007C, 0x0000000C, 0x000018AA, 0x00004947, 0x00050084, 0x0000000C,
0x00005321, 0x00004955, 0x000018AA, 0x00050080, 0x0000000C, 0x00003B27,
0x00003A4B, 0x00005321, 0x000500C2, 0x0000000B, 0x00002348, 0x00003D0B,
0x00000A19, 0x0004007C, 0x0000000C, 0x00003901, 0x00002348, 0x00050084,
0x0000000C, 0x000020F4, 0x00003B27, 0x00003901, 0x000500C3, 0x0000000C,
0x000032BA, 0x00003964, 0x00000A1A, 0x00050080, 0x0000000C, 0x00005FEE,
0x000032BA, 0x000020F4, 0x000500C4, 0x0000000C, 0x0000225D, 0x00005FEE,
0x00000A1F, 0x000500C7, 0x0000000C, 0x00002CF6, 0x0000225D, 0x0000078B,
0x000500C4, 0x0000000C, 0x000049FA, 0x00002CF6, 0x00000A0E, 0x000500C7,
0x0000000C, 0x00004D38, 0x00003964, 0x00000A20, 0x000500C7, 0x0000000C,
0x00003138, 0x000044BE, 0x00000A1D, 0x000500C4, 0x0000000C, 0x0000454D,
0x00003138, 0x00000A11, 0x00050080, 0x0000000C, 0x0000434B, 0x00004D38,
0x0000454D, 0x000500C4, 0x0000000C, 0x00001B88, 0x0000434B, 0x00000A1F,
0x000500C3, 0x0000000C, 0x00005DE3, 0x00001B88, 0x00000A1D, 0x000500C3,
0x0000000C, 0x00002215, 0x000044BE, 0x00000A14, 0x00050080, 0x0000000C,
0x000035A3, 0x00002215, 0x00004955, 0x000500C7, 0x0000000C, 0x00005A0C,
0x000035A3, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00004112, 0x00003964,
0x00000A14, 0x000500C4, 0x0000000C, 0x0000496A, 0x00005A0C, 0x00000A0E,
0x00050080, 0x0000000C, 0x000034BD, 0x00004112, 0x0000496A, 0x000500C7,
0x0000000C, 0x00004ADD, 0x000034BD, 0x00000A14, 0x000500C4, 0x0000000C,
0x0000544A, 0x00004ADD, 0x00000A0E, 0x00050080, 0x0000000C, 0x00003C4B,
0x00005A0C, 0x0000544A, 0x000500C7, 0x0000000C, 0x0000335E, 0x00005DE3,
0x000009DB, 0x00050080, 0x0000000C, 0x00004F70, 0x000049FA, 0x0000335E,
0x000500C4, 0x0000000C, 0x00005B31, 0x00004F70, 0x00000A0E, 0x000500C7,
0x0000000C, 0x00005AEA, 0x00005DE3, 0x00000A39, 0x00050080, 0x0000000C,
0x0000285C, 0x00005B31, 0x00005AEA, 0x000500C7, 0x0000000C, 0x000047B4,
0x000018DA, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000544B, 0x000047B4,
0x00000A1F, 0x00050080, 0x0000000C, 0x00004157, 0x0000285C, 0x0000544B,
0x000500C7, 0x0000000C, 0x00004ADE, 0x000044BE, 0x00000A0E, 0x000500C4,
0x0000000C, 0x0000544C, 0x00004ADE, 0x00000A17, 0x00050080, 0x0000000C,
0x00004158, 0x00004157, 0x0000544C, 0x000500C7, 0x0000000C, 0x00004FD6,
0x00003C4B, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00002703, 0x00004FD6,
0x00000A14, 0x000500C3, 0x0000000C, 0x00003332, 0x00004158, 0x00000A1D,
0x000500C7, 0x0000000C, 0x000036D6, 0x00003332, 0x00000A20, 0x00050080,
0x0000000C, 0x00003412, 0x00002703, 0x000036D6, 0x000500C4, 0x0000000C,
0x00005B32, 0x00003412, 0x00000A14, 0x000500C7, 0x0000000C, 0x00005AB1,
0x00003C4B, 0x00000A05, 0x00050080, 0x0000000C, 0x00002A9C, 0x00005B32,
0x00005AB1, 0x000500C4, 0x0000000C, 0x00005B33, 0x00002A9C, 0x00000A11,
0x000500C7, 0x0000000C, 0x00005AB2, 0x00004158, 0x0000040B, 0x00050080,
0x0000000C, 0x00002A9D, 0x00005B33, 0x00005AB2, 0x000500C4, 0x0000000C,
0x00005B34, 0x00002A9D, 0x00000A14, 0x000500C7, 0x0000000C, 0x00005EA0,
0x00004158, 0x00000AC8, 0x00050080, 0x0000000C, 0x000054ED, 0x00005B34,
0x00005EA0, 0x000200F9, 0x00001E0B, 0x000200F8, 0x00006228, 0x0004007C,
0x00000012, 0x00001A8C, 0x00004993, 0x00050041, 0x00000288, 0x00004969,
0x0000147D, 0x00000A11, 0x0004003D, 0x0000000B, 0x00002EB2, 0x00004969,
0x00050051, 0x0000000C, 0x00004944, 0x00001A8C, 0x00000000, 0x000500C3,
0x0000000C, 0x00004CF5, 0x00004944, 0x00000A1A, 0x00050051, 0x0000000C,
0x00002747, 0x00001A8C, 0x00000001, 0x000500C3, 0x0000000C, 0x0000405C,
0x00002747, 0x00000A1A, 0x000500C2, 0x0000000B, 0x00005B4D, 0x00002EB2,
0x00000A19, 0x0004007C, 0x0000000C, 0x000018AB, 0x00005B4D, 0x00050084,
0x0000000C, 0x00005347, 0x0000405C, 0x000018AB, 0x00050080, 0x0000000C,
0x00003F5E, 0x00004CF5, 0x00005347, 0x000500C4, 0x0000000C, 0x00004A8E,
0x00003F5E, 0x00000A22, 0x000500C7, 0x0000000C, 0x00002AB6, 0x00004944,
0x00000A20, 0x000500C7, 0x0000000C, 0x00003139, 0x00002747, 0x00000A35,
0x000500C4, 0x0000000C, 0x0000454E, 0x00003139, 0x00000A11, 0x00050080,
0x0000000C, 0x00004397, 0x00002AB6, 0x0000454E, 0x000500C4, 0x0000000C,
0x000018E7, 0x00004397, 0x00000A0D, 0x000500C7, 0x0000000C, 0x000027B1,
0x000018E7, 0x000009DB, 0x000500C4, 0x0000000C, 0x00002F76, 0x000027B1,
0x00000A0E, 0x00050080, 0x0000000C, 0x00003C4C, 0x00004A8E, 0x00002F76,
0x000500C7, 0x0000000C, 0x00003397, 0x000018E7, 0x00000A39, 0x00050080,
0x0000000C, 0x00004D30, 0x00003C4C, 0x00003397, 0x000500C7, 0x0000000C,
0x000047B5, 0x00002747, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000544D,
0x000047B5, 0x00000A17, 0x00050080, 0x0000000C, 0x00004159, 0x00004D30,
0x0000544D, 0x000500C7, 0x0000000C, 0x00005022, 0x00004159, 0x0000040B,
0x000500C4, 0x0000000C, 0x00002416, 0x00005022, 0x00000A14, 0x000500C7,
0x0000000C, 0x00004A33, 0x00002747, 0x00000A3B, 0x000500C4, 0x0000000C,
0x00002F77, 0x00004A33, 0x00000A20, 0x00050080, 0x0000000C, 0x0000415A,
0x00002416, 0x00002F77, 0x000500C7, 0x0000000C, 0x00004ADF, 0x00004159,
0x00000388, 0x000500C4, 0x0000000C, 0x0000544E, 0x00004ADF, 0x00000A11,
0x00050080, 0x0000000C, 0x00004144, 0x0000415A, 0x0000544E, 0x000500C7,
0x0000000C, 0x00005083, 0x00002747, 0x00000A23, 0x000500C3, 0x0000000C,
0x000041BF, 0x00005083, 0x00000A11, 0x000500C3, 0x0000000C, 0x00001EEC,
0x00004944, 0x00000A14, 0x00050080, 0x0000000C, 0x000035B6, 0x000041BF,
0x00001EEC, 0x000500C7, 0x0000000C, 0x00005453, 0x000035B6, 0x00000A14,
0x000500C4, 0x0000000C, 0x0000544F, 0x00005453, 0x00000A1D, 0x00050080,
0x0000000C, 0x00003C4D, 0x00004144, 0x0000544F, 0x000500C7, 0x0000000C,
0x0000374D, 0x00004159, 0x00000AC8, 0x00050080, 0x0000000C, 0x00002F42,
0x00003C4D, 0x0000374D, 0x000200F9, 0x00001E0B, 0x000200F8, 0x00001E0B,
0x000700F5, 0x0000000C, 0x0000292C, 0x000054ED, 0x00002F61, 0x00002F42,
0x00006228, 0x000200F9, 0x00005AE2, 0x000200F8, 0x00002A0D, 0x00050041,
0x00000288, 0x00005098, 0x0000147D, 0x00000A11, 0x0004003D, 0x0000000B,
0x00003D0C, 0x00005098, 0x00050041, 0x00000288, 0x0000531B, 0x0000147D,
0x00000A14, 0x0004003D, 0x0000000B, 0x000034EE, 0x0000531B, 0x0004007C,
0x0000000C, 0x00003ADE, 0x000034EE, 0x00050084, 0x0000000C, 0x000049EF,
0x000018DA, 0x00003ADE, 0x00050080, 0x0000000C, 0x0000208E, 0x000049EF,
0x000044BE, 0x0004007C, 0x0000000C, 0x000022F8, 0x00003D0C, 0x00050084,
0x0000000C, 0x00001E9F, 0x0000208E, 0x000022F8, 0x00050080, 0x0000000C,
0x00001F30, 0x0000591A, 0x00001E9F, 0x000200F9, 0x00005AE2, 0x000200F8,
0x00005AE2, 0x000700F5, 0x0000000C, 0x00004D24, 0x0000292C, 0x00001E0B,
0x00001F30, 0x00002A0D, 0x00050041, 0x00000288, 0x0000615A, 0x0000147D,
0x00000A0E, 0x0004003D, 0x0000000B, 0x00001D4E, 0x0000615A, 0x0004007C,
0x0000000C, 0x00003D46, 0x00001D4E, 0x00050080, 0x0000000C, 0x00003CDB,
0x00003D46, 0x00004D24, 0x0004007C, 0x0000000B, 0x0000487C, 0x00003CDB,
0x000500C2, 0x0000000B, 0x000053F5, 0x0000487C, 0x00000A16, 0x000500C2,
0x0000000B, 0x00003A95, 0x000053A3, 0x00000A10, 0x000500C7, 0x0000000B,
0x000020CA, 0x00003A95, 0x00000A13, 0x00060041, 0x00000294, 0x000050F7,
0x0000107A, 0x00000A0B, 0x000053F5, 0x0004003D, 0x00000017, 0x00002585,
0x000050F7, 0x000500AA, 0x00000009, 0x00005272, 0x000020CA, 0x00000A0D,
0x000300F7, 0x000030F9, 0x00000000, 0x000400FA, 0x00005272, 0x00002957,
0x000030F9, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F,
0x00002585, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F,
0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00002585, 0x0000072E,
0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5,
0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9, 0x000030F9,
0x000200F8, 0x000030F9, 0x000700F5, 0x00000017, 0x00002F4A, 0x00002585,
0x00005AE2, 0x00003FF8, 0x00002957, 0x0004007C, 0x0000001A, 0x00003C0F,
0x00002F4A, 0x000500C4, 0x0000001A, 0x0000420E, 0x00003C0F, 0x00000302,
0x000500C3, 0x0000001A, 0x00004098, 0x0000420E, 0x00000302, 0x0004006F,
0x0000001D, 0x00002A97, 0x00004098, 0x0005008E, 0x0000001D, 0x00004FBD,
0x00002A97, 0x00000A38, 0x0007000C, 0x0000001D, 0x00005DB5, 0x00000001,
0x00000028, 0x00000504, 0x00004FBD, 0x000500C3, 0x0000001A, 0x00003802,
0x00003C0F, 0x00000302, 0x0004006F, 0x0000001D, 0x000019CF, 0x00003802,
0x0005008E, 0x0000001D, 0x00004747, 0x000019CF, 0x00000A38, 0x0007000C,
0x0000001D, 0x00005E06, 0x00000001, 0x00000028, 0x00000504, 0x00004747,
0x00050051, 0x0000000D, 0x00005F0A, 0x00005DB5, 0x00000000, 0x00050051,
0x0000000D, 0x000037EF, 0x00005E06, 0x00000000, 0x00050050, 0x00000013,
0x00004B20, 0x00005F0A, 0x000037EF, 0x0006000C, 0x0000000B, 0x00002171,
0x00000001, 0x0000003A, 0x00004B20, 0x00050051, 0x0000000D, 0x00005BBF,
0x00005DB5, 0x00000001, 0x00050051, 0x0000000D, 0x000039A7, 0x00005E06,
0x00000001, 0x00050050, 0x00000013, 0x00004B21, 0x00005BBF, 0x000039A7,
0x0006000C, 0x0000000B, 0x00002172, 0x00000001, 0x0000003A, 0x00004B21,
0x00050051, 0x0000000D, 0x00005BC0, 0x00005DB5, 0x00000002, 0x00050051,
0x0000000D, 0x000039A8, 0x00005E06, 0x00000002, 0x00050050, 0x00000013,
0x00004B22, 0x00005BC0, 0x000039A8, 0x0006000C, 0x0000000B, 0x00002173,
0x00000001, 0x0000003A, 0x00004B22, 0x00050051, 0x0000000D, 0x00005BC1,
0x00005DB5, 0x00000003, 0x00050051, 0x0000000D, 0x000039A9, 0x00005E06,
0x00000003, 0x00050050, 0x00000013, 0x00004B0D, 0x00005BC1, 0x000039A9,
0x0006000C, 0x0000000B, 0x000020EE, 0x00000001, 0x0000003A, 0x00004B0D,
0x00070050, 0x00000017, 0x00003ABB, 0x00002171, 0x00002172, 0x00002173,
0x000020EE, 0x00060041, 0x00000294, 0x000045C3, 0x0000140E, 0x00000A0B,
0x000054A6, 0x0003003E, 0x000045C3, 0x00003ABB, 0x00050080, 0x0000000B,
0x00003AC4, 0x000054A6, 0x00000A0E, 0x000600A9, 0x0000000B, 0x00004958,
0x000028E3, 0x00000ACA, 0x00000A3A, 0x000500C2, 0x0000000B, 0x00002E1B,
0x00004958, 0x00000A16, 0x00050080, 0x0000000B, 0x0000367B, 0x000053F5,
0x00002E1B, 0x00060041, 0x00000294, 0x0000571A, 0x0000107A, 0x00000A0B,
0x0000367B, 0x0004003D, 0x00000017, 0x000019B2, 0x0000571A, 0x000300F7,
0x000030FA, 0x00000000, 0x000400FA, 0x00005272, 0x00002958, 0x000030FA,
0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760, 0x000019B2,
0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760, 0x0000013D,
0x000500C7, 0x00000017, 0x000050AD, 0x000019B2, 0x0000072E, 0x000500C2,
0x00000017, 0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5, 0x00000017,
0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x000030FA, 0x000200F8,
0x000030FA, 0x000700F5, 0x00000017, 0x00002F4B, 0x000019B2, 0x000030F9,
0x00003FF9, 0x00002958, 0x0004007C, 0x0000001A, 0x00003C10, 0x00002F4B,
0x000500C4, 0x0000001A, 0x0000420F, 0x00003C10, 0x00000302, 0x000500C3,
0x0000001A, 0x00004099, 0x0000420F, 0x00000302, 0x0004006F, 0x0000001D,
0x00002A98, 0x00004099, 0x0005008E, 0x0000001D, 0x00004FBE, 0x00002A98,
0x00000A38, 0x0007000C, 0x0000001D, 0x00005DB6, 0x00000001, 0x00000028,
0x00000504, 0x00004FBE, 0x000500C3, 0x0000001A, 0x00003803, 0x00003C10,
0x00000302, 0x0004006F, 0x0000001D, 0x000019D0, 0x00003803, 0x0005008E,
0x0000001D, 0x00004748, 0x000019D0, 0x00000A38, 0x0007000C, 0x0000001D,
0x00005E07, 0x00000001, 0x00000028, 0x00000504, 0x00004748, 0x00050051,
0x0000000D, 0x00005F0B, 0x00005DB6, 0x00000000, 0x00050051, 0x0000000D,
0x000037F0, 0x00005E07, 0x00000000, 0x00050050, 0x00000013, 0x00004B23,
0x00005F0B, 0x000037F0, 0x0006000C, 0x0000000B, 0x00002174, 0x00000001,
0x0000003A, 0x00004B23, 0x00050051, 0x0000000D, 0x00005BC2, 0x00005DB6,
0x00000001, 0x00050051, 0x0000000D, 0x000039AA, 0x00005E07, 0x00000001,
0x00050050, 0x00000013, 0x00004B24, 0x00005BC2, 0x000039AA, 0x0006000C,
0x0000000B, 0x00002175, 0x00000001, 0x0000003A, 0x00004B24, 0x00050051,
0x0000000D, 0x00005BC3, 0x00005DB6, 0x00000002, 0x00050051, 0x0000000D,
0x000039AB, 0x00005E07, 0x00000002, 0x00050050, 0x00000013, 0x00004B25,
0x00005BC3, 0x000039AB, 0x0006000C, 0x0000000B, 0x00002176, 0x00000001,
0x0000003A, 0x00004B25, 0x00050051, 0x0000000D, 0x00005BC4, 0x00005DB6,
0x00000003, 0x00050051, 0x0000000D, 0x000039AC, 0x00005E07, 0x00000003,
0x00050050, 0x00000013, 0x00004B0E, 0x00005BC4, 0x000039AC, 0x0006000C,
0x0000000B, 0x000020EF, 0x00000001, 0x0000003A, 0x00004B0E, 0x00070050,
0x00000017, 0x00003ABC, 0x00002174, 0x00002175, 0x00002176, 0x000020EF,
0x00060041, 0x00000294, 0x00004EBE, 0x0000140E, 0x00000A0B, 0x00003AC4,
0x0003003E, 0x00004EBE, 0x00003ABC, 0x000200F9, 0x00004C7A, 0x000200F8,
0x00004C7A, 0x000100FD, 0x00010038,
};

View File

@ -0,0 +1,734 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 10
; Bound: 25179
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %5663 "main" %gl_GlobalInvocationID
OpExecutionMode %5663 LocalSize 2 32 1
OpMemberDecorate %_struct_1161 0 Offset 0
OpMemberDecorate %_struct_1161 1 Offset 4
OpMemberDecorate %_struct_1161 2 Offset 8
OpMemberDecorate %_struct_1161 3 Offset 12
OpMemberDecorate %_struct_1161 4 Offset 16
OpMemberDecorate %_struct_1161 5 Offset 28
OpMemberDecorate %_struct_1161 6 Offset 32
OpMemberDecorate %_struct_1161 7 Offset 36
OpDecorate %_struct_1161 Block
OpDecorate %5245 DescriptorSet 2
OpDecorate %5245 Binding 0
OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
OpDecorate %_runtimearr_v4uint ArrayStride 16
OpMemberDecorate %_struct_1972 0 NonReadable
OpMemberDecorate %_struct_1972 0 Offset 0
OpDecorate %_struct_1972 BufferBlock
OpDecorate %5134 DescriptorSet 0
OpDecorate %5134 Binding 0
OpDecorate %_runtimearr_v4uint_0 ArrayStride 16
OpMemberDecorate %_struct_1973 0 NonWritable
OpMemberDecorate %_struct_1973 0 Offset 0
OpDecorate %_struct_1973 BufferBlock
OpDecorate %4218 DescriptorSet 1
OpDecorate %4218 Binding 0
OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%v4uint = OpTypeVector %uint 4
%int = OpTypeInt 32 1
%v2int = OpTypeVector %int 2
%v3int = OpTypeVector %int 3
%bool = OpTypeBool
%v3uint = OpTypeVector %uint 3
%v2uint = OpTypeVector %uint 2
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%float_n1 = OpConstant %float -1
%1284 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1
%v4int = OpTypeVector %int 4
%int_16 = OpConstant %int 16
%float_3_05185094en05 = OpConstant %float 3.05185094e-05
%uint_0 = OpConstant %uint 0
%v2float = OpTypeVector %float 2
%uint_1 = OpConstant %uint 1
%uint_2 = OpConstant %uint 2
%uint_3 = OpConstant %uint 3
%uint_16711935 = OpConstant %uint 16711935
%uint_8 = OpConstant %uint 8
%uint_4278255360 = OpConstant %uint 4278255360
%int_5 = OpConstant %int 5
%uint_5 = OpConstant %uint 5
%uint_7 = OpConstant %uint 7
%int_7 = OpConstant %int 7
%int_14 = OpConstant %int 14
%int_2 = OpConstant %int 2
%int_n16 = OpConstant %int -16
%int_1 = OpConstant %int 1
%int_15 = OpConstant %int 15
%int_4 = OpConstant %int 4
%int_n512 = OpConstant %int -512
%int_3 = OpConstant %int 3
%int_448 = OpConstant %int 448
%int_8 = OpConstant %int 8
%int_6 = OpConstant %int 6
%int_63 = OpConstant %int 63
%uint_4 = OpConstant %uint 4
%uint_6 = OpConstant %uint 6
%int_268435455 = OpConstant %int 268435455
%int_n2 = OpConstant %int -2
%uint_32 = OpConstant %uint 32
%uint_64 = OpConstant %uint 64
%_struct_1161 = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint
%_ptr_Uniform__struct_1161 = OpTypePointer Uniform %_struct_1161
%5245 = OpVariable %_ptr_Uniform__struct_1161 Uniform
%int_0 = OpConstant %int 0
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%1915 = OpConstantComposite %v2uint %uint_4 %uint_6
%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
%2612 = OpConstantComposite %v3uint %uint_4 %uint_0 %uint_0
%v2bool = OpTypeVector %bool 2
%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint
%_struct_1972 = OpTypeStruct %_runtimearr_v4uint
%_ptr_Uniform__struct_1972 = OpTypePointer Uniform %_struct_1972
%5134 = OpVariable %_ptr_Uniform__struct_1972 Uniform
%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint
%_struct_1973 = OpTypeStruct %_runtimearr_v4uint_0
%_ptr_Uniform__struct_1973 = OpTypePointer Uniform %_struct_1973
%4218 = OpVariable %_ptr_Uniform__struct_1973 Uniform
%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_2 %uint_32 %uint_1
%1870 = OpConstantComposite %v2uint %uint_3 %uint_3
%2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935
%317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8
%1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360
%770 = OpConstantComposite %v4int %int_16 %int_16 %int_16 %int_16
%uint_16 = OpConstant %uint 16
%5663 = OpFunction %void None %1282
%15110 = OpLabel
OpSelectionMerge %19578 None
OpSwitch %uint_0 %15137
%15137 = OpLabel
%12591 = OpLoad %v3uint %gl_GlobalInvocationID
%10229 = OpShiftLeftLogical %v3uint %12591 %2612
%25178 = OpAccessChain %_ptr_Uniform_v3uint %5245 %int_4
%22965 = OpLoad %v3uint %25178
%18835 = OpVectorShuffle %v2uint %10229 %10229 0 1
%6626 = OpVectorShuffle %v2uint %22965 %22965 0 1
%17032 = OpUGreaterThanEqual %v2bool %18835 %6626
%24679 = OpAny %bool %17032
OpSelectionMerge %6282 DontFlatten
OpBranchConditional %24679 %21992 %6282
%21992 = OpLabel
OpBranch %19578
%6282 = OpLabel
%6795 = OpBitcast %v3int %10229
%18792 = OpAccessChain %_ptr_Uniform_uint %5245 %int_6
%9788 = OpLoad %uint %18792
%20376 = OpCompositeExtract %uint %22965 1
%14692 = OpCompositeExtract %int %6795 0
%22810 = OpIMul %int %14692 %int_2
%6362 = OpCompositeExtract %int %6795 2
%14505 = OpBitcast %int %20376
%11279 = OpIMul %int %6362 %14505
%17598 = OpCompositeExtract %int %6795 1
%22228 = OpIAdd %int %11279 %17598
%22405 = OpBitcast %int %9788
%24535 = OpIMul %int %22228 %22405
%7061 = OpIAdd %int %22810 %24535
%19270 = OpBitcast %uint %7061
%19460 = OpAccessChain %_ptr_Uniform_uint %5245 %int_5
%22875 = OpLoad %uint %19460
%8517 = OpIAdd %uint %19270 %22875
%21670 = OpShiftRightLogical %uint %8517 %uint_4
%18404 = OpAccessChain %_ptr_Uniform_uint %5245 %int_1
%23432 = OpLoad %uint %18404
%22700 = OpAccessChain %_ptr_Uniform_uint %5245 %int_0
%20387 = OpLoad %uint %22700
%22279 = OpBitwiseAnd %uint %20387 %uint_2
%19223 = OpINotEqual %bool %22279 %uint_0
%17247 = OpCompositeConstruct %v2uint %20387 %20387
%22947 = OpShiftRightLogical %v2uint %17247 %1915
%6551 = OpBitwiseAnd %v2uint %22947 %1870
%18732 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%24236 = OpLoad %uint %18732
%20458 = OpAccessChain %_ptr_Uniform_uint %5245 %int_3
%22167 = OpLoad %uint %20458
%18929 = OpCompositeExtract %uint %10229 0
%6638 = OpShiftRightLogical %uint %18929 %uint_3
%9988 = OpCompositeExtract %uint %10229 1
%23563 = OpCompositeConstruct %v2uint %6638 %9988
%8041 = OpUDiv %v2uint %23563 %6551
%13932 = OpCompositeExtract %uint %8041 0
%19789 = OpShiftLeftLogical %uint %13932 %uint_3
%20905 = OpCompositeExtract %uint %8041 1
%23022 = OpCompositeExtract %uint %10229 2
%9417 = OpCompositeConstruct %v3uint %19789 %20905 %23022
OpSelectionMerge %21313 DontFlatten
OpBranchConditional %19223 %21373 %11737
%21373 = OpLabel
%10608 = OpBitcast %v3int %9417
%17090 = OpCompositeExtract %int %10608 1
%9469 = OpShiftRightArithmetic %int %17090 %int_4
%10055 = OpCompositeExtract %int %10608 2
%16476 = OpShiftRightArithmetic %int %10055 %int_2
%23373 = OpShiftRightLogical %uint %22167 %uint_4
%6314 = OpBitcast %int %23373
%21281 = OpIMul %int %16476 %6314
%15143 = OpIAdd %int %9469 %21281
%9032 = OpShiftRightLogical %uint %24236 %uint_5
%12427 = OpBitcast %int %9032
%10360 = OpIMul %int %15143 %12427
%25154 = OpCompositeExtract %int %10608 0
%20423 = OpShiftRightArithmetic %int %25154 %int_5
%18940 = OpIAdd %int %20423 %10360
%8797 = OpShiftLeftLogical %int %18940 %uint_7
%11510 = OpBitwiseAnd %int %8797 %int_268435455
%18938 = OpShiftLeftLogical %int %11510 %int_1
%19768 = OpBitwiseAnd %int %25154 %int_7
%12600 = OpBitwiseAnd %int %17090 %int_6
%17741 = OpShiftLeftLogical %int %12600 %int_2
%17227 = OpIAdd %int %19768 %17741
%7048 = OpShiftLeftLogical %int %17227 %uint_7
%24035 = OpShiftRightArithmetic %int %7048 %int_6
%8725 = OpShiftRightArithmetic %int %17090 %int_3
%13731 = OpIAdd %int %8725 %16476
%23052 = OpBitwiseAnd %int %13731 %int_1
%16658 = OpShiftRightArithmetic %int %25154 %int_3
%18794 = OpShiftLeftLogical %int %23052 %int_1
%13501 = OpIAdd %int %16658 %18794
%19165 = OpBitwiseAnd %int %13501 %int_3
%21578 = OpShiftLeftLogical %int %19165 %int_1
%15435 = OpIAdd %int %23052 %21578
%13150 = OpBitwiseAnd %int %24035 %int_n16
%20336 = OpIAdd %int %18938 %13150
%23345 = OpShiftLeftLogical %int %20336 %int_1
%23274 = OpBitwiseAnd %int %24035 %int_15
%10332 = OpIAdd %int %23345 %23274
%18356 = OpBitwiseAnd %int %10055 %int_3
%21579 = OpShiftLeftLogical %int %18356 %uint_7
%16727 = OpIAdd %int %10332 %21579
%19166 = OpBitwiseAnd %int %17090 %int_1
%21580 = OpShiftLeftLogical %int %19166 %int_4
%16728 = OpIAdd %int %16727 %21580
%20438 = OpBitwiseAnd %int %15435 %int_1
%9987 = OpShiftLeftLogical %int %20438 %int_3
%13106 = OpShiftRightArithmetic %int %16728 %int_6
%14038 = OpBitwiseAnd %int %13106 %int_7
%13330 = OpIAdd %int %9987 %14038
%23346 = OpShiftLeftLogical %int %13330 %int_3
%23217 = OpBitwiseAnd %int %15435 %int_n2
%10908 = OpIAdd %int %23346 %23217
%23347 = OpShiftLeftLogical %int %10908 %int_2
%23218 = OpBitwiseAnd %int %16728 %int_n512
%10909 = OpIAdd %int %23347 %23218
%23348 = OpShiftLeftLogical %int %10909 %int_3
%21849 = OpBitwiseAnd %int %16728 %int_63
%24314 = OpIAdd %int %23348 %21849
%22127 = OpBitcast %uint %24314
OpBranch %21313
%11737 = OpLabel
%9761 = OpVectorShuffle %v2uint %9417 %9417 0 1
%22991 = OpBitcast %v2int %9761
%6403 = OpCompositeExtract %int %22991 0
%9470 = OpShiftRightArithmetic %int %6403 %int_5
%10056 = OpCompositeExtract %int %22991 1
%16477 = OpShiftRightArithmetic %int %10056 %int_5
%23374 = OpShiftRightLogical %uint %24236 %uint_5
%6315 = OpBitcast %int %23374
%21319 = OpIMul %int %16477 %6315
%16222 = OpIAdd %int %9470 %21319
%19086 = OpShiftLeftLogical %int %16222 %uint_8
%10934 = OpBitwiseAnd %int %6403 %int_7
%12601 = OpBitwiseAnd %int %10056 %int_14
%17742 = OpShiftLeftLogical %int %12601 %int_2
%17303 = OpIAdd %int %10934 %17742
%6375 = OpShiftLeftLogical %int %17303 %uint_1
%10161 = OpBitwiseAnd %int %6375 %int_n16
%12150 = OpShiftLeftLogical %int %10161 %int_1
%15436 = OpIAdd %int %19086 %12150
%13207 = OpBitwiseAnd %int %6375 %int_15
%19760 = OpIAdd %int %15436 %13207
%18357 = OpBitwiseAnd %int %10056 %int_1
%21581 = OpShiftLeftLogical %int %18357 %int_4
%16729 = OpIAdd %int %19760 %21581
%20514 = OpBitwiseAnd %int %16729 %int_n512
%9238 = OpShiftLeftLogical %int %20514 %int_3
%18995 = OpBitwiseAnd %int %10056 %int_16
%12151 = OpShiftLeftLogical %int %18995 %int_7
%16730 = OpIAdd %int %9238 %12151
%19167 = OpBitwiseAnd %int %16729 %int_448
%21582 = OpShiftLeftLogical %int %19167 %int_2
%16708 = OpIAdd %int %16730 %21582
%20611 = OpBitwiseAnd %int %10056 %int_8
%16831 = OpShiftRightArithmetic %int %20611 %int_2
%7916 = OpShiftRightArithmetic %int %6403 %int_3
%13750 = OpIAdd %int %16831 %7916
%21587 = OpBitwiseAnd %int %13750 %int_3
%21583 = OpShiftLeftLogical %int %21587 %int_6
%15437 = OpIAdd %int %16708 %21583
%11782 = OpBitwiseAnd %int %16729 %int_63
%14671 = OpIAdd %int %15437 %11782
%22128 = OpBitcast %uint %14671
OpBranch %21313
%21313 = OpLabel
%9468 = OpPhi %uint %22127 %21373 %22128 %11737
%16296 = OpIMul %v2uint %8041 %6551
%15292 = OpISub %v2uint %23563 %16296
%7303 = OpCompositeExtract %uint %6551 0
%22882 = OpCompositeExtract %uint %6551 1
%13170 = OpIMul %uint %7303 %22882
%15520 = OpIMul %uint %9468 %13170
%16084 = OpCompositeExtract %uint %15292 0
%15890 = OpIMul %uint %16084 %22882
%6886 = OpCompositeExtract %uint %15292 1
%11045 = OpIAdd %uint %15890 %6886
%24733 = OpShiftLeftLogical %uint %11045 %uint_3
%23219 = OpBitwiseAnd %uint %18929 %uint_7
%9559 = OpIAdd %uint %24733 %23219
%16557 = OpShiftLeftLogical %uint %9559 %uint_1
%20138 = OpIAdd %uint %15520 %16557
%17724 = OpIAdd %uint %23432 %20138
%14040 = OpShiftRightLogical %uint %17724 %uint_4
%11766 = OpShiftRightLogical %uint %20387 %uint_2
%8394 = OpBitwiseAnd %uint %11766 %uint_3
%20727 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %14040
%9605 = OpLoad %v4uint %20727
%21106 = OpIEqual %bool %8394 %uint_1
OpSelectionMerge %12537 None
OpBranchConditional %21106 %10583 %12537
%10583 = OpLabel
%18271 = OpBitwiseAnd %v4uint %9605 %2510
%9425 = OpShiftLeftLogical %v4uint %18271 %317
%20652 = OpBitwiseAnd %v4uint %9605 %1838
%17549 = OpShiftRightLogical %v4uint %20652 %317
%16376 = OpBitwiseOr %v4uint %9425 %17549
OpBranch %12537
%12537 = OpLabel
%12106 = OpPhi %v4uint %9605 %21313 %16376 %10583
%15375 = OpBitcast %v4int %12106
%16910 = OpShiftLeftLogical %v4int %15375 %770
%16536 = OpShiftRightArithmetic %v4int %16910 %770
%10903 = OpConvertSToF %v4float %16536
%20413 = OpVectorTimesScalar %v4float %10903 %float_3_05185094en05
%23989 = OpExtInst %v4float %1 FMax %1284 %20413
%14338 = OpShiftRightArithmetic %v4int %15375 %770
%6607 = OpConvertSToF %v4float %14338
%18247 = OpVectorTimesScalar %v4float %6607 %float_3_05185094en05
%24070 = OpExtInst %v4float %1 FMax %1284 %18247
%24330 = OpCompositeExtract %float %23989 0
%14319 = OpCompositeExtract %float %24070 0
%19232 = OpCompositeConstruct %v2float %24330 %14319
%8561 = OpExtInst %uint %1 PackHalf2x16 %19232
%23487 = OpCompositeExtract %float %23989 1
%14759 = OpCompositeExtract %float %24070 1
%19233 = OpCompositeConstruct %v2float %23487 %14759
%8562 = OpExtInst %uint %1 PackHalf2x16 %19233
%23488 = OpCompositeExtract %float %23989 2
%14760 = OpCompositeExtract %float %24070 2
%19234 = OpCompositeConstruct %v2float %23488 %14760
%8563 = OpExtInst %uint %1 PackHalf2x16 %19234
%23489 = OpCompositeExtract %float %23989 3
%14761 = OpCompositeExtract %float %24070 3
%19213 = OpCompositeConstruct %v2float %23489 %14761
%8430 = OpExtInst %uint %1 PackHalf2x16 %19213
%15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430
%17859 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %21670
OpStore %17859 %15035
%15532 = OpIAdd %uint %21670 %int_1
%6417 = OpUGreaterThan %bool %7303 %uint_1
OpSelectionMerge %24764 DontFlatten
OpBranchConditional %6417 %20612 %20628
%20612 = OpLabel
%13975 = OpUDiv %uint %6638 %7303
%9086 = OpIMul %uint %13975 %7303
%12657 = OpISub %uint %6638 %9086
%9511 = OpIAdd %uint %12657 %uint_1
%13375 = OpIEqual %bool %9511 %7303
OpSelectionMerge %7917 None
OpBranchConditional %13375 %22174 %8593
%22174 = OpLabel
%19289 = OpIMul %uint %uint_64 %7303
%21519 = OpShiftLeftLogical %uint %12657 %uint_4
%18756 = OpISub %uint %19289 %21519
OpBranch %7917
%8593 = OpLabel
OpBranch %7917
%7917 = OpLabel
%10540 = OpPhi %uint %18756 %22174 %uint_16 %8593
OpBranch %24764
%20628 = OpLabel
OpBranch %24764
%24764 = OpLabel
%10684 = OpPhi %uint %10540 %7917 %uint_64 %20628
%18731 = OpIMul %uint %10684 %22882
%16493 = OpShiftRightLogical %uint %18731 %uint_4
%13163 = OpIAdd %uint %14040 %16493
%22298 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %13163
%6578 = OpLoad %v4uint %22298
OpSelectionMerge %12538 None
OpBranchConditional %21106 %10584 %12538
%10584 = OpLabel
%18272 = OpBitwiseAnd %v4uint %6578 %2510
%9426 = OpShiftLeftLogical %v4uint %18272 %317
%20653 = OpBitwiseAnd %v4uint %6578 %1838
%17550 = OpShiftRightLogical %v4uint %20653 %317
%16377 = OpBitwiseOr %v4uint %9426 %17550
OpBranch %12538
%12538 = OpLabel
%12107 = OpPhi %v4uint %6578 %24764 %16377 %10584
%15376 = OpBitcast %v4int %12107
%16911 = OpShiftLeftLogical %v4int %15376 %770
%16537 = OpShiftRightArithmetic %v4int %16911 %770
%10904 = OpConvertSToF %v4float %16537
%20414 = OpVectorTimesScalar %v4float %10904 %float_3_05185094en05
%23990 = OpExtInst %v4float %1 FMax %1284 %20414
%14339 = OpShiftRightArithmetic %v4int %15376 %770
%6608 = OpConvertSToF %v4float %14339
%18248 = OpVectorTimesScalar %v4float %6608 %float_3_05185094en05
%24071 = OpExtInst %v4float %1 FMax %1284 %18248
%24331 = OpCompositeExtract %float %23990 0
%14320 = OpCompositeExtract %float %24071 0
%19235 = OpCompositeConstruct %v2float %24331 %14320
%8564 = OpExtInst %uint %1 PackHalf2x16 %19235
%23490 = OpCompositeExtract %float %23990 1
%14762 = OpCompositeExtract %float %24071 1
%19236 = OpCompositeConstruct %v2float %23490 %14762
%8565 = OpExtInst %uint %1 PackHalf2x16 %19236
%23491 = OpCompositeExtract %float %23990 2
%14763 = OpCompositeExtract %float %24071 2
%19237 = OpCompositeConstruct %v2float %23491 %14763
%8566 = OpExtInst %uint %1 PackHalf2x16 %19237
%23492 = OpCompositeExtract %float %23990 3
%14764 = OpCompositeExtract %float %24071 3
%19214 = OpCompositeConstruct %v2float %23492 %14764
%8431 = OpExtInst %uint %1 PackHalf2x16 %19214
%15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431
%20158 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %15532
OpStore %20158 %15036
OpBranch %19578
%19578 = OpLabel
OpReturn
OpFunctionEnd
#endif
const uint32_t texture_load_r16_snorm_float_scaled_cs[] = {
0x07230203, 0x00010000, 0x0008000A, 0x0000625B, 0x00000000, 0x00020011,
0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,
0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,
0x00000011, 0x00000002, 0x00000020, 0x00000001, 0x00050048, 0x00000489,
0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001,
0x00000023, 0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023,
0x00000008, 0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C,
0x00050048, 0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048,
0x00000489, 0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489,
0x00000006, 0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007,
0x00000023, 0x00000024, 0x00030047, 0x00000489, 0x00000002, 0x00040047,
0x0000147D, 0x00000022, 0x00000002, 0x00040047, 0x0000147D, 0x00000021,
0x00000000, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,
0x000007DC, 0x00000006, 0x00000010, 0x00040048, 0x000007B4, 0x00000000,
0x00000019, 0x00050048, 0x000007B4, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B4, 0x00000003, 0x00040047, 0x0000140E, 0x00000022,
0x00000000, 0x00040047, 0x0000140E, 0x00000021, 0x00000000, 0x00040047,
0x000007DD, 0x00000006, 0x00000010, 0x00040048, 0x000007B5, 0x00000000,
0x00000018, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B5, 0x00000003, 0x00040047, 0x0000107A, 0x00000022,
0x00000001, 0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047,
0x00000BB1, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,
0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,
0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,
0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,
0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,
0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00040017, 0x00000011,
0x0000000B, 0x00000002, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,
0x0000001D, 0x0000000D, 0x00000004, 0x0004002B, 0x0000000D, 0x00000341,
0xBF800000, 0x0007002C, 0x0000001D, 0x00000504, 0x00000341, 0x00000341,
0x00000341, 0x00000341, 0x00040017, 0x0000001A, 0x0000000C, 0x00000004,
0x0004002B, 0x0000000C, 0x00000A3B, 0x00000010, 0x0004002B, 0x0000000D,
0x00000A38, 0x38000100, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,
0x00040017, 0x00000013, 0x0000000D, 0x00000002, 0x0004002B, 0x0000000B,
0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002,
0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B,
0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,
0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000C,
0x00000A1A, 0x00000005, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005,
0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x0004002B, 0x0000000C,
0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A35, 0x0000000E,
0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000C,
0x000009DB, 0xFFFFFFF0, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001,
0x0004002B, 0x0000000C, 0x00000A39, 0x0000000F, 0x0004002B, 0x0000000C,
0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x0000040B, 0xFFFFFE00,
0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C,
0x00000388, 0x000001C0, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008,
0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C,
0x00000AC8, 0x0000003F, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004,
0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006, 0x0004002B, 0x0000000C,
0x0000078B, 0x0FFFFFFF, 0x0004002B, 0x0000000C, 0x00000A05, 0xFFFFFFFE,
0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0004002B, 0x0000000B,
0x00000ACA, 0x00000040, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B,
0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B,
0x00040020, 0x00000706, 0x00000002, 0x00000489, 0x0004003B, 0x00000706,
0x0000147D, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,
0x00040020, 0x00000288, 0x00000002, 0x0000000B, 0x0005002C, 0x00000011,
0x0000077B, 0x00000A16, 0x00000A1C, 0x00040020, 0x00000291, 0x00000002,
0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B,
0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A34,
0x00000A16, 0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009,
0x00000002, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4,
0x000007DC, 0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B,
0x00000A31, 0x0000140E, 0x00000002, 0x0003001D, 0x000007DD, 0x00000017,
0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A32, 0x00000002,
0x000007B5, 0x0004003B, 0x00000A32, 0x0000107A, 0x00000002, 0x00040020,
0x00000294, 0x00000002, 0x00000017, 0x0006002C, 0x00000014, 0x00000BB1,
0x00000A10, 0x00000A6A, 0x00000A0D, 0x0005002C, 0x00000011, 0x0000074E,
0x00000A13, 0x00000A13, 0x0007002C, 0x00000017, 0x000009CE, 0x000008A6,
0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C, 0x00000017, 0x0000013D,
0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C, 0x00000017,
0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C,
0x0000001A, 0x00000302, 0x00000A3B, 0x00000A3B, 0x00000A3B, 0x00000A3B,
0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x00050036, 0x00000008,
0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7,
0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00003B21, 0x000200F8,
0x00003B21, 0x0004003D, 0x00000014, 0x0000312F, 0x00000F48, 0x000500C4,
0x00000014, 0x000027F5, 0x0000312F, 0x00000A34, 0x00050041, 0x00000291,
0x0000625A, 0x0000147D, 0x00000A17, 0x0004003D, 0x00000014, 0x000059B5,
0x0000625A, 0x0007004F, 0x00000011, 0x00004993, 0x000027F5, 0x000027F5,
0x00000000, 0x00000001, 0x0007004F, 0x00000011, 0x000019E2, 0x000059B5,
0x000059B5, 0x00000000, 0x00000001, 0x000500AE, 0x0000000F, 0x00004288,
0x00004993, 0x000019E2, 0x0004009A, 0x00000009, 0x00006067, 0x00004288,
0x000300F7, 0x0000188A, 0x00000002, 0x000400FA, 0x00006067, 0x000055E8,
0x0000188A, 0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8,
0x0000188A, 0x0004007C, 0x00000016, 0x00001A8B, 0x000027F5, 0x00050041,
0x00000288, 0x00004968, 0x0000147D, 0x00000A1D, 0x0004003D, 0x0000000B,
0x0000263C, 0x00004968, 0x00050051, 0x0000000B, 0x00004F98, 0x000059B5,
0x00000001, 0x00050051, 0x0000000C, 0x00003964, 0x00001A8B, 0x00000000,
0x00050084, 0x0000000C, 0x0000591A, 0x00003964, 0x00000A11, 0x00050051,
0x0000000C, 0x000018DA, 0x00001A8B, 0x00000002, 0x0004007C, 0x0000000C,
0x000038A9, 0x00004F98, 0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA,
0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00001A8B, 0x00000001,
0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C,
0x0000000C, 0x00005785, 0x0000263C, 0x00050084, 0x0000000C, 0x00005FD7,
0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00001B95, 0x0000591A,
0x00005FD7, 0x0004007C, 0x0000000B, 0x00004B46, 0x00001B95, 0x00050041,
0x00000288, 0x00004C04, 0x0000147D, 0x00000A1A, 0x0004003D, 0x0000000B,
0x0000595B, 0x00004C04, 0x00050080, 0x0000000B, 0x00002145, 0x00004B46,
0x0000595B, 0x000500C2, 0x0000000B, 0x000054A6, 0x00002145, 0x00000A16,
0x00050041, 0x00000288, 0x000047E4, 0x0000147D, 0x00000A0E, 0x0004003D,
0x0000000B, 0x00005B88, 0x000047E4, 0x00050041, 0x00000288, 0x000058AC,
0x0000147D, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00004FA3, 0x000058AC,
0x000500C7, 0x0000000B, 0x00005707, 0x00004FA3, 0x00000A10, 0x000500AB,
0x00000009, 0x00004B17, 0x00005707, 0x00000A0A, 0x00050050, 0x00000011,
0x0000435F, 0x00004FA3, 0x00004FA3, 0x000500C2, 0x00000011, 0x000059A3,
0x0000435F, 0x0000077B, 0x000500C7, 0x00000011, 0x00001997, 0x000059A3,
0x0000074E, 0x00050041, 0x00000288, 0x0000492C, 0x0000147D, 0x00000A11,
0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288,
0x00004FEA, 0x0000147D, 0x00000A14, 0x0004003D, 0x0000000B, 0x00005697,
0x00004FEA, 0x00050051, 0x0000000B, 0x000049F1, 0x000027F5, 0x00000000,
0x000500C2, 0x0000000B, 0x000019EE, 0x000049F1, 0x00000A13, 0x00050051,
0x0000000B, 0x00002704, 0x000027F5, 0x00000001, 0x00050050, 0x00000011,
0x00005C0B, 0x000019EE, 0x00002704, 0x00050086, 0x00000011, 0x00001F69,
0x00005C0B, 0x00001997, 0x00050051, 0x0000000B, 0x0000366C, 0x00001F69,
0x00000000, 0x000500C4, 0x0000000B, 0x00004D4D, 0x0000366C, 0x00000A13,
0x00050051, 0x0000000B, 0x000051A9, 0x00001F69, 0x00000001, 0x00050051,
0x0000000B, 0x000059EE, 0x000027F5, 0x00000002, 0x00060050, 0x00000014,
0x000024C9, 0x00004D4D, 0x000051A9, 0x000059EE, 0x000300F7, 0x00005341,
0x00000002, 0x000400FA, 0x00004B17, 0x0000537D, 0x00002DD9, 0x000200F8,
0x0000537D, 0x0004007C, 0x00000016, 0x00002970, 0x000024C9, 0x00050051,
0x0000000C, 0x000042C2, 0x00002970, 0x00000001, 0x000500C3, 0x0000000C,
0x000024FD, 0x000042C2, 0x00000A17, 0x00050051, 0x0000000C, 0x00002747,
0x00002970, 0x00000002, 0x000500C3, 0x0000000C, 0x0000405C, 0x00002747,
0x00000A11, 0x000500C2, 0x0000000B, 0x00005B4D, 0x00005697, 0x00000A16,
0x0004007C, 0x0000000C, 0x000018AA, 0x00005B4D, 0x00050084, 0x0000000C,
0x00005321, 0x0000405C, 0x000018AA, 0x00050080, 0x0000000C, 0x00003B27,
0x000024FD, 0x00005321, 0x000500C2, 0x0000000B, 0x00002348, 0x00005EAC,
0x00000A19, 0x0004007C, 0x0000000C, 0x0000308B, 0x00002348, 0x00050084,
0x0000000C, 0x00002878, 0x00003B27, 0x0000308B, 0x00050051, 0x0000000C,
0x00006242, 0x00002970, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7,
0x00006242, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC, 0x00004FC7,
0x00002878, 0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC, 0x00000A1F,
0x000500C7, 0x0000000C, 0x00002CF6, 0x0000225D, 0x0000078B, 0x000500C4,
0x0000000C, 0x000049FA, 0x00002CF6, 0x00000A0E, 0x000500C7, 0x0000000C,
0x00004D38, 0x00006242, 0x00000A20, 0x000500C7, 0x0000000C, 0x00003138,
0x000042C2, 0x00000A1D, 0x000500C4, 0x0000000C, 0x0000454D, 0x00003138,
0x00000A11, 0x00050080, 0x0000000C, 0x0000434B, 0x00004D38, 0x0000454D,
0x000500C4, 0x0000000C, 0x00001B88, 0x0000434B, 0x00000A1F, 0x000500C3,
0x0000000C, 0x00005DE3, 0x00001B88, 0x00000A1D, 0x000500C3, 0x0000000C,
0x00002215, 0x000042C2, 0x00000A14, 0x00050080, 0x0000000C, 0x000035A3,
0x00002215, 0x0000405C, 0x000500C7, 0x0000000C, 0x00005A0C, 0x000035A3,
0x00000A0E, 0x000500C3, 0x0000000C, 0x00004112, 0x00006242, 0x00000A14,
0x000500C4, 0x0000000C, 0x0000496A, 0x00005A0C, 0x00000A0E, 0x00050080,
0x0000000C, 0x000034BD, 0x00004112, 0x0000496A, 0x000500C7, 0x0000000C,
0x00004ADD, 0x000034BD, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000544A,
0x00004ADD, 0x00000A0E, 0x00050080, 0x0000000C, 0x00003C4B, 0x00005A0C,
0x0000544A, 0x000500C7, 0x0000000C, 0x0000335E, 0x00005DE3, 0x000009DB,
0x00050080, 0x0000000C, 0x00004F70, 0x000049FA, 0x0000335E, 0x000500C4,
0x0000000C, 0x00005B31, 0x00004F70, 0x00000A0E, 0x000500C7, 0x0000000C,
0x00005AEA, 0x00005DE3, 0x00000A39, 0x00050080, 0x0000000C, 0x0000285C,
0x00005B31, 0x00005AEA, 0x000500C7, 0x0000000C, 0x000047B4, 0x00002747,
0x00000A14, 0x000500C4, 0x0000000C, 0x0000544B, 0x000047B4, 0x00000A1F,
0x00050080, 0x0000000C, 0x00004157, 0x0000285C, 0x0000544B, 0x000500C7,
0x0000000C, 0x00004ADE, 0x000042C2, 0x00000A0E, 0x000500C4, 0x0000000C,
0x0000544C, 0x00004ADE, 0x00000A17, 0x00050080, 0x0000000C, 0x00004158,
0x00004157, 0x0000544C, 0x000500C7, 0x0000000C, 0x00004FD6, 0x00003C4B,
0x00000A0E, 0x000500C4, 0x0000000C, 0x00002703, 0x00004FD6, 0x00000A14,
0x000500C3, 0x0000000C, 0x00003332, 0x00004158, 0x00000A1D, 0x000500C7,
0x0000000C, 0x000036D6, 0x00003332, 0x00000A20, 0x00050080, 0x0000000C,
0x00003412, 0x00002703, 0x000036D6, 0x000500C4, 0x0000000C, 0x00005B32,
0x00003412, 0x00000A14, 0x000500C7, 0x0000000C, 0x00005AB1, 0x00003C4B,
0x00000A05, 0x00050080, 0x0000000C, 0x00002A9C, 0x00005B32, 0x00005AB1,
0x000500C4, 0x0000000C, 0x00005B33, 0x00002A9C, 0x00000A11, 0x000500C7,
0x0000000C, 0x00005AB2, 0x00004158, 0x0000040B, 0x00050080, 0x0000000C,
0x00002A9D, 0x00005B33, 0x00005AB2, 0x000500C4, 0x0000000C, 0x00005B34,
0x00002A9D, 0x00000A14, 0x000500C7, 0x0000000C, 0x00005559, 0x00004158,
0x00000AC8, 0x00050080, 0x0000000C, 0x00005EFA, 0x00005B34, 0x00005559,
0x0004007C, 0x0000000B, 0x0000566F, 0x00005EFA, 0x000200F9, 0x00005341,
0x000200F8, 0x00002DD9, 0x0007004F, 0x00000011, 0x00002621, 0x000024C9,
0x000024C9, 0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x000059CF,
0x00002621, 0x00050051, 0x0000000C, 0x00001903, 0x000059CF, 0x00000000,
0x000500C3, 0x0000000C, 0x000024FE, 0x00001903, 0x00000A1A, 0x00050051,
0x0000000C, 0x00002748, 0x000059CF, 0x00000001, 0x000500C3, 0x0000000C,
0x0000405D, 0x00002748, 0x00000A1A, 0x000500C2, 0x0000000B, 0x00005B4E,
0x00005EAC, 0x00000A19, 0x0004007C, 0x0000000C, 0x000018AB, 0x00005B4E,
0x00050084, 0x0000000C, 0x00005347, 0x0000405D, 0x000018AB, 0x00050080,
0x0000000C, 0x00003F5E, 0x000024FE, 0x00005347, 0x000500C4, 0x0000000C,
0x00004A8E, 0x00003F5E, 0x00000A22, 0x000500C7, 0x0000000C, 0x00002AB6,
0x00001903, 0x00000A20, 0x000500C7, 0x0000000C, 0x00003139, 0x00002748,
0x00000A35, 0x000500C4, 0x0000000C, 0x0000454E, 0x00003139, 0x00000A11,
0x00050080, 0x0000000C, 0x00004397, 0x00002AB6, 0x0000454E, 0x000500C4,
0x0000000C, 0x000018E7, 0x00004397, 0x00000A0D, 0x000500C7, 0x0000000C,
0x000027B1, 0x000018E7, 0x000009DB, 0x000500C4, 0x0000000C, 0x00002F76,
0x000027B1, 0x00000A0E, 0x00050080, 0x0000000C, 0x00003C4C, 0x00004A8E,
0x00002F76, 0x000500C7, 0x0000000C, 0x00003397, 0x000018E7, 0x00000A39,
0x00050080, 0x0000000C, 0x00004D30, 0x00003C4C, 0x00003397, 0x000500C7,
0x0000000C, 0x000047B5, 0x00002748, 0x00000A0E, 0x000500C4, 0x0000000C,
0x0000544D, 0x000047B5, 0x00000A17, 0x00050080, 0x0000000C, 0x00004159,
0x00004D30, 0x0000544D, 0x000500C7, 0x0000000C, 0x00005022, 0x00004159,
0x0000040B, 0x000500C4, 0x0000000C, 0x00002416, 0x00005022, 0x00000A14,
0x000500C7, 0x0000000C, 0x00004A33, 0x00002748, 0x00000A3B, 0x000500C4,
0x0000000C, 0x00002F77, 0x00004A33, 0x00000A20, 0x00050080, 0x0000000C,
0x0000415A, 0x00002416, 0x00002F77, 0x000500C7, 0x0000000C, 0x00004ADF,
0x00004159, 0x00000388, 0x000500C4, 0x0000000C, 0x0000544E, 0x00004ADF,
0x00000A11, 0x00050080, 0x0000000C, 0x00004144, 0x0000415A, 0x0000544E,
0x000500C7, 0x0000000C, 0x00005083, 0x00002748, 0x00000A23, 0x000500C3,
0x0000000C, 0x000041BF, 0x00005083, 0x00000A11, 0x000500C3, 0x0000000C,
0x00001EEC, 0x00001903, 0x00000A14, 0x00050080, 0x0000000C, 0x000035B6,
0x000041BF, 0x00001EEC, 0x000500C7, 0x0000000C, 0x00005453, 0x000035B6,
0x00000A14, 0x000500C4, 0x0000000C, 0x0000544F, 0x00005453, 0x00000A1D,
0x00050080, 0x0000000C, 0x00003C4D, 0x00004144, 0x0000544F, 0x000500C7,
0x0000000C, 0x00002E06, 0x00004159, 0x00000AC8, 0x00050080, 0x0000000C,
0x0000394F, 0x00003C4D, 0x00002E06, 0x0004007C, 0x0000000B, 0x00005670,
0x0000394F, 0x000200F9, 0x00005341, 0x000200F8, 0x00005341, 0x000700F5,
0x0000000B, 0x000024FC, 0x0000566F, 0x0000537D, 0x00005670, 0x00002DD9,
0x00050084, 0x00000011, 0x00003FA8, 0x00001F69, 0x00001997, 0x00050082,
0x00000011, 0x00003BBC, 0x00005C0B, 0x00003FA8, 0x00050051, 0x0000000B,
0x00001C87, 0x00001997, 0x00000000, 0x00050051, 0x0000000B, 0x00005962,
0x00001997, 0x00000001, 0x00050084, 0x0000000B, 0x00003372, 0x00001C87,
0x00005962, 0x00050084, 0x0000000B, 0x00003CA0, 0x000024FC, 0x00003372,
0x00050051, 0x0000000B, 0x00003ED4, 0x00003BBC, 0x00000000, 0x00050084,
0x0000000B, 0x00003E12, 0x00003ED4, 0x00005962, 0x00050051, 0x0000000B,
0x00001AE6, 0x00003BBC, 0x00000001, 0x00050080, 0x0000000B, 0x00002B25,
0x00003E12, 0x00001AE6, 0x000500C4, 0x0000000B, 0x0000609D, 0x00002B25,
0x00000A13, 0x000500C7, 0x0000000B, 0x00005AB3, 0x000049F1, 0x00000A1F,
0x00050080, 0x0000000B, 0x00002557, 0x0000609D, 0x00005AB3, 0x000500C4,
0x0000000B, 0x000040AD, 0x00002557, 0x00000A0D, 0x00050080, 0x0000000B,
0x00004EAA, 0x00003CA0, 0x000040AD, 0x00050080, 0x0000000B, 0x0000453C,
0x00005B88, 0x00004EAA, 0x000500C2, 0x0000000B, 0x000036D8, 0x0000453C,
0x00000A16, 0x000500C2, 0x0000000B, 0x00002DF6, 0x00004FA3, 0x00000A10,
0x000500C7, 0x0000000B, 0x000020CA, 0x00002DF6, 0x00000A13, 0x00060041,
0x00000294, 0x000050F7, 0x0000107A, 0x00000A0B, 0x000036D8, 0x0004003D,
0x00000017, 0x00002585, 0x000050F7, 0x000500AA, 0x00000009, 0x00005272,
0x000020CA, 0x00000A0D, 0x000300F7, 0x000030F9, 0x00000000, 0x000400FA,
0x00005272, 0x00002957, 0x000030F9, 0x000200F8, 0x00002957, 0x000500C7,
0x00000017, 0x0000475F, 0x00002585, 0x000009CE, 0x000500C4, 0x00000017,
0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC,
0x00002585, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC,
0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D,
0x000200F9, 0x000030F9, 0x000200F8, 0x000030F9, 0x000700F5, 0x00000017,
0x00002F4A, 0x00002585, 0x00005341, 0x00003FF8, 0x00002957, 0x0004007C,
0x0000001A, 0x00003C0F, 0x00002F4A, 0x000500C4, 0x0000001A, 0x0000420E,
0x00003C0F, 0x00000302, 0x000500C3, 0x0000001A, 0x00004098, 0x0000420E,
0x00000302, 0x0004006F, 0x0000001D, 0x00002A97, 0x00004098, 0x0005008E,
0x0000001D, 0x00004FBD, 0x00002A97, 0x00000A38, 0x0007000C, 0x0000001D,
0x00005DB5, 0x00000001, 0x00000028, 0x00000504, 0x00004FBD, 0x000500C3,
0x0000001A, 0x00003802, 0x00003C0F, 0x00000302, 0x0004006F, 0x0000001D,
0x000019CF, 0x00003802, 0x0005008E, 0x0000001D, 0x00004747, 0x000019CF,
0x00000A38, 0x0007000C, 0x0000001D, 0x00005E06, 0x00000001, 0x00000028,
0x00000504, 0x00004747, 0x00050051, 0x0000000D, 0x00005F0A, 0x00005DB5,
0x00000000, 0x00050051, 0x0000000D, 0x000037EF, 0x00005E06, 0x00000000,
0x00050050, 0x00000013, 0x00004B20, 0x00005F0A, 0x000037EF, 0x0006000C,
0x0000000B, 0x00002171, 0x00000001, 0x0000003A, 0x00004B20, 0x00050051,
0x0000000D, 0x00005BBF, 0x00005DB5, 0x00000001, 0x00050051, 0x0000000D,
0x000039A7, 0x00005E06, 0x00000001, 0x00050050, 0x00000013, 0x00004B21,
0x00005BBF, 0x000039A7, 0x0006000C, 0x0000000B, 0x00002172, 0x00000001,
0x0000003A, 0x00004B21, 0x00050051, 0x0000000D, 0x00005BC0, 0x00005DB5,
0x00000002, 0x00050051, 0x0000000D, 0x000039A8, 0x00005E06, 0x00000002,
0x00050050, 0x00000013, 0x00004B22, 0x00005BC0, 0x000039A8, 0x0006000C,
0x0000000B, 0x00002173, 0x00000001, 0x0000003A, 0x00004B22, 0x00050051,
0x0000000D, 0x00005BC1, 0x00005DB5, 0x00000003, 0x00050051, 0x0000000D,
0x000039A9, 0x00005E06, 0x00000003, 0x00050050, 0x00000013, 0x00004B0D,
0x00005BC1, 0x000039A9, 0x0006000C, 0x0000000B, 0x000020EE, 0x00000001,
0x0000003A, 0x00004B0D, 0x00070050, 0x00000017, 0x00003ABB, 0x00002171,
0x00002172, 0x00002173, 0x000020EE, 0x00060041, 0x00000294, 0x000045C3,
0x0000140E, 0x00000A0B, 0x000054A6, 0x0003003E, 0x000045C3, 0x00003ABB,
0x00050080, 0x0000000B, 0x00003CAC, 0x000054A6, 0x00000A0E, 0x000500AC,
0x00000009, 0x00001911, 0x00001C87, 0x00000A0D, 0x000300F7, 0x000060BC,
0x00000002, 0x000400FA, 0x00001911, 0x00005084, 0x00005094, 0x000200F8,
0x00005084, 0x00050086, 0x0000000B, 0x00003697, 0x000019EE, 0x00001C87,
0x00050084, 0x0000000B, 0x0000237E, 0x00003697, 0x00001C87, 0x00050082,
0x0000000B, 0x00003171, 0x000019EE, 0x0000237E, 0x00050080, 0x0000000B,
0x00002527, 0x00003171, 0x00000A0D, 0x000500AA, 0x00000009, 0x0000343F,
0x00002527, 0x00001C87, 0x000300F7, 0x00001EED, 0x00000000, 0x000400FA,
0x0000343F, 0x0000569E, 0x00002191, 0x000200F8, 0x0000569E, 0x00050084,
0x0000000B, 0x00004B59, 0x00000ACA, 0x00001C87, 0x000500C4, 0x0000000B,
0x0000540F, 0x00003171, 0x00000A16, 0x00050082, 0x0000000B, 0x00004944,
0x00004B59, 0x0000540F, 0x000200F9, 0x00001EED, 0x000200F8, 0x00002191,
0x000200F9, 0x00001EED, 0x000200F8, 0x00001EED, 0x000700F5, 0x0000000B,
0x0000292C, 0x00004944, 0x0000569E, 0x00000A3A, 0x00002191, 0x000200F9,
0x000060BC, 0x000200F8, 0x00005094, 0x000200F9, 0x000060BC, 0x000200F8,
0x000060BC, 0x000700F5, 0x0000000B, 0x000029BC, 0x0000292C, 0x00001EED,
0x00000ACA, 0x00005094, 0x00050084, 0x0000000B, 0x0000492B, 0x000029BC,
0x00005962, 0x000500C2, 0x0000000B, 0x0000406D, 0x0000492B, 0x00000A16,
0x00050080, 0x0000000B, 0x0000336B, 0x000036D8, 0x0000406D, 0x00060041,
0x00000294, 0x0000571A, 0x0000107A, 0x00000A0B, 0x0000336B, 0x0004003D,
0x00000017, 0x000019B2, 0x0000571A, 0x000300F7, 0x000030FA, 0x00000000,
0x000400FA, 0x00005272, 0x00002958, 0x000030FA, 0x000200F8, 0x00002958,
0x000500C7, 0x00000017, 0x00004760, 0x000019B2, 0x000009CE, 0x000500C4,
0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017,
0x000050AD, 0x000019B2, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E,
0x000050AD, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2,
0x0000448E, 0x000200F9, 0x000030FA, 0x000200F8, 0x000030FA, 0x000700F5,
0x00000017, 0x00002F4B, 0x000019B2, 0x000060BC, 0x00003FF9, 0x00002958,
0x0004007C, 0x0000001A, 0x00003C10, 0x00002F4B, 0x000500C4, 0x0000001A,
0x0000420F, 0x00003C10, 0x00000302, 0x000500C3, 0x0000001A, 0x00004099,
0x0000420F, 0x00000302, 0x0004006F, 0x0000001D, 0x00002A98, 0x00004099,
0x0005008E, 0x0000001D, 0x00004FBE, 0x00002A98, 0x00000A38, 0x0007000C,
0x0000001D, 0x00005DB6, 0x00000001, 0x00000028, 0x00000504, 0x00004FBE,
0x000500C3, 0x0000001A, 0x00003803, 0x00003C10, 0x00000302, 0x0004006F,
0x0000001D, 0x000019D0, 0x00003803, 0x0005008E, 0x0000001D, 0x00004748,
0x000019D0, 0x00000A38, 0x0007000C, 0x0000001D, 0x00005E07, 0x00000001,
0x00000028, 0x00000504, 0x00004748, 0x00050051, 0x0000000D, 0x00005F0B,
0x00005DB6, 0x00000000, 0x00050051, 0x0000000D, 0x000037F0, 0x00005E07,
0x00000000, 0x00050050, 0x00000013, 0x00004B23, 0x00005F0B, 0x000037F0,
0x0006000C, 0x0000000B, 0x00002174, 0x00000001, 0x0000003A, 0x00004B23,
0x00050051, 0x0000000D, 0x00005BC2, 0x00005DB6, 0x00000001, 0x00050051,
0x0000000D, 0x000039AA, 0x00005E07, 0x00000001, 0x00050050, 0x00000013,
0x00004B24, 0x00005BC2, 0x000039AA, 0x0006000C, 0x0000000B, 0x00002175,
0x00000001, 0x0000003A, 0x00004B24, 0x00050051, 0x0000000D, 0x00005BC3,
0x00005DB6, 0x00000002, 0x00050051, 0x0000000D, 0x000039AB, 0x00005E07,
0x00000002, 0x00050050, 0x00000013, 0x00004B25, 0x00005BC3, 0x000039AB,
0x0006000C, 0x0000000B, 0x00002176, 0x00000001, 0x0000003A, 0x00004B25,
0x00050051, 0x0000000D, 0x00005BC4, 0x00005DB6, 0x00000003, 0x00050051,
0x0000000D, 0x000039AC, 0x00005E07, 0x00000003, 0x00050050, 0x00000013,
0x00004B0E, 0x00005BC4, 0x000039AC, 0x0006000C, 0x0000000B, 0x000020EF,
0x00000001, 0x0000003A, 0x00004B0E, 0x00070050, 0x00000017, 0x00003ABC,
0x00002174, 0x00002175, 0x00002176, 0x000020EF, 0x00060041, 0x00000294,
0x00004EBE, 0x0000140E, 0x00000A0B, 0x00003CAC, 0x0003003E, 0x00004EBE,
0x00003ABC, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD,
0x00010038,
};

View File

@ -0,0 +1,647 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 10
; Bound: 25179
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %5663 "main" %gl_GlobalInvocationID
OpExecutionMode %5663 LocalSize 2 32 1
OpMemberDecorate %_struct_1161 0 Offset 0
OpMemberDecorate %_struct_1161 1 Offset 4
OpMemberDecorate %_struct_1161 2 Offset 8
OpMemberDecorate %_struct_1161 3 Offset 12
OpMemberDecorate %_struct_1161 4 Offset 16
OpMemberDecorate %_struct_1161 5 Offset 28
OpMemberDecorate %_struct_1161 6 Offset 32
OpMemberDecorate %_struct_1161 7 Offset 36
OpDecorate %_struct_1161 Block
OpDecorate %5245 DescriptorSet 2
OpDecorate %5245 Binding 0
OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
OpDecorate %_runtimearr_v4uint ArrayStride 16
OpMemberDecorate %_struct_1972 0 NonReadable
OpMemberDecorate %_struct_1972 0 Offset 0
OpDecorate %_struct_1972 BufferBlock
OpDecorate %5134 DescriptorSet 0
OpDecorate %5134 Binding 0
OpDecorate %_runtimearr_v4uint_0 ArrayStride 16
OpMemberDecorate %_struct_1973 0 NonWritable
OpMemberDecorate %_struct_1973 0 Offset 0
OpDecorate %_struct_1973 BufferBlock
OpDecorate %4218 DescriptorSet 1
OpDecorate %4218 Binding 0
OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%v4uint = OpTypeVector %uint 4
%int = OpTypeInt 32 1
%v2int = OpTypeVector %int 2
%v3int = OpTypeVector %int 3
%bool = OpTypeBool
%v3uint = OpTypeVector %uint 3
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%uint_65535 = OpConstant %uint 65535
%float_1_52590219en05 = OpConstant %float 1.52590219e-05
%uint_16 = OpConstant %uint 16
%uint_0 = OpConstant %uint 0
%v2float = OpTypeVector %float 2
%uint_1 = OpConstant %uint 1
%uint_2 = OpConstant %uint 2
%uint_3 = OpConstant %uint 3
%uint_16711935 = OpConstant %uint 16711935
%uint_8 = OpConstant %uint 8
%uint_4278255360 = OpConstant %uint 4278255360
%int_5 = OpConstant %int 5
%uint_5 = OpConstant %uint 5
%uint_7 = OpConstant %uint 7
%int_7 = OpConstant %int 7
%int_14 = OpConstant %int 14
%int_2 = OpConstant %int 2
%int_n16 = OpConstant %int -16
%int_1 = OpConstant %int 1
%int_15 = OpConstant %int 15
%int_4 = OpConstant %int 4
%int_n512 = OpConstant %int -512
%int_3 = OpConstant %int 3
%int_16 = OpConstant %int 16
%int_448 = OpConstant %int 448
%int_8 = OpConstant %int 8
%int_6 = OpConstant %int 6
%int_63 = OpConstant %int 63
%uint_4 = OpConstant %uint 4
%int_268435455 = OpConstant %int 268435455
%int_n2 = OpConstant %int -2
%uint_32 = OpConstant %uint 32
%uint_64 = OpConstant %uint 64
%_struct_1161 = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint
%_ptr_Uniform__struct_1161 = OpTypePointer Uniform %_struct_1161
%5245 = OpVariable %_ptr_Uniform__struct_1161 Uniform
%int_0 = OpConstant %int 0
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
%v2uint = OpTypeVector %uint 2
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
%2612 = OpConstantComposite %v3uint %uint_4 %uint_0 %uint_0
%v2bool = OpTypeVector %bool 2
%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint
%_struct_1972 = OpTypeStruct %_runtimearr_v4uint
%_ptr_Uniform__struct_1972 = OpTypePointer Uniform %_struct_1972
%5134 = OpVariable %_ptr_Uniform__struct_1972 Uniform
%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint
%_struct_1973 = OpTypeStruct %_runtimearr_v4uint_0
%_ptr_Uniform__struct_1973 = OpTypePointer Uniform %_struct_1973
%4218 = OpVariable %_ptr_Uniform__struct_1973 Uniform
%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_2 %uint_32 %uint_1
%2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935
%317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8
%1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360
%850 = OpConstantComposite %v4uint %uint_65535 %uint_65535 %uint_65535 %uint_65535
%749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16
%5663 = OpFunction %void None %1282
%15110 = OpLabel
OpSelectionMerge %19578 None
OpSwitch %uint_0 %15137
%15137 = OpLabel
%12591 = OpLoad %v3uint %gl_GlobalInvocationID
%10229 = OpShiftLeftLogical %v3uint %12591 %2612
%25178 = OpAccessChain %_ptr_Uniform_v3uint %5245 %int_4
%22965 = OpLoad %v3uint %25178
%18835 = OpVectorShuffle %v2uint %10229 %10229 0 1
%6626 = OpVectorShuffle %v2uint %22965 %22965 0 1
%17032 = OpUGreaterThanEqual %v2bool %18835 %6626
%24679 = OpAny %bool %17032
OpSelectionMerge %6282 DontFlatten
OpBranchConditional %24679 %21992 %6282
%21992 = OpLabel
OpBranch %19578
%6282 = OpLabel
%6795 = OpBitcast %v3int %10229
%18792 = OpAccessChain %_ptr_Uniform_uint %5245 %int_6
%9788 = OpLoad %uint %18792
%20376 = OpCompositeExtract %uint %22965 1
%14692 = OpCompositeExtract %int %6795 0
%22810 = OpIMul %int %14692 %int_2
%6362 = OpCompositeExtract %int %6795 2
%14505 = OpBitcast %int %20376
%11279 = OpIMul %int %6362 %14505
%17598 = OpCompositeExtract %int %6795 1
%22228 = OpIAdd %int %11279 %17598
%22405 = OpBitcast %int %9788
%24535 = OpIMul %int %22228 %22405
%7061 = OpIAdd %int %22810 %24535
%19270 = OpBitcast %uint %7061
%19460 = OpAccessChain %_ptr_Uniform_uint %5245 %int_5
%22875 = OpLoad %uint %19460
%8517 = OpIAdd %uint %19270 %22875
%21670 = OpShiftRightLogical %uint %8517 %uint_4
%20950 = OpAccessChain %_ptr_Uniform_uint %5245 %int_0
%21411 = OpLoad %uint %20950
%6381 = OpBitwiseAnd %uint %21411 %uint_1
%10467 = OpINotEqual %bool %6381 %uint_0
OpSelectionMerge %23266 DontFlatten
OpBranchConditional %10467 %10108 %10765
%10108 = OpLabel
%23508 = OpBitwiseAnd %uint %21411 %uint_2
%16300 = OpINotEqual %bool %23508 %uint_0
OpSelectionMerge %7691 DontFlatten
OpBranchConditional %16300 %12129 %25128
%12129 = OpLabel
%18210 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%15627 = OpLoad %uint %18210
%22624 = OpAccessChain %_ptr_Uniform_uint %5245 %int_3
%21535 = OpLoad %uint %22624
%14923 = OpShiftRightArithmetic %int %17598 %int_4
%18773 = OpShiftRightArithmetic %int %6362 %int_2
%18759 = OpShiftRightLogical %uint %21535 %uint_4
%6314 = OpBitcast %int %18759
%21281 = OpIMul %int %18773 %6314
%15143 = OpIAdd %int %14923 %21281
%9032 = OpShiftRightLogical %uint %15627 %uint_5
%14593 = OpBitcast %int %9032
%8436 = OpIMul %int %15143 %14593
%12986 = OpShiftRightArithmetic %int %14692 %int_5
%24558 = OpIAdd %int %12986 %8436
%8797 = OpShiftLeftLogical %int %24558 %uint_7
%11510 = OpBitwiseAnd %int %8797 %int_268435455
%18938 = OpShiftLeftLogical %int %11510 %int_1
%19768 = OpBitwiseAnd %int %14692 %int_7
%12600 = OpBitwiseAnd %int %17598 %int_6
%17741 = OpShiftLeftLogical %int %12600 %int_2
%17227 = OpIAdd %int %19768 %17741
%7048 = OpShiftLeftLogical %int %17227 %uint_7
%24035 = OpShiftRightArithmetic %int %7048 %int_6
%8725 = OpShiftRightArithmetic %int %17598 %int_3
%13731 = OpIAdd %int %8725 %18773
%23052 = OpBitwiseAnd %int %13731 %int_1
%16658 = OpShiftRightArithmetic %int %14692 %int_3
%18794 = OpShiftLeftLogical %int %23052 %int_1
%13501 = OpIAdd %int %16658 %18794
%19165 = OpBitwiseAnd %int %13501 %int_3
%21578 = OpShiftLeftLogical %int %19165 %int_1
%15435 = OpIAdd %int %23052 %21578
%13150 = OpBitwiseAnd %int %24035 %int_n16
%20336 = OpIAdd %int %18938 %13150
%23345 = OpShiftLeftLogical %int %20336 %int_1
%23274 = OpBitwiseAnd %int %24035 %int_15
%10332 = OpIAdd %int %23345 %23274
%18356 = OpBitwiseAnd %int %6362 %int_3
%21579 = OpShiftLeftLogical %int %18356 %uint_7
%16727 = OpIAdd %int %10332 %21579
%19166 = OpBitwiseAnd %int %17598 %int_1
%21580 = OpShiftLeftLogical %int %19166 %int_4
%16728 = OpIAdd %int %16727 %21580
%20438 = OpBitwiseAnd %int %15435 %int_1
%9987 = OpShiftLeftLogical %int %20438 %int_3
%13106 = OpShiftRightArithmetic %int %16728 %int_6
%14038 = OpBitwiseAnd %int %13106 %int_7
%13330 = OpIAdd %int %9987 %14038
%23346 = OpShiftLeftLogical %int %13330 %int_3
%23217 = OpBitwiseAnd %int %15435 %int_n2
%10908 = OpIAdd %int %23346 %23217
%23347 = OpShiftLeftLogical %int %10908 %int_2
%23218 = OpBitwiseAnd %int %16728 %int_n512
%10909 = OpIAdd %int %23347 %23218
%23348 = OpShiftLeftLogical %int %10909 %int_3
%24224 = OpBitwiseAnd %int %16728 %int_63
%21741 = OpIAdd %int %23348 %24224
OpBranch %7691
%25128 = OpLabel
%6796 = OpBitcast %v2int %18835
%18793 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%11954 = OpLoad %uint %18793
%18756 = OpCompositeExtract %int %6796 0
%19701 = OpShiftRightArithmetic %int %18756 %int_5
%10055 = OpCompositeExtract %int %6796 1
%16476 = OpShiftRightArithmetic %int %10055 %int_5
%23373 = OpShiftRightLogical %uint %11954 %uint_5
%6315 = OpBitcast %int %23373
%21319 = OpIMul %int %16476 %6315
%16222 = OpIAdd %int %19701 %21319
%19086 = OpShiftLeftLogical %int %16222 %uint_8
%10934 = OpBitwiseAnd %int %18756 %int_7
%12601 = OpBitwiseAnd %int %10055 %int_14
%17742 = OpShiftLeftLogical %int %12601 %int_2
%17303 = OpIAdd %int %10934 %17742
%6375 = OpShiftLeftLogical %int %17303 %uint_1
%10161 = OpBitwiseAnd %int %6375 %int_n16
%12150 = OpShiftLeftLogical %int %10161 %int_1
%15436 = OpIAdd %int %19086 %12150
%13207 = OpBitwiseAnd %int %6375 %int_15
%19760 = OpIAdd %int %15436 %13207
%18357 = OpBitwiseAnd %int %10055 %int_1
%21581 = OpShiftLeftLogical %int %18357 %int_4
%16729 = OpIAdd %int %19760 %21581
%20514 = OpBitwiseAnd %int %16729 %int_n512
%9238 = OpShiftLeftLogical %int %20514 %int_3
%18995 = OpBitwiseAnd %int %10055 %int_16
%12151 = OpShiftLeftLogical %int %18995 %int_7
%16730 = OpIAdd %int %9238 %12151
%19167 = OpBitwiseAnd %int %16729 %int_448
%21582 = OpShiftLeftLogical %int %19167 %int_2
%16708 = OpIAdd %int %16730 %21582
%20611 = OpBitwiseAnd %int %10055 %int_8
%16831 = OpShiftRightArithmetic %int %20611 %int_2
%7916 = OpShiftRightArithmetic %int %18756 %int_3
%13750 = OpIAdd %int %16831 %7916
%21587 = OpBitwiseAnd %int %13750 %int_3
%21583 = OpShiftLeftLogical %int %21587 %int_6
%15437 = OpIAdd %int %16708 %21583
%14157 = OpBitwiseAnd %int %16729 %int_63
%12098 = OpIAdd %int %15437 %14157
OpBranch %7691
%7691 = OpLabel
%10540 = OpPhi %int %21741 %12129 %12098 %25128
OpBranch %23266
%10765 = OpLabel
%20632 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%15628 = OpLoad %uint %20632
%21275 = OpAccessChain %_ptr_Uniform_uint %5245 %int_3
%13550 = OpLoad %uint %21275
%15070 = OpBitcast %int %13550
%18927 = OpIMul %int %6362 %15070
%8334 = OpIAdd %int %18927 %17598
%8952 = OpBitcast %int %15628
%7839 = OpIMul %int %8334 %8952
%7984 = OpIAdd %int %22810 %7839
OpBranch %23266
%23266 = OpLabel
%19748 = OpPhi %int %10540 %7691 %7984 %10765
%24922 = OpAccessChain %_ptr_Uniform_uint %5245 %int_1
%7502 = OpLoad %uint %24922
%15686 = OpBitcast %int %7502
%15579 = OpIAdd %int %15686 %19748
%18556 = OpBitcast %uint %15579
%21493 = OpShiftRightLogical %uint %18556 %uint_4
%14997 = OpShiftRightLogical %uint %21411 %uint_2
%8394 = OpBitwiseAnd %uint %14997 %uint_3
%20727 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %21493
%9605 = OpLoad %v4uint %20727
%21106 = OpIEqual %bool %8394 %uint_1
OpSelectionMerge %13962 None
OpBranchConditional %21106 %10583 %13962
%10583 = OpLabel
%18271 = OpBitwiseAnd %v4uint %9605 %2510
%9425 = OpShiftLeftLogical %v4uint %18271 %317
%20652 = OpBitwiseAnd %v4uint %9605 %1838
%17549 = OpShiftRightLogical %v4uint %20652 %317
%16376 = OpBitwiseOr %v4uint %9425 %17549
OpBranch %13962
%13962 = OpLabel
%16606 = OpPhi %v4uint %9605 %23266 %16376 %10583
%18240 = OpBitwiseAnd %v4uint %16606 %850
%9137 = OpConvertUToF %v4float %18240
%19365 = OpVectorTimesScalar %v4float %9137 %float_1_52590219en05
%23367 = OpShiftRightLogical %v4uint %16606 %749
%18492 = OpConvertUToF %v4float %23367
%18450 = OpVectorTimesScalar %v4float %18492 %float_1_52590219en05
%6268 = OpCompositeExtract %float %19365 0
%13806 = OpCompositeExtract %float %18450 0
%19232 = OpCompositeConstruct %v2float %6268 %13806
%8561 = OpExtInst %uint %1 PackHalf2x16 %19232
%23487 = OpCompositeExtract %float %19365 1
%14759 = OpCompositeExtract %float %18450 1
%19233 = OpCompositeConstruct %v2float %23487 %14759
%8562 = OpExtInst %uint %1 PackHalf2x16 %19233
%23488 = OpCompositeExtract %float %19365 2
%14760 = OpCompositeExtract %float %18450 2
%19234 = OpCompositeConstruct %v2float %23488 %14760
%8563 = OpExtInst %uint %1 PackHalf2x16 %19234
%23489 = OpCompositeExtract %float %19365 3
%14761 = OpCompositeExtract %float %18450 3
%19213 = OpCompositeConstruct %v2float %23489 %14761
%8430 = OpExtInst %uint %1 PackHalf2x16 %19213
%15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430
%17859 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %21670
OpStore %17859 %15035
%15044 = OpIAdd %uint %21670 %int_1
%18776 = OpSelect %uint %10467 %uint_64 %uint_16
%11803 = OpShiftRightLogical %uint %18776 %uint_4
%13947 = OpIAdd %uint %21493 %11803
%22298 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %13947
%6578 = OpLoad %v4uint %22298
OpSelectionMerge %13963 None
OpBranchConditional %21106 %10584 %13963
%10584 = OpLabel
%18272 = OpBitwiseAnd %v4uint %6578 %2510
%9426 = OpShiftLeftLogical %v4uint %18272 %317
%20653 = OpBitwiseAnd %v4uint %6578 %1838
%17550 = OpShiftRightLogical %v4uint %20653 %317
%16377 = OpBitwiseOr %v4uint %9426 %17550
OpBranch %13963
%13963 = OpLabel
%16607 = OpPhi %v4uint %6578 %13962 %16377 %10584
%18241 = OpBitwiseAnd %v4uint %16607 %850
%9138 = OpConvertUToF %v4float %18241
%19366 = OpVectorTimesScalar %v4float %9138 %float_1_52590219en05
%23368 = OpShiftRightLogical %v4uint %16607 %749
%18493 = OpConvertUToF %v4float %23368
%18451 = OpVectorTimesScalar %v4float %18493 %float_1_52590219en05
%6269 = OpCompositeExtract %float %19366 0
%13807 = OpCompositeExtract %float %18451 0
%19235 = OpCompositeConstruct %v2float %6269 %13807
%8564 = OpExtInst %uint %1 PackHalf2x16 %19235
%23490 = OpCompositeExtract %float %19366 1
%14762 = OpCompositeExtract %float %18451 1
%19236 = OpCompositeConstruct %v2float %23490 %14762
%8565 = OpExtInst %uint %1 PackHalf2x16 %19236
%23491 = OpCompositeExtract %float %19366 2
%14763 = OpCompositeExtract %float %18451 2
%19237 = OpCompositeConstruct %v2float %23491 %14763
%8566 = OpExtInst %uint %1 PackHalf2x16 %19237
%23492 = OpCompositeExtract %float %19366 3
%14764 = OpCompositeExtract %float %18451 3
%19214 = OpCompositeConstruct %v2float %23492 %14764
%8431 = OpExtInst %uint %1 PackHalf2x16 %19214
%15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431
%20158 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %15044
OpStore %20158 %15036
OpBranch %19578
%19578 = OpLabel
OpReturn
OpFunctionEnd
#endif
const uint32_t texture_load_r16_unorm_float_cs[] = {
0x07230203, 0x00010000, 0x0008000A, 0x0000625B, 0x00000000, 0x00020011,
0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,
0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,
0x00000011, 0x00000002, 0x00000020, 0x00000001, 0x00050048, 0x00000489,
0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001,
0x00000023, 0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023,
0x00000008, 0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C,
0x00050048, 0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048,
0x00000489, 0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489,
0x00000006, 0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007,
0x00000023, 0x00000024, 0x00030047, 0x00000489, 0x00000002, 0x00040047,
0x0000147D, 0x00000022, 0x00000002, 0x00040047, 0x0000147D, 0x00000021,
0x00000000, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,
0x000007DC, 0x00000006, 0x00000010, 0x00040048, 0x000007B4, 0x00000000,
0x00000019, 0x00050048, 0x000007B4, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B4, 0x00000003, 0x00040047, 0x0000140E, 0x00000022,
0x00000000, 0x00040047, 0x0000140E, 0x00000021, 0x00000000, 0x00040047,
0x000007DD, 0x00000006, 0x00000010, 0x00040048, 0x000007B5, 0x00000000,
0x00000018, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B5, 0x00000003, 0x00040047, 0x0000107A, 0x00000022,
0x00000001, 0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047,
0x00000BB1, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,
0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,
0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,
0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,
0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,
0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00030016, 0x0000000D,
0x00000020, 0x00040017, 0x0000001D, 0x0000000D, 0x00000004, 0x0004002B,
0x0000000B, 0x000001C1, 0x0000FFFF, 0x0004002B, 0x0000000D, 0x0000092A,
0x37800080, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B,
0x0000000B, 0x00000A0A, 0x00000000, 0x00040017, 0x00000013, 0x0000000D,
0x00000002, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B,
0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A13,
0x00000003, 0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B,
0x0000000B, 0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x000005FD,
0xFF00FF00, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B,
0x0000000B, 0x00000A19, 0x00000005, 0x0004002B, 0x0000000B, 0x00000A1F,
0x00000007, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B,
0x0000000C, 0x00000A35, 0x0000000E, 0x0004002B, 0x0000000C, 0x00000A11,
0x00000002, 0x0004002B, 0x0000000C, 0x000009DB, 0xFFFFFFF0, 0x0004002B,
0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A38,
0x0000000F, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B,
0x0000000C, 0x0000040B, 0xFFFFFE00, 0x0004002B, 0x0000000C, 0x00000A14,
0x00000003, 0x0004002B, 0x0000000C, 0x00000A3B, 0x00000010, 0x0004002B,
0x0000000C, 0x00000388, 0x000001C0, 0x0004002B, 0x0000000C, 0x00000A23,
0x00000008, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B,
0x0000000C, 0x00000AC8, 0x0000003F, 0x0004002B, 0x0000000B, 0x00000A16,
0x00000004, 0x0004002B, 0x0000000C, 0x0000078B, 0x0FFFFFFF, 0x0004002B,
0x0000000C, 0x00000A05, 0xFFFFFFFE, 0x0004002B, 0x0000000B, 0x00000A6A,
0x00000020, 0x0004002B, 0x0000000B, 0x00000ACA, 0x00000040, 0x000A001E,
0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00000014,
0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706, 0x00000002,
0x00000489, 0x0004003B, 0x00000706, 0x0000147D, 0x00000002, 0x0004002B,
0x0000000C, 0x00000A0B, 0x00000000, 0x00040020, 0x00000288, 0x00000002,
0x0000000B, 0x00040020, 0x00000291, 0x00000002, 0x00000014, 0x00040017,
0x00000011, 0x0000000B, 0x00000002, 0x00040020, 0x00000292, 0x00000001,
0x00000014, 0x0004003B, 0x00000292, 0x00000F48, 0x00000001, 0x0006002C,
0x00000014, 0x00000A34, 0x00000A16, 0x00000A0A, 0x00000A0A, 0x00040017,
0x0000000F, 0x00000009, 0x00000002, 0x0003001D, 0x000007DC, 0x00000017,
0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A31, 0x00000002,
0x000007B4, 0x0004003B, 0x00000A31, 0x0000140E, 0x00000002, 0x0003001D,
0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020,
0x00000A32, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A32, 0x0000107A,
0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0006002C,
0x00000014, 0x00000BB1, 0x00000A10, 0x00000A6A, 0x00000A0D, 0x0007002C,
0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6,
0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22,
0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD,
0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x00000352, 0x000001C1,
0x000001C1, 0x000001C1, 0x000001C1, 0x0007002C, 0x00000017, 0x000002ED,
0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00050036, 0x00000008,
0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7,
0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00003B21, 0x000200F8,
0x00003B21, 0x0004003D, 0x00000014, 0x0000312F, 0x00000F48, 0x000500C4,
0x00000014, 0x000027F5, 0x0000312F, 0x00000A34, 0x00050041, 0x00000291,
0x0000625A, 0x0000147D, 0x00000A17, 0x0004003D, 0x00000014, 0x000059B5,
0x0000625A, 0x0007004F, 0x00000011, 0x00004993, 0x000027F5, 0x000027F5,
0x00000000, 0x00000001, 0x0007004F, 0x00000011, 0x000019E2, 0x000059B5,
0x000059B5, 0x00000000, 0x00000001, 0x000500AE, 0x0000000F, 0x00004288,
0x00004993, 0x000019E2, 0x0004009A, 0x00000009, 0x00006067, 0x00004288,
0x000300F7, 0x0000188A, 0x00000002, 0x000400FA, 0x00006067, 0x000055E8,
0x0000188A, 0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8,
0x0000188A, 0x0004007C, 0x00000016, 0x00001A8B, 0x000027F5, 0x00050041,
0x00000288, 0x00004968, 0x0000147D, 0x00000A1D, 0x0004003D, 0x0000000B,
0x0000263C, 0x00004968, 0x00050051, 0x0000000B, 0x00004F98, 0x000059B5,
0x00000001, 0x00050051, 0x0000000C, 0x00003964, 0x00001A8B, 0x00000000,
0x00050084, 0x0000000C, 0x0000591A, 0x00003964, 0x00000A11, 0x00050051,
0x0000000C, 0x000018DA, 0x00001A8B, 0x00000002, 0x0004007C, 0x0000000C,
0x000038A9, 0x00004F98, 0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA,
0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00001A8B, 0x00000001,
0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C,
0x0000000C, 0x00005785, 0x0000263C, 0x00050084, 0x0000000C, 0x00005FD7,
0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00001B95, 0x0000591A,
0x00005FD7, 0x0004007C, 0x0000000B, 0x00004B46, 0x00001B95, 0x00050041,
0x00000288, 0x00004C04, 0x0000147D, 0x00000A1A, 0x0004003D, 0x0000000B,
0x0000595B, 0x00004C04, 0x00050080, 0x0000000B, 0x00002145, 0x00004B46,
0x0000595B, 0x000500C2, 0x0000000B, 0x000054A6, 0x00002145, 0x00000A16,
0x00050041, 0x00000288, 0x000051D6, 0x0000147D, 0x00000A0B, 0x0004003D,
0x0000000B, 0x000053A3, 0x000051D6, 0x000500C7, 0x0000000B, 0x000018ED,
0x000053A3, 0x00000A0D, 0x000500AB, 0x00000009, 0x000028E3, 0x000018ED,
0x00000A0A, 0x000300F7, 0x00005AE2, 0x00000002, 0x000400FA, 0x000028E3,
0x0000277C, 0x00002A0D, 0x000200F8, 0x0000277C, 0x000500C7, 0x0000000B,
0x00005BD4, 0x000053A3, 0x00000A10, 0x000500AB, 0x00000009, 0x00003FAC,
0x00005BD4, 0x00000A0A, 0x000300F7, 0x00001E0B, 0x00000002, 0x000400FA,
0x00003FAC, 0x00002F61, 0x00006228, 0x000200F8, 0x00002F61, 0x00050041,
0x00000288, 0x00004722, 0x0000147D, 0x00000A11, 0x0004003D, 0x0000000B,
0x00003D0B, 0x00004722, 0x00050041, 0x00000288, 0x00005860, 0x0000147D,
0x00000A14, 0x0004003D, 0x0000000B, 0x0000541F, 0x00005860, 0x000500C3,
0x0000000C, 0x00003A4B, 0x000044BE, 0x00000A17, 0x000500C3, 0x0000000C,
0x00004955, 0x000018DA, 0x00000A11, 0x000500C2, 0x0000000B, 0x00004947,
0x0000541F, 0x00000A16, 0x0004007C, 0x0000000C, 0x000018AA, 0x00004947,
0x00050084, 0x0000000C, 0x00005321, 0x00004955, 0x000018AA, 0x00050080,
0x0000000C, 0x00003B27, 0x00003A4B, 0x00005321, 0x000500C2, 0x0000000B,
0x00002348, 0x00003D0B, 0x00000A19, 0x0004007C, 0x0000000C, 0x00003901,
0x00002348, 0x00050084, 0x0000000C, 0x000020F4, 0x00003B27, 0x00003901,
0x000500C3, 0x0000000C, 0x000032BA, 0x00003964, 0x00000A1A, 0x00050080,
0x0000000C, 0x00005FEE, 0x000032BA, 0x000020F4, 0x000500C4, 0x0000000C,
0x0000225D, 0x00005FEE, 0x00000A1F, 0x000500C7, 0x0000000C, 0x00002CF6,
0x0000225D, 0x0000078B, 0x000500C4, 0x0000000C, 0x000049FA, 0x00002CF6,
0x00000A0E, 0x000500C7, 0x0000000C, 0x00004D38, 0x00003964, 0x00000A20,
0x000500C7, 0x0000000C, 0x00003138, 0x000044BE, 0x00000A1D, 0x000500C4,
0x0000000C, 0x0000454D, 0x00003138, 0x00000A11, 0x00050080, 0x0000000C,
0x0000434B, 0x00004D38, 0x0000454D, 0x000500C4, 0x0000000C, 0x00001B88,
0x0000434B, 0x00000A1F, 0x000500C3, 0x0000000C, 0x00005DE3, 0x00001B88,
0x00000A1D, 0x000500C3, 0x0000000C, 0x00002215, 0x000044BE, 0x00000A14,
0x00050080, 0x0000000C, 0x000035A3, 0x00002215, 0x00004955, 0x000500C7,
0x0000000C, 0x00005A0C, 0x000035A3, 0x00000A0E, 0x000500C3, 0x0000000C,
0x00004112, 0x00003964, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000496A,
0x00005A0C, 0x00000A0E, 0x00050080, 0x0000000C, 0x000034BD, 0x00004112,
0x0000496A, 0x000500C7, 0x0000000C, 0x00004ADD, 0x000034BD, 0x00000A14,
0x000500C4, 0x0000000C, 0x0000544A, 0x00004ADD, 0x00000A0E, 0x00050080,
0x0000000C, 0x00003C4B, 0x00005A0C, 0x0000544A, 0x000500C7, 0x0000000C,
0x0000335E, 0x00005DE3, 0x000009DB, 0x00050080, 0x0000000C, 0x00004F70,
0x000049FA, 0x0000335E, 0x000500C4, 0x0000000C, 0x00005B31, 0x00004F70,
0x00000A0E, 0x000500C7, 0x0000000C, 0x00005AEA, 0x00005DE3, 0x00000A38,
0x00050080, 0x0000000C, 0x0000285C, 0x00005B31, 0x00005AEA, 0x000500C7,
0x0000000C, 0x000047B4, 0x000018DA, 0x00000A14, 0x000500C4, 0x0000000C,
0x0000544B, 0x000047B4, 0x00000A1F, 0x00050080, 0x0000000C, 0x00004157,
0x0000285C, 0x0000544B, 0x000500C7, 0x0000000C, 0x00004ADE, 0x000044BE,
0x00000A0E, 0x000500C4, 0x0000000C, 0x0000544C, 0x00004ADE, 0x00000A17,
0x00050080, 0x0000000C, 0x00004158, 0x00004157, 0x0000544C, 0x000500C7,
0x0000000C, 0x00004FD6, 0x00003C4B, 0x00000A0E, 0x000500C4, 0x0000000C,
0x00002703, 0x00004FD6, 0x00000A14, 0x000500C3, 0x0000000C, 0x00003332,
0x00004158, 0x00000A1D, 0x000500C7, 0x0000000C, 0x000036D6, 0x00003332,
0x00000A20, 0x00050080, 0x0000000C, 0x00003412, 0x00002703, 0x000036D6,
0x000500C4, 0x0000000C, 0x00005B32, 0x00003412, 0x00000A14, 0x000500C7,
0x0000000C, 0x00005AB1, 0x00003C4B, 0x00000A05, 0x00050080, 0x0000000C,
0x00002A9C, 0x00005B32, 0x00005AB1, 0x000500C4, 0x0000000C, 0x00005B33,
0x00002A9C, 0x00000A11, 0x000500C7, 0x0000000C, 0x00005AB2, 0x00004158,
0x0000040B, 0x00050080, 0x0000000C, 0x00002A9D, 0x00005B33, 0x00005AB2,
0x000500C4, 0x0000000C, 0x00005B34, 0x00002A9D, 0x00000A14, 0x000500C7,
0x0000000C, 0x00005EA0, 0x00004158, 0x00000AC8, 0x00050080, 0x0000000C,
0x000054ED, 0x00005B34, 0x00005EA0, 0x000200F9, 0x00001E0B, 0x000200F8,
0x00006228, 0x0004007C, 0x00000012, 0x00001A8C, 0x00004993, 0x00050041,
0x00000288, 0x00004969, 0x0000147D, 0x00000A11, 0x0004003D, 0x0000000B,
0x00002EB2, 0x00004969, 0x00050051, 0x0000000C, 0x00004944, 0x00001A8C,
0x00000000, 0x000500C3, 0x0000000C, 0x00004CF5, 0x00004944, 0x00000A1A,
0x00050051, 0x0000000C, 0x00002747, 0x00001A8C, 0x00000001, 0x000500C3,
0x0000000C, 0x0000405C, 0x00002747, 0x00000A1A, 0x000500C2, 0x0000000B,
0x00005B4D, 0x00002EB2, 0x00000A19, 0x0004007C, 0x0000000C, 0x000018AB,
0x00005B4D, 0x00050084, 0x0000000C, 0x00005347, 0x0000405C, 0x000018AB,
0x00050080, 0x0000000C, 0x00003F5E, 0x00004CF5, 0x00005347, 0x000500C4,
0x0000000C, 0x00004A8E, 0x00003F5E, 0x00000A22, 0x000500C7, 0x0000000C,
0x00002AB6, 0x00004944, 0x00000A20, 0x000500C7, 0x0000000C, 0x00003139,
0x00002747, 0x00000A35, 0x000500C4, 0x0000000C, 0x0000454E, 0x00003139,
0x00000A11, 0x00050080, 0x0000000C, 0x00004397, 0x00002AB6, 0x0000454E,
0x000500C4, 0x0000000C, 0x000018E7, 0x00004397, 0x00000A0D, 0x000500C7,
0x0000000C, 0x000027B1, 0x000018E7, 0x000009DB, 0x000500C4, 0x0000000C,
0x00002F76, 0x000027B1, 0x00000A0E, 0x00050080, 0x0000000C, 0x00003C4C,
0x00004A8E, 0x00002F76, 0x000500C7, 0x0000000C, 0x00003397, 0x000018E7,
0x00000A38, 0x00050080, 0x0000000C, 0x00004D30, 0x00003C4C, 0x00003397,
0x000500C7, 0x0000000C, 0x000047B5, 0x00002747, 0x00000A0E, 0x000500C4,
0x0000000C, 0x0000544D, 0x000047B5, 0x00000A17, 0x00050080, 0x0000000C,
0x00004159, 0x00004D30, 0x0000544D, 0x000500C7, 0x0000000C, 0x00005022,
0x00004159, 0x0000040B, 0x000500C4, 0x0000000C, 0x00002416, 0x00005022,
0x00000A14, 0x000500C7, 0x0000000C, 0x00004A33, 0x00002747, 0x00000A3B,
0x000500C4, 0x0000000C, 0x00002F77, 0x00004A33, 0x00000A20, 0x00050080,
0x0000000C, 0x0000415A, 0x00002416, 0x00002F77, 0x000500C7, 0x0000000C,
0x00004ADF, 0x00004159, 0x00000388, 0x000500C4, 0x0000000C, 0x0000544E,
0x00004ADF, 0x00000A11, 0x00050080, 0x0000000C, 0x00004144, 0x0000415A,
0x0000544E, 0x000500C7, 0x0000000C, 0x00005083, 0x00002747, 0x00000A23,
0x000500C3, 0x0000000C, 0x000041BF, 0x00005083, 0x00000A11, 0x000500C3,
0x0000000C, 0x00001EEC, 0x00004944, 0x00000A14, 0x00050080, 0x0000000C,
0x000035B6, 0x000041BF, 0x00001EEC, 0x000500C7, 0x0000000C, 0x00005453,
0x000035B6, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000544F, 0x00005453,
0x00000A1D, 0x00050080, 0x0000000C, 0x00003C4D, 0x00004144, 0x0000544F,
0x000500C7, 0x0000000C, 0x0000374D, 0x00004159, 0x00000AC8, 0x00050080,
0x0000000C, 0x00002F42, 0x00003C4D, 0x0000374D, 0x000200F9, 0x00001E0B,
0x000200F8, 0x00001E0B, 0x000700F5, 0x0000000C, 0x0000292C, 0x000054ED,
0x00002F61, 0x00002F42, 0x00006228, 0x000200F9, 0x00005AE2, 0x000200F8,
0x00002A0D, 0x00050041, 0x00000288, 0x00005098, 0x0000147D, 0x00000A11,
0x0004003D, 0x0000000B, 0x00003D0C, 0x00005098, 0x00050041, 0x00000288,
0x0000531B, 0x0000147D, 0x00000A14, 0x0004003D, 0x0000000B, 0x000034EE,
0x0000531B, 0x0004007C, 0x0000000C, 0x00003ADE, 0x000034EE, 0x00050084,
0x0000000C, 0x000049EF, 0x000018DA, 0x00003ADE, 0x00050080, 0x0000000C,
0x0000208E, 0x000049EF, 0x000044BE, 0x0004007C, 0x0000000C, 0x000022F8,
0x00003D0C, 0x00050084, 0x0000000C, 0x00001E9F, 0x0000208E, 0x000022F8,
0x00050080, 0x0000000C, 0x00001F30, 0x0000591A, 0x00001E9F, 0x000200F9,
0x00005AE2, 0x000200F8, 0x00005AE2, 0x000700F5, 0x0000000C, 0x00004D24,
0x0000292C, 0x00001E0B, 0x00001F30, 0x00002A0D, 0x00050041, 0x00000288,
0x0000615A, 0x0000147D, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00001D4E,
0x0000615A, 0x0004007C, 0x0000000C, 0x00003D46, 0x00001D4E, 0x00050080,
0x0000000C, 0x00003CDB, 0x00003D46, 0x00004D24, 0x0004007C, 0x0000000B,
0x0000487C, 0x00003CDB, 0x000500C2, 0x0000000B, 0x000053F5, 0x0000487C,
0x00000A16, 0x000500C2, 0x0000000B, 0x00003A95, 0x000053A3, 0x00000A10,
0x000500C7, 0x0000000B, 0x000020CA, 0x00003A95, 0x00000A13, 0x00060041,
0x00000294, 0x000050F7, 0x0000107A, 0x00000A0B, 0x000053F5, 0x0004003D,
0x00000017, 0x00002585, 0x000050F7, 0x000500AA, 0x00000009, 0x00005272,
0x000020CA, 0x00000A0D, 0x000300F7, 0x0000368A, 0x00000000, 0x000400FA,
0x00005272, 0x00002957, 0x0000368A, 0x000200F8, 0x00002957, 0x000500C7,
0x00000017, 0x0000475F, 0x00002585, 0x000009CE, 0x000500C4, 0x00000017,
0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC,
0x00002585, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC,
0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D,
0x000200F9, 0x0000368A, 0x000200F8, 0x0000368A, 0x000700F5, 0x00000017,
0x000040DE, 0x00002585, 0x00005AE2, 0x00003FF8, 0x00002957, 0x000500C7,
0x00000017, 0x00004740, 0x000040DE, 0x00000352, 0x00040070, 0x0000001D,
0x000023B1, 0x00004740, 0x0005008E, 0x0000001D, 0x00004BA5, 0x000023B1,
0x0000092A, 0x000500C2, 0x00000017, 0x00005B47, 0x000040DE, 0x000002ED,
0x00040070, 0x0000001D, 0x0000483C, 0x00005B47, 0x0005008E, 0x0000001D,
0x00004812, 0x0000483C, 0x0000092A, 0x00050051, 0x0000000D, 0x0000187C,
0x00004BA5, 0x00000000, 0x00050051, 0x0000000D, 0x000035EE, 0x00004812,
0x00000000, 0x00050050, 0x00000013, 0x00004B20, 0x0000187C, 0x000035EE,
0x0006000C, 0x0000000B, 0x00002171, 0x00000001, 0x0000003A, 0x00004B20,
0x00050051, 0x0000000D, 0x00005BBF, 0x00004BA5, 0x00000001, 0x00050051,
0x0000000D, 0x000039A7, 0x00004812, 0x00000001, 0x00050050, 0x00000013,
0x00004B21, 0x00005BBF, 0x000039A7, 0x0006000C, 0x0000000B, 0x00002172,
0x00000001, 0x0000003A, 0x00004B21, 0x00050051, 0x0000000D, 0x00005BC0,
0x00004BA5, 0x00000002, 0x00050051, 0x0000000D, 0x000039A8, 0x00004812,
0x00000002, 0x00050050, 0x00000013, 0x00004B22, 0x00005BC0, 0x000039A8,
0x0006000C, 0x0000000B, 0x00002173, 0x00000001, 0x0000003A, 0x00004B22,
0x00050051, 0x0000000D, 0x00005BC1, 0x00004BA5, 0x00000003, 0x00050051,
0x0000000D, 0x000039A9, 0x00004812, 0x00000003, 0x00050050, 0x00000013,
0x00004B0D, 0x00005BC1, 0x000039A9, 0x0006000C, 0x0000000B, 0x000020EE,
0x00000001, 0x0000003A, 0x00004B0D, 0x00070050, 0x00000017, 0x00003ABB,
0x00002171, 0x00002172, 0x00002173, 0x000020EE, 0x00060041, 0x00000294,
0x000045C3, 0x0000140E, 0x00000A0B, 0x000054A6, 0x0003003E, 0x000045C3,
0x00003ABB, 0x00050080, 0x0000000B, 0x00003AC4, 0x000054A6, 0x00000A0E,
0x000600A9, 0x0000000B, 0x00004958, 0x000028E3, 0x00000ACA, 0x00000A3A,
0x000500C2, 0x0000000B, 0x00002E1B, 0x00004958, 0x00000A16, 0x00050080,
0x0000000B, 0x0000367B, 0x000053F5, 0x00002E1B, 0x00060041, 0x00000294,
0x0000571A, 0x0000107A, 0x00000A0B, 0x0000367B, 0x0004003D, 0x00000017,
0x000019B2, 0x0000571A, 0x000300F7, 0x0000368B, 0x00000000, 0x000400FA,
0x00005272, 0x00002958, 0x0000368B, 0x000200F8, 0x00002958, 0x000500C7,
0x00000017, 0x00004760, 0x000019B2, 0x000009CE, 0x000500C4, 0x00000017,
0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD,
0x000019B2, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD,
0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E,
0x000200F9, 0x0000368B, 0x000200F8, 0x0000368B, 0x000700F5, 0x00000017,
0x000040DF, 0x000019B2, 0x0000368A, 0x00003FF9, 0x00002958, 0x000500C7,
0x00000017, 0x00004741, 0x000040DF, 0x00000352, 0x00040070, 0x0000001D,
0x000023B2, 0x00004741, 0x0005008E, 0x0000001D, 0x00004BA6, 0x000023B2,
0x0000092A, 0x000500C2, 0x00000017, 0x00005B48, 0x000040DF, 0x000002ED,
0x00040070, 0x0000001D, 0x0000483D, 0x00005B48, 0x0005008E, 0x0000001D,
0x00004813, 0x0000483D, 0x0000092A, 0x00050051, 0x0000000D, 0x0000187D,
0x00004BA6, 0x00000000, 0x00050051, 0x0000000D, 0x000035EF, 0x00004813,
0x00000000, 0x00050050, 0x00000013, 0x00004B23, 0x0000187D, 0x000035EF,
0x0006000C, 0x0000000B, 0x00002174, 0x00000001, 0x0000003A, 0x00004B23,
0x00050051, 0x0000000D, 0x00005BC2, 0x00004BA6, 0x00000001, 0x00050051,
0x0000000D, 0x000039AA, 0x00004813, 0x00000001, 0x00050050, 0x00000013,
0x00004B24, 0x00005BC2, 0x000039AA, 0x0006000C, 0x0000000B, 0x00002175,
0x00000001, 0x0000003A, 0x00004B24, 0x00050051, 0x0000000D, 0x00005BC3,
0x00004BA6, 0x00000002, 0x00050051, 0x0000000D, 0x000039AB, 0x00004813,
0x00000002, 0x00050050, 0x00000013, 0x00004B25, 0x00005BC3, 0x000039AB,
0x0006000C, 0x0000000B, 0x00002176, 0x00000001, 0x0000003A, 0x00004B25,
0x00050051, 0x0000000D, 0x00005BC4, 0x00004BA6, 0x00000003, 0x00050051,
0x0000000D, 0x000039AC, 0x00004813, 0x00000003, 0x00050050, 0x00000013,
0x00004B0E, 0x00005BC4, 0x000039AC, 0x0006000C, 0x0000000B, 0x000020EF,
0x00000001, 0x0000003A, 0x00004B0E, 0x00070050, 0x00000017, 0x00003ABC,
0x00002174, 0x00002175, 0x00002176, 0x000020EF, 0x00060041, 0x00000294,
0x00004EBE, 0x0000140E, 0x00000A0B, 0x00003AC4, 0x0003003E, 0x00004EBE,
0x00003ABC, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD,
0x00010038,
};

View File

@ -0,0 +1,716 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 10
; Bound: 25179
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %5663 "main" %gl_GlobalInvocationID
OpExecutionMode %5663 LocalSize 2 32 1
OpMemberDecorate %_struct_1161 0 Offset 0
OpMemberDecorate %_struct_1161 1 Offset 4
OpMemberDecorate %_struct_1161 2 Offset 8
OpMemberDecorate %_struct_1161 3 Offset 12
OpMemberDecorate %_struct_1161 4 Offset 16
OpMemberDecorate %_struct_1161 5 Offset 28
OpMemberDecorate %_struct_1161 6 Offset 32
OpMemberDecorate %_struct_1161 7 Offset 36
OpDecorate %_struct_1161 Block
OpDecorate %5245 DescriptorSet 2
OpDecorate %5245 Binding 0
OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
OpDecorate %_runtimearr_v4uint ArrayStride 16
OpMemberDecorate %_struct_1972 0 NonReadable
OpMemberDecorate %_struct_1972 0 Offset 0
OpDecorate %_struct_1972 BufferBlock
OpDecorate %5134 DescriptorSet 0
OpDecorate %5134 Binding 0
OpDecorate %_runtimearr_v4uint_0 ArrayStride 16
OpMemberDecorate %_struct_1973 0 NonWritable
OpMemberDecorate %_struct_1973 0 Offset 0
OpDecorate %_struct_1973 BufferBlock
OpDecorate %4218 DescriptorSet 1
OpDecorate %4218 Binding 0
OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%v4uint = OpTypeVector %uint 4
%int = OpTypeInt 32 1
%v2int = OpTypeVector %int 2
%v3int = OpTypeVector %int 3
%bool = OpTypeBool
%v3uint = OpTypeVector %uint 3
%v2uint = OpTypeVector %uint 2
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%uint_65535 = OpConstant %uint 65535
%float_1_52590219en05 = OpConstant %float 1.52590219e-05
%uint_16 = OpConstant %uint 16
%uint_0 = OpConstant %uint 0
%v2float = OpTypeVector %float 2
%uint_1 = OpConstant %uint 1
%uint_2 = OpConstant %uint 2
%uint_3 = OpConstant %uint 3
%uint_16711935 = OpConstant %uint 16711935
%uint_8 = OpConstant %uint 8
%uint_4278255360 = OpConstant %uint 4278255360
%int_5 = OpConstant %int 5
%uint_5 = OpConstant %uint 5
%uint_7 = OpConstant %uint 7
%int_7 = OpConstant %int 7
%int_14 = OpConstant %int 14
%int_2 = OpConstant %int 2
%int_n16 = OpConstant %int -16
%int_1 = OpConstant %int 1
%int_15 = OpConstant %int 15
%int_4 = OpConstant %int 4
%int_n512 = OpConstant %int -512
%int_3 = OpConstant %int 3
%int_16 = OpConstant %int 16
%int_448 = OpConstant %int 448
%int_8 = OpConstant %int 8
%int_6 = OpConstant %int 6
%int_63 = OpConstant %int 63
%uint_4 = OpConstant %uint 4
%uint_6 = OpConstant %uint 6
%int_268435455 = OpConstant %int 268435455
%int_n2 = OpConstant %int -2
%uint_32 = OpConstant %uint 32
%uint_64 = OpConstant %uint 64
%_struct_1161 = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint
%_ptr_Uniform__struct_1161 = OpTypePointer Uniform %_struct_1161
%5245 = OpVariable %_ptr_Uniform__struct_1161 Uniform
%int_0 = OpConstant %int 0
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%1915 = OpConstantComposite %v2uint %uint_4 %uint_6
%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
%2612 = OpConstantComposite %v3uint %uint_4 %uint_0 %uint_0
%v2bool = OpTypeVector %bool 2
%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint
%_struct_1972 = OpTypeStruct %_runtimearr_v4uint
%_ptr_Uniform__struct_1972 = OpTypePointer Uniform %_struct_1972
%5134 = OpVariable %_ptr_Uniform__struct_1972 Uniform
%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint
%_struct_1973 = OpTypeStruct %_runtimearr_v4uint_0
%_ptr_Uniform__struct_1973 = OpTypePointer Uniform %_struct_1973
%4218 = OpVariable %_ptr_Uniform__struct_1973 Uniform
%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_2 %uint_32 %uint_1
%1870 = OpConstantComposite %v2uint %uint_3 %uint_3
%2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935
%317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8
%1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360
%850 = OpConstantComposite %v4uint %uint_65535 %uint_65535 %uint_65535 %uint_65535
%749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16
%5663 = OpFunction %void None %1282
%15110 = OpLabel
OpSelectionMerge %19578 None
OpSwitch %uint_0 %15137
%15137 = OpLabel
%12591 = OpLoad %v3uint %gl_GlobalInvocationID
%10229 = OpShiftLeftLogical %v3uint %12591 %2612
%25178 = OpAccessChain %_ptr_Uniform_v3uint %5245 %int_4
%22965 = OpLoad %v3uint %25178
%18835 = OpVectorShuffle %v2uint %10229 %10229 0 1
%6626 = OpVectorShuffle %v2uint %22965 %22965 0 1
%17032 = OpUGreaterThanEqual %v2bool %18835 %6626
%24679 = OpAny %bool %17032
OpSelectionMerge %6282 DontFlatten
OpBranchConditional %24679 %21992 %6282
%21992 = OpLabel
OpBranch %19578
%6282 = OpLabel
%6795 = OpBitcast %v3int %10229
%18792 = OpAccessChain %_ptr_Uniform_uint %5245 %int_6
%9788 = OpLoad %uint %18792
%20376 = OpCompositeExtract %uint %22965 1
%14692 = OpCompositeExtract %int %6795 0
%22810 = OpIMul %int %14692 %int_2
%6362 = OpCompositeExtract %int %6795 2
%14505 = OpBitcast %int %20376
%11279 = OpIMul %int %6362 %14505
%17598 = OpCompositeExtract %int %6795 1
%22228 = OpIAdd %int %11279 %17598
%22405 = OpBitcast %int %9788
%24535 = OpIMul %int %22228 %22405
%7061 = OpIAdd %int %22810 %24535
%19270 = OpBitcast %uint %7061
%19460 = OpAccessChain %_ptr_Uniform_uint %5245 %int_5
%22875 = OpLoad %uint %19460
%8517 = OpIAdd %uint %19270 %22875
%21670 = OpShiftRightLogical %uint %8517 %uint_4
%18404 = OpAccessChain %_ptr_Uniform_uint %5245 %int_1
%23432 = OpLoad %uint %18404
%22700 = OpAccessChain %_ptr_Uniform_uint %5245 %int_0
%20387 = OpLoad %uint %22700
%22279 = OpBitwiseAnd %uint %20387 %uint_2
%19223 = OpINotEqual %bool %22279 %uint_0
%17247 = OpCompositeConstruct %v2uint %20387 %20387
%22947 = OpShiftRightLogical %v2uint %17247 %1915
%6551 = OpBitwiseAnd %v2uint %22947 %1870
%18732 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%24236 = OpLoad %uint %18732
%20458 = OpAccessChain %_ptr_Uniform_uint %5245 %int_3
%22167 = OpLoad %uint %20458
%18929 = OpCompositeExtract %uint %10229 0
%6638 = OpShiftRightLogical %uint %18929 %uint_3
%9988 = OpCompositeExtract %uint %10229 1
%23563 = OpCompositeConstruct %v2uint %6638 %9988
%8041 = OpUDiv %v2uint %23563 %6551
%13932 = OpCompositeExtract %uint %8041 0
%19789 = OpShiftLeftLogical %uint %13932 %uint_3
%20905 = OpCompositeExtract %uint %8041 1
%23022 = OpCompositeExtract %uint %10229 2
%9417 = OpCompositeConstruct %v3uint %19789 %20905 %23022
OpSelectionMerge %21313 DontFlatten
OpBranchConditional %19223 %21373 %11737
%21373 = OpLabel
%10608 = OpBitcast %v3int %9417
%17090 = OpCompositeExtract %int %10608 1
%9469 = OpShiftRightArithmetic %int %17090 %int_4
%10055 = OpCompositeExtract %int %10608 2
%16476 = OpShiftRightArithmetic %int %10055 %int_2
%23373 = OpShiftRightLogical %uint %22167 %uint_4
%6314 = OpBitcast %int %23373
%21281 = OpIMul %int %16476 %6314
%15143 = OpIAdd %int %9469 %21281
%9032 = OpShiftRightLogical %uint %24236 %uint_5
%12427 = OpBitcast %int %9032
%10360 = OpIMul %int %15143 %12427
%25154 = OpCompositeExtract %int %10608 0
%20423 = OpShiftRightArithmetic %int %25154 %int_5
%18940 = OpIAdd %int %20423 %10360
%8797 = OpShiftLeftLogical %int %18940 %uint_7
%11510 = OpBitwiseAnd %int %8797 %int_268435455
%18938 = OpShiftLeftLogical %int %11510 %int_1
%19768 = OpBitwiseAnd %int %25154 %int_7
%12600 = OpBitwiseAnd %int %17090 %int_6
%17741 = OpShiftLeftLogical %int %12600 %int_2
%17227 = OpIAdd %int %19768 %17741
%7048 = OpShiftLeftLogical %int %17227 %uint_7
%24035 = OpShiftRightArithmetic %int %7048 %int_6
%8725 = OpShiftRightArithmetic %int %17090 %int_3
%13731 = OpIAdd %int %8725 %16476
%23052 = OpBitwiseAnd %int %13731 %int_1
%16658 = OpShiftRightArithmetic %int %25154 %int_3
%18794 = OpShiftLeftLogical %int %23052 %int_1
%13501 = OpIAdd %int %16658 %18794
%19165 = OpBitwiseAnd %int %13501 %int_3
%21578 = OpShiftLeftLogical %int %19165 %int_1
%15435 = OpIAdd %int %23052 %21578
%13150 = OpBitwiseAnd %int %24035 %int_n16
%20336 = OpIAdd %int %18938 %13150
%23345 = OpShiftLeftLogical %int %20336 %int_1
%23274 = OpBitwiseAnd %int %24035 %int_15
%10332 = OpIAdd %int %23345 %23274
%18356 = OpBitwiseAnd %int %10055 %int_3
%21579 = OpShiftLeftLogical %int %18356 %uint_7
%16727 = OpIAdd %int %10332 %21579
%19166 = OpBitwiseAnd %int %17090 %int_1
%21580 = OpShiftLeftLogical %int %19166 %int_4
%16728 = OpIAdd %int %16727 %21580
%20438 = OpBitwiseAnd %int %15435 %int_1
%9987 = OpShiftLeftLogical %int %20438 %int_3
%13106 = OpShiftRightArithmetic %int %16728 %int_6
%14038 = OpBitwiseAnd %int %13106 %int_7
%13330 = OpIAdd %int %9987 %14038
%23346 = OpShiftLeftLogical %int %13330 %int_3
%23217 = OpBitwiseAnd %int %15435 %int_n2
%10908 = OpIAdd %int %23346 %23217
%23347 = OpShiftLeftLogical %int %10908 %int_2
%23218 = OpBitwiseAnd %int %16728 %int_n512
%10909 = OpIAdd %int %23347 %23218
%23348 = OpShiftLeftLogical %int %10909 %int_3
%21849 = OpBitwiseAnd %int %16728 %int_63
%24314 = OpIAdd %int %23348 %21849
%22127 = OpBitcast %uint %24314
OpBranch %21313
%11737 = OpLabel
%9761 = OpVectorShuffle %v2uint %9417 %9417 0 1
%22991 = OpBitcast %v2int %9761
%6403 = OpCompositeExtract %int %22991 0
%9470 = OpShiftRightArithmetic %int %6403 %int_5
%10056 = OpCompositeExtract %int %22991 1
%16477 = OpShiftRightArithmetic %int %10056 %int_5
%23374 = OpShiftRightLogical %uint %24236 %uint_5
%6315 = OpBitcast %int %23374
%21319 = OpIMul %int %16477 %6315
%16222 = OpIAdd %int %9470 %21319
%19086 = OpShiftLeftLogical %int %16222 %uint_8
%10934 = OpBitwiseAnd %int %6403 %int_7
%12601 = OpBitwiseAnd %int %10056 %int_14
%17742 = OpShiftLeftLogical %int %12601 %int_2
%17303 = OpIAdd %int %10934 %17742
%6375 = OpShiftLeftLogical %int %17303 %uint_1
%10161 = OpBitwiseAnd %int %6375 %int_n16
%12150 = OpShiftLeftLogical %int %10161 %int_1
%15436 = OpIAdd %int %19086 %12150
%13207 = OpBitwiseAnd %int %6375 %int_15
%19760 = OpIAdd %int %15436 %13207
%18357 = OpBitwiseAnd %int %10056 %int_1
%21581 = OpShiftLeftLogical %int %18357 %int_4
%16729 = OpIAdd %int %19760 %21581
%20514 = OpBitwiseAnd %int %16729 %int_n512
%9238 = OpShiftLeftLogical %int %20514 %int_3
%18995 = OpBitwiseAnd %int %10056 %int_16
%12151 = OpShiftLeftLogical %int %18995 %int_7
%16730 = OpIAdd %int %9238 %12151
%19167 = OpBitwiseAnd %int %16729 %int_448
%21582 = OpShiftLeftLogical %int %19167 %int_2
%16708 = OpIAdd %int %16730 %21582
%20611 = OpBitwiseAnd %int %10056 %int_8
%16831 = OpShiftRightArithmetic %int %20611 %int_2
%7916 = OpShiftRightArithmetic %int %6403 %int_3
%13750 = OpIAdd %int %16831 %7916
%21587 = OpBitwiseAnd %int %13750 %int_3
%21583 = OpShiftLeftLogical %int %21587 %int_6
%15437 = OpIAdd %int %16708 %21583
%11782 = OpBitwiseAnd %int %16729 %int_63
%14671 = OpIAdd %int %15437 %11782
%22128 = OpBitcast %uint %14671
OpBranch %21313
%21313 = OpLabel
%9468 = OpPhi %uint %22127 %21373 %22128 %11737
%16296 = OpIMul %v2uint %8041 %6551
%15292 = OpISub %v2uint %23563 %16296
%7303 = OpCompositeExtract %uint %6551 0
%22882 = OpCompositeExtract %uint %6551 1
%13170 = OpIMul %uint %7303 %22882
%15520 = OpIMul %uint %9468 %13170
%16084 = OpCompositeExtract %uint %15292 0
%15890 = OpIMul %uint %16084 %22882
%6886 = OpCompositeExtract %uint %15292 1
%11045 = OpIAdd %uint %15890 %6886
%24733 = OpShiftLeftLogical %uint %11045 %uint_3
%23219 = OpBitwiseAnd %uint %18929 %uint_7
%9559 = OpIAdd %uint %24733 %23219
%16557 = OpShiftLeftLogical %uint %9559 %uint_1
%20138 = OpIAdd %uint %15520 %16557
%17724 = OpIAdd %uint %23432 %20138
%14040 = OpShiftRightLogical %uint %17724 %uint_4
%11766 = OpShiftRightLogical %uint %20387 %uint_2
%8394 = OpBitwiseAnd %uint %11766 %uint_3
%20727 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %14040
%9605 = OpLoad %v4uint %20727
%21106 = OpIEqual %bool %8394 %uint_1
OpSelectionMerge %13962 None
OpBranchConditional %21106 %10583 %13962
%10583 = OpLabel
%18271 = OpBitwiseAnd %v4uint %9605 %2510
%9425 = OpShiftLeftLogical %v4uint %18271 %317
%20652 = OpBitwiseAnd %v4uint %9605 %1838
%17549 = OpShiftRightLogical %v4uint %20652 %317
%16376 = OpBitwiseOr %v4uint %9425 %17549
OpBranch %13962
%13962 = OpLabel
%16606 = OpPhi %v4uint %9605 %21313 %16376 %10583
%18240 = OpBitwiseAnd %v4uint %16606 %850
%9137 = OpConvertUToF %v4float %18240
%19365 = OpVectorTimesScalar %v4float %9137 %float_1_52590219en05
%23367 = OpShiftRightLogical %v4uint %16606 %749
%18492 = OpConvertUToF %v4float %23367
%18450 = OpVectorTimesScalar %v4float %18492 %float_1_52590219en05
%6268 = OpCompositeExtract %float %19365 0
%13806 = OpCompositeExtract %float %18450 0
%19232 = OpCompositeConstruct %v2float %6268 %13806
%8561 = OpExtInst %uint %1 PackHalf2x16 %19232
%23487 = OpCompositeExtract %float %19365 1
%14759 = OpCompositeExtract %float %18450 1
%19233 = OpCompositeConstruct %v2float %23487 %14759
%8562 = OpExtInst %uint %1 PackHalf2x16 %19233
%23488 = OpCompositeExtract %float %19365 2
%14760 = OpCompositeExtract %float %18450 2
%19234 = OpCompositeConstruct %v2float %23488 %14760
%8563 = OpExtInst %uint %1 PackHalf2x16 %19234
%23489 = OpCompositeExtract %float %19365 3
%14761 = OpCompositeExtract %float %18450 3
%19213 = OpCompositeConstruct %v2float %23489 %14761
%8430 = OpExtInst %uint %1 PackHalf2x16 %19213
%15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430
%17859 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %21670
OpStore %17859 %15035
%15532 = OpIAdd %uint %21670 %int_1
%6417 = OpUGreaterThan %bool %7303 %uint_1
OpSelectionMerge %24764 DontFlatten
OpBranchConditional %6417 %20612 %20628
%20612 = OpLabel
%13975 = OpUDiv %uint %6638 %7303
%9086 = OpIMul %uint %13975 %7303
%12657 = OpISub %uint %6638 %9086
%9511 = OpIAdd %uint %12657 %uint_1
%13375 = OpIEqual %bool %9511 %7303
OpSelectionMerge %7917 None
OpBranchConditional %13375 %22174 %8593
%22174 = OpLabel
%19289 = OpIMul %uint %uint_64 %7303
%21519 = OpShiftLeftLogical %uint %12657 %uint_4
%18756 = OpISub %uint %19289 %21519
OpBranch %7917
%8593 = OpLabel
OpBranch %7917
%7917 = OpLabel
%10540 = OpPhi %uint %18756 %22174 %uint_16 %8593
OpBranch %24764
%20628 = OpLabel
OpBranch %24764
%24764 = OpLabel
%10684 = OpPhi %uint %10540 %7917 %uint_64 %20628
%18731 = OpIMul %uint %10684 %22882
%16493 = OpShiftRightLogical %uint %18731 %uint_4
%13163 = OpIAdd %uint %14040 %16493
%22298 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %13163
%6578 = OpLoad %v4uint %22298
OpSelectionMerge %13963 None
OpBranchConditional %21106 %10584 %13963
%10584 = OpLabel
%18272 = OpBitwiseAnd %v4uint %6578 %2510
%9426 = OpShiftLeftLogical %v4uint %18272 %317
%20653 = OpBitwiseAnd %v4uint %6578 %1838
%17550 = OpShiftRightLogical %v4uint %20653 %317
%16377 = OpBitwiseOr %v4uint %9426 %17550
OpBranch %13963
%13963 = OpLabel
%16607 = OpPhi %v4uint %6578 %24764 %16377 %10584
%18241 = OpBitwiseAnd %v4uint %16607 %850
%9138 = OpConvertUToF %v4float %18241
%19366 = OpVectorTimesScalar %v4float %9138 %float_1_52590219en05
%23368 = OpShiftRightLogical %v4uint %16607 %749
%18493 = OpConvertUToF %v4float %23368
%18451 = OpVectorTimesScalar %v4float %18493 %float_1_52590219en05
%6269 = OpCompositeExtract %float %19366 0
%13807 = OpCompositeExtract %float %18451 0
%19235 = OpCompositeConstruct %v2float %6269 %13807
%8564 = OpExtInst %uint %1 PackHalf2x16 %19235
%23490 = OpCompositeExtract %float %19366 1
%14762 = OpCompositeExtract %float %18451 1
%19236 = OpCompositeConstruct %v2float %23490 %14762
%8565 = OpExtInst %uint %1 PackHalf2x16 %19236
%23491 = OpCompositeExtract %float %19366 2
%14763 = OpCompositeExtract %float %18451 2
%19237 = OpCompositeConstruct %v2float %23491 %14763
%8566 = OpExtInst %uint %1 PackHalf2x16 %19237
%23492 = OpCompositeExtract %float %19366 3
%14764 = OpCompositeExtract %float %18451 3
%19214 = OpCompositeConstruct %v2float %23492 %14764
%8431 = OpExtInst %uint %1 PackHalf2x16 %19214
%15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431
%20158 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %15532
OpStore %20158 %15036
OpBranch %19578
%19578 = OpLabel
OpReturn
OpFunctionEnd
#endif
const uint32_t texture_load_r16_unorm_float_scaled_cs[] = {
0x07230203, 0x00010000, 0x0008000A, 0x0000625B, 0x00000000, 0x00020011,
0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,
0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,
0x00000011, 0x00000002, 0x00000020, 0x00000001, 0x00050048, 0x00000489,
0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001,
0x00000023, 0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023,
0x00000008, 0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C,
0x00050048, 0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048,
0x00000489, 0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489,
0x00000006, 0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007,
0x00000023, 0x00000024, 0x00030047, 0x00000489, 0x00000002, 0x00040047,
0x0000147D, 0x00000022, 0x00000002, 0x00040047, 0x0000147D, 0x00000021,
0x00000000, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,
0x000007DC, 0x00000006, 0x00000010, 0x00040048, 0x000007B4, 0x00000000,
0x00000019, 0x00050048, 0x000007B4, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B4, 0x00000003, 0x00040047, 0x0000140E, 0x00000022,
0x00000000, 0x00040047, 0x0000140E, 0x00000021, 0x00000000, 0x00040047,
0x000007DD, 0x00000006, 0x00000010, 0x00040048, 0x000007B5, 0x00000000,
0x00000018, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B5, 0x00000003, 0x00040047, 0x0000107A, 0x00000022,
0x00000001, 0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047,
0x00000BB1, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,
0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,
0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,
0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,
0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,
0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00040017, 0x00000011,
0x0000000B, 0x00000002, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,
0x0000001D, 0x0000000D, 0x00000004, 0x0004002B, 0x0000000B, 0x000001C1,
0x0000FFFF, 0x0004002B, 0x0000000D, 0x0000092A, 0x37800080, 0x0004002B,
0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B, 0x00000A0A,
0x00000000, 0x00040017, 0x00000013, 0x0000000D, 0x00000002, 0x0004002B,
0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A10,
0x00000002, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B,
0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22,
0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B,
0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000B, 0x00000A19,
0x00000005, 0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x0004002B,
0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A35,
0x0000000E, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0004002B,
0x0000000C, 0x000009DB, 0xFFFFFFF0, 0x0004002B, 0x0000000C, 0x00000A0E,
0x00000001, 0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B,
0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x0000040B,
0xFFFFFE00, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B,
0x0000000C, 0x00000A3B, 0x00000010, 0x0004002B, 0x0000000C, 0x00000388,
0x000001C0, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B,
0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000AC8,
0x0000003F, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004002B,
0x0000000B, 0x00000A1C, 0x00000006, 0x0004002B, 0x0000000C, 0x0000078B,
0x0FFFFFFF, 0x0004002B, 0x0000000C, 0x00000A05, 0xFFFFFFFE, 0x0004002B,
0x0000000B, 0x00000A6A, 0x00000020, 0x0004002B, 0x0000000B, 0x00000ACA,
0x00000040, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B,
0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020,
0x00000706, 0x00000002, 0x00000489, 0x0004003B, 0x00000706, 0x0000147D,
0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x00040020,
0x00000288, 0x00000002, 0x0000000B, 0x0005002C, 0x00000011, 0x0000077B,
0x00000A16, 0x00000A1C, 0x00040020, 0x00000291, 0x00000002, 0x00000014,
0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B, 0x00000292,
0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A34, 0x00000A16,
0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009, 0x00000002,
0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC,
0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A31,
0x0000140E, 0x00000002, 0x0003001D, 0x000007DD, 0x00000017, 0x0003001E,
0x000007B5, 0x000007DD, 0x00040020, 0x00000A32, 0x00000002, 0x000007B5,
0x0004003B, 0x00000A32, 0x0000107A, 0x00000002, 0x00040020, 0x00000294,
0x00000002, 0x00000017, 0x0006002C, 0x00000014, 0x00000BB1, 0x00000A10,
0x00000A6A, 0x00000A0D, 0x0005002C, 0x00000011, 0x0000074E, 0x00000A13,
0x00000A13, 0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6,
0x000008A6, 0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22,
0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E,
0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017,
0x00000352, 0x000001C1, 0x000001C1, 0x000001C1, 0x000001C1, 0x0007002C,
0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A,
0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,
0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A,
0x00003B21, 0x000200F8, 0x00003B21, 0x0004003D, 0x00000014, 0x0000312F,
0x00000F48, 0x000500C4, 0x00000014, 0x000027F5, 0x0000312F, 0x00000A34,
0x00050041, 0x00000291, 0x0000625A, 0x0000147D, 0x00000A17, 0x0004003D,
0x00000014, 0x000059B5, 0x0000625A, 0x0007004F, 0x00000011, 0x00004993,
0x000027F5, 0x000027F5, 0x00000000, 0x00000001, 0x0007004F, 0x00000011,
0x000019E2, 0x000059B5, 0x000059B5, 0x00000000, 0x00000001, 0x000500AE,
0x0000000F, 0x00004288, 0x00004993, 0x000019E2, 0x0004009A, 0x00000009,
0x00006067, 0x00004288, 0x000300F7, 0x0000188A, 0x00000002, 0x000400FA,
0x00006067, 0x000055E8, 0x0000188A, 0x000200F8, 0x000055E8, 0x000200F9,
0x00004C7A, 0x000200F8, 0x0000188A, 0x0004007C, 0x00000016, 0x00001A8B,
0x000027F5, 0x00050041, 0x00000288, 0x00004968, 0x0000147D, 0x00000A1D,
0x0004003D, 0x0000000B, 0x0000263C, 0x00004968, 0x00050051, 0x0000000B,
0x00004F98, 0x000059B5, 0x00000001, 0x00050051, 0x0000000C, 0x00003964,
0x00001A8B, 0x00000000, 0x00050084, 0x0000000C, 0x0000591A, 0x00003964,
0x00000A11, 0x00050051, 0x0000000C, 0x000018DA, 0x00001A8B, 0x00000002,
0x0004007C, 0x0000000C, 0x000038A9, 0x00004F98, 0x00050084, 0x0000000C,
0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE,
0x00001A8B, 0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F,
0x000044BE, 0x0004007C, 0x0000000C, 0x00005785, 0x0000263C, 0x00050084,
0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C,
0x00001B95, 0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B, 0x00004B46,
0x00001B95, 0x00050041, 0x00000288, 0x00004C04, 0x0000147D, 0x00000A1A,
0x0004003D, 0x0000000B, 0x0000595B, 0x00004C04, 0x00050080, 0x0000000B,
0x00002145, 0x00004B46, 0x0000595B, 0x000500C2, 0x0000000B, 0x000054A6,
0x00002145, 0x00000A16, 0x00050041, 0x00000288, 0x000047E4, 0x0000147D,
0x00000A0E, 0x0004003D, 0x0000000B, 0x00005B88, 0x000047E4, 0x00050041,
0x00000288, 0x000058AC, 0x0000147D, 0x00000A0B, 0x0004003D, 0x0000000B,
0x00004FA3, 0x000058AC, 0x000500C7, 0x0000000B, 0x00005707, 0x00004FA3,
0x00000A10, 0x000500AB, 0x00000009, 0x00004B17, 0x00005707, 0x00000A0A,
0x00050050, 0x00000011, 0x0000435F, 0x00004FA3, 0x00004FA3, 0x000500C2,
0x00000011, 0x000059A3, 0x0000435F, 0x0000077B, 0x000500C7, 0x00000011,
0x00001997, 0x000059A3, 0x0000074E, 0x00050041, 0x00000288, 0x0000492C,
0x0000147D, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C,
0x00050041, 0x00000288, 0x00004FEA, 0x0000147D, 0x00000A14, 0x0004003D,
0x0000000B, 0x00005697, 0x00004FEA, 0x00050051, 0x0000000B, 0x000049F1,
0x000027F5, 0x00000000, 0x000500C2, 0x0000000B, 0x000019EE, 0x000049F1,
0x00000A13, 0x00050051, 0x0000000B, 0x00002704, 0x000027F5, 0x00000001,
0x00050050, 0x00000011, 0x00005C0B, 0x000019EE, 0x00002704, 0x00050086,
0x00000011, 0x00001F69, 0x00005C0B, 0x00001997, 0x00050051, 0x0000000B,
0x0000366C, 0x00001F69, 0x00000000, 0x000500C4, 0x0000000B, 0x00004D4D,
0x0000366C, 0x00000A13, 0x00050051, 0x0000000B, 0x000051A9, 0x00001F69,
0x00000001, 0x00050051, 0x0000000B, 0x000059EE, 0x000027F5, 0x00000002,
0x00060050, 0x00000014, 0x000024C9, 0x00004D4D, 0x000051A9, 0x000059EE,
0x000300F7, 0x00005341, 0x00000002, 0x000400FA, 0x00004B17, 0x0000537D,
0x00002DD9, 0x000200F8, 0x0000537D, 0x0004007C, 0x00000016, 0x00002970,
0x000024C9, 0x00050051, 0x0000000C, 0x000042C2, 0x00002970, 0x00000001,
0x000500C3, 0x0000000C, 0x000024FD, 0x000042C2, 0x00000A17, 0x00050051,
0x0000000C, 0x00002747, 0x00002970, 0x00000002, 0x000500C3, 0x0000000C,
0x0000405C, 0x00002747, 0x00000A11, 0x000500C2, 0x0000000B, 0x00005B4D,
0x00005697, 0x00000A16, 0x0004007C, 0x0000000C, 0x000018AA, 0x00005B4D,
0x00050084, 0x0000000C, 0x00005321, 0x0000405C, 0x000018AA, 0x00050080,
0x0000000C, 0x00003B27, 0x000024FD, 0x00005321, 0x000500C2, 0x0000000B,
0x00002348, 0x00005EAC, 0x00000A19, 0x0004007C, 0x0000000C, 0x0000308B,
0x00002348, 0x00050084, 0x0000000C, 0x00002878, 0x00003B27, 0x0000308B,
0x00050051, 0x0000000C, 0x00006242, 0x00002970, 0x00000000, 0x000500C3,
0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A, 0x00050080, 0x0000000C,
0x000049FC, 0x00004FC7, 0x00002878, 0x000500C4, 0x0000000C, 0x0000225D,
0x000049FC, 0x00000A1F, 0x000500C7, 0x0000000C, 0x00002CF6, 0x0000225D,
0x0000078B, 0x000500C4, 0x0000000C, 0x000049FA, 0x00002CF6, 0x00000A0E,
0x000500C7, 0x0000000C, 0x00004D38, 0x00006242, 0x00000A20, 0x000500C7,
0x0000000C, 0x00003138, 0x000042C2, 0x00000A1D, 0x000500C4, 0x0000000C,
0x0000454D, 0x00003138, 0x00000A11, 0x00050080, 0x0000000C, 0x0000434B,
0x00004D38, 0x0000454D, 0x000500C4, 0x0000000C, 0x00001B88, 0x0000434B,
0x00000A1F, 0x000500C3, 0x0000000C, 0x00005DE3, 0x00001B88, 0x00000A1D,
0x000500C3, 0x0000000C, 0x00002215, 0x000042C2, 0x00000A14, 0x00050080,
0x0000000C, 0x000035A3, 0x00002215, 0x0000405C, 0x000500C7, 0x0000000C,
0x00005A0C, 0x000035A3, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00004112,
0x00006242, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000496A, 0x00005A0C,
0x00000A0E, 0x00050080, 0x0000000C, 0x000034BD, 0x00004112, 0x0000496A,
0x000500C7, 0x0000000C, 0x00004ADD, 0x000034BD, 0x00000A14, 0x000500C4,
0x0000000C, 0x0000544A, 0x00004ADD, 0x00000A0E, 0x00050080, 0x0000000C,
0x00003C4B, 0x00005A0C, 0x0000544A, 0x000500C7, 0x0000000C, 0x0000335E,
0x00005DE3, 0x000009DB, 0x00050080, 0x0000000C, 0x00004F70, 0x000049FA,
0x0000335E, 0x000500C4, 0x0000000C, 0x00005B31, 0x00004F70, 0x00000A0E,
0x000500C7, 0x0000000C, 0x00005AEA, 0x00005DE3, 0x00000A38, 0x00050080,
0x0000000C, 0x0000285C, 0x00005B31, 0x00005AEA, 0x000500C7, 0x0000000C,
0x000047B4, 0x00002747, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000544B,
0x000047B4, 0x00000A1F, 0x00050080, 0x0000000C, 0x00004157, 0x0000285C,
0x0000544B, 0x000500C7, 0x0000000C, 0x00004ADE, 0x000042C2, 0x00000A0E,
0x000500C4, 0x0000000C, 0x0000544C, 0x00004ADE, 0x00000A17, 0x00050080,
0x0000000C, 0x00004158, 0x00004157, 0x0000544C, 0x000500C7, 0x0000000C,
0x00004FD6, 0x00003C4B, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00002703,
0x00004FD6, 0x00000A14, 0x000500C3, 0x0000000C, 0x00003332, 0x00004158,
0x00000A1D, 0x000500C7, 0x0000000C, 0x000036D6, 0x00003332, 0x00000A20,
0x00050080, 0x0000000C, 0x00003412, 0x00002703, 0x000036D6, 0x000500C4,
0x0000000C, 0x00005B32, 0x00003412, 0x00000A14, 0x000500C7, 0x0000000C,
0x00005AB1, 0x00003C4B, 0x00000A05, 0x00050080, 0x0000000C, 0x00002A9C,
0x00005B32, 0x00005AB1, 0x000500C4, 0x0000000C, 0x00005B33, 0x00002A9C,
0x00000A11, 0x000500C7, 0x0000000C, 0x00005AB2, 0x00004158, 0x0000040B,
0x00050080, 0x0000000C, 0x00002A9D, 0x00005B33, 0x00005AB2, 0x000500C4,
0x0000000C, 0x00005B34, 0x00002A9D, 0x00000A14, 0x000500C7, 0x0000000C,
0x00005559, 0x00004158, 0x00000AC8, 0x00050080, 0x0000000C, 0x00005EFA,
0x00005B34, 0x00005559, 0x0004007C, 0x0000000B, 0x0000566F, 0x00005EFA,
0x000200F9, 0x00005341, 0x000200F8, 0x00002DD9, 0x0007004F, 0x00000011,
0x00002621, 0x000024C9, 0x000024C9, 0x00000000, 0x00000001, 0x0004007C,
0x00000012, 0x000059CF, 0x00002621, 0x00050051, 0x0000000C, 0x00001903,
0x000059CF, 0x00000000, 0x000500C3, 0x0000000C, 0x000024FE, 0x00001903,
0x00000A1A, 0x00050051, 0x0000000C, 0x00002748, 0x000059CF, 0x00000001,
0x000500C3, 0x0000000C, 0x0000405D, 0x00002748, 0x00000A1A, 0x000500C2,
0x0000000B, 0x00005B4E, 0x00005EAC, 0x00000A19, 0x0004007C, 0x0000000C,
0x000018AB, 0x00005B4E, 0x00050084, 0x0000000C, 0x00005347, 0x0000405D,
0x000018AB, 0x00050080, 0x0000000C, 0x00003F5E, 0x000024FE, 0x00005347,
0x000500C4, 0x0000000C, 0x00004A8E, 0x00003F5E, 0x00000A22, 0x000500C7,
0x0000000C, 0x00002AB6, 0x00001903, 0x00000A20, 0x000500C7, 0x0000000C,
0x00003139, 0x00002748, 0x00000A35, 0x000500C4, 0x0000000C, 0x0000454E,
0x00003139, 0x00000A11, 0x00050080, 0x0000000C, 0x00004397, 0x00002AB6,
0x0000454E, 0x000500C4, 0x0000000C, 0x000018E7, 0x00004397, 0x00000A0D,
0x000500C7, 0x0000000C, 0x000027B1, 0x000018E7, 0x000009DB, 0x000500C4,
0x0000000C, 0x00002F76, 0x000027B1, 0x00000A0E, 0x00050080, 0x0000000C,
0x00003C4C, 0x00004A8E, 0x00002F76, 0x000500C7, 0x0000000C, 0x00003397,
0x000018E7, 0x00000A38, 0x00050080, 0x0000000C, 0x00004D30, 0x00003C4C,
0x00003397, 0x000500C7, 0x0000000C, 0x000047B5, 0x00002748, 0x00000A0E,
0x000500C4, 0x0000000C, 0x0000544D, 0x000047B5, 0x00000A17, 0x00050080,
0x0000000C, 0x00004159, 0x00004D30, 0x0000544D, 0x000500C7, 0x0000000C,
0x00005022, 0x00004159, 0x0000040B, 0x000500C4, 0x0000000C, 0x00002416,
0x00005022, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004A33, 0x00002748,
0x00000A3B, 0x000500C4, 0x0000000C, 0x00002F77, 0x00004A33, 0x00000A20,
0x00050080, 0x0000000C, 0x0000415A, 0x00002416, 0x00002F77, 0x000500C7,
0x0000000C, 0x00004ADF, 0x00004159, 0x00000388, 0x000500C4, 0x0000000C,
0x0000544E, 0x00004ADF, 0x00000A11, 0x00050080, 0x0000000C, 0x00004144,
0x0000415A, 0x0000544E, 0x000500C7, 0x0000000C, 0x00005083, 0x00002748,
0x00000A23, 0x000500C3, 0x0000000C, 0x000041BF, 0x00005083, 0x00000A11,
0x000500C3, 0x0000000C, 0x00001EEC, 0x00001903, 0x00000A14, 0x00050080,
0x0000000C, 0x000035B6, 0x000041BF, 0x00001EEC, 0x000500C7, 0x0000000C,
0x00005453, 0x000035B6, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000544F,
0x00005453, 0x00000A1D, 0x00050080, 0x0000000C, 0x00003C4D, 0x00004144,
0x0000544F, 0x000500C7, 0x0000000C, 0x00002E06, 0x00004159, 0x00000AC8,
0x00050080, 0x0000000C, 0x0000394F, 0x00003C4D, 0x00002E06, 0x0004007C,
0x0000000B, 0x00005670, 0x0000394F, 0x000200F9, 0x00005341, 0x000200F8,
0x00005341, 0x000700F5, 0x0000000B, 0x000024FC, 0x0000566F, 0x0000537D,
0x00005670, 0x00002DD9, 0x00050084, 0x00000011, 0x00003FA8, 0x00001F69,
0x00001997, 0x00050082, 0x00000011, 0x00003BBC, 0x00005C0B, 0x00003FA8,
0x00050051, 0x0000000B, 0x00001C87, 0x00001997, 0x00000000, 0x00050051,
0x0000000B, 0x00005962, 0x00001997, 0x00000001, 0x00050084, 0x0000000B,
0x00003372, 0x00001C87, 0x00005962, 0x00050084, 0x0000000B, 0x00003CA0,
0x000024FC, 0x00003372, 0x00050051, 0x0000000B, 0x00003ED4, 0x00003BBC,
0x00000000, 0x00050084, 0x0000000B, 0x00003E12, 0x00003ED4, 0x00005962,
0x00050051, 0x0000000B, 0x00001AE6, 0x00003BBC, 0x00000001, 0x00050080,
0x0000000B, 0x00002B25, 0x00003E12, 0x00001AE6, 0x000500C4, 0x0000000B,
0x0000609D, 0x00002B25, 0x00000A13, 0x000500C7, 0x0000000B, 0x00005AB3,
0x000049F1, 0x00000A1F, 0x00050080, 0x0000000B, 0x00002557, 0x0000609D,
0x00005AB3, 0x000500C4, 0x0000000B, 0x000040AD, 0x00002557, 0x00000A0D,
0x00050080, 0x0000000B, 0x00004EAA, 0x00003CA0, 0x000040AD, 0x00050080,
0x0000000B, 0x0000453C, 0x00005B88, 0x00004EAA, 0x000500C2, 0x0000000B,
0x000036D8, 0x0000453C, 0x00000A16, 0x000500C2, 0x0000000B, 0x00002DF6,
0x00004FA3, 0x00000A10, 0x000500C7, 0x0000000B, 0x000020CA, 0x00002DF6,
0x00000A13, 0x00060041, 0x00000294, 0x000050F7, 0x0000107A, 0x00000A0B,
0x000036D8, 0x0004003D, 0x00000017, 0x00002585, 0x000050F7, 0x000500AA,
0x00000009, 0x00005272, 0x000020CA, 0x00000A0D, 0x000300F7, 0x0000368A,
0x00000000, 0x000400FA, 0x00005272, 0x00002957, 0x0000368A, 0x000200F8,
0x00002957, 0x000500C7, 0x00000017, 0x0000475F, 0x00002585, 0x000009CE,
0x000500C4, 0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7,
0x00000017, 0x000050AC, 0x00002585, 0x0000072E, 0x000500C2, 0x00000017,
0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8,
0x000024D1, 0x0000448D, 0x000200F9, 0x0000368A, 0x000200F8, 0x0000368A,
0x000700F5, 0x00000017, 0x000040DE, 0x00002585, 0x00005341, 0x00003FF8,
0x00002957, 0x000500C7, 0x00000017, 0x00004740, 0x000040DE, 0x00000352,
0x00040070, 0x0000001D, 0x000023B1, 0x00004740, 0x0005008E, 0x0000001D,
0x00004BA5, 0x000023B1, 0x0000092A, 0x000500C2, 0x00000017, 0x00005B47,
0x000040DE, 0x000002ED, 0x00040070, 0x0000001D, 0x0000483C, 0x00005B47,
0x0005008E, 0x0000001D, 0x00004812, 0x0000483C, 0x0000092A, 0x00050051,
0x0000000D, 0x0000187C, 0x00004BA5, 0x00000000, 0x00050051, 0x0000000D,
0x000035EE, 0x00004812, 0x00000000, 0x00050050, 0x00000013, 0x00004B20,
0x0000187C, 0x000035EE, 0x0006000C, 0x0000000B, 0x00002171, 0x00000001,
0x0000003A, 0x00004B20, 0x00050051, 0x0000000D, 0x00005BBF, 0x00004BA5,
0x00000001, 0x00050051, 0x0000000D, 0x000039A7, 0x00004812, 0x00000001,
0x00050050, 0x00000013, 0x00004B21, 0x00005BBF, 0x000039A7, 0x0006000C,
0x0000000B, 0x00002172, 0x00000001, 0x0000003A, 0x00004B21, 0x00050051,
0x0000000D, 0x00005BC0, 0x00004BA5, 0x00000002, 0x00050051, 0x0000000D,
0x000039A8, 0x00004812, 0x00000002, 0x00050050, 0x00000013, 0x00004B22,
0x00005BC0, 0x000039A8, 0x0006000C, 0x0000000B, 0x00002173, 0x00000001,
0x0000003A, 0x00004B22, 0x00050051, 0x0000000D, 0x00005BC1, 0x00004BA5,
0x00000003, 0x00050051, 0x0000000D, 0x000039A9, 0x00004812, 0x00000003,
0x00050050, 0x00000013, 0x00004B0D, 0x00005BC1, 0x000039A9, 0x0006000C,
0x0000000B, 0x000020EE, 0x00000001, 0x0000003A, 0x00004B0D, 0x00070050,
0x00000017, 0x00003ABB, 0x00002171, 0x00002172, 0x00002173, 0x000020EE,
0x00060041, 0x00000294, 0x000045C3, 0x0000140E, 0x00000A0B, 0x000054A6,
0x0003003E, 0x000045C3, 0x00003ABB, 0x00050080, 0x0000000B, 0x00003CAC,
0x000054A6, 0x00000A0E, 0x000500AC, 0x00000009, 0x00001911, 0x00001C87,
0x00000A0D, 0x000300F7, 0x000060BC, 0x00000002, 0x000400FA, 0x00001911,
0x00005084, 0x00005094, 0x000200F8, 0x00005084, 0x00050086, 0x0000000B,
0x00003697, 0x000019EE, 0x00001C87, 0x00050084, 0x0000000B, 0x0000237E,
0x00003697, 0x00001C87, 0x00050082, 0x0000000B, 0x00003171, 0x000019EE,
0x0000237E, 0x00050080, 0x0000000B, 0x00002527, 0x00003171, 0x00000A0D,
0x000500AA, 0x00000009, 0x0000343F, 0x00002527, 0x00001C87, 0x000300F7,
0x00001EED, 0x00000000, 0x000400FA, 0x0000343F, 0x0000569E, 0x00002191,
0x000200F8, 0x0000569E, 0x00050084, 0x0000000B, 0x00004B59, 0x00000ACA,
0x00001C87, 0x000500C4, 0x0000000B, 0x0000540F, 0x00003171, 0x00000A16,
0x00050082, 0x0000000B, 0x00004944, 0x00004B59, 0x0000540F, 0x000200F9,
0x00001EED, 0x000200F8, 0x00002191, 0x000200F9, 0x00001EED, 0x000200F8,
0x00001EED, 0x000700F5, 0x0000000B, 0x0000292C, 0x00004944, 0x0000569E,
0x00000A3A, 0x00002191, 0x000200F9, 0x000060BC, 0x000200F8, 0x00005094,
0x000200F9, 0x000060BC, 0x000200F8, 0x000060BC, 0x000700F5, 0x0000000B,
0x000029BC, 0x0000292C, 0x00001EED, 0x00000ACA, 0x00005094, 0x00050084,
0x0000000B, 0x0000492B, 0x000029BC, 0x00005962, 0x000500C2, 0x0000000B,
0x0000406D, 0x0000492B, 0x00000A16, 0x00050080, 0x0000000B, 0x0000336B,
0x000036D8, 0x0000406D, 0x00060041, 0x00000294, 0x0000571A, 0x0000107A,
0x00000A0B, 0x0000336B, 0x0004003D, 0x00000017, 0x000019B2, 0x0000571A,
0x000300F7, 0x0000368B, 0x00000000, 0x000400FA, 0x00005272, 0x00002958,
0x0000368B, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760,
0x000019B2, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760,
0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x000019B2, 0x0000072E,
0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5,
0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x0000368B,
0x000200F8, 0x0000368B, 0x000700F5, 0x00000017, 0x000040DF, 0x000019B2,
0x000060BC, 0x00003FF9, 0x00002958, 0x000500C7, 0x00000017, 0x00004741,
0x000040DF, 0x00000352, 0x00040070, 0x0000001D, 0x000023B2, 0x00004741,
0x0005008E, 0x0000001D, 0x00004BA6, 0x000023B2, 0x0000092A, 0x000500C2,
0x00000017, 0x00005B48, 0x000040DF, 0x000002ED, 0x00040070, 0x0000001D,
0x0000483D, 0x00005B48, 0x0005008E, 0x0000001D, 0x00004813, 0x0000483D,
0x0000092A, 0x00050051, 0x0000000D, 0x0000187D, 0x00004BA6, 0x00000000,
0x00050051, 0x0000000D, 0x000035EF, 0x00004813, 0x00000000, 0x00050050,
0x00000013, 0x00004B23, 0x0000187D, 0x000035EF, 0x0006000C, 0x0000000B,
0x00002174, 0x00000001, 0x0000003A, 0x00004B23, 0x00050051, 0x0000000D,
0x00005BC2, 0x00004BA6, 0x00000001, 0x00050051, 0x0000000D, 0x000039AA,
0x00004813, 0x00000001, 0x00050050, 0x00000013, 0x00004B24, 0x00005BC2,
0x000039AA, 0x0006000C, 0x0000000B, 0x00002175, 0x00000001, 0x0000003A,
0x00004B24, 0x00050051, 0x0000000D, 0x00005BC3, 0x00004BA6, 0x00000002,
0x00050051, 0x0000000D, 0x000039AB, 0x00004813, 0x00000002, 0x00050050,
0x00000013, 0x00004B25, 0x00005BC3, 0x000039AB, 0x0006000C, 0x0000000B,
0x00002176, 0x00000001, 0x0000003A, 0x00004B25, 0x00050051, 0x0000000D,
0x00005BC4, 0x00004BA6, 0x00000003, 0x00050051, 0x0000000D, 0x000039AC,
0x00004813, 0x00000003, 0x00050050, 0x00000013, 0x00004B0E, 0x00005BC4,
0x000039AC, 0x0006000C, 0x0000000B, 0x000020EF, 0x00000001, 0x0000003A,
0x00004B0E, 0x00070050, 0x00000017, 0x00003ABC, 0x00002174, 0x00002175,
0x00002176, 0x000020EF, 0x00060041, 0x00000294, 0x00004EBE, 0x0000140E,
0x00000A0B, 0x00003CAC, 0x0003003E, 0x00004EBE, 0x00003ABC, 0x000200F9,
0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,
};

View File

@ -0,0 +1,701 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 10
; Bound: 25179
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %5663 "main" %gl_GlobalInvocationID
OpExecutionMode %5663 LocalSize 4 32 1
OpMemberDecorate %_struct_1161 0 Offset 0
OpMemberDecorate %_struct_1161 1 Offset 4
OpMemberDecorate %_struct_1161 2 Offset 8
OpMemberDecorate %_struct_1161 3 Offset 12
OpMemberDecorate %_struct_1161 4 Offset 16
OpMemberDecorate %_struct_1161 5 Offset 28
OpMemberDecorate %_struct_1161 6 Offset 32
OpMemberDecorate %_struct_1161 7 Offset 36
OpDecorate %_struct_1161 Block
OpDecorate %5245 DescriptorSet 2
OpDecorate %5245 Binding 0
OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
OpDecorate %_runtimearr_v4uint ArrayStride 16
OpMemberDecorate %_struct_1972 0 NonReadable
OpMemberDecorate %_struct_1972 0 Offset 0
OpDecorate %_struct_1972 BufferBlock
OpDecorate %5134 DescriptorSet 0
OpDecorate %5134 Binding 0
OpDecorate %_runtimearr_v4uint_0 ArrayStride 16
OpMemberDecorate %_struct_1973 0 NonWritable
OpMemberDecorate %_struct_1973 0 Offset 0
OpDecorate %_struct_1973 BufferBlock
OpDecorate %4218 DescriptorSet 1
OpDecorate %4218 Binding 0
OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%v4uint = OpTypeVector %uint 4
%int = OpTypeInt 32 1
%v2int = OpTypeVector %int 2
%v3int = OpTypeVector %int 3
%bool = OpTypeBool
%v3uint = OpTypeVector %uint 3
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%float_n1 = OpConstant %float -1
%1284 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1
%v4int = OpTypeVector %int 4
%int_16 = OpConstant %int 16
%float_3_05185094en05 = OpConstant %float 3.05185094e-05
%uint_0 = OpConstant %uint 0
%v2float = OpTypeVector %float 2
%uint_1 = OpConstant %uint 1
%uint_2 = OpConstant %uint 2
%uint_3 = OpConstant %uint 3
%uint_16711935 = OpConstant %uint 16711935
%uint_8 = OpConstant %uint 8
%uint_4278255360 = OpConstant %uint 4278255360
%uint_16 = OpConstant %uint 16
%int_5 = OpConstant %int 5
%uint_5 = OpConstant %uint 5
%int_7 = OpConstant %int 7
%int_14 = OpConstant %int 14
%int_2 = OpConstant %int 2
%int_n16 = OpConstant %int -16
%int_1 = OpConstant %int 1
%int_15 = OpConstant %int 15
%int_4 = OpConstant %int 4
%int_n512 = OpConstant %int -512
%int_3 = OpConstant %int 3
%int_448 = OpConstant %int 448
%int_8 = OpConstant %int 8
%int_6 = OpConstant %int 6
%int_63 = OpConstant %int 63
%uint_4 = OpConstant %uint 4
%int_268435455 = OpConstant %int 268435455
%int_n2 = OpConstant %int -2
%uint_32 = OpConstant %uint 32
%_struct_1161 = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint
%_ptr_Uniform__struct_1161 = OpTypePointer Uniform %_struct_1161
%5245 = OpVariable %_ptr_Uniform__struct_1161 Uniform
%int_0 = OpConstant %int 0
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
%v2uint = OpTypeVector %uint 2
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
%2603 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0
%v2bool = OpTypeVector %bool 2
%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint
%_struct_1972 = OpTypeStruct %_runtimearr_v4uint
%_ptr_Uniform__struct_1972 = OpTypePointer Uniform %_struct_1972
%5134 = OpVariable %_ptr_Uniform__struct_1972 Uniform
%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint
%_struct_1973 = OpTypeStruct %_runtimearr_v4uint_0
%_ptr_Uniform__struct_1973 = OpTypePointer Uniform %_struct_1973
%4218 = OpVariable %_ptr_Uniform__struct_1973 Uniform
%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1
%uint_9 = OpConstant %uint 9
%2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935
%317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8
%1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360
%749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16
%770 = OpConstantComposite %v4int %int_16 %int_16 %int_16 %int_16
%5663 = OpFunction %void None %1282
%15110 = OpLabel
OpSelectionMerge %19578 None
OpSwitch %uint_0 %15137
%15137 = OpLabel
%12591 = OpLoad %v3uint %gl_GlobalInvocationID
%10229 = OpShiftLeftLogical %v3uint %12591 %2603
%25178 = OpAccessChain %_ptr_Uniform_v3uint %5245 %int_4
%22965 = OpLoad %v3uint %25178
%18835 = OpVectorShuffle %v2uint %10229 %10229 0 1
%6626 = OpVectorShuffle %v2uint %22965 %22965 0 1
%17032 = OpUGreaterThanEqual %v2bool %18835 %6626
%24679 = OpAny %bool %17032
OpSelectionMerge %6282 DontFlatten
OpBranchConditional %24679 %21992 %6282
%21992 = OpLabel
OpBranch %19578
%6282 = OpLabel
%6795 = OpBitcast %v3int %10229
%18792 = OpAccessChain %_ptr_Uniform_uint %5245 %int_6
%9788 = OpLoad %uint %18792
%20376 = OpCompositeExtract %uint %22965 1
%14692 = OpCompositeExtract %int %6795 0
%22810 = OpIMul %int %14692 %int_4
%6362 = OpCompositeExtract %int %6795 2
%14505 = OpBitcast %int %20376
%11279 = OpIMul %int %6362 %14505
%17598 = OpCompositeExtract %int %6795 1
%22228 = OpIAdd %int %11279 %17598
%22405 = OpBitcast %int %9788
%24535 = OpIMul %int %22228 %22405
%7061 = OpIAdd %int %22810 %24535
%19270 = OpBitcast %uint %7061
%19460 = OpAccessChain %_ptr_Uniform_uint %5245 %int_5
%22875 = OpLoad %uint %19460
%8517 = OpIAdd %uint %19270 %22875
%21670 = OpShiftRightLogical %uint %8517 %uint_4
%20950 = OpAccessChain %_ptr_Uniform_uint %5245 %int_0
%21411 = OpLoad %uint %20950
%6381 = OpBitwiseAnd %uint %21411 %uint_1
%10467 = OpINotEqual %bool %6381 %uint_0
OpSelectionMerge %23266 DontFlatten
OpBranchConditional %10467 %10108 %10765
%10108 = OpLabel
%23508 = OpBitwiseAnd %uint %21411 %uint_2
%16300 = OpINotEqual %bool %23508 %uint_0
OpSelectionMerge %7691 DontFlatten
OpBranchConditional %16300 %12129 %25128
%12129 = OpLabel
%18210 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%15627 = OpLoad %uint %18210
%22624 = OpAccessChain %_ptr_Uniform_uint %5245 %int_3
%21535 = OpLoad %uint %22624
%14923 = OpShiftRightArithmetic %int %17598 %int_4
%18773 = OpShiftRightArithmetic %int %6362 %int_2
%18759 = OpShiftRightLogical %uint %21535 %uint_4
%6314 = OpBitcast %int %18759
%21281 = OpIMul %int %18773 %6314
%15143 = OpIAdd %int %14923 %21281
%9032 = OpShiftRightLogical %uint %15627 %uint_5
%14593 = OpBitcast %int %9032
%8436 = OpIMul %int %15143 %14593
%12986 = OpShiftRightArithmetic %int %14692 %int_5
%24558 = OpIAdd %int %12986 %8436
%8797 = OpShiftLeftLogical %int %24558 %uint_8
%11510 = OpBitwiseAnd %int %8797 %int_268435455
%18938 = OpShiftLeftLogical %int %11510 %int_1
%19768 = OpBitwiseAnd %int %14692 %int_7
%12600 = OpBitwiseAnd %int %17598 %int_6
%17741 = OpShiftLeftLogical %int %12600 %int_2
%17227 = OpIAdd %int %19768 %17741
%7048 = OpShiftLeftLogical %int %17227 %uint_8
%24035 = OpShiftRightArithmetic %int %7048 %int_6
%8725 = OpShiftRightArithmetic %int %17598 %int_3
%13731 = OpIAdd %int %8725 %18773
%23052 = OpBitwiseAnd %int %13731 %int_1
%16658 = OpShiftRightArithmetic %int %14692 %int_3
%18794 = OpShiftLeftLogical %int %23052 %int_1
%13501 = OpIAdd %int %16658 %18794
%19165 = OpBitwiseAnd %int %13501 %int_3
%21578 = OpShiftLeftLogical %int %19165 %int_1
%15435 = OpIAdd %int %23052 %21578
%13150 = OpBitwiseAnd %int %24035 %int_n16
%20336 = OpIAdd %int %18938 %13150
%23345 = OpShiftLeftLogical %int %20336 %int_1
%23274 = OpBitwiseAnd %int %24035 %int_15
%10332 = OpIAdd %int %23345 %23274
%18356 = OpBitwiseAnd %int %6362 %int_3
%21579 = OpShiftLeftLogical %int %18356 %uint_8
%16727 = OpIAdd %int %10332 %21579
%19166 = OpBitwiseAnd %int %17598 %int_1
%21580 = OpShiftLeftLogical %int %19166 %int_4
%16728 = OpIAdd %int %16727 %21580
%20438 = OpBitwiseAnd %int %15435 %int_1
%9987 = OpShiftLeftLogical %int %20438 %int_3
%13106 = OpShiftRightArithmetic %int %16728 %int_6
%14038 = OpBitwiseAnd %int %13106 %int_7
%13330 = OpIAdd %int %9987 %14038
%23346 = OpShiftLeftLogical %int %13330 %int_3
%23217 = OpBitwiseAnd %int %15435 %int_n2
%10908 = OpIAdd %int %23346 %23217
%23347 = OpShiftLeftLogical %int %10908 %int_2
%23218 = OpBitwiseAnd %int %16728 %int_n512
%10909 = OpIAdd %int %23347 %23218
%23348 = OpShiftLeftLogical %int %10909 %int_3
%24224 = OpBitwiseAnd %int %16728 %int_63
%21741 = OpIAdd %int %23348 %24224
OpBranch %7691
%25128 = OpLabel
%6796 = OpBitcast %v2int %18835
%18793 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%11954 = OpLoad %uint %18793
%18756 = OpCompositeExtract %int %6796 0
%19701 = OpShiftRightArithmetic %int %18756 %int_5
%10055 = OpCompositeExtract %int %6796 1
%16476 = OpShiftRightArithmetic %int %10055 %int_5
%23373 = OpShiftRightLogical %uint %11954 %uint_5
%6315 = OpBitcast %int %23373
%21319 = OpIMul %int %16476 %6315
%16222 = OpIAdd %int %19701 %21319
%19086 = OpShiftLeftLogical %int %16222 %uint_9
%10934 = OpBitwiseAnd %int %18756 %int_7
%12601 = OpBitwiseAnd %int %10055 %int_14
%17742 = OpShiftLeftLogical %int %12601 %int_2
%17303 = OpIAdd %int %10934 %17742
%6375 = OpShiftLeftLogical %int %17303 %uint_2
%10161 = OpBitwiseAnd %int %6375 %int_n16
%12150 = OpShiftLeftLogical %int %10161 %int_1
%15436 = OpIAdd %int %19086 %12150
%13207 = OpBitwiseAnd %int %6375 %int_15
%19760 = OpIAdd %int %15436 %13207
%18357 = OpBitwiseAnd %int %10055 %int_1
%21581 = OpShiftLeftLogical %int %18357 %int_4
%16729 = OpIAdd %int %19760 %21581
%20514 = OpBitwiseAnd %int %16729 %int_n512
%9238 = OpShiftLeftLogical %int %20514 %int_3
%18995 = OpBitwiseAnd %int %10055 %int_16
%12151 = OpShiftLeftLogical %int %18995 %int_7
%16730 = OpIAdd %int %9238 %12151
%19167 = OpBitwiseAnd %int %16729 %int_448
%21582 = OpShiftLeftLogical %int %19167 %int_2
%16708 = OpIAdd %int %16730 %21582
%20611 = OpBitwiseAnd %int %10055 %int_8
%16831 = OpShiftRightArithmetic %int %20611 %int_2
%7916 = OpShiftRightArithmetic %int %18756 %int_3
%13750 = OpIAdd %int %16831 %7916
%21587 = OpBitwiseAnd %int %13750 %int_3
%21583 = OpShiftLeftLogical %int %21587 %int_6
%15437 = OpIAdd %int %16708 %21583
%14157 = OpBitwiseAnd %int %16729 %int_63
%12098 = OpIAdd %int %15437 %14157
OpBranch %7691
%7691 = OpLabel
%10540 = OpPhi %int %21741 %12129 %12098 %25128
OpBranch %23266
%10765 = OpLabel
%20632 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%15628 = OpLoad %uint %20632
%21275 = OpAccessChain %_ptr_Uniform_uint %5245 %int_3
%13550 = OpLoad %uint %21275
%15070 = OpBitcast %int %13550
%18927 = OpIMul %int %6362 %15070
%8334 = OpIAdd %int %18927 %17598
%8952 = OpBitcast %int %15628
%7839 = OpIMul %int %8334 %8952
%7984 = OpIAdd %int %22810 %7839
OpBranch %23266
%23266 = OpLabel
%19748 = OpPhi %int %10540 %7691 %7984 %10765
%24922 = OpAccessChain %_ptr_Uniform_uint %5245 %int_1
%7502 = OpLoad %uint %24922
%15686 = OpBitcast %int %7502
%15579 = OpIAdd %int %15686 %19748
%18556 = OpBitcast %uint %15579
%21493 = OpShiftRightLogical %uint %18556 %uint_4
%14997 = OpShiftRightLogical %uint %21411 %uint_2
%8394 = OpBitwiseAnd %uint %14997 %uint_3
%20727 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %21493
%8142 = OpLoad %v4uint %20727
%13760 = OpIEqual %bool %8394 %uint_1
%21366 = OpIEqual %bool %8394 %uint_2
%22150 = OpLogicalOr %bool %13760 %21366
OpSelectionMerge %13411 None
OpBranchConditional %22150 %10583 %13411
%10583 = OpLabel
%18271 = OpBitwiseAnd %v4uint %8142 %2510
%9425 = OpShiftLeftLogical %v4uint %18271 %317
%20652 = OpBitwiseAnd %v4uint %8142 %1838
%17549 = OpShiftRightLogical %v4uint %20652 %317
%16376 = OpBitwiseOr %v4uint %9425 %17549
OpBranch %13411
%13411 = OpLabel
%22649 = OpPhi %v4uint %8142 %23266 %16376 %10583
%19638 = OpIEqual %bool %8394 %uint_3
%15139 = OpLogicalOr %bool %21366 %19638
OpSelectionMerge %12537 None
OpBranchConditional %15139 %11064 %12537
%11064 = OpLabel
%24087 = OpShiftLeftLogical %v4uint %22649 %749
%15335 = OpShiftRightLogical %v4uint %22649 %749
%10728 = OpBitwiseOr %v4uint %24087 %15335
OpBranch %12537
%12537 = OpLabel
%12106 = OpPhi %v4uint %22649 %13411 %10728 %11064
%15375 = OpBitcast %v4int %12106
%16910 = OpShiftLeftLogical %v4int %15375 %770
%16536 = OpShiftRightArithmetic %v4int %16910 %770
%10903 = OpConvertSToF %v4float %16536
%20413 = OpVectorTimesScalar %v4float %10903 %float_3_05185094en05
%23989 = OpExtInst %v4float %1 FMax %1284 %20413
%14338 = OpShiftRightArithmetic %v4int %15375 %770
%6607 = OpConvertSToF %v4float %14338
%18247 = OpVectorTimesScalar %v4float %6607 %float_3_05185094en05
%24070 = OpExtInst %v4float %1 FMax %1284 %18247
%24330 = OpCompositeExtract %float %23989 0
%14319 = OpCompositeExtract %float %24070 0
%19232 = OpCompositeConstruct %v2float %24330 %14319
%8561 = OpExtInst %uint %1 PackHalf2x16 %19232
%23487 = OpCompositeExtract %float %23989 1
%14759 = OpCompositeExtract %float %24070 1
%19233 = OpCompositeConstruct %v2float %23487 %14759
%8562 = OpExtInst %uint %1 PackHalf2x16 %19233
%23488 = OpCompositeExtract %float %23989 2
%14760 = OpCompositeExtract %float %24070 2
%19234 = OpCompositeConstruct %v2float %23488 %14760
%8563 = OpExtInst %uint %1 PackHalf2x16 %19234
%23489 = OpCompositeExtract %float %23989 3
%14761 = OpCompositeExtract %float %24070 3
%19213 = OpCompositeConstruct %v2float %23489 %14761
%8430 = OpExtInst %uint %1 PackHalf2x16 %19213
%15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430
%17859 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %21670
OpStore %17859 %15035
%15044 = OpIAdd %uint %21670 %int_1
%18776 = OpSelect %uint %10467 %uint_32 %uint_16
%11803 = OpShiftRightLogical %uint %18776 %uint_4
%13947 = OpIAdd %uint %21493 %11803
%22298 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %13947
%6578 = OpLoad %v4uint %22298
OpSelectionMerge %14874 None
OpBranchConditional %22150 %10584 %14874
%10584 = OpLabel
%18272 = OpBitwiseAnd %v4uint %6578 %2510
%9426 = OpShiftLeftLogical %v4uint %18272 %317
%20653 = OpBitwiseAnd %v4uint %6578 %1838
%17550 = OpShiftRightLogical %v4uint %20653 %317
%16377 = OpBitwiseOr %v4uint %9426 %17550
OpBranch %14874
%14874 = OpLabel
%10924 = OpPhi %v4uint %6578 %12537 %16377 %10584
OpSelectionMerge %12538 None
OpBranchConditional %15139 %11065 %12538
%11065 = OpLabel
%24088 = OpShiftLeftLogical %v4uint %10924 %749
%15336 = OpShiftRightLogical %v4uint %10924 %749
%10729 = OpBitwiseOr %v4uint %24088 %15336
OpBranch %12538
%12538 = OpLabel
%12107 = OpPhi %v4uint %10924 %14874 %10729 %11065
%15376 = OpBitcast %v4int %12107
%16911 = OpShiftLeftLogical %v4int %15376 %770
%16537 = OpShiftRightArithmetic %v4int %16911 %770
%10904 = OpConvertSToF %v4float %16537
%20414 = OpVectorTimesScalar %v4float %10904 %float_3_05185094en05
%23990 = OpExtInst %v4float %1 FMax %1284 %20414
%14339 = OpShiftRightArithmetic %v4int %15376 %770
%6608 = OpConvertSToF %v4float %14339
%18248 = OpVectorTimesScalar %v4float %6608 %float_3_05185094en05
%24071 = OpExtInst %v4float %1 FMax %1284 %18248
%24331 = OpCompositeExtract %float %23990 0
%14320 = OpCompositeExtract %float %24071 0
%19235 = OpCompositeConstruct %v2float %24331 %14320
%8564 = OpExtInst %uint %1 PackHalf2x16 %19235
%23490 = OpCompositeExtract %float %23990 1
%14762 = OpCompositeExtract %float %24071 1
%19236 = OpCompositeConstruct %v2float %23490 %14762
%8565 = OpExtInst %uint %1 PackHalf2x16 %19236
%23491 = OpCompositeExtract %float %23990 2
%14763 = OpCompositeExtract %float %24071 2
%19237 = OpCompositeConstruct %v2float %23491 %14763
%8566 = OpExtInst %uint %1 PackHalf2x16 %19237
%23492 = OpCompositeExtract %float %23990 3
%14764 = OpCompositeExtract %float %24071 3
%19214 = OpCompositeConstruct %v2float %23492 %14764
%8431 = OpExtInst %uint %1 PackHalf2x16 %19214
%15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431
%20158 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %15044
OpStore %20158 %15036
OpBranch %19578
%19578 = OpLabel
OpReturn
OpFunctionEnd
#endif
const uint32_t texture_load_rg16_snorm_float_cs[] = {
0x07230203, 0x00010000, 0x0008000A, 0x0000625B, 0x00000000, 0x00020011,
0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,
0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,
0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00050048, 0x00000489,
0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001,
0x00000023, 0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023,
0x00000008, 0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C,
0x00050048, 0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048,
0x00000489, 0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489,
0x00000006, 0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007,
0x00000023, 0x00000024, 0x00030047, 0x00000489, 0x00000002, 0x00040047,
0x0000147D, 0x00000022, 0x00000002, 0x00040047, 0x0000147D, 0x00000021,
0x00000000, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,
0x000007DC, 0x00000006, 0x00000010, 0x00040048, 0x000007B4, 0x00000000,
0x00000019, 0x00050048, 0x000007B4, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B4, 0x00000003, 0x00040047, 0x0000140E, 0x00000022,
0x00000000, 0x00040047, 0x0000140E, 0x00000021, 0x00000000, 0x00040047,
0x000007DD, 0x00000006, 0x00000010, 0x00040048, 0x000007B5, 0x00000000,
0x00000018, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B5, 0x00000003, 0x00040047, 0x0000107A, 0x00000022,
0x00000001, 0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047,
0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,
0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,
0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,
0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,
0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,
0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00030016, 0x0000000D,
0x00000020, 0x00040017, 0x0000001D, 0x0000000D, 0x00000004, 0x0004002B,
0x0000000D, 0x00000341, 0xBF800000, 0x0007002C, 0x0000001D, 0x00000504,
0x00000341, 0x00000341, 0x00000341, 0x00000341, 0x00040017, 0x0000001A,
0x0000000C, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A3B, 0x00000010,
0x0004002B, 0x0000000D, 0x00000A38, 0x38000100, 0x0004002B, 0x0000000B,
0x00000A0A, 0x00000000, 0x00040017, 0x00000013, 0x0000000D, 0x00000002,
0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B,
0x00000A10, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003,
0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B,
0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00,
0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000C,
0x00000A1A, 0x00000005, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005,
0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C,
0x00000A35, 0x0000000E, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002,
0x0004002B, 0x0000000C, 0x000009DB, 0xFFFFFFF0, 0x0004002B, 0x0000000C,
0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A39, 0x0000000F,
0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,
0x0000040B, 0xFFFFFE00, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003,
0x0004002B, 0x0000000C, 0x00000388, 0x000001C0, 0x0004002B, 0x0000000C,
0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006,
0x0004002B, 0x0000000C, 0x00000AC8, 0x0000003F, 0x0004002B, 0x0000000B,
0x00000A16, 0x00000004, 0x0004002B, 0x0000000C, 0x0000078B, 0x0FFFFFFF,
0x0004002B, 0x0000000C, 0x00000A05, 0xFFFFFFFE, 0x0004002B, 0x0000000B,
0x00000A6A, 0x00000020, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B,
0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B,
0x00040020, 0x00000706, 0x00000002, 0x00000489, 0x0004003B, 0x00000706,
0x0000147D, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,
0x00040020, 0x00000288, 0x00000002, 0x0000000B, 0x00040020, 0x00000291,
0x00000002, 0x00000014, 0x00040017, 0x00000011, 0x0000000B, 0x00000002,
0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B, 0x00000292,
0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A2B, 0x00000A13,
0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009, 0x00000002,
0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC,
0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A31,
0x0000140E, 0x00000002, 0x0003001D, 0x000007DD, 0x00000017, 0x0003001E,
0x000007B5, 0x000007DD, 0x00040020, 0x00000A32, 0x00000002, 0x000007B5,
0x0004003B, 0x00000A32, 0x0000107A, 0x00000002, 0x00040020, 0x00000294,
0x00000002, 0x00000017, 0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16,
0x00000A6A, 0x00000A0D, 0x0004002B, 0x0000000B, 0x00000A25, 0x00000009,
0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6,
0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22,
0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD,
0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x000002ED,
0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0007002C, 0x0000001A,
0x00000302, 0x00000A3B, 0x00000A3B, 0x00000A3B, 0x00000A3B, 0x00050036,
0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06,
0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00003B21,
0x000200F8, 0x00003B21, 0x0004003D, 0x00000014, 0x0000312F, 0x00000F48,
0x000500C4, 0x00000014, 0x000027F5, 0x0000312F, 0x00000A2B, 0x00050041,
0x00000291, 0x0000625A, 0x0000147D, 0x00000A17, 0x0004003D, 0x00000014,
0x000059B5, 0x0000625A, 0x0007004F, 0x00000011, 0x00004993, 0x000027F5,
0x000027F5, 0x00000000, 0x00000001, 0x0007004F, 0x00000011, 0x000019E2,
0x000059B5, 0x000059B5, 0x00000000, 0x00000001, 0x000500AE, 0x0000000F,
0x00004288, 0x00004993, 0x000019E2, 0x0004009A, 0x00000009, 0x00006067,
0x00004288, 0x000300F7, 0x0000188A, 0x00000002, 0x000400FA, 0x00006067,
0x000055E8, 0x0000188A, 0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A,
0x000200F8, 0x0000188A, 0x0004007C, 0x00000016, 0x00001A8B, 0x000027F5,
0x00050041, 0x00000288, 0x00004968, 0x0000147D, 0x00000A1D, 0x0004003D,
0x0000000B, 0x0000263C, 0x00004968, 0x00050051, 0x0000000B, 0x00004F98,
0x000059B5, 0x00000001, 0x00050051, 0x0000000C, 0x00003964, 0x00001A8B,
0x00000000, 0x00050084, 0x0000000C, 0x0000591A, 0x00003964, 0x00000A17,
0x00050051, 0x0000000C, 0x000018DA, 0x00001A8B, 0x00000002, 0x0004007C,
0x0000000C, 0x000038A9, 0x00004F98, 0x00050084, 0x0000000C, 0x00002C0F,
0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00001A8B,
0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE,
0x0004007C, 0x0000000C, 0x00005785, 0x0000263C, 0x00050084, 0x0000000C,
0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00001B95,
0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B, 0x00004B46, 0x00001B95,
0x00050041, 0x00000288, 0x00004C04, 0x0000147D, 0x00000A1A, 0x0004003D,
0x0000000B, 0x0000595B, 0x00004C04, 0x00050080, 0x0000000B, 0x00002145,
0x00004B46, 0x0000595B, 0x000500C2, 0x0000000B, 0x000054A6, 0x00002145,
0x00000A16, 0x00050041, 0x00000288, 0x000051D6, 0x0000147D, 0x00000A0B,
0x0004003D, 0x0000000B, 0x000053A3, 0x000051D6, 0x000500C7, 0x0000000B,
0x000018ED, 0x000053A3, 0x00000A0D, 0x000500AB, 0x00000009, 0x000028E3,
0x000018ED, 0x00000A0A, 0x000300F7, 0x00005AE2, 0x00000002, 0x000400FA,
0x000028E3, 0x0000277C, 0x00002A0D, 0x000200F8, 0x0000277C, 0x000500C7,
0x0000000B, 0x00005BD4, 0x000053A3, 0x00000A10, 0x000500AB, 0x00000009,
0x00003FAC, 0x00005BD4, 0x00000A0A, 0x000300F7, 0x00001E0B, 0x00000002,
0x000400FA, 0x00003FAC, 0x00002F61, 0x00006228, 0x000200F8, 0x00002F61,
0x00050041, 0x00000288, 0x00004722, 0x0000147D, 0x00000A11, 0x0004003D,
0x0000000B, 0x00003D0B, 0x00004722, 0x00050041, 0x00000288, 0x00005860,
0x0000147D, 0x00000A14, 0x0004003D, 0x0000000B, 0x0000541F, 0x00005860,
0x000500C3, 0x0000000C, 0x00003A4B, 0x000044BE, 0x00000A17, 0x000500C3,
0x0000000C, 0x00004955, 0x000018DA, 0x00000A11, 0x000500C2, 0x0000000B,
0x00004947, 0x0000541F, 0x00000A16, 0x0004007C, 0x0000000C, 0x000018AA,
0x00004947, 0x00050084, 0x0000000C, 0x00005321, 0x00004955, 0x000018AA,
0x00050080, 0x0000000C, 0x00003B27, 0x00003A4B, 0x00005321, 0x000500C2,
0x0000000B, 0x00002348, 0x00003D0B, 0x00000A19, 0x0004007C, 0x0000000C,
0x00003901, 0x00002348, 0x00050084, 0x0000000C, 0x000020F4, 0x00003B27,
0x00003901, 0x000500C3, 0x0000000C, 0x000032BA, 0x00003964, 0x00000A1A,
0x00050080, 0x0000000C, 0x00005FEE, 0x000032BA, 0x000020F4, 0x000500C4,
0x0000000C, 0x0000225D, 0x00005FEE, 0x00000A22, 0x000500C7, 0x0000000C,
0x00002CF6, 0x0000225D, 0x0000078B, 0x000500C4, 0x0000000C, 0x000049FA,
0x00002CF6, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00004D38, 0x00003964,
0x00000A20, 0x000500C7, 0x0000000C, 0x00003138, 0x000044BE, 0x00000A1D,
0x000500C4, 0x0000000C, 0x0000454D, 0x00003138, 0x00000A11, 0x00050080,
0x0000000C, 0x0000434B, 0x00004D38, 0x0000454D, 0x000500C4, 0x0000000C,
0x00001B88, 0x0000434B, 0x00000A22, 0x000500C3, 0x0000000C, 0x00005DE3,
0x00001B88, 0x00000A1D, 0x000500C3, 0x0000000C, 0x00002215, 0x000044BE,
0x00000A14, 0x00050080, 0x0000000C, 0x000035A3, 0x00002215, 0x00004955,
0x000500C7, 0x0000000C, 0x00005A0C, 0x000035A3, 0x00000A0E, 0x000500C3,
0x0000000C, 0x00004112, 0x00003964, 0x00000A14, 0x000500C4, 0x0000000C,
0x0000496A, 0x00005A0C, 0x00000A0E, 0x00050080, 0x0000000C, 0x000034BD,
0x00004112, 0x0000496A, 0x000500C7, 0x0000000C, 0x00004ADD, 0x000034BD,
0x00000A14, 0x000500C4, 0x0000000C, 0x0000544A, 0x00004ADD, 0x00000A0E,
0x00050080, 0x0000000C, 0x00003C4B, 0x00005A0C, 0x0000544A, 0x000500C7,
0x0000000C, 0x0000335E, 0x00005DE3, 0x000009DB, 0x00050080, 0x0000000C,
0x00004F70, 0x000049FA, 0x0000335E, 0x000500C4, 0x0000000C, 0x00005B31,
0x00004F70, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005AEA, 0x00005DE3,
0x00000A39, 0x00050080, 0x0000000C, 0x0000285C, 0x00005B31, 0x00005AEA,
0x000500C7, 0x0000000C, 0x000047B4, 0x000018DA, 0x00000A14, 0x000500C4,
0x0000000C, 0x0000544B, 0x000047B4, 0x00000A22, 0x00050080, 0x0000000C,
0x00004157, 0x0000285C, 0x0000544B, 0x000500C7, 0x0000000C, 0x00004ADE,
0x000044BE, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000544C, 0x00004ADE,
0x00000A17, 0x00050080, 0x0000000C, 0x00004158, 0x00004157, 0x0000544C,
0x000500C7, 0x0000000C, 0x00004FD6, 0x00003C4B, 0x00000A0E, 0x000500C4,
0x0000000C, 0x00002703, 0x00004FD6, 0x00000A14, 0x000500C3, 0x0000000C,
0x00003332, 0x00004158, 0x00000A1D, 0x000500C7, 0x0000000C, 0x000036D6,
0x00003332, 0x00000A20, 0x00050080, 0x0000000C, 0x00003412, 0x00002703,
0x000036D6, 0x000500C4, 0x0000000C, 0x00005B32, 0x00003412, 0x00000A14,
0x000500C7, 0x0000000C, 0x00005AB1, 0x00003C4B, 0x00000A05, 0x00050080,
0x0000000C, 0x00002A9C, 0x00005B32, 0x00005AB1, 0x000500C4, 0x0000000C,
0x00005B33, 0x00002A9C, 0x00000A11, 0x000500C7, 0x0000000C, 0x00005AB2,
0x00004158, 0x0000040B, 0x00050080, 0x0000000C, 0x00002A9D, 0x00005B33,
0x00005AB2, 0x000500C4, 0x0000000C, 0x00005B34, 0x00002A9D, 0x00000A14,
0x000500C7, 0x0000000C, 0x00005EA0, 0x00004158, 0x00000AC8, 0x00050080,
0x0000000C, 0x000054ED, 0x00005B34, 0x00005EA0, 0x000200F9, 0x00001E0B,
0x000200F8, 0x00006228, 0x0004007C, 0x00000012, 0x00001A8C, 0x00004993,
0x00050041, 0x00000288, 0x00004969, 0x0000147D, 0x00000A11, 0x0004003D,
0x0000000B, 0x00002EB2, 0x00004969, 0x00050051, 0x0000000C, 0x00004944,
0x00001A8C, 0x00000000, 0x000500C3, 0x0000000C, 0x00004CF5, 0x00004944,
0x00000A1A, 0x00050051, 0x0000000C, 0x00002747, 0x00001A8C, 0x00000001,
0x000500C3, 0x0000000C, 0x0000405C, 0x00002747, 0x00000A1A, 0x000500C2,
0x0000000B, 0x00005B4D, 0x00002EB2, 0x00000A19, 0x0004007C, 0x0000000C,
0x000018AB, 0x00005B4D, 0x00050084, 0x0000000C, 0x00005347, 0x0000405C,
0x000018AB, 0x00050080, 0x0000000C, 0x00003F5E, 0x00004CF5, 0x00005347,
0x000500C4, 0x0000000C, 0x00004A8E, 0x00003F5E, 0x00000A25, 0x000500C7,
0x0000000C, 0x00002AB6, 0x00004944, 0x00000A20, 0x000500C7, 0x0000000C,
0x00003139, 0x00002747, 0x00000A35, 0x000500C4, 0x0000000C, 0x0000454E,
0x00003139, 0x00000A11, 0x00050080, 0x0000000C, 0x00004397, 0x00002AB6,
0x0000454E, 0x000500C4, 0x0000000C, 0x000018E7, 0x00004397, 0x00000A10,
0x000500C7, 0x0000000C, 0x000027B1, 0x000018E7, 0x000009DB, 0x000500C4,
0x0000000C, 0x00002F76, 0x000027B1, 0x00000A0E, 0x00050080, 0x0000000C,
0x00003C4C, 0x00004A8E, 0x00002F76, 0x000500C7, 0x0000000C, 0x00003397,
0x000018E7, 0x00000A39, 0x00050080, 0x0000000C, 0x00004D30, 0x00003C4C,
0x00003397, 0x000500C7, 0x0000000C, 0x000047B5, 0x00002747, 0x00000A0E,
0x000500C4, 0x0000000C, 0x0000544D, 0x000047B5, 0x00000A17, 0x00050080,
0x0000000C, 0x00004159, 0x00004D30, 0x0000544D, 0x000500C7, 0x0000000C,
0x00005022, 0x00004159, 0x0000040B, 0x000500C4, 0x0000000C, 0x00002416,
0x00005022, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004A33, 0x00002747,
0x00000A3B, 0x000500C4, 0x0000000C, 0x00002F77, 0x00004A33, 0x00000A20,
0x00050080, 0x0000000C, 0x0000415A, 0x00002416, 0x00002F77, 0x000500C7,
0x0000000C, 0x00004ADF, 0x00004159, 0x00000388, 0x000500C4, 0x0000000C,
0x0000544E, 0x00004ADF, 0x00000A11, 0x00050080, 0x0000000C, 0x00004144,
0x0000415A, 0x0000544E, 0x000500C7, 0x0000000C, 0x00005083, 0x00002747,
0x00000A23, 0x000500C3, 0x0000000C, 0x000041BF, 0x00005083, 0x00000A11,
0x000500C3, 0x0000000C, 0x00001EEC, 0x00004944, 0x00000A14, 0x00050080,
0x0000000C, 0x000035B6, 0x000041BF, 0x00001EEC, 0x000500C7, 0x0000000C,
0x00005453, 0x000035B6, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000544F,
0x00005453, 0x00000A1D, 0x00050080, 0x0000000C, 0x00003C4D, 0x00004144,
0x0000544F, 0x000500C7, 0x0000000C, 0x0000374D, 0x00004159, 0x00000AC8,
0x00050080, 0x0000000C, 0x00002F42, 0x00003C4D, 0x0000374D, 0x000200F9,
0x00001E0B, 0x000200F8, 0x00001E0B, 0x000700F5, 0x0000000C, 0x0000292C,
0x000054ED, 0x00002F61, 0x00002F42, 0x00006228, 0x000200F9, 0x00005AE2,
0x000200F8, 0x00002A0D, 0x00050041, 0x00000288, 0x00005098, 0x0000147D,
0x00000A11, 0x0004003D, 0x0000000B, 0x00003D0C, 0x00005098, 0x00050041,
0x00000288, 0x0000531B, 0x0000147D, 0x00000A14, 0x0004003D, 0x0000000B,
0x000034EE, 0x0000531B, 0x0004007C, 0x0000000C, 0x00003ADE, 0x000034EE,
0x00050084, 0x0000000C, 0x000049EF, 0x000018DA, 0x00003ADE, 0x00050080,
0x0000000C, 0x0000208E, 0x000049EF, 0x000044BE, 0x0004007C, 0x0000000C,
0x000022F8, 0x00003D0C, 0x00050084, 0x0000000C, 0x00001E9F, 0x0000208E,
0x000022F8, 0x00050080, 0x0000000C, 0x00001F30, 0x0000591A, 0x00001E9F,
0x000200F9, 0x00005AE2, 0x000200F8, 0x00005AE2, 0x000700F5, 0x0000000C,
0x00004D24, 0x0000292C, 0x00001E0B, 0x00001F30, 0x00002A0D, 0x00050041,
0x00000288, 0x0000615A, 0x0000147D, 0x00000A0E, 0x0004003D, 0x0000000B,
0x00001D4E, 0x0000615A, 0x0004007C, 0x0000000C, 0x00003D46, 0x00001D4E,
0x00050080, 0x0000000C, 0x00003CDB, 0x00003D46, 0x00004D24, 0x0004007C,
0x0000000B, 0x0000487C, 0x00003CDB, 0x000500C2, 0x0000000B, 0x000053F5,
0x0000487C, 0x00000A16, 0x000500C2, 0x0000000B, 0x00003A95, 0x000053A3,
0x00000A10, 0x000500C7, 0x0000000B, 0x000020CA, 0x00003A95, 0x00000A13,
0x00060041, 0x00000294, 0x000050F7, 0x0000107A, 0x00000A0B, 0x000053F5,
0x0004003D, 0x00000017, 0x00001FCE, 0x000050F7, 0x000500AA, 0x00000009,
0x000035C0, 0x000020CA, 0x00000A0D, 0x000500AA, 0x00000009, 0x00005376,
0x000020CA, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x000035C0,
0x00005376, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686,
0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017,
0x0000475F, 0x00001FCE, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1,
0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00001FCE,
0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D,
0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9,
0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x00005879,
0x00001FCE, 0x00005AE2, 0x00003FF8, 0x00002957, 0x000500AA, 0x00000009,
0x00004CB6, 0x000020CA, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23,
0x00005376, 0x00004CB6, 0x000300F7, 0x000030F9, 0x00000000, 0x000400FA,
0x00003B23, 0x00002B38, 0x000030F9, 0x000200F8, 0x00002B38, 0x000500C4,
0x00000017, 0x00005E17, 0x00005879, 0x000002ED, 0x000500C2, 0x00000017,
0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8,
0x00005E17, 0x00003BE7, 0x000200F9, 0x000030F9, 0x000200F8, 0x000030F9,
0x000700F5, 0x00000017, 0x00002F4A, 0x00005879, 0x00003463, 0x000029E8,
0x00002B38, 0x0004007C, 0x0000001A, 0x00003C0F, 0x00002F4A, 0x000500C4,
0x0000001A, 0x0000420E, 0x00003C0F, 0x00000302, 0x000500C3, 0x0000001A,
0x00004098, 0x0000420E, 0x00000302, 0x0004006F, 0x0000001D, 0x00002A97,
0x00004098, 0x0005008E, 0x0000001D, 0x00004FBD, 0x00002A97, 0x00000A38,
0x0007000C, 0x0000001D, 0x00005DB5, 0x00000001, 0x00000028, 0x00000504,
0x00004FBD, 0x000500C3, 0x0000001A, 0x00003802, 0x00003C0F, 0x00000302,
0x0004006F, 0x0000001D, 0x000019CF, 0x00003802, 0x0005008E, 0x0000001D,
0x00004747, 0x000019CF, 0x00000A38, 0x0007000C, 0x0000001D, 0x00005E06,
0x00000001, 0x00000028, 0x00000504, 0x00004747, 0x00050051, 0x0000000D,
0x00005F0A, 0x00005DB5, 0x00000000, 0x00050051, 0x0000000D, 0x000037EF,
0x00005E06, 0x00000000, 0x00050050, 0x00000013, 0x00004B20, 0x00005F0A,
0x000037EF, 0x0006000C, 0x0000000B, 0x00002171, 0x00000001, 0x0000003A,
0x00004B20, 0x00050051, 0x0000000D, 0x00005BBF, 0x00005DB5, 0x00000001,
0x00050051, 0x0000000D, 0x000039A7, 0x00005E06, 0x00000001, 0x00050050,
0x00000013, 0x00004B21, 0x00005BBF, 0x000039A7, 0x0006000C, 0x0000000B,
0x00002172, 0x00000001, 0x0000003A, 0x00004B21, 0x00050051, 0x0000000D,
0x00005BC0, 0x00005DB5, 0x00000002, 0x00050051, 0x0000000D, 0x000039A8,
0x00005E06, 0x00000002, 0x00050050, 0x00000013, 0x00004B22, 0x00005BC0,
0x000039A8, 0x0006000C, 0x0000000B, 0x00002173, 0x00000001, 0x0000003A,
0x00004B22, 0x00050051, 0x0000000D, 0x00005BC1, 0x00005DB5, 0x00000003,
0x00050051, 0x0000000D, 0x000039A9, 0x00005E06, 0x00000003, 0x00050050,
0x00000013, 0x00004B0D, 0x00005BC1, 0x000039A9, 0x0006000C, 0x0000000B,
0x000020EE, 0x00000001, 0x0000003A, 0x00004B0D, 0x00070050, 0x00000017,
0x00003ABB, 0x00002171, 0x00002172, 0x00002173, 0x000020EE, 0x00060041,
0x00000294, 0x000045C3, 0x0000140E, 0x00000A0B, 0x000054A6, 0x0003003E,
0x000045C3, 0x00003ABB, 0x00050080, 0x0000000B, 0x00003AC4, 0x000054A6,
0x00000A0E, 0x000600A9, 0x0000000B, 0x00004958, 0x000028E3, 0x00000A6A,
0x00000A3A, 0x000500C2, 0x0000000B, 0x00002E1B, 0x00004958, 0x00000A16,
0x00050080, 0x0000000B, 0x0000367B, 0x000053F5, 0x00002E1B, 0x00060041,
0x00000294, 0x0000571A, 0x0000107A, 0x00000A0B, 0x0000367B, 0x0004003D,
0x00000017, 0x000019B2, 0x0000571A, 0x000300F7, 0x00003A1A, 0x00000000,
0x000400FA, 0x00005686, 0x00002958, 0x00003A1A, 0x000200F8, 0x00002958,
0x000500C7, 0x00000017, 0x00004760, 0x000019B2, 0x000009CE, 0x000500C4,
0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017,
0x000050AD, 0x000019B2, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E,
0x000050AD, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2,
0x0000448E, 0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5,
0x00000017, 0x00002AAC, 0x000019B2, 0x000030F9, 0x00003FF9, 0x00002958,
0x000300F7, 0x000030FA, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39,
0x000030FA, 0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18,
0x00002AAC, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC,
0x000002ED, 0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8,
0x000200F9, 0x000030FA, 0x000200F8, 0x000030FA, 0x000700F5, 0x00000017,
0x00002F4B, 0x00002AAC, 0x00003A1A, 0x000029E9, 0x00002B39, 0x0004007C,
0x0000001A, 0x00003C10, 0x00002F4B, 0x000500C4, 0x0000001A, 0x0000420F,
0x00003C10, 0x00000302, 0x000500C3, 0x0000001A, 0x00004099, 0x0000420F,
0x00000302, 0x0004006F, 0x0000001D, 0x00002A98, 0x00004099, 0x0005008E,
0x0000001D, 0x00004FBE, 0x00002A98, 0x00000A38, 0x0007000C, 0x0000001D,
0x00005DB6, 0x00000001, 0x00000028, 0x00000504, 0x00004FBE, 0x000500C3,
0x0000001A, 0x00003803, 0x00003C10, 0x00000302, 0x0004006F, 0x0000001D,
0x000019D0, 0x00003803, 0x0005008E, 0x0000001D, 0x00004748, 0x000019D0,
0x00000A38, 0x0007000C, 0x0000001D, 0x00005E07, 0x00000001, 0x00000028,
0x00000504, 0x00004748, 0x00050051, 0x0000000D, 0x00005F0B, 0x00005DB6,
0x00000000, 0x00050051, 0x0000000D, 0x000037F0, 0x00005E07, 0x00000000,
0x00050050, 0x00000013, 0x00004B23, 0x00005F0B, 0x000037F0, 0x0006000C,
0x0000000B, 0x00002174, 0x00000001, 0x0000003A, 0x00004B23, 0x00050051,
0x0000000D, 0x00005BC2, 0x00005DB6, 0x00000001, 0x00050051, 0x0000000D,
0x000039AA, 0x00005E07, 0x00000001, 0x00050050, 0x00000013, 0x00004B24,
0x00005BC2, 0x000039AA, 0x0006000C, 0x0000000B, 0x00002175, 0x00000001,
0x0000003A, 0x00004B24, 0x00050051, 0x0000000D, 0x00005BC3, 0x00005DB6,
0x00000002, 0x00050051, 0x0000000D, 0x000039AB, 0x00005E07, 0x00000002,
0x00050050, 0x00000013, 0x00004B25, 0x00005BC3, 0x000039AB, 0x0006000C,
0x0000000B, 0x00002176, 0x00000001, 0x0000003A, 0x00004B25, 0x00050051,
0x0000000D, 0x00005BC4, 0x00005DB6, 0x00000003, 0x00050051, 0x0000000D,
0x000039AC, 0x00005E07, 0x00000003, 0x00050050, 0x00000013, 0x00004B0E,
0x00005BC4, 0x000039AC, 0x0006000C, 0x0000000B, 0x000020EF, 0x00000001,
0x0000003A, 0x00004B0E, 0x00070050, 0x00000017, 0x00003ABC, 0x00002174,
0x00002175, 0x00002176, 0x000020EF, 0x00060041, 0x00000294, 0x00004EBE,
0x0000140E, 0x00000A0B, 0x00003AC4, 0x0003003E, 0x00004EBE, 0x00003ABC,
0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,
};

View File

@ -0,0 +1,771 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 10
; Bound: 25179
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %5663 "main" %gl_GlobalInvocationID
OpExecutionMode %5663 LocalSize 4 32 1
OpMemberDecorate %_struct_1161 0 Offset 0
OpMemberDecorate %_struct_1161 1 Offset 4
OpMemberDecorate %_struct_1161 2 Offset 8
OpMemberDecorate %_struct_1161 3 Offset 12
OpMemberDecorate %_struct_1161 4 Offset 16
OpMemberDecorate %_struct_1161 5 Offset 28
OpMemberDecorate %_struct_1161 6 Offset 32
OpMemberDecorate %_struct_1161 7 Offset 36
OpDecorate %_struct_1161 Block
OpDecorate %5245 DescriptorSet 2
OpDecorate %5245 Binding 0
OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
OpDecorate %_runtimearr_v4uint ArrayStride 16
OpMemberDecorate %_struct_1972 0 NonReadable
OpMemberDecorate %_struct_1972 0 Offset 0
OpDecorate %_struct_1972 BufferBlock
OpDecorate %5134 DescriptorSet 0
OpDecorate %5134 Binding 0
OpDecorate %_runtimearr_v4uint_0 ArrayStride 16
OpMemberDecorate %_struct_1973 0 NonWritable
OpMemberDecorate %_struct_1973 0 Offset 0
OpDecorate %_struct_1973 BufferBlock
OpDecorate %4218 DescriptorSet 1
OpDecorate %4218 Binding 0
OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%v4uint = OpTypeVector %uint 4
%int = OpTypeInt 32 1
%v2int = OpTypeVector %int 2
%v3int = OpTypeVector %int 3
%bool = OpTypeBool
%v3uint = OpTypeVector %uint 3
%v2uint = OpTypeVector %uint 2
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%float_n1 = OpConstant %float -1
%1284 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1
%v4int = OpTypeVector %int 4
%int_16 = OpConstant %int 16
%float_3_05185094en05 = OpConstant %float 3.05185094e-05
%uint_0 = OpConstant %uint 0
%v2float = OpTypeVector %float 2
%uint_1 = OpConstant %uint 1
%uint_2 = OpConstant %uint 2
%uint_3 = OpConstant %uint 3
%uint_16711935 = OpConstant %uint 16711935
%uint_8 = OpConstant %uint 8
%uint_4278255360 = OpConstant %uint 4278255360
%uint_16 = OpConstant %uint 16
%int_5 = OpConstant %int 5
%uint_5 = OpConstant %uint 5
%int_7 = OpConstant %int 7
%int_14 = OpConstant %int 14
%int_2 = OpConstant %int 2
%int_n16 = OpConstant %int -16
%int_1 = OpConstant %int 1
%int_15 = OpConstant %int 15
%int_4 = OpConstant %int 4
%int_n512 = OpConstant %int -512
%int_3 = OpConstant %int 3
%int_448 = OpConstant %int 448
%int_8 = OpConstant %int 8
%int_6 = OpConstant %int 6
%int_63 = OpConstant %int 63
%uint_4 = OpConstant %uint 4
%uint_6 = OpConstant %uint 6
%int_268435455 = OpConstant %int 268435455
%int_n2 = OpConstant %int -2
%uint_32 = OpConstant %uint 32
%_struct_1161 = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint
%_ptr_Uniform__struct_1161 = OpTypePointer Uniform %_struct_1161
%5245 = OpVariable %_ptr_Uniform__struct_1161 Uniform
%int_0 = OpConstant %int 0
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%1915 = OpConstantComposite %v2uint %uint_4 %uint_6
%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
%2603 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0
%v2bool = OpTypeVector %bool 2
%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint
%_struct_1972 = OpTypeStruct %_runtimearr_v4uint
%_ptr_Uniform__struct_1972 = OpTypePointer Uniform %_struct_1972
%5134 = OpVariable %_ptr_Uniform__struct_1972 Uniform
%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint
%_struct_1973 = OpTypeStruct %_runtimearr_v4uint_0
%_ptr_Uniform__struct_1973 = OpTypePointer Uniform %_struct_1973
%4218 = OpVariable %_ptr_Uniform__struct_1973 Uniform
%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1
%1870 = OpConstantComposite %v2uint %uint_3 %uint_3
%uint_9 = OpConstant %uint 9
%2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935
%317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8
%1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360
%749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16
%770 = OpConstantComposite %v4int %int_16 %int_16 %int_16 %int_16
%5663 = OpFunction %void None %1282
%15110 = OpLabel
OpSelectionMerge %19578 None
OpSwitch %uint_0 %15137
%15137 = OpLabel
%12591 = OpLoad %v3uint %gl_GlobalInvocationID
%10229 = OpShiftLeftLogical %v3uint %12591 %2603
%25178 = OpAccessChain %_ptr_Uniform_v3uint %5245 %int_4
%22965 = OpLoad %v3uint %25178
%18835 = OpVectorShuffle %v2uint %10229 %10229 0 1
%6626 = OpVectorShuffle %v2uint %22965 %22965 0 1
%17032 = OpUGreaterThanEqual %v2bool %18835 %6626
%24679 = OpAny %bool %17032
OpSelectionMerge %6282 DontFlatten
OpBranchConditional %24679 %21992 %6282
%21992 = OpLabel
OpBranch %19578
%6282 = OpLabel
%6795 = OpBitcast %v3int %10229
%18792 = OpAccessChain %_ptr_Uniform_uint %5245 %int_6
%9788 = OpLoad %uint %18792
%20376 = OpCompositeExtract %uint %22965 1
%14692 = OpCompositeExtract %int %6795 0
%22810 = OpIMul %int %14692 %int_4
%6362 = OpCompositeExtract %int %6795 2
%14505 = OpBitcast %int %20376
%11279 = OpIMul %int %6362 %14505
%17598 = OpCompositeExtract %int %6795 1
%22228 = OpIAdd %int %11279 %17598
%22405 = OpBitcast %int %9788
%24535 = OpIMul %int %22228 %22405
%7061 = OpIAdd %int %22810 %24535
%19270 = OpBitcast %uint %7061
%19460 = OpAccessChain %_ptr_Uniform_uint %5245 %int_5
%22875 = OpLoad %uint %19460
%8517 = OpIAdd %uint %19270 %22875
%21670 = OpShiftRightLogical %uint %8517 %uint_4
%18404 = OpAccessChain %_ptr_Uniform_uint %5245 %int_1
%23432 = OpLoad %uint %18404
%22700 = OpAccessChain %_ptr_Uniform_uint %5245 %int_0
%20387 = OpLoad %uint %22700
%22279 = OpBitwiseAnd %uint %20387 %uint_2
%19223 = OpINotEqual %bool %22279 %uint_0
%17247 = OpCompositeConstruct %v2uint %20387 %20387
%22947 = OpShiftRightLogical %v2uint %17247 %1915
%6551 = OpBitwiseAnd %v2uint %22947 %1870
%18732 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%24236 = OpLoad %uint %18732
%20458 = OpAccessChain %_ptr_Uniform_uint %5245 %int_3
%22167 = OpLoad %uint %20458
%18929 = OpCompositeExtract %uint %10229 0
%6638 = OpShiftRightLogical %uint %18929 %uint_2
%9988 = OpCompositeExtract %uint %10229 1
%23563 = OpCompositeConstruct %v2uint %6638 %9988
%8041 = OpUDiv %v2uint %23563 %6551
%13932 = OpCompositeExtract %uint %8041 0
%19789 = OpShiftLeftLogical %uint %13932 %uint_2
%20905 = OpCompositeExtract %uint %8041 1
%23022 = OpCompositeExtract %uint %10229 2
%9417 = OpCompositeConstruct %v3uint %19789 %20905 %23022
OpSelectionMerge %21313 DontFlatten
OpBranchConditional %19223 %21373 %11737
%21373 = OpLabel
%10608 = OpBitcast %v3int %9417
%17090 = OpCompositeExtract %int %10608 1
%9469 = OpShiftRightArithmetic %int %17090 %int_4
%10055 = OpCompositeExtract %int %10608 2
%16476 = OpShiftRightArithmetic %int %10055 %int_2
%23373 = OpShiftRightLogical %uint %22167 %uint_4
%6314 = OpBitcast %int %23373
%21281 = OpIMul %int %16476 %6314
%15143 = OpIAdd %int %9469 %21281
%9032 = OpShiftRightLogical %uint %24236 %uint_5
%12427 = OpBitcast %int %9032
%10360 = OpIMul %int %15143 %12427
%25154 = OpCompositeExtract %int %10608 0
%20423 = OpShiftRightArithmetic %int %25154 %int_5
%18940 = OpIAdd %int %20423 %10360
%8797 = OpShiftLeftLogical %int %18940 %uint_8
%11510 = OpBitwiseAnd %int %8797 %int_268435455
%18938 = OpShiftLeftLogical %int %11510 %int_1
%19768 = OpBitwiseAnd %int %25154 %int_7
%12600 = OpBitwiseAnd %int %17090 %int_6
%17741 = OpShiftLeftLogical %int %12600 %int_2
%17227 = OpIAdd %int %19768 %17741
%7048 = OpShiftLeftLogical %int %17227 %uint_8
%24035 = OpShiftRightArithmetic %int %7048 %int_6
%8725 = OpShiftRightArithmetic %int %17090 %int_3
%13731 = OpIAdd %int %8725 %16476
%23052 = OpBitwiseAnd %int %13731 %int_1
%16658 = OpShiftRightArithmetic %int %25154 %int_3
%18794 = OpShiftLeftLogical %int %23052 %int_1
%13501 = OpIAdd %int %16658 %18794
%19165 = OpBitwiseAnd %int %13501 %int_3
%21578 = OpShiftLeftLogical %int %19165 %int_1
%15435 = OpIAdd %int %23052 %21578
%13150 = OpBitwiseAnd %int %24035 %int_n16
%20336 = OpIAdd %int %18938 %13150
%23345 = OpShiftLeftLogical %int %20336 %int_1
%23274 = OpBitwiseAnd %int %24035 %int_15
%10332 = OpIAdd %int %23345 %23274
%18356 = OpBitwiseAnd %int %10055 %int_3
%21579 = OpShiftLeftLogical %int %18356 %uint_8
%16727 = OpIAdd %int %10332 %21579
%19166 = OpBitwiseAnd %int %17090 %int_1
%21580 = OpShiftLeftLogical %int %19166 %int_4
%16728 = OpIAdd %int %16727 %21580
%20438 = OpBitwiseAnd %int %15435 %int_1
%9987 = OpShiftLeftLogical %int %20438 %int_3
%13106 = OpShiftRightArithmetic %int %16728 %int_6
%14038 = OpBitwiseAnd %int %13106 %int_7
%13330 = OpIAdd %int %9987 %14038
%23346 = OpShiftLeftLogical %int %13330 %int_3
%23217 = OpBitwiseAnd %int %15435 %int_n2
%10908 = OpIAdd %int %23346 %23217
%23347 = OpShiftLeftLogical %int %10908 %int_2
%23218 = OpBitwiseAnd %int %16728 %int_n512
%10909 = OpIAdd %int %23347 %23218
%23348 = OpShiftLeftLogical %int %10909 %int_3
%21849 = OpBitwiseAnd %int %16728 %int_63
%24314 = OpIAdd %int %23348 %21849
%22127 = OpBitcast %uint %24314
OpBranch %21313
%11737 = OpLabel
%9761 = OpVectorShuffle %v2uint %9417 %9417 0 1
%22991 = OpBitcast %v2int %9761
%6403 = OpCompositeExtract %int %22991 0
%9470 = OpShiftRightArithmetic %int %6403 %int_5
%10056 = OpCompositeExtract %int %22991 1
%16477 = OpShiftRightArithmetic %int %10056 %int_5
%23374 = OpShiftRightLogical %uint %24236 %uint_5
%6315 = OpBitcast %int %23374
%21319 = OpIMul %int %16477 %6315
%16222 = OpIAdd %int %9470 %21319
%19086 = OpShiftLeftLogical %int %16222 %uint_9
%10934 = OpBitwiseAnd %int %6403 %int_7
%12601 = OpBitwiseAnd %int %10056 %int_14
%17742 = OpShiftLeftLogical %int %12601 %int_2
%17303 = OpIAdd %int %10934 %17742
%6375 = OpShiftLeftLogical %int %17303 %uint_2
%10161 = OpBitwiseAnd %int %6375 %int_n16
%12150 = OpShiftLeftLogical %int %10161 %int_1
%15436 = OpIAdd %int %19086 %12150
%13207 = OpBitwiseAnd %int %6375 %int_15
%19760 = OpIAdd %int %15436 %13207
%18357 = OpBitwiseAnd %int %10056 %int_1
%21581 = OpShiftLeftLogical %int %18357 %int_4
%16729 = OpIAdd %int %19760 %21581
%20514 = OpBitwiseAnd %int %16729 %int_n512
%9238 = OpShiftLeftLogical %int %20514 %int_3
%18995 = OpBitwiseAnd %int %10056 %int_16
%12151 = OpShiftLeftLogical %int %18995 %int_7
%16730 = OpIAdd %int %9238 %12151
%19167 = OpBitwiseAnd %int %16729 %int_448
%21582 = OpShiftLeftLogical %int %19167 %int_2
%16708 = OpIAdd %int %16730 %21582
%20611 = OpBitwiseAnd %int %10056 %int_8
%16831 = OpShiftRightArithmetic %int %20611 %int_2
%7916 = OpShiftRightArithmetic %int %6403 %int_3
%13750 = OpIAdd %int %16831 %7916
%21587 = OpBitwiseAnd %int %13750 %int_3
%21583 = OpShiftLeftLogical %int %21587 %int_6
%15437 = OpIAdd %int %16708 %21583
%11782 = OpBitwiseAnd %int %16729 %int_63
%14671 = OpIAdd %int %15437 %11782
%22128 = OpBitcast %uint %14671
OpBranch %21313
%21313 = OpLabel
%9468 = OpPhi %uint %22127 %21373 %22128 %11737
%16296 = OpIMul %v2uint %8041 %6551
%15292 = OpISub %v2uint %23563 %16296
%7303 = OpCompositeExtract %uint %6551 0
%22882 = OpCompositeExtract %uint %6551 1
%13170 = OpIMul %uint %7303 %22882
%15520 = OpIMul %uint %9468 %13170
%16084 = OpCompositeExtract %uint %15292 0
%15890 = OpIMul %uint %16084 %22882
%6886 = OpCompositeExtract %uint %15292 1
%11045 = OpIAdd %uint %15890 %6886
%24733 = OpShiftLeftLogical %uint %11045 %uint_2
%23219 = OpBitwiseAnd %uint %18929 %uint_3
%9559 = OpIAdd %uint %24733 %23219
%16557 = OpShiftLeftLogical %uint %9559 %uint_2
%20138 = OpIAdd %uint %15520 %16557
%17724 = OpIAdd %uint %23432 %20138
%14040 = OpShiftRightLogical %uint %17724 %uint_4
%11766 = OpShiftRightLogical %uint %20387 %uint_2
%8394 = OpBitwiseAnd %uint %11766 %uint_3
%20727 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %14040
%8142 = OpLoad %v4uint %20727
%13760 = OpIEqual %bool %8394 %uint_1
%21366 = OpIEqual %bool %8394 %uint_2
%22150 = OpLogicalOr %bool %13760 %21366
OpSelectionMerge %13411 None
OpBranchConditional %22150 %10583 %13411
%10583 = OpLabel
%18271 = OpBitwiseAnd %v4uint %8142 %2510
%9425 = OpShiftLeftLogical %v4uint %18271 %317
%20652 = OpBitwiseAnd %v4uint %8142 %1838
%17549 = OpShiftRightLogical %v4uint %20652 %317
%16376 = OpBitwiseOr %v4uint %9425 %17549
OpBranch %13411
%13411 = OpLabel
%22649 = OpPhi %v4uint %8142 %21313 %16376 %10583
%19638 = OpIEqual %bool %8394 %uint_3
%15139 = OpLogicalOr %bool %21366 %19638
OpSelectionMerge %12537 None
OpBranchConditional %15139 %11064 %12537
%11064 = OpLabel
%24087 = OpShiftLeftLogical %v4uint %22649 %749
%15335 = OpShiftRightLogical %v4uint %22649 %749
%10728 = OpBitwiseOr %v4uint %24087 %15335
OpBranch %12537
%12537 = OpLabel
%12106 = OpPhi %v4uint %22649 %13411 %10728 %11064
%15375 = OpBitcast %v4int %12106
%16910 = OpShiftLeftLogical %v4int %15375 %770
%16536 = OpShiftRightArithmetic %v4int %16910 %770
%10903 = OpConvertSToF %v4float %16536
%20413 = OpVectorTimesScalar %v4float %10903 %float_3_05185094en05
%23989 = OpExtInst %v4float %1 FMax %1284 %20413
%14338 = OpShiftRightArithmetic %v4int %15375 %770
%6607 = OpConvertSToF %v4float %14338
%18247 = OpVectorTimesScalar %v4float %6607 %float_3_05185094en05
%24070 = OpExtInst %v4float %1 FMax %1284 %18247
%24330 = OpCompositeExtract %float %23989 0
%14319 = OpCompositeExtract %float %24070 0
%19232 = OpCompositeConstruct %v2float %24330 %14319
%8561 = OpExtInst %uint %1 PackHalf2x16 %19232
%23487 = OpCompositeExtract %float %23989 1
%14759 = OpCompositeExtract %float %24070 1
%19233 = OpCompositeConstruct %v2float %23487 %14759
%8562 = OpExtInst %uint %1 PackHalf2x16 %19233
%23488 = OpCompositeExtract %float %23989 2
%14760 = OpCompositeExtract %float %24070 2
%19234 = OpCompositeConstruct %v2float %23488 %14760
%8563 = OpExtInst %uint %1 PackHalf2x16 %19234
%23489 = OpCompositeExtract %float %23989 3
%14761 = OpCompositeExtract %float %24070 3
%19213 = OpCompositeConstruct %v2float %23489 %14761
%8430 = OpExtInst %uint %1 PackHalf2x16 %19213
%15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430
%17859 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %21670
OpStore %17859 %15035
%15532 = OpIAdd %uint %21670 %int_1
%6417 = OpUGreaterThan %bool %7303 %uint_1
OpSelectionMerge %24764 DontFlatten
OpBranchConditional %6417 %20612 %20628
%20612 = OpLabel
%13975 = OpUDiv %uint %6638 %7303
%9086 = OpIMul %uint %13975 %7303
%12657 = OpISub %uint %6638 %9086
%9511 = OpIAdd %uint %12657 %uint_1
%13375 = OpIEqual %bool %9511 %7303
OpSelectionMerge %7917 None
OpBranchConditional %13375 %22174 %8593
%22174 = OpLabel
%19289 = OpIMul %uint %uint_32 %7303
%21519 = OpShiftLeftLogical %uint %12657 %uint_4
%18756 = OpISub %uint %19289 %21519
OpBranch %7917
%8593 = OpLabel
OpBranch %7917
%7917 = OpLabel
%10540 = OpPhi %uint %18756 %22174 %uint_16 %8593
OpBranch %24764
%20628 = OpLabel
OpBranch %24764
%24764 = OpLabel
%10684 = OpPhi %uint %10540 %7917 %uint_32 %20628
%18731 = OpIMul %uint %10684 %22882
%16493 = OpShiftRightLogical %uint %18731 %uint_4
%13163 = OpIAdd %uint %14040 %16493
%22298 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %13163
%6578 = OpLoad %v4uint %22298
OpSelectionMerge %14874 None
OpBranchConditional %22150 %10584 %14874
%10584 = OpLabel
%18272 = OpBitwiseAnd %v4uint %6578 %2510
%9426 = OpShiftLeftLogical %v4uint %18272 %317
%20653 = OpBitwiseAnd %v4uint %6578 %1838
%17550 = OpShiftRightLogical %v4uint %20653 %317
%16377 = OpBitwiseOr %v4uint %9426 %17550
OpBranch %14874
%14874 = OpLabel
%10924 = OpPhi %v4uint %6578 %24764 %16377 %10584
OpSelectionMerge %12538 None
OpBranchConditional %15139 %11065 %12538
%11065 = OpLabel
%24088 = OpShiftLeftLogical %v4uint %10924 %749
%15336 = OpShiftRightLogical %v4uint %10924 %749
%10729 = OpBitwiseOr %v4uint %24088 %15336
OpBranch %12538
%12538 = OpLabel
%12107 = OpPhi %v4uint %10924 %14874 %10729 %11065
%15376 = OpBitcast %v4int %12107
%16911 = OpShiftLeftLogical %v4int %15376 %770
%16537 = OpShiftRightArithmetic %v4int %16911 %770
%10904 = OpConvertSToF %v4float %16537
%20414 = OpVectorTimesScalar %v4float %10904 %float_3_05185094en05
%23990 = OpExtInst %v4float %1 FMax %1284 %20414
%14339 = OpShiftRightArithmetic %v4int %15376 %770
%6608 = OpConvertSToF %v4float %14339
%18248 = OpVectorTimesScalar %v4float %6608 %float_3_05185094en05
%24071 = OpExtInst %v4float %1 FMax %1284 %18248
%24331 = OpCompositeExtract %float %23990 0
%14320 = OpCompositeExtract %float %24071 0
%19235 = OpCompositeConstruct %v2float %24331 %14320
%8564 = OpExtInst %uint %1 PackHalf2x16 %19235
%23490 = OpCompositeExtract %float %23990 1
%14762 = OpCompositeExtract %float %24071 1
%19236 = OpCompositeConstruct %v2float %23490 %14762
%8565 = OpExtInst %uint %1 PackHalf2x16 %19236
%23491 = OpCompositeExtract %float %23990 2
%14763 = OpCompositeExtract %float %24071 2
%19237 = OpCompositeConstruct %v2float %23491 %14763
%8566 = OpExtInst %uint %1 PackHalf2x16 %19237
%23492 = OpCompositeExtract %float %23990 3
%14764 = OpCompositeExtract %float %24071 3
%19214 = OpCompositeConstruct %v2float %23492 %14764
%8431 = OpExtInst %uint %1 PackHalf2x16 %19214
%15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431
%20158 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %15532
OpStore %20158 %15036
OpBranch %19578
%19578 = OpLabel
OpReturn
OpFunctionEnd
#endif
const uint32_t texture_load_rg16_snorm_float_scaled_cs[] = {
0x07230203, 0x00010000, 0x0008000A, 0x0000625B, 0x00000000, 0x00020011,
0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,
0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,
0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00050048, 0x00000489,
0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001,
0x00000023, 0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023,
0x00000008, 0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C,
0x00050048, 0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048,
0x00000489, 0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489,
0x00000006, 0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007,
0x00000023, 0x00000024, 0x00030047, 0x00000489, 0x00000002, 0x00040047,
0x0000147D, 0x00000022, 0x00000002, 0x00040047, 0x0000147D, 0x00000021,
0x00000000, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,
0x000007DC, 0x00000006, 0x00000010, 0x00040048, 0x000007B4, 0x00000000,
0x00000019, 0x00050048, 0x000007B4, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B4, 0x00000003, 0x00040047, 0x0000140E, 0x00000022,
0x00000000, 0x00040047, 0x0000140E, 0x00000021, 0x00000000, 0x00040047,
0x000007DD, 0x00000006, 0x00000010, 0x00040048, 0x000007B5, 0x00000000,
0x00000018, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B5, 0x00000003, 0x00040047, 0x0000107A, 0x00000022,
0x00000001, 0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047,
0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,
0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,
0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,
0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,
0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,
0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00040017, 0x00000011,
0x0000000B, 0x00000002, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,
0x0000001D, 0x0000000D, 0x00000004, 0x0004002B, 0x0000000D, 0x00000341,
0xBF800000, 0x0007002C, 0x0000001D, 0x00000504, 0x00000341, 0x00000341,
0x00000341, 0x00000341, 0x00040017, 0x0000001A, 0x0000000C, 0x00000004,
0x0004002B, 0x0000000C, 0x00000A3B, 0x00000010, 0x0004002B, 0x0000000D,
0x00000A38, 0x38000100, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,
0x00040017, 0x00000013, 0x0000000D, 0x00000002, 0x0004002B, 0x0000000B,
0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002,
0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B,
0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,
0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B,
0x00000A3A, 0x00000010, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005,
0x0004002B, 0x0000000B, 0x00000A19, 0x00000005, 0x0004002B, 0x0000000C,
0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A35, 0x0000000E,
0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000C,
0x000009DB, 0xFFFFFFF0, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001,
0x0004002B, 0x0000000C, 0x00000A39, 0x0000000F, 0x0004002B, 0x0000000C,
0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x0000040B, 0xFFFFFE00,
0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C,
0x00000388, 0x000001C0, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008,
0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C,
0x00000AC8, 0x0000003F, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004,
0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006, 0x0004002B, 0x0000000C,
0x0000078B, 0x0FFFFFFF, 0x0004002B, 0x0000000C, 0x00000A05, 0xFFFFFFFE,
0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x000A001E, 0x00000489,
0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00000014, 0x0000000B,
0x0000000B, 0x0000000B, 0x00040020, 0x00000706, 0x00000002, 0x00000489,
0x0004003B, 0x00000706, 0x0000147D, 0x00000002, 0x0004002B, 0x0000000C,
0x00000A0B, 0x00000000, 0x00040020, 0x00000288, 0x00000002, 0x0000000B,
0x0005002C, 0x00000011, 0x0000077B, 0x00000A16, 0x00000A1C, 0x00040020,
0x00000291, 0x00000002, 0x00000014, 0x00040020, 0x00000292, 0x00000001,
0x00000014, 0x0004003B, 0x00000292, 0x00000F48, 0x00000001, 0x0006002C,
0x00000014, 0x00000A2B, 0x00000A13, 0x00000A0A, 0x00000A0A, 0x00040017,
0x0000000F, 0x00000009, 0x00000002, 0x0003001D, 0x000007DC, 0x00000017,
0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A31, 0x00000002,
0x000007B4, 0x0004003B, 0x00000A31, 0x0000140E, 0x00000002, 0x0003001D,
0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020,
0x00000A32, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A32, 0x0000107A,
0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0006002C,
0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0005002C,
0x00000011, 0x0000074E, 0x00000A13, 0x00000A13, 0x0004002B, 0x0000000B,
0x00000A25, 0x00000009, 0x0007002C, 0x00000017, 0x000009CE, 0x000008A6,
0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C, 0x00000017, 0x0000013D,
0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C, 0x00000017,
0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C,
0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A,
0x0007002C, 0x0000001A, 0x00000302, 0x00000A3B, 0x00000A3B, 0x00000A3B,
0x00000A3B, 0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502,
0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB,
0x00000A0A, 0x00003B21, 0x000200F8, 0x00003B21, 0x0004003D, 0x00000014,
0x0000312F, 0x00000F48, 0x000500C4, 0x00000014, 0x000027F5, 0x0000312F,
0x00000A2B, 0x00050041, 0x00000291, 0x0000625A, 0x0000147D, 0x00000A17,
0x0004003D, 0x00000014, 0x000059B5, 0x0000625A, 0x0007004F, 0x00000011,
0x00004993, 0x000027F5, 0x000027F5, 0x00000000, 0x00000001, 0x0007004F,
0x00000011, 0x000019E2, 0x000059B5, 0x000059B5, 0x00000000, 0x00000001,
0x000500AE, 0x0000000F, 0x00004288, 0x00004993, 0x000019E2, 0x0004009A,
0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x0000188A, 0x00000002,
0x000400FA, 0x00006067, 0x000055E8, 0x0000188A, 0x000200F8, 0x000055E8,
0x000200F9, 0x00004C7A, 0x000200F8, 0x0000188A, 0x0004007C, 0x00000016,
0x00001A8B, 0x000027F5, 0x00050041, 0x00000288, 0x00004968, 0x0000147D,
0x00000A1D, 0x0004003D, 0x0000000B, 0x0000263C, 0x00004968, 0x00050051,
0x0000000B, 0x00004F98, 0x000059B5, 0x00000001, 0x00050051, 0x0000000C,
0x00003964, 0x00001A8B, 0x00000000, 0x00050084, 0x0000000C, 0x0000591A,
0x00003964, 0x00000A17, 0x00050051, 0x0000000C, 0x000018DA, 0x00001A8B,
0x00000002, 0x0004007C, 0x0000000C, 0x000038A9, 0x00004F98, 0x00050084,
0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051, 0x0000000C,
0x000044BE, 0x00001A8B, 0x00000001, 0x00050080, 0x0000000C, 0x000056D4,
0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C, 0x00005785, 0x0000263C,
0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785, 0x00050080,
0x0000000C, 0x00001B95, 0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B,
0x00004B46, 0x00001B95, 0x00050041, 0x00000288, 0x00004C04, 0x0000147D,
0x00000A1A, 0x0004003D, 0x0000000B, 0x0000595B, 0x00004C04, 0x00050080,
0x0000000B, 0x00002145, 0x00004B46, 0x0000595B, 0x000500C2, 0x0000000B,
0x000054A6, 0x00002145, 0x00000A16, 0x00050041, 0x00000288, 0x000047E4,
0x0000147D, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005B88, 0x000047E4,
0x00050041, 0x00000288, 0x000058AC, 0x0000147D, 0x00000A0B, 0x0004003D,
0x0000000B, 0x00004FA3, 0x000058AC, 0x000500C7, 0x0000000B, 0x00005707,
0x00004FA3, 0x00000A10, 0x000500AB, 0x00000009, 0x00004B17, 0x00005707,
0x00000A0A, 0x00050050, 0x00000011, 0x0000435F, 0x00004FA3, 0x00004FA3,
0x000500C2, 0x00000011, 0x000059A3, 0x0000435F, 0x0000077B, 0x000500C7,
0x00000011, 0x00001997, 0x000059A3, 0x0000074E, 0x00050041, 0x00000288,
0x0000492C, 0x0000147D, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005EAC,
0x0000492C, 0x00050041, 0x00000288, 0x00004FEA, 0x0000147D, 0x00000A14,
0x0004003D, 0x0000000B, 0x00005697, 0x00004FEA, 0x00050051, 0x0000000B,
0x000049F1, 0x000027F5, 0x00000000, 0x000500C2, 0x0000000B, 0x000019EE,
0x000049F1, 0x00000A10, 0x00050051, 0x0000000B, 0x00002704, 0x000027F5,
0x00000001, 0x00050050, 0x00000011, 0x00005C0B, 0x000019EE, 0x00002704,
0x00050086, 0x00000011, 0x00001F69, 0x00005C0B, 0x00001997, 0x00050051,
0x0000000B, 0x0000366C, 0x00001F69, 0x00000000, 0x000500C4, 0x0000000B,
0x00004D4D, 0x0000366C, 0x00000A10, 0x00050051, 0x0000000B, 0x000051A9,
0x00001F69, 0x00000001, 0x00050051, 0x0000000B, 0x000059EE, 0x000027F5,
0x00000002, 0x00060050, 0x00000014, 0x000024C9, 0x00004D4D, 0x000051A9,
0x000059EE, 0x000300F7, 0x00005341, 0x00000002, 0x000400FA, 0x00004B17,
0x0000537D, 0x00002DD9, 0x000200F8, 0x0000537D, 0x0004007C, 0x00000016,
0x00002970, 0x000024C9, 0x00050051, 0x0000000C, 0x000042C2, 0x00002970,
0x00000001, 0x000500C3, 0x0000000C, 0x000024FD, 0x000042C2, 0x00000A17,
0x00050051, 0x0000000C, 0x00002747, 0x00002970, 0x00000002, 0x000500C3,
0x0000000C, 0x0000405C, 0x00002747, 0x00000A11, 0x000500C2, 0x0000000B,
0x00005B4D, 0x00005697, 0x00000A16, 0x0004007C, 0x0000000C, 0x000018AA,
0x00005B4D, 0x00050084, 0x0000000C, 0x00005321, 0x0000405C, 0x000018AA,
0x00050080, 0x0000000C, 0x00003B27, 0x000024FD, 0x00005321, 0x000500C2,
0x0000000B, 0x00002348, 0x00005EAC, 0x00000A19, 0x0004007C, 0x0000000C,
0x0000308B, 0x00002348, 0x00050084, 0x0000000C, 0x00002878, 0x00003B27,
0x0000308B, 0x00050051, 0x0000000C, 0x00006242, 0x00002970, 0x00000000,
0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A, 0x00050080,
0x0000000C, 0x000049FC, 0x00004FC7, 0x00002878, 0x000500C4, 0x0000000C,
0x0000225D, 0x000049FC, 0x00000A22, 0x000500C7, 0x0000000C, 0x00002CF6,
0x0000225D, 0x0000078B, 0x000500C4, 0x0000000C, 0x000049FA, 0x00002CF6,
0x00000A0E, 0x000500C7, 0x0000000C, 0x00004D38, 0x00006242, 0x00000A20,
0x000500C7, 0x0000000C, 0x00003138, 0x000042C2, 0x00000A1D, 0x000500C4,
0x0000000C, 0x0000454D, 0x00003138, 0x00000A11, 0x00050080, 0x0000000C,
0x0000434B, 0x00004D38, 0x0000454D, 0x000500C4, 0x0000000C, 0x00001B88,
0x0000434B, 0x00000A22, 0x000500C3, 0x0000000C, 0x00005DE3, 0x00001B88,
0x00000A1D, 0x000500C3, 0x0000000C, 0x00002215, 0x000042C2, 0x00000A14,
0x00050080, 0x0000000C, 0x000035A3, 0x00002215, 0x0000405C, 0x000500C7,
0x0000000C, 0x00005A0C, 0x000035A3, 0x00000A0E, 0x000500C3, 0x0000000C,
0x00004112, 0x00006242, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000496A,
0x00005A0C, 0x00000A0E, 0x00050080, 0x0000000C, 0x000034BD, 0x00004112,
0x0000496A, 0x000500C7, 0x0000000C, 0x00004ADD, 0x000034BD, 0x00000A14,
0x000500C4, 0x0000000C, 0x0000544A, 0x00004ADD, 0x00000A0E, 0x00050080,
0x0000000C, 0x00003C4B, 0x00005A0C, 0x0000544A, 0x000500C7, 0x0000000C,
0x0000335E, 0x00005DE3, 0x000009DB, 0x00050080, 0x0000000C, 0x00004F70,
0x000049FA, 0x0000335E, 0x000500C4, 0x0000000C, 0x00005B31, 0x00004F70,
0x00000A0E, 0x000500C7, 0x0000000C, 0x00005AEA, 0x00005DE3, 0x00000A39,
0x00050080, 0x0000000C, 0x0000285C, 0x00005B31, 0x00005AEA, 0x000500C7,
0x0000000C, 0x000047B4, 0x00002747, 0x00000A14, 0x000500C4, 0x0000000C,
0x0000544B, 0x000047B4, 0x00000A22, 0x00050080, 0x0000000C, 0x00004157,
0x0000285C, 0x0000544B, 0x000500C7, 0x0000000C, 0x00004ADE, 0x000042C2,
0x00000A0E, 0x000500C4, 0x0000000C, 0x0000544C, 0x00004ADE, 0x00000A17,
0x00050080, 0x0000000C, 0x00004158, 0x00004157, 0x0000544C, 0x000500C7,
0x0000000C, 0x00004FD6, 0x00003C4B, 0x00000A0E, 0x000500C4, 0x0000000C,
0x00002703, 0x00004FD6, 0x00000A14, 0x000500C3, 0x0000000C, 0x00003332,
0x00004158, 0x00000A1D, 0x000500C7, 0x0000000C, 0x000036D6, 0x00003332,
0x00000A20, 0x00050080, 0x0000000C, 0x00003412, 0x00002703, 0x000036D6,
0x000500C4, 0x0000000C, 0x00005B32, 0x00003412, 0x00000A14, 0x000500C7,
0x0000000C, 0x00005AB1, 0x00003C4B, 0x00000A05, 0x00050080, 0x0000000C,
0x00002A9C, 0x00005B32, 0x00005AB1, 0x000500C4, 0x0000000C, 0x00005B33,
0x00002A9C, 0x00000A11, 0x000500C7, 0x0000000C, 0x00005AB2, 0x00004158,
0x0000040B, 0x00050080, 0x0000000C, 0x00002A9D, 0x00005B33, 0x00005AB2,
0x000500C4, 0x0000000C, 0x00005B34, 0x00002A9D, 0x00000A14, 0x000500C7,
0x0000000C, 0x00005559, 0x00004158, 0x00000AC8, 0x00050080, 0x0000000C,
0x00005EFA, 0x00005B34, 0x00005559, 0x0004007C, 0x0000000B, 0x0000566F,
0x00005EFA, 0x000200F9, 0x00005341, 0x000200F8, 0x00002DD9, 0x0007004F,
0x00000011, 0x00002621, 0x000024C9, 0x000024C9, 0x00000000, 0x00000001,
0x0004007C, 0x00000012, 0x000059CF, 0x00002621, 0x00050051, 0x0000000C,
0x00001903, 0x000059CF, 0x00000000, 0x000500C3, 0x0000000C, 0x000024FE,
0x00001903, 0x00000A1A, 0x00050051, 0x0000000C, 0x00002748, 0x000059CF,
0x00000001, 0x000500C3, 0x0000000C, 0x0000405D, 0x00002748, 0x00000A1A,
0x000500C2, 0x0000000B, 0x00005B4E, 0x00005EAC, 0x00000A19, 0x0004007C,
0x0000000C, 0x000018AB, 0x00005B4E, 0x00050084, 0x0000000C, 0x00005347,
0x0000405D, 0x000018AB, 0x00050080, 0x0000000C, 0x00003F5E, 0x000024FE,
0x00005347, 0x000500C4, 0x0000000C, 0x00004A8E, 0x00003F5E, 0x00000A25,
0x000500C7, 0x0000000C, 0x00002AB6, 0x00001903, 0x00000A20, 0x000500C7,
0x0000000C, 0x00003139, 0x00002748, 0x00000A35, 0x000500C4, 0x0000000C,
0x0000454E, 0x00003139, 0x00000A11, 0x00050080, 0x0000000C, 0x00004397,
0x00002AB6, 0x0000454E, 0x000500C4, 0x0000000C, 0x000018E7, 0x00004397,
0x00000A10, 0x000500C7, 0x0000000C, 0x000027B1, 0x000018E7, 0x000009DB,
0x000500C4, 0x0000000C, 0x00002F76, 0x000027B1, 0x00000A0E, 0x00050080,
0x0000000C, 0x00003C4C, 0x00004A8E, 0x00002F76, 0x000500C7, 0x0000000C,
0x00003397, 0x000018E7, 0x00000A39, 0x00050080, 0x0000000C, 0x00004D30,
0x00003C4C, 0x00003397, 0x000500C7, 0x0000000C, 0x000047B5, 0x00002748,
0x00000A0E, 0x000500C4, 0x0000000C, 0x0000544D, 0x000047B5, 0x00000A17,
0x00050080, 0x0000000C, 0x00004159, 0x00004D30, 0x0000544D, 0x000500C7,
0x0000000C, 0x00005022, 0x00004159, 0x0000040B, 0x000500C4, 0x0000000C,
0x00002416, 0x00005022, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004A33,
0x00002748, 0x00000A3B, 0x000500C4, 0x0000000C, 0x00002F77, 0x00004A33,
0x00000A20, 0x00050080, 0x0000000C, 0x0000415A, 0x00002416, 0x00002F77,
0x000500C7, 0x0000000C, 0x00004ADF, 0x00004159, 0x00000388, 0x000500C4,
0x0000000C, 0x0000544E, 0x00004ADF, 0x00000A11, 0x00050080, 0x0000000C,
0x00004144, 0x0000415A, 0x0000544E, 0x000500C7, 0x0000000C, 0x00005083,
0x00002748, 0x00000A23, 0x000500C3, 0x0000000C, 0x000041BF, 0x00005083,
0x00000A11, 0x000500C3, 0x0000000C, 0x00001EEC, 0x00001903, 0x00000A14,
0x00050080, 0x0000000C, 0x000035B6, 0x000041BF, 0x00001EEC, 0x000500C7,
0x0000000C, 0x00005453, 0x000035B6, 0x00000A14, 0x000500C4, 0x0000000C,
0x0000544F, 0x00005453, 0x00000A1D, 0x00050080, 0x0000000C, 0x00003C4D,
0x00004144, 0x0000544F, 0x000500C7, 0x0000000C, 0x00002E06, 0x00004159,
0x00000AC8, 0x00050080, 0x0000000C, 0x0000394F, 0x00003C4D, 0x00002E06,
0x0004007C, 0x0000000B, 0x00005670, 0x0000394F, 0x000200F9, 0x00005341,
0x000200F8, 0x00005341, 0x000700F5, 0x0000000B, 0x000024FC, 0x0000566F,
0x0000537D, 0x00005670, 0x00002DD9, 0x00050084, 0x00000011, 0x00003FA8,
0x00001F69, 0x00001997, 0x00050082, 0x00000011, 0x00003BBC, 0x00005C0B,
0x00003FA8, 0x00050051, 0x0000000B, 0x00001C87, 0x00001997, 0x00000000,
0x00050051, 0x0000000B, 0x00005962, 0x00001997, 0x00000001, 0x00050084,
0x0000000B, 0x00003372, 0x00001C87, 0x00005962, 0x00050084, 0x0000000B,
0x00003CA0, 0x000024FC, 0x00003372, 0x00050051, 0x0000000B, 0x00003ED4,
0x00003BBC, 0x00000000, 0x00050084, 0x0000000B, 0x00003E12, 0x00003ED4,
0x00005962, 0x00050051, 0x0000000B, 0x00001AE6, 0x00003BBC, 0x00000001,
0x00050080, 0x0000000B, 0x00002B25, 0x00003E12, 0x00001AE6, 0x000500C4,
0x0000000B, 0x0000609D, 0x00002B25, 0x00000A10, 0x000500C7, 0x0000000B,
0x00005AB3, 0x000049F1, 0x00000A13, 0x00050080, 0x0000000B, 0x00002557,
0x0000609D, 0x00005AB3, 0x000500C4, 0x0000000B, 0x000040AD, 0x00002557,
0x00000A10, 0x00050080, 0x0000000B, 0x00004EAA, 0x00003CA0, 0x000040AD,
0x00050080, 0x0000000B, 0x0000453C, 0x00005B88, 0x00004EAA, 0x000500C2,
0x0000000B, 0x000036D8, 0x0000453C, 0x00000A16, 0x000500C2, 0x0000000B,
0x00002DF6, 0x00004FA3, 0x00000A10, 0x000500C7, 0x0000000B, 0x000020CA,
0x00002DF6, 0x00000A13, 0x00060041, 0x00000294, 0x000050F7, 0x0000107A,
0x00000A0B, 0x000036D8, 0x0004003D, 0x00000017, 0x00001FCE, 0x000050F7,
0x000500AA, 0x00000009, 0x000035C0, 0x000020CA, 0x00000A0D, 0x000500AA,
0x00000009, 0x00005376, 0x000020CA, 0x00000A10, 0x000500A6, 0x00000009,
0x00005686, 0x000035C0, 0x00005376, 0x000300F7, 0x00003463, 0x00000000,
0x000400FA, 0x00005686, 0x00002957, 0x00003463, 0x000200F8, 0x00002957,
0x000500C7, 0x00000017, 0x0000475F, 0x00001FCE, 0x000009CE, 0x000500C4,
0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017,
0x000050AC, 0x00001FCE, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D,
0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1,
0x0000448D, 0x000200F9, 0x00003463, 0x000200F8, 0x00003463, 0x000700F5,
0x00000017, 0x00005879, 0x00001FCE, 0x00005341, 0x00003FF8, 0x00002957,
0x000500AA, 0x00000009, 0x00004CB6, 0x000020CA, 0x00000A13, 0x000500A6,
0x00000009, 0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7, 0x000030F9,
0x00000000, 0x000400FA, 0x00003B23, 0x00002B38, 0x000030F9, 0x000200F8,
0x00002B38, 0x000500C4, 0x00000017, 0x00005E17, 0x00005879, 0x000002ED,
0x000500C2, 0x00000017, 0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5,
0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9, 0x000030F9,
0x000200F8, 0x000030F9, 0x000700F5, 0x00000017, 0x00002F4A, 0x00005879,
0x00003463, 0x000029E8, 0x00002B38, 0x0004007C, 0x0000001A, 0x00003C0F,
0x00002F4A, 0x000500C4, 0x0000001A, 0x0000420E, 0x00003C0F, 0x00000302,
0x000500C3, 0x0000001A, 0x00004098, 0x0000420E, 0x00000302, 0x0004006F,
0x0000001D, 0x00002A97, 0x00004098, 0x0005008E, 0x0000001D, 0x00004FBD,
0x00002A97, 0x00000A38, 0x0007000C, 0x0000001D, 0x00005DB5, 0x00000001,
0x00000028, 0x00000504, 0x00004FBD, 0x000500C3, 0x0000001A, 0x00003802,
0x00003C0F, 0x00000302, 0x0004006F, 0x0000001D, 0x000019CF, 0x00003802,
0x0005008E, 0x0000001D, 0x00004747, 0x000019CF, 0x00000A38, 0x0007000C,
0x0000001D, 0x00005E06, 0x00000001, 0x00000028, 0x00000504, 0x00004747,
0x00050051, 0x0000000D, 0x00005F0A, 0x00005DB5, 0x00000000, 0x00050051,
0x0000000D, 0x000037EF, 0x00005E06, 0x00000000, 0x00050050, 0x00000013,
0x00004B20, 0x00005F0A, 0x000037EF, 0x0006000C, 0x0000000B, 0x00002171,
0x00000001, 0x0000003A, 0x00004B20, 0x00050051, 0x0000000D, 0x00005BBF,
0x00005DB5, 0x00000001, 0x00050051, 0x0000000D, 0x000039A7, 0x00005E06,
0x00000001, 0x00050050, 0x00000013, 0x00004B21, 0x00005BBF, 0x000039A7,
0x0006000C, 0x0000000B, 0x00002172, 0x00000001, 0x0000003A, 0x00004B21,
0x00050051, 0x0000000D, 0x00005BC0, 0x00005DB5, 0x00000002, 0x00050051,
0x0000000D, 0x000039A8, 0x00005E06, 0x00000002, 0x00050050, 0x00000013,
0x00004B22, 0x00005BC0, 0x000039A8, 0x0006000C, 0x0000000B, 0x00002173,
0x00000001, 0x0000003A, 0x00004B22, 0x00050051, 0x0000000D, 0x00005BC1,
0x00005DB5, 0x00000003, 0x00050051, 0x0000000D, 0x000039A9, 0x00005E06,
0x00000003, 0x00050050, 0x00000013, 0x00004B0D, 0x00005BC1, 0x000039A9,
0x0006000C, 0x0000000B, 0x000020EE, 0x00000001, 0x0000003A, 0x00004B0D,
0x00070050, 0x00000017, 0x00003ABB, 0x00002171, 0x00002172, 0x00002173,
0x000020EE, 0x00060041, 0x00000294, 0x000045C3, 0x0000140E, 0x00000A0B,
0x000054A6, 0x0003003E, 0x000045C3, 0x00003ABB, 0x00050080, 0x0000000B,
0x00003CAC, 0x000054A6, 0x00000A0E, 0x000500AC, 0x00000009, 0x00001911,
0x00001C87, 0x00000A0D, 0x000300F7, 0x000060BC, 0x00000002, 0x000400FA,
0x00001911, 0x00005084, 0x00005094, 0x000200F8, 0x00005084, 0x00050086,
0x0000000B, 0x00003697, 0x000019EE, 0x00001C87, 0x00050084, 0x0000000B,
0x0000237E, 0x00003697, 0x00001C87, 0x00050082, 0x0000000B, 0x00003171,
0x000019EE, 0x0000237E, 0x00050080, 0x0000000B, 0x00002527, 0x00003171,
0x00000A0D, 0x000500AA, 0x00000009, 0x0000343F, 0x00002527, 0x00001C87,
0x000300F7, 0x00001EED, 0x00000000, 0x000400FA, 0x0000343F, 0x0000569E,
0x00002191, 0x000200F8, 0x0000569E, 0x00050084, 0x0000000B, 0x00004B59,
0x00000A6A, 0x00001C87, 0x000500C4, 0x0000000B, 0x0000540F, 0x00003171,
0x00000A16, 0x00050082, 0x0000000B, 0x00004944, 0x00004B59, 0x0000540F,
0x000200F9, 0x00001EED, 0x000200F8, 0x00002191, 0x000200F9, 0x00001EED,
0x000200F8, 0x00001EED, 0x000700F5, 0x0000000B, 0x0000292C, 0x00004944,
0x0000569E, 0x00000A3A, 0x00002191, 0x000200F9, 0x000060BC, 0x000200F8,
0x00005094, 0x000200F9, 0x000060BC, 0x000200F8, 0x000060BC, 0x000700F5,
0x0000000B, 0x000029BC, 0x0000292C, 0x00001EED, 0x00000A6A, 0x00005094,
0x00050084, 0x0000000B, 0x0000492B, 0x000029BC, 0x00005962, 0x000500C2,
0x0000000B, 0x0000406D, 0x0000492B, 0x00000A16, 0x00050080, 0x0000000B,
0x0000336B, 0x000036D8, 0x0000406D, 0x00060041, 0x00000294, 0x0000571A,
0x0000107A, 0x00000A0B, 0x0000336B, 0x0004003D, 0x00000017, 0x000019B2,
0x0000571A, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA, 0x00005686,
0x00002958, 0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017,
0x00004760, 0x000019B2, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2,
0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x000019B2,
0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D,
0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9,
0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC,
0x000019B2, 0x000060BC, 0x00003FF9, 0x00002958, 0x000300F7, 0x000030FA,
0x00000000, 0x000400FA, 0x00003B23, 0x00002B39, 0x000030FA, 0x000200F8,
0x00002B39, 0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC, 0x000002ED,
0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED, 0x000500C5,
0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9, 0x000030FA,
0x000200F8, 0x000030FA, 0x000700F5, 0x00000017, 0x00002F4B, 0x00002AAC,
0x00003A1A, 0x000029E9, 0x00002B39, 0x0004007C, 0x0000001A, 0x00003C10,
0x00002F4B, 0x000500C4, 0x0000001A, 0x0000420F, 0x00003C10, 0x00000302,
0x000500C3, 0x0000001A, 0x00004099, 0x0000420F, 0x00000302, 0x0004006F,
0x0000001D, 0x00002A98, 0x00004099, 0x0005008E, 0x0000001D, 0x00004FBE,
0x00002A98, 0x00000A38, 0x0007000C, 0x0000001D, 0x00005DB6, 0x00000001,
0x00000028, 0x00000504, 0x00004FBE, 0x000500C3, 0x0000001A, 0x00003803,
0x00003C10, 0x00000302, 0x0004006F, 0x0000001D, 0x000019D0, 0x00003803,
0x0005008E, 0x0000001D, 0x00004748, 0x000019D0, 0x00000A38, 0x0007000C,
0x0000001D, 0x00005E07, 0x00000001, 0x00000028, 0x00000504, 0x00004748,
0x00050051, 0x0000000D, 0x00005F0B, 0x00005DB6, 0x00000000, 0x00050051,
0x0000000D, 0x000037F0, 0x00005E07, 0x00000000, 0x00050050, 0x00000013,
0x00004B23, 0x00005F0B, 0x000037F0, 0x0006000C, 0x0000000B, 0x00002174,
0x00000001, 0x0000003A, 0x00004B23, 0x00050051, 0x0000000D, 0x00005BC2,
0x00005DB6, 0x00000001, 0x00050051, 0x0000000D, 0x000039AA, 0x00005E07,
0x00000001, 0x00050050, 0x00000013, 0x00004B24, 0x00005BC2, 0x000039AA,
0x0006000C, 0x0000000B, 0x00002175, 0x00000001, 0x0000003A, 0x00004B24,
0x00050051, 0x0000000D, 0x00005BC3, 0x00005DB6, 0x00000002, 0x00050051,
0x0000000D, 0x000039AB, 0x00005E07, 0x00000002, 0x00050050, 0x00000013,
0x00004B25, 0x00005BC3, 0x000039AB, 0x0006000C, 0x0000000B, 0x00002176,
0x00000001, 0x0000003A, 0x00004B25, 0x00050051, 0x0000000D, 0x00005BC4,
0x00005DB6, 0x00000003, 0x00050051, 0x0000000D, 0x000039AC, 0x00005E07,
0x00000003, 0x00050050, 0x00000013, 0x00004B0E, 0x00005BC4, 0x000039AC,
0x0006000C, 0x0000000B, 0x000020EF, 0x00000001, 0x0000003A, 0x00004B0E,
0x00070050, 0x00000017, 0x00003ABC, 0x00002174, 0x00002175, 0x00002176,
0x000020EF, 0x00060041, 0x00000294, 0x00004EBE, 0x0000140E, 0x00000A0B,
0x00003CAC, 0x0003003E, 0x00004EBE, 0x00003ABC, 0x000200F9, 0x00004C7A,
0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,
};

View File

@ -0,0 +1,682 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 10
; Bound: 25179
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %5663 "main" %gl_GlobalInvocationID
OpExecutionMode %5663 LocalSize 4 32 1
OpMemberDecorate %_struct_1161 0 Offset 0
OpMemberDecorate %_struct_1161 1 Offset 4
OpMemberDecorate %_struct_1161 2 Offset 8
OpMemberDecorate %_struct_1161 3 Offset 12
OpMemberDecorate %_struct_1161 4 Offset 16
OpMemberDecorate %_struct_1161 5 Offset 28
OpMemberDecorate %_struct_1161 6 Offset 32
OpMemberDecorate %_struct_1161 7 Offset 36
OpDecorate %_struct_1161 Block
OpDecorate %5245 DescriptorSet 2
OpDecorate %5245 Binding 0
OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
OpDecorate %_runtimearr_v4uint ArrayStride 16
OpMemberDecorate %_struct_1972 0 NonReadable
OpMemberDecorate %_struct_1972 0 Offset 0
OpDecorate %_struct_1972 BufferBlock
OpDecorate %5134 DescriptorSet 0
OpDecorate %5134 Binding 0
OpDecorate %_runtimearr_v4uint_0 ArrayStride 16
OpMemberDecorate %_struct_1973 0 NonWritable
OpMemberDecorate %_struct_1973 0 Offset 0
OpDecorate %_struct_1973 BufferBlock
OpDecorate %4218 DescriptorSet 1
OpDecorate %4218 Binding 0
OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%v4uint = OpTypeVector %uint 4
%int = OpTypeInt 32 1
%v2int = OpTypeVector %int 2
%v3int = OpTypeVector %int 3
%bool = OpTypeBool
%v3uint = OpTypeVector %uint 3
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%uint_65535 = OpConstant %uint 65535
%float_1_52590219en05 = OpConstant %float 1.52590219e-05
%uint_16 = OpConstant %uint 16
%uint_0 = OpConstant %uint 0
%v2float = OpTypeVector %float 2
%uint_1 = OpConstant %uint 1
%uint_2 = OpConstant %uint 2
%uint_3 = OpConstant %uint 3
%uint_16711935 = OpConstant %uint 16711935
%uint_8 = OpConstant %uint 8
%uint_4278255360 = OpConstant %uint 4278255360
%int_5 = OpConstant %int 5
%uint_5 = OpConstant %uint 5
%int_7 = OpConstant %int 7
%int_14 = OpConstant %int 14
%int_2 = OpConstant %int 2
%int_n16 = OpConstant %int -16
%int_1 = OpConstant %int 1
%int_15 = OpConstant %int 15
%int_4 = OpConstant %int 4
%int_n512 = OpConstant %int -512
%int_3 = OpConstant %int 3
%int_16 = OpConstant %int 16
%int_448 = OpConstant %int 448
%int_8 = OpConstant %int 8
%int_6 = OpConstant %int 6
%int_63 = OpConstant %int 63
%uint_4 = OpConstant %uint 4
%int_268435455 = OpConstant %int 268435455
%int_n2 = OpConstant %int -2
%uint_32 = OpConstant %uint 32
%_struct_1161 = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint
%_ptr_Uniform__struct_1161 = OpTypePointer Uniform %_struct_1161
%5245 = OpVariable %_ptr_Uniform__struct_1161 Uniform
%int_0 = OpConstant %int 0
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
%v2uint = OpTypeVector %uint 2
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
%2603 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0
%v2bool = OpTypeVector %bool 2
%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint
%_struct_1972 = OpTypeStruct %_runtimearr_v4uint
%_ptr_Uniform__struct_1972 = OpTypePointer Uniform %_struct_1972
%5134 = OpVariable %_ptr_Uniform__struct_1972 Uniform
%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint
%_struct_1973 = OpTypeStruct %_runtimearr_v4uint_0
%_ptr_Uniform__struct_1973 = OpTypePointer Uniform %_struct_1973
%4218 = OpVariable %_ptr_Uniform__struct_1973 Uniform
%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1
%uint_9 = OpConstant %uint 9
%2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935
%317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8
%1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360
%749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16
%850 = OpConstantComposite %v4uint %uint_65535 %uint_65535 %uint_65535 %uint_65535
%5663 = OpFunction %void None %1282
%15110 = OpLabel
OpSelectionMerge %19578 None
OpSwitch %uint_0 %15137
%15137 = OpLabel
%12591 = OpLoad %v3uint %gl_GlobalInvocationID
%10229 = OpShiftLeftLogical %v3uint %12591 %2603
%25178 = OpAccessChain %_ptr_Uniform_v3uint %5245 %int_4
%22965 = OpLoad %v3uint %25178
%18835 = OpVectorShuffle %v2uint %10229 %10229 0 1
%6626 = OpVectorShuffle %v2uint %22965 %22965 0 1
%17032 = OpUGreaterThanEqual %v2bool %18835 %6626
%24679 = OpAny %bool %17032
OpSelectionMerge %6282 DontFlatten
OpBranchConditional %24679 %21992 %6282
%21992 = OpLabel
OpBranch %19578
%6282 = OpLabel
%6795 = OpBitcast %v3int %10229
%18792 = OpAccessChain %_ptr_Uniform_uint %5245 %int_6
%9788 = OpLoad %uint %18792
%20376 = OpCompositeExtract %uint %22965 1
%14692 = OpCompositeExtract %int %6795 0
%22810 = OpIMul %int %14692 %int_4
%6362 = OpCompositeExtract %int %6795 2
%14505 = OpBitcast %int %20376
%11279 = OpIMul %int %6362 %14505
%17598 = OpCompositeExtract %int %6795 1
%22228 = OpIAdd %int %11279 %17598
%22405 = OpBitcast %int %9788
%24535 = OpIMul %int %22228 %22405
%7061 = OpIAdd %int %22810 %24535
%19270 = OpBitcast %uint %7061
%19460 = OpAccessChain %_ptr_Uniform_uint %5245 %int_5
%22875 = OpLoad %uint %19460
%8517 = OpIAdd %uint %19270 %22875
%21670 = OpShiftRightLogical %uint %8517 %uint_4
%20950 = OpAccessChain %_ptr_Uniform_uint %5245 %int_0
%21411 = OpLoad %uint %20950
%6381 = OpBitwiseAnd %uint %21411 %uint_1
%10467 = OpINotEqual %bool %6381 %uint_0
OpSelectionMerge %23266 DontFlatten
OpBranchConditional %10467 %10108 %10765
%10108 = OpLabel
%23508 = OpBitwiseAnd %uint %21411 %uint_2
%16300 = OpINotEqual %bool %23508 %uint_0
OpSelectionMerge %7691 DontFlatten
OpBranchConditional %16300 %12129 %25128
%12129 = OpLabel
%18210 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%15627 = OpLoad %uint %18210
%22624 = OpAccessChain %_ptr_Uniform_uint %5245 %int_3
%21535 = OpLoad %uint %22624
%14923 = OpShiftRightArithmetic %int %17598 %int_4
%18773 = OpShiftRightArithmetic %int %6362 %int_2
%18759 = OpShiftRightLogical %uint %21535 %uint_4
%6314 = OpBitcast %int %18759
%21281 = OpIMul %int %18773 %6314
%15143 = OpIAdd %int %14923 %21281
%9032 = OpShiftRightLogical %uint %15627 %uint_5
%14593 = OpBitcast %int %9032
%8436 = OpIMul %int %15143 %14593
%12986 = OpShiftRightArithmetic %int %14692 %int_5
%24558 = OpIAdd %int %12986 %8436
%8797 = OpShiftLeftLogical %int %24558 %uint_8
%11510 = OpBitwiseAnd %int %8797 %int_268435455
%18938 = OpShiftLeftLogical %int %11510 %int_1
%19768 = OpBitwiseAnd %int %14692 %int_7
%12600 = OpBitwiseAnd %int %17598 %int_6
%17741 = OpShiftLeftLogical %int %12600 %int_2
%17227 = OpIAdd %int %19768 %17741
%7048 = OpShiftLeftLogical %int %17227 %uint_8
%24035 = OpShiftRightArithmetic %int %7048 %int_6
%8725 = OpShiftRightArithmetic %int %17598 %int_3
%13731 = OpIAdd %int %8725 %18773
%23052 = OpBitwiseAnd %int %13731 %int_1
%16658 = OpShiftRightArithmetic %int %14692 %int_3
%18794 = OpShiftLeftLogical %int %23052 %int_1
%13501 = OpIAdd %int %16658 %18794
%19165 = OpBitwiseAnd %int %13501 %int_3
%21578 = OpShiftLeftLogical %int %19165 %int_1
%15435 = OpIAdd %int %23052 %21578
%13150 = OpBitwiseAnd %int %24035 %int_n16
%20336 = OpIAdd %int %18938 %13150
%23345 = OpShiftLeftLogical %int %20336 %int_1
%23274 = OpBitwiseAnd %int %24035 %int_15
%10332 = OpIAdd %int %23345 %23274
%18356 = OpBitwiseAnd %int %6362 %int_3
%21579 = OpShiftLeftLogical %int %18356 %uint_8
%16727 = OpIAdd %int %10332 %21579
%19166 = OpBitwiseAnd %int %17598 %int_1
%21580 = OpShiftLeftLogical %int %19166 %int_4
%16728 = OpIAdd %int %16727 %21580
%20438 = OpBitwiseAnd %int %15435 %int_1
%9987 = OpShiftLeftLogical %int %20438 %int_3
%13106 = OpShiftRightArithmetic %int %16728 %int_6
%14038 = OpBitwiseAnd %int %13106 %int_7
%13330 = OpIAdd %int %9987 %14038
%23346 = OpShiftLeftLogical %int %13330 %int_3
%23217 = OpBitwiseAnd %int %15435 %int_n2
%10908 = OpIAdd %int %23346 %23217
%23347 = OpShiftLeftLogical %int %10908 %int_2
%23218 = OpBitwiseAnd %int %16728 %int_n512
%10909 = OpIAdd %int %23347 %23218
%23348 = OpShiftLeftLogical %int %10909 %int_3
%24224 = OpBitwiseAnd %int %16728 %int_63
%21741 = OpIAdd %int %23348 %24224
OpBranch %7691
%25128 = OpLabel
%6796 = OpBitcast %v2int %18835
%18793 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%11954 = OpLoad %uint %18793
%18756 = OpCompositeExtract %int %6796 0
%19701 = OpShiftRightArithmetic %int %18756 %int_5
%10055 = OpCompositeExtract %int %6796 1
%16476 = OpShiftRightArithmetic %int %10055 %int_5
%23373 = OpShiftRightLogical %uint %11954 %uint_5
%6315 = OpBitcast %int %23373
%21319 = OpIMul %int %16476 %6315
%16222 = OpIAdd %int %19701 %21319
%19086 = OpShiftLeftLogical %int %16222 %uint_9
%10934 = OpBitwiseAnd %int %18756 %int_7
%12601 = OpBitwiseAnd %int %10055 %int_14
%17742 = OpShiftLeftLogical %int %12601 %int_2
%17303 = OpIAdd %int %10934 %17742
%6375 = OpShiftLeftLogical %int %17303 %uint_2
%10161 = OpBitwiseAnd %int %6375 %int_n16
%12150 = OpShiftLeftLogical %int %10161 %int_1
%15436 = OpIAdd %int %19086 %12150
%13207 = OpBitwiseAnd %int %6375 %int_15
%19760 = OpIAdd %int %15436 %13207
%18357 = OpBitwiseAnd %int %10055 %int_1
%21581 = OpShiftLeftLogical %int %18357 %int_4
%16729 = OpIAdd %int %19760 %21581
%20514 = OpBitwiseAnd %int %16729 %int_n512
%9238 = OpShiftLeftLogical %int %20514 %int_3
%18995 = OpBitwiseAnd %int %10055 %int_16
%12151 = OpShiftLeftLogical %int %18995 %int_7
%16730 = OpIAdd %int %9238 %12151
%19167 = OpBitwiseAnd %int %16729 %int_448
%21582 = OpShiftLeftLogical %int %19167 %int_2
%16708 = OpIAdd %int %16730 %21582
%20611 = OpBitwiseAnd %int %10055 %int_8
%16831 = OpShiftRightArithmetic %int %20611 %int_2
%7916 = OpShiftRightArithmetic %int %18756 %int_3
%13750 = OpIAdd %int %16831 %7916
%21587 = OpBitwiseAnd %int %13750 %int_3
%21583 = OpShiftLeftLogical %int %21587 %int_6
%15437 = OpIAdd %int %16708 %21583
%14157 = OpBitwiseAnd %int %16729 %int_63
%12098 = OpIAdd %int %15437 %14157
OpBranch %7691
%7691 = OpLabel
%10540 = OpPhi %int %21741 %12129 %12098 %25128
OpBranch %23266
%10765 = OpLabel
%20632 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%15628 = OpLoad %uint %20632
%21275 = OpAccessChain %_ptr_Uniform_uint %5245 %int_3
%13550 = OpLoad %uint %21275
%15070 = OpBitcast %int %13550
%18927 = OpIMul %int %6362 %15070
%8334 = OpIAdd %int %18927 %17598
%8952 = OpBitcast %int %15628
%7839 = OpIMul %int %8334 %8952
%7984 = OpIAdd %int %22810 %7839
OpBranch %23266
%23266 = OpLabel
%19748 = OpPhi %int %10540 %7691 %7984 %10765
%24922 = OpAccessChain %_ptr_Uniform_uint %5245 %int_1
%7502 = OpLoad %uint %24922
%15686 = OpBitcast %int %7502
%15579 = OpIAdd %int %15686 %19748
%18556 = OpBitcast %uint %15579
%21493 = OpShiftRightLogical %uint %18556 %uint_4
%14997 = OpShiftRightLogical %uint %21411 %uint_2
%8394 = OpBitwiseAnd %uint %14997 %uint_3
%20727 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %21493
%8142 = OpLoad %v4uint %20727
%13760 = OpIEqual %bool %8394 %uint_1
%21366 = OpIEqual %bool %8394 %uint_2
%22150 = OpLogicalOr %bool %13760 %21366
OpSelectionMerge %13411 None
OpBranchConditional %22150 %10583 %13411
%10583 = OpLabel
%18271 = OpBitwiseAnd %v4uint %8142 %2510
%9425 = OpShiftLeftLogical %v4uint %18271 %317
%20652 = OpBitwiseAnd %v4uint %8142 %1838
%17549 = OpShiftRightLogical %v4uint %20652 %317
%16376 = OpBitwiseOr %v4uint %9425 %17549
OpBranch %13411
%13411 = OpLabel
%22649 = OpPhi %v4uint %8142 %23266 %16376 %10583
%19638 = OpIEqual %bool %8394 %uint_3
%15139 = OpLogicalOr %bool %21366 %19638
OpSelectionMerge %13962 None
OpBranchConditional %15139 %11064 %13962
%11064 = OpLabel
%24087 = OpShiftLeftLogical %v4uint %22649 %749
%15335 = OpShiftRightLogical %v4uint %22649 %749
%10728 = OpBitwiseOr %v4uint %24087 %15335
OpBranch %13962
%13962 = OpLabel
%16606 = OpPhi %v4uint %22649 %13411 %10728 %11064
%18240 = OpBitwiseAnd %v4uint %16606 %850
%9137 = OpConvertUToF %v4float %18240
%19365 = OpVectorTimesScalar %v4float %9137 %float_1_52590219en05
%23367 = OpShiftRightLogical %v4uint %16606 %749
%18492 = OpConvertUToF %v4float %23367
%18450 = OpVectorTimesScalar %v4float %18492 %float_1_52590219en05
%6268 = OpCompositeExtract %float %19365 0
%13806 = OpCompositeExtract %float %18450 0
%19232 = OpCompositeConstruct %v2float %6268 %13806
%8561 = OpExtInst %uint %1 PackHalf2x16 %19232
%23487 = OpCompositeExtract %float %19365 1
%14759 = OpCompositeExtract %float %18450 1
%19233 = OpCompositeConstruct %v2float %23487 %14759
%8562 = OpExtInst %uint %1 PackHalf2x16 %19233
%23488 = OpCompositeExtract %float %19365 2
%14760 = OpCompositeExtract %float %18450 2
%19234 = OpCompositeConstruct %v2float %23488 %14760
%8563 = OpExtInst %uint %1 PackHalf2x16 %19234
%23489 = OpCompositeExtract %float %19365 3
%14761 = OpCompositeExtract %float %18450 3
%19213 = OpCompositeConstruct %v2float %23489 %14761
%8430 = OpExtInst %uint %1 PackHalf2x16 %19213
%15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430
%17859 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %21670
OpStore %17859 %15035
%15044 = OpIAdd %uint %21670 %int_1
%18776 = OpSelect %uint %10467 %uint_32 %uint_16
%11803 = OpShiftRightLogical %uint %18776 %uint_4
%13947 = OpIAdd %uint %21493 %11803
%22298 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %13947
%6578 = OpLoad %v4uint %22298
OpSelectionMerge %14874 None
OpBranchConditional %22150 %10584 %14874
%10584 = OpLabel
%18272 = OpBitwiseAnd %v4uint %6578 %2510
%9426 = OpShiftLeftLogical %v4uint %18272 %317
%20653 = OpBitwiseAnd %v4uint %6578 %1838
%17550 = OpShiftRightLogical %v4uint %20653 %317
%16377 = OpBitwiseOr %v4uint %9426 %17550
OpBranch %14874
%14874 = OpLabel
%10924 = OpPhi %v4uint %6578 %13962 %16377 %10584
OpSelectionMerge %13963 None
OpBranchConditional %15139 %11065 %13963
%11065 = OpLabel
%24088 = OpShiftLeftLogical %v4uint %10924 %749
%15336 = OpShiftRightLogical %v4uint %10924 %749
%10729 = OpBitwiseOr %v4uint %24088 %15336
OpBranch %13963
%13963 = OpLabel
%16607 = OpPhi %v4uint %10924 %14874 %10729 %11065
%18241 = OpBitwiseAnd %v4uint %16607 %850
%9138 = OpConvertUToF %v4float %18241
%19366 = OpVectorTimesScalar %v4float %9138 %float_1_52590219en05
%23368 = OpShiftRightLogical %v4uint %16607 %749
%18493 = OpConvertUToF %v4float %23368
%18451 = OpVectorTimesScalar %v4float %18493 %float_1_52590219en05
%6269 = OpCompositeExtract %float %19366 0
%13807 = OpCompositeExtract %float %18451 0
%19235 = OpCompositeConstruct %v2float %6269 %13807
%8564 = OpExtInst %uint %1 PackHalf2x16 %19235
%23490 = OpCompositeExtract %float %19366 1
%14762 = OpCompositeExtract %float %18451 1
%19236 = OpCompositeConstruct %v2float %23490 %14762
%8565 = OpExtInst %uint %1 PackHalf2x16 %19236
%23491 = OpCompositeExtract %float %19366 2
%14763 = OpCompositeExtract %float %18451 2
%19237 = OpCompositeConstruct %v2float %23491 %14763
%8566 = OpExtInst %uint %1 PackHalf2x16 %19237
%23492 = OpCompositeExtract %float %19366 3
%14764 = OpCompositeExtract %float %18451 3
%19214 = OpCompositeConstruct %v2float %23492 %14764
%8431 = OpExtInst %uint %1 PackHalf2x16 %19214
%15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431
%20158 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %15044
OpStore %20158 %15036
OpBranch %19578
%19578 = OpLabel
OpReturn
OpFunctionEnd
#endif
const uint32_t texture_load_rg16_unorm_float_cs[] = {
0x07230203, 0x00010000, 0x0008000A, 0x0000625B, 0x00000000, 0x00020011,
0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,
0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,
0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00050048, 0x00000489,
0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001,
0x00000023, 0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023,
0x00000008, 0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C,
0x00050048, 0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048,
0x00000489, 0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489,
0x00000006, 0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007,
0x00000023, 0x00000024, 0x00030047, 0x00000489, 0x00000002, 0x00040047,
0x0000147D, 0x00000022, 0x00000002, 0x00040047, 0x0000147D, 0x00000021,
0x00000000, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,
0x000007DC, 0x00000006, 0x00000010, 0x00040048, 0x000007B4, 0x00000000,
0x00000019, 0x00050048, 0x000007B4, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B4, 0x00000003, 0x00040047, 0x0000140E, 0x00000022,
0x00000000, 0x00040047, 0x0000140E, 0x00000021, 0x00000000, 0x00040047,
0x000007DD, 0x00000006, 0x00000010, 0x00040048, 0x000007B5, 0x00000000,
0x00000018, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B5, 0x00000003, 0x00040047, 0x0000107A, 0x00000022,
0x00000001, 0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047,
0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,
0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,
0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,
0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,
0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,
0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00030016, 0x0000000D,
0x00000020, 0x00040017, 0x0000001D, 0x0000000D, 0x00000004, 0x0004002B,
0x0000000B, 0x000001C1, 0x0000FFFF, 0x0004002B, 0x0000000D, 0x0000092A,
0x37800080, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B,
0x0000000B, 0x00000A0A, 0x00000000, 0x00040017, 0x00000013, 0x0000000D,
0x00000002, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B,
0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A13,
0x00000003, 0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B,
0x0000000B, 0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x000005FD,
0xFF00FF00, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B,
0x0000000B, 0x00000A19, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20,
0x00000007, 0x0004002B, 0x0000000C, 0x00000A35, 0x0000000E, 0x0004002B,
0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x000009DB,
0xFFFFFFF0, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B,
0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A17,
0x00000004, 0x0004002B, 0x0000000C, 0x0000040B, 0xFFFFFE00, 0x0004002B,
0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C, 0x00000A3B,
0x00000010, 0x0004002B, 0x0000000C, 0x00000388, 0x000001C0, 0x0004002B,
0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A1D,
0x00000006, 0x0004002B, 0x0000000C, 0x00000AC8, 0x0000003F, 0x0004002B,
0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000C, 0x0000078B,
0x0FFFFFFF, 0x0004002B, 0x0000000C, 0x00000A05, 0xFFFFFFFE, 0x0004002B,
0x0000000B, 0x00000A6A, 0x00000020, 0x000A001E, 0x00000489, 0x0000000B,
0x0000000B, 0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B,
0x0000000B, 0x00040020, 0x00000706, 0x00000002, 0x00000489, 0x0004003B,
0x00000706, 0x0000147D, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B,
0x00000000, 0x00040020, 0x00000288, 0x00000002, 0x0000000B, 0x00040020,
0x00000291, 0x00000002, 0x00000014, 0x00040017, 0x00000011, 0x0000000B,
0x00000002, 0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B,
0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A2B,
0x00000A13, 0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009,
0x00000002, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4,
0x000007DC, 0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B,
0x00000A31, 0x0000140E, 0x00000002, 0x0003001D, 0x000007DD, 0x00000017,
0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A32, 0x00000002,
0x000007B5, 0x0004003B, 0x00000A32, 0x0000107A, 0x00000002, 0x00040020,
0x00000294, 0x00000002, 0x00000017, 0x0006002C, 0x00000014, 0x00000BC3,
0x00000A16, 0x00000A6A, 0x00000A0D, 0x0004002B, 0x0000000B, 0x00000A25,
0x00000009, 0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6,
0x000008A6, 0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22,
0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E,
0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017,
0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0007002C,
0x00000017, 0x00000352, 0x000001C1, 0x000001C1, 0x000001C1, 0x000001C1,
0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,
0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A,
0x00003B21, 0x000200F8, 0x00003B21, 0x0004003D, 0x00000014, 0x0000312F,
0x00000F48, 0x000500C4, 0x00000014, 0x000027F5, 0x0000312F, 0x00000A2B,
0x00050041, 0x00000291, 0x0000625A, 0x0000147D, 0x00000A17, 0x0004003D,
0x00000014, 0x000059B5, 0x0000625A, 0x0007004F, 0x00000011, 0x00004993,
0x000027F5, 0x000027F5, 0x00000000, 0x00000001, 0x0007004F, 0x00000011,
0x000019E2, 0x000059B5, 0x000059B5, 0x00000000, 0x00000001, 0x000500AE,
0x0000000F, 0x00004288, 0x00004993, 0x000019E2, 0x0004009A, 0x00000009,
0x00006067, 0x00004288, 0x000300F7, 0x0000188A, 0x00000002, 0x000400FA,
0x00006067, 0x000055E8, 0x0000188A, 0x000200F8, 0x000055E8, 0x000200F9,
0x00004C7A, 0x000200F8, 0x0000188A, 0x0004007C, 0x00000016, 0x00001A8B,
0x000027F5, 0x00050041, 0x00000288, 0x00004968, 0x0000147D, 0x00000A1D,
0x0004003D, 0x0000000B, 0x0000263C, 0x00004968, 0x00050051, 0x0000000B,
0x00004F98, 0x000059B5, 0x00000001, 0x00050051, 0x0000000C, 0x00003964,
0x00001A8B, 0x00000000, 0x00050084, 0x0000000C, 0x0000591A, 0x00003964,
0x00000A17, 0x00050051, 0x0000000C, 0x000018DA, 0x00001A8B, 0x00000002,
0x0004007C, 0x0000000C, 0x000038A9, 0x00004F98, 0x00050084, 0x0000000C,
0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE,
0x00001A8B, 0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F,
0x000044BE, 0x0004007C, 0x0000000C, 0x00005785, 0x0000263C, 0x00050084,
0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C,
0x00001B95, 0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B, 0x00004B46,
0x00001B95, 0x00050041, 0x00000288, 0x00004C04, 0x0000147D, 0x00000A1A,
0x0004003D, 0x0000000B, 0x0000595B, 0x00004C04, 0x00050080, 0x0000000B,
0x00002145, 0x00004B46, 0x0000595B, 0x000500C2, 0x0000000B, 0x000054A6,
0x00002145, 0x00000A16, 0x00050041, 0x00000288, 0x000051D6, 0x0000147D,
0x00000A0B, 0x0004003D, 0x0000000B, 0x000053A3, 0x000051D6, 0x000500C7,
0x0000000B, 0x000018ED, 0x000053A3, 0x00000A0D, 0x000500AB, 0x00000009,
0x000028E3, 0x000018ED, 0x00000A0A, 0x000300F7, 0x00005AE2, 0x00000002,
0x000400FA, 0x000028E3, 0x0000277C, 0x00002A0D, 0x000200F8, 0x0000277C,
0x000500C7, 0x0000000B, 0x00005BD4, 0x000053A3, 0x00000A10, 0x000500AB,
0x00000009, 0x00003FAC, 0x00005BD4, 0x00000A0A, 0x000300F7, 0x00001E0B,
0x00000002, 0x000400FA, 0x00003FAC, 0x00002F61, 0x00006228, 0x000200F8,
0x00002F61, 0x00050041, 0x00000288, 0x00004722, 0x0000147D, 0x00000A11,
0x0004003D, 0x0000000B, 0x00003D0B, 0x00004722, 0x00050041, 0x00000288,
0x00005860, 0x0000147D, 0x00000A14, 0x0004003D, 0x0000000B, 0x0000541F,
0x00005860, 0x000500C3, 0x0000000C, 0x00003A4B, 0x000044BE, 0x00000A17,
0x000500C3, 0x0000000C, 0x00004955, 0x000018DA, 0x00000A11, 0x000500C2,
0x0000000B, 0x00004947, 0x0000541F, 0x00000A16, 0x0004007C, 0x0000000C,
0x000018AA, 0x00004947, 0x00050084, 0x0000000C, 0x00005321, 0x00004955,
0x000018AA, 0x00050080, 0x0000000C, 0x00003B27, 0x00003A4B, 0x00005321,
0x000500C2, 0x0000000B, 0x00002348, 0x00003D0B, 0x00000A19, 0x0004007C,
0x0000000C, 0x00003901, 0x00002348, 0x00050084, 0x0000000C, 0x000020F4,
0x00003B27, 0x00003901, 0x000500C3, 0x0000000C, 0x000032BA, 0x00003964,
0x00000A1A, 0x00050080, 0x0000000C, 0x00005FEE, 0x000032BA, 0x000020F4,
0x000500C4, 0x0000000C, 0x0000225D, 0x00005FEE, 0x00000A22, 0x000500C7,
0x0000000C, 0x00002CF6, 0x0000225D, 0x0000078B, 0x000500C4, 0x0000000C,
0x000049FA, 0x00002CF6, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00004D38,
0x00003964, 0x00000A20, 0x000500C7, 0x0000000C, 0x00003138, 0x000044BE,
0x00000A1D, 0x000500C4, 0x0000000C, 0x0000454D, 0x00003138, 0x00000A11,
0x00050080, 0x0000000C, 0x0000434B, 0x00004D38, 0x0000454D, 0x000500C4,
0x0000000C, 0x00001B88, 0x0000434B, 0x00000A22, 0x000500C3, 0x0000000C,
0x00005DE3, 0x00001B88, 0x00000A1D, 0x000500C3, 0x0000000C, 0x00002215,
0x000044BE, 0x00000A14, 0x00050080, 0x0000000C, 0x000035A3, 0x00002215,
0x00004955, 0x000500C7, 0x0000000C, 0x00005A0C, 0x000035A3, 0x00000A0E,
0x000500C3, 0x0000000C, 0x00004112, 0x00003964, 0x00000A14, 0x000500C4,
0x0000000C, 0x0000496A, 0x00005A0C, 0x00000A0E, 0x00050080, 0x0000000C,
0x000034BD, 0x00004112, 0x0000496A, 0x000500C7, 0x0000000C, 0x00004ADD,
0x000034BD, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000544A, 0x00004ADD,
0x00000A0E, 0x00050080, 0x0000000C, 0x00003C4B, 0x00005A0C, 0x0000544A,
0x000500C7, 0x0000000C, 0x0000335E, 0x00005DE3, 0x000009DB, 0x00050080,
0x0000000C, 0x00004F70, 0x000049FA, 0x0000335E, 0x000500C4, 0x0000000C,
0x00005B31, 0x00004F70, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005AEA,
0x00005DE3, 0x00000A38, 0x00050080, 0x0000000C, 0x0000285C, 0x00005B31,
0x00005AEA, 0x000500C7, 0x0000000C, 0x000047B4, 0x000018DA, 0x00000A14,
0x000500C4, 0x0000000C, 0x0000544B, 0x000047B4, 0x00000A22, 0x00050080,
0x0000000C, 0x00004157, 0x0000285C, 0x0000544B, 0x000500C7, 0x0000000C,
0x00004ADE, 0x000044BE, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000544C,
0x00004ADE, 0x00000A17, 0x00050080, 0x0000000C, 0x00004158, 0x00004157,
0x0000544C, 0x000500C7, 0x0000000C, 0x00004FD6, 0x00003C4B, 0x00000A0E,
0x000500C4, 0x0000000C, 0x00002703, 0x00004FD6, 0x00000A14, 0x000500C3,
0x0000000C, 0x00003332, 0x00004158, 0x00000A1D, 0x000500C7, 0x0000000C,
0x000036D6, 0x00003332, 0x00000A20, 0x00050080, 0x0000000C, 0x00003412,
0x00002703, 0x000036D6, 0x000500C4, 0x0000000C, 0x00005B32, 0x00003412,
0x00000A14, 0x000500C7, 0x0000000C, 0x00005AB1, 0x00003C4B, 0x00000A05,
0x00050080, 0x0000000C, 0x00002A9C, 0x00005B32, 0x00005AB1, 0x000500C4,
0x0000000C, 0x00005B33, 0x00002A9C, 0x00000A11, 0x000500C7, 0x0000000C,
0x00005AB2, 0x00004158, 0x0000040B, 0x00050080, 0x0000000C, 0x00002A9D,
0x00005B33, 0x00005AB2, 0x000500C4, 0x0000000C, 0x00005B34, 0x00002A9D,
0x00000A14, 0x000500C7, 0x0000000C, 0x00005EA0, 0x00004158, 0x00000AC8,
0x00050080, 0x0000000C, 0x000054ED, 0x00005B34, 0x00005EA0, 0x000200F9,
0x00001E0B, 0x000200F8, 0x00006228, 0x0004007C, 0x00000012, 0x00001A8C,
0x00004993, 0x00050041, 0x00000288, 0x00004969, 0x0000147D, 0x00000A11,
0x0004003D, 0x0000000B, 0x00002EB2, 0x00004969, 0x00050051, 0x0000000C,
0x00004944, 0x00001A8C, 0x00000000, 0x000500C3, 0x0000000C, 0x00004CF5,
0x00004944, 0x00000A1A, 0x00050051, 0x0000000C, 0x00002747, 0x00001A8C,
0x00000001, 0x000500C3, 0x0000000C, 0x0000405C, 0x00002747, 0x00000A1A,
0x000500C2, 0x0000000B, 0x00005B4D, 0x00002EB2, 0x00000A19, 0x0004007C,
0x0000000C, 0x000018AB, 0x00005B4D, 0x00050084, 0x0000000C, 0x00005347,
0x0000405C, 0x000018AB, 0x00050080, 0x0000000C, 0x00003F5E, 0x00004CF5,
0x00005347, 0x000500C4, 0x0000000C, 0x00004A8E, 0x00003F5E, 0x00000A25,
0x000500C7, 0x0000000C, 0x00002AB6, 0x00004944, 0x00000A20, 0x000500C7,
0x0000000C, 0x00003139, 0x00002747, 0x00000A35, 0x000500C4, 0x0000000C,
0x0000454E, 0x00003139, 0x00000A11, 0x00050080, 0x0000000C, 0x00004397,
0x00002AB6, 0x0000454E, 0x000500C4, 0x0000000C, 0x000018E7, 0x00004397,
0x00000A10, 0x000500C7, 0x0000000C, 0x000027B1, 0x000018E7, 0x000009DB,
0x000500C4, 0x0000000C, 0x00002F76, 0x000027B1, 0x00000A0E, 0x00050080,
0x0000000C, 0x00003C4C, 0x00004A8E, 0x00002F76, 0x000500C7, 0x0000000C,
0x00003397, 0x000018E7, 0x00000A38, 0x00050080, 0x0000000C, 0x00004D30,
0x00003C4C, 0x00003397, 0x000500C7, 0x0000000C, 0x000047B5, 0x00002747,
0x00000A0E, 0x000500C4, 0x0000000C, 0x0000544D, 0x000047B5, 0x00000A17,
0x00050080, 0x0000000C, 0x00004159, 0x00004D30, 0x0000544D, 0x000500C7,
0x0000000C, 0x00005022, 0x00004159, 0x0000040B, 0x000500C4, 0x0000000C,
0x00002416, 0x00005022, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004A33,
0x00002747, 0x00000A3B, 0x000500C4, 0x0000000C, 0x00002F77, 0x00004A33,
0x00000A20, 0x00050080, 0x0000000C, 0x0000415A, 0x00002416, 0x00002F77,
0x000500C7, 0x0000000C, 0x00004ADF, 0x00004159, 0x00000388, 0x000500C4,
0x0000000C, 0x0000544E, 0x00004ADF, 0x00000A11, 0x00050080, 0x0000000C,
0x00004144, 0x0000415A, 0x0000544E, 0x000500C7, 0x0000000C, 0x00005083,
0x00002747, 0x00000A23, 0x000500C3, 0x0000000C, 0x000041BF, 0x00005083,
0x00000A11, 0x000500C3, 0x0000000C, 0x00001EEC, 0x00004944, 0x00000A14,
0x00050080, 0x0000000C, 0x000035B6, 0x000041BF, 0x00001EEC, 0x000500C7,
0x0000000C, 0x00005453, 0x000035B6, 0x00000A14, 0x000500C4, 0x0000000C,
0x0000544F, 0x00005453, 0x00000A1D, 0x00050080, 0x0000000C, 0x00003C4D,
0x00004144, 0x0000544F, 0x000500C7, 0x0000000C, 0x0000374D, 0x00004159,
0x00000AC8, 0x00050080, 0x0000000C, 0x00002F42, 0x00003C4D, 0x0000374D,
0x000200F9, 0x00001E0B, 0x000200F8, 0x00001E0B, 0x000700F5, 0x0000000C,
0x0000292C, 0x000054ED, 0x00002F61, 0x00002F42, 0x00006228, 0x000200F9,
0x00005AE2, 0x000200F8, 0x00002A0D, 0x00050041, 0x00000288, 0x00005098,
0x0000147D, 0x00000A11, 0x0004003D, 0x0000000B, 0x00003D0C, 0x00005098,
0x00050041, 0x00000288, 0x0000531B, 0x0000147D, 0x00000A14, 0x0004003D,
0x0000000B, 0x000034EE, 0x0000531B, 0x0004007C, 0x0000000C, 0x00003ADE,
0x000034EE, 0x00050084, 0x0000000C, 0x000049EF, 0x000018DA, 0x00003ADE,
0x00050080, 0x0000000C, 0x0000208E, 0x000049EF, 0x000044BE, 0x0004007C,
0x0000000C, 0x000022F8, 0x00003D0C, 0x00050084, 0x0000000C, 0x00001E9F,
0x0000208E, 0x000022F8, 0x00050080, 0x0000000C, 0x00001F30, 0x0000591A,
0x00001E9F, 0x000200F9, 0x00005AE2, 0x000200F8, 0x00005AE2, 0x000700F5,
0x0000000C, 0x00004D24, 0x0000292C, 0x00001E0B, 0x00001F30, 0x00002A0D,
0x00050041, 0x00000288, 0x0000615A, 0x0000147D, 0x00000A0E, 0x0004003D,
0x0000000B, 0x00001D4E, 0x0000615A, 0x0004007C, 0x0000000C, 0x00003D46,
0x00001D4E, 0x00050080, 0x0000000C, 0x00003CDB, 0x00003D46, 0x00004D24,
0x0004007C, 0x0000000B, 0x0000487C, 0x00003CDB, 0x000500C2, 0x0000000B,
0x000053F5, 0x0000487C, 0x00000A16, 0x000500C2, 0x0000000B, 0x00003A95,
0x000053A3, 0x00000A10, 0x000500C7, 0x0000000B, 0x000020CA, 0x00003A95,
0x00000A13, 0x00060041, 0x00000294, 0x000050F7, 0x0000107A, 0x00000A0B,
0x000053F5, 0x0004003D, 0x00000017, 0x00001FCE, 0x000050F7, 0x000500AA,
0x00000009, 0x000035C0, 0x000020CA, 0x00000A0D, 0x000500AA, 0x00000009,
0x00005376, 0x000020CA, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686,
0x000035C0, 0x00005376, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA,
0x00005686, 0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7,
0x00000017, 0x0000475F, 0x00001FCE, 0x000009CE, 0x000500C4, 0x00000017,
0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC,
0x00001FCE, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC,
0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D,
0x000200F9, 0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017,
0x00005879, 0x00001FCE, 0x00005AE2, 0x00003FF8, 0x00002957, 0x000500AA,
0x00000009, 0x00004CB6, 0x000020CA, 0x00000A13, 0x000500A6, 0x00000009,
0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7, 0x0000368A, 0x00000000,
0x000400FA, 0x00003B23, 0x00002B38, 0x0000368A, 0x000200F8, 0x00002B38,
0x000500C4, 0x00000017, 0x00005E17, 0x00005879, 0x000002ED, 0x000500C2,
0x00000017, 0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5, 0x00000017,
0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9, 0x0000368A, 0x000200F8,
0x0000368A, 0x000700F5, 0x00000017, 0x000040DE, 0x00005879, 0x00003463,
0x000029E8, 0x00002B38, 0x000500C7, 0x00000017, 0x00004740, 0x000040DE,
0x00000352, 0x00040070, 0x0000001D, 0x000023B1, 0x00004740, 0x0005008E,
0x0000001D, 0x00004BA5, 0x000023B1, 0x0000092A, 0x000500C2, 0x00000017,
0x00005B47, 0x000040DE, 0x000002ED, 0x00040070, 0x0000001D, 0x0000483C,
0x00005B47, 0x0005008E, 0x0000001D, 0x00004812, 0x0000483C, 0x0000092A,
0x00050051, 0x0000000D, 0x0000187C, 0x00004BA5, 0x00000000, 0x00050051,
0x0000000D, 0x000035EE, 0x00004812, 0x00000000, 0x00050050, 0x00000013,
0x00004B20, 0x0000187C, 0x000035EE, 0x0006000C, 0x0000000B, 0x00002171,
0x00000001, 0x0000003A, 0x00004B20, 0x00050051, 0x0000000D, 0x00005BBF,
0x00004BA5, 0x00000001, 0x00050051, 0x0000000D, 0x000039A7, 0x00004812,
0x00000001, 0x00050050, 0x00000013, 0x00004B21, 0x00005BBF, 0x000039A7,
0x0006000C, 0x0000000B, 0x00002172, 0x00000001, 0x0000003A, 0x00004B21,
0x00050051, 0x0000000D, 0x00005BC0, 0x00004BA5, 0x00000002, 0x00050051,
0x0000000D, 0x000039A8, 0x00004812, 0x00000002, 0x00050050, 0x00000013,
0x00004B22, 0x00005BC0, 0x000039A8, 0x0006000C, 0x0000000B, 0x00002173,
0x00000001, 0x0000003A, 0x00004B22, 0x00050051, 0x0000000D, 0x00005BC1,
0x00004BA5, 0x00000003, 0x00050051, 0x0000000D, 0x000039A9, 0x00004812,
0x00000003, 0x00050050, 0x00000013, 0x00004B0D, 0x00005BC1, 0x000039A9,
0x0006000C, 0x0000000B, 0x000020EE, 0x00000001, 0x0000003A, 0x00004B0D,
0x00070050, 0x00000017, 0x00003ABB, 0x00002171, 0x00002172, 0x00002173,
0x000020EE, 0x00060041, 0x00000294, 0x000045C3, 0x0000140E, 0x00000A0B,
0x000054A6, 0x0003003E, 0x000045C3, 0x00003ABB, 0x00050080, 0x0000000B,
0x00003AC4, 0x000054A6, 0x00000A0E, 0x000600A9, 0x0000000B, 0x00004958,
0x000028E3, 0x00000A6A, 0x00000A3A, 0x000500C2, 0x0000000B, 0x00002E1B,
0x00004958, 0x00000A16, 0x00050080, 0x0000000B, 0x0000367B, 0x000053F5,
0x00002E1B, 0x00060041, 0x00000294, 0x0000571A, 0x0000107A, 0x00000A0B,
0x0000367B, 0x0004003D, 0x00000017, 0x000019B2, 0x0000571A, 0x000300F7,
0x00003A1A, 0x00000000, 0x000400FA, 0x00005686, 0x00002958, 0x00003A1A,
0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760, 0x000019B2,
0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760, 0x0000013D,
0x000500C7, 0x00000017, 0x000050AD, 0x000019B2, 0x0000072E, 0x000500C2,
0x00000017, 0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5, 0x00000017,
0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x00003A1A, 0x000200F8,
0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC, 0x000019B2, 0x0000368A,
0x00003FF9, 0x00002958, 0x000300F7, 0x0000368B, 0x00000000, 0x000400FA,
0x00003B23, 0x00002B39, 0x0000368B, 0x000200F8, 0x00002B39, 0x000500C4,
0x00000017, 0x00005E18, 0x00002AAC, 0x000002ED, 0x000500C2, 0x00000017,
0x00003BE8, 0x00002AAC, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E9,
0x00005E18, 0x00003BE8, 0x000200F9, 0x0000368B, 0x000200F8, 0x0000368B,
0x000700F5, 0x00000017, 0x000040DF, 0x00002AAC, 0x00003A1A, 0x000029E9,
0x00002B39, 0x000500C7, 0x00000017, 0x00004741, 0x000040DF, 0x00000352,
0x00040070, 0x0000001D, 0x000023B2, 0x00004741, 0x0005008E, 0x0000001D,
0x00004BA6, 0x000023B2, 0x0000092A, 0x000500C2, 0x00000017, 0x00005B48,
0x000040DF, 0x000002ED, 0x00040070, 0x0000001D, 0x0000483D, 0x00005B48,
0x0005008E, 0x0000001D, 0x00004813, 0x0000483D, 0x0000092A, 0x00050051,
0x0000000D, 0x0000187D, 0x00004BA6, 0x00000000, 0x00050051, 0x0000000D,
0x000035EF, 0x00004813, 0x00000000, 0x00050050, 0x00000013, 0x00004B23,
0x0000187D, 0x000035EF, 0x0006000C, 0x0000000B, 0x00002174, 0x00000001,
0x0000003A, 0x00004B23, 0x00050051, 0x0000000D, 0x00005BC2, 0x00004BA6,
0x00000001, 0x00050051, 0x0000000D, 0x000039AA, 0x00004813, 0x00000001,
0x00050050, 0x00000013, 0x00004B24, 0x00005BC2, 0x000039AA, 0x0006000C,
0x0000000B, 0x00002175, 0x00000001, 0x0000003A, 0x00004B24, 0x00050051,
0x0000000D, 0x00005BC3, 0x00004BA6, 0x00000002, 0x00050051, 0x0000000D,
0x000039AB, 0x00004813, 0x00000002, 0x00050050, 0x00000013, 0x00004B25,
0x00005BC3, 0x000039AB, 0x0006000C, 0x0000000B, 0x00002176, 0x00000001,
0x0000003A, 0x00004B25, 0x00050051, 0x0000000D, 0x00005BC4, 0x00004BA6,
0x00000003, 0x00050051, 0x0000000D, 0x000039AC, 0x00004813, 0x00000003,
0x00050050, 0x00000013, 0x00004B0E, 0x00005BC4, 0x000039AC, 0x0006000C,
0x0000000B, 0x000020EF, 0x00000001, 0x0000003A, 0x00004B0E, 0x00070050,
0x00000017, 0x00003ABC, 0x00002174, 0x00002175, 0x00002176, 0x000020EF,
0x00060041, 0x00000294, 0x00004EBE, 0x0000140E, 0x00000A0B, 0x00003AC4,
0x0003003E, 0x00004EBE, 0x00003ABC, 0x000200F9, 0x00004C7A, 0x000200F8,
0x00004C7A, 0x000100FD, 0x00010038,
};

View File

@ -0,0 +1,752 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 10
; Bound: 25179
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %5663 "main" %gl_GlobalInvocationID
OpExecutionMode %5663 LocalSize 4 32 1
OpMemberDecorate %_struct_1161 0 Offset 0
OpMemberDecorate %_struct_1161 1 Offset 4
OpMemberDecorate %_struct_1161 2 Offset 8
OpMemberDecorate %_struct_1161 3 Offset 12
OpMemberDecorate %_struct_1161 4 Offset 16
OpMemberDecorate %_struct_1161 5 Offset 28
OpMemberDecorate %_struct_1161 6 Offset 32
OpMemberDecorate %_struct_1161 7 Offset 36
OpDecorate %_struct_1161 Block
OpDecorate %5245 DescriptorSet 2
OpDecorate %5245 Binding 0
OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
OpDecorate %_runtimearr_v4uint ArrayStride 16
OpMemberDecorate %_struct_1972 0 NonReadable
OpMemberDecorate %_struct_1972 0 Offset 0
OpDecorate %_struct_1972 BufferBlock
OpDecorate %5134 DescriptorSet 0
OpDecorate %5134 Binding 0
OpDecorate %_runtimearr_v4uint_0 ArrayStride 16
OpMemberDecorate %_struct_1973 0 NonWritable
OpMemberDecorate %_struct_1973 0 Offset 0
OpDecorate %_struct_1973 BufferBlock
OpDecorate %4218 DescriptorSet 1
OpDecorate %4218 Binding 0
OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%v4uint = OpTypeVector %uint 4
%int = OpTypeInt 32 1
%v2int = OpTypeVector %int 2
%v3int = OpTypeVector %int 3
%bool = OpTypeBool
%v3uint = OpTypeVector %uint 3
%v2uint = OpTypeVector %uint 2
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%uint_65535 = OpConstant %uint 65535
%float_1_52590219en05 = OpConstant %float 1.52590219e-05
%uint_16 = OpConstant %uint 16
%uint_0 = OpConstant %uint 0
%v2float = OpTypeVector %float 2
%uint_1 = OpConstant %uint 1
%uint_2 = OpConstant %uint 2
%uint_3 = OpConstant %uint 3
%uint_16711935 = OpConstant %uint 16711935
%uint_8 = OpConstant %uint 8
%uint_4278255360 = OpConstant %uint 4278255360
%int_5 = OpConstant %int 5
%uint_5 = OpConstant %uint 5
%int_7 = OpConstant %int 7
%int_14 = OpConstant %int 14
%int_2 = OpConstant %int 2
%int_n16 = OpConstant %int -16
%int_1 = OpConstant %int 1
%int_15 = OpConstant %int 15
%int_4 = OpConstant %int 4
%int_n512 = OpConstant %int -512
%int_3 = OpConstant %int 3
%int_16 = OpConstant %int 16
%int_448 = OpConstant %int 448
%int_8 = OpConstant %int 8
%int_6 = OpConstant %int 6
%int_63 = OpConstant %int 63
%uint_4 = OpConstant %uint 4
%uint_6 = OpConstant %uint 6
%int_268435455 = OpConstant %int 268435455
%int_n2 = OpConstant %int -2
%uint_32 = OpConstant %uint 32
%_struct_1161 = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint
%_ptr_Uniform__struct_1161 = OpTypePointer Uniform %_struct_1161
%5245 = OpVariable %_ptr_Uniform__struct_1161 Uniform
%int_0 = OpConstant %int 0
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%1915 = OpConstantComposite %v2uint %uint_4 %uint_6
%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
%2603 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0
%v2bool = OpTypeVector %bool 2
%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint
%_struct_1972 = OpTypeStruct %_runtimearr_v4uint
%_ptr_Uniform__struct_1972 = OpTypePointer Uniform %_struct_1972
%5134 = OpVariable %_ptr_Uniform__struct_1972 Uniform
%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint
%_struct_1973 = OpTypeStruct %_runtimearr_v4uint_0
%_ptr_Uniform__struct_1973 = OpTypePointer Uniform %_struct_1973
%4218 = OpVariable %_ptr_Uniform__struct_1973 Uniform
%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1
%1870 = OpConstantComposite %v2uint %uint_3 %uint_3
%uint_9 = OpConstant %uint 9
%2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935
%317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8
%1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360
%749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16
%850 = OpConstantComposite %v4uint %uint_65535 %uint_65535 %uint_65535 %uint_65535
%5663 = OpFunction %void None %1282
%15110 = OpLabel
OpSelectionMerge %19578 None
OpSwitch %uint_0 %15137
%15137 = OpLabel
%12591 = OpLoad %v3uint %gl_GlobalInvocationID
%10229 = OpShiftLeftLogical %v3uint %12591 %2603
%25178 = OpAccessChain %_ptr_Uniform_v3uint %5245 %int_4
%22965 = OpLoad %v3uint %25178
%18835 = OpVectorShuffle %v2uint %10229 %10229 0 1
%6626 = OpVectorShuffle %v2uint %22965 %22965 0 1
%17032 = OpUGreaterThanEqual %v2bool %18835 %6626
%24679 = OpAny %bool %17032
OpSelectionMerge %6282 DontFlatten
OpBranchConditional %24679 %21992 %6282
%21992 = OpLabel
OpBranch %19578
%6282 = OpLabel
%6795 = OpBitcast %v3int %10229
%18792 = OpAccessChain %_ptr_Uniform_uint %5245 %int_6
%9788 = OpLoad %uint %18792
%20376 = OpCompositeExtract %uint %22965 1
%14692 = OpCompositeExtract %int %6795 0
%22810 = OpIMul %int %14692 %int_4
%6362 = OpCompositeExtract %int %6795 2
%14505 = OpBitcast %int %20376
%11279 = OpIMul %int %6362 %14505
%17598 = OpCompositeExtract %int %6795 1
%22228 = OpIAdd %int %11279 %17598
%22405 = OpBitcast %int %9788
%24535 = OpIMul %int %22228 %22405
%7061 = OpIAdd %int %22810 %24535
%19270 = OpBitcast %uint %7061
%19460 = OpAccessChain %_ptr_Uniform_uint %5245 %int_5
%22875 = OpLoad %uint %19460
%8517 = OpIAdd %uint %19270 %22875
%21670 = OpShiftRightLogical %uint %8517 %uint_4
%18404 = OpAccessChain %_ptr_Uniform_uint %5245 %int_1
%23432 = OpLoad %uint %18404
%22700 = OpAccessChain %_ptr_Uniform_uint %5245 %int_0
%20387 = OpLoad %uint %22700
%22279 = OpBitwiseAnd %uint %20387 %uint_2
%19223 = OpINotEqual %bool %22279 %uint_0
%17247 = OpCompositeConstruct %v2uint %20387 %20387
%22947 = OpShiftRightLogical %v2uint %17247 %1915
%6551 = OpBitwiseAnd %v2uint %22947 %1870
%18732 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%24236 = OpLoad %uint %18732
%20458 = OpAccessChain %_ptr_Uniform_uint %5245 %int_3
%22167 = OpLoad %uint %20458
%18929 = OpCompositeExtract %uint %10229 0
%6638 = OpShiftRightLogical %uint %18929 %uint_2
%9988 = OpCompositeExtract %uint %10229 1
%23563 = OpCompositeConstruct %v2uint %6638 %9988
%8041 = OpUDiv %v2uint %23563 %6551
%13932 = OpCompositeExtract %uint %8041 0
%19789 = OpShiftLeftLogical %uint %13932 %uint_2
%20905 = OpCompositeExtract %uint %8041 1
%23022 = OpCompositeExtract %uint %10229 2
%9417 = OpCompositeConstruct %v3uint %19789 %20905 %23022
OpSelectionMerge %21313 DontFlatten
OpBranchConditional %19223 %21373 %11737
%21373 = OpLabel
%10608 = OpBitcast %v3int %9417
%17090 = OpCompositeExtract %int %10608 1
%9469 = OpShiftRightArithmetic %int %17090 %int_4
%10055 = OpCompositeExtract %int %10608 2
%16476 = OpShiftRightArithmetic %int %10055 %int_2
%23373 = OpShiftRightLogical %uint %22167 %uint_4
%6314 = OpBitcast %int %23373
%21281 = OpIMul %int %16476 %6314
%15143 = OpIAdd %int %9469 %21281
%9032 = OpShiftRightLogical %uint %24236 %uint_5
%12427 = OpBitcast %int %9032
%10360 = OpIMul %int %15143 %12427
%25154 = OpCompositeExtract %int %10608 0
%20423 = OpShiftRightArithmetic %int %25154 %int_5
%18940 = OpIAdd %int %20423 %10360
%8797 = OpShiftLeftLogical %int %18940 %uint_8
%11510 = OpBitwiseAnd %int %8797 %int_268435455
%18938 = OpShiftLeftLogical %int %11510 %int_1
%19768 = OpBitwiseAnd %int %25154 %int_7
%12600 = OpBitwiseAnd %int %17090 %int_6
%17741 = OpShiftLeftLogical %int %12600 %int_2
%17227 = OpIAdd %int %19768 %17741
%7048 = OpShiftLeftLogical %int %17227 %uint_8
%24035 = OpShiftRightArithmetic %int %7048 %int_6
%8725 = OpShiftRightArithmetic %int %17090 %int_3
%13731 = OpIAdd %int %8725 %16476
%23052 = OpBitwiseAnd %int %13731 %int_1
%16658 = OpShiftRightArithmetic %int %25154 %int_3
%18794 = OpShiftLeftLogical %int %23052 %int_1
%13501 = OpIAdd %int %16658 %18794
%19165 = OpBitwiseAnd %int %13501 %int_3
%21578 = OpShiftLeftLogical %int %19165 %int_1
%15435 = OpIAdd %int %23052 %21578
%13150 = OpBitwiseAnd %int %24035 %int_n16
%20336 = OpIAdd %int %18938 %13150
%23345 = OpShiftLeftLogical %int %20336 %int_1
%23274 = OpBitwiseAnd %int %24035 %int_15
%10332 = OpIAdd %int %23345 %23274
%18356 = OpBitwiseAnd %int %10055 %int_3
%21579 = OpShiftLeftLogical %int %18356 %uint_8
%16727 = OpIAdd %int %10332 %21579
%19166 = OpBitwiseAnd %int %17090 %int_1
%21580 = OpShiftLeftLogical %int %19166 %int_4
%16728 = OpIAdd %int %16727 %21580
%20438 = OpBitwiseAnd %int %15435 %int_1
%9987 = OpShiftLeftLogical %int %20438 %int_3
%13106 = OpShiftRightArithmetic %int %16728 %int_6
%14038 = OpBitwiseAnd %int %13106 %int_7
%13330 = OpIAdd %int %9987 %14038
%23346 = OpShiftLeftLogical %int %13330 %int_3
%23217 = OpBitwiseAnd %int %15435 %int_n2
%10908 = OpIAdd %int %23346 %23217
%23347 = OpShiftLeftLogical %int %10908 %int_2
%23218 = OpBitwiseAnd %int %16728 %int_n512
%10909 = OpIAdd %int %23347 %23218
%23348 = OpShiftLeftLogical %int %10909 %int_3
%21849 = OpBitwiseAnd %int %16728 %int_63
%24314 = OpIAdd %int %23348 %21849
%22127 = OpBitcast %uint %24314
OpBranch %21313
%11737 = OpLabel
%9761 = OpVectorShuffle %v2uint %9417 %9417 0 1
%22991 = OpBitcast %v2int %9761
%6403 = OpCompositeExtract %int %22991 0
%9470 = OpShiftRightArithmetic %int %6403 %int_5
%10056 = OpCompositeExtract %int %22991 1
%16477 = OpShiftRightArithmetic %int %10056 %int_5
%23374 = OpShiftRightLogical %uint %24236 %uint_5
%6315 = OpBitcast %int %23374
%21319 = OpIMul %int %16477 %6315
%16222 = OpIAdd %int %9470 %21319
%19086 = OpShiftLeftLogical %int %16222 %uint_9
%10934 = OpBitwiseAnd %int %6403 %int_7
%12601 = OpBitwiseAnd %int %10056 %int_14
%17742 = OpShiftLeftLogical %int %12601 %int_2
%17303 = OpIAdd %int %10934 %17742
%6375 = OpShiftLeftLogical %int %17303 %uint_2
%10161 = OpBitwiseAnd %int %6375 %int_n16
%12150 = OpShiftLeftLogical %int %10161 %int_1
%15436 = OpIAdd %int %19086 %12150
%13207 = OpBitwiseAnd %int %6375 %int_15
%19760 = OpIAdd %int %15436 %13207
%18357 = OpBitwiseAnd %int %10056 %int_1
%21581 = OpShiftLeftLogical %int %18357 %int_4
%16729 = OpIAdd %int %19760 %21581
%20514 = OpBitwiseAnd %int %16729 %int_n512
%9238 = OpShiftLeftLogical %int %20514 %int_3
%18995 = OpBitwiseAnd %int %10056 %int_16
%12151 = OpShiftLeftLogical %int %18995 %int_7
%16730 = OpIAdd %int %9238 %12151
%19167 = OpBitwiseAnd %int %16729 %int_448
%21582 = OpShiftLeftLogical %int %19167 %int_2
%16708 = OpIAdd %int %16730 %21582
%20611 = OpBitwiseAnd %int %10056 %int_8
%16831 = OpShiftRightArithmetic %int %20611 %int_2
%7916 = OpShiftRightArithmetic %int %6403 %int_3
%13750 = OpIAdd %int %16831 %7916
%21587 = OpBitwiseAnd %int %13750 %int_3
%21583 = OpShiftLeftLogical %int %21587 %int_6
%15437 = OpIAdd %int %16708 %21583
%11782 = OpBitwiseAnd %int %16729 %int_63
%14671 = OpIAdd %int %15437 %11782
%22128 = OpBitcast %uint %14671
OpBranch %21313
%21313 = OpLabel
%9468 = OpPhi %uint %22127 %21373 %22128 %11737
%16296 = OpIMul %v2uint %8041 %6551
%15292 = OpISub %v2uint %23563 %16296
%7303 = OpCompositeExtract %uint %6551 0
%22882 = OpCompositeExtract %uint %6551 1
%13170 = OpIMul %uint %7303 %22882
%15520 = OpIMul %uint %9468 %13170
%16084 = OpCompositeExtract %uint %15292 0
%15890 = OpIMul %uint %16084 %22882
%6886 = OpCompositeExtract %uint %15292 1
%11045 = OpIAdd %uint %15890 %6886
%24733 = OpShiftLeftLogical %uint %11045 %uint_2
%23219 = OpBitwiseAnd %uint %18929 %uint_3
%9559 = OpIAdd %uint %24733 %23219
%16557 = OpShiftLeftLogical %uint %9559 %uint_2
%20138 = OpIAdd %uint %15520 %16557
%17724 = OpIAdd %uint %23432 %20138
%14040 = OpShiftRightLogical %uint %17724 %uint_4
%11766 = OpShiftRightLogical %uint %20387 %uint_2
%8394 = OpBitwiseAnd %uint %11766 %uint_3
%20727 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %14040
%8142 = OpLoad %v4uint %20727
%13760 = OpIEqual %bool %8394 %uint_1
%21366 = OpIEqual %bool %8394 %uint_2
%22150 = OpLogicalOr %bool %13760 %21366
OpSelectionMerge %13411 None
OpBranchConditional %22150 %10583 %13411
%10583 = OpLabel
%18271 = OpBitwiseAnd %v4uint %8142 %2510
%9425 = OpShiftLeftLogical %v4uint %18271 %317
%20652 = OpBitwiseAnd %v4uint %8142 %1838
%17549 = OpShiftRightLogical %v4uint %20652 %317
%16376 = OpBitwiseOr %v4uint %9425 %17549
OpBranch %13411
%13411 = OpLabel
%22649 = OpPhi %v4uint %8142 %21313 %16376 %10583
%19638 = OpIEqual %bool %8394 %uint_3
%15139 = OpLogicalOr %bool %21366 %19638
OpSelectionMerge %13962 None
OpBranchConditional %15139 %11064 %13962
%11064 = OpLabel
%24087 = OpShiftLeftLogical %v4uint %22649 %749
%15335 = OpShiftRightLogical %v4uint %22649 %749
%10728 = OpBitwiseOr %v4uint %24087 %15335
OpBranch %13962
%13962 = OpLabel
%16606 = OpPhi %v4uint %22649 %13411 %10728 %11064
%18240 = OpBitwiseAnd %v4uint %16606 %850
%9137 = OpConvertUToF %v4float %18240
%19365 = OpVectorTimesScalar %v4float %9137 %float_1_52590219en05
%23367 = OpShiftRightLogical %v4uint %16606 %749
%18492 = OpConvertUToF %v4float %23367
%18450 = OpVectorTimesScalar %v4float %18492 %float_1_52590219en05
%6268 = OpCompositeExtract %float %19365 0
%13806 = OpCompositeExtract %float %18450 0
%19232 = OpCompositeConstruct %v2float %6268 %13806
%8561 = OpExtInst %uint %1 PackHalf2x16 %19232
%23487 = OpCompositeExtract %float %19365 1
%14759 = OpCompositeExtract %float %18450 1
%19233 = OpCompositeConstruct %v2float %23487 %14759
%8562 = OpExtInst %uint %1 PackHalf2x16 %19233
%23488 = OpCompositeExtract %float %19365 2
%14760 = OpCompositeExtract %float %18450 2
%19234 = OpCompositeConstruct %v2float %23488 %14760
%8563 = OpExtInst %uint %1 PackHalf2x16 %19234
%23489 = OpCompositeExtract %float %19365 3
%14761 = OpCompositeExtract %float %18450 3
%19213 = OpCompositeConstruct %v2float %23489 %14761
%8430 = OpExtInst %uint %1 PackHalf2x16 %19213
%15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430
%17859 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %21670
OpStore %17859 %15035
%15532 = OpIAdd %uint %21670 %int_1
%6417 = OpUGreaterThan %bool %7303 %uint_1
OpSelectionMerge %24764 DontFlatten
OpBranchConditional %6417 %20612 %20628
%20612 = OpLabel
%13975 = OpUDiv %uint %6638 %7303
%9086 = OpIMul %uint %13975 %7303
%12657 = OpISub %uint %6638 %9086
%9511 = OpIAdd %uint %12657 %uint_1
%13375 = OpIEqual %bool %9511 %7303
OpSelectionMerge %7917 None
OpBranchConditional %13375 %22174 %8593
%22174 = OpLabel
%19289 = OpIMul %uint %uint_32 %7303
%21519 = OpShiftLeftLogical %uint %12657 %uint_4
%18756 = OpISub %uint %19289 %21519
OpBranch %7917
%8593 = OpLabel
OpBranch %7917
%7917 = OpLabel
%10540 = OpPhi %uint %18756 %22174 %uint_16 %8593
OpBranch %24764
%20628 = OpLabel
OpBranch %24764
%24764 = OpLabel
%10684 = OpPhi %uint %10540 %7917 %uint_32 %20628
%18731 = OpIMul %uint %10684 %22882
%16493 = OpShiftRightLogical %uint %18731 %uint_4
%13163 = OpIAdd %uint %14040 %16493
%22298 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %13163
%6578 = OpLoad %v4uint %22298
OpSelectionMerge %14874 None
OpBranchConditional %22150 %10584 %14874
%10584 = OpLabel
%18272 = OpBitwiseAnd %v4uint %6578 %2510
%9426 = OpShiftLeftLogical %v4uint %18272 %317
%20653 = OpBitwiseAnd %v4uint %6578 %1838
%17550 = OpShiftRightLogical %v4uint %20653 %317
%16377 = OpBitwiseOr %v4uint %9426 %17550
OpBranch %14874
%14874 = OpLabel
%10924 = OpPhi %v4uint %6578 %24764 %16377 %10584
OpSelectionMerge %13963 None
OpBranchConditional %15139 %11065 %13963
%11065 = OpLabel
%24088 = OpShiftLeftLogical %v4uint %10924 %749
%15336 = OpShiftRightLogical %v4uint %10924 %749
%10729 = OpBitwiseOr %v4uint %24088 %15336
OpBranch %13963
%13963 = OpLabel
%16607 = OpPhi %v4uint %10924 %14874 %10729 %11065
%18241 = OpBitwiseAnd %v4uint %16607 %850
%9138 = OpConvertUToF %v4float %18241
%19366 = OpVectorTimesScalar %v4float %9138 %float_1_52590219en05
%23368 = OpShiftRightLogical %v4uint %16607 %749
%18493 = OpConvertUToF %v4float %23368
%18451 = OpVectorTimesScalar %v4float %18493 %float_1_52590219en05
%6269 = OpCompositeExtract %float %19366 0
%13807 = OpCompositeExtract %float %18451 0
%19235 = OpCompositeConstruct %v2float %6269 %13807
%8564 = OpExtInst %uint %1 PackHalf2x16 %19235
%23490 = OpCompositeExtract %float %19366 1
%14762 = OpCompositeExtract %float %18451 1
%19236 = OpCompositeConstruct %v2float %23490 %14762
%8565 = OpExtInst %uint %1 PackHalf2x16 %19236
%23491 = OpCompositeExtract %float %19366 2
%14763 = OpCompositeExtract %float %18451 2
%19237 = OpCompositeConstruct %v2float %23491 %14763
%8566 = OpExtInst %uint %1 PackHalf2x16 %19237
%23492 = OpCompositeExtract %float %19366 3
%14764 = OpCompositeExtract %float %18451 3
%19214 = OpCompositeConstruct %v2float %23492 %14764
%8431 = OpExtInst %uint %1 PackHalf2x16 %19214
%15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431
%20158 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %15532
OpStore %20158 %15036
OpBranch %19578
%19578 = OpLabel
OpReturn
OpFunctionEnd
#endif
const uint32_t texture_load_rg16_unorm_float_scaled_cs[] = {
0x07230203, 0x00010000, 0x0008000A, 0x0000625B, 0x00000000, 0x00020011,
0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,
0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,
0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00050048, 0x00000489,
0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001,
0x00000023, 0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023,
0x00000008, 0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C,
0x00050048, 0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048,
0x00000489, 0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489,
0x00000006, 0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007,
0x00000023, 0x00000024, 0x00030047, 0x00000489, 0x00000002, 0x00040047,
0x0000147D, 0x00000022, 0x00000002, 0x00040047, 0x0000147D, 0x00000021,
0x00000000, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,
0x000007DC, 0x00000006, 0x00000010, 0x00040048, 0x000007B4, 0x00000000,
0x00000019, 0x00050048, 0x000007B4, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B4, 0x00000003, 0x00040047, 0x0000140E, 0x00000022,
0x00000000, 0x00040047, 0x0000140E, 0x00000021, 0x00000000, 0x00040047,
0x000007DD, 0x00000006, 0x00000010, 0x00040048, 0x000007B5, 0x00000000,
0x00000018, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B5, 0x00000003, 0x00040047, 0x0000107A, 0x00000022,
0x00000001, 0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047,
0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,
0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,
0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,
0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,
0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,
0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00040017, 0x00000011,
0x0000000B, 0x00000002, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,
0x0000001D, 0x0000000D, 0x00000004, 0x0004002B, 0x0000000B, 0x000001C1,
0x0000FFFF, 0x0004002B, 0x0000000D, 0x0000092A, 0x37800080, 0x0004002B,
0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B, 0x00000A0A,
0x00000000, 0x00040017, 0x00000013, 0x0000000D, 0x00000002, 0x0004002B,
0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A10,
0x00000002, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B,
0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22,
0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B,
0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000B, 0x00000A19,
0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B,
0x0000000C, 0x00000A35, 0x0000000E, 0x0004002B, 0x0000000C, 0x00000A11,
0x00000002, 0x0004002B, 0x0000000C, 0x000009DB, 0xFFFFFFF0, 0x0004002B,
0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A38,
0x0000000F, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B,
0x0000000C, 0x0000040B, 0xFFFFFE00, 0x0004002B, 0x0000000C, 0x00000A14,
0x00000003, 0x0004002B, 0x0000000C, 0x00000A3B, 0x00000010, 0x0004002B,
0x0000000C, 0x00000388, 0x000001C0, 0x0004002B, 0x0000000C, 0x00000A23,
0x00000008, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B,
0x0000000C, 0x00000AC8, 0x0000003F, 0x0004002B, 0x0000000B, 0x00000A16,
0x00000004, 0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006, 0x0004002B,
0x0000000C, 0x0000078B, 0x0FFFFFFF, 0x0004002B, 0x0000000C, 0x00000A05,
0xFFFFFFFE, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x000A001E,
0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00000014,
0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706, 0x00000002,
0x00000489, 0x0004003B, 0x00000706, 0x0000147D, 0x00000002, 0x0004002B,
0x0000000C, 0x00000A0B, 0x00000000, 0x00040020, 0x00000288, 0x00000002,
0x0000000B, 0x0005002C, 0x00000011, 0x0000077B, 0x00000A16, 0x00000A1C,
0x00040020, 0x00000291, 0x00000002, 0x00000014, 0x00040020, 0x00000292,
0x00000001, 0x00000014, 0x0004003B, 0x00000292, 0x00000F48, 0x00000001,
0x0006002C, 0x00000014, 0x00000A2B, 0x00000A13, 0x00000A0A, 0x00000A0A,
0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0003001D, 0x000007DC,
0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A31,
0x00000002, 0x000007B4, 0x0004003B, 0x00000A31, 0x0000140E, 0x00000002,
0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD,
0x00040020, 0x00000A32, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A32,
0x0000107A, 0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017,
0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D,
0x0005002C, 0x00000011, 0x0000074E, 0x00000A13, 0x00000A13, 0x0004002B,
0x0000000B, 0x00000A25, 0x00000009, 0x0007002C, 0x00000017, 0x000009CE,
0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C, 0x00000017,
0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C,
0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD,
0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A,
0x00000A3A, 0x0007002C, 0x00000017, 0x00000352, 0x000001C1, 0x000001C1,
0x000001C1, 0x000001C1, 0x00050036, 0x00000008, 0x0000161F, 0x00000000,
0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000,
0x000300FB, 0x00000A0A, 0x00003B21, 0x000200F8, 0x00003B21, 0x0004003D,
0x00000014, 0x0000312F, 0x00000F48, 0x000500C4, 0x00000014, 0x000027F5,
0x0000312F, 0x00000A2B, 0x00050041, 0x00000291, 0x0000625A, 0x0000147D,
0x00000A17, 0x0004003D, 0x00000014, 0x000059B5, 0x0000625A, 0x0007004F,
0x00000011, 0x00004993, 0x000027F5, 0x000027F5, 0x00000000, 0x00000001,
0x0007004F, 0x00000011, 0x000019E2, 0x000059B5, 0x000059B5, 0x00000000,
0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x00004993, 0x000019E2,
0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x0000188A,
0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x0000188A, 0x000200F8,
0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x0000188A, 0x0004007C,
0x00000016, 0x00001A8B, 0x000027F5, 0x00050041, 0x00000288, 0x00004968,
0x0000147D, 0x00000A1D, 0x0004003D, 0x0000000B, 0x0000263C, 0x00004968,
0x00050051, 0x0000000B, 0x00004F98, 0x000059B5, 0x00000001, 0x00050051,
0x0000000C, 0x00003964, 0x00001A8B, 0x00000000, 0x00050084, 0x0000000C,
0x0000591A, 0x00003964, 0x00000A17, 0x00050051, 0x0000000C, 0x000018DA,
0x00001A8B, 0x00000002, 0x0004007C, 0x0000000C, 0x000038A9, 0x00004F98,
0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051,
0x0000000C, 0x000044BE, 0x00001A8B, 0x00000001, 0x00050080, 0x0000000C,
0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C, 0x00005785,
0x0000263C, 0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785,
0x00050080, 0x0000000C, 0x00001B95, 0x0000591A, 0x00005FD7, 0x0004007C,
0x0000000B, 0x00004B46, 0x00001B95, 0x00050041, 0x00000288, 0x00004C04,
0x0000147D, 0x00000A1A, 0x0004003D, 0x0000000B, 0x0000595B, 0x00004C04,
0x00050080, 0x0000000B, 0x00002145, 0x00004B46, 0x0000595B, 0x000500C2,
0x0000000B, 0x000054A6, 0x00002145, 0x00000A16, 0x00050041, 0x00000288,
0x000047E4, 0x0000147D, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005B88,
0x000047E4, 0x00050041, 0x00000288, 0x000058AC, 0x0000147D, 0x00000A0B,
0x0004003D, 0x0000000B, 0x00004FA3, 0x000058AC, 0x000500C7, 0x0000000B,
0x00005707, 0x00004FA3, 0x00000A10, 0x000500AB, 0x00000009, 0x00004B17,
0x00005707, 0x00000A0A, 0x00050050, 0x00000011, 0x0000435F, 0x00004FA3,
0x00004FA3, 0x000500C2, 0x00000011, 0x000059A3, 0x0000435F, 0x0000077B,
0x000500C7, 0x00000011, 0x00001997, 0x000059A3, 0x0000074E, 0x00050041,
0x00000288, 0x0000492C, 0x0000147D, 0x00000A11, 0x0004003D, 0x0000000B,
0x00005EAC, 0x0000492C, 0x00050041, 0x00000288, 0x00004FEA, 0x0000147D,
0x00000A14, 0x0004003D, 0x0000000B, 0x00005697, 0x00004FEA, 0x00050051,
0x0000000B, 0x000049F1, 0x000027F5, 0x00000000, 0x000500C2, 0x0000000B,
0x000019EE, 0x000049F1, 0x00000A10, 0x00050051, 0x0000000B, 0x00002704,
0x000027F5, 0x00000001, 0x00050050, 0x00000011, 0x00005C0B, 0x000019EE,
0x00002704, 0x00050086, 0x00000011, 0x00001F69, 0x00005C0B, 0x00001997,
0x00050051, 0x0000000B, 0x0000366C, 0x00001F69, 0x00000000, 0x000500C4,
0x0000000B, 0x00004D4D, 0x0000366C, 0x00000A10, 0x00050051, 0x0000000B,
0x000051A9, 0x00001F69, 0x00000001, 0x00050051, 0x0000000B, 0x000059EE,
0x000027F5, 0x00000002, 0x00060050, 0x00000014, 0x000024C9, 0x00004D4D,
0x000051A9, 0x000059EE, 0x000300F7, 0x00005341, 0x00000002, 0x000400FA,
0x00004B17, 0x0000537D, 0x00002DD9, 0x000200F8, 0x0000537D, 0x0004007C,
0x00000016, 0x00002970, 0x000024C9, 0x00050051, 0x0000000C, 0x000042C2,
0x00002970, 0x00000001, 0x000500C3, 0x0000000C, 0x000024FD, 0x000042C2,
0x00000A17, 0x00050051, 0x0000000C, 0x00002747, 0x00002970, 0x00000002,
0x000500C3, 0x0000000C, 0x0000405C, 0x00002747, 0x00000A11, 0x000500C2,
0x0000000B, 0x00005B4D, 0x00005697, 0x00000A16, 0x0004007C, 0x0000000C,
0x000018AA, 0x00005B4D, 0x00050084, 0x0000000C, 0x00005321, 0x0000405C,
0x000018AA, 0x00050080, 0x0000000C, 0x00003B27, 0x000024FD, 0x00005321,
0x000500C2, 0x0000000B, 0x00002348, 0x00005EAC, 0x00000A19, 0x0004007C,
0x0000000C, 0x0000308B, 0x00002348, 0x00050084, 0x0000000C, 0x00002878,
0x00003B27, 0x0000308B, 0x00050051, 0x0000000C, 0x00006242, 0x00002970,
0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A,
0x00050080, 0x0000000C, 0x000049FC, 0x00004FC7, 0x00002878, 0x000500C4,
0x0000000C, 0x0000225D, 0x000049FC, 0x00000A22, 0x000500C7, 0x0000000C,
0x00002CF6, 0x0000225D, 0x0000078B, 0x000500C4, 0x0000000C, 0x000049FA,
0x00002CF6, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00004D38, 0x00006242,
0x00000A20, 0x000500C7, 0x0000000C, 0x00003138, 0x000042C2, 0x00000A1D,
0x000500C4, 0x0000000C, 0x0000454D, 0x00003138, 0x00000A11, 0x00050080,
0x0000000C, 0x0000434B, 0x00004D38, 0x0000454D, 0x000500C4, 0x0000000C,
0x00001B88, 0x0000434B, 0x00000A22, 0x000500C3, 0x0000000C, 0x00005DE3,
0x00001B88, 0x00000A1D, 0x000500C3, 0x0000000C, 0x00002215, 0x000042C2,
0x00000A14, 0x00050080, 0x0000000C, 0x000035A3, 0x00002215, 0x0000405C,
0x000500C7, 0x0000000C, 0x00005A0C, 0x000035A3, 0x00000A0E, 0x000500C3,
0x0000000C, 0x00004112, 0x00006242, 0x00000A14, 0x000500C4, 0x0000000C,
0x0000496A, 0x00005A0C, 0x00000A0E, 0x00050080, 0x0000000C, 0x000034BD,
0x00004112, 0x0000496A, 0x000500C7, 0x0000000C, 0x00004ADD, 0x000034BD,
0x00000A14, 0x000500C4, 0x0000000C, 0x0000544A, 0x00004ADD, 0x00000A0E,
0x00050080, 0x0000000C, 0x00003C4B, 0x00005A0C, 0x0000544A, 0x000500C7,
0x0000000C, 0x0000335E, 0x00005DE3, 0x000009DB, 0x00050080, 0x0000000C,
0x00004F70, 0x000049FA, 0x0000335E, 0x000500C4, 0x0000000C, 0x00005B31,
0x00004F70, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005AEA, 0x00005DE3,
0x00000A38, 0x00050080, 0x0000000C, 0x0000285C, 0x00005B31, 0x00005AEA,
0x000500C7, 0x0000000C, 0x000047B4, 0x00002747, 0x00000A14, 0x000500C4,
0x0000000C, 0x0000544B, 0x000047B4, 0x00000A22, 0x00050080, 0x0000000C,
0x00004157, 0x0000285C, 0x0000544B, 0x000500C7, 0x0000000C, 0x00004ADE,
0x000042C2, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000544C, 0x00004ADE,
0x00000A17, 0x00050080, 0x0000000C, 0x00004158, 0x00004157, 0x0000544C,
0x000500C7, 0x0000000C, 0x00004FD6, 0x00003C4B, 0x00000A0E, 0x000500C4,
0x0000000C, 0x00002703, 0x00004FD6, 0x00000A14, 0x000500C3, 0x0000000C,
0x00003332, 0x00004158, 0x00000A1D, 0x000500C7, 0x0000000C, 0x000036D6,
0x00003332, 0x00000A20, 0x00050080, 0x0000000C, 0x00003412, 0x00002703,
0x000036D6, 0x000500C4, 0x0000000C, 0x00005B32, 0x00003412, 0x00000A14,
0x000500C7, 0x0000000C, 0x00005AB1, 0x00003C4B, 0x00000A05, 0x00050080,
0x0000000C, 0x00002A9C, 0x00005B32, 0x00005AB1, 0x000500C4, 0x0000000C,
0x00005B33, 0x00002A9C, 0x00000A11, 0x000500C7, 0x0000000C, 0x00005AB2,
0x00004158, 0x0000040B, 0x00050080, 0x0000000C, 0x00002A9D, 0x00005B33,
0x00005AB2, 0x000500C4, 0x0000000C, 0x00005B34, 0x00002A9D, 0x00000A14,
0x000500C7, 0x0000000C, 0x00005559, 0x00004158, 0x00000AC8, 0x00050080,
0x0000000C, 0x00005EFA, 0x00005B34, 0x00005559, 0x0004007C, 0x0000000B,
0x0000566F, 0x00005EFA, 0x000200F9, 0x00005341, 0x000200F8, 0x00002DD9,
0x0007004F, 0x00000011, 0x00002621, 0x000024C9, 0x000024C9, 0x00000000,
0x00000001, 0x0004007C, 0x00000012, 0x000059CF, 0x00002621, 0x00050051,
0x0000000C, 0x00001903, 0x000059CF, 0x00000000, 0x000500C3, 0x0000000C,
0x000024FE, 0x00001903, 0x00000A1A, 0x00050051, 0x0000000C, 0x00002748,
0x000059CF, 0x00000001, 0x000500C3, 0x0000000C, 0x0000405D, 0x00002748,
0x00000A1A, 0x000500C2, 0x0000000B, 0x00005B4E, 0x00005EAC, 0x00000A19,
0x0004007C, 0x0000000C, 0x000018AB, 0x00005B4E, 0x00050084, 0x0000000C,
0x00005347, 0x0000405D, 0x000018AB, 0x00050080, 0x0000000C, 0x00003F5E,
0x000024FE, 0x00005347, 0x000500C4, 0x0000000C, 0x00004A8E, 0x00003F5E,
0x00000A25, 0x000500C7, 0x0000000C, 0x00002AB6, 0x00001903, 0x00000A20,
0x000500C7, 0x0000000C, 0x00003139, 0x00002748, 0x00000A35, 0x000500C4,
0x0000000C, 0x0000454E, 0x00003139, 0x00000A11, 0x00050080, 0x0000000C,
0x00004397, 0x00002AB6, 0x0000454E, 0x000500C4, 0x0000000C, 0x000018E7,
0x00004397, 0x00000A10, 0x000500C7, 0x0000000C, 0x000027B1, 0x000018E7,
0x000009DB, 0x000500C4, 0x0000000C, 0x00002F76, 0x000027B1, 0x00000A0E,
0x00050080, 0x0000000C, 0x00003C4C, 0x00004A8E, 0x00002F76, 0x000500C7,
0x0000000C, 0x00003397, 0x000018E7, 0x00000A38, 0x00050080, 0x0000000C,
0x00004D30, 0x00003C4C, 0x00003397, 0x000500C7, 0x0000000C, 0x000047B5,
0x00002748, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000544D, 0x000047B5,
0x00000A17, 0x00050080, 0x0000000C, 0x00004159, 0x00004D30, 0x0000544D,
0x000500C7, 0x0000000C, 0x00005022, 0x00004159, 0x0000040B, 0x000500C4,
0x0000000C, 0x00002416, 0x00005022, 0x00000A14, 0x000500C7, 0x0000000C,
0x00004A33, 0x00002748, 0x00000A3B, 0x000500C4, 0x0000000C, 0x00002F77,
0x00004A33, 0x00000A20, 0x00050080, 0x0000000C, 0x0000415A, 0x00002416,
0x00002F77, 0x000500C7, 0x0000000C, 0x00004ADF, 0x00004159, 0x00000388,
0x000500C4, 0x0000000C, 0x0000544E, 0x00004ADF, 0x00000A11, 0x00050080,
0x0000000C, 0x00004144, 0x0000415A, 0x0000544E, 0x000500C7, 0x0000000C,
0x00005083, 0x00002748, 0x00000A23, 0x000500C3, 0x0000000C, 0x000041BF,
0x00005083, 0x00000A11, 0x000500C3, 0x0000000C, 0x00001EEC, 0x00001903,
0x00000A14, 0x00050080, 0x0000000C, 0x000035B6, 0x000041BF, 0x00001EEC,
0x000500C7, 0x0000000C, 0x00005453, 0x000035B6, 0x00000A14, 0x000500C4,
0x0000000C, 0x0000544F, 0x00005453, 0x00000A1D, 0x00050080, 0x0000000C,
0x00003C4D, 0x00004144, 0x0000544F, 0x000500C7, 0x0000000C, 0x00002E06,
0x00004159, 0x00000AC8, 0x00050080, 0x0000000C, 0x0000394F, 0x00003C4D,
0x00002E06, 0x0004007C, 0x0000000B, 0x00005670, 0x0000394F, 0x000200F9,
0x00005341, 0x000200F8, 0x00005341, 0x000700F5, 0x0000000B, 0x000024FC,
0x0000566F, 0x0000537D, 0x00005670, 0x00002DD9, 0x00050084, 0x00000011,
0x00003FA8, 0x00001F69, 0x00001997, 0x00050082, 0x00000011, 0x00003BBC,
0x00005C0B, 0x00003FA8, 0x00050051, 0x0000000B, 0x00001C87, 0x00001997,
0x00000000, 0x00050051, 0x0000000B, 0x00005962, 0x00001997, 0x00000001,
0x00050084, 0x0000000B, 0x00003372, 0x00001C87, 0x00005962, 0x00050084,
0x0000000B, 0x00003CA0, 0x000024FC, 0x00003372, 0x00050051, 0x0000000B,
0x00003ED4, 0x00003BBC, 0x00000000, 0x00050084, 0x0000000B, 0x00003E12,
0x00003ED4, 0x00005962, 0x00050051, 0x0000000B, 0x00001AE6, 0x00003BBC,
0x00000001, 0x00050080, 0x0000000B, 0x00002B25, 0x00003E12, 0x00001AE6,
0x000500C4, 0x0000000B, 0x0000609D, 0x00002B25, 0x00000A10, 0x000500C7,
0x0000000B, 0x00005AB3, 0x000049F1, 0x00000A13, 0x00050080, 0x0000000B,
0x00002557, 0x0000609D, 0x00005AB3, 0x000500C4, 0x0000000B, 0x000040AD,
0x00002557, 0x00000A10, 0x00050080, 0x0000000B, 0x00004EAA, 0x00003CA0,
0x000040AD, 0x00050080, 0x0000000B, 0x0000453C, 0x00005B88, 0x00004EAA,
0x000500C2, 0x0000000B, 0x000036D8, 0x0000453C, 0x00000A16, 0x000500C2,
0x0000000B, 0x00002DF6, 0x00004FA3, 0x00000A10, 0x000500C7, 0x0000000B,
0x000020CA, 0x00002DF6, 0x00000A13, 0x00060041, 0x00000294, 0x000050F7,
0x0000107A, 0x00000A0B, 0x000036D8, 0x0004003D, 0x00000017, 0x00001FCE,
0x000050F7, 0x000500AA, 0x00000009, 0x000035C0, 0x000020CA, 0x00000A0D,
0x000500AA, 0x00000009, 0x00005376, 0x000020CA, 0x00000A10, 0x000500A6,
0x00000009, 0x00005686, 0x000035C0, 0x00005376, 0x000300F7, 0x00003463,
0x00000000, 0x000400FA, 0x00005686, 0x00002957, 0x00003463, 0x000200F8,
0x00002957, 0x000500C7, 0x00000017, 0x0000475F, 0x00001FCE, 0x000009CE,
0x000500C4, 0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7,
0x00000017, 0x000050AC, 0x00001FCE, 0x0000072E, 0x000500C2, 0x00000017,
0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8,
0x000024D1, 0x0000448D, 0x000200F9, 0x00003463, 0x000200F8, 0x00003463,
0x000700F5, 0x00000017, 0x00005879, 0x00001FCE, 0x00005341, 0x00003FF8,
0x00002957, 0x000500AA, 0x00000009, 0x00004CB6, 0x000020CA, 0x00000A13,
0x000500A6, 0x00000009, 0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7,
0x0000368A, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B38, 0x0000368A,
0x000200F8, 0x00002B38, 0x000500C4, 0x00000017, 0x00005E17, 0x00005879,
0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7, 0x00005879, 0x000002ED,
0x000500C5, 0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9,
0x0000368A, 0x000200F8, 0x0000368A, 0x000700F5, 0x00000017, 0x000040DE,
0x00005879, 0x00003463, 0x000029E8, 0x00002B38, 0x000500C7, 0x00000017,
0x00004740, 0x000040DE, 0x00000352, 0x00040070, 0x0000001D, 0x000023B1,
0x00004740, 0x0005008E, 0x0000001D, 0x00004BA5, 0x000023B1, 0x0000092A,
0x000500C2, 0x00000017, 0x00005B47, 0x000040DE, 0x000002ED, 0x00040070,
0x0000001D, 0x0000483C, 0x00005B47, 0x0005008E, 0x0000001D, 0x00004812,
0x0000483C, 0x0000092A, 0x00050051, 0x0000000D, 0x0000187C, 0x00004BA5,
0x00000000, 0x00050051, 0x0000000D, 0x000035EE, 0x00004812, 0x00000000,
0x00050050, 0x00000013, 0x00004B20, 0x0000187C, 0x000035EE, 0x0006000C,
0x0000000B, 0x00002171, 0x00000001, 0x0000003A, 0x00004B20, 0x00050051,
0x0000000D, 0x00005BBF, 0x00004BA5, 0x00000001, 0x00050051, 0x0000000D,
0x000039A7, 0x00004812, 0x00000001, 0x00050050, 0x00000013, 0x00004B21,
0x00005BBF, 0x000039A7, 0x0006000C, 0x0000000B, 0x00002172, 0x00000001,
0x0000003A, 0x00004B21, 0x00050051, 0x0000000D, 0x00005BC0, 0x00004BA5,
0x00000002, 0x00050051, 0x0000000D, 0x000039A8, 0x00004812, 0x00000002,
0x00050050, 0x00000013, 0x00004B22, 0x00005BC0, 0x000039A8, 0x0006000C,
0x0000000B, 0x00002173, 0x00000001, 0x0000003A, 0x00004B22, 0x00050051,
0x0000000D, 0x00005BC1, 0x00004BA5, 0x00000003, 0x00050051, 0x0000000D,
0x000039A9, 0x00004812, 0x00000003, 0x00050050, 0x00000013, 0x00004B0D,
0x00005BC1, 0x000039A9, 0x0006000C, 0x0000000B, 0x000020EE, 0x00000001,
0x0000003A, 0x00004B0D, 0x00070050, 0x00000017, 0x00003ABB, 0x00002171,
0x00002172, 0x00002173, 0x000020EE, 0x00060041, 0x00000294, 0x000045C3,
0x0000140E, 0x00000A0B, 0x000054A6, 0x0003003E, 0x000045C3, 0x00003ABB,
0x00050080, 0x0000000B, 0x00003CAC, 0x000054A6, 0x00000A0E, 0x000500AC,
0x00000009, 0x00001911, 0x00001C87, 0x00000A0D, 0x000300F7, 0x000060BC,
0x00000002, 0x000400FA, 0x00001911, 0x00005084, 0x00005094, 0x000200F8,
0x00005084, 0x00050086, 0x0000000B, 0x00003697, 0x000019EE, 0x00001C87,
0x00050084, 0x0000000B, 0x0000237E, 0x00003697, 0x00001C87, 0x00050082,
0x0000000B, 0x00003171, 0x000019EE, 0x0000237E, 0x00050080, 0x0000000B,
0x00002527, 0x00003171, 0x00000A0D, 0x000500AA, 0x00000009, 0x0000343F,
0x00002527, 0x00001C87, 0x000300F7, 0x00001EED, 0x00000000, 0x000400FA,
0x0000343F, 0x0000569E, 0x00002191, 0x000200F8, 0x0000569E, 0x00050084,
0x0000000B, 0x00004B59, 0x00000A6A, 0x00001C87, 0x000500C4, 0x0000000B,
0x0000540F, 0x00003171, 0x00000A16, 0x00050082, 0x0000000B, 0x00004944,
0x00004B59, 0x0000540F, 0x000200F9, 0x00001EED, 0x000200F8, 0x00002191,
0x000200F9, 0x00001EED, 0x000200F8, 0x00001EED, 0x000700F5, 0x0000000B,
0x0000292C, 0x00004944, 0x0000569E, 0x00000A3A, 0x00002191, 0x000200F9,
0x000060BC, 0x000200F8, 0x00005094, 0x000200F9, 0x000060BC, 0x000200F8,
0x000060BC, 0x000700F5, 0x0000000B, 0x000029BC, 0x0000292C, 0x00001EED,
0x00000A6A, 0x00005094, 0x00050084, 0x0000000B, 0x0000492B, 0x000029BC,
0x00005962, 0x000500C2, 0x0000000B, 0x0000406D, 0x0000492B, 0x00000A16,
0x00050080, 0x0000000B, 0x0000336B, 0x000036D8, 0x0000406D, 0x00060041,
0x00000294, 0x0000571A, 0x0000107A, 0x00000A0B, 0x0000336B, 0x0004003D,
0x00000017, 0x000019B2, 0x0000571A, 0x000300F7, 0x00003A1A, 0x00000000,
0x000400FA, 0x00005686, 0x00002958, 0x00003A1A, 0x000200F8, 0x00002958,
0x000500C7, 0x00000017, 0x00004760, 0x000019B2, 0x000009CE, 0x000500C4,
0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017,
0x000050AD, 0x000019B2, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E,
0x000050AD, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2,
0x0000448E, 0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5,
0x00000017, 0x00002AAC, 0x000019B2, 0x000060BC, 0x00003FF9, 0x00002958,
0x000300F7, 0x0000368B, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39,
0x0000368B, 0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18,
0x00002AAC, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC,
0x000002ED, 0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8,
0x000200F9, 0x0000368B, 0x000200F8, 0x0000368B, 0x000700F5, 0x00000017,
0x000040DF, 0x00002AAC, 0x00003A1A, 0x000029E9, 0x00002B39, 0x000500C7,
0x00000017, 0x00004741, 0x000040DF, 0x00000352, 0x00040070, 0x0000001D,
0x000023B2, 0x00004741, 0x0005008E, 0x0000001D, 0x00004BA6, 0x000023B2,
0x0000092A, 0x000500C2, 0x00000017, 0x00005B48, 0x000040DF, 0x000002ED,
0x00040070, 0x0000001D, 0x0000483D, 0x00005B48, 0x0005008E, 0x0000001D,
0x00004813, 0x0000483D, 0x0000092A, 0x00050051, 0x0000000D, 0x0000187D,
0x00004BA6, 0x00000000, 0x00050051, 0x0000000D, 0x000035EF, 0x00004813,
0x00000000, 0x00050050, 0x00000013, 0x00004B23, 0x0000187D, 0x000035EF,
0x0006000C, 0x0000000B, 0x00002174, 0x00000001, 0x0000003A, 0x00004B23,
0x00050051, 0x0000000D, 0x00005BC2, 0x00004BA6, 0x00000001, 0x00050051,
0x0000000D, 0x000039AA, 0x00004813, 0x00000001, 0x00050050, 0x00000013,
0x00004B24, 0x00005BC2, 0x000039AA, 0x0006000C, 0x0000000B, 0x00002175,
0x00000001, 0x0000003A, 0x00004B24, 0x00050051, 0x0000000D, 0x00005BC3,
0x00004BA6, 0x00000002, 0x00050051, 0x0000000D, 0x000039AB, 0x00004813,
0x00000002, 0x00050050, 0x00000013, 0x00004B25, 0x00005BC3, 0x000039AB,
0x0006000C, 0x0000000B, 0x00002176, 0x00000001, 0x0000003A, 0x00004B25,
0x00050051, 0x0000000D, 0x00005BC4, 0x00004BA6, 0x00000003, 0x00050051,
0x0000000D, 0x000039AC, 0x00004813, 0x00000003, 0x00050050, 0x00000013,
0x00004B0E, 0x00005BC4, 0x000039AC, 0x0006000C, 0x0000000B, 0x000020EF,
0x00000001, 0x0000003A, 0x00004B0E, 0x00070050, 0x00000017, 0x00003ABC,
0x00002174, 0x00002175, 0x00002176, 0x000020EF, 0x00060041, 0x00000294,
0x00004EBE, 0x0000140E, 0x00000A0B, 0x00003CAC, 0x0003003E, 0x00004EBE,
0x00003ABC, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD,
0x00010038,
};

View File

@ -0,0 +1,703 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 10
; Bound: 25179
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %5663 "main" %gl_GlobalInvocationID
OpExecutionMode %5663 LocalSize 8 32 1
OpMemberDecorate %_struct_1161 0 Offset 0
OpMemberDecorate %_struct_1161 1 Offset 4
OpMemberDecorate %_struct_1161 2 Offset 8
OpMemberDecorate %_struct_1161 3 Offset 12
OpMemberDecorate %_struct_1161 4 Offset 16
OpMemberDecorate %_struct_1161 5 Offset 28
OpMemberDecorate %_struct_1161 6 Offset 32
OpMemberDecorate %_struct_1161 7 Offset 36
OpDecorate %_struct_1161 Block
OpDecorate %5245 DescriptorSet 2
OpDecorate %5245 Binding 0
OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
OpDecorate %_runtimearr_v4uint ArrayStride 16
OpMemberDecorate %_struct_1972 0 NonReadable
OpMemberDecorate %_struct_1972 0 Offset 0
OpDecorate %_struct_1972 BufferBlock
OpDecorate %5134 DescriptorSet 0
OpDecorate %5134 Binding 0
OpDecorate %_runtimearr_v4uint_0 ArrayStride 16
OpMemberDecorate %_struct_1973 0 NonWritable
OpMemberDecorate %_struct_1973 0 Offset 0
OpDecorate %_struct_1973 BufferBlock
OpDecorate %4218 DescriptorSet 1
OpDecorate %4218 Binding 0
OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%v4uint = OpTypeVector %uint 4
%int = OpTypeInt 32 1
%v2int = OpTypeVector %int 2
%v3int = OpTypeVector %int 3
%bool = OpTypeBool
%v3uint = OpTypeVector %uint 3
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%float_n1 = OpConstant %float -1
%1284 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1
%v4int = OpTypeVector %int 4
%int_16 = OpConstant %int 16
%float_3_05185094en05 = OpConstant %float 3.05185094e-05
%uint_0 = OpConstant %uint 0
%v2float = OpTypeVector %float 2
%uint_1 = OpConstant %uint 1
%uint_2 = OpConstant %uint 2
%uint_3 = OpConstant %uint 3
%uint_16711935 = OpConstant %uint 16711935
%uint_8 = OpConstant %uint 8
%uint_4278255360 = OpConstant %uint 4278255360
%uint_16 = OpConstant %uint 16
%int_5 = OpConstant %int 5
%uint_5 = OpConstant %uint 5
%int_7 = OpConstant %int 7
%int_14 = OpConstant %int 14
%int_2 = OpConstant %int 2
%int_n16 = OpConstant %int -16
%int_1 = OpConstant %int 1
%int_15 = OpConstant %int 15
%int_4 = OpConstant %int 4
%int_n512 = OpConstant %int -512
%int_3 = OpConstant %int 3
%int_448 = OpConstant %int 448
%int_8 = OpConstant %int 8
%int_6 = OpConstant %int 6
%int_63 = OpConstant %int 63
%uint_4 = OpConstant %uint 4
%int_268435455 = OpConstant %int 268435455
%int_n2 = OpConstant %int -2
%uint_32 = OpConstant %uint 32
%_struct_1161 = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint
%_ptr_Uniform__struct_1161 = OpTypePointer Uniform %_struct_1161
%5245 = OpVariable %_ptr_Uniform__struct_1161 Uniform
%int_0 = OpConstant %int 0
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
%v2uint = OpTypeVector %uint 2
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
%2596 = OpConstantComposite %v3uint %uint_2 %uint_0 %uint_0
%v2bool = OpTypeVector %bool 2
%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint
%_struct_1972 = OpTypeStruct %_runtimearr_v4uint
%_ptr_Uniform__struct_1972 = OpTypePointer Uniform %_struct_1972
%5134 = OpVariable %_ptr_Uniform__struct_1972 Uniform
%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint
%_struct_1973 = OpTypeStruct %_runtimearr_v4uint_0
%_ptr_Uniform__struct_1973 = OpTypePointer Uniform %_struct_1973
%4218 = OpVariable %_ptr_Uniform__struct_1973 Uniform
%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_32 %uint_1
%uint_9 = OpConstant %uint 9
%uint_10 = OpConstant %uint 10
%2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935
%317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8
%1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360
%749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16
%770 = OpConstantComposite %v4int %int_16 %int_16 %int_16 %int_16
%5663 = OpFunction %void None %1282
%15110 = OpLabel
OpSelectionMerge %19578 None
OpSwitch %uint_0 %15137
%15137 = OpLabel
%12591 = OpLoad %v3uint %gl_GlobalInvocationID
%10229 = OpShiftLeftLogical %v3uint %12591 %2596
%25178 = OpAccessChain %_ptr_Uniform_v3uint %5245 %int_4
%22965 = OpLoad %v3uint %25178
%18835 = OpVectorShuffle %v2uint %10229 %10229 0 1
%6626 = OpVectorShuffle %v2uint %22965 %22965 0 1
%17032 = OpUGreaterThanEqual %v2bool %18835 %6626
%24679 = OpAny %bool %17032
OpSelectionMerge %6282 DontFlatten
OpBranchConditional %24679 %21992 %6282
%21992 = OpLabel
OpBranch %19578
%6282 = OpLabel
%6795 = OpBitcast %v3int %10229
%18792 = OpAccessChain %_ptr_Uniform_uint %5245 %int_6
%9788 = OpLoad %uint %18792
%20376 = OpCompositeExtract %uint %22965 1
%14692 = OpCompositeExtract %int %6795 0
%22810 = OpIMul %int %14692 %int_8
%6362 = OpCompositeExtract %int %6795 2
%14505 = OpBitcast %int %20376
%11279 = OpIMul %int %6362 %14505
%17598 = OpCompositeExtract %int %6795 1
%22228 = OpIAdd %int %11279 %17598
%22405 = OpBitcast %int %9788
%24535 = OpIMul %int %22228 %22405
%7061 = OpIAdd %int %22810 %24535
%19270 = OpBitcast %uint %7061
%19460 = OpAccessChain %_ptr_Uniform_uint %5245 %int_5
%22875 = OpLoad %uint %19460
%8517 = OpIAdd %uint %19270 %22875
%21670 = OpShiftRightLogical %uint %8517 %uint_4
%20950 = OpAccessChain %_ptr_Uniform_uint %5245 %int_0
%21411 = OpLoad %uint %20950
%6381 = OpBitwiseAnd %uint %21411 %uint_1
%10467 = OpINotEqual %bool %6381 %uint_0
OpSelectionMerge %23266 DontFlatten
OpBranchConditional %10467 %10108 %10765
%10108 = OpLabel
%23508 = OpBitwiseAnd %uint %21411 %uint_2
%16300 = OpINotEqual %bool %23508 %uint_0
OpSelectionMerge %7691 DontFlatten
OpBranchConditional %16300 %12129 %25128
%12129 = OpLabel
%18210 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%15627 = OpLoad %uint %18210
%22624 = OpAccessChain %_ptr_Uniform_uint %5245 %int_3
%21535 = OpLoad %uint %22624
%14923 = OpShiftRightArithmetic %int %17598 %int_4
%18773 = OpShiftRightArithmetic %int %6362 %int_2
%18759 = OpShiftRightLogical %uint %21535 %uint_4
%6314 = OpBitcast %int %18759
%21281 = OpIMul %int %18773 %6314
%15143 = OpIAdd %int %14923 %21281
%9032 = OpShiftRightLogical %uint %15627 %uint_5
%14593 = OpBitcast %int %9032
%8436 = OpIMul %int %15143 %14593
%12986 = OpShiftRightArithmetic %int %14692 %int_5
%24558 = OpIAdd %int %12986 %8436
%8797 = OpShiftLeftLogical %int %24558 %uint_9
%11510 = OpBitwiseAnd %int %8797 %int_268435455
%18938 = OpShiftLeftLogical %int %11510 %int_1
%19768 = OpBitwiseAnd %int %14692 %int_7
%12600 = OpBitwiseAnd %int %17598 %int_6
%17741 = OpShiftLeftLogical %int %12600 %int_2
%17227 = OpIAdd %int %19768 %17741
%7048 = OpShiftLeftLogical %int %17227 %uint_9
%24035 = OpShiftRightArithmetic %int %7048 %int_6
%8725 = OpShiftRightArithmetic %int %17598 %int_3
%13731 = OpIAdd %int %8725 %18773
%23052 = OpBitwiseAnd %int %13731 %int_1
%16658 = OpShiftRightArithmetic %int %14692 %int_3
%18794 = OpShiftLeftLogical %int %23052 %int_1
%13501 = OpIAdd %int %16658 %18794
%19165 = OpBitwiseAnd %int %13501 %int_3
%21578 = OpShiftLeftLogical %int %19165 %int_1
%15435 = OpIAdd %int %23052 %21578
%13150 = OpBitwiseAnd %int %24035 %int_n16
%20336 = OpIAdd %int %18938 %13150
%23345 = OpShiftLeftLogical %int %20336 %int_1
%23274 = OpBitwiseAnd %int %24035 %int_15
%10332 = OpIAdd %int %23345 %23274
%18356 = OpBitwiseAnd %int %6362 %int_3
%21579 = OpShiftLeftLogical %int %18356 %uint_9
%16727 = OpIAdd %int %10332 %21579
%19166 = OpBitwiseAnd %int %17598 %int_1
%21580 = OpShiftLeftLogical %int %19166 %int_4
%16728 = OpIAdd %int %16727 %21580
%20438 = OpBitwiseAnd %int %15435 %int_1
%9987 = OpShiftLeftLogical %int %20438 %int_3
%13106 = OpShiftRightArithmetic %int %16728 %int_6
%14038 = OpBitwiseAnd %int %13106 %int_7
%13330 = OpIAdd %int %9987 %14038
%23346 = OpShiftLeftLogical %int %13330 %int_3
%23217 = OpBitwiseAnd %int %15435 %int_n2
%10908 = OpIAdd %int %23346 %23217
%23347 = OpShiftLeftLogical %int %10908 %int_2
%23218 = OpBitwiseAnd %int %16728 %int_n512
%10909 = OpIAdd %int %23347 %23218
%23348 = OpShiftLeftLogical %int %10909 %int_3
%24224 = OpBitwiseAnd %int %16728 %int_63
%21741 = OpIAdd %int %23348 %24224
OpBranch %7691
%25128 = OpLabel
%6796 = OpBitcast %v2int %18835
%18793 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%11954 = OpLoad %uint %18793
%18756 = OpCompositeExtract %int %6796 0
%19701 = OpShiftRightArithmetic %int %18756 %int_5
%10055 = OpCompositeExtract %int %6796 1
%16476 = OpShiftRightArithmetic %int %10055 %int_5
%23373 = OpShiftRightLogical %uint %11954 %uint_5
%6315 = OpBitcast %int %23373
%21319 = OpIMul %int %16476 %6315
%16222 = OpIAdd %int %19701 %21319
%19086 = OpShiftLeftLogical %int %16222 %uint_10
%10934 = OpBitwiseAnd %int %18756 %int_7
%12601 = OpBitwiseAnd %int %10055 %int_14
%17742 = OpShiftLeftLogical %int %12601 %int_2
%17303 = OpIAdd %int %10934 %17742
%6375 = OpShiftLeftLogical %int %17303 %uint_3
%10161 = OpBitwiseAnd %int %6375 %int_n16
%12150 = OpShiftLeftLogical %int %10161 %int_1
%15436 = OpIAdd %int %19086 %12150
%13207 = OpBitwiseAnd %int %6375 %int_15
%19760 = OpIAdd %int %15436 %13207
%18357 = OpBitwiseAnd %int %10055 %int_1
%21581 = OpShiftLeftLogical %int %18357 %int_4
%16729 = OpIAdd %int %19760 %21581
%20514 = OpBitwiseAnd %int %16729 %int_n512
%9238 = OpShiftLeftLogical %int %20514 %int_3
%18995 = OpBitwiseAnd %int %10055 %int_16
%12151 = OpShiftLeftLogical %int %18995 %int_7
%16730 = OpIAdd %int %9238 %12151
%19167 = OpBitwiseAnd %int %16729 %int_448
%21582 = OpShiftLeftLogical %int %19167 %int_2
%16708 = OpIAdd %int %16730 %21582
%20611 = OpBitwiseAnd %int %10055 %int_8
%16831 = OpShiftRightArithmetic %int %20611 %int_2
%7916 = OpShiftRightArithmetic %int %18756 %int_3
%13750 = OpIAdd %int %16831 %7916
%21587 = OpBitwiseAnd %int %13750 %int_3
%21583 = OpShiftLeftLogical %int %21587 %int_6
%15437 = OpIAdd %int %16708 %21583
%14157 = OpBitwiseAnd %int %16729 %int_63
%12098 = OpIAdd %int %15437 %14157
OpBranch %7691
%7691 = OpLabel
%10540 = OpPhi %int %21741 %12129 %12098 %25128
OpBranch %23266
%10765 = OpLabel
%20632 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%15628 = OpLoad %uint %20632
%21275 = OpAccessChain %_ptr_Uniform_uint %5245 %int_3
%13550 = OpLoad %uint %21275
%15070 = OpBitcast %int %13550
%18927 = OpIMul %int %6362 %15070
%8334 = OpIAdd %int %18927 %17598
%8952 = OpBitcast %int %15628
%7839 = OpIMul %int %8334 %8952
%7984 = OpIAdd %int %22810 %7839
OpBranch %23266
%23266 = OpLabel
%19748 = OpPhi %int %10540 %7691 %7984 %10765
%24922 = OpAccessChain %_ptr_Uniform_uint %5245 %int_1
%7502 = OpLoad %uint %24922
%15686 = OpBitcast %int %7502
%15579 = OpIAdd %int %15686 %19748
%18556 = OpBitcast %uint %15579
%21493 = OpShiftRightLogical %uint %18556 %uint_4
%14997 = OpShiftRightLogical %uint %21411 %uint_2
%8394 = OpBitwiseAnd %uint %14997 %uint_3
%20727 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %21493
%8142 = OpLoad %v4uint %20727
%13760 = OpIEqual %bool %8394 %uint_1
%21366 = OpIEqual %bool %8394 %uint_2
%22150 = OpLogicalOr %bool %13760 %21366
OpSelectionMerge %13411 None
OpBranchConditional %22150 %10583 %13411
%10583 = OpLabel
%18271 = OpBitwiseAnd %v4uint %8142 %2510
%9425 = OpShiftLeftLogical %v4uint %18271 %317
%20652 = OpBitwiseAnd %v4uint %8142 %1838
%17549 = OpShiftRightLogical %v4uint %20652 %317
%16376 = OpBitwiseOr %v4uint %9425 %17549
OpBranch %13411
%13411 = OpLabel
%22649 = OpPhi %v4uint %8142 %23266 %16376 %10583
%19638 = OpIEqual %bool %8394 %uint_3
%15139 = OpLogicalOr %bool %21366 %19638
OpSelectionMerge %12537 None
OpBranchConditional %15139 %11064 %12537
%11064 = OpLabel
%24087 = OpShiftLeftLogical %v4uint %22649 %749
%15335 = OpShiftRightLogical %v4uint %22649 %749
%10728 = OpBitwiseOr %v4uint %24087 %15335
OpBranch %12537
%12537 = OpLabel
%12106 = OpPhi %v4uint %22649 %13411 %10728 %11064
%15375 = OpBitcast %v4int %12106
%16910 = OpShiftLeftLogical %v4int %15375 %770
%16536 = OpShiftRightArithmetic %v4int %16910 %770
%10903 = OpConvertSToF %v4float %16536
%20413 = OpVectorTimesScalar %v4float %10903 %float_3_05185094en05
%23989 = OpExtInst %v4float %1 FMax %1284 %20413
%14338 = OpShiftRightArithmetic %v4int %15375 %770
%6607 = OpConvertSToF %v4float %14338
%18247 = OpVectorTimesScalar %v4float %6607 %float_3_05185094en05
%24070 = OpExtInst %v4float %1 FMax %1284 %18247
%24330 = OpCompositeExtract %float %23989 0
%14319 = OpCompositeExtract %float %24070 0
%19232 = OpCompositeConstruct %v2float %24330 %14319
%8561 = OpExtInst %uint %1 PackHalf2x16 %19232
%23487 = OpCompositeExtract %float %23989 1
%14759 = OpCompositeExtract %float %24070 1
%19233 = OpCompositeConstruct %v2float %23487 %14759
%8562 = OpExtInst %uint %1 PackHalf2x16 %19233
%23488 = OpCompositeExtract %float %23989 2
%14760 = OpCompositeExtract %float %24070 2
%19234 = OpCompositeConstruct %v2float %23488 %14760
%8563 = OpExtInst %uint %1 PackHalf2x16 %19234
%23489 = OpCompositeExtract %float %23989 3
%14761 = OpCompositeExtract %float %24070 3
%19213 = OpCompositeConstruct %v2float %23489 %14761
%8430 = OpExtInst %uint %1 PackHalf2x16 %19213
%15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430
%17859 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %21670
OpStore %17859 %15035
%15044 = OpIAdd %uint %21670 %int_1
%18776 = OpSelect %uint %10467 %uint_32 %uint_16
%11803 = OpShiftRightLogical %uint %18776 %uint_4
%13947 = OpIAdd %uint %21493 %11803
%22298 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %13947
%6578 = OpLoad %v4uint %22298
OpSelectionMerge %14874 None
OpBranchConditional %22150 %10584 %14874
%10584 = OpLabel
%18272 = OpBitwiseAnd %v4uint %6578 %2510
%9426 = OpShiftLeftLogical %v4uint %18272 %317
%20653 = OpBitwiseAnd %v4uint %6578 %1838
%17550 = OpShiftRightLogical %v4uint %20653 %317
%16377 = OpBitwiseOr %v4uint %9426 %17550
OpBranch %14874
%14874 = OpLabel
%10924 = OpPhi %v4uint %6578 %12537 %16377 %10584
OpSelectionMerge %12538 None
OpBranchConditional %15139 %11065 %12538
%11065 = OpLabel
%24088 = OpShiftLeftLogical %v4uint %10924 %749
%15336 = OpShiftRightLogical %v4uint %10924 %749
%10729 = OpBitwiseOr %v4uint %24088 %15336
OpBranch %12538
%12538 = OpLabel
%12107 = OpPhi %v4uint %10924 %14874 %10729 %11065
%15376 = OpBitcast %v4int %12107
%16911 = OpShiftLeftLogical %v4int %15376 %770
%16537 = OpShiftRightArithmetic %v4int %16911 %770
%10904 = OpConvertSToF %v4float %16537
%20414 = OpVectorTimesScalar %v4float %10904 %float_3_05185094en05
%23990 = OpExtInst %v4float %1 FMax %1284 %20414
%14339 = OpShiftRightArithmetic %v4int %15376 %770
%6608 = OpConvertSToF %v4float %14339
%18248 = OpVectorTimesScalar %v4float %6608 %float_3_05185094en05
%24071 = OpExtInst %v4float %1 FMax %1284 %18248
%24331 = OpCompositeExtract %float %23990 0
%14320 = OpCompositeExtract %float %24071 0
%19235 = OpCompositeConstruct %v2float %24331 %14320
%8564 = OpExtInst %uint %1 PackHalf2x16 %19235
%23490 = OpCompositeExtract %float %23990 1
%14762 = OpCompositeExtract %float %24071 1
%19236 = OpCompositeConstruct %v2float %23490 %14762
%8565 = OpExtInst %uint %1 PackHalf2x16 %19236
%23491 = OpCompositeExtract %float %23990 2
%14763 = OpCompositeExtract %float %24071 2
%19237 = OpCompositeConstruct %v2float %23491 %14763
%8566 = OpExtInst %uint %1 PackHalf2x16 %19237
%23492 = OpCompositeExtract %float %23990 3
%14764 = OpCompositeExtract %float %24071 3
%19214 = OpCompositeConstruct %v2float %23492 %14764
%8431 = OpExtInst %uint %1 PackHalf2x16 %19214
%15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431
%20158 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %15044
OpStore %20158 %15036
OpBranch %19578
%19578 = OpLabel
OpReturn
OpFunctionEnd
#endif
const uint32_t texture_load_rgba16_snorm_float_cs[] = {
0x07230203, 0x00010000, 0x0008000A, 0x0000625B, 0x00000000, 0x00020011,
0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,
0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,
0x00000011, 0x00000008, 0x00000020, 0x00000001, 0x00050048, 0x00000489,
0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001,
0x00000023, 0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023,
0x00000008, 0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C,
0x00050048, 0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048,
0x00000489, 0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489,
0x00000006, 0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007,
0x00000023, 0x00000024, 0x00030047, 0x00000489, 0x00000002, 0x00040047,
0x0000147D, 0x00000022, 0x00000002, 0x00040047, 0x0000147D, 0x00000021,
0x00000000, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,
0x000007DC, 0x00000006, 0x00000010, 0x00040048, 0x000007B4, 0x00000000,
0x00000019, 0x00050048, 0x000007B4, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B4, 0x00000003, 0x00040047, 0x0000140E, 0x00000022,
0x00000000, 0x00040047, 0x0000140E, 0x00000021, 0x00000000, 0x00040047,
0x000007DD, 0x00000006, 0x00000010, 0x00040048, 0x000007B5, 0x00000000,
0x00000018, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B5, 0x00000003, 0x00040047, 0x0000107A, 0x00000022,
0x00000001, 0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047,
0x00000024, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,
0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,
0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,
0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,
0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,
0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00030016, 0x0000000D,
0x00000020, 0x00040017, 0x0000001D, 0x0000000D, 0x00000004, 0x0004002B,
0x0000000D, 0x00000341, 0xBF800000, 0x0007002C, 0x0000001D, 0x00000504,
0x00000341, 0x00000341, 0x00000341, 0x00000341, 0x00040017, 0x0000001A,
0x0000000C, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A3B, 0x00000010,
0x0004002B, 0x0000000D, 0x00000A38, 0x38000100, 0x0004002B, 0x0000000B,
0x00000A0A, 0x00000000, 0x00040017, 0x00000013, 0x0000000D, 0x00000002,
0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B,
0x00000A10, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003,
0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B,
0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00,
0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000C,
0x00000A1A, 0x00000005, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005,
0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C,
0x00000A35, 0x0000000E, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002,
0x0004002B, 0x0000000C, 0x000009DB, 0xFFFFFFF0, 0x0004002B, 0x0000000C,
0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A39, 0x0000000F,
0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,
0x0000040B, 0xFFFFFE00, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003,
0x0004002B, 0x0000000C, 0x00000388, 0x000001C0, 0x0004002B, 0x0000000C,
0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006,
0x0004002B, 0x0000000C, 0x00000AC8, 0x0000003F, 0x0004002B, 0x0000000B,
0x00000A16, 0x00000004, 0x0004002B, 0x0000000C, 0x0000078B, 0x0FFFFFFF,
0x0004002B, 0x0000000C, 0x00000A05, 0xFFFFFFFE, 0x0004002B, 0x0000000B,
0x00000A6A, 0x00000020, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B,
0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B,
0x00040020, 0x00000706, 0x00000002, 0x00000489, 0x0004003B, 0x00000706,
0x0000147D, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,
0x00040020, 0x00000288, 0x00000002, 0x0000000B, 0x00040020, 0x00000291,
0x00000002, 0x00000014, 0x00040017, 0x00000011, 0x0000000B, 0x00000002,
0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B, 0x00000292,
0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A24, 0x00000A10,
0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009, 0x00000002,
0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC,
0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A31,
0x0000140E, 0x00000002, 0x0003001D, 0x000007DD, 0x00000017, 0x0003001E,
0x000007B5, 0x000007DD, 0x00040020, 0x00000A32, 0x00000002, 0x000007B5,
0x0004003B, 0x00000A32, 0x0000107A, 0x00000002, 0x00040020, 0x00000294,
0x00000002, 0x00000017, 0x0006002C, 0x00000014, 0x00000024, 0x00000A22,
0x00000A6A, 0x00000A0D, 0x0004002B, 0x0000000B, 0x00000A25, 0x00000009,
0x0004002B, 0x0000000B, 0x00000A28, 0x0000000A, 0x0007002C, 0x00000017,
0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C,
0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22,
0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD,
0x000005FD, 0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A,
0x00000A3A, 0x00000A3A, 0x0007002C, 0x0000001A, 0x00000302, 0x00000A3B,
0x00000A3B, 0x00000A3B, 0x00000A3B, 0x00050036, 0x00000008, 0x0000161F,
0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A,
0x00000000, 0x000300FB, 0x00000A0A, 0x00003B21, 0x000200F8, 0x00003B21,
0x0004003D, 0x00000014, 0x0000312F, 0x00000F48, 0x000500C4, 0x00000014,
0x000027F5, 0x0000312F, 0x00000A24, 0x00050041, 0x00000291, 0x0000625A,
0x0000147D, 0x00000A17, 0x0004003D, 0x00000014, 0x000059B5, 0x0000625A,
0x0007004F, 0x00000011, 0x00004993, 0x000027F5, 0x000027F5, 0x00000000,
0x00000001, 0x0007004F, 0x00000011, 0x000019E2, 0x000059B5, 0x000059B5,
0x00000000, 0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x00004993,
0x000019E2, 0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7,
0x0000188A, 0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x0000188A,
0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x0000188A,
0x0004007C, 0x00000016, 0x00001A8B, 0x000027F5, 0x00050041, 0x00000288,
0x00004968, 0x0000147D, 0x00000A1D, 0x0004003D, 0x0000000B, 0x0000263C,
0x00004968, 0x00050051, 0x0000000B, 0x00004F98, 0x000059B5, 0x00000001,
0x00050051, 0x0000000C, 0x00003964, 0x00001A8B, 0x00000000, 0x00050084,
0x0000000C, 0x0000591A, 0x00003964, 0x00000A23, 0x00050051, 0x0000000C,
0x000018DA, 0x00001A8B, 0x00000002, 0x0004007C, 0x0000000C, 0x000038A9,
0x00004F98, 0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9,
0x00050051, 0x0000000C, 0x000044BE, 0x00001A8B, 0x00000001, 0x00050080,
0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C,
0x00005785, 0x0000263C, 0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4,
0x00005785, 0x00050080, 0x0000000C, 0x00001B95, 0x0000591A, 0x00005FD7,
0x0004007C, 0x0000000B, 0x00004B46, 0x00001B95, 0x00050041, 0x00000288,
0x00004C04, 0x0000147D, 0x00000A1A, 0x0004003D, 0x0000000B, 0x0000595B,
0x00004C04, 0x00050080, 0x0000000B, 0x00002145, 0x00004B46, 0x0000595B,
0x000500C2, 0x0000000B, 0x000054A6, 0x00002145, 0x00000A16, 0x00050041,
0x00000288, 0x000051D6, 0x0000147D, 0x00000A0B, 0x0004003D, 0x0000000B,
0x000053A3, 0x000051D6, 0x000500C7, 0x0000000B, 0x000018ED, 0x000053A3,
0x00000A0D, 0x000500AB, 0x00000009, 0x000028E3, 0x000018ED, 0x00000A0A,
0x000300F7, 0x00005AE2, 0x00000002, 0x000400FA, 0x000028E3, 0x0000277C,
0x00002A0D, 0x000200F8, 0x0000277C, 0x000500C7, 0x0000000B, 0x00005BD4,
0x000053A3, 0x00000A10, 0x000500AB, 0x00000009, 0x00003FAC, 0x00005BD4,
0x00000A0A, 0x000300F7, 0x00001E0B, 0x00000002, 0x000400FA, 0x00003FAC,
0x00002F61, 0x00006228, 0x000200F8, 0x00002F61, 0x00050041, 0x00000288,
0x00004722, 0x0000147D, 0x00000A11, 0x0004003D, 0x0000000B, 0x00003D0B,
0x00004722, 0x00050041, 0x00000288, 0x00005860, 0x0000147D, 0x00000A14,
0x0004003D, 0x0000000B, 0x0000541F, 0x00005860, 0x000500C3, 0x0000000C,
0x00003A4B, 0x000044BE, 0x00000A17, 0x000500C3, 0x0000000C, 0x00004955,
0x000018DA, 0x00000A11, 0x000500C2, 0x0000000B, 0x00004947, 0x0000541F,
0x00000A16, 0x0004007C, 0x0000000C, 0x000018AA, 0x00004947, 0x00050084,
0x0000000C, 0x00005321, 0x00004955, 0x000018AA, 0x00050080, 0x0000000C,
0x00003B27, 0x00003A4B, 0x00005321, 0x000500C2, 0x0000000B, 0x00002348,
0x00003D0B, 0x00000A19, 0x0004007C, 0x0000000C, 0x00003901, 0x00002348,
0x00050084, 0x0000000C, 0x000020F4, 0x00003B27, 0x00003901, 0x000500C3,
0x0000000C, 0x000032BA, 0x00003964, 0x00000A1A, 0x00050080, 0x0000000C,
0x00005FEE, 0x000032BA, 0x000020F4, 0x000500C4, 0x0000000C, 0x0000225D,
0x00005FEE, 0x00000A25, 0x000500C7, 0x0000000C, 0x00002CF6, 0x0000225D,
0x0000078B, 0x000500C4, 0x0000000C, 0x000049FA, 0x00002CF6, 0x00000A0E,
0x000500C7, 0x0000000C, 0x00004D38, 0x00003964, 0x00000A20, 0x000500C7,
0x0000000C, 0x00003138, 0x000044BE, 0x00000A1D, 0x000500C4, 0x0000000C,
0x0000454D, 0x00003138, 0x00000A11, 0x00050080, 0x0000000C, 0x0000434B,
0x00004D38, 0x0000454D, 0x000500C4, 0x0000000C, 0x00001B88, 0x0000434B,
0x00000A25, 0x000500C3, 0x0000000C, 0x00005DE3, 0x00001B88, 0x00000A1D,
0x000500C3, 0x0000000C, 0x00002215, 0x000044BE, 0x00000A14, 0x00050080,
0x0000000C, 0x000035A3, 0x00002215, 0x00004955, 0x000500C7, 0x0000000C,
0x00005A0C, 0x000035A3, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00004112,
0x00003964, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000496A, 0x00005A0C,
0x00000A0E, 0x00050080, 0x0000000C, 0x000034BD, 0x00004112, 0x0000496A,
0x000500C7, 0x0000000C, 0x00004ADD, 0x000034BD, 0x00000A14, 0x000500C4,
0x0000000C, 0x0000544A, 0x00004ADD, 0x00000A0E, 0x00050080, 0x0000000C,
0x00003C4B, 0x00005A0C, 0x0000544A, 0x000500C7, 0x0000000C, 0x0000335E,
0x00005DE3, 0x000009DB, 0x00050080, 0x0000000C, 0x00004F70, 0x000049FA,
0x0000335E, 0x000500C4, 0x0000000C, 0x00005B31, 0x00004F70, 0x00000A0E,
0x000500C7, 0x0000000C, 0x00005AEA, 0x00005DE3, 0x00000A39, 0x00050080,
0x0000000C, 0x0000285C, 0x00005B31, 0x00005AEA, 0x000500C7, 0x0000000C,
0x000047B4, 0x000018DA, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000544B,
0x000047B4, 0x00000A25, 0x00050080, 0x0000000C, 0x00004157, 0x0000285C,
0x0000544B, 0x000500C7, 0x0000000C, 0x00004ADE, 0x000044BE, 0x00000A0E,
0x000500C4, 0x0000000C, 0x0000544C, 0x00004ADE, 0x00000A17, 0x00050080,
0x0000000C, 0x00004158, 0x00004157, 0x0000544C, 0x000500C7, 0x0000000C,
0x00004FD6, 0x00003C4B, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00002703,
0x00004FD6, 0x00000A14, 0x000500C3, 0x0000000C, 0x00003332, 0x00004158,
0x00000A1D, 0x000500C7, 0x0000000C, 0x000036D6, 0x00003332, 0x00000A20,
0x00050080, 0x0000000C, 0x00003412, 0x00002703, 0x000036D6, 0x000500C4,
0x0000000C, 0x00005B32, 0x00003412, 0x00000A14, 0x000500C7, 0x0000000C,
0x00005AB1, 0x00003C4B, 0x00000A05, 0x00050080, 0x0000000C, 0x00002A9C,
0x00005B32, 0x00005AB1, 0x000500C4, 0x0000000C, 0x00005B33, 0x00002A9C,
0x00000A11, 0x000500C7, 0x0000000C, 0x00005AB2, 0x00004158, 0x0000040B,
0x00050080, 0x0000000C, 0x00002A9D, 0x00005B33, 0x00005AB2, 0x000500C4,
0x0000000C, 0x00005B34, 0x00002A9D, 0x00000A14, 0x000500C7, 0x0000000C,
0x00005EA0, 0x00004158, 0x00000AC8, 0x00050080, 0x0000000C, 0x000054ED,
0x00005B34, 0x00005EA0, 0x000200F9, 0x00001E0B, 0x000200F8, 0x00006228,
0x0004007C, 0x00000012, 0x00001A8C, 0x00004993, 0x00050041, 0x00000288,
0x00004969, 0x0000147D, 0x00000A11, 0x0004003D, 0x0000000B, 0x00002EB2,
0x00004969, 0x00050051, 0x0000000C, 0x00004944, 0x00001A8C, 0x00000000,
0x000500C3, 0x0000000C, 0x00004CF5, 0x00004944, 0x00000A1A, 0x00050051,
0x0000000C, 0x00002747, 0x00001A8C, 0x00000001, 0x000500C3, 0x0000000C,
0x0000405C, 0x00002747, 0x00000A1A, 0x000500C2, 0x0000000B, 0x00005B4D,
0x00002EB2, 0x00000A19, 0x0004007C, 0x0000000C, 0x000018AB, 0x00005B4D,
0x00050084, 0x0000000C, 0x00005347, 0x0000405C, 0x000018AB, 0x00050080,
0x0000000C, 0x00003F5E, 0x00004CF5, 0x00005347, 0x000500C4, 0x0000000C,
0x00004A8E, 0x00003F5E, 0x00000A28, 0x000500C7, 0x0000000C, 0x00002AB6,
0x00004944, 0x00000A20, 0x000500C7, 0x0000000C, 0x00003139, 0x00002747,
0x00000A35, 0x000500C4, 0x0000000C, 0x0000454E, 0x00003139, 0x00000A11,
0x00050080, 0x0000000C, 0x00004397, 0x00002AB6, 0x0000454E, 0x000500C4,
0x0000000C, 0x000018E7, 0x00004397, 0x00000A13, 0x000500C7, 0x0000000C,
0x000027B1, 0x000018E7, 0x000009DB, 0x000500C4, 0x0000000C, 0x00002F76,
0x000027B1, 0x00000A0E, 0x00050080, 0x0000000C, 0x00003C4C, 0x00004A8E,
0x00002F76, 0x000500C7, 0x0000000C, 0x00003397, 0x000018E7, 0x00000A39,
0x00050080, 0x0000000C, 0x00004D30, 0x00003C4C, 0x00003397, 0x000500C7,
0x0000000C, 0x000047B5, 0x00002747, 0x00000A0E, 0x000500C4, 0x0000000C,
0x0000544D, 0x000047B5, 0x00000A17, 0x00050080, 0x0000000C, 0x00004159,
0x00004D30, 0x0000544D, 0x000500C7, 0x0000000C, 0x00005022, 0x00004159,
0x0000040B, 0x000500C4, 0x0000000C, 0x00002416, 0x00005022, 0x00000A14,
0x000500C7, 0x0000000C, 0x00004A33, 0x00002747, 0x00000A3B, 0x000500C4,
0x0000000C, 0x00002F77, 0x00004A33, 0x00000A20, 0x00050080, 0x0000000C,
0x0000415A, 0x00002416, 0x00002F77, 0x000500C7, 0x0000000C, 0x00004ADF,
0x00004159, 0x00000388, 0x000500C4, 0x0000000C, 0x0000544E, 0x00004ADF,
0x00000A11, 0x00050080, 0x0000000C, 0x00004144, 0x0000415A, 0x0000544E,
0x000500C7, 0x0000000C, 0x00005083, 0x00002747, 0x00000A23, 0x000500C3,
0x0000000C, 0x000041BF, 0x00005083, 0x00000A11, 0x000500C3, 0x0000000C,
0x00001EEC, 0x00004944, 0x00000A14, 0x00050080, 0x0000000C, 0x000035B6,
0x000041BF, 0x00001EEC, 0x000500C7, 0x0000000C, 0x00005453, 0x000035B6,
0x00000A14, 0x000500C4, 0x0000000C, 0x0000544F, 0x00005453, 0x00000A1D,
0x00050080, 0x0000000C, 0x00003C4D, 0x00004144, 0x0000544F, 0x000500C7,
0x0000000C, 0x0000374D, 0x00004159, 0x00000AC8, 0x00050080, 0x0000000C,
0x00002F42, 0x00003C4D, 0x0000374D, 0x000200F9, 0x00001E0B, 0x000200F8,
0x00001E0B, 0x000700F5, 0x0000000C, 0x0000292C, 0x000054ED, 0x00002F61,
0x00002F42, 0x00006228, 0x000200F9, 0x00005AE2, 0x000200F8, 0x00002A0D,
0x00050041, 0x00000288, 0x00005098, 0x0000147D, 0x00000A11, 0x0004003D,
0x0000000B, 0x00003D0C, 0x00005098, 0x00050041, 0x00000288, 0x0000531B,
0x0000147D, 0x00000A14, 0x0004003D, 0x0000000B, 0x000034EE, 0x0000531B,
0x0004007C, 0x0000000C, 0x00003ADE, 0x000034EE, 0x00050084, 0x0000000C,
0x000049EF, 0x000018DA, 0x00003ADE, 0x00050080, 0x0000000C, 0x0000208E,
0x000049EF, 0x000044BE, 0x0004007C, 0x0000000C, 0x000022F8, 0x00003D0C,
0x00050084, 0x0000000C, 0x00001E9F, 0x0000208E, 0x000022F8, 0x00050080,
0x0000000C, 0x00001F30, 0x0000591A, 0x00001E9F, 0x000200F9, 0x00005AE2,
0x000200F8, 0x00005AE2, 0x000700F5, 0x0000000C, 0x00004D24, 0x0000292C,
0x00001E0B, 0x00001F30, 0x00002A0D, 0x00050041, 0x00000288, 0x0000615A,
0x0000147D, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00001D4E, 0x0000615A,
0x0004007C, 0x0000000C, 0x00003D46, 0x00001D4E, 0x00050080, 0x0000000C,
0x00003CDB, 0x00003D46, 0x00004D24, 0x0004007C, 0x0000000B, 0x0000487C,
0x00003CDB, 0x000500C2, 0x0000000B, 0x000053F5, 0x0000487C, 0x00000A16,
0x000500C2, 0x0000000B, 0x00003A95, 0x000053A3, 0x00000A10, 0x000500C7,
0x0000000B, 0x000020CA, 0x00003A95, 0x00000A13, 0x00060041, 0x00000294,
0x000050F7, 0x0000107A, 0x00000A0B, 0x000053F5, 0x0004003D, 0x00000017,
0x00001FCE, 0x000050F7, 0x000500AA, 0x00000009, 0x000035C0, 0x000020CA,
0x00000A0D, 0x000500AA, 0x00000009, 0x00005376, 0x000020CA, 0x00000A10,
0x000500A6, 0x00000009, 0x00005686, 0x000035C0, 0x00005376, 0x000300F7,
0x00003463, 0x00000000, 0x000400FA, 0x00005686, 0x00002957, 0x00003463,
0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F, 0x00001FCE,
0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F, 0x0000013D,
0x000500C7, 0x00000017, 0x000050AC, 0x00001FCE, 0x0000072E, 0x000500C2,
0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5, 0x00000017,
0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9, 0x00003463, 0x000200F8,
0x00003463, 0x000700F5, 0x00000017, 0x00005879, 0x00001FCE, 0x00005AE2,
0x00003FF8, 0x00002957, 0x000500AA, 0x00000009, 0x00004CB6, 0x000020CA,
0x00000A13, 0x000500A6, 0x00000009, 0x00003B23, 0x00005376, 0x00004CB6,
0x000300F7, 0x000030F9, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B38,
0x000030F9, 0x000200F8, 0x00002B38, 0x000500C4, 0x00000017, 0x00005E17,
0x00005879, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7, 0x00005879,
0x000002ED, 0x000500C5, 0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7,
0x000200F9, 0x000030F9, 0x000200F8, 0x000030F9, 0x000700F5, 0x00000017,
0x00002F4A, 0x00005879, 0x00003463, 0x000029E8, 0x00002B38, 0x0004007C,
0x0000001A, 0x00003C0F, 0x00002F4A, 0x000500C4, 0x0000001A, 0x0000420E,
0x00003C0F, 0x00000302, 0x000500C3, 0x0000001A, 0x00004098, 0x0000420E,
0x00000302, 0x0004006F, 0x0000001D, 0x00002A97, 0x00004098, 0x0005008E,
0x0000001D, 0x00004FBD, 0x00002A97, 0x00000A38, 0x0007000C, 0x0000001D,
0x00005DB5, 0x00000001, 0x00000028, 0x00000504, 0x00004FBD, 0x000500C3,
0x0000001A, 0x00003802, 0x00003C0F, 0x00000302, 0x0004006F, 0x0000001D,
0x000019CF, 0x00003802, 0x0005008E, 0x0000001D, 0x00004747, 0x000019CF,
0x00000A38, 0x0007000C, 0x0000001D, 0x00005E06, 0x00000001, 0x00000028,
0x00000504, 0x00004747, 0x00050051, 0x0000000D, 0x00005F0A, 0x00005DB5,
0x00000000, 0x00050051, 0x0000000D, 0x000037EF, 0x00005E06, 0x00000000,
0x00050050, 0x00000013, 0x00004B20, 0x00005F0A, 0x000037EF, 0x0006000C,
0x0000000B, 0x00002171, 0x00000001, 0x0000003A, 0x00004B20, 0x00050051,
0x0000000D, 0x00005BBF, 0x00005DB5, 0x00000001, 0x00050051, 0x0000000D,
0x000039A7, 0x00005E06, 0x00000001, 0x00050050, 0x00000013, 0x00004B21,
0x00005BBF, 0x000039A7, 0x0006000C, 0x0000000B, 0x00002172, 0x00000001,
0x0000003A, 0x00004B21, 0x00050051, 0x0000000D, 0x00005BC0, 0x00005DB5,
0x00000002, 0x00050051, 0x0000000D, 0x000039A8, 0x00005E06, 0x00000002,
0x00050050, 0x00000013, 0x00004B22, 0x00005BC0, 0x000039A8, 0x0006000C,
0x0000000B, 0x00002173, 0x00000001, 0x0000003A, 0x00004B22, 0x00050051,
0x0000000D, 0x00005BC1, 0x00005DB5, 0x00000003, 0x00050051, 0x0000000D,
0x000039A9, 0x00005E06, 0x00000003, 0x00050050, 0x00000013, 0x00004B0D,
0x00005BC1, 0x000039A9, 0x0006000C, 0x0000000B, 0x000020EE, 0x00000001,
0x0000003A, 0x00004B0D, 0x00070050, 0x00000017, 0x00003ABB, 0x00002171,
0x00002172, 0x00002173, 0x000020EE, 0x00060041, 0x00000294, 0x000045C3,
0x0000140E, 0x00000A0B, 0x000054A6, 0x0003003E, 0x000045C3, 0x00003ABB,
0x00050080, 0x0000000B, 0x00003AC4, 0x000054A6, 0x00000A0E, 0x000600A9,
0x0000000B, 0x00004958, 0x000028E3, 0x00000A6A, 0x00000A3A, 0x000500C2,
0x0000000B, 0x00002E1B, 0x00004958, 0x00000A16, 0x00050080, 0x0000000B,
0x0000367B, 0x000053F5, 0x00002E1B, 0x00060041, 0x00000294, 0x0000571A,
0x0000107A, 0x00000A0B, 0x0000367B, 0x0004003D, 0x00000017, 0x000019B2,
0x0000571A, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA, 0x00005686,
0x00002958, 0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017,
0x00004760, 0x000019B2, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2,
0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x000019B2,
0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D,
0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9,
0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC,
0x000019B2, 0x000030F9, 0x00003FF9, 0x00002958, 0x000300F7, 0x000030FA,
0x00000000, 0x000400FA, 0x00003B23, 0x00002B39, 0x000030FA, 0x000200F8,
0x00002B39, 0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC, 0x000002ED,
0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED, 0x000500C5,
0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9, 0x000030FA,
0x000200F8, 0x000030FA, 0x000700F5, 0x00000017, 0x00002F4B, 0x00002AAC,
0x00003A1A, 0x000029E9, 0x00002B39, 0x0004007C, 0x0000001A, 0x00003C10,
0x00002F4B, 0x000500C4, 0x0000001A, 0x0000420F, 0x00003C10, 0x00000302,
0x000500C3, 0x0000001A, 0x00004099, 0x0000420F, 0x00000302, 0x0004006F,
0x0000001D, 0x00002A98, 0x00004099, 0x0005008E, 0x0000001D, 0x00004FBE,
0x00002A98, 0x00000A38, 0x0007000C, 0x0000001D, 0x00005DB6, 0x00000001,
0x00000028, 0x00000504, 0x00004FBE, 0x000500C3, 0x0000001A, 0x00003803,
0x00003C10, 0x00000302, 0x0004006F, 0x0000001D, 0x000019D0, 0x00003803,
0x0005008E, 0x0000001D, 0x00004748, 0x000019D0, 0x00000A38, 0x0007000C,
0x0000001D, 0x00005E07, 0x00000001, 0x00000028, 0x00000504, 0x00004748,
0x00050051, 0x0000000D, 0x00005F0B, 0x00005DB6, 0x00000000, 0x00050051,
0x0000000D, 0x000037F0, 0x00005E07, 0x00000000, 0x00050050, 0x00000013,
0x00004B23, 0x00005F0B, 0x000037F0, 0x0006000C, 0x0000000B, 0x00002174,
0x00000001, 0x0000003A, 0x00004B23, 0x00050051, 0x0000000D, 0x00005BC2,
0x00005DB6, 0x00000001, 0x00050051, 0x0000000D, 0x000039AA, 0x00005E07,
0x00000001, 0x00050050, 0x00000013, 0x00004B24, 0x00005BC2, 0x000039AA,
0x0006000C, 0x0000000B, 0x00002175, 0x00000001, 0x0000003A, 0x00004B24,
0x00050051, 0x0000000D, 0x00005BC3, 0x00005DB6, 0x00000002, 0x00050051,
0x0000000D, 0x000039AB, 0x00005E07, 0x00000002, 0x00050050, 0x00000013,
0x00004B25, 0x00005BC3, 0x000039AB, 0x0006000C, 0x0000000B, 0x00002176,
0x00000001, 0x0000003A, 0x00004B25, 0x00050051, 0x0000000D, 0x00005BC4,
0x00005DB6, 0x00000003, 0x00050051, 0x0000000D, 0x000039AC, 0x00005E07,
0x00000003, 0x00050050, 0x00000013, 0x00004B0E, 0x00005BC4, 0x000039AC,
0x0006000C, 0x0000000B, 0x000020EF, 0x00000001, 0x0000003A, 0x00004B0E,
0x00070050, 0x00000017, 0x00003ABC, 0x00002174, 0x00002175, 0x00002176,
0x000020EF, 0x00060041, 0x00000294, 0x00004EBE, 0x0000140E, 0x00000A0B,
0x00003AC4, 0x0003003E, 0x00004EBE, 0x00003ABC, 0x000200F9, 0x00004C7A,
0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,
};

View File

@ -0,0 +1,773 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 10
; Bound: 25179
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %5663 "main" %gl_GlobalInvocationID
OpExecutionMode %5663 LocalSize 8 32 1
OpMemberDecorate %_struct_1161 0 Offset 0
OpMemberDecorate %_struct_1161 1 Offset 4
OpMemberDecorate %_struct_1161 2 Offset 8
OpMemberDecorate %_struct_1161 3 Offset 12
OpMemberDecorate %_struct_1161 4 Offset 16
OpMemberDecorate %_struct_1161 5 Offset 28
OpMemberDecorate %_struct_1161 6 Offset 32
OpMemberDecorate %_struct_1161 7 Offset 36
OpDecorate %_struct_1161 Block
OpDecorate %5245 DescriptorSet 2
OpDecorate %5245 Binding 0
OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
OpDecorate %_runtimearr_v4uint ArrayStride 16
OpMemberDecorate %_struct_1972 0 NonReadable
OpMemberDecorate %_struct_1972 0 Offset 0
OpDecorate %_struct_1972 BufferBlock
OpDecorate %5134 DescriptorSet 0
OpDecorate %5134 Binding 0
OpDecorate %_runtimearr_v4uint_0 ArrayStride 16
OpMemberDecorate %_struct_1973 0 NonWritable
OpMemberDecorate %_struct_1973 0 Offset 0
OpDecorate %_struct_1973 BufferBlock
OpDecorate %4218 DescriptorSet 1
OpDecorate %4218 Binding 0
OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%v4uint = OpTypeVector %uint 4
%int = OpTypeInt 32 1
%v2int = OpTypeVector %int 2
%v3int = OpTypeVector %int 3
%bool = OpTypeBool
%v3uint = OpTypeVector %uint 3
%v2uint = OpTypeVector %uint 2
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%float_n1 = OpConstant %float -1
%1284 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1
%v4int = OpTypeVector %int 4
%int_16 = OpConstant %int 16
%float_3_05185094en05 = OpConstant %float 3.05185094e-05
%uint_0 = OpConstant %uint 0
%v2float = OpTypeVector %float 2
%uint_1 = OpConstant %uint 1
%uint_2 = OpConstant %uint 2
%uint_3 = OpConstant %uint 3
%uint_16711935 = OpConstant %uint 16711935
%uint_8 = OpConstant %uint 8
%uint_4278255360 = OpConstant %uint 4278255360
%uint_16 = OpConstant %uint 16
%int_5 = OpConstant %int 5
%uint_5 = OpConstant %uint 5
%int_7 = OpConstant %int 7
%int_14 = OpConstant %int 14
%int_2 = OpConstant %int 2
%int_n16 = OpConstant %int -16
%int_1 = OpConstant %int 1
%int_15 = OpConstant %int 15
%int_4 = OpConstant %int 4
%int_n512 = OpConstant %int -512
%int_3 = OpConstant %int 3
%int_448 = OpConstant %int 448
%int_8 = OpConstant %int 8
%int_6 = OpConstant %int 6
%int_63 = OpConstant %int 63
%uint_4 = OpConstant %uint 4
%uint_6 = OpConstant %uint 6
%int_268435455 = OpConstant %int 268435455
%int_n2 = OpConstant %int -2
%uint_32 = OpConstant %uint 32
%_struct_1161 = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint
%_ptr_Uniform__struct_1161 = OpTypePointer Uniform %_struct_1161
%5245 = OpVariable %_ptr_Uniform__struct_1161 Uniform
%int_0 = OpConstant %int 0
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%1915 = OpConstantComposite %v2uint %uint_4 %uint_6
%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
%2596 = OpConstantComposite %v3uint %uint_2 %uint_0 %uint_0
%v2bool = OpTypeVector %bool 2
%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint
%_struct_1972 = OpTypeStruct %_runtimearr_v4uint
%_ptr_Uniform__struct_1972 = OpTypePointer Uniform %_struct_1972
%5134 = OpVariable %_ptr_Uniform__struct_1972 Uniform
%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint
%_struct_1973 = OpTypeStruct %_runtimearr_v4uint_0
%_ptr_Uniform__struct_1973 = OpTypePointer Uniform %_struct_1973
%4218 = OpVariable %_ptr_Uniform__struct_1973 Uniform
%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_32 %uint_1
%1870 = OpConstantComposite %v2uint %uint_3 %uint_3
%uint_9 = OpConstant %uint 9
%uint_10 = OpConstant %uint 10
%2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935
%317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8
%1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360
%749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16
%770 = OpConstantComposite %v4int %int_16 %int_16 %int_16 %int_16
%5663 = OpFunction %void None %1282
%15110 = OpLabel
OpSelectionMerge %19578 None
OpSwitch %uint_0 %15137
%15137 = OpLabel
%12591 = OpLoad %v3uint %gl_GlobalInvocationID
%10229 = OpShiftLeftLogical %v3uint %12591 %2596
%25178 = OpAccessChain %_ptr_Uniform_v3uint %5245 %int_4
%22965 = OpLoad %v3uint %25178
%18835 = OpVectorShuffle %v2uint %10229 %10229 0 1
%6626 = OpVectorShuffle %v2uint %22965 %22965 0 1
%17032 = OpUGreaterThanEqual %v2bool %18835 %6626
%24679 = OpAny %bool %17032
OpSelectionMerge %6282 DontFlatten
OpBranchConditional %24679 %21992 %6282
%21992 = OpLabel
OpBranch %19578
%6282 = OpLabel
%6795 = OpBitcast %v3int %10229
%18792 = OpAccessChain %_ptr_Uniform_uint %5245 %int_6
%9788 = OpLoad %uint %18792
%20376 = OpCompositeExtract %uint %22965 1
%14692 = OpCompositeExtract %int %6795 0
%22810 = OpIMul %int %14692 %int_8
%6362 = OpCompositeExtract %int %6795 2
%14505 = OpBitcast %int %20376
%11279 = OpIMul %int %6362 %14505
%17598 = OpCompositeExtract %int %6795 1
%22228 = OpIAdd %int %11279 %17598
%22405 = OpBitcast %int %9788
%24535 = OpIMul %int %22228 %22405
%7061 = OpIAdd %int %22810 %24535
%19270 = OpBitcast %uint %7061
%19460 = OpAccessChain %_ptr_Uniform_uint %5245 %int_5
%22875 = OpLoad %uint %19460
%8517 = OpIAdd %uint %19270 %22875
%21670 = OpShiftRightLogical %uint %8517 %uint_4
%18404 = OpAccessChain %_ptr_Uniform_uint %5245 %int_1
%23432 = OpLoad %uint %18404
%22700 = OpAccessChain %_ptr_Uniform_uint %5245 %int_0
%20387 = OpLoad %uint %22700
%22279 = OpBitwiseAnd %uint %20387 %uint_2
%19223 = OpINotEqual %bool %22279 %uint_0
%17247 = OpCompositeConstruct %v2uint %20387 %20387
%22947 = OpShiftRightLogical %v2uint %17247 %1915
%6551 = OpBitwiseAnd %v2uint %22947 %1870
%18732 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%24236 = OpLoad %uint %18732
%20458 = OpAccessChain %_ptr_Uniform_uint %5245 %int_3
%22167 = OpLoad %uint %20458
%18929 = OpCompositeExtract %uint %10229 0
%6638 = OpShiftRightLogical %uint %18929 %uint_1
%9988 = OpCompositeExtract %uint %10229 1
%23563 = OpCompositeConstruct %v2uint %6638 %9988
%8041 = OpUDiv %v2uint %23563 %6551
%13932 = OpCompositeExtract %uint %8041 0
%19789 = OpShiftLeftLogical %uint %13932 %uint_1
%20905 = OpCompositeExtract %uint %8041 1
%23022 = OpCompositeExtract %uint %10229 2
%9417 = OpCompositeConstruct %v3uint %19789 %20905 %23022
OpSelectionMerge %21313 DontFlatten
OpBranchConditional %19223 %21373 %11737
%21373 = OpLabel
%10608 = OpBitcast %v3int %9417
%17090 = OpCompositeExtract %int %10608 1
%9469 = OpShiftRightArithmetic %int %17090 %int_4
%10055 = OpCompositeExtract %int %10608 2
%16476 = OpShiftRightArithmetic %int %10055 %int_2
%23373 = OpShiftRightLogical %uint %22167 %uint_4
%6314 = OpBitcast %int %23373
%21281 = OpIMul %int %16476 %6314
%15143 = OpIAdd %int %9469 %21281
%9032 = OpShiftRightLogical %uint %24236 %uint_5
%12427 = OpBitcast %int %9032
%10360 = OpIMul %int %15143 %12427
%25154 = OpCompositeExtract %int %10608 0
%20423 = OpShiftRightArithmetic %int %25154 %int_5
%18940 = OpIAdd %int %20423 %10360
%8797 = OpShiftLeftLogical %int %18940 %uint_9
%11510 = OpBitwiseAnd %int %8797 %int_268435455
%18938 = OpShiftLeftLogical %int %11510 %int_1
%19768 = OpBitwiseAnd %int %25154 %int_7
%12600 = OpBitwiseAnd %int %17090 %int_6
%17741 = OpShiftLeftLogical %int %12600 %int_2
%17227 = OpIAdd %int %19768 %17741
%7048 = OpShiftLeftLogical %int %17227 %uint_9
%24035 = OpShiftRightArithmetic %int %7048 %int_6
%8725 = OpShiftRightArithmetic %int %17090 %int_3
%13731 = OpIAdd %int %8725 %16476
%23052 = OpBitwiseAnd %int %13731 %int_1
%16658 = OpShiftRightArithmetic %int %25154 %int_3
%18794 = OpShiftLeftLogical %int %23052 %int_1
%13501 = OpIAdd %int %16658 %18794
%19165 = OpBitwiseAnd %int %13501 %int_3
%21578 = OpShiftLeftLogical %int %19165 %int_1
%15435 = OpIAdd %int %23052 %21578
%13150 = OpBitwiseAnd %int %24035 %int_n16
%20336 = OpIAdd %int %18938 %13150
%23345 = OpShiftLeftLogical %int %20336 %int_1
%23274 = OpBitwiseAnd %int %24035 %int_15
%10332 = OpIAdd %int %23345 %23274
%18356 = OpBitwiseAnd %int %10055 %int_3
%21579 = OpShiftLeftLogical %int %18356 %uint_9
%16727 = OpIAdd %int %10332 %21579
%19166 = OpBitwiseAnd %int %17090 %int_1
%21580 = OpShiftLeftLogical %int %19166 %int_4
%16728 = OpIAdd %int %16727 %21580
%20438 = OpBitwiseAnd %int %15435 %int_1
%9987 = OpShiftLeftLogical %int %20438 %int_3
%13106 = OpShiftRightArithmetic %int %16728 %int_6
%14038 = OpBitwiseAnd %int %13106 %int_7
%13330 = OpIAdd %int %9987 %14038
%23346 = OpShiftLeftLogical %int %13330 %int_3
%23217 = OpBitwiseAnd %int %15435 %int_n2
%10908 = OpIAdd %int %23346 %23217
%23347 = OpShiftLeftLogical %int %10908 %int_2
%23218 = OpBitwiseAnd %int %16728 %int_n512
%10909 = OpIAdd %int %23347 %23218
%23348 = OpShiftLeftLogical %int %10909 %int_3
%21849 = OpBitwiseAnd %int %16728 %int_63
%24314 = OpIAdd %int %23348 %21849
%22127 = OpBitcast %uint %24314
OpBranch %21313
%11737 = OpLabel
%9761 = OpVectorShuffle %v2uint %9417 %9417 0 1
%22991 = OpBitcast %v2int %9761
%6403 = OpCompositeExtract %int %22991 0
%9470 = OpShiftRightArithmetic %int %6403 %int_5
%10056 = OpCompositeExtract %int %22991 1
%16477 = OpShiftRightArithmetic %int %10056 %int_5
%23374 = OpShiftRightLogical %uint %24236 %uint_5
%6315 = OpBitcast %int %23374
%21319 = OpIMul %int %16477 %6315
%16222 = OpIAdd %int %9470 %21319
%19086 = OpShiftLeftLogical %int %16222 %uint_10
%10934 = OpBitwiseAnd %int %6403 %int_7
%12601 = OpBitwiseAnd %int %10056 %int_14
%17742 = OpShiftLeftLogical %int %12601 %int_2
%17303 = OpIAdd %int %10934 %17742
%6375 = OpShiftLeftLogical %int %17303 %uint_3
%10161 = OpBitwiseAnd %int %6375 %int_n16
%12150 = OpShiftLeftLogical %int %10161 %int_1
%15436 = OpIAdd %int %19086 %12150
%13207 = OpBitwiseAnd %int %6375 %int_15
%19760 = OpIAdd %int %15436 %13207
%18357 = OpBitwiseAnd %int %10056 %int_1
%21581 = OpShiftLeftLogical %int %18357 %int_4
%16729 = OpIAdd %int %19760 %21581
%20514 = OpBitwiseAnd %int %16729 %int_n512
%9238 = OpShiftLeftLogical %int %20514 %int_3
%18995 = OpBitwiseAnd %int %10056 %int_16
%12151 = OpShiftLeftLogical %int %18995 %int_7
%16730 = OpIAdd %int %9238 %12151
%19167 = OpBitwiseAnd %int %16729 %int_448
%21582 = OpShiftLeftLogical %int %19167 %int_2
%16708 = OpIAdd %int %16730 %21582
%20611 = OpBitwiseAnd %int %10056 %int_8
%16831 = OpShiftRightArithmetic %int %20611 %int_2
%7916 = OpShiftRightArithmetic %int %6403 %int_3
%13750 = OpIAdd %int %16831 %7916
%21587 = OpBitwiseAnd %int %13750 %int_3
%21583 = OpShiftLeftLogical %int %21587 %int_6
%15437 = OpIAdd %int %16708 %21583
%11782 = OpBitwiseAnd %int %16729 %int_63
%14671 = OpIAdd %int %15437 %11782
%22128 = OpBitcast %uint %14671
OpBranch %21313
%21313 = OpLabel
%9468 = OpPhi %uint %22127 %21373 %22128 %11737
%16296 = OpIMul %v2uint %8041 %6551
%15292 = OpISub %v2uint %23563 %16296
%7303 = OpCompositeExtract %uint %6551 0
%22882 = OpCompositeExtract %uint %6551 1
%13170 = OpIMul %uint %7303 %22882
%15520 = OpIMul %uint %9468 %13170
%16084 = OpCompositeExtract %uint %15292 0
%15890 = OpIMul %uint %16084 %22882
%6886 = OpCompositeExtract %uint %15292 1
%11045 = OpIAdd %uint %15890 %6886
%24733 = OpShiftLeftLogical %uint %11045 %uint_1
%23219 = OpBitwiseAnd %uint %18929 %uint_1
%9559 = OpIAdd %uint %24733 %23219
%16557 = OpShiftLeftLogical %uint %9559 %uint_3
%20138 = OpIAdd %uint %15520 %16557
%17724 = OpIAdd %uint %23432 %20138
%14040 = OpShiftRightLogical %uint %17724 %uint_4
%11766 = OpShiftRightLogical %uint %20387 %uint_2
%8394 = OpBitwiseAnd %uint %11766 %uint_3
%20727 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %14040
%8142 = OpLoad %v4uint %20727
%13760 = OpIEqual %bool %8394 %uint_1
%21366 = OpIEqual %bool %8394 %uint_2
%22150 = OpLogicalOr %bool %13760 %21366
OpSelectionMerge %13411 None
OpBranchConditional %22150 %10583 %13411
%10583 = OpLabel
%18271 = OpBitwiseAnd %v4uint %8142 %2510
%9425 = OpShiftLeftLogical %v4uint %18271 %317
%20652 = OpBitwiseAnd %v4uint %8142 %1838
%17549 = OpShiftRightLogical %v4uint %20652 %317
%16376 = OpBitwiseOr %v4uint %9425 %17549
OpBranch %13411
%13411 = OpLabel
%22649 = OpPhi %v4uint %8142 %21313 %16376 %10583
%19638 = OpIEqual %bool %8394 %uint_3
%15139 = OpLogicalOr %bool %21366 %19638
OpSelectionMerge %12537 None
OpBranchConditional %15139 %11064 %12537
%11064 = OpLabel
%24087 = OpShiftLeftLogical %v4uint %22649 %749
%15335 = OpShiftRightLogical %v4uint %22649 %749
%10728 = OpBitwiseOr %v4uint %24087 %15335
OpBranch %12537
%12537 = OpLabel
%12106 = OpPhi %v4uint %22649 %13411 %10728 %11064
%15375 = OpBitcast %v4int %12106
%16910 = OpShiftLeftLogical %v4int %15375 %770
%16536 = OpShiftRightArithmetic %v4int %16910 %770
%10903 = OpConvertSToF %v4float %16536
%20413 = OpVectorTimesScalar %v4float %10903 %float_3_05185094en05
%23989 = OpExtInst %v4float %1 FMax %1284 %20413
%14338 = OpShiftRightArithmetic %v4int %15375 %770
%6607 = OpConvertSToF %v4float %14338
%18247 = OpVectorTimesScalar %v4float %6607 %float_3_05185094en05
%24070 = OpExtInst %v4float %1 FMax %1284 %18247
%24330 = OpCompositeExtract %float %23989 0
%14319 = OpCompositeExtract %float %24070 0
%19232 = OpCompositeConstruct %v2float %24330 %14319
%8561 = OpExtInst %uint %1 PackHalf2x16 %19232
%23487 = OpCompositeExtract %float %23989 1
%14759 = OpCompositeExtract %float %24070 1
%19233 = OpCompositeConstruct %v2float %23487 %14759
%8562 = OpExtInst %uint %1 PackHalf2x16 %19233
%23488 = OpCompositeExtract %float %23989 2
%14760 = OpCompositeExtract %float %24070 2
%19234 = OpCompositeConstruct %v2float %23488 %14760
%8563 = OpExtInst %uint %1 PackHalf2x16 %19234
%23489 = OpCompositeExtract %float %23989 3
%14761 = OpCompositeExtract %float %24070 3
%19213 = OpCompositeConstruct %v2float %23489 %14761
%8430 = OpExtInst %uint %1 PackHalf2x16 %19213
%15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430
%17859 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %21670
OpStore %17859 %15035
%15532 = OpIAdd %uint %21670 %int_1
%6417 = OpUGreaterThan %bool %7303 %uint_1
OpSelectionMerge %24764 DontFlatten
OpBranchConditional %6417 %20612 %20628
%20612 = OpLabel
%13975 = OpUDiv %uint %6638 %7303
%9086 = OpIMul %uint %13975 %7303
%12657 = OpISub %uint %6638 %9086
%9511 = OpIAdd %uint %12657 %uint_1
%13375 = OpIEqual %bool %9511 %7303
OpSelectionMerge %7917 None
OpBranchConditional %13375 %22174 %8593
%22174 = OpLabel
%19289 = OpIMul %uint %uint_32 %7303
%21519 = OpShiftLeftLogical %uint %12657 %uint_4
%18756 = OpISub %uint %19289 %21519
OpBranch %7917
%8593 = OpLabel
OpBranch %7917
%7917 = OpLabel
%10540 = OpPhi %uint %18756 %22174 %uint_16 %8593
OpBranch %24764
%20628 = OpLabel
OpBranch %24764
%24764 = OpLabel
%10684 = OpPhi %uint %10540 %7917 %uint_32 %20628
%18731 = OpIMul %uint %10684 %22882
%16493 = OpShiftRightLogical %uint %18731 %uint_4
%13163 = OpIAdd %uint %14040 %16493
%22298 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %13163
%6578 = OpLoad %v4uint %22298
OpSelectionMerge %14874 None
OpBranchConditional %22150 %10584 %14874
%10584 = OpLabel
%18272 = OpBitwiseAnd %v4uint %6578 %2510
%9426 = OpShiftLeftLogical %v4uint %18272 %317
%20653 = OpBitwiseAnd %v4uint %6578 %1838
%17550 = OpShiftRightLogical %v4uint %20653 %317
%16377 = OpBitwiseOr %v4uint %9426 %17550
OpBranch %14874
%14874 = OpLabel
%10924 = OpPhi %v4uint %6578 %24764 %16377 %10584
OpSelectionMerge %12538 None
OpBranchConditional %15139 %11065 %12538
%11065 = OpLabel
%24088 = OpShiftLeftLogical %v4uint %10924 %749
%15336 = OpShiftRightLogical %v4uint %10924 %749
%10729 = OpBitwiseOr %v4uint %24088 %15336
OpBranch %12538
%12538 = OpLabel
%12107 = OpPhi %v4uint %10924 %14874 %10729 %11065
%15376 = OpBitcast %v4int %12107
%16911 = OpShiftLeftLogical %v4int %15376 %770
%16537 = OpShiftRightArithmetic %v4int %16911 %770
%10904 = OpConvertSToF %v4float %16537
%20414 = OpVectorTimesScalar %v4float %10904 %float_3_05185094en05
%23990 = OpExtInst %v4float %1 FMax %1284 %20414
%14339 = OpShiftRightArithmetic %v4int %15376 %770
%6608 = OpConvertSToF %v4float %14339
%18248 = OpVectorTimesScalar %v4float %6608 %float_3_05185094en05
%24071 = OpExtInst %v4float %1 FMax %1284 %18248
%24331 = OpCompositeExtract %float %23990 0
%14320 = OpCompositeExtract %float %24071 0
%19235 = OpCompositeConstruct %v2float %24331 %14320
%8564 = OpExtInst %uint %1 PackHalf2x16 %19235
%23490 = OpCompositeExtract %float %23990 1
%14762 = OpCompositeExtract %float %24071 1
%19236 = OpCompositeConstruct %v2float %23490 %14762
%8565 = OpExtInst %uint %1 PackHalf2x16 %19236
%23491 = OpCompositeExtract %float %23990 2
%14763 = OpCompositeExtract %float %24071 2
%19237 = OpCompositeConstruct %v2float %23491 %14763
%8566 = OpExtInst %uint %1 PackHalf2x16 %19237
%23492 = OpCompositeExtract %float %23990 3
%14764 = OpCompositeExtract %float %24071 3
%19214 = OpCompositeConstruct %v2float %23492 %14764
%8431 = OpExtInst %uint %1 PackHalf2x16 %19214
%15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431
%20158 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %15532
OpStore %20158 %15036
OpBranch %19578
%19578 = OpLabel
OpReturn
OpFunctionEnd
#endif
const uint32_t texture_load_rgba16_snorm_float_scaled_cs[] = {
0x07230203, 0x00010000, 0x0008000A, 0x0000625B, 0x00000000, 0x00020011,
0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,
0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,
0x00000011, 0x00000008, 0x00000020, 0x00000001, 0x00050048, 0x00000489,
0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001,
0x00000023, 0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023,
0x00000008, 0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C,
0x00050048, 0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048,
0x00000489, 0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489,
0x00000006, 0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007,
0x00000023, 0x00000024, 0x00030047, 0x00000489, 0x00000002, 0x00040047,
0x0000147D, 0x00000022, 0x00000002, 0x00040047, 0x0000147D, 0x00000021,
0x00000000, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,
0x000007DC, 0x00000006, 0x00000010, 0x00040048, 0x000007B4, 0x00000000,
0x00000019, 0x00050048, 0x000007B4, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B4, 0x00000003, 0x00040047, 0x0000140E, 0x00000022,
0x00000000, 0x00040047, 0x0000140E, 0x00000021, 0x00000000, 0x00040047,
0x000007DD, 0x00000006, 0x00000010, 0x00040048, 0x000007B5, 0x00000000,
0x00000018, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B5, 0x00000003, 0x00040047, 0x0000107A, 0x00000022,
0x00000001, 0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047,
0x00000024, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,
0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,
0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,
0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,
0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,
0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00040017, 0x00000011,
0x0000000B, 0x00000002, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,
0x0000001D, 0x0000000D, 0x00000004, 0x0004002B, 0x0000000D, 0x00000341,
0xBF800000, 0x0007002C, 0x0000001D, 0x00000504, 0x00000341, 0x00000341,
0x00000341, 0x00000341, 0x00040017, 0x0000001A, 0x0000000C, 0x00000004,
0x0004002B, 0x0000000C, 0x00000A3B, 0x00000010, 0x0004002B, 0x0000000D,
0x00000A38, 0x38000100, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,
0x00040017, 0x00000013, 0x0000000D, 0x00000002, 0x0004002B, 0x0000000B,
0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002,
0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B,
0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,
0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B,
0x00000A3A, 0x00000010, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005,
0x0004002B, 0x0000000B, 0x00000A19, 0x00000005, 0x0004002B, 0x0000000C,
0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A35, 0x0000000E,
0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000C,
0x000009DB, 0xFFFFFFF0, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001,
0x0004002B, 0x0000000C, 0x00000A39, 0x0000000F, 0x0004002B, 0x0000000C,
0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x0000040B, 0xFFFFFE00,
0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C,
0x00000388, 0x000001C0, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008,
0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C,
0x00000AC8, 0x0000003F, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004,
0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006, 0x0004002B, 0x0000000C,
0x0000078B, 0x0FFFFFFF, 0x0004002B, 0x0000000C, 0x00000A05, 0xFFFFFFFE,
0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x000A001E, 0x00000489,
0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00000014, 0x0000000B,
0x0000000B, 0x0000000B, 0x00040020, 0x00000706, 0x00000002, 0x00000489,
0x0004003B, 0x00000706, 0x0000147D, 0x00000002, 0x0004002B, 0x0000000C,
0x00000A0B, 0x00000000, 0x00040020, 0x00000288, 0x00000002, 0x0000000B,
0x0005002C, 0x00000011, 0x0000077B, 0x00000A16, 0x00000A1C, 0x00040020,
0x00000291, 0x00000002, 0x00000014, 0x00040020, 0x00000292, 0x00000001,
0x00000014, 0x0004003B, 0x00000292, 0x00000F48, 0x00000001, 0x0006002C,
0x00000014, 0x00000A24, 0x00000A10, 0x00000A0A, 0x00000A0A, 0x00040017,
0x0000000F, 0x00000009, 0x00000002, 0x0003001D, 0x000007DC, 0x00000017,
0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A31, 0x00000002,
0x000007B4, 0x0004003B, 0x00000A31, 0x0000140E, 0x00000002, 0x0003001D,
0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020,
0x00000A32, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A32, 0x0000107A,
0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0006002C,
0x00000014, 0x00000024, 0x00000A22, 0x00000A6A, 0x00000A0D, 0x0005002C,
0x00000011, 0x0000074E, 0x00000A13, 0x00000A13, 0x0004002B, 0x0000000B,
0x00000A25, 0x00000009, 0x0004002B, 0x0000000B, 0x00000A28, 0x0000000A,
0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6,
0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22,
0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD,
0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x000002ED,
0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0007002C, 0x0000001A,
0x00000302, 0x00000A3B, 0x00000A3B, 0x00000A3B, 0x00000A3B, 0x00050036,
0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06,
0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00003B21,
0x000200F8, 0x00003B21, 0x0004003D, 0x00000014, 0x0000312F, 0x00000F48,
0x000500C4, 0x00000014, 0x000027F5, 0x0000312F, 0x00000A24, 0x00050041,
0x00000291, 0x0000625A, 0x0000147D, 0x00000A17, 0x0004003D, 0x00000014,
0x000059B5, 0x0000625A, 0x0007004F, 0x00000011, 0x00004993, 0x000027F5,
0x000027F5, 0x00000000, 0x00000001, 0x0007004F, 0x00000011, 0x000019E2,
0x000059B5, 0x000059B5, 0x00000000, 0x00000001, 0x000500AE, 0x0000000F,
0x00004288, 0x00004993, 0x000019E2, 0x0004009A, 0x00000009, 0x00006067,
0x00004288, 0x000300F7, 0x0000188A, 0x00000002, 0x000400FA, 0x00006067,
0x000055E8, 0x0000188A, 0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A,
0x000200F8, 0x0000188A, 0x0004007C, 0x00000016, 0x00001A8B, 0x000027F5,
0x00050041, 0x00000288, 0x00004968, 0x0000147D, 0x00000A1D, 0x0004003D,
0x0000000B, 0x0000263C, 0x00004968, 0x00050051, 0x0000000B, 0x00004F98,
0x000059B5, 0x00000001, 0x00050051, 0x0000000C, 0x00003964, 0x00001A8B,
0x00000000, 0x00050084, 0x0000000C, 0x0000591A, 0x00003964, 0x00000A23,
0x00050051, 0x0000000C, 0x000018DA, 0x00001A8B, 0x00000002, 0x0004007C,
0x0000000C, 0x000038A9, 0x00004F98, 0x00050084, 0x0000000C, 0x00002C0F,
0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00001A8B,
0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE,
0x0004007C, 0x0000000C, 0x00005785, 0x0000263C, 0x00050084, 0x0000000C,
0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00001B95,
0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B, 0x00004B46, 0x00001B95,
0x00050041, 0x00000288, 0x00004C04, 0x0000147D, 0x00000A1A, 0x0004003D,
0x0000000B, 0x0000595B, 0x00004C04, 0x00050080, 0x0000000B, 0x00002145,
0x00004B46, 0x0000595B, 0x000500C2, 0x0000000B, 0x000054A6, 0x00002145,
0x00000A16, 0x00050041, 0x00000288, 0x000047E4, 0x0000147D, 0x00000A0E,
0x0004003D, 0x0000000B, 0x00005B88, 0x000047E4, 0x00050041, 0x00000288,
0x000058AC, 0x0000147D, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00004FA3,
0x000058AC, 0x000500C7, 0x0000000B, 0x00005707, 0x00004FA3, 0x00000A10,
0x000500AB, 0x00000009, 0x00004B17, 0x00005707, 0x00000A0A, 0x00050050,
0x00000011, 0x0000435F, 0x00004FA3, 0x00004FA3, 0x000500C2, 0x00000011,
0x000059A3, 0x0000435F, 0x0000077B, 0x000500C7, 0x00000011, 0x00001997,
0x000059A3, 0x0000074E, 0x00050041, 0x00000288, 0x0000492C, 0x0000147D,
0x00000A11, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041,
0x00000288, 0x00004FEA, 0x0000147D, 0x00000A14, 0x0004003D, 0x0000000B,
0x00005697, 0x00004FEA, 0x00050051, 0x0000000B, 0x000049F1, 0x000027F5,
0x00000000, 0x000500C2, 0x0000000B, 0x000019EE, 0x000049F1, 0x00000A0D,
0x00050051, 0x0000000B, 0x00002704, 0x000027F5, 0x00000001, 0x00050050,
0x00000011, 0x00005C0B, 0x000019EE, 0x00002704, 0x00050086, 0x00000011,
0x00001F69, 0x00005C0B, 0x00001997, 0x00050051, 0x0000000B, 0x0000366C,
0x00001F69, 0x00000000, 0x000500C4, 0x0000000B, 0x00004D4D, 0x0000366C,
0x00000A0D, 0x00050051, 0x0000000B, 0x000051A9, 0x00001F69, 0x00000001,
0x00050051, 0x0000000B, 0x000059EE, 0x000027F5, 0x00000002, 0x00060050,
0x00000014, 0x000024C9, 0x00004D4D, 0x000051A9, 0x000059EE, 0x000300F7,
0x00005341, 0x00000002, 0x000400FA, 0x00004B17, 0x0000537D, 0x00002DD9,
0x000200F8, 0x0000537D, 0x0004007C, 0x00000016, 0x00002970, 0x000024C9,
0x00050051, 0x0000000C, 0x000042C2, 0x00002970, 0x00000001, 0x000500C3,
0x0000000C, 0x000024FD, 0x000042C2, 0x00000A17, 0x00050051, 0x0000000C,
0x00002747, 0x00002970, 0x00000002, 0x000500C3, 0x0000000C, 0x0000405C,
0x00002747, 0x00000A11, 0x000500C2, 0x0000000B, 0x00005B4D, 0x00005697,
0x00000A16, 0x0004007C, 0x0000000C, 0x000018AA, 0x00005B4D, 0x00050084,
0x0000000C, 0x00005321, 0x0000405C, 0x000018AA, 0x00050080, 0x0000000C,
0x00003B27, 0x000024FD, 0x00005321, 0x000500C2, 0x0000000B, 0x00002348,
0x00005EAC, 0x00000A19, 0x0004007C, 0x0000000C, 0x0000308B, 0x00002348,
0x00050084, 0x0000000C, 0x00002878, 0x00003B27, 0x0000308B, 0x00050051,
0x0000000C, 0x00006242, 0x00002970, 0x00000000, 0x000500C3, 0x0000000C,
0x00004FC7, 0x00006242, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC,
0x00004FC7, 0x00002878, 0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC,
0x00000A25, 0x000500C7, 0x0000000C, 0x00002CF6, 0x0000225D, 0x0000078B,
0x000500C4, 0x0000000C, 0x000049FA, 0x00002CF6, 0x00000A0E, 0x000500C7,
0x0000000C, 0x00004D38, 0x00006242, 0x00000A20, 0x000500C7, 0x0000000C,
0x00003138, 0x000042C2, 0x00000A1D, 0x000500C4, 0x0000000C, 0x0000454D,
0x00003138, 0x00000A11, 0x00050080, 0x0000000C, 0x0000434B, 0x00004D38,
0x0000454D, 0x000500C4, 0x0000000C, 0x00001B88, 0x0000434B, 0x00000A25,
0x000500C3, 0x0000000C, 0x00005DE3, 0x00001B88, 0x00000A1D, 0x000500C3,
0x0000000C, 0x00002215, 0x000042C2, 0x00000A14, 0x00050080, 0x0000000C,
0x000035A3, 0x00002215, 0x0000405C, 0x000500C7, 0x0000000C, 0x00005A0C,
0x000035A3, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00004112, 0x00006242,
0x00000A14, 0x000500C4, 0x0000000C, 0x0000496A, 0x00005A0C, 0x00000A0E,
0x00050080, 0x0000000C, 0x000034BD, 0x00004112, 0x0000496A, 0x000500C7,
0x0000000C, 0x00004ADD, 0x000034BD, 0x00000A14, 0x000500C4, 0x0000000C,
0x0000544A, 0x00004ADD, 0x00000A0E, 0x00050080, 0x0000000C, 0x00003C4B,
0x00005A0C, 0x0000544A, 0x000500C7, 0x0000000C, 0x0000335E, 0x00005DE3,
0x000009DB, 0x00050080, 0x0000000C, 0x00004F70, 0x000049FA, 0x0000335E,
0x000500C4, 0x0000000C, 0x00005B31, 0x00004F70, 0x00000A0E, 0x000500C7,
0x0000000C, 0x00005AEA, 0x00005DE3, 0x00000A39, 0x00050080, 0x0000000C,
0x0000285C, 0x00005B31, 0x00005AEA, 0x000500C7, 0x0000000C, 0x000047B4,
0x00002747, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000544B, 0x000047B4,
0x00000A25, 0x00050080, 0x0000000C, 0x00004157, 0x0000285C, 0x0000544B,
0x000500C7, 0x0000000C, 0x00004ADE, 0x000042C2, 0x00000A0E, 0x000500C4,
0x0000000C, 0x0000544C, 0x00004ADE, 0x00000A17, 0x00050080, 0x0000000C,
0x00004158, 0x00004157, 0x0000544C, 0x000500C7, 0x0000000C, 0x00004FD6,
0x00003C4B, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00002703, 0x00004FD6,
0x00000A14, 0x000500C3, 0x0000000C, 0x00003332, 0x00004158, 0x00000A1D,
0x000500C7, 0x0000000C, 0x000036D6, 0x00003332, 0x00000A20, 0x00050080,
0x0000000C, 0x00003412, 0x00002703, 0x000036D6, 0x000500C4, 0x0000000C,
0x00005B32, 0x00003412, 0x00000A14, 0x000500C7, 0x0000000C, 0x00005AB1,
0x00003C4B, 0x00000A05, 0x00050080, 0x0000000C, 0x00002A9C, 0x00005B32,
0x00005AB1, 0x000500C4, 0x0000000C, 0x00005B33, 0x00002A9C, 0x00000A11,
0x000500C7, 0x0000000C, 0x00005AB2, 0x00004158, 0x0000040B, 0x00050080,
0x0000000C, 0x00002A9D, 0x00005B33, 0x00005AB2, 0x000500C4, 0x0000000C,
0x00005B34, 0x00002A9D, 0x00000A14, 0x000500C7, 0x0000000C, 0x00005559,
0x00004158, 0x00000AC8, 0x00050080, 0x0000000C, 0x00005EFA, 0x00005B34,
0x00005559, 0x0004007C, 0x0000000B, 0x0000566F, 0x00005EFA, 0x000200F9,
0x00005341, 0x000200F8, 0x00002DD9, 0x0007004F, 0x00000011, 0x00002621,
0x000024C9, 0x000024C9, 0x00000000, 0x00000001, 0x0004007C, 0x00000012,
0x000059CF, 0x00002621, 0x00050051, 0x0000000C, 0x00001903, 0x000059CF,
0x00000000, 0x000500C3, 0x0000000C, 0x000024FE, 0x00001903, 0x00000A1A,
0x00050051, 0x0000000C, 0x00002748, 0x000059CF, 0x00000001, 0x000500C3,
0x0000000C, 0x0000405D, 0x00002748, 0x00000A1A, 0x000500C2, 0x0000000B,
0x00005B4E, 0x00005EAC, 0x00000A19, 0x0004007C, 0x0000000C, 0x000018AB,
0x00005B4E, 0x00050084, 0x0000000C, 0x00005347, 0x0000405D, 0x000018AB,
0x00050080, 0x0000000C, 0x00003F5E, 0x000024FE, 0x00005347, 0x000500C4,
0x0000000C, 0x00004A8E, 0x00003F5E, 0x00000A28, 0x000500C7, 0x0000000C,
0x00002AB6, 0x00001903, 0x00000A20, 0x000500C7, 0x0000000C, 0x00003139,
0x00002748, 0x00000A35, 0x000500C4, 0x0000000C, 0x0000454E, 0x00003139,
0x00000A11, 0x00050080, 0x0000000C, 0x00004397, 0x00002AB6, 0x0000454E,
0x000500C4, 0x0000000C, 0x000018E7, 0x00004397, 0x00000A13, 0x000500C7,
0x0000000C, 0x000027B1, 0x000018E7, 0x000009DB, 0x000500C4, 0x0000000C,
0x00002F76, 0x000027B1, 0x00000A0E, 0x00050080, 0x0000000C, 0x00003C4C,
0x00004A8E, 0x00002F76, 0x000500C7, 0x0000000C, 0x00003397, 0x000018E7,
0x00000A39, 0x00050080, 0x0000000C, 0x00004D30, 0x00003C4C, 0x00003397,
0x000500C7, 0x0000000C, 0x000047B5, 0x00002748, 0x00000A0E, 0x000500C4,
0x0000000C, 0x0000544D, 0x000047B5, 0x00000A17, 0x00050080, 0x0000000C,
0x00004159, 0x00004D30, 0x0000544D, 0x000500C7, 0x0000000C, 0x00005022,
0x00004159, 0x0000040B, 0x000500C4, 0x0000000C, 0x00002416, 0x00005022,
0x00000A14, 0x000500C7, 0x0000000C, 0x00004A33, 0x00002748, 0x00000A3B,
0x000500C4, 0x0000000C, 0x00002F77, 0x00004A33, 0x00000A20, 0x00050080,
0x0000000C, 0x0000415A, 0x00002416, 0x00002F77, 0x000500C7, 0x0000000C,
0x00004ADF, 0x00004159, 0x00000388, 0x000500C4, 0x0000000C, 0x0000544E,
0x00004ADF, 0x00000A11, 0x00050080, 0x0000000C, 0x00004144, 0x0000415A,
0x0000544E, 0x000500C7, 0x0000000C, 0x00005083, 0x00002748, 0x00000A23,
0x000500C3, 0x0000000C, 0x000041BF, 0x00005083, 0x00000A11, 0x000500C3,
0x0000000C, 0x00001EEC, 0x00001903, 0x00000A14, 0x00050080, 0x0000000C,
0x000035B6, 0x000041BF, 0x00001EEC, 0x000500C7, 0x0000000C, 0x00005453,
0x000035B6, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000544F, 0x00005453,
0x00000A1D, 0x00050080, 0x0000000C, 0x00003C4D, 0x00004144, 0x0000544F,
0x000500C7, 0x0000000C, 0x00002E06, 0x00004159, 0x00000AC8, 0x00050080,
0x0000000C, 0x0000394F, 0x00003C4D, 0x00002E06, 0x0004007C, 0x0000000B,
0x00005670, 0x0000394F, 0x000200F9, 0x00005341, 0x000200F8, 0x00005341,
0x000700F5, 0x0000000B, 0x000024FC, 0x0000566F, 0x0000537D, 0x00005670,
0x00002DD9, 0x00050084, 0x00000011, 0x00003FA8, 0x00001F69, 0x00001997,
0x00050082, 0x00000011, 0x00003BBC, 0x00005C0B, 0x00003FA8, 0x00050051,
0x0000000B, 0x00001C87, 0x00001997, 0x00000000, 0x00050051, 0x0000000B,
0x00005962, 0x00001997, 0x00000001, 0x00050084, 0x0000000B, 0x00003372,
0x00001C87, 0x00005962, 0x00050084, 0x0000000B, 0x00003CA0, 0x000024FC,
0x00003372, 0x00050051, 0x0000000B, 0x00003ED4, 0x00003BBC, 0x00000000,
0x00050084, 0x0000000B, 0x00003E12, 0x00003ED4, 0x00005962, 0x00050051,
0x0000000B, 0x00001AE6, 0x00003BBC, 0x00000001, 0x00050080, 0x0000000B,
0x00002B25, 0x00003E12, 0x00001AE6, 0x000500C4, 0x0000000B, 0x0000609D,
0x00002B25, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00005AB3, 0x000049F1,
0x00000A0D, 0x00050080, 0x0000000B, 0x00002557, 0x0000609D, 0x00005AB3,
0x000500C4, 0x0000000B, 0x000040AD, 0x00002557, 0x00000A13, 0x00050080,
0x0000000B, 0x00004EAA, 0x00003CA0, 0x000040AD, 0x00050080, 0x0000000B,
0x0000453C, 0x00005B88, 0x00004EAA, 0x000500C2, 0x0000000B, 0x000036D8,
0x0000453C, 0x00000A16, 0x000500C2, 0x0000000B, 0x00002DF6, 0x00004FA3,
0x00000A10, 0x000500C7, 0x0000000B, 0x000020CA, 0x00002DF6, 0x00000A13,
0x00060041, 0x00000294, 0x000050F7, 0x0000107A, 0x00000A0B, 0x000036D8,
0x0004003D, 0x00000017, 0x00001FCE, 0x000050F7, 0x000500AA, 0x00000009,
0x000035C0, 0x000020CA, 0x00000A0D, 0x000500AA, 0x00000009, 0x00005376,
0x000020CA, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x000035C0,
0x00005376, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686,
0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017,
0x0000475F, 0x00001FCE, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1,
0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00001FCE,
0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D,
0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9,
0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x00005879,
0x00001FCE, 0x00005341, 0x00003FF8, 0x00002957, 0x000500AA, 0x00000009,
0x00004CB6, 0x000020CA, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23,
0x00005376, 0x00004CB6, 0x000300F7, 0x000030F9, 0x00000000, 0x000400FA,
0x00003B23, 0x00002B38, 0x000030F9, 0x000200F8, 0x00002B38, 0x000500C4,
0x00000017, 0x00005E17, 0x00005879, 0x000002ED, 0x000500C2, 0x00000017,
0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8,
0x00005E17, 0x00003BE7, 0x000200F9, 0x000030F9, 0x000200F8, 0x000030F9,
0x000700F5, 0x00000017, 0x00002F4A, 0x00005879, 0x00003463, 0x000029E8,
0x00002B38, 0x0004007C, 0x0000001A, 0x00003C0F, 0x00002F4A, 0x000500C4,
0x0000001A, 0x0000420E, 0x00003C0F, 0x00000302, 0x000500C3, 0x0000001A,
0x00004098, 0x0000420E, 0x00000302, 0x0004006F, 0x0000001D, 0x00002A97,
0x00004098, 0x0005008E, 0x0000001D, 0x00004FBD, 0x00002A97, 0x00000A38,
0x0007000C, 0x0000001D, 0x00005DB5, 0x00000001, 0x00000028, 0x00000504,
0x00004FBD, 0x000500C3, 0x0000001A, 0x00003802, 0x00003C0F, 0x00000302,
0x0004006F, 0x0000001D, 0x000019CF, 0x00003802, 0x0005008E, 0x0000001D,
0x00004747, 0x000019CF, 0x00000A38, 0x0007000C, 0x0000001D, 0x00005E06,
0x00000001, 0x00000028, 0x00000504, 0x00004747, 0x00050051, 0x0000000D,
0x00005F0A, 0x00005DB5, 0x00000000, 0x00050051, 0x0000000D, 0x000037EF,
0x00005E06, 0x00000000, 0x00050050, 0x00000013, 0x00004B20, 0x00005F0A,
0x000037EF, 0x0006000C, 0x0000000B, 0x00002171, 0x00000001, 0x0000003A,
0x00004B20, 0x00050051, 0x0000000D, 0x00005BBF, 0x00005DB5, 0x00000001,
0x00050051, 0x0000000D, 0x000039A7, 0x00005E06, 0x00000001, 0x00050050,
0x00000013, 0x00004B21, 0x00005BBF, 0x000039A7, 0x0006000C, 0x0000000B,
0x00002172, 0x00000001, 0x0000003A, 0x00004B21, 0x00050051, 0x0000000D,
0x00005BC0, 0x00005DB5, 0x00000002, 0x00050051, 0x0000000D, 0x000039A8,
0x00005E06, 0x00000002, 0x00050050, 0x00000013, 0x00004B22, 0x00005BC0,
0x000039A8, 0x0006000C, 0x0000000B, 0x00002173, 0x00000001, 0x0000003A,
0x00004B22, 0x00050051, 0x0000000D, 0x00005BC1, 0x00005DB5, 0x00000003,
0x00050051, 0x0000000D, 0x000039A9, 0x00005E06, 0x00000003, 0x00050050,
0x00000013, 0x00004B0D, 0x00005BC1, 0x000039A9, 0x0006000C, 0x0000000B,
0x000020EE, 0x00000001, 0x0000003A, 0x00004B0D, 0x00070050, 0x00000017,
0x00003ABB, 0x00002171, 0x00002172, 0x00002173, 0x000020EE, 0x00060041,
0x00000294, 0x000045C3, 0x0000140E, 0x00000A0B, 0x000054A6, 0x0003003E,
0x000045C3, 0x00003ABB, 0x00050080, 0x0000000B, 0x00003CAC, 0x000054A6,
0x00000A0E, 0x000500AC, 0x00000009, 0x00001911, 0x00001C87, 0x00000A0D,
0x000300F7, 0x000060BC, 0x00000002, 0x000400FA, 0x00001911, 0x00005084,
0x00005094, 0x000200F8, 0x00005084, 0x00050086, 0x0000000B, 0x00003697,
0x000019EE, 0x00001C87, 0x00050084, 0x0000000B, 0x0000237E, 0x00003697,
0x00001C87, 0x00050082, 0x0000000B, 0x00003171, 0x000019EE, 0x0000237E,
0x00050080, 0x0000000B, 0x00002527, 0x00003171, 0x00000A0D, 0x000500AA,
0x00000009, 0x0000343F, 0x00002527, 0x00001C87, 0x000300F7, 0x00001EED,
0x00000000, 0x000400FA, 0x0000343F, 0x0000569E, 0x00002191, 0x000200F8,
0x0000569E, 0x00050084, 0x0000000B, 0x00004B59, 0x00000A6A, 0x00001C87,
0x000500C4, 0x0000000B, 0x0000540F, 0x00003171, 0x00000A16, 0x00050082,
0x0000000B, 0x00004944, 0x00004B59, 0x0000540F, 0x000200F9, 0x00001EED,
0x000200F8, 0x00002191, 0x000200F9, 0x00001EED, 0x000200F8, 0x00001EED,
0x000700F5, 0x0000000B, 0x0000292C, 0x00004944, 0x0000569E, 0x00000A3A,
0x00002191, 0x000200F9, 0x000060BC, 0x000200F8, 0x00005094, 0x000200F9,
0x000060BC, 0x000200F8, 0x000060BC, 0x000700F5, 0x0000000B, 0x000029BC,
0x0000292C, 0x00001EED, 0x00000A6A, 0x00005094, 0x00050084, 0x0000000B,
0x0000492B, 0x000029BC, 0x00005962, 0x000500C2, 0x0000000B, 0x0000406D,
0x0000492B, 0x00000A16, 0x00050080, 0x0000000B, 0x0000336B, 0x000036D8,
0x0000406D, 0x00060041, 0x00000294, 0x0000571A, 0x0000107A, 0x00000A0B,
0x0000336B, 0x0004003D, 0x00000017, 0x000019B2, 0x0000571A, 0x000300F7,
0x00003A1A, 0x00000000, 0x000400FA, 0x00005686, 0x00002958, 0x00003A1A,
0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760, 0x000019B2,
0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760, 0x0000013D,
0x000500C7, 0x00000017, 0x000050AD, 0x000019B2, 0x0000072E, 0x000500C2,
0x00000017, 0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5, 0x00000017,
0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x00003A1A, 0x000200F8,
0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC, 0x000019B2, 0x000060BC,
0x00003FF9, 0x00002958, 0x000300F7, 0x000030FA, 0x00000000, 0x000400FA,
0x00003B23, 0x00002B39, 0x000030FA, 0x000200F8, 0x00002B39, 0x000500C4,
0x00000017, 0x00005E18, 0x00002AAC, 0x000002ED, 0x000500C2, 0x00000017,
0x00003BE8, 0x00002AAC, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E9,
0x00005E18, 0x00003BE8, 0x000200F9, 0x000030FA, 0x000200F8, 0x000030FA,
0x000700F5, 0x00000017, 0x00002F4B, 0x00002AAC, 0x00003A1A, 0x000029E9,
0x00002B39, 0x0004007C, 0x0000001A, 0x00003C10, 0x00002F4B, 0x000500C4,
0x0000001A, 0x0000420F, 0x00003C10, 0x00000302, 0x000500C3, 0x0000001A,
0x00004099, 0x0000420F, 0x00000302, 0x0004006F, 0x0000001D, 0x00002A98,
0x00004099, 0x0005008E, 0x0000001D, 0x00004FBE, 0x00002A98, 0x00000A38,
0x0007000C, 0x0000001D, 0x00005DB6, 0x00000001, 0x00000028, 0x00000504,
0x00004FBE, 0x000500C3, 0x0000001A, 0x00003803, 0x00003C10, 0x00000302,
0x0004006F, 0x0000001D, 0x000019D0, 0x00003803, 0x0005008E, 0x0000001D,
0x00004748, 0x000019D0, 0x00000A38, 0x0007000C, 0x0000001D, 0x00005E07,
0x00000001, 0x00000028, 0x00000504, 0x00004748, 0x00050051, 0x0000000D,
0x00005F0B, 0x00005DB6, 0x00000000, 0x00050051, 0x0000000D, 0x000037F0,
0x00005E07, 0x00000000, 0x00050050, 0x00000013, 0x00004B23, 0x00005F0B,
0x000037F0, 0x0006000C, 0x0000000B, 0x00002174, 0x00000001, 0x0000003A,
0x00004B23, 0x00050051, 0x0000000D, 0x00005BC2, 0x00005DB6, 0x00000001,
0x00050051, 0x0000000D, 0x000039AA, 0x00005E07, 0x00000001, 0x00050050,
0x00000013, 0x00004B24, 0x00005BC2, 0x000039AA, 0x0006000C, 0x0000000B,
0x00002175, 0x00000001, 0x0000003A, 0x00004B24, 0x00050051, 0x0000000D,
0x00005BC3, 0x00005DB6, 0x00000002, 0x00050051, 0x0000000D, 0x000039AB,
0x00005E07, 0x00000002, 0x00050050, 0x00000013, 0x00004B25, 0x00005BC3,
0x000039AB, 0x0006000C, 0x0000000B, 0x00002176, 0x00000001, 0x0000003A,
0x00004B25, 0x00050051, 0x0000000D, 0x00005BC4, 0x00005DB6, 0x00000003,
0x00050051, 0x0000000D, 0x000039AC, 0x00005E07, 0x00000003, 0x00050050,
0x00000013, 0x00004B0E, 0x00005BC4, 0x000039AC, 0x0006000C, 0x0000000B,
0x000020EF, 0x00000001, 0x0000003A, 0x00004B0E, 0x00070050, 0x00000017,
0x00003ABC, 0x00002174, 0x00002175, 0x00002176, 0x000020EF, 0x00060041,
0x00000294, 0x00004EBE, 0x0000140E, 0x00000A0B, 0x00003CAC, 0x0003003E,
0x00004EBE, 0x00003ABC, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A,
0x000100FD, 0x00010038,
};

View File

@ -0,0 +1,684 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 10
; Bound: 25179
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %5663 "main" %gl_GlobalInvocationID
OpExecutionMode %5663 LocalSize 8 32 1
OpMemberDecorate %_struct_1161 0 Offset 0
OpMemberDecorate %_struct_1161 1 Offset 4
OpMemberDecorate %_struct_1161 2 Offset 8
OpMemberDecorate %_struct_1161 3 Offset 12
OpMemberDecorate %_struct_1161 4 Offset 16
OpMemberDecorate %_struct_1161 5 Offset 28
OpMemberDecorate %_struct_1161 6 Offset 32
OpMemberDecorate %_struct_1161 7 Offset 36
OpDecorate %_struct_1161 Block
OpDecorate %5245 DescriptorSet 2
OpDecorate %5245 Binding 0
OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
OpDecorate %_runtimearr_v4uint ArrayStride 16
OpMemberDecorate %_struct_1972 0 NonReadable
OpMemberDecorate %_struct_1972 0 Offset 0
OpDecorate %_struct_1972 BufferBlock
OpDecorate %5134 DescriptorSet 0
OpDecorate %5134 Binding 0
OpDecorate %_runtimearr_v4uint_0 ArrayStride 16
OpMemberDecorate %_struct_1973 0 NonWritable
OpMemberDecorate %_struct_1973 0 Offset 0
OpDecorate %_struct_1973 BufferBlock
OpDecorate %4218 DescriptorSet 1
OpDecorate %4218 Binding 0
OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%v4uint = OpTypeVector %uint 4
%int = OpTypeInt 32 1
%v2int = OpTypeVector %int 2
%v3int = OpTypeVector %int 3
%bool = OpTypeBool
%v3uint = OpTypeVector %uint 3
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%uint_65535 = OpConstant %uint 65535
%float_1_52590219en05 = OpConstant %float 1.52590219e-05
%uint_16 = OpConstant %uint 16
%uint_0 = OpConstant %uint 0
%v2float = OpTypeVector %float 2
%uint_1 = OpConstant %uint 1
%uint_2 = OpConstant %uint 2
%uint_3 = OpConstant %uint 3
%uint_16711935 = OpConstant %uint 16711935
%uint_8 = OpConstant %uint 8
%uint_4278255360 = OpConstant %uint 4278255360
%int_5 = OpConstant %int 5
%uint_5 = OpConstant %uint 5
%int_7 = OpConstant %int 7
%int_14 = OpConstant %int 14
%int_2 = OpConstant %int 2
%int_n16 = OpConstant %int -16
%int_1 = OpConstant %int 1
%int_15 = OpConstant %int 15
%int_4 = OpConstant %int 4
%int_n512 = OpConstant %int -512
%int_3 = OpConstant %int 3
%int_16 = OpConstant %int 16
%int_448 = OpConstant %int 448
%int_8 = OpConstant %int 8
%int_6 = OpConstant %int 6
%int_63 = OpConstant %int 63
%uint_4 = OpConstant %uint 4
%int_268435455 = OpConstant %int 268435455
%int_n2 = OpConstant %int -2
%uint_32 = OpConstant %uint 32
%_struct_1161 = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint
%_ptr_Uniform__struct_1161 = OpTypePointer Uniform %_struct_1161
%5245 = OpVariable %_ptr_Uniform__struct_1161 Uniform
%int_0 = OpConstant %int 0
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
%v2uint = OpTypeVector %uint 2
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
%2596 = OpConstantComposite %v3uint %uint_2 %uint_0 %uint_0
%v2bool = OpTypeVector %bool 2
%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint
%_struct_1972 = OpTypeStruct %_runtimearr_v4uint
%_ptr_Uniform__struct_1972 = OpTypePointer Uniform %_struct_1972
%5134 = OpVariable %_ptr_Uniform__struct_1972 Uniform
%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint
%_struct_1973 = OpTypeStruct %_runtimearr_v4uint_0
%_ptr_Uniform__struct_1973 = OpTypePointer Uniform %_struct_1973
%4218 = OpVariable %_ptr_Uniform__struct_1973 Uniform
%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_32 %uint_1
%uint_9 = OpConstant %uint 9
%uint_10 = OpConstant %uint 10
%2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935
%317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8
%1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360
%749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16
%850 = OpConstantComposite %v4uint %uint_65535 %uint_65535 %uint_65535 %uint_65535
%5663 = OpFunction %void None %1282
%15110 = OpLabel
OpSelectionMerge %19578 None
OpSwitch %uint_0 %15137
%15137 = OpLabel
%12591 = OpLoad %v3uint %gl_GlobalInvocationID
%10229 = OpShiftLeftLogical %v3uint %12591 %2596
%25178 = OpAccessChain %_ptr_Uniform_v3uint %5245 %int_4
%22965 = OpLoad %v3uint %25178
%18835 = OpVectorShuffle %v2uint %10229 %10229 0 1
%6626 = OpVectorShuffle %v2uint %22965 %22965 0 1
%17032 = OpUGreaterThanEqual %v2bool %18835 %6626
%24679 = OpAny %bool %17032
OpSelectionMerge %6282 DontFlatten
OpBranchConditional %24679 %21992 %6282
%21992 = OpLabel
OpBranch %19578
%6282 = OpLabel
%6795 = OpBitcast %v3int %10229
%18792 = OpAccessChain %_ptr_Uniform_uint %5245 %int_6
%9788 = OpLoad %uint %18792
%20376 = OpCompositeExtract %uint %22965 1
%14692 = OpCompositeExtract %int %6795 0
%22810 = OpIMul %int %14692 %int_8
%6362 = OpCompositeExtract %int %6795 2
%14505 = OpBitcast %int %20376
%11279 = OpIMul %int %6362 %14505
%17598 = OpCompositeExtract %int %6795 1
%22228 = OpIAdd %int %11279 %17598
%22405 = OpBitcast %int %9788
%24535 = OpIMul %int %22228 %22405
%7061 = OpIAdd %int %22810 %24535
%19270 = OpBitcast %uint %7061
%19460 = OpAccessChain %_ptr_Uniform_uint %5245 %int_5
%22875 = OpLoad %uint %19460
%8517 = OpIAdd %uint %19270 %22875
%21670 = OpShiftRightLogical %uint %8517 %uint_4
%20950 = OpAccessChain %_ptr_Uniform_uint %5245 %int_0
%21411 = OpLoad %uint %20950
%6381 = OpBitwiseAnd %uint %21411 %uint_1
%10467 = OpINotEqual %bool %6381 %uint_0
OpSelectionMerge %23266 DontFlatten
OpBranchConditional %10467 %10108 %10765
%10108 = OpLabel
%23508 = OpBitwiseAnd %uint %21411 %uint_2
%16300 = OpINotEqual %bool %23508 %uint_0
OpSelectionMerge %7691 DontFlatten
OpBranchConditional %16300 %12129 %25128
%12129 = OpLabel
%18210 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%15627 = OpLoad %uint %18210
%22624 = OpAccessChain %_ptr_Uniform_uint %5245 %int_3
%21535 = OpLoad %uint %22624
%14923 = OpShiftRightArithmetic %int %17598 %int_4
%18773 = OpShiftRightArithmetic %int %6362 %int_2
%18759 = OpShiftRightLogical %uint %21535 %uint_4
%6314 = OpBitcast %int %18759
%21281 = OpIMul %int %18773 %6314
%15143 = OpIAdd %int %14923 %21281
%9032 = OpShiftRightLogical %uint %15627 %uint_5
%14593 = OpBitcast %int %9032
%8436 = OpIMul %int %15143 %14593
%12986 = OpShiftRightArithmetic %int %14692 %int_5
%24558 = OpIAdd %int %12986 %8436
%8797 = OpShiftLeftLogical %int %24558 %uint_9
%11510 = OpBitwiseAnd %int %8797 %int_268435455
%18938 = OpShiftLeftLogical %int %11510 %int_1
%19768 = OpBitwiseAnd %int %14692 %int_7
%12600 = OpBitwiseAnd %int %17598 %int_6
%17741 = OpShiftLeftLogical %int %12600 %int_2
%17227 = OpIAdd %int %19768 %17741
%7048 = OpShiftLeftLogical %int %17227 %uint_9
%24035 = OpShiftRightArithmetic %int %7048 %int_6
%8725 = OpShiftRightArithmetic %int %17598 %int_3
%13731 = OpIAdd %int %8725 %18773
%23052 = OpBitwiseAnd %int %13731 %int_1
%16658 = OpShiftRightArithmetic %int %14692 %int_3
%18794 = OpShiftLeftLogical %int %23052 %int_1
%13501 = OpIAdd %int %16658 %18794
%19165 = OpBitwiseAnd %int %13501 %int_3
%21578 = OpShiftLeftLogical %int %19165 %int_1
%15435 = OpIAdd %int %23052 %21578
%13150 = OpBitwiseAnd %int %24035 %int_n16
%20336 = OpIAdd %int %18938 %13150
%23345 = OpShiftLeftLogical %int %20336 %int_1
%23274 = OpBitwiseAnd %int %24035 %int_15
%10332 = OpIAdd %int %23345 %23274
%18356 = OpBitwiseAnd %int %6362 %int_3
%21579 = OpShiftLeftLogical %int %18356 %uint_9
%16727 = OpIAdd %int %10332 %21579
%19166 = OpBitwiseAnd %int %17598 %int_1
%21580 = OpShiftLeftLogical %int %19166 %int_4
%16728 = OpIAdd %int %16727 %21580
%20438 = OpBitwiseAnd %int %15435 %int_1
%9987 = OpShiftLeftLogical %int %20438 %int_3
%13106 = OpShiftRightArithmetic %int %16728 %int_6
%14038 = OpBitwiseAnd %int %13106 %int_7
%13330 = OpIAdd %int %9987 %14038
%23346 = OpShiftLeftLogical %int %13330 %int_3
%23217 = OpBitwiseAnd %int %15435 %int_n2
%10908 = OpIAdd %int %23346 %23217
%23347 = OpShiftLeftLogical %int %10908 %int_2
%23218 = OpBitwiseAnd %int %16728 %int_n512
%10909 = OpIAdd %int %23347 %23218
%23348 = OpShiftLeftLogical %int %10909 %int_3
%24224 = OpBitwiseAnd %int %16728 %int_63
%21741 = OpIAdd %int %23348 %24224
OpBranch %7691
%25128 = OpLabel
%6796 = OpBitcast %v2int %18835
%18793 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%11954 = OpLoad %uint %18793
%18756 = OpCompositeExtract %int %6796 0
%19701 = OpShiftRightArithmetic %int %18756 %int_5
%10055 = OpCompositeExtract %int %6796 1
%16476 = OpShiftRightArithmetic %int %10055 %int_5
%23373 = OpShiftRightLogical %uint %11954 %uint_5
%6315 = OpBitcast %int %23373
%21319 = OpIMul %int %16476 %6315
%16222 = OpIAdd %int %19701 %21319
%19086 = OpShiftLeftLogical %int %16222 %uint_10
%10934 = OpBitwiseAnd %int %18756 %int_7
%12601 = OpBitwiseAnd %int %10055 %int_14
%17742 = OpShiftLeftLogical %int %12601 %int_2
%17303 = OpIAdd %int %10934 %17742
%6375 = OpShiftLeftLogical %int %17303 %uint_3
%10161 = OpBitwiseAnd %int %6375 %int_n16
%12150 = OpShiftLeftLogical %int %10161 %int_1
%15436 = OpIAdd %int %19086 %12150
%13207 = OpBitwiseAnd %int %6375 %int_15
%19760 = OpIAdd %int %15436 %13207
%18357 = OpBitwiseAnd %int %10055 %int_1
%21581 = OpShiftLeftLogical %int %18357 %int_4
%16729 = OpIAdd %int %19760 %21581
%20514 = OpBitwiseAnd %int %16729 %int_n512
%9238 = OpShiftLeftLogical %int %20514 %int_3
%18995 = OpBitwiseAnd %int %10055 %int_16
%12151 = OpShiftLeftLogical %int %18995 %int_7
%16730 = OpIAdd %int %9238 %12151
%19167 = OpBitwiseAnd %int %16729 %int_448
%21582 = OpShiftLeftLogical %int %19167 %int_2
%16708 = OpIAdd %int %16730 %21582
%20611 = OpBitwiseAnd %int %10055 %int_8
%16831 = OpShiftRightArithmetic %int %20611 %int_2
%7916 = OpShiftRightArithmetic %int %18756 %int_3
%13750 = OpIAdd %int %16831 %7916
%21587 = OpBitwiseAnd %int %13750 %int_3
%21583 = OpShiftLeftLogical %int %21587 %int_6
%15437 = OpIAdd %int %16708 %21583
%14157 = OpBitwiseAnd %int %16729 %int_63
%12098 = OpIAdd %int %15437 %14157
OpBranch %7691
%7691 = OpLabel
%10540 = OpPhi %int %21741 %12129 %12098 %25128
OpBranch %23266
%10765 = OpLabel
%20632 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%15628 = OpLoad %uint %20632
%21275 = OpAccessChain %_ptr_Uniform_uint %5245 %int_3
%13550 = OpLoad %uint %21275
%15070 = OpBitcast %int %13550
%18927 = OpIMul %int %6362 %15070
%8334 = OpIAdd %int %18927 %17598
%8952 = OpBitcast %int %15628
%7839 = OpIMul %int %8334 %8952
%7984 = OpIAdd %int %22810 %7839
OpBranch %23266
%23266 = OpLabel
%19748 = OpPhi %int %10540 %7691 %7984 %10765
%24922 = OpAccessChain %_ptr_Uniform_uint %5245 %int_1
%7502 = OpLoad %uint %24922
%15686 = OpBitcast %int %7502
%15579 = OpIAdd %int %15686 %19748
%18556 = OpBitcast %uint %15579
%21493 = OpShiftRightLogical %uint %18556 %uint_4
%14997 = OpShiftRightLogical %uint %21411 %uint_2
%8394 = OpBitwiseAnd %uint %14997 %uint_3
%20727 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %21493
%8142 = OpLoad %v4uint %20727
%13760 = OpIEqual %bool %8394 %uint_1
%21366 = OpIEqual %bool %8394 %uint_2
%22150 = OpLogicalOr %bool %13760 %21366
OpSelectionMerge %13411 None
OpBranchConditional %22150 %10583 %13411
%10583 = OpLabel
%18271 = OpBitwiseAnd %v4uint %8142 %2510
%9425 = OpShiftLeftLogical %v4uint %18271 %317
%20652 = OpBitwiseAnd %v4uint %8142 %1838
%17549 = OpShiftRightLogical %v4uint %20652 %317
%16376 = OpBitwiseOr %v4uint %9425 %17549
OpBranch %13411
%13411 = OpLabel
%22649 = OpPhi %v4uint %8142 %23266 %16376 %10583
%19638 = OpIEqual %bool %8394 %uint_3
%15139 = OpLogicalOr %bool %21366 %19638
OpSelectionMerge %13962 None
OpBranchConditional %15139 %11064 %13962
%11064 = OpLabel
%24087 = OpShiftLeftLogical %v4uint %22649 %749
%15335 = OpShiftRightLogical %v4uint %22649 %749
%10728 = OpBitwiseOr %v4uint %24087 %15335
OpBranch %13962
%13962 = OpLabel
%16606 = OpPhi %v4uint %22649 %13411 %10728 %11064
%18240 = OpBitwiseAnd %v4uint %16606 %850
%9137 = OpConvertUToF %v4float %18240
%19365 = OpVectorTimesScalar %v4float %9137 %float_1_52590219en05
%23367 = OpShiftRightLogical %v4uint %16606 %749
%18492 = OpConvertUToF %v4float %23367
%18450 = OpVectorTimesScalar %v4float %18492 %float_1_52590219en05
%6268 = OpCompositeExtract %float %19365 0
%13806 = OpCompositeExtract %float %18450 0
%19232 = OpCompositeConstruct %v2float %6268 %13806
%8561 = OpExtInst %uint %1 PackHalf2x16 %19232
%23487 = OpCompositeExtract %float %19365 1
%14759 = OpCompositeExtract %float %18450 1
%19233 = OpCompositeConstruct %v2float %23487 %14759
%8562 = OpExtInst %uint %1 PackHalf2x16 %19233
%23488 = OpCompositeExtract %float %19365 2
%14760 = OpCompositeExtract %float %18450 2
%19234 = OpCompositeConstruct %v2float %23488 %14760
%8563 = OpExtInst %uint %1 PackHalf2x16 %19234
%23489 = OpCompositeExtract %float %19365 3
%14761 = OpCompositeExtract %float %18450 3
%19213 = OpCompositeConstruct %v2float %23489 %14761
%8430 = OpExtInst %uint %1 PackHalf2x16 %19213
%15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430
%17859 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %21670
OpStore %17859 %15035
%15044 = OpIAdd %uint %21670 %int_1
%18776 = OpSelect %uint %10467 %uint_32 %uint_16
%11803 = OpShiftRightLogical %uint %18776 %uint_4
%13947 = OpIAdd %uint %21493 %11803
%22298 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %13947
%6578 = OpLoad %v4uint %22298
OpSelectionMerge %14874 None
OpBranchConditional %22150 %10584 %14874
%10584 = OpLabel
%18272 = OpBitwiseAnd %v4uint %6578 %2510
%9426 = OpShiftLeftLogical %v4uint %18272 %317
%20653 = OpBitwiseAnd %v4uint %6578 %1838
%17550 = OpShiftRightLogical %v4uint %20653 %317
%16377 = OpBitwiseOr %v4uint %9426 %17550
OpBranch %14874
%14874 = OpLabel
%10924 = OpPhi %v4uint %6578 %13962 %16377 %10584
OpSelectionMerge %13963 None
OpBranchConditional %15139 %11065 %13963
%11065 = OpLabel
%24088 = OpShiftLeftLogical %v4uint %10924 %749
%15336 = OpShiftRightLogical %v4uint %10924 %749
%10729 = OpBitwiseOr %v4uint %24088 %15336
OpBranch %13963
%13963 = OpLabel
%16607 = OpPhi %v4uint %10924 %14874 %10729 %11065
%18241 = OpBitwiseAnd %v4uint %16607 %850
%9138 = OpConvertUToF %v4float %18241
%19366 = OpVectorTimesScalar %v4float %9138 %float_1_52590219en05
%23368 = OpShiftRightLogical %v4uint %16607 %749
%18493 = OpConvertUToF %v4float %23368
%18451 = OpVectorTimesScalar %v4float %18493 %float_1_52590219en05
%6269 = OpCompositeExtract %float %19366 0
%13807 = OpCompositeExtract %float %18451 0
%19235 = OpCompositeConstruct %v2float %6269 %13807
%8564 = OpExtInst %uint %1 PackHalf2x16 %19235
%23490 = OpCompositeExtract %float %19366 1
%14762 = OpCompositeExtract %float %18451 1
%19236 = OpCompositeConstruct %v2float %23490 %14762
%8565 = OpExtInst %uint %1 PackHalf2x16 %19236
%23491 = OpCompositeExtract %float %19366 2
%14763 = OpCompositeExtract %float %18451 2
%19237 = OpCompositeConstruct %v2float %23491 %14763
%8566 = OpExtInst %uint %1 PackHalf2x16 %19237
%23492 = OpCompositeExtract %float %19366 3
%14764 = OpCompositeExtract %float %18451 3
%19214 = OpCompositeConstruct %v2float %23492 %14764
%8431 = OpExtInst %uint %1 PackHalf2x16 %19214
%15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431
%20158 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %15044
OpStore %20158 %15036
OpBranch %19578
%19578 = OpLabel
OpReturn
OpFunctionEnd
#endif
const uint32_t texture_load_rgba16_unorm_float_cs[] = {
0x07230203, 0x00010000, 0x0008000A, 0x0000625B, 0x00000000, 0x00020011,
0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,
0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,
0x00000011, 0x00000008, 0x00000020, 0x00000001, 0x00050048, 0x00000489,
0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001,
0x00000023, 0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023,
0x00000008, 0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C,
0x00050048, 0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048,
0x00000489, 0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489,
0x00000006, 0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007,
0x00000023, 0x00000024, 0x00030047, 0x00000489, 0x00000002, 0x00040047,
0x0000147D, 0x00000022, 0x00000002, 0x00040047, 0x0000147D, 0x00000021,
0x00000000, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,
0x000007DC, 0x00000006, 0x00000010, 0x00040048, 0x000007B4, 0x00000000,
0x00000019, 0x00050048, 0x000007B4, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B4, 0x00000003, 0x00040047, 0x0000140E, 0x00000022,
0x00000000, 0x00040047, 0x0000140E, 0x00000021, 0x00000000, 0x00040047,
0x000007DD, 0x00000006, 0x00000010, 0x00040048, 0x000007B5, 0x00000000,
0x00000018, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B5, 0x00000003, 0x00040047, 0x0000107A, 0x00000022,
0x00000001, 0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047,
0x00000024, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,
0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,
0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,
0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,
0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,
0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00030016, 0x0000000D,
0x00000020, 0x00040017, 0x0000001D, 0x0000000D, 0x00000004, 0x0004002B,
0x0000000B, 0x000001C1, 0x0000FFFF, 0x0004002B, 0x0000000D, 0x0000092A,
0x37800080, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B,
0x0000000B, 0x00000A0A, 0x00000000, 0x00040017, 0x00000013, 0x0000000D,
0x00000002, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B,
0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A13,
0x00000003, 0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B,
0x0000000B, 0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x000005FD,
0xFF00FF00, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B,
0x0000000B, 0x00000A19, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20,
0x00000007, 0x0004002B, 0x0000000C, 0x00000A35, 0x0000000E, 0x0004002B,
0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x000009DB,
0xFFFFFFF0, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B,
0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A17,
0x00000004, 0x0004002B, 0x0000000C, 0x0000040B, 0xFFFFFE00, 0x0004002B,
0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C, 0x00000A3B,
0x00000010, 0x0004002B, 0x0000000C, 0x00000388, 0x000001C0, 0x0004002B,
0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A1D,
0x00000006, 0x0004002B, 0x0000000C, 0x00000AC8, 0x0000003F, 0x0004002B,
0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000C, 0x0000078B,
0x0FFFFFFF, 0x0004002B, 0x0000000C, 0x00000A05, 0xFFFFFFFE, 0x0004002B,
0x0000000B, 0x00000A6A, 0x00000020, 0x000A001E, 0x00000489, 0x0000000B,
0x0000000B, 0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B,
0x0000000B, 0x00040020, 0x00000706, 0x00000002, 0x00000489, 0x0004003B,
0x00000706, 0x0000147D, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B,
0x00000000, 0x00040020, 0x00000288, 0x00000002, 0x0000000B, 0x00040020,
0x00000291, 0x00000002, 0x00000014, 0x00040017, 0x00000011, 0x0000000B,
0x00000002, 0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B,
0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A24,
0x00000A10, 0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009,
0x00000002, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4,
0x000007DC, 0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B,
0x00000A31, 0x0000140E, 0x00000002, 0x0003001D, 0x000007DD, 0x00000017,
0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A32, 0x00000002,
0x000007B5, 0x0004003B, 0x00000A32, 0x0000107A, 0x00000002, 0x00040020,
0x00000294, 0x00000002, 0x00000017, 0x0006002C, 0x00000014, 0x00000024,
0x00000A22, 0x00000A6A, 0x00000A0D, 0x0004002B, 0x0000000B, 0x00000A25,
0x00000009, 0x0004002B, 0x0000000B, 0x00000A28, 0x0000000A, 0x0007002C,
0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6,
0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22,
0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD,
0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A,
0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0007002C, 0x00000017, 0x00000352,
0x000001C1, 0x000001C1, 0x000001C1, 0x000001C1, 0x00050036, 0x00000008,
0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7,
0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00003B21, 0x000200F8,
0x00003B21, 0x0004003D, 0x00000014, 0x0000312F, 0x00000F48, 0x000500C4,
0x00000014, 0x000027F5, 0x0000312F, 0x00000A24, 0x00050041, 0x00000291,
0x0000625A, 0x0000147D, 0x00000A17, 0x0004003D, 0x00000014, 0x000059B5,
0x0000625A, 0x0007004F, 0x00000011, 0x00004993, 0x000027F5, 0x000027F5,
0x00000000, 0x00000001, 0x0007004F, 0x00000011, 0x000019E2, 0x000059B5,
0x000059B5, 0x00000000, 0x00000001, 0x000500AE, 0x0000000F, 0x00004288,
0x00004993, 0x000019E2, 0x0004009A, 0x00000009, 0x00006067, 0x00004288,
0x000300F7, 0x0000188A, 0x00000002, 0x000400FA, 0x00006067, 0x000055E8,
0x0000188A, 0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8,
0x0000188A, 0x0004007C, 0x00000016, 0x00001A8B, 0x000027F5, 0x00050041,
0x00000288, 0x00004968, 0x0000147D, 0x00000A1D, 0x0004003D, 0x0000000B,
0x0000263C, 0x00004968, 0x00050051, 0x0000000B, 0x00004F98, 0x000059B5,
0x00000001, 0x00050051, 0x0000000C, 0x00003964, 0x00001A8B, 0x00000000,
0x00050084, 0x0000000C, 0x0000591A, 0x00003964, 0x00000A23, 0x00050051,
0x0000000C, 0x000018DA, 0x00001A8B, 0x00000002, 0x0004007C, 0x0000000C,
0x000038A9, 0x00004F98, 0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA,
0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00001A8B, 0x00000001,
0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C,
0x0000000C, 0x00005785, 0x0000263C, 0x00050084, 0x0000000C, 0x00005FD7,
0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00001B95, 0x0000591A,
0x00005FD7, 0x0004007C, 0x0000000B, 0x00004B46, 0x00001B95, 0x00050041,
0x00000288, 0x00004C04, 0x0000147D, 0x00000A1A, 0x0004003D, 0x0000000B,
0x0000595B, 0x00004C04, 0x00050080, 0x0000000B, 0x00002145, 0x00004B46,
0x0000595B, 0x000500C2, 0x0000000B, 0x000054A6, 0x00002145, 0x00000A16,
0x00050041, 0x00000288, 0x000051D6, 0x0000147D, 0x00000A0B, 0x0004003D,
0x0000000B, 0x000053A3, 0x000051D6, 0x000500C7, 0x0000000B, 0x000018ED,
0x000053A3, 0x00000A0D, 0x000500AB, 0x00000009, 0x000028E3, 0x000018ED,
0x00000A0A, 0x000300F7, 0x00005AE2, 0x00000002, 0x000400FA, 0x000028E3,
0x0000277C, 0x00002A0D, 0x000200F8, 0x0000277C, 0x000500C7, 0x0000000B,
0x00005BD4, 0x000053A3, 0x00000A10, 0x000500AB, 0x00000009, 0x00003FAC,
0x00005BD4, 0x00000A0A, 0x000300F7, 0x00001E0B, 0x00000002, 0x000400FA,
0x00003FAC, 0x00002F61, 0x00006228, 0x000200F8, 0x00002F61, 0x00050041,
0x00000288, 0x00004722, 0x0000147D, 0x00000A11, 0x0004003D, 0x0000000B,
0x00003D0B, 0x00004722, 0x00050041, 0x00000288, 0x00005860, 0x0000147D,
0x00000A14, 0x0004003D, 0x0000000B, 0x0000541F, 0x00005860, 0x000500C3,
0x0000000C, 0x00003A4B, 0x000044BE, 0x00000A17, 0x000500C3, 0x0000000C,
0x00004955, 0x000018DA, 0x00000A11, 0x000500C2, 0x0000000B, 0x00004947,
0x0000541F, 0x00000A16, 0x0004007C, 0x0000000C, 0x000018AA, 0x00004947,
0x00050084, 0x0000000C, 0x00005321, 0x00004955, 0x000018AA, 0x00050080,
0x0000000C, 0x00003B27, 0x00003A4B, 0x00005321, 0x000500C2, 0x0000000B,
0x00002348, 0x00003D0B, 0x00000A19, 0x0004007C, 0x0000000C, 0x00003901,
0x00002348, 0x00050084, 0x0000000C, 0x000020F4, 0x00003B27, 0x00003901,
0x000500C3, 0x0000000C, 0x000032BA, 0x00003964, 0x00000A1A, 0x00050080,
0x0000000C, 0x00005FEE, 0x000032BA, 0x000020F4, 0x000500C4, 0x0000000C,
0x0000225D, 0x00005FEE, 0x00000A25, 0x000500C7, 0x0000000C, 0x00002CF6,
0x0000225D, 0x0000078B, 0x000500C4, 0x0000000C, 0x000049FA, 0x00002CF6,
0x00000A0E, 0x000500C7, 0x0000000C, 0x00004D38, 0x00003964, 0x00000A20,
0x000500C7, 0x0000000C, 0x00003138, 0x000044BE, 0x00000A1D, 0x000500C4,
0x0000000C, 0x0000454D, 0x00003138, 0x00000A11, 0x00050080, 0x0000000C,
0x0000434B, 0x00004D38, 0x0000454D, 0x000500C4, 0x0000000C, 0x00001B88,
0x0000434B, 0x00000A25, 0x000500C3, 0x0000000C, 0x00005DE3, 0x00001B88,
0x00000A1D, 0x000500C3, 0x0000000C, 0x00002215, 0x000044BE, 0x00000A14,
0x00050080, 0x0000000C, 0x000035A3, 0x00002215, 0x00004955, 0x000500C7,
0x0000000C, 0x00005A0C, 0x000035A3, 0x00000A0E, 0x000500C3, 0x0000000C,
0x00004112, 0x00003964, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000496A,
0x00005A0C, 0x00000A0E, 0x00050080, 0x0000000C, 0x000034BD, 0x00004112,
0x0000496A, 0x000500C7, 0x0000000C, 0x00004ADD, 0x000034BD, 0x00000A14,
0x000500C4, 0x0000000C, 0x0000544A, 0x00004ADD, 0x00000A0E, 0x00050080,
0x0000000C, 0x00003C4B, 0x00005A0C, 0x0000544A, 0x000500C7, 0x0000000C,
0x0000335E, 0x00005DE3, 0x000009DB, 0x00050080, 0x0000000C, 0x00004F70,
0x000049FA, 0x0000335E, 0x000500C4, 0x0000000C, 0x00005B31, 0x00004F70,
0x00000A0E, 0x000500C7, 0x0000000C, 0x00005AEA, 0x00005DE3, 0x00000A38,
0x00050080, 0x0000000C, 0x0000285C, 0x00005B31, 0x00005AEA, 0x000500C7,
0x0000000C, 0x000047B4, 0x000018DA, 0x00000A14, 0x000500C4, 0x0000000C,
0x0000544B, 0x000047B4, 0x00000A25, 0x00050080, 0x0000000C, 0x00004157,
0x0000285C, 0x0000544B, 0x000500C7, 0x0000000C, 0x00004ADE, 0x000044BE,
0x00000A0E, 0x000500C4, 0x0000000C, 0x0000544C, 0x00004ADE, 0x00000A17,
0x00050080, 0x0000000C, 0x00004158, 0x00004157, 0x0000544C, 0x000500C7,
0x0000000C, 0x00004FD6, 0x00003C4B, 0x00000A0E, 0x000500C4, 0x0000000C,
0x00002703, 0x00004FD6, 0x00000A14, 0x000500C3, 0x0000000C, 0x00003332,
0x00004158, 0x00000A1D, 0x000500C7, 0x0000000C, 0x000036D6, 0x00003332,
0x00000A20, 0x00050080, 0x0000000C, 0x00003412, 0x00002703, 0x000036D6,
0x000500C4, 0x0000000C, 0x00005B32, 0x00003412, 0x00000A14, 0x000500C7,
0x0000000C, 0x00005AB1, 0x00003C4B, 0x00000A05, 0x00050080, 0x0000000C,
0x00002A9C, 0x00005B32, 0x00005AB1, 0x000500C4, 0x0000000C, 0x00005B33,
0x00002A9C, 0x00000A11, 0x000500C7, 0x0000000C, 0x00005AB2, 0x00004158,
0x0000040B, 0x00050080, 0x0000000C, 0x00002A9D, 0x00005B33, 0x00005AB2,
0x000500C4, 0x0000000C, 0x00005B34, 0x00002A9D, 0x00000A14, 0x000500C7,
0x0000000C, 0x00005EA0, 0x00004158, 0x00000AC8, 0x00050080, 0x0000000C,
0x000054ED, 0x00005B34, 0x00005EA0, 0x000200F9, 0x00001E0B, 0x000200F8,
0x00006228, 0x0004007C, 0x00000012, 0x00001A8C, 0x00004993, 0x00050041,
0x00000288, 0x00004969, 0x0000147D, 0x00000A11, 0x0004003D, 0x0000000B,
0x00002EB2, 0x00004969, 0x00050051, 0x0000000C, 0x00004944, 0x00001A8C,
0x00000000, 0x000500C3, 0x0000000C, 0x00004CF5, 0x00004944, 0x00000A1A,
0x00050051, 0x0000000C, 0x00002747, 0x00001A8C, 0x00000001, 0x000500C3,
0x0000000C, 0x0000405C, 0x00002747, 0x00000A1A, 0x000500C2, 0x0000000B,
0x00005B4D, 0x00002EB2, 0x00000A19, 0x0004007C, 0x0000000C, 0x000018AB,
0x00005B4D, 0x00050084, 0x0000000C, 0x00005347, 0x0000405C, 0x000018AB,
0x00050080, 0x0000000C, 0x00003F5E, 0x00004CF5, 0x00005347, 0x000500C4,
0x0000000C, 0x00004A8E, 0x00003F5E, 0x00000A28, 0x000500C7, 0x0000000C,
0x00002AB6, 0x00004944, 0x00000A20, 0x000500C7, 0x0000000C, 0x00003139,
0x00002747, 0x00000A35, 0x000500C4, 0x0000000C, 0x0000454E, 0x00003139,
0x00000A11, 0x00050080, 0x0000000C, 0x00004397, 0x00002AB6, 0x0000454E,
0x000500C4, 0x0000000C, 0x000018E7, 0x00004397, 0x00000A13, 0x000500C7,
0x0000000C, 0x000027B1, 0x000018E7, 0x000009DB, 0x000500C4, 0x0000000C,
0x00002F76, 0x000027B1, 0x00000A0E, 0x00050080, 0x0000000C, 0x00003C4C,
0x00004A8E, 0x00002F76, 0x000500C7, 0x0000000C, 0x00003397, 0x000018E7,
0x00000A38, 0x00050080, 0x0000000C, 0x00004D30, 0x00003C4C, 0x00003397,
0x000500C7, 0x0000000C, 0x000047B5, 0x00002747, 0x00000A0E, 0x000500C4,
0x0000000C, 0x0000544D, 0x000047B5, 0x00000A17, 0x00050080, 0x0000000C,
0x00004159, 0x00004D30, 0x0000544D, 0x000500C7, 0x0000000C, 0x00005022,
0x00004159, 0x0000040B, 0x000500C4, 0x0000000C, 0x00002416, 0x00005022,
0x00000A14, 0x000500C7, 0x0000000C, 0x00004A33, 0x00002747, 0x00000A3B,
0x000500C4, 0x0000000C, 0x00002F77, 0x00004A33, 0x00000A20, 0x00050080,
0x0000000C, 0x0000415A, 0x00002416, 0x00002F77, 0x000500C7, 0x0000000C,
0x00004ADF, 0x00004159, 0x00000388, 0x000500C4, 0x0000000C, 0x0000544E,
0x00004ADF, 0x00000A11, 0x00050080, 0x0000000C, 0x00004144, 0x0000415A,
0x0000544E, 0x000500C7, 0x0000000C, 0x00005083, 0x00002747, 0x00000A23,
0x000500C3, 0x0000000C, 0x000041BF, 0x00005083, 0x00000A11, 0x000500C3,
0x0000000C, 0x00001EEC, 0x00004944, 0x00000A14, 0x00050080, 0x0000000C,
0x000035B6, 0x000041BF, 0x00001EEC, 0x000500C7, 0x0000000C, 0x00005453,
0x000035B6, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000544F, 0x00005453,
0x00000A1D, 0x00050080, 0x0000000C, 0x00003C4D, 0x00004144, 0x0000544F,
0x000500C7, 0x0000000C, 0x0000374D, 0x00004159, 0x00000AC8, 0x00050080,
0x0000000C, 0x00002F42, 0x00003C4D, 0x0000374D, 0x000200F9, 0x00001E0B,
0x000200F8, 0x00001E0B, 0x000700F5, 0x0000000C, 0x0000292C, 0x000054ED,
0x00002F61, 0x00002F42, 0x00006228, 0x000200F9, 0x00005AE2, 0x000200F8,
0x00002A0D, 0x00050041, 0x00000288, 0x00005098, 0x0000147D, 0x00000A11,
0x0004003D, 0x0000000B, 0x00003D0C, 0x00005098, 0x00050041, 0x00000288,
0x0000531B, 0x0000147D, 0x00000A14, 0x0004003D, 0x0000000B, 0x000034EE,
0x0000531B, 0x0004007C, 0x0000000C, 0x00003ADE, 0x000034EE, 0x00050084,
0x0000000C, 0x000049EF, 0x000018DA, 0x00003ADE, 0x00050080, 0x0000000C,
0x0000208E, 0x000049EF, 0x000044BE, 0x0004007C, 0x0000000C, 0x000022F8,
0x00003D0C, 0x00050084, 0x0000000C, 0x00001E9F, 0x0000208E, 0x000022F8,
0x00050080, 0x0000000C, 0x00001F30, 0x0000591A, 0x00001E9F, 0x000200F9,
0x00005AE2, 0x000200F8, 0x00005AE2, 0x000700F5, 0x0000000C, 0x00004D24,
0x0000292C, 0x00001E0B, 0x00001F30, 0x00002A0D, 0x00050041, 0x00000288,
0x0000615A, 0x0000147D, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00001D4E,
0x0000615A, 0x0004007C, 0x0000000C, 0x00003D46, 0x00001D4E, 0x00050080,
0x0000000C, 0x00003CDB, 0x00003D46, 0x00004D24, 0x0004007C, 0x0000000B,
0x0000487C, 0x00003CDB, 0x000500C2, 0x0000000B, 0x000053F5, 0x0000487C,
0x00000A16, 0x000500C2, 0x0000000B, 0x00003A95, 0x000053A3, 0x00000A10,
0x000500C7, 0x0000000B, 0x000020CA, 0x00003A95, 0x00000A13, 0x00060041,
0x00000294, 0x000050F7, 0x0000107A, 0x00000A0B, 0x000053F5, 0x0004003D,
0x00000017, 0x00001FCE, 0x000050F7, 0x000500AA, 0x00000009, 0x000035C0,
0x000020CA, 0x00000A0D, 0x000500AA, 0x00000009, 0x00005376, 0x000020CA,
0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x000035C0, 0x00005376,
0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686, 0x00002957,
0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F,
0x00001FCE, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F,
0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00001FCE, 0x0000072E,
0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5,
0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9, 0x00003463,
0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x00005879, 0x00001FCE,
0x00005AE2, 0x00003FF8, 0x00002957, 0x000500AA, 0x00000009, 0x00004CB6,
0x000020CA, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23, 0x00005376,
0x00004CB6, 0x000300F7, 0x0000368A, 0x00000000, 0x000400FA, 0x00003B23,
0x00002B38, 0x0000368A, 0x000200F8, 0x00002B38, 0x000500C4, 0x00000017,
0x00005E17, 0x00005879, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7,
0x00005879, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8, 0x00005E17,
0x00003BE7, 0x000200F9, 0x0000368A, 0x000200F8, 0x0000368A, 0x000700F5,
0x00000017, 0x000040DE, 0x00005879, 0x00003463, 0x000029E8, 0x00002B38,
0x000500C7, 0x00000017, 0x00004740, 0x000040DE, 0x00000352, 0x00040070,
0x0000001D, 0x000023B1, 0x00004740, 0x0005008E, 0x0000001D, 0x00004BA5,
0x000023B1, 0x0000092A, 0x000500C2, 0x00000017, 0x00005B47, 0x000040DE,
0x000002ED, 0x00040070, 0x0000001D, 0x0000483C, 0x00005B47, 0x0005008E,
0x0000001D, 0x00004812, 0x0000483C, 0x0000092A, 0x00050051, 0x0000000D,
0x0000187C, 0x00004BA5, 0x00000000, 0x00050051, 0x0000000D, 0x000035EE,
0x00004812, 0x00000000, 0x00050050, 0x00000013, 0x00004B20, 0x0000187C,
0x000035EE, 0x0006000C, 0x0000000B, 0x00002171, 0x00000001, 0x0000003A,
0x00004B20, 0x00050051, 0x0000000D, 0x00005BBF, 0x00004BA5, 0x00000001,
0x00050051, 0x0000000D, 0x000039A7, 0x00004812, 0x00000001, 0x00050050,
0x00000013, 0x00004B21, 0x00005BBF, 0x000039A7, 0x0006000C, 0x0000000B,
0x00002172, 0x00000001, 0x0000003A, 0x00004B21, 0x00050051, 0x0000000D,
0x00005BC0, 0x00004BA5, 0x00000002, 0x00050051, 0x0000000D, 0x000039A8,
0x00004812, 0x00000002, 0x00050050, 0x00000013, 0x00004B22, 0x00005BC0,
0x000039A8, 0x0006000C, 0x0000000B, 0x00002173, 0x00000001, 0x0000003A,
0x00004B22, 0x00050051, 0x0000000D, 0x00005BC1, 0x00004BA5, 0x00000003,
0x00050051, 0x0000000D, 0x000039A9, 0x00004812, 0x00000003, 0x00050050,
0x00000013, 0x00004B0D, 0x00005BC1, 0x000039A9, 0x0006000C, 0x0000000B,
0x000020EE, 0x00000001, 0x0000003A, 0x00004B0D, 0x00070050, 0x00000017,
0x00003ABB, 0x00002171, 0x00002172, 0x00002173, 0x000020EE, 0x00060041,
0x00000294, 0x000045C3, 0x0000140E, 0x00000A0B, 0x000054A6, 0x0003003E,
0x000045C3, 0x00003ABB, 0x00050080, 0x0000000B, 0x00003AC4, 0x000054A6,
0x00000A0E, 0x000600A9, 0x0000000B, 0x00004958, 0x000028E3, 0x00000A6A,
0x00000A3A, 0x000500C2, 0x0000000B, 0x00002E1B, 0x00004958, 0x00000A16,
0x00050080, 0x0000000B, 0x0000367B, 0x000053F5, 0x00002E1B, 0x00060041,
0x00000294, 0x0000571A, 0x0000107A, 0x00000A0B, 0x0000367B, 0x0004003D,
0x00000017, 0x000019B2, 0x0000571A, 0x000300F7, 0x00003A1A, 0x00000000,
0x000400FA, 0x00005686, 0x00002958, 0x00003A1A, 0x000200F8, 0x00002958,
0x000500C7, 0x00000017, 0x00004760, 0x000019B2, 0x000009CE, 0x000500C4,
0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017,
0x000050AD, 0x000019B2, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E,
0x000050AD, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2,
0x0000448E, 0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5,
0x00000017, 0x00002AAC, 0x000019B2, 0x0000368A, 0x00003FF9, 0x00002958,
0x000300F7, 0x0000368B, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39,
0x0000368B, 0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18,
0x00002AAC, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC,
0x000002ED, 0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8,
0x000200F9, 0x0000368B, 0x000200F8, 0x0000368B, 0x000700F5, 0x00000017,
0x000040DF, 0x00002AAC, 0x00003A1A, 0x000029E9, 0x00002B39, 0x000500C7,
0x00000017, 0x00004741, 0x000040DF, 0x00000352, 0x00040070, 0x0000001D,
0x000023B2, 0x00004741, 0x0005008E, 0x0000001D, 0x00004BA6, 0x000023B2,
0x0000092A, 0x000500C2, 0x00000017, 0x00005B48, 0x000040DF, 0x000002ED,
0x00040070, 0x0000001D, 0x0000483D, 0x00005B48, 0x0005008E, 0x0000001D,
0x00004813, 0x0000483D, 0x0000092A, 0x00050051, 0x0000000D, 0x0000187D,
0x00004BA6, 0x00000000, 0x00050051, 0x0000000D, 0x000035EF, 0x00004813,
0x00000000, 0x00050050, 0x00000013, 0x00004B23, 0x0000187D, 0x000035EF,
0x0006000C, 0x0000000B, 0x00002174, 0x00000001, 0x0000003A, 0x00004B23,
0x00050051, 0x0000000D, 0x00005BC2, 0x00004BA6, 0x00000001, 0x00050051,
0x0000000D, 0x000039AA, 0x00004813, 0x00000001, 0x00050050, 0x00000013,
0x00004B24, 0x00005BC2, 0x000039AA, 0x0006000C, 0x0000000B, 0x00002175,
0x00000001, 0x0000003A, 0x00004B24, 0x00050051, 0x0000000D, 0x00005BC3,
0x00004BA6, 0x00000002, 0x00050051, 0x0000000D, 0x000039AB, 0x00004813,
0x00000002, 0x00050050, 0x00000013, 0x00004B25, 0x00005BC3, 0x000039AB,
0x0006000C, 0x0000000B, 0x00002176, 0x00000001, 0x0000003A, 0x00004B25,
0x00050051, 0x0000000D, 0x00005BC4, 0x00004BA6, 0x00000003, 0x00050051,
0x0000000D, 0x000039AC, 0x00004813, 0x00000003, 0x00050050, 0x00000013,
0x00004B0E, 0x00005BC4, 0x000039AC, 0x0006000C, 0x0000000B, 0x000020EF,
0x00000001, 0x0000003A, 0x00004B0E, 0x00070050, 0x00000017, 0x00003ABC,
0x00002174, 0x00002175, 0x00002176, 0x000020EF, 0x00060041, 0x00000294,
0x00004EBE, 0x0000140E, 0x00000A0B, 0x00003AC4, 0x0003003E, 0x00004EBE,
0x00003ABC, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD,
0x00010038,
};

View File

@ -0,0 +1,753 @@
// Generated with `xb buildshaders`.
#if 0
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 10
; Bound: 25179
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %5663 "main" %gl_GlobalInvocationID
OpExecutionMode %5663 LocalSize 8 32 1
OpMemberDecorate %_struct_1161 0 Offset 0
OpMemberDecorate %_struct_1161 1 Offset 4
OpMemberDecorate %_struct_1161 2 Offset 8
OpMemberDecorate %_struct_1161 3 Offset 12
OpMemberDecorate %_struct_1161 4 Offset 16
OpMemberDecorate %_struct_1161 5 Offset 28
OpMemberDecorate %_struct_1161 6 Offset 32
OpMemberDecorate %_struct_1161 7 Offset 36
OpDecorate %_struct_1161 Block
OpDecorate %5245 DescriptorSet 2
OpDecorate %5245 Binding 0
OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
OpDecorate %_runtimearr_v4uint ArrayStride 16
OpMemberDecorate %_struct_1972 0 NonReadable
OpMemberDecorate %_struct_1972 0 Offset 0
OpDecorate %_struct_1972 BufferBlock
OpDecorate %5134 DescriptorSet 0
OpDecorate %5134 Binding 0
OpDecorate %_runtimearr_v4uint_0 ArrayStride 16
OpMemberDecorate %_struct_1973 0 NonWritable
OpMemberDecorate %_struct_1973 0 Offset 0
OpDecorate %_struct_1973 BufferBlock
OpDecorate %4218 DescriptorSet 1
OpDecorate %4218 Binding 0
OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
%void = OpTypeVoid
%1282 = OpTypeFunction %void
%uint = OpTypeInt 32 0
%v4uint = OpTypeVector %uint 4
%int = OpTypeInt 32 1
%v2int = OpTypeVector %int 2
%v3int = OpTypeVector %int 3
%bool = OpTypeBool
%v3uint = OpTypeVector %uint 3
%v2uint = OpTypeVector %uint 2
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%uint_65535 = OpConstant %uint 65535
%float_1_52590219en05 = OpConstant %float 1.52590219e-05
%uint_16 = OpConstant %uint 16
%uint_0 = OpConstant %uint 0
%v2float = OpTypeVector %float 2
%uint_1 = OpConstant %uint 1
%uint_2 = OpConstant %uint 2
%uint_3 = OpConstant %uint 3
%uint_16711935 = OpConstant %uint 16711935
%uint_8 = OpConstant %uint 8
%uint_4278255360 = OpConstant %uint 4278255360
%int_5 = OpConstant %int 5
%uint_5 = OpConstant %uint 5
%int_7 = OpConstant %int 7
%int_14 = OpConstant %int 14
%int_2 = OpConstant %int 2
%int_n16 = OpConstant %int -16
%int_1 = OpConstant %int 1
%int_15 = OpConstant %int 15
%int_4 = OpConstant %int 4
%int_n512 = OpConstant %int -512
%int_3 = OpConstant %int 3
%int_16 = OpConstant %int 16
%int_448 = OpConstant %int 448
%int_8 = OpConstant %int 8
%int_6 = OpConstant %int 6
%int_63 = OpConstant %int 63
%uint_4 = OpConstant %uint 4
%uint_6 = OpConstant %uint 6
%int_268435455 = OpConstant %int 268435455
%int_n2 = OpConstant %int -2
%uint_32 = OpConstant %uint 32
%_struct_1161 = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint
%_ptr_Uniform__struct_1161 = OpTypePointer Uniform %_struct_1161
%5245 = OpVariable %_ptr_Uniform__struct_1161 Uniform
%int_0 = OpConstant %int 0
%_ptr_Uniform_uint = OpTypePointer Uniform %uint
%1915 = OpConstantComposite %v2uint %uint_4 %uint_6
%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
%2596 = OpConstantComposite %v3uint %uint_2 %uint_0 %uint_0
%v2bool = OpTypeVector %bool 2
%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint
%_struct_1972 = OpTypeStruct %_runtimearr_v4uint
%_ptr_Uniform__struct_1972 = OpTypePointer Uniform %_struct_1972
%5134 = OpVariable %_ptr_Uniform__struct_1972 Uniform
%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint
%_struct_1973 = OpTypeStruct %_runtimearr_v4uint_0
%_ptr_Uniform__struct_1973 = OpTypePointer Uniform %_struct_1973
%4218 = OpVariable %_ptr_Uniform__struct_1973 Uniform
%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint
%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_32 %uint_1
%1870 = OpConstantComposite %v2uint %uint_3 %uint_3
%uint_9 = OpConstant %uint 9
%uint_10 = OpConstant %uint 10
%2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935
%317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8
%1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360
%749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16
%850 = OpConstantComposite %v4uint %uint_65535 %uint_65535 %uint_65535 %uint_65535
%5663 = OpFunction %void None %1282
%15110 = OpLabel
OpSelectionMerge %19578 None
OpSwitch %uint_0 %15137
%15137 = OpLabel
%12591 = OpLoad %v3uint %gl_GlobalInvocationID
%10229 = OpShiftLeftLogical %v3uint %12591 %2596
%25178 = OpAccessChain %_ptr_Uniform_v3uint %5245 %int_4
%22965 = OpLoad %v3uint %25178
%18835 = OpVectorShuffle %v2uint %10229 %10229 0 1
%6626 = OpVectorShuffle %v2uint %22965 %22965 0 1
%17032 = OpUGreaterThanEqual %v2bool %18835 %6626
%24679 = OpAny %bool %17032
OpSelectionMerge %6282 DontFlatten
OpBranchConditional %24679 %21992 %6282
%21992 = OpLabel
OpBranch %19578
%6282 = OpLabel
%6795 = OpBitcast %v3int %10229
%18792 = OpAccessChain %_ptr_Uniform_uint %5245 %int_6
%9788 = OpLoad %uint %18792
%20376 = OpCompositeExtract %uint %22965 1
%14692 = OpCompositeExtract %int %6795 0
%22810 = OpIMul %int %14692 %int_8
%6362 = OpCompositeExtract %int %6795 2
%14505 = OpBitcast %int %20376
%11279 = OpIMul %int %6362 %14505
%17598 = OpCompositeExtract %int %6795 1
%22228 = OpIAdd %int %11279 %17598
%22405 = OpBitcast %int %9788
%24535 = OpIMul %int %22228 %22405
%7061 = OpIAdd %int %22810 %24535
%19270 = OpBitcast %uint %7061
%19460 = OpAccessChain %_ptr_Uniform_uint %5245 %int_5
%22875 = OpLoad %uint %19460
%8517 = OpIAdd %uint %19270 %22875
%21670 = OpShiftRightLogical %uint %8517 %uint_4
%18404 = OpAccessChain %_ptr_Uniform_uint %5245 %int_1
%23432 = OpLoad %uint %18404
%22700 = OpAccessChain %_ptr_Uniform_uint %5245 %int_0
%20387 = OpLoad %uint %22700
%22279 = OpBitwiseAnd %uint %20387 %uint_2
%19223 = OpINotEqual %bool %22279 %uint_0
%17247 = OpCompositeConstruct %v2uint %20387 %20387
%22947 = OpShiftRightLogical %v2uint %17247 %1915
%6551 = OpBitwiseAnd %v2uint %22947 %1870
%18732 = OpAccessChain %_ptr_Uniform_uint %5245 %int_2
%24236 = OpLoad %uint %18732
%20458 = OpAccessChain %_ptr_Uniform_uint %5245 %int_3
%22167 = OpLoad %uint %20458
%18929 = OpCompositeExtract %uint %10229 0
%6638 = OpShiftRightLogical %uint %18929 %uint_1
%9988 = OpCompositeExtract %uint %10229 1
%23563 = OpCompositeConstruct %v2uint %6638 %9988
%8041 = OpUDiv %v2uint %23563 %6551
%13932 = OpCompositeExtract %uint %8041 0
%19789 = OpShiftLeftLogical %uint %13932 %uint_1
%20905 = OpCompositeExtract %uint %8041 1
%23022 = OpCompositeExtract %uint %10229 2
%9417 = OpCompositeConstruct %v3uint %19789 %20905 %23022
OpSelectionMerge %21313 DontFlatten
OpBranchConditional %19223 %21373 %11737
%21373 = OpLabel
%10608 = OpBitcast %v3int %9417
%17090 = OpCompositeExtract %int %10608 1
%9469 = OpShiftRightArithmetic %int %17090 %int_4
%10055 = OpCompositeExtract %int %10608 2
%16476 = OpShiftRightArithmetic %int %10055 %int_2
%23373 = OpShiftRightLogical %uint %22167 %uint_4
%6314 = OpBitcast %int %23373
%21281 = OpIMul %int %16476 %6314
%15143 = OpIAdd %int %9469 %21281
%9032 = OpShiftRightLogical %uint %24236 %uint_5
%12427 = OpBitcast %int %9032
%10360 = OpIMul %int %15143 %12427
%25154 = OpCompositeExtract %int %10608 0
%20423 = OpShiftRightArithmetic %int %25154 %int_5
%18940 = OpIAdd %int %20423 %10360
%8797 = OpShiftLeftLogical %int %18940 %uint_9
%11510 = OpBitwiseAnd %int %8797 %int_268435455
%18938 = OpShiftLeftLogical %int %11510 %int_1
%19768 = OpBitwiseAnd %int %25154 %int_7
%12600 = OpBitwiseAnd %int %17090 %int_6
%17741 = OpShiftLeftLogical %int %12600 %int_2
%17227 = OpIAdd %int %19768 %17741
%7048 = OpShiftLeftLogical %int %17227 %uint_9
%24035 = OpShiftRightArithmetic %int %7048 %int_6
%8725 = OpShiftRightArithmetic %int %17090 %int_3
%13731 = OpIAdd %int %8725 %16476
%23052 = OpBitwiseAnd %int %13731 %int_1
%16658 = OpShiftRightArithmetic %int %25154 %int_3
%18794 = OpShiftLeftLogical %int %23052 %int_1
%13501 = OpIAdd %int %16658 %18794
%19165 = OpBitwiseAnd %int %13501 %int_3
%21578 = OpShiftLeftLogical %int %19165 %int_1
%15435 = OpIAdd %int %23052 %21578
%13150 = OpBitwiseAnd %int %24035 %int_n16
%20336 = OpIAdd %int %18938 %13150
%23345 = OpShiftLeftLogical %int %20336 %int_1
%23274 = OpBitwiseAnd %int %24035 %int_15
%10332 = OpIAdd %int %23345 %23274
%18356 = OpBitwiseAnd %int %10055 %int_3
%21579 = OpShiftLeftLogical %int %18356 %uint_9
%16727 = OpIAdd %int %10332 %21579
%19166 = OpBitwiseAnd %int %17090 %int_1
%21580 = OpShiftLeftLogical %int %19166 %int_4
%16728 = OpIAdd %int %16727 %21580
%20438 = OpBitwiseAnd %int %15435 %int_1
%9987 = OpShiftLeftLogical %int %20438 %int_3
%13106 = OpShiftRightArithmetic %int %16728 %int_6
%14038 = OpBitwiseAnd %int %13106 %int_7
%13330 = OpIAdd %int %9987 %14038
%23346 = OpShiftLeftLogical %int %13330 %int_3
%23217 = OpBitwiseAnd %int %15435 %int_n2
%10908 = OpIAdd %int %23346 %23217
%23347 = OpShiftLeftLogical %int %10908 %int_2
%23218 = OpBitwiseAnd %int %16728 %int_n512
%10909 = OpIAdd %int %23347 %23218
%23348 = OpShiftLeftLogical %int %10909 %int_3
%21849 = OpBitwiseAnd %int %16728 %int_63
%24314 = OpIAdd %int %23348 %21849
%22127 = OpBitcast %uint %24314
OpBranch %21313
%11737 = OpLabel
%9761 = OpVectorShuffle %v2uint %9417 %9417 0 1
%22991 = OpBitcast %v2int %9761
%6403 = OpCompositeExtract %int %22991 0
%9470 = OpShiftRightArithmetic %int %6403 %int_5
%10056 = OpCompositeExtract %int %22991 1
%16477 = OpShiftRightArithmetic %int %10056 %int_5
%23374 = OpShiftRightLogical %uint %24236 %uint_5
%6315 = OpBitcast %int %23374
%21319 = OpIMul %int %16477 %6315
%16222 = OpIAdd %int %9470 %21319
%19086 = OpShiftLeftLogical %int %16222 %uint_10
%10934 = OpBitwiseAnd %int %6403 %int_7
%12601 = OpBitwiseAnd %int %10056 %int_14
%17742 = OpShiftLeftLogical %int %12601 %int_2
%17303 = OpIAdd %int %10934 %17742
%6375 = OpShiftLeftLogical %int %17303 %uint_3
%10161 = OpBitwiseAnd %int %6375 %int_n16
%12150 = OpShiftLeftLogical %int %10161 %int_1
%15436 = OpIAdd %int %19086 %12150
%13207 = OpBitwiseAnd %int %6375 %int_15
%19760 = OpIAdd %int %15436 %13207
%18357 = OpBitwiseAnd %int %10056 %int_1
%21581 = OpShiftLeftLogical %int %18357 %int_4
%16729 = OpIAdd %int %19760 %21581
%20514 = OpBitwiseAnd %int %16729 %int_n512
%9238 = OpShiftLeftLogical %int %20514 %int_3
%18995 = OpBitwiseAnd %int %10056 %int_16
%12151 = OpShiftLeftLogical %int %18995 %int_7
%16730 = OpIAdd %int %9238 %12151
%19167 = OpBitwiseAnd %int %16729 %int_448
%21582 = OpShiftLeftLogical %int %19167 %int_2
%16708 = OpIAdd %int %16730 %21582
%20611 = OpBitwiseAnd %int %10056 %int_8
%16831 = OpShiftRightArithmetic %int %20611 %int_2
%7916 = OpShiftRightArithmetic %int %6403 %int_3
%13750 = OpIAdd %int %16831 %7916
%21587 = OpBitwiseAnd %int %13750 %int_3
%21583 = OpShiftLeftLogical %int %21587 %int_6
%15437 = OpIAdd %int %16708 %21583
%11782 = OpBitwiseAnd %int %16729 %int_63
%14671 = OpIAdd %int %15437 %11782
%22128 = OpBitcast %uint %14671
OpBranch %21313
%21313 = OpLabel
%9468 = OpPhi %uint %22127 %21373 %22128 %11737
%16296 = OpIMul %v2uint %8041 %6551
%15292 = OpISub %v2uint %23563 %16296
%7303 = OpCompositeExtract %uint %6551 0
%22882 = OpCompositeExtract %uint %6551 1
%13170 = OpIMul %uint %7303 %22882
%15520 = OpIMul %uint %9468 %13170
%16084 = OpCompositeExtract %uint %15292 0
%15890 = OpIMul %uint %16084 %22882
%6886 = OpCompositeExtract %uint %15292 1
%11045 = OpIAdd %uint %15890 %6886
%24733 = OpShiftLeftLogical %uint %11045 %uint_1
%23219 = OpBitwiseAnd %uint %18929 %uint_1
%9559 = OpIAdd %uint %24733 %23219
%16557 = OpShiftLeftLogical %uint %9559 %uint_3
%20138 = OpIAdd %uint %15520 %16557
%17724 = OpIAdd %uint %23432 %20138
%14040 = OpShiftRightLogical %uint %17724 %uint_4
%11766 = OpShiftRightLogical %uint %20387 %uint_2
%8394 = OpBitwiseAnd %uint %11766 %uint_3
%20727 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %14040
%8142 = OpLoad %v4uint %20727
%13760 = OpIEqual %bool %8394 %uint_1
%21366 = OpIEqual %bool %8394 %uint_2
%22150 = OpLogicalOr %bool %13760 %21366
OpSelectionMerge %13411 None
OpBranchConditional %22150 %10583 %13411
%10583 = OpLabel
%18271 = OpBitwiseAnd %v4uint %8142 %2510
%9425 = OpShiftLeftLogical %v4uint %18271 %317
%20652 = OpBitwiseAnd %v4uint %8142 %1838
%17549 = OpShiftRightLogical %v4uint %20652 %317
%16376 = OpBitwiseOr %v4uint %9425 %17549
OpBranch %13411
%13411 = OpLabel
%22649 = OpPhi %v4uint %8142 %21313 %16376 %10583
%19638 = OpIEqual %bool %8394 %uint_3
%15139 = OpLogicalOr %bool %21366 %19638
OpSelectionMerge %13962 None
OpBranchConditional %15139 %11064 %13962
%11064 = OpLabel
%24087 = OpShiftLeftLogical %v4uint %22649 %749
%15335 = OpShiftRightLogical %v4uint %22649 %749
%10728 = OpBitwiseOr %v4uint %24087 %15335
OpBranch %13962
%13962 = OpLabel
%16606 = OpPhi %v4uint %22649 %13411 %10728 %11064
%18240 = OpBitwiseAnd %v4uint %16606 %850
%9137 = OpConvertUToF %v4float %18240
%19365 = OpVectorTimesScalar %v4float %9137 %float_1_52590219en05
%23367 = OpShiftRightLogical %v4uint %16606 %749
%18492 = OpConvertUToF %v4float %23367
%18450 = OpVectorTimesScalar %v4float %18492 %float_1_52590219en05
%6268 = OpCompositeExtract %float %19365 0
%13806 = OpCompositeExtract %float %18450 0
%19232 = OpCompositeConstruct %v2float %6268 %13806
%8561 = OpExtInst %uint %1 PackHalf2x16 %19232
%23487 = OpCompositeExtract %float %19365 1
%14759 = OpCompositeExtract %float %18450 1
%19233 = OpCompositeConstruct %v2float %23487 %14759
%8562 = OpExtInst %uint %1 PackHalf2x16 %19233
%23488 = OpCompositeExtract %float %19365 2
%14760 = OpCompositeExtract %float %18450 2
%19234 = OpCompositeConstruct %v2float %23488 %14760
%8563 = OpExtInst %uint %1 PackHalf2x16 %19234
%23489 = OpCompositeExtract %float %19365 3
%14761 = OpCompositeExtract %float %18450 3
%19213 = OpCompositeConstruct %v2float %23489 %14761
%8430 = OpExtInst %uint %1 PackHalf2x16 %19213
%15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430
%17859 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %21670
OpStore %17859 %15035
%15532 = OpIAdd %uint %21670 %int_1
%6417 = OpUGreaterThan %bool %7303 %uint_1
OpSelectionMerge %24764 DontFlatten
OpBranchConditional %6417 %20612 %20628
%20612 = OpLabel
%13975 = OpUDiv %uint %6638 %7303
%9086 = OpIMul %uint %13975 %7303
%12657 = OpISub %uint %6638 %9086
%9511 = OpIAdd %uint %12657 %uint_1
%13375 = OpIEqual %bool %9511 %7303
OpSelectionMerge %7917 None
OpBranchConditional %13375 %22174 %8593
%22174 = OpLabel
%19289 = OpIMul %uint %uint_32 %7303
%21519 = OpShiftLeftLogical %uint %12657 %uint_4
%18756 = OpISub %uint %19289 %21519
OpBranch %7917
%8593 = OpLabel
OpBranch %7917
%7917 = OpLabel
%10540 = OpPhi %uint %18756 %22174 %uint_16 %8593
OpBranch %24764
%20628 = OpLabel
OpBranch %24764
%24764 = OpLabel
%10684 = OpPhi %uint %10540 %7917 %uint_32 %20628
%18731 = OpIMul %uint %10684 %22882
%16493 = OpShiftRightLogical %uint %18731 %uint_4
%13163 = OpIAdd %uint %14040 %16493
%22298 = OpAccessChain %_ptr_Uniform_v4uint %4218 %int_0 %13163
%6578 = OpLoad %v4uint %22298
OpSelectionMerge %14874 None
OpBranchConditional %22150 %10584 %14874
%10584 = OpLabel
%18272 = OpBitwiseAnd %v4uint %6578 %2510
%9426 = OpShiftLeftLogical %v4uint %18272 %317
%20653 = OpBitwiseAnd %v4uint %6578 %1838
%17550 = OpShiftRightLogical %v4uint %20653 %317
%16377 = OpBitwiseOr %v4uint %9426 %17550
OpBranch %14874
%14874 = OpLabel
%10924 = OpPhi %v4uint %6578 %24764 %16377 %10584
OpSelectionMerge %13963 None
OpBranchConditional %15139 %11065 %13963
%11065 = OpLabel
%24088 = OpShiftLeftLogical %v4uint %10924 %749
%15336 = OpShiftRightLogical %v4uint %10924 %749
%10729 = OpBitwiseOr %v4uint %24088 %15336
OpBranch %13963
%13963 = OpLabel
%16607 = OpPhi %v4uint %10924 %14874 %10729 %11065
%18241 = OpBitwiseAnd %v4uint %16607 %850
%9138 = OpConvertUToF %v4float %18241
%19366 = OpVectorTimesScalar %v4float %9138 %float_1_52590219en05
%23368 = OpShiftRightLogical %v4uint %16607 %749
%18493 = OpConvertUToF %v4float %23368
%18451 = OpVectorTimesScalar %v4float %18493 %float_1_52590219en05
%6269 = OpCompositeExtract %float %19366 0
%13807 = OpCompositeExtract %float %18451 0
%19235 = OpCompositeConstruct %v2float %6269 %13807
%8564 = OpExtInst %uint %1 PackHalf2x16 %19235
%23490 = OpCompositeExtract %float %19366 1
%14762 = OpCompositeExtract %float %18451 1
%19236 = OpCompositeConstruct %v2float %23490 %14762
%8565 = OpExtInst %uint %1 PackHalf2x16 %19236
%23491 = OpCompositeExtract %float %19366 2
%14763 = OpCompositeExtract %float %18451 2
%19237 = OpCompositeConstruct %v2float %23491 %14763
%8566 = OpExtInst %uint %1 PackHalf2x16 %19237
%23492 = OpCompositeExtract %float %19366 3
%14764 = OpCompositeExtract %float %18451 3
%19214 = OpCompositeConstruct %v2float %23492 %14764
%8431 = OpExtInst %uint %1 PackHalf2x16 %19214
%15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431
%20158 = OpAccessChain %_ptr_Uniform_v4uint %5134 %int_0 %15532
OpStore %20158 %15036
OpBranch %19578
%19578 = OpLabel
OpReturn
OpFunctionEnd
#endif
const uint32_t texture_load_rgba16_unorm_float_scaled_cs[] = {
0x07230203, 0x00010000, 0x0008000A, 0x0000625B, 0x00000000, 0x00020011,
0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,
0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,
0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,
0x00000011, 0x00000008, 0x00000020, 0x00000001, 0x00050048, 0x00000489,
0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001,
0x00000023, 0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023,
0x00000008, 0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C,
0x00050048, 0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048,
0x00000489, 0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489,
0x00000006, 0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007,
0x00000023, 0x00000024, 0x00030047, 0x00000489, 0x00000002, 0x00040047,
0x0000147D, 0x00000022, 0x00000002, 0x00040047, 0x0000147D, 0x00000021,
0x00000000, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,
0x000007DC, 0x00000006, 0x00000010, 0x00040048, 0x000007B4, 0x00000000,
0x00000019, 0x00050048, 0x000007B4, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B4, 0x00000003, 0x00040047, 0x0000140E, 0x00000022,
0x00000000, 0x00040047, 0x0000140E, 0x00000021, 0x00000000, 0x00040047,
0x000007DD, 0x00000006, 0x00000010, 0x00040048, 0x000007B5, 0x00000000,
0x00000018, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,
0x00030047, 0x000007B5, 0x00000003, 0x00040047, 0x0000107A, 0x00000022,
0x00000001, 0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047,
0x00000024, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,
0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,
0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,
0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,
0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,
0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00040017, 0x00000011,
0x0000000B, 0x00000002, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,
0x0000001D, 0x0000000D, 0x00000004, 0x0004002B, 0x0000000B, 0x000001C1,
0x0000FFFF, 0x0004002B, 0x0000000D, 0x0000092A, 0x37800080, 0x0004002B,
0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B, 0x00000A0A,
0x00000000, 0x00040017, 0x00000013, 0x0000000D, 0x00000002, 0x0004002B,
0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A10,
0x00000002, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B,
0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22,
0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B,
0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000B, 0x00000A19,
0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B,
0x0000000C, 0x00000A35, 0x0000000E, 0x0004002B, 0x0000000C, 0x00000A11,
0x00000002, 0x0004002B, 0x0000000C, 0x000009DB, 0xFFFFFFF0, 0x0004002B,
0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A38,
0x0000000F, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B,
0x0000000C, 0x0000040B, 0xFFFFFE00, 0x0004002B, 0x0000000C, 0x00000A14,
0x00000003, 0x0004002B, 0x0000000C, 0x00000A3B, 0x00000010, 0x0004002B,
0x0000000C, 0x00000388, 0x000001C0, 0x0004002B, 0x0000000C, 0x00000A23,
0x00000008, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B,
0x0000000C, 0x00000AC8, 0x0000003F, 0x0004002B, 0x0000000B, 0x00000A16,
0x00000004, 0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006, 0x0004002B,
0x0000000C, 0x0000078B, 0x0FFFFFFF, 0x0004002B, 0x0000000C, 0x00000A05,
0xFFFFFFFE, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x000A001E,
0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00000014,
0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706, 0x00000002,
0x00000489, 0x0004003B, 0x00000706, 0x0000147D, 0x00000002, 0x0004002B,
0x0000000C, 0x00000A0B, 0x00000000, 0x00040020, 0x00000288, 0x00000002,
0x0000000B, 0x0005002C, 0x00000011, 0x0000077B, 0x00000A16, 0x00000A1C,
0x00040020, 0x00000291, 0x00000002, 0x00000014, 0x00040020, 0x00000292,
0x00000001, 0x00000014, 0x0004003B, 0x00000292, 0x00000F48, 0x00000001,
0x0006002C, 0x00000014, 0x00000A24, 0x00000A10, 0x00000A0A, 0x00000A0A,
0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0003001D, 0x000007DC,
0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A31,
0x00000002, 0x000007B4, 0x0004003B, 0x00000A31, 0x0000140E, 0x00000002,
0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD,
0x00040020, 0x00000A32, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A32,
0x0000107A, 0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017,
0x0006002C, 0x00000014, 0x00000024, 0x00000A22, 0x00000A6A, 0x00000A0D,
0x0005002C, 0x00000011, 0x0000074E, 0x00000A13, 0x00000A13, 0x0004002B,
0x0000000B, 0x00000A25, 0x00000009, 0x0004002B, 0x0000000B, 0x00000A28,
0x0000000A, 0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6,
0x000008A6, 0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22,
0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E,
0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017,
0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0007002C,
0x00000017, 0x00000352, 0x000001C1, 0x000001C1, 0x000001C1, 0x000001C1,
0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,
0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A,
0x00003B21, 0x000200F8, 0x00003B21, 0x0004003D, 0x00000014, 0x0000312F,
0x00000F48, 0x000500C4, 0x00000014, 0x000027F5, 0x0000312F, 0x00000A24,
0x00050041, 0x00000291, 0x0000625A, 0x0000147D, 0x00000A17, 0x0004003D,
0x00000014, 0x000059B5, 0x0000625A, 0x0007004F, 0x00000011, 0x00004993,
0x000027F5, 0x000027F5, 0x00000000, 0x00000001, 0x0007004F, 0x00000011,
0x000019E2, 0x000059B5, 0x000059B5, 0x00000000, 0x00000001, 0x000500AE,
0x0000000F, 0x00004288, 0x00004993, 0x000019E2, 0x0004009A, 0x00000009,
0x00006067, 0x00004288, 0x000300F7, 0x0000188A, 0x00000002, 0x000400FA,
0x00006067, 0x000055E8, 0x0000188A, 0x000200F8, 0x000055E8, 0x000200F9,
0x00004C7A, 0x000200F8, 0x0000188A, 0x0004007C, 0x00000016, 0x00001A8B,
0x000027F5, 0x00050041, 0x00000288, 0x00004968, 0x0000147D, 0x00000A1D,
0x0004003D, 0x0000000B, 0x0000263C, 0x00004968, 0x00050051, 0x0000000B,
0x00004F98, 0x000059B5, 0x00000001, 0x00050051, 0x0000000C, 0x00003964,
0x00001A8B, 0x00000000, 0x00050084, 0x0000000C, 0x0000591A, 0x00003964,
0x00000A23, 0x00050051, 0x0000000C, 0x000018DA, 0x00001A8B, 0x00000002,
0x0004007C, 0x0000000C, 0x000038A9, 0x00004F98, 0x00050084, 0x0000000C,
0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE,
0x00001A8B, 0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F,
0x000044BE, 0x0004007C, 0x0000000C, 0x00005785, 0x0000263C, 0x00050084,
0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C,
0x00001B95, 0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B, 0x00004B46,
0x00001B95, 0x00050041, 0x00000288, 0x00004C04, 0x0000147D, 0x00000A1A,
0x0004003D, 0x0000000B, 0x0000595B, 0x00004C04, 0x00050080, 0x0000000B,
0x00002145, 0x00004B46, 0x0000595B, 0x000500C2, 0x0000000B, 0x000054A6,
0x00002145, 0x00000A16, 0x00050041, 0x00000288, 0x000047E4, 0x0000147D,
0x00000A0E, 0x0004003D, 0x0000000B, 0x00005B88, 0x000047E4, 0x00050041,
0x00000288, 0x000058AC, 0x0000147D, 0x00000A0B, 0x0004003D, 0x0000000B,
0x00004FA3, 0x000058AC, 0x000500C7, 0x0000000B, 0x00005707, 0x00004FA3,
0x00000A10, 0x000500AB, 0x00000009, 0x00004B17, 0x00005707, 0x00000A0A,
0x00050050, 0x00000011, 0x0000435F, 0x00004FA3, 0x00004FA3, 0x000500C2,
0x00000011, 0x000059A3, 0x0000435F, 0x0000077B, 0x000500C7, 0x00000011,
0x00001997, 0x000059A3, 0x0000074E, 0x00050041, 0x00000288, 0x0000492C,
0x0000147D, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C,
0x00050041, 0x00000288, 0x00004FEA, 0x0000147D, 0x00000A14, 0x0004003D,
0x0000000B, 0x00005697, 0x00004FEA, 0x00050051, 0x0000000B, 0x000049F1,
0x000027F5, 0x00000000, 0x000500C2, 0x0000000B, 0x000019EE, 0x000049F1,
0x00000A0D, 0x00050051, 0x0000000B, 0x00002704, 0x000027F5, 0x00000001,
0x00050050, 0x00000011, 0x00005C0B, 0x000019EE, 0x00002704, 0x00050086,
0x00000011, 0x00001F69, 0x00005C0B, 0x00001997, 0x00050051, 0x0000000B,
0x0000366C, 0x00001F69, 0x00000000, 0x000500C4, 0x0000000B, 0x00004D4D,
0x0000366C, 0x00000A0D, 0x00050051, 0x0000000B, 0x000051A9, 0x00001F69,
0x00000001, 0x00050051, 0x0000000B, 0x000059EE, 0x000027F5, 0x00000002,
0x00060050, 0x00000014, 0x000024C9, 0x00004D4D, 0x000051A9, 0x000059EE,
0x000300F7, 0x00005341, 0x00000002, 0x000400FA, 0x00004B17, 0x0000537D,
0x00002DD9, 0x000200F8, 0x0000537D, 0x0004007C, 0x00000016, 0x00002970,
0x000024C9, 0x00050051, 0x0000000C, 0x000042C2, 0x00002970, 0x00000001,
0x000500C3, 0x0000000C, 0x000024FD, 0x000042C2, 0x00000A17, 0x00050051,
0x0000000C, 0x00002747, 0x00002970, 0x00000002, 0x000500C3, 0x0000000C,
0x0000405C, 0x00002747, 0x00000A11, 0x000500C2, 0x0000000B, 0x00005B4D,
0x00005697, 0x00000A16, 0x0004007C, 0x0000000C, 0x000018AA, 0x00005B4D,
0x00050084, 0x0000000C, 0x00005321, 0x0000405C, 0x000018AA, 0x00050080,
0x0000000C, 0x00003B27, 0x000024FD, 0x00005321, 0x000500C2, 0x0000000B,
0x00002348, 0x00005EAC, 0x00000A19, 0x0004007C, 0x0000000C, 0x0000308B,
0x00002348, 0x00050084, 0x0000000C, 0x00002878, 0x00003B27, 0x0000308B,
0x00050051, 0x0000000C, 0x00006242, 0x00002970, 0x00000000, 0x000500C3,
0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A, 0x00050080, 0x0000000C,
0x000049FC, 0x00004FC7, 0x00002878, 0x000500C4, 0x0000000C, 0x0000225D,
0x000049FC, 0x00000A25, 0x000500C7, 0x0000000C, 0x00002CF6, 0x0000225D,
0x0000078B, 0x000500C4, 0x0000000C, 0x000049FA, 0x00002CF6, 0x00000A0E,
0x000500C7, 0x0000000C, 0x00004D38, 0x00006242, 0x00000A20, 0x000500C7,
0x0000000C, 0x00003138, 0x000042C2, 0x00000A1D, 0x000500C4, 0x0000000C,
0x0000454D, 0x00003138, 0x00000A11, 0x00050080, 0x0000000C, 0x0000434B,
0x00004D38, 0x0000454D, 0x000500C4, 0x0000000C, 0x00001B88, 0x0000434B,
0x00000A25, 0x000500C3, 0x0000000C, 0x00005DE3, 0x00001B88, 0x00000A1D,
0x000500C3, 0x0000000C, 0x00002215, 0x000042C2, 0x00000A14, 0x00050080,
0x0000000C, 0x000035A3, 0x00002215, 0x0000405C, 0x000500C7, 0x0000000C,
0x00005A0C, 0x000035A3, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00004112,
0x00006242, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000496A, 0x00005A0C,
0x00000A0E, 0x00050080, 0x0000000C, 0x000034BD, 0x00004112, 0x0000496A,
0x000500C7, 0x0000000C, 0x00004ADD, 0x000034BD, 0x00000A14, 0x000500C4,
0x0000000C, 0x0000544A, 0x00004ADD, 0x00000A0E, 0x00050080, 0x0000000C,
0x00003C4B, 0x00005A0C, 0x0000544A, 0x000500C7, 0x0000000C, 0x0000335E,
0x00005DE3, 0x000009DB, 0x00050080, 0x0000000C, 0x00004F70, 0x000049FA,
0x0000335E, 0x000500C4, 0x0000000C, 0x00005B31, 0x00004F70, 0x00000A0E,
0x000500C7, 0x0000000C, 0x00005AEA, 0x00005DE3, 0x00000A38, 0x00050080,
0x0000000C, 0x0000285C, 0x00005B31, 0x00005AEA, 0x000500C7, 0x0000000C,
0x000047B4, 0x00002747, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000544B,
0x000047B4, 0x00000A25, 0x00050080, 0x0000000C, 0x00004157, 0x0000285C,
0x0000544B, 0x000500C7, 0x0000000C, 0x00004ADE, 0x000042C2, 0x00000A0E,
0x000500C4, 0x0000000C, 0x0000544C, 0x00004ADE, 0x00000A17, 0x00050080,
0x0000000C, 0x00004158, 0x00004157, 0x0000544C, 0x000500C7, 0x0000000C,
0x00004FD6, 0x00003C4B, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00002703,
0x00004FD6, 0x00000A14, 0x000500C3, 0x0000000C, 0x00003332, 0x00004158,
0x00000A1D, 0x000500C7, 0x0000000C, 0x000036D6, 0x00003332, 0x00000A20,
0x00050080, 0x0000000C, 0x00003412, 0x00002703, 0x000036D6, 0x000500C4,
0x0000000C, 0x00005B32, 0x00003412, 0x00000A14, 0x000500C7, 0x0000000C,
0x00005AB1, 0x00003C4B, 0x00000A05, 0x00050080, 0x0000000C, 0x00002A9C,
0x00005B32, 0x00005AB1, 0x000500C4, 0x0000000C, 0x00005B33, 0x00002A9C,
0x00000A11, 0x000500C7, 0x0000000C, 0x00005AB2, 0x00004158, 0x0000040B,
0x00050080, 0x0000000C, 0x00002A9D, 0x00005B33, 0x00005AB2, 0x000500C4,
0x0000000C, 0x00005B34, 0x00002A9D, 0x00000A14, 0x000500C7, 0x0000000C,
0x00005559, 0x00004158, 0x00000AC8, 0x00050080, 0x0000000C, 0x00005EFA,
0x00005B34, 0x00005559, 0x0004007C, 0x0000000B, 0x0000566F, 0x00005EFA,
0x000200F9, 0x00005341, 0x000200F8, 0x00002DD9, 0x0007004F, 0x00000011,
0x00002621, 0x000024C9, 0x000024C9, 0x00000000, 0x00000001, 0x0004007C,
0x00000012, 0x000059CF, 0x00002621, 0x00050051, 0x0000000C, 0x00001903,
0x000059CF, 0x00000000, 0x000500C3, 0x0000000C, 0x000024FE, 0x00001903,
0x00000A1A, 0x00050051, 0x0000000C, 0x00002748, 0x000059CF, 0x00000001,
0x000500C3, 0x0000000C, 0x0000405D, 0x00002748, 0x00000A1A, 0x000500C2,
0x0000000B, 0x00005B4E, 0x00005EAC, 0x00000A19, 0x0004007C, 0x0000000C,
0x000018AB, 0x00005B4E, 0x00050084, 0x0000000C, 0x00005347, 0x0000405D,
0x000018AB, 0x00050080, 0x0000000C, 0x00003F5E, 0x000024FE, 0x00005347,
0x000500C4, 0x0000000C, 0x00004A8E, 0x00003F5E, 0x00000A28, 0x000500C7,
0x0000000C, 0x00002AB6, 0x00001903, 0x00000A20, 0x000500C7, 0x0000000C,
0x00003139, 0x00002748, 0x00000A35, 0x000500C4, 0x0000000C, 0x0000454E,
0x00003139, 0x00000A11, 0x00050080, 0x0000000C, 0x00004397, 0x00002AB6,
0x0000454E, 0x000500C4, 0x0000000C, 0x000018E7, 0x00004397, 0x00000A13,
0x000500C7, 0x0000000C, 0x000027B1, 0x000018E7, 0x000009DB, 0x000500C4,
0x0000000C, 0x00002F76, 0x000027B1, 0x00000A0E, 0x00050080, 0x0000000C,
0x00003C4C, 0x00004A8E, 0x00002F76, 0x000500C7, 0x0000000C, 0x00003397,
0x000018E7, 0x00000A38, 0x00050080, 0x0000000C, 0x00004D30, 0x00003C4C,
0x00003397, 0x000500C7, 0x0000000C, 0x000047B5, 0x00002748, 0x00000A0E,
0x000500C4, 0x0000000C, 0x0000544D, 0x000047B5, 0x00000A17, 0x00050080,
0x0000000C, 0x00004159, 0x00004D30, 0x0000544D, 0x000500C7, 0x0000000C,
0x00005022, 0x00004159, 0x0000040B, 0x000500C4, 0x0000000C, 0x00002416,
0x00005022, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004A33, 0x00002748,
0x00000A3B, 0x000500C4, 0x0000000C, 0x00002F77, 0x00004A33, 0x00000A20,
0x00050080, 0x0000000C, 0x0000415A, 0x00002416, 0x00002F77, 0x000500C7,
0x0000000C, 0x00004ADF, 0x00004159, 0x00000388, 0x000500C4, 0x0000000C,
0x0000544E, 0x00004ADF, 0x00000A11, 0x00050080, 0x0000000C, 0x00004144,
0x0000415A, 0x0000544E, 0x000500C7, 0x0000000C, 0x00005083, 0x00002748,
0x00000A23, 0x000500C3, 0x0000000C, 0x000041BF, 0x00005083, 0x00000A11,
0x000500C3, 0x0000000C, 0x00001EEC, 0x00001903, 0x00000A14, 0x00050080,
0x0000000C, 0x000035B6, 0x000041BF, 0x00001EEC, 0x000500C7, 0x0000000C,
0x00005453, 0x000035B6, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000544F,
0x00005453, 0x00000A1D, 0x00050080, 0x0000000C, 0x00003C4D, 0x00004144,
0x0000544F, 0x000500C7, 0x0000000C, 0x00002E06, 0x00004159, 0x00000AC8,
0x00050080, 0x0000000C, 0x0000394F, 0x00003C4D, 0x00002E06, 0x0004007C,
0x0000000B, 0x00005670, 0x0000394F, 0x000200F9, 0x00005341, 0x000200F8,
0x00005341, 0x000700F5, 0x0000000B, 0x000024FC, 0x0000566F, 0x0000537D,
0x00005670, 0x00002DD9, 0x00050084, 0x00000011, 0x00003FA8, 0x00001F69,
0x00001997, 0x00050082, 0x00000011, 0x00003BBC, 0x00005C0B, 0x00003FA8,
0x00050051, 0x0000000B, 0x00001C87, 0x00001997, 0x00000000, 0x00050051,
0x0000000B, 0x00005962, 0x00001997, 0x00000001, 0x00050084, 0x0000000B,
0x00003372, 0x00001C87, 0x00005962, 0x00050084, 0x0000000B, 0x00003CA0,
0x000024FC, 0x00003372, 0x00050051, 0x0000000B, 0x00003ED4, 0x00003BBC,
0x00000000, 0x00050084, 0x0000000B, 0x00003E12, 0x00003ED4, 0x00005962,
0x00050051, 0x0000000B, 0x00001AE6, 0x00003BBC, 0x00000001, 0x00050080,
0x0000000B, 0x00002B25, 0x00003E12, 0x00001AE6, 0x000500C4, 0x0000000B,
0x0000609D, 0x00002B25, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00005AB3,
0x000049F1, 0x00000A0D, 0x00050080, 0x0000000B, 0x00002557, 0x0000609D,
0x00005AB3, 0x000500C4, 0x0000000B, 0x000040AD, 0x00002557, 0x00000A13,
0x00050080, 0x0000000B, 0x00004EAA, 0x00003CA0, 0x000040AD, 0x00050080,
0x0000000B, 0x0000453C, 0x00005B88, 0x00004EAA, 0x000500C2, 0x0000000B,
0x000036D8, 0x0000453C, 0x00000A16, 0x000500C2, 0x0000000B, 0x00002DF6,
0x00004FA3, 0x00000A10, 0x000500C7, 0x0000000B, 0x000020CA, 0x00002DF6,
0x00000A13, 0x00060041, 0x00000294, 0x000050F7, 0x0000107A, 0x00000A0B,
0x000036D8, 0x0004003D, 0x00000017, 0x00001FCE, 0x000050F7, 0x000500AA,
0x00000009, 0x000035C0, 0x000020CA, 0x00000A0D, 0x000500AA, 0x00000009,
0x00005376, 0x000020CA, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686,
0x000035C0, 0x00005376, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA,
0x00005686, 0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7,
0x00000017, 0x0000475F, 0x00001FCE, 0x000009CE, 0x000500C4, 0x00000017,
0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC,
0x00001FCE, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC,
0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D,
0x000200F9, 0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017,
0x00005879, 0x00001FCE, 0x00005341, 0x00003FF8, 0x00002957, 0x000500AA,
0x00000009, 0x00004CB6, 0x000020CA, 0x00000A13, 0x000500A6, 0x00000009,
0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7, 0x0000368A, 0x00000000,
0x000400FA, 0x00003B23, 0x00002B38, 0x0000368A, 0x000200F8, 0x00002B38,
0x000500C4, 0x00000017, 0x00005E17, 0x00005879, 0x000002ED, 0x000500C2,
0x00000017, 0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5, 0x00000017,
0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9, 0x0000368A, 0x000200F8,
0x0000368A, 0x000700F5, 0x00000017, 0x000040DE, 0x00005879, 0x00003463,
0x000029E8, 0x00002B38, 0x000500C7, 0x00000017, 0x00004740, 0x000040DE,
0x00000352, 0x00040070, 0x0000001D, 0x000023B1, 0x00004740, 0x0005008E,
0x0000001D, 0x00004BA5, 0x000023B1, 0x0000092A, 0x000500C2, 0x00000017,
0x00005B47, 0x000040DE, 0x000002ED, 0x00040070, 0x0000001D, 0x0000483C,
0x00005B47, 0x0005008E, 0x0000001D, 0x00004812, 0x0000483C, 0x0000092A,
0x00050051, 0x0000000D, 0x0000187C, 0x00004BA5, 0x00000000, 0x00050051,
0x0000000D, 0x000035EE, 0x00004812, 0x00000000, 0x00050050, 0x00000013,
0x00004B20, 0x0000187C, 0x000035EE, 0x0006000C, 0x0000000B, 0x00002171,
0x00000001, 0x0000003A, 0x00004B20, 0x00050051, 0x0000000D, 0x00005BBF,
0x00004BA5, 0x00000001, 0x00050051, 0x0000000D, 0x000039A7, 0x00004812,
0x00000001, 0x00050050, 0x00000013, 0x00004B21, 0x00005BBF, 0x000039A7,
0x0006000C, 0x0000000B, 0x00002172, 0x00000001, 0x0000003A, 0x00004B21,
0x00050051, 0x0000000D, 0x00005BC0, 0x00004BA5, 0x00000002, 0x00050051,
0x0000000D, 0x000039A8, 0x00004812, 0x00000002, 0x00050050, 0x00000013,
0x00004B22, 0x00005BC0, 0x000039A8, 0x0006000C, 0x0000000B, 0x00002173,
0x00000001, 0x0000003A, 0x00004B22, 0x00050051, 0x0000000D, 0x00005BC1,
0x00004BA5, 0x00000003, 0x00050051, 0x0000000D, 0x000039A9, 0x00004812,
0x00000003, 0x00050050, 0x00000013, 0x00004B0D, 0x00005BC1, 0x000039A9,
0x0006000C, 0x0000000B, 0x000020EE, 0x00000001, 0x0000003A, 0x00004B0D,
0x00070050, 0x00000017, 0x00003ABB, 0x00002171, 0x00002172, 0x00002173,
0x000020EE, 0x00060041, 0x00000294, 0x000045C3, 0x0000140E, 0x00000A0B,
0x000054A6, 0x0003003E, 0x000045C3, 0x00003ABB, 0x00050080, 0x0000000B,
0x00003CAC, 0x000054A6, 0x00000A0E, 0x000500AC, 0x00000009, 0x00001911,
0x00001C87, 0x00000A0D, 0x000300F7, 0x000060BC, 0x00000002, 0x000400FA,
0x00001911, 0x00005084, 0x00005094, 0x000200F8, 0x00005084, 0x00050086,
0x0000000B, 0x00003697, 0x000019EE, 0x00001C87, 0x00050084, 0x0000000B,
0x0000237E, 0x00003697, 0x00001C87, 0x00050082, 0x0000000B, 0x00003171,
0x000019EE, 0x0000237E, 0x00050080, 0x0000000B, 0x00002527, 0x00003171,
0x00000A0D, 0x000500AA, 0x00000009, 0x0000343F, 0x00002527, 0x00001C87,
0x000300F7, 0x00001EED, 0x00000000, 0x000400FA, 0x0000343F, 0x0000569E,
0x00002191, 0x000200F8, 0x0000569E, 0x00050084, 0x0000000B, 0x00004B59,
0x00000A6A, 0x00001C87, 0x000500C4, 0x0000000B, 0x0000540F, 0x00003171,
0x00000A16, 0x00050082, 0x0000000B, 0x00004944, 0x00004B59, 0x0000540F,
0x000200F9, 0x00001EED, 0x000200F8, 0x00002191, 0x000200F9, 0x00001EED,
0x000200F8, 0x00001EED, 0x000700F5, 0x0000000B, 0x0000292C, 0x00004944,
0x0000569E, 0x00000A3A, 0x00002191, 0x000200F9, 0x000060BC, 0x000200F8,
0x00005094, 0x000200F9, 0x000060BC, 0x000200F8, 0x000060BC, 0x000700F5,
0x0000000B, 0x000029BC, 0x0000292C, 0x00001EED, 0x00000A6A, 0x00005094,
0x00050084, 0x0000000B, 0x0000492B, 0x000029BC, 0x00005962, 0x000500C2,
0x0000000B, 0x0000406D, 0x0000492B, 0x00000A16, 0x00050080, 0x0000000B,
0x0000336B, 0x000036D8, 0x0000406D, 0x00060041, 0x00000294, 0x0000571A,
0x0000107A, 0x00000A0B, 0x0000336B, 0x0004003D, 0x00000017, 0x000019B2,
0x0000571A, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA, 0x00005686,
0x00002958, 0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017,
0x00004760, 0x000019B2, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2,
0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x000019B2,
0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D,
0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9,
0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC,
0x000019B2, 0x000060BC, 0x00003FF9, 0x00002958, 0x000300F7, 0x0000368B,
0x00000000, 0x000400FA, 0x00003B23, 0x00002B39, 0x0000368B, 0x000200F8,
0x00002B39, 0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC, 0x000002ED,
0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED, 0x000500C5,
0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9, 0x0000368B,
0x000200F8, 0x0000368B, 0x000700F5, 0x00000017, 0x000040DF, 0x00002AAC,
0x00003A1A, 0x000029E9, 0x00002B39, 0x000500C7, 0x00000017, 0x00004741,
0x000040DF, 0x00000352, 0x00040070, 0x0000001D, 0x000023B2, 0x00004741,
0x0005008E, 0x0000001D, 0x00004BA6, 0x000023B2, 0x0000092A, 0x000500C2,
0x00000017, 0x00005B48, 0x000040DF, 0x000002ED, 0x00040070, 0x0000001D,
0x0000483D, 0x00005B48, 0x0005008E, 0x0000001D, 0x00004813, 0x0000483D,
0x0000092A, 0x00050051, 0x0000000D, 0x0000187D, 0x00004BA6, 0x00000000,
0x00050051, 0x0000000D, 0x000035EF, 0x00004813, 0x00000000, 0x00050050,
0x00000013, 0x00004B23, 0x0000187D, 0x000035EF, 0x0006000C, 0x0000000B,
0x00002174, 0x00000001, 0x0000003A, 0x00004B23, 0x00050051, 0x0000000D,
0x00005BC2, 0x00004BA6, 0x00000001, 0x00050051, 0x0000000D, 0x000039AA,
0x00004813, 0x00000001, 0x00050050, 0x00000013, 0x00004B24, 0x00005BC2,
0x000039AA, 0x0006000C, 0x0000000B, 0x00002175, 0x00000001, 0x0000003A,
0x00004B24, 0x00050051, 0x0000000D, 0x00005BC3, 0x00004BA6, 0x00000002,
0x00050051, 0x0000000D, 0x000039AB, 0x00004813, 0x00000002, 0x00050050,
0x00000013, 0x00004B25, 0x00005BC3, 0x000039AB, 0x0006000C, 0x0000000B,
0x00002176, 0x00000001, 0x0000003A, 0x00004B25, 0x00050051, 0x0000000D,
0x00005BC4, 0x00004BA6, 0x00000003, 0x00050051, 0x0000000D, 0x000039AC,
0x00004813, 0x00000003, 0x00050050, 0x00000013, 0x00004B0E, 0x00005BC4,
0x000039AC, 0x0006000C, 0x0000000B, 0x000020EF, 0x00000001, 0x0000003A,
0x00004B0E, 0x00070050, 0x00000017, 0x00003ABC, 0x00002174, 0x00002175,
0x00002176, 0x000020EF, 0x00060041, 0x00000294, 0x00004EBE, 0x0000140E,
0x00000A0B, 0x00003CAC, 0x0003003E, 0x00004EBE, 0x00003ABC, 0x000200F9,
0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,
};

View File

@ -358,19 +358,20 @@ xesl_float4 XeUnpackR10G10B10A2Float(uint p) {
// Upper 16 bits are ignored by XeUnpackR16EdramX4.
xesl_float4 XeUnpackR16EdramX4(xesl_uint4 p) {
return max(xesl_float4(xesl_int4(p) << 16 >> 16) * (32.0 / 32767.0), -1.0);
return max((-1.0).xxxx,
xesl_float4(xesl_int4(p) << 16 >> 16) * (32.0 / 32767.0));
}
xesl_float2 XeUnpackR16G16Edram(uint p) {
return max(
xesl_float2(int(p).xx << xesl_int2(16, 0) >> 16) * (32.0 / 32767.0),
-1.0);
(-1.0).xx,
xesl_float2(int(p).xx << xesl_int2(16, 0) >> 16) * (32.0 / 32767.0));
}
xesl_float4 XeUnpackR16G16B16A16Edram(xesl_uint2 p) {
return max(xesl_float4(xesl_int2(p).xxyy << xesl_int2(16, 0).xyxy >> 16) *
(32.0 / 32767.0),
-1.0);
return max((-1.0).xxxx,
xesl_float4(xesl_int2(p).xxyy << xesl_int2(16, 0).xyxy >> 16) *
(32.0 / 32767.0));
}
// Xenos 16-bit packed textures are RGBA, but in Direct3D 12 they are BGRA.
@ -497,6 +498,28 @@ void XeR11G11B10SNormToRGBA16(xesl_uint4 packed_texels, out xesl_uint4 out_01,
out_23 = XeR11G11B10SNormToRGBA16(packed_texels.zw);
}
xesl_uint4 XeRG16UNormToRG16Float(xesl_uint4 packed_texels) {
xesl_float4 r = xesl_float4(packed_texels & 0xFFFFu) * (1.0 / 65535.0);
xesl_float4 g = xesl_float4(packed_texels >> 16u) * (1.0 / 65535.0);
return xesl_uint4(xesl_packHalf2x16(xesl_float2(r.x, g.x)),
xesl_packHalf2x16(xesl_float2(r.y, g.y)),
xesl_packHalf2x16(xesl_float2(r.z, g.z)),
xesl_packHalf2x16(xesl_float2(r.w, g.w)));
}
xesl_uint4 XeRG16SNormToRG16Float(xesl_uint4 packed_texels) {
xesl_float4 r =
max((-1.0).xxxx,
xesl_float4(xesl_int4(packed_texels) << 16 >> 16) * (1.0 / 32767.0));
xesl_float4 g =
max((-1.0).xxxx,
xesl_float4(xesl_int4(packed_texels) >> 16) * (1.0 / 32767.0));
return xesl_uint4(xesl_packHalf2x16(xesl_float2(r.x, g.x)),
xesl_packHalf2x16(xesl_float2(r.y, g.y)),
xesl_packHalf2x16(xesl_float2(r.z, g.z)),
xesl_packHalf2x16(xesl_float2(r.w, g.w)));
}
// Based on CFloat24 from d3dref9.dll and the 6e4 code from:
// https://github.com/Microsoft/DirectXTex/blob/master/DirectXTex/DirectXTexConvert.cpp
// 6e4 has a different exponent bias allowing [0,512) values, 20e4 allows [0,2).

View File

@ -19,7 +19,7 @@ void main(point XeVertexPreGS xe_in[1],
// Shader header writes -1.0f to point_size by default, so any positive value
// means that it was overwritten by the translated vertex shader.
float2 point_size =
xe_in[0].post_gs.pre_ps.point_params.z > 0.0f
xe_in[0].post_gs.pre_ps.point_params.z >= 0.0f
? xe_in[0].post_gs.pre_ps.point_params.zz
: float2(xe_point_size_x, xe_point_size_y);
point_size =

View File

@ -7,4 +7,5 @@
******************************************************************************
*/
#define XE_TEXTURE_LOAD_64BPB_TRANSFORM(blocks) (blocks)
#include "texture_load_64bpb.xesli"

View File

@ -18,7 +18,8 @@ xesl_entry
xesl_entry_bindings_end_local_size(8, 32, 1)
xesl_input_global_invocation_id
xesl_entry_signature_end
// 1 thread = 4 blocks.
// 1 thread = 4 blocks passed through an externally provided
// uint4 transformation function (XE_TEXTURE_LOAD_64BPB_TRANSFORM).
xesl_uint3 block_index = xesl_GlobalInvocationID << xesl_uint3(2u, 0u, 0u);
xesl_uint3 size_blocks = XeTextureLoadSizeBlocks();
xesl_dont_flatten
@ -34,13 +35,15 @@ xesl_entry_signature_end
uint endian = XeTextureLoadEndian32();
xesl_writeTypedStorageBufferStore(
xe_texture_load_dest, block_offset_host,
XeEndianSwap32(xesl_typedStorageBufferLoad(xe_texture_load_source,
block_offset_guest), endian));
XE_TEXTURE_LOAD_64BPB_TRANSFORM(XeEndianSwap32(
xesl_typedStorageBufferLoad(xe_texture_load_source,
block_offset_guest), endian)));
++block_offset_host;
block_offset_guest +=
XeTextureLoadRightConsecutiveBlocksOffset(block_index.x, 3u) >> 4u;
xesl_writeTypedStorageBufferStore(
xe_texture_load_dest, block_offset_host,
XeEndianSwap32(xesl_typedStorageBufferLoad(xe_texture_load_source,
block_offset_guest), endian));
XE_TEXTURE_LOAD_64BPB_TRANSFORM(XeEndianSwap32(
xesl_typedStorageBufferLoad(xe_texture_load_source,
block_offset_guest), endian)));
xesl_entry_end

View File

@ -8,4 +8,5 @@
*/
#define XE_TEXTURE_LOAD_RESOLUTION_SCALED
#define XE_TEXTURE_LOAD_64BPB_TRANSFORM(blocks) (blocks)
#include "texture_load_64bpb.xesli"

View File

@ -0,0 +1,12 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#include "pixel_formats.xesli"
#define XE_TEXTURE_LOAD_16BPB_TRANSFORM XeRG16SNormToRG16Float
#include "texture_load_16bpb.xesli"

View File

@ -0,0 +1,13 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#define XE_TEXTURE_LOAD_RESOLUTION_SCALED
#include "pixel_formats.xesli"
#define XE_TEXTURE_LOAD_16BPB_TRANSFORM XeRG16SNormToRG16Float
#include "texture_load_16bpb.xesli"

View File

@ -0,0 +1,12 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#include "pixel_formats.xesli"
#define XE_TEXTURE_LOAD_16BPB_TRANSFORM XeRG16UNormToRG16Float
#include "texture_load_16bpb.xesli"

View File

@ -0,0 +1,13 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#define XE_TEXTURE_LOAD_RESOLUTION_SCALED
#include "pixel_formats.xesli"
#define XE_TEXTURE_LOAD_16BPB_TRANSFORM XeRG16UNormToRG16Float
#include "texture_load_16bpb.xesli"

View File

@ -0,0 +1,12 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#include "pixel_formats.xesli"
#define XE_TEXTURE_LOAD_32BPB_TRANSFORM XeRG16SNormToRG16Float
#include "texture_load_32bpb.xesli"

View File

@ -0,0 +1,13 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#define XE_TEXTURE_LOAD_RESOLUTION_SCALED
#include "pixel_formats.xesli"
#define XE_TEXTURE_LOAD_32BPB_TRANSFORM XeRG16SNormToRG16Float
#include "texture_load_32bpb.xesli"

View File

@ -0,0 +1,12 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#include "pixel_formats.xesli"
#define XE_TEXTURE_LOAD_32BPB_TRANSFORM XeRG16UNormToRG16Float
#include "texture_load_32bpb.xesli"

View File

@ -0,0 +1,13 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#define XE_TEXTURE_LOAD_RESOLUTION_SCALED
#include "pixel_formats.xesli"
#define XE_TEXTURE_LOAD_32BPB_TRANSFORM XeRG16UNormToRG16Float
#include "texture_load_32bpb.xesli"

View File

@ -0,0 +1,12 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#include "pixel_formats.xesli"
#define XE_TEXTURE_LOAD_64BPB_TRANSFORM XeRG16SNormToRG16Float
#include "texture_load_64bpb.xesli"

View File

@ -0,0 +1,13 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#define XE_TEXTURE_LOAD_RESOLUTION_SCALED
#include "pixel_formats.xesli"
#define XE_TEXTURE_LOAD_64BPB_TRANSFORM XeRG16SNormToRG16Float
#include "texture_load_64bpb.xesli"

View File

@ -0,0 +1,12 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#include "pixel_formats.xesli"
#define XE_TEXTURE_LOAD_64BPB_TRANSFORM XeRG16UNormToRG16Float
#include "texture_load_64bpb.xesli"

View File

@ -0,0 +1,13 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#define XE_TEXTURE_LOAD_RESOLUTION_SCALED
#include "pixel_formats.xesli"
#define XE_TEXTURE_LOAD_64BPB_TRANSFORM XeRG16UNormToRG16Float
#include "texture_load_64bpb.xesli"

View File

@ -385,12 +385,12 @@ void SpirvShaderTranslator::StartTranslation() {
var_main_loop_count_ = builder_->createVariable(
spv::NoPrecision, spv::StorageClassFunction, type_uint4_,
"xe_var_loop_count", const_uint4_0_);
var_main_address_absolute_ = builder_->createVariable(
var_main_address_register_ = builder_->createVariable(
spv::NoPrecision, spv::StorageClassFunction, type_int_,
"xe_var_address_absolute", const_int_0_);
var_main_address_relative_ = builder_->createVariable(
"xe_var_address_register", const_int_0_);
var_main_loop_address_ = builder_->createVariable(
spv::NoPrecision, spv::StorageClassFunction, type_int4_,
"xe_var_address_relative", const_int4_0_);
"xe_var_loop_address", const_int4_0_);
var_main_previous_scalar_ = builder_->createVariable(
spv::NoPrecision, spv::StorageClassFunction, type_float_,
"xe_var_previous_scalar", const_float_0_);
@ -693,7 +693,7 @@ void SpirvShaderTranslator::ProcessLoopStartInstruction(
// Push aL - keep the same value as in the previous loop if repeating, or the
// new one otherwise.
spv::Id address_relative_stack_old =
builder_->createLoad(var_main_address_relative_, spv::NoPrecision);
builder_->createLoad(var_main_loop_address_, spv::NoPrecision);
id_vector_temp_.clear();
id_vector_temp_.reserve(4);
if (instr.is_repeat) {
@ -713,7 +713,7 @@ void SpirvShaderTranslator::ProcessLoopStartInstruction(
}
builder_->createStore(
builder_->createCompositeConstruct(type_int4_, id_vector_temp_),
var_main_address_relative_);
var_main_loop_address_);
// Break (jump to the skip label) if the loop counter is 0 (since the
// condition is checked in the end).
@ -762,7 +762,7 @@ void SpirvShaderTranslator::ProcessLoopEndInstruction(
builder_->createCompositeExtract(loop_count_stack_old, type_uint_, 0),
builder_->makeUintConstant(1));
spv::Id address_relative_stack_old =
builder_->createLoad(var_main_address_relative_, spv::NoPrecision);
builder_->createLoad(var_main_loop_address_, spv::NoPrecision);
// Predicated break works like break if (loop_count == 0 || [!]p0).
// Three options, due to logical operations usage (so OpLogicalNot is not
@ -841,7 +841,7 @@ void SpirvShaderTranslator::ProcessLoopEndInstruction(
loop_constant),
builder_->makeIntConstant(16), builder_->makeIntConstant(8))),
address_relative_stack_old, type_int4_, 0),
var_main_address_relative_);
var_main_loop_address_);
// Jump back to the beginning of the loop body.
main_switch_next_pc_phi_operands_.push_back(
builder_->makeIntConstant(int(instr.loop_body_address)));
@ -872,7 +872,7 @@ void SpirvShaderTranslator::ProcessLoopEndInstruction(
id_vector_temp_.push_back(const_int_0_);
builder_->createStore(
builder_->createCompositeConstruct(type_int4_, id_vector_temp_),
var_main_address_relative_);
var_main_loop_address_);
// Now going to fall through to the next control flow instruction.
}
@ -1417,7 +1417,7 @@ spv::Id SpirvShaderTranslator::GetStorageAddressingIndex(
EnsureBuildPointAvailable();
spv::Id base_pointer = spv::NoResult;
switch (addressing_mode) {
case InstructionStorageAddressingMode::kStatic: {
case InstructionStorageAddressingMode::kAbsolute: {
uint32_t static_storage_index = storage_index;
if (is_float_constant) {
static_storage_index =
@ -1429,15 +1429,15 @@ spv::Id SpirvShaderTranslator::GetStorageAddressingIndex(
}
return builder_->makeIntConstant(int(static_storage_index));
}
case InstructionStorageAddressingMode::kAddressAbsolute:
base_pointer = var_main_address_absolute_;
case InstructionStorageAddressingMode::kAddressRegisterRelative:
base_pointer = var_main_address_register_;
break;
case InstructionStorageAddressingMode::kAddressRelative:
case InstructionStorageAddressingMode::kLoopRelative:
// Load X component.
id_vector_temp_util_.clear();
id_vector_temp_util_.push_back(const_int_0_);
base_pointer = builder_->createAccessChain(spv::StorageClassFunction,
var_main_address_relative_,
var_main_loop_address_,
id_vector_temp_util_);
break;
}

View File

@ -475,9 +475,9 @@ class SpirvShaderTranslator : public ShaderTranslator {
// uint4.
spv::Id var_main_loop_count_;
// int4.
spv::Id var_main_address_relative_;
spv::Id var_main_loop_address_;
// int.
spv::Id var_main_address_absolute_;
spv::Id var_main_address_register_;
// float.
spv::Id var_main_previous_scalar_;
// `base + index * stride` in dwords from the last vfetch_full as it may be

View File

@ -100,7 +100,7 @@ spv::Id SpirvShaderTranslator::ProcessVectorAluOperation(
uint32_t used_result_components =
instr.vector_and_constant_result.GetUsedResultComponents();
if (!used_result_components &&
!AluVectorOpHasSideEffects(instr.vector_opcode)) {
!ucode::GetAluVectorOpcodeInfo(instr.vector_opcode).changed_state) {
return spv::NoResult;
}
uint32_t used_result_component_count = xe::bit_count(used_result_components);
@ -324,7 +324,7 @@ spv::Id SpirvShaderTranslator::ProcessVectorAluOperation(
spv::OpConvertFToS, type_int_,
builder_->createBuiltinCall(type_float_, ext_inst_glsl_std_450_,
GLSLstd450NClamp, id_vector_temp_)),
var_main_address_absolute_);
var_main_address_register_);
}
if (!used_result_components) {
// maxa returning nothing - can't load src1.
@ -1174,7 +1174,7 @@ spv::Id SpirvShaderTranslator::ProcessScalarAluOperation(
spv::OpConvertFToS, type_int_,
builder_->createBuiltinCall(type_float_, ext_inst_glsl_std_450_,
GLSLstd450NClamp, id_vector_temp_)),
var_main_address_absolute_);
var_main_address_register_);
}
if (a == b) {
// max is commonly used as mov.

120
src/xenia/gpu/ucode.cc Normal file
View File

@ -0,0 +1,120 @@
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#include "xenia/gpu/ucode.h"
namespace xe {
namespace gpu {
namespace ucode {
const AluScalarOpcodeInfo kAluScalarOpcodeInfos[64] = {
{"adds", 1, true, kAluOpChangedStateNone},
{"adds_prev", 1, false, kAluOpChangedStateNone},
{"muls", 1, true, kAluOpChangedStateNone},
{"muls_prev", 1, false, kAluOpChangedStateNone},
{"muls_prev2", 1, true, kAluOpChangedStateNone},
{"maxs", 1, true, kAluOpChangedStateNone},
{"mins", 1, true, kAluOpChangedStateNone},
{"seqs", 1, false, kAluOpChangedStateNone},
{"sgts", 1, false, kAluOpChangedStateNone},
{"sges", 1, false, kAluOpChangedStateNone},
{"snes", 1, false, kAluOpChangedStateNone},
{"frcs", 1, false, kAluOpChangedStateNone},
{"truncs", 1, false, kAluOpChangedStateNone},
{"floors", 1, false, kAluOpChangedStateNone},
{"exp", 1, false, kAluOpChangedStateNone},
{"logc", 1, false, kAluOpChangedStateNone},
{"log", 1, false, kAluOpChangedStateNone},
{"rcpc", 1, false, kAluOpChangedStateNone},
{"rcpf", 1, false, kAluOpChangedStateNone},
{"rcp", 1, false, kAluOpChangedStateNone},
{"rsqc", 1, false, kAluOpChangedStateNone},
{"rsqf", 1, false, kAluOpChangedStateNone},
{"rsq", 1, false, kAluOpChangedStateNone},
{"maxas", 1, true, kAluOpChangedStateAddressRegister},
{"maxasf", 1, true, kAluOpChangedStateAddressRegister},
{"subs", 1, true, kAluOpChangedStateNone},
{"subs_prev", 1, false, kAluOpChangedStateNone},
{"setp_eq", 1, false, kAluOpChangedStatePredicate},
{"setp_ne", 1, false, kAluOpChangedStatePredicate},
{"setp_gt", 1, false, kAluOpChangedStatePredicate},
{"setp_ge", 1, false, kAluOpChangedStatePredicate},
{"setp_inv", 1, false, kAluOpChangedStatePredicate},
{"setp_pop", 1, false, kAluOpChangedStatePredicate},
{"setp_clr", 0, false, kAluOpChangedStatePredicate},
{"setp_rstr", 1, false, kAluOpChangedStatePredicate},
{"kills_eq", 1, false, kAluOpChangedStatePixelKill},
{"kills_gt", 1, false, kAluOpChangedStatePixelKill},
{"kills_ge", 1, false, kAluOpChangedStatePixelKill},
{"kills_ne", 1, false, kAluOpChangedStatePixelKill},
{"kills_one", 1, false, kAluOpChangedStatePixelKill},
{"sqrt", 1, false, kAluOpChangedStateNone},
{"opcode_41", 0, false, kAluOpChangedStateNone},
{"mulsc", 2, false, kAluOpChangedStateNone},
{"mulsc", 2, false, kAluOpChangedStateNone},
{"addsc", 2, false, kAluOpChangedStateNone},
{"addsc", 2, false, kAluOpChangedStateNone},
{"subsc", 2, false, kAluOpChangedStateNone},
{"subsc", 2, false, kAluOpChangedStateNone},
{"sin", 1, false, kAluOpChangedStateNone},
{"cos", 1, false, kAluOpChangedStateNone},
{"retain_prev", 0, false, kAluOpChangedStateNone},
{"opcode_51", 0, false, kAluOpChangedStateNone},
{"opcode_52", 0, false, kAluOpChangedStateNone},
{"opcode_53", 0, false, kAluOpChangedStateNone},
{"opcode_54", 0, false, kAluOpChangedStateNone},
{"opcode_55", 0, false, kAluOpChangedStateNone},
{"opcode_56", 0, false, kAluOpChangedStateNone},
{"opcode_57", 0, false, kAluOpChangedStateNone},
{"opcode_58", 0, false, kAluOpChangedStateNone},
{"opcode_59", 0, false, kAluOpChangedStateNone},
{"opcode_60", 0, false, kAluOpChangedStateNone},
{"opcode_61", 0, false, kAluOpChangedStateNone},
{"opcode_62", 0, false, kAluOpChangedStateNone},
{"opcode_63", 0, false, kAluOpChangedStateNone},
};
const AluVectorOpcodeInfo kAluVectorOpcodeInfos[32] = {
{"add", {0b1111, 0b1111}, kAluOpChangedStateNone},
{"mul", {0b1111, 0b1111}, kAluOpChangedStateNone},
{"max", {0b1111, 0b1111}, kAluOpChangedStateNone},
{"min", {0b1111, 0b1111}, kAluOpChangedStateNone},
{"seq", {0b1111, 0b1111}, kAluOpChangedStateNone},
{"sgt", {0b1111, 0b1111}, kAluOpChangedStateNone},
{"sge", {0b1111, 0b1111}, kAluOpChangedStateNone},
{"sne", {0b1111, 0b1111}, kAluOpChangedStateNone},
{"frc", {0b1111}, kAluOpChangedStateNone},
{"trunc", {0b1111}, kAluOpChangedStateNone},
{"floor", {0b1111}, kAluOpChangedStateNone},
{"mad", {0b1111, 0b1111, 0b1111}, kAluOpChangedStateNone},
{"cndeq", {0b1111, 0b1111, 0b1111}, kAluOpChangedStateNone},
{"cndge", {0b1111, 0b1111, 0b1111}, kAluOpChangedStateNone},
{"cndgt", {0b1111, 0b1111, 0b1111}, kAluOpChangedStateNone},
{"dp4", {0b1111, 0b1111}, kAluOpChangedStateNone},
{"dp3", {0b0111, 0b0111}, kAluOpChangedStateNone},
{"dp2add", {0b0011, 0b0011, 0b0001}, kAluOpChangedStateNone},
{"cube", {0b1111, 0b1111}, kAluOpChangedStateNone},
{"max4", {0b1111}, kAluOpChangedStateNone},
{"setp_eq_push", {0b1001, 0b1001}, kAluOpChangedStatePredicate},
{"setp_ne_push", {0b1001, 0b1001}, kAluOpChangedStatePredicate},
{"setp_gt_push", {0b1001, 0b1001}, kAluOpChangedStatePredicate},
{"setp_ge_push", {0b1001, 0b1001}, kAluOpChangedStatePredicate},
{"kill_eq", {0b1111, 0b1111}, kAluOpChangedStatePixelKill},
{"kill_gt", {0b1111, 0b1111}, kAluOpChangedStatePixelKill},
{"kill_ge", {0b1111, 0b1111}, kAluOpChangedStatePixelKill},
{"kill_ne", {0b1111, 0b1111}, kAluOpChangedStatePixelKill},
{"dst", {0b0110, 0b1010}, kAluOpChangedStateNone},
{"maxa", {0b1111, 0b1111}, kAluOpChangedStateAddressRegister},
{"opcode_30", {}, kAluOpChangedStateNone},
{"opcode_31", {}, kAluOpChangedStateNone},
};
} // namespace ucode
} // namespace gpu
} // namespace xe

View File

@ -2,7 +2,7 @@
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2015 Ben Vanik. All rights reserved. *
* Copyright 2022 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
@ -13,14 +13,49 @@
#include <cstdint>
#include "xenia/base/assert.h"
#include "xenia/base/math.h"
#include "xenia/base/platform.h"
#include "xenia/gpu/xenos.h"
// Closest AMD doc:
// The XNA Game Studio 3.1 contains Graphics.ShaderCompiler.AssembleFromSource,
// which, for TargetPlatform.Xbox360, can validate and assemble Xbox 360 shader
// microcode from Xbox 360 and Direct3D 9 shader assembly, returning the binary,
// as well as validation warnings and errors and the disassembly via the warning
// output. It is the primary source of information about the binary encoding of
// the instructions, as well as valid usage of instruction parameters and
// sequences.
// https://www.microsoft.com/en-us/download/details.aspx?id=39
// (XNAGS31_setup.exe)
// Xenia provides a tool, tools/shader-playground, that invokes the assembler,
// displays the binary and the disassembly from the official assembler, and also
// shows the disassembly generated by Xenia, and passes it back to the assembler
// to validate Xenia's microcode parsing and disassembly by checking if
// reassembling the disassembly results in the same binary.
//
// The behavior and the parameters of some of the instructions were previously
// documented on MSDN in the XNA Game Studio programming guide:
// http://web.archive.org/web/20081211005537/http://msdn.microsoft.com/en-us/library/bb313877.aspx
//
// A great amount of documentation, such as the R400 sequencer specification and
// the official emulator code, was made available during the LG Electronics,
// Inc. v. ATI Technologies ULC "Multi-thread Graphics Processing System" patent
// dispute IPR2015-00325, with the motion to seal having been denied due to "a
// strong public policy interest in making all information filed in an inter
// partes review publicly available". Most of the documents attached, however,
// cover early versions - the development process - of the R400 architecture, so
// there are some differences from the final Xenos GPU (DOT2ADDv is defined
// differently, for example, and MUL/ADD/SUB_CONST are missing).
// https://portal.unifiedpatents.com/ptab/case/IPR2015-00325
//
// Also, the R600, while having a different 5-scalar, as opposed to vec4|scalar,
// parallelism model and instruction encodings and targeting Direct3D 10 rather
// that 9, inherits a lot of instructions and architectural concepts from the
// R400.
// https://www.x.org/docs/AMD/old/r600isa.pdf
// https://developer.amd.com/wordpress/media/2012/10/r600isa.pdf
// https://developer.amd.com/wordpress/media/2012/10/R600_Instruction_Set_Architecture.pdf
// Microcode format differs, but most fields/enums are the same.
// This code comes from the freedreno project:
// Parts of this code also come from the freedreno project:
// https://github.com/freedreno/freedreno/blob/master/includes/instr-a2xx.h
/*
* Copyright (c) 2012 Rob Clark <robdclark@gmail.com>
@ -62,18 +97,44 @@ enum class ControlFlowOpcode : uint32_t {
// Executes fetch or ALU instructions then ends execution.
kExecEnd = 2,
// Conditionally executes based on a bool const.
// PredicateClean = false.
kCondExec = 3,
// Conditionally executes based on a bool const then ends execution.
// PredicateClean = false.
// According to the IPR2015-00325 sequencer specification, execution ends only
// if the condition is actually met (unlike on the R600, where execution ends
// unconditionally if END_OF_PROGRAM is set in the control flow instruction).
// 4D5307ED has many shaders (used, in particular, in the Press Start screen
// background) with if / else in its tail done via cexece - cexece b130, then
// cexece !b130, and then an empty exece (if the condition was ignored, the
// second cexece would have never been reached). Also, the validator reports
// "Shader will try to execute instruction 3.0, but last possible instruction
// is 2.1" for a shader that contains just one cexece without an exece.
kCondExecEnd = 4,
// Conditionally executes based on the current predicate.
// Since 64 vertices or pixels are processed by each sequencer in the Xenos
// hardware, the actual condition is AND of the predicate values for all
// active (and not killed) invocations for (!p0) exec, and OR of them for
// (p0) exec - if any of the invocations passes the predicate check, all of
// them will enter the exec. This is according to the IPR2015-00325 sequencer
// specification. Because of this, the compiler makes the ALU and fetch
// instructions themselves inside a predicated exec predicated as well. The
// validator also reports mismatch between the control flow predication and
// ALU / fetch predication.
kCondExecPred = 5,
// Conditionally executes based on the current predicate then ends execution.
// According to the IPR2015-00325 sequencer specification, execution ends only
// if the condition is actually met for any of the invocations (unlike on the
// R600, where execution ends unconditionally if END_OF_PROGRAM is set in the
// control flow instruction).
kCondExecPredEnd = 6,
// Starts a loop that must be terminated with kLoopEnd.
// Starts a loop that must be terminated with kLoopEnd, with depth of up to 4.
kLoopStart = 7,
// Continues or breaks out of a loop started with kLoopStart.
// Continues or breaks out of a loop started with kLoopStart. According to the
// IPR2015-00325 sequencer specification, the incrementing of the loop
// iteration happens before the count and the predicated break checks.
kLoopEnd = 8,
// Conditionally calls a function.
// Conditionally calls a function, with depth of up to 4.
// A return address is pushed to the stack to be used by a kReturn.
kCondCall = 9,
// Returns from the current function as called by kCondCall.
@ -83,11 +144,21 @@ enum class ControlFlowOpcode : uint32_t {
kCondJmp = 11,
// Allocates output values.
kAlloc = 12,
// Conditionally executes based on the current predicate.
// Optionally resets the predicate value.
// Conditionally executes based on a bool const.
// PredicateClean = true.
// This is cexec with a bool constant (kCondExec, can be verified by comparing
// the XNA disassembler output with cexec containing and not containing a setp
// instruction), not a kCondExecPred. kCondExec doesn't have a predicate clean
// field (the space is occupied by the bool constant index), while
// kCondExecPred itself does. This is unlike what the IPR2015-00325 sequencer
// specification says about the Conditional_Execute_Predicates_No_Stall
// instruction using this opcode (in the specification, this is described as
// behaving like kCondExecPred with PredicateClean = false, but the
// specification is likely highly outdated - it doesn't even have predicate
// clean fields in exec instructions overall).
kCondExecPredClean = 13,
// Conditionally executes based on the current predicate then ends execution.
// Optionally resets the predicate value.
// Conditionally executes based on a bool const then ends execution.
// PredicateClean = true.
kCondExecPredCleanEnd = 14,
// Hints that no more vertex fetches will be performed.
kMarkVsFetchDone = 15,
@ -115,9 +186,9 @@ constexpr bool DoesControlFlowOpcodeEndShader(ControlFlowOpcode opcode) {
opcode == ControlFlowOpcode::kCondExecPredCleanEnd;
}
// Returns true if the given control flow opcode resets the predicate prior to
// execution.
constexpr bool DoesControlFlowOpcodeCleanPredicate(ControlFlowOpcode opcode) {
// See the description of ControlFlowOpcode::kCondExecPredClean.
constexpr bool DoesControlFlowCondExecHaveCleanPredicate(
ControlFlowOpcode opcode) {
return opcode == ControlFlowOpcode::kCondExecPredClean ||
opcode == ControlFlowOpcode::kCondExecPredCleanEnd;
}
@ -156,32 +227,41 @@ struct ControlFlowExecInstruction {
uint32_t address() const { return address_; }
// Number of instructions being executed.
uint32_t count() const { return count_; }
// Sequence bits, 2 per instruction, indicating whether ALU or fetch.
uint32_t sequence() const { return serialize_; }
// Whether to reset the current predicate.
bool clean() const { return clean_ == 1; }
// Sequence bits, 2 per instruction.
// [0] - ALU (0) or fetch (1), [1] - serialize.
uint32_t sequence() const { return sequence_; }
bool is_predicate_clean() const { return is_predicate_clean_ == 1; }
// ?
bool is_yield() const { return is_yeild_ == 1; }
bool is_yield() const { return is_yield_ == 1; }
private:
// Word 0: (32 bits)
uint32_t address_ : 12;
uint32_t count_ : 3;
uint32_t is_yeild_ : 1;
uint32_t serialize_ : 12;
uint32_t is_yield_ : 1;
uint32_t sequence_ : 12;
uint32_t vc_hi_ : 4; // Vertex cache?
// Word 1: (16 bits)
uint32_t vc_lo_ : 2;
uint32_t : 7;
uint32_t clean_ : 1;
// According to the description of Conditional_Execute_Predicates_No_Stall in
// the IPR2015-00325 sequencer specification, the sequencer's control flow
// logic will not wait for the predicate to be updated (apparently after this
// exec). The compiler specifies PredicateClean=false for the exec if the
// instructions inside it modify the predicate (but if the predicate set is
// only a refinement of the current predicate, like in case of a nested `if`,
// PredicateClean=true may still be set according to the IPR2015-00325
// sequencer specification, because the optimization would still work).
uint32_t is_predicate_clean_ : 1;
uint32_t : 1;
AddressingMode address_mode_ : 1;
ControlFlowOpcode opcode_ : 4;
};
static_assert_size(ControlFlowExecInstruction, sizeof(uint32_t) * 2);
// Instruction data for ControlFlowOpcode::kCondExec and kCondExecEnd.
// Instruction data for ControlFlowOpcode::kCondExec, kCondExecEnd,
// kCondExecPredClean and kCondExecPredCleanEnd.
struct ControlFlowCondExecInstruction {
ControlFlowOpcode opcode() const { return opcode_; }
AddressingMode addressing_mode() const { return address_mode_; }
@ -189,21 +269,22 @@ struct ControlFlowCondExecInstruction {
uint32_t address() const { return address_; }
// Number of instructions being executed.
uint32_t count() const { return count_; }
// Sequence bits, 2 per instruction, indicating whether ALU or fetch.
uint32_t sequence() const { return serialize_; }
// Sequence bits, 2 per instruction.
// [0] - ALU (0) or fetch (1), [1] - serialize.
uint32_t sequence() const { return sequence_; }
// Constant index used as the conditional.
uint32_t bool_address() const { return bool_address_; }
// Required condition value of the comparision (true or false).
bool condition() const { return condition_ == 1; }
// ?
bool is_yield() const { return is_yeild_ == 1; }
bool is_yield() const { return is_yield_ == 1; }
private:
// Word 0: (32 bits)
uint32_t address_ : 12;
uint32_t count_ : 3;
uint32_t is_yeild_ : 1;
uint32_t serialize_ : 12;
uint32_t is_yield_ : 1;
uint32_t sequence_ : 12;
uint32_t vc_hi_ : 4; // Vertex cache?
// Word 1: (16 bits)
@ -215,8 +296,7 @@ struct ControlFlowCondExecInstruction {
};
static_assert_size(ControlFlowCondExecInstruction, sizeof(uint32_t) * 2);
// Instruction data for ControlFlowOpcode::kCondExecPred, kCondExecPredEnd,
// kCondExecPredClean, kCondExecPredCleanEnd.
// Instruction data for ControlFlowOpcode::kCondExecPred and kCondExecPredEnd.
struct ControlFlowCondExecPredInstruction {
ControlFlowOpcode opcode() const { return opcode_; }
AddressingMode addressing_mode() const { return address_mode_; }
@ -224,27 +304,27 @@ struct ControlFlowCondExecPredInstruction {
uint32_t address() const { return address_; }
// Number of instructions being executed.
uint32_t count() const { return count_; }
// Sequence bits, 2 per instruction, indicating whether ALU or fetch.
uint32_t sequence() const { return serialize_; }
// Whether to reset the current predicate.
bool clean() const { return clean_ == 1; }
// Sequence bits, 2 per instruction.
// [0] - ALU (0) or fetch (1), [1] - serialize.
uint32_t sequence() const { return sequence_; }
bool is_predicate_clean() const { return is_predicate_clean_ == 1; }
// Required condition value of the comparision (true or false).
bool condition() const { return condition_ == 1; }
// ?
bool is_yield() const { return is_yeild_ == 1; }
bool is_yield() const { return is_yield_ == 1; }
private:
// Word 0: (32 bits)
uint32_t address_ : 12;
uint32_t count_ : 3;
uint32_t is_yeild_ : 1;
uint32_t serialize_ : 12;
uint32_t is_yield_ : 1;
uint32_t sequence_ : 12;
uint32_t vc_hi_ : 4; // Vertex cache?
// Word 1: (16 bits)
uint32_t vc_lo_ : 2;
uint32_t : 7;
uint32_t clean_ : 1;
uint32_t is_predicate_clean_ : 1;
uint32_t condition_ : 1;
AddressingMode address_mode_ : 1;
ControlFlowOpcode opcode_ : 4;
@ -255,12 +335,13 @@ static_assert_size(ControlFlowCondExecPredInstruction, sizeof(uint32_t) * 2);
struct ControlFlowLoopStartInstruction {
ControlFlowOpcode opcode() const { return opcode_; }
AddressingMode addressing_mode() const { return address_mode_; }
// Target address to jump to when skipping the loop.
// Target address to jump to when skipping the loop (normally points to the
// instruction right after the `endloop` instruction).
uint32_t address() const { return address_; }
// Whether to reuse the current aL instead of reset it to loop start.
bool is_repeat() const { return is_repeat_; }
// Integer constant register that holds the loop parameters.
// 0:7 - uint8 loop count, 8:15 - uint8 start aL, 16:23 - int8 aL step.
// Integer constant register that holds the loop parameters
// (xenos::LoopConstant).
uint32_t loop_id() const { return loop_id_; }
private:
@ -282,12 +363,14 @@ static_assert_size(ControlFlowLoopStartInstruction, sizeof(uint32_t) * 2);
struct ControlFlowLoopEndInstruction {
ControlFlowOpcode opcode() const { return opcode_; }
AddressingMode addressing_mode() const { return address_mode_; }
// Target address of the start of the loop body.
// Target address of the start of the loop body (normally points to the
// instruction right after the `loop` instruction).
uint32_t address() const { return address_; }
// Integer constant register that holds the loop parameters.
// 0:7 - uint8 loop count, 8:15 - uint8 start aL, 16:23 - int8 aL step.
// Integer constant register that holds the loop parameters
// (xenos::LoopConstant).
uint32_t loop_id() const { return loop_id_; }
// Break from the loop if the predicate matches the expected value.
// Break from the loop if the predicate in all 64 invocations matches the
// expected value.
bool is_predicated_break() const { return is_predicated_break_; }
// Required condition value of the comparision (true or false).
bool condition() const { return condition_ == 1; }
@ -591,6 +674,24 @@ enum class FetchOpcode : uint32_t {
kSetTextureGradientsVert = 26,
};
enum class FetchDestinationSwizzle {
// The component indices are absolute (not relative to the component itself,
// unlike in ALU operation sources).
kX = 0,
kY = 1,
kZ = 2,
kW = 3,
k0 = 4,
k1 = 5,
// Keep the current value of the destination register (don't write).
kKeep = 7,
};
constexpr FetchDestinationSwizzle GetFetchDestinationComponentSwizzle(
uint32_t swizzle, uint32_t component) {
return FetchDestinationSwizzle((swizzle >> (3 * component)) & 0b111);
}
struct alignas(uint32_t) VertexFetchInstruction {
FetchOpcode opcode() const { return data_.opcode_value; }
@ -614,29 +715,6 @@ struct alignas(uint32_t) VertexFetchInstruction {
uint32_t src_swizzle() const { return data_.src_swiz; }
bool is_src_relative() const { return data_.src_reg_am; }
// Returns true if the fetch actually fetches data.
// This may be false if it's used only to populate constants.
bool fetches_any_data() const {
uint32_t dst_swiz = data_.dst_swiz;
bool fetches_any_data = false;
for (int i = 0; i < 4; i++) {
if ((dst_swiz & 0x7) == 4) {
// 0.0
} else if ((dst_swiz & 0x7) == 5) {
// 1.0
} else if ((dst_swiz & 0x7) == 6) {
// ?
} else if ((dst_swiz & 0x7) == 7) {
// Previous register value.
} else {
fetches_any_data = true;
break;
}
dst_swiz >>= 3;
}
return fetches_any_data;
}
uint32_t prefetch_count() const { return data_.prefetch_count; }
bool is_mini_fetch() const { return data_.is_mini_fetch == 1; }
@ -676,6 +754,7 @@ struct alignas(uint32_t) VertexFetchInstruction {
uint32_t const_index_sel : 2;
// Prefetch count minus 1.
uint32_t prefetch_count : 3;
// Absolute, one component.
uint32_t src_swiz : 2;
};
struct {
@ -769,10 +848,11 @@ struct alignas(uint32_t) TextureFetchInstruction {
uint32_t fetch_valid_only : 1;
uint32_t const_index : 5;
uint32_t tx_coord_denorm : 1;
uint32_t src_swiz : 6; // xyz
// Absolute, three components.
uint32_t src_swiz : 6;
};
struct {
uint32_t dst_swiz : 12; // xyzw
uint32_t dst_swiz : 12;
xenos::TextureFilter mag_filter : 2;
xenos::TextureFilter min_filter : 2;
xenos::TextureFilter mip_filter : 2;
@ -801,21 +881,97 @@ struct alignas(uint32_t) TextureFetchInstruction {
};
static_assert_size(TextureFetchInstruction, sizeof(uint32_t) * 3);
union alignas(uint32_t) FetchInstruction {
public:
FetchOpcode opcode() const { return data_.opcode_value; }
// Whether the jump is predicated (or conditional).
bool is_predicated() const { return data_.is_predicated; }
// Required condition value of the comparision (true or false).
bool predicate_condition() const { return data_.pred_condition == 1; }
uint32_t dest() const { return data_.dst_reg; }
uint32_t dest_swizzle() const { return data_.dst_swiz; }
bool is_dest_relative() const { return data_.dst_reg_am; }
uint32_t src() const { return data_.src_reg; }
bool is_src_relative() const { return data_.src_reg_am; }
// For FetchOpcode::kVertexFetch.
const VertexFetchInstruction& vertex_fetch() const { return vertex_fetch_; }
// For operations other than FetchOpcode::kVertexFetch.
const TextureFetchInstruction& texture_fetch() const {
return texture_fetch_;
}
private:
struct Data {
struct {
FetchOpcode opcode_value : 5;
uint32_t src_reg : 6;
uint32_t src_reg_am : 1;
uint32_t dst_reg : 6;
uint32_t dst_reg_am : 1;
// Specific to vertex or texture fetch.
uint32_t : 1;
// [0-31], points to one tf# or three vf# constants.
uint32_t const_index : 5;
// Specific to vertex or texture fetch.
uint32_t : 7;
};
struct {
uint32_t dst_swiz : 12;
// Specific to vertex or texture fetch.
uint32_t : 19;
uint32_t is_predicated : 1;
};
struct {
// Specific to vertex or texture fetch.
uint32_t : 31;
uint32_t pred_condition : 1;
};
};
Data data_;
VertexFetchInstruction vertex_fetch_;
TextureFetchInstruction texture_fetch_;
};
static_assert_size(FetchInstruction, sizeof(uint32_t) * 3);
// What follows is largely a mash up of the microcode assembly naming and the
// R600 docs that have a near 1:1 with the instructions available in the xenos
// R600 docs that have a near 1:1 with the instructions available in the Xenos
// GPU, and Adreno 2xx instruction names found in Freedreno. Some of the
// behavior has been experimentally verified. Some has been guessed.
// Docs: https://www.x.org/docs/AMD/old/r600isa.pdf
// behavior has been experimentally verified. Some has been guessed. Some
// instructions are implemented in the Exhibit 2092 - sq_alu of IPR2015-00325,
// however, the code provided there is early and incomplete.
//
// Conventions:
// - All temporary registers are vec4s.
// - Scalar ops swizzle out a single component of their source registers denoted
// by 'a' or 'b'. src0.a means 'the first component specified for src0' and
// src0.ab means 'two components specified for src0, in order'.
// - Scalar ops write the result to the entire destination register.
// - pv and ps are the previous results of a vector or scalar ALU operation.
// Both are valid only within the current ALU clause. They are not modified
// when the instruction that would write them fails its predication check.
// - Most scalar ALU operations work with one or two components of the source
// register or the float constant passed as the third operand of the whole
// co-issued ALU operation, denoted by `a` (the left-hand operand) and `b`
// (the right-hand operand).
// `a` is the [(3 + src3_swizzle[6:7]) & 3] component (W - alpha).
// `b` is the [(0 + src3_swizzle[0:1]) & 3] component (X - red).
// - mulsc, addsc, subsc scalar ALU operations accept two operands - a float
// constant with the `a` (W) swizzle (addressed by the third operand index and
// addressing mode) being the left-hand operand, and a temporary register with
// the `b` (X) swizzle with the index constructed from:
// - [0:0] = scalar_opcode[0:0]
// - [1:1] = src3_sel[0:0]
// - [2:5] = src3_swizzle[2:5]
// abs_constants and third source's negation are applied to both the constant
// and the temporary register.
// - Some scalar ALU instructions don't have operands.
// - Scalar ALU operations replicate the result into all masked components.
// - Overall, the WXYZ order is pretty commonly used in the Exhibit 2092 -
// sq_alu of IPR2015-00325, this is where the AB = WX order of scalar operands
// likely comes from. Vector predicate instructions also involve the W and X
// components, and in IPR2015-00325 sq_alu, individual components in the
// emulated vector instructions are handled in the WXYZ order. However, max4's
// "greater than the rest" check order is RGBA (XYZW) there. dp4, though, sums
// the products in WXYZ order in IPR2015-00325 sq_alu (but in XYZW order on
// MSDN).
// - ps is the previous result of a scalar ALU operation. It is not modified
// when the instruction that would write it fails its predication check.
// - Direct3D 9 rules (like in GCN v_*_legacy_f32 instructions) for
// multiplication (+-0 or denormal * anything = +0) wherever it's present
// (mul, mad, dp, etc.) and for NaN in min/max. It's very important to respect
@ -839,6 +995,14 @@ static_assert_size(TextureFetchInstruction, sizeof(uint32_t) * 3);
// use instructions that may be interpreted by the host GPU as fused
// multiply-add.
// For analysis of shaders and skipping instructions that write nothing.
enum AluOpChangedState {
kAluOpChangedStateNone = 0,
kAluOpChangedStateAddressRegister = 1 << 0,
kAluOpChangedStatePredicate = 1 << 1,
kAluOpChangedStatePixelKill = 1 << 2,
};
enum class AluScalarOpcode : uint32_t {
// Floating-Point Add
// adds/ADDs dest, src0.ab
@ -1137,6 +1301,9 @@ enum class AluScalarOpcode : uint32_t {
// dest.xyzw = sqrt(src0.a);
kSqrt = 40,
// 0 and 1 are the same instruction - one bit of the register index is stored
// in the opcode field.
// mulsc/MUL_CONST_0 dest, src0.a, src1.a
kMulsc0 = 42,
// mulsc/MUL_CONST_1 dest, src0.a, src1.a
@ -1165,17 +1332,28 @@ enum class AluScalarOpcode : uint32_t {
kRetainPrev = 50,
};
constexpr bool AluScalarOpcodeIsKill(AluScalarOpcode scalar_opcode) {
switch (scalar_opcode) {
case AluScalarOpcode::kKillsEq:
case AluScalarOpcode::kKillsGt:
case AluScalarOpcode::kKillsGe:
case AluScalarOpcode::kKillsNe:
case AluScalarOpcode::kKillsOne:
return true;
default:
return false;
}
struct AluScalarOpcodeInfo {
const char* name;
// 0 - no operands.
// 1 - one single-component (W) or two-component (WX) r# or c#.
// 2 - c#.w and r#.x.
uint32_t operand_count;
// If operand_count is 1, whether both W and X of the operand are used rather
// than only W.
bool single_operand_is_two_component;
// Note that all scalar instructions except for retain_prev modify the
// previous scalar register, so they must be executed even if they don't write
// any result and don't perform any other state changes.
AluOpChangedState changed_state;
};
// 6 scalar opcode bits - 64 entries.
extern const AluScalarOpcodeInfo kAluScalarOpcodeInfos[64];
inline const AluScalarOpcodeInfo& GetAluScalarOpcodeInfo(
AluScalarOpcode opcode) {
assert_true(uint32_t(opcode) < xe::countof(kAluScalarOpcodeInfos));
return kAluScalarOpcodeInfos[uint32_t(opcode)];
}
enum class AluVectorOpcode : uint32_t {
@ -1273,6 +1451,9 @@ enum class AluVectorOpcode : uint32_t {
// dest.y = src0.y * src1.y + src2.y;
// dest.z = src0.z * src1.z + src2.z;
// dest.w = src0.w * src1.w + src2.w;
// According to SQ_ALU::multiply_add (used in the isHardwareAccurate case)
// from IPR2015-00325 sq_alu, this is FMA - rounding to single-precision only
// after the addition.
kMad = 11,
// Per-Component Floating-Point Conditional Move If Equal
@ -1303,19 +1484,24 @@ enum class AluVectorOpcode : uint32_t {
// dp4/DOT4v dest, src0, src1
// dest.xyzw = src0.x * src1.x + src0.y * src1.y + src0.z * src1.z +
// src0.w * src1.w;
// Note: only pv.x contains the value.
kDp4 = 15,
// Three-Element Dot Product
// dp3/DOT3v dest, src0, src1
// dest.xyzw = src0.x * src1.x + src0.y * src1.y + src0.z * src1.z;
// Note: only pv.x contains the value.
kDp3 = 16,
// Two-Element Dot Product and Add
// dp2add/DOT2ADDv dest, src0, src1, src2
// dest.xyzw = src0.x * src1.x + src0.y * src1.y + src2.x;
// Note: only pv.x contains the value.
// IPR2015-00325 sq_alu may be an outdated and unreliable reference (Sequencer
// Parts Development folder history lists a few changes regarding the swizzle
// in dot2add, sq_alu though implements the instruction as
// src0.x * src1.x + src0.z * src1.z + src2.y, but MSDN specifies the correct
// order as provided in the beginning of this comment, further proven by
// assembling PC shader assembly using XNA, with Shader Model 2 dp2add being
// translated directly into Xenos dp2add without additional swizzling).
// http://web.archive.org/web/20100705150552/http://msdn.microsoft.com/en-us/library/bb313922.aspx
kDp2Add = 17,
// Cube Map
@ -1363,8 +1549,27 @@ enum class AluVectorOpcode : uint32_t {
// Four-Element Maximum
// max4/MAX4v dest, src0
// dest.xyzw = max(src0.x, src0.y, src0.z, src0.w);
// Note: only pv.x contains the value.
// According to IPR2015-00325 sq_alu:
// if (src0.x > src0.y && src0.x > src0.z && src0.x > src0.w) {
// dest.xyzw = src0.x;
// } else if (src0.y > src0.z && src0.y > src0.w) {
// dest.xyzw = src0.y;
// } else if (src0.z > src0.w) {
// dest.xyzw = src0.z;
// } else {
// dest.xyzw = src0.w;
// }
// However, the comparisons may be >= actually - the XNA documentation on
// MSDN, as well as R600 and GCN documentation, describe `max` as being
// implemented via >= rather than >. `max4` is documented vaguely, without the
// exact calculations for each component - MSDN describes it as max(xyzw), and
// in the R600 documentation it's max(wzyx). There's also a case more similar
// to `max4` where there also is a discrepancy between IPR2015-00325 sq_alu
// and the GCN documentation - `cube` has max3 in zyx priority order, and a >=
// comparison is used for this purpose on the GCN, but in IPR2015-00325 sq_alu
// it's implemented via >. It's possible that in an early version of the R400,
// the comparison was >, but was later changed to >=, but this is merely a
// guess.
kMax4 = 19,
// Floating-Point Predicate Counter Increment If Equal
@ -1502,60 +1707,32 @@ enum class AluVectorOpcode : uint32_t {
kMaxA = 29,
};
constexpr bool AluVectorOpcodeIsKill(AluVectorOpcode vector_opcode) {
switch (vector_opcode) {
case AluVectorOpcode::kKillEq:
case AluVectorOpcode::kKillGt:
case AluVectorOpcode::kKillGe:
case AluVectorOpcode::kKillNe:
return true;
default:
return false;
}
}
struct AluVectorOpcodeInfo {
const char* name;
uint32_t operand_components_used[3];
AluOpChangedState changed_state;
// Whether the vector instruction has side effects such as discarding a pixel or
// setting the predicate and can't be ignored even if it doesn't write to
// anywhere. Note that all scalar operations except for retain_prev have a side
// effect of modifying the previous scalar result register, so they must always
// be executed even if not writing.
constexpr bool AluVectorOpHasSideEffects(AluVectorOpcode vector_opcode) {
if (AluVectorOpcodeIsKill(vector_opcode)) {
return true;
uint32_t GetOperandCount() const {
if (!operand_components_used[2]) {
if (!operand_components_used[1]) {
if (!operand_components_used[0]) {
return 0;
}
switch (vector_opcode) {
case AluVectorOpcode::kSetpEqPush:
case AluVectorOpcode::kSetpNePush:
case AluVectorOpcode::kSetpGtPush:
case AluVectorOpcode::kSetpGePush:
case AluVectorOpcode::kMaxA:
return true;
default:
return false;
return 1;
}
return 2;
}
return 3;
}
};
// Whether each component of a source operand is used at all in the instruction
// (doesn't check the operand count though).
constexpr uint32_t GetAluVectorOpUsedSourceComponents(
AluVectorOpcode vector_opcode, uint32_t src_index) {
assert_not_zero(src_index);
switch (vector_opcode) {
case AluVectorOpcode::kDp3:
return 0b0111;
case AluVectorOpcode::kDp2Add:
return src_index == 3 ? 0b0001 : 0b0011;
case AluVectorOpcode::kSetpEqPush:
case AluVectorOpcode::kSetpNePush:
case AluVectorOpcode::kSetpGtPush:
case AluVectorOpcode::kSetpGePush:
return 0b1001;
case AluVectorOpcode::kDst:
return src_index == 2 ? 0b1010 : 0b0110;
default:
break;
}
return 0b1111;
// 5 vector opcode bits - 32 entries.
extern const AluVectorOpcodeInfo kAluVectorOpcodeInfos[32];
inline const AluVectorOpcodeInfo& GetAluVectorOpcodeInfo(
AluVectorOpcode opcode) {
assert_true(uint32_t(opcode) < xe::countof(kAluVectorOpcodeInfos));
return kAluVectorOpcodeInfos[uint32_t(opcode)];
}
// Whether each component of a source operand is needed for the instruction if
@ -1563,7 +1740,7 @@ constexpr uint32_t GetAluVectorOpUsedSourceComponents(
// undefined in translation. For per-component operations, for example, only the
// components specified in the write mask are needed, but there are instructions
// with special behavior for certain components.
constexpr uint32_t GetAluVectorOpNeededSourceComponents(
inline uint32_t GetAluVectorOpNeededSourceComponents(
AluVectorOpcode vector_opcode, uint32_t src_index,
uint32_t used_result_components) {
assert_not_zero(src_index);
@ -1596,8 +1773,8 @@ constexpr uint32_t GetAluVectorOpNeededSourceComponents(
case AluVectorOpcode::kKillNe:
components = 0b1111;
break;
// kDst is per-component, but not all components are used -
// GetAluVectorOpUsedSourceComponents will filter out the unused ones.
// kDst is per-component, but not all components are used.
// operand_components_used will filter out the unused ones.
case AluVectorOpcode::kMaxA:
if (src_index == 1) {
components |= 0b1000;
@ -1606,8 +1783,8 @@ constexpr uint32_t GetAluVectorOpNeededSourceComponents(
default:
break;
}
return components &
GetAluVectorOpUsedSourceComponents(vector_opcode, src_index);
return components & GetAluVectorOpcodeInfo(vector_opcode)
.operand_components_used[src_index - 1];
}
enum class ExportRegister : uint32_t {
@ -1633,10 +1810,24 @@ enum class ExportRegister : uint32_t {
// See R6xx/R7xx registers for details (USE_VTX_POINT_SIZE, USE_VTX_EDGE_FLAG,
// USE_VTX_KILL_FLAG).
// X - PSIZE (gl_PointSize).
// According to tests and GL_AMD_program_binary_Z400 disassembly on an
// Adreno 200 device:
// * This is the full width and height of the point sprite (not half -
// gl_PointSize goes directly to oPts.x).
// * Clamped to PA_SU_POINT_MINMAX as a signed integer in rasterization:
// * -NaN - min
// * -Infinity - min
// * -Normal - min
// * -0 (0x80000000 - the smallest signed integer) - min
// * +0 - min
// * +Infinity - max
// * +NaN - max
// Y - EDGEFLAG (glEdgeFlag) for PrimitiveType::kPolygon wireframe/point
// drawing.
// Z - KILLVERTEX flag (used in 4D5307ED for grass), set for killing
// primitives based on PA_CL_CLIP_CNTL::VTX_KILL_OR condition.
// primitives based on PA_CL_CLIP_CNTL::VTX_KILL_OR condition if bits 0:30
// of this export value (the sign bit is ignored according to the
// IPR2015-00325 sequencer specification) are not zero.
kVSPointSizeEdgeFlagKillVertex = 63,
kPSColor0 = 0,
@ -1662,7 +1853,6 @@ struct alignas(uint32_t) AluInstruction {
// Whether data is being exported (or written to local registers).
bool is_export() const { return data_.export_data == 1; }
bool export_write_mask() const { return data_.scalar_dest_rel == 1; }
// Whether the jump is predicated (or conditional).
bool is_predicated() const { return data_.is_predicated; }
@ -1672,7 +1862,9 @@ struct alignas(uint32_t) AluInstruction {
bool abs_constants() const { return data_.abs_constants == 1; }
bool is_const_0_addressed() const { return data_.const_0_rel_abs == 1; }
bool is_const_1_addressed() const { return data_.const_1_rel_abs == 1; }
bool is_address_relative() const { return data_.address_absolute == 1; }
bool is_const_address_register_relative() const {
return data_.const_address_register_relative == 1;
}
AluVectorOpcode vector_opcode() const { return data_.vector_opc; }
uint32_t vector_write_mask() const { return data_.vector_write_mask; }
@ -1686,6 +1878,18 @@ struct alignas(uint32_t) AluInstruction {
bool is_scalar_dest_relative() const { return data_.scalar_dest_rel == 1; }
bool scalar_clamp() const { return data_.scalar_clamp == 1; }
static constexpr uint32_t src_temp_reg(uint32_t src_reg) {
return src_reg & 0x3F;
}
static constexpr bool is_src_temp_relative(uint32_t src_reg) {
return (src_reg & 0x40) != 0;
}
static constexpr bool is_src_temp_value_absolute(uint32_t src_reg) {
return (src_reg & 0x80) != 0;
}
// Full register index for constants, packed structure for temporary
// registers (unpack using src_temp_reg, is_src_temp_relative,
// is_src_temp_value_absolute).
uint32_t src_reg(size_t i) const {
switch (i) {
case 1:
@ -1702,16 +1906,59 @@ struct alignas(uint32_t) AluInstruction {
bool src_is_temp(size_t i) const {
switch (i) {
case 1:
return data_.src1_sel == 1;
return bool(data_.src1_sel);
case 2:
return data_.src2_sel == 1;
return bool(data_.src2_sel);
case 3:
return data_.src3_sel == 1;
return bool(data_.src3_sel);
default:
assert_unhandled_case(i);
return 0;
}
}
// Whether the specified operand is actually a constant is disregarded in this
// function so its scope is limited to just parsing the structure's layout -
// to decide whether to use relative addressing for the operand as a whole,
// check externally whether the operand is actually a constant first.
//
// For the constant operand in mulsc, addsc, subsc, this should be called for
// the operand index 3. Note that the XNA disassembler takes the addressing
// mode for the constant scalar operand unconditionally from const_1_rel_abs,
// and ignores the +aL for it unless the scalar operation is co-issued with a
// vector operation reading from a constant. However, the XNA assembler treats
// the constant scalar operand as a constant in the third operand, and places
// the addressing mode for it in const_0_rel_abs if no other constants are
// used in the whole ALU instruction. The validator also doesn't report
// anything if +aL is used when the constant scalar operand is the only
// constant in the instruction (and explicitly calls it the third constant in
// the error message in case both vector operands are constants, and different
// addressing modes are used for the second vector operand and the constant
// scalar operand). Passing the disassembly produced by XNA back to the
// assembler results in different microcode in this case. This indicates that
// most likely there's a bug in the XNA disassembler, and that the addressing
// mode for the constant scalar operand should actually be taken the same way
// as for the third vector operand - from const_0_rel_abs if there are no
// constant vector operands, or from const_1_rel_abs if there is at least one.
bool src_const_is_addressed(size_t i) const {
// "error X7100: When three constants are used in one instruction, the
// second and third constant must either both be non-relative, or both be
// relative."
// Whether to use const_0_rel_abs or const_1_rel_abs is essentially
// min(sum of whether the previous operands are constants, 1).
switch (i) {
case 1:
return bool(data_.const_0_rel_abs);
case 2:
return bool(src_is_temp(1) ? data_.const_0_rel_abs
: data_.const_1_rel_abs);
case 3:
return bool((src_is_temp(1) && src_is_temp(2)) ? data_.const_0_rel_abs
: data_.const_1_rel_abs);
default:
assert_unhandled_case(i);
return false;
}
}
uint32_t src_swizzle(size_t i) const {
switch (i) {
case 1:
@ -1739,8 +1986,20 @@ struct alignas(uint32_t) AluInstruction {
}
}
uint32_t scalar_const_reg_op_src_temp_reg() const {
return (uint32_t(data_.scalar_opc) & 1) | (data_.src3_sel << 1) |
(data_.src3_swiz & 0x3C);
}
// Helpers.
// Returns the absolute component index calculated from the relative swizzle
// in an ALU instruction.
static constexpr uint32_t GetSwizzledComponentIndex(
uint32_t swizzle, uint32_t component_index) {
return ((swizzle >> (2 * component_index)) + component_index) & 3;
}
// Note that even if the export component is unused (like W of the vertex
// shader misc register, YZW of pixel shader depth), it must still not be
// excluded - that may make disassembly not reassemblable if there are
@ -1803,6 +2062,7 @@ struct alignas(uint32_t) AluInstruction {
AluScalarOpcode scalar_opc : 6;
};
struct {
// Swizzles are component-relative.
uint32_t src3_swiz : 8;
uint32_t src2_swiz : 8;
uint32_t src1_swiz : 8;
@ -1811,7 +2071,9 @@ struct alignas(uint32_t) AluInstruction {
uint32_t src1_reg_negate : 1;
uint32_t pred_condition : 1;
uint32_t is_predicated : 1;
uint32_t address_absolute : 1;
// Temporary registers can have only absolute and aL-relative indices, not
// a0-relative.
uint32_t const_address_register_relative : 1;
uint32_t const_1_rel_abs : 1;
uint32_t const_0_rel_abs : 1;
};

View File

@ -199,8 +199,8 @@ bool VulkanCommandProcessor::SetupContext() {
return false;
}
render_target_cache_ =
std::make_unique<VulkanRenderTargetCache>(*this, *register_file_);
render_target_cache_ = std::make_unique<VulkanRenderTargetCache>(
*register_file_, *memory_, &trace_writer_, *this);
if (!render_target_cache_->Initialize()) {
XELOGE("Failed to initialize the render target cache");
return false;
@ -1383,6 +1383,8 @@ bool VulkanCommandProcessor::IssueDraw(xenos::PrimitiveType prim_type,
return false;
}
reg::RB_DEPTHCONTROL normalized_depth_control =
draw_util::GetNormalizedDepthControl(regs);
uint32_t normalized_color_mask =
pixel_shader ? draw_util::GetNormalizedColorMask(
regs, pixel_shader->writes_color_targets())
@ -1399,7 +1401,8 @@ bool VulkanCommandProcessor::IssueDraw(xenos::PrimitiveType prim_type,
// Set up the render targets - this may perform dispatches and draws.
if (!render_target_cache_->Update(is_rasterization_done,
normalized_color_mask)) {
normalized_depth_control,
normalized_color_mask, *vertex_shader)) {
return false;
}
@ -1421,7 +1424,8 @@ bool VulkanCommandProcessor::IssueDraw(xenos::PrimitiveType prim_type,
const VulkanPipelineCache::PipelineLayoutProvider* pipeline_layout_provider;
if (!pipeline_cache_->ConfigurePipeline(
vertex_shader_translation, pixel_shader_translation,
primitive_processing_result, normalized_color_mask,
primitive_processing_result, normalized_depth_control,
normalized_color_mask,
render_target_cache_->last_update_render_pass_key(), pipeline,
pipeline_layout_provider)) {
return false;
@ -1485,13 +1489,14 @@ bool VulkanCommandProcessor::IssueDraw(xenos::PrimitiveType prim_type,
// life. Or even disregard the viewport bounds range in the fragment shader
// interlocks case completely - apply the viewport and the scissor offset
// directly to pixel address and to things like ps_param_gen.
draw_util::GetHostViewportInfo(regs, 1, 1, false,
device_limits.maxViewportDimensions[0],
device_limits.maxViewportDimensions[1], true,
draw_util::GetHostViewportInfo(
regs, 1, 1, false, device_limits.maxViewportDimensions[0],
device_limits.maxViewportDimensions[1], true, normalized_depth_control,
false, false, false, viewport_info);
// Update dynamic graphics pipeline state.
UpdateDynamicState(viewport_info, primitive_polygonal);
UpdateDynamicState(viewport_info, primitive_polygonal,
normalized_depth_control);
// Update system constants before uploading them.
UpdateSystemConstantValues(primitive_processing_result.host_index_endian,
@ -2133,7 +2138,8 @@ VkShaderStageFlags VulkanCommandProcessor::GetGuestVertexShaderStageFlags()
}
void VulkanCommandProcessor::UpdateDynamicState(
const draw_util::ViewportInfo& viewport_info, bool primitive_polygonal) {
const draw_util::ViewportInfo& viewport_info, bool primitive_polygonal,
reg::RB_DEPTHCONTROL normalized_depth_control) {
#if XE_UI_VULKAN_FINE_GRAINED_DRAW_SCOPES
SCOPE_profile_cpu_f("gpu");
#endif // XE_UI_VULKAN_FINE_GRAINED_DRAW_SCOPES
@ -2234,10 +2240,9 @@ void VulkanCommandProcessor::UpdateDynamicState(
// effect on drawing, and because the masks and the references are always
// dynamic in Xenia guest pipelines, they must be set in the command buffer
// before any draw.
auto rb_depthcontrol = draw_util::GetDepthControlForCurrentEdramMode(regs);
if (rb_depthcontrol.stencil_enable) {
if (normalized_depth_control.stencil_enable) {
Register stencil_ref_mask_front_reg, stencil_ref_mask_back_reg;
if (primitive_polygonal && rb_depthcontrol.backface_enable) {
if (primitive_polygonal && normalized_depth_control.backface_enable) {
const ui::vulkan::VulkanProvider& provider = GetVulkanProvider();
const VkPhysicalDevicePortabilitySubsetFeaturesKHR*
device_portability_subset_features =

View File

@ -21,6 +21,7 @@
#include "xenia/gpu/command_processor.h"
#include "xenia/gpu/draw_util.h"
#include "xenia/gpu/registers.h"
#include "xenia/gpu/spirv_shader_translator.h"
#include "xenia/gpu/vulkan/deferred_command_buffer.h"
#include "xenia/gpu/vulkan/vulkan_graphics_system.h"
@ -242,7 +243,8 @@ class VulkanCommandProcessor : public CommandProcessor {
VkShaderStageFlags GetGuestVertexShaderStageFlags() const;
void UpdateDynamicState(const draw_util::ViewportInfo& viewport_info,
bool primitive_polygonal);
bool primitive_polygonal,
reg::RB_DEPTHCONTROL normalized_depth_control);
void UpdateSystemConstantValues(xenos::Endian index_endian,
const draw_util::ViewportInfo& viewport_info);
bool UpdateBindings(const VulkanShader* vertex_shader,

View File

@ -121,8 +121,8 @@ VulkanShader* VulkanPipelineCache::LoadShader(xenos::ShaderType shader_type,
// We need to track it even if it fails translation so we know not to try
// again.
VulkanShader* shader =
new VulkanShader(shader_type, data_hash, host_address, dword_count,
command_processor_.GetVulkanProvider());
new VulkanShader(command_processor_.GetVulkanProvider(), shader_type,
data_hash, host_address, dword_count);
shaders_.emplace(data_hash, shader);
return shader;
}
@ -188,6 +188,7 @@ bool VulkanPipelineCache::ConfigurePipeline(
VulkanShader::VulkanTranslation* vertex_shader,
VulkanShader::VulkanTranslation* pixel_shader,
const PrimitiveProcessor::ProcessingResult& primitive_processing_result,
reg::RB_DEPTHCONTROL normalized_depth_control,
uint32_t normalized_color_mask,
VulkanRenderTargetCache::RenderPassKey render_pass_key,
VkPipeline& pipeline_out,
@ -231,7 +232,8 @@ bool VulkanPipelineCache::ConfigurePipeline(
PipelineDescription description;
if (!GetCurrentStateDescription(
vertex_shader, pixel_shader, primitive_processing_result,
normalized_color_mask, render_pass_key, description)) {
normalized_depth_control, normalized_color_mask, render_pass_key,
description)) {
return false;
}
if (last_pipeline_ && last_pipeline_->first == description) {
@ -360,6 +362,7 @@ bool VulkanPipelineCache::GetCurrentStateDescription(
const VulkanShader::VulkanTranslation* vertex_shader,
const VulkanShader::VulkanTranslation* pixel_shader,
const PrimitiveProcessor::ProcessingResult& primitive_processing_result,
reg::RB_DEPTHCONTROL normalized_depth_control,
uint32_t normalized_color_mask,
VulkanRenderTargetCache::RenderPassKey render_pass_key,
PipelineDescription& description_out) const {
@ -484,27 +487,32 @@ bool VulkanPipelineCache::GetCurrentStateDescription(
// shader interlock RB implementation.
if (render_pass_key.depth_and_color_used & 1) {
auto rb_depthcontrol = draw_util::GetDepthControlForCurrentEdramMode(regs);
if (rb_depthcontrol.z_enable) {
description_out.depth_write_enable = rb_depthcontrol.z_write_enable;
description_out.depth_compare_op = rb_depthcontrol.zfunc;
if (normalized_depth_control.z_enable) {
description_out.depth_write_enable =
normalized_depth_control.z_write_enable;
description_out.depth_compare_op = normalized_depth_control.zfunc;
} else {
description_out.depth_compare_op = xenos::CompareFunction::kAlways;
}
if (rb_depthcontrol.stencil_enable) {
if (normalized_depth_control.stencil_enable) {
description_out.stencil_test_enable = 1;
description_out.stencil_front_fail_op = rb_depthcontrol.stencilfail;
description_out.stencil_front_pass_op = rb_depthcontrol.stencilzpass;
description_out.stencil_front_fail_op =
normalized_depth_control.stencilfail;
description_out.stencil_front_pass_op =
normalized_depth_control.stencilzpass;
description_out.stencil_front_depth_fail_op =
rb_depthcontrol.stencilzfail;
description_out.stencil_front_compare_op = rb_depthcontrol.stencilfunc;
if (primitive_polygonal && rb_depthcontrol.backface_enable) {
description_out.stencil_back_fail_op = rb_depthcontrol.stencilfail_bf;
description_out.stencil_back_pass_op = rb_depthcontrol.stencilzpass_bf;
normalized_depth_control.stencilzfail;
description_out.stencil_front_compare_op =
normalized_depth_control.stencilfunc;
if (primitive_polygonal && normalized_depth_control.backface_enable) {
description_out.stencil_back_fail_op =
normalized_depth_control.stencilfail_bf;
description_out.stencil_back_pass_op =
normalized_depth_control.stencilzpass_bf;
description_out.stencil_back_depth_fail_op =
rb_depthcontrol.stencilzfail_bf;
normalized_depth_control.stencilzfail_bf;
description_out.stencil_back_compare_op =
rb_depthcontrol.stencilfunc_bf;
normalized_depth_control.stencilfunc_bf;
} else {
description_out.stencil_back_fail_op =
description_out.stencil_front_fail_op;

View File

@ -76,6 +76,7 @@ class VulkanPipelineCache {
VulkanShader::VulkanTranslation* vertex_shader,
VulkanShader::VulkanTranslation* pixel_shader,
const PrimitiveProcessor::ProcessingResult& primitive_processing_result,
reg::RB_DEPTHCONTROL normalized_depth_control,
uint32_t normalized_color_mask,
VulkanRenderTargetCache::RenderPassKey render_pass_key,
VkPipeline& pipeline_out,
@ -218,6 +219,7 @@ class VulkanPipelineCache {
const VulkanShader::VulkanTranslation* vertex_shader,
const VulkanShader::VulkanTranslation* pixel_shader,
const PrimitiveProcessor::ProcessingResult& primitive_processing_result,
reg::RB_DEPTHCONTROL normalized_depth_control,
uint32_t normalized_color_mask,
VulkanRenderTargetCache::RenderPassKey render_pass_key,
PipelineDescription& description_out) const;

View File

@ -114,9 +114,10 @@ const VulkanRenderTargetCache::TransferModeInfo
};
VulkanRenderTargetCache::VulkanRenderTargetCache(
VulkanCommandProcessor& command_processor,
const RegisterFile& register_file)
: RenderTargetCache(register_file), command_processor_(command_processor) {}
const RegisterFile& register_file, const Memory& memory,
TraceWriter* trace_writer, VulkanCommandProcessor& command_processor)
: RenderTargetCache(register_file, memory, trace_writer),
command_processor_(command_processor) {}
VulkanRenderTargetCache::~VulkanRenderTargetCache() { Shutdown(true); }
@ -574,10 +575,12 @@ void VulkanRenderTargetCache::EndSubmission() {
}
}
bool VulkanRenderTargetCache::Update(bool is_rasterization_done,
uint32_t shader_writes_color_targets) {
bool VulkanRenderTargetCache::Update(
bool is_rasterization_done, reg::RB_DEPTHCONTROL normalized_depth_control,
uint32_t normalized_color_mask, const Shader& vertex_shader) {
if (!RenderTargetCache::Update(is_rasterization_done,
shader_writes_color_targets)) {
normalized_depth_control,
normalized_color_mask, vertex_shader)) {
return false;
}

View File

@ -85,8 +85,9 @@ class VulkanRenderTargetCache final : public RenderTargetCache {
: framebuffer(framebuffer), host_extent(host_extent) {}
};
VulkanRenderTargetCache(VulkanCommandProcessor& command_processor,
const RegisterFile& register_file);
VulkanRenderTargetCache(const RegisterFile& register_file,
const Memory& memory, TraceWriter* trace_writer,
VulkanCommandProcessor& command_processor);
~VulkanRenderTargetCache();
bool Initialize();
@ -103,7 +104,9 @@ class VulkanRenderTargetCache final : public RenderTargetCache {
uint32_t GetResolutionScaleY() const override { return resolution_scale_y_; }
bool Update(bool is_rasterization_done,
uint32_t shader_writes_color_targets) override;
reg::RB_DEPTHCONTROL normalized_depth_control,
uint32_t normalized_color_mask,
const Shader& vertex_shader) override;
// Binding information for the last successful update.
RenderPassKey last_update_render_pass_key() const {
return last_update_render_pass_key_;

View File

@ -51,10 +51,14 @@ VkShaderModule VulkanShader::VulkanTranslation::GetOrCreateShaderModule() {
return shader_module_;
}
VulkanShader::VulkanShader(xenos::ShaderType shader_type, uint64_t data_hash,
const uint32_t* dword_ptr, uint32_t dword_count,
const ui::vulkan::VulkanProvider& provider)
: Shader(shader_type, data_hash, dword_ptr, dword_count),
VulkanShader::VulkanShader(const ui::vulkan::VulkanProvider& provider,
xenos::ShaderType shader_type,
uint64_t ucode_data_hash,
const uint32_t* ucode_dwords,
size_t ucode_dword_count,
std::endian ucode_source_endian)
: Shader(shader_type, ucode_data_hash, ucode_dwords, ucode_dword_count,
ucode_source_endian),
provider_(provider) {}
Shader::Translation* VulkanShader::CreateTranslationInstance(

View File

@ -35,9 +35,10 @@ class VulkanShader : public Shader {
VkShaderModule shader_module_ = VK_NULL_HANDLE;
};
VulkanShader(xenos::ShaderType shader_type, uint64_t data_hash,
const uint32_t* dword_ptr, uint32_t dword_count,
const ui::vulkan::VulkanProvider& provider);
VulkanShader(const ui::vulkan::VulkanProvider& provider,
xenos::ShaderType shader_type, uint64_t ucode_data_hash,
const uint32_t* ucode_dwords, size_t ucode_dword_count,
std::endian ucode_source_endian = std::endian::big);
protected:
Translation* CreateTranslationInstance(uint64_t modification) override;

View File

@ -976,6 +976,21 @@ inline uint32_t GpuToCpu(uint32_t p) { return p; }
inline uint32_t CpuToGpu(uint32_t p) { return p & 0x1FFFFFFF; }
// XE_GPU_REG_SHADER_CONSTANT_LOOP_*
union alignas(uint32_t) LoopConstant {
uint32_t value;
struct {
uint32_t count : 8; // +0
// Address (aL) start and step.
// The resulting aL is `iterator * step + start`, 10-bit, and has the real
// range of [-256, 256], according to the IPR2015-00325 sequencer
// specification.
uint32_t start : 8; // +8
int32_t step : 8; // +16
};
};
static_assert_size(LoopConstant, sizeof(uint32_t));
// SQ_TEX_VTX_INVALID/VALID_TEXTURE/BUFFER
enum class FetchConstantType : uint32_t {
kInvalidTexture,

Some files were not shown because too many files have changed in this diff Show More