ares-openbsd/nall/array-view.hpp

146 行
4.0 KiB
C++
Raw パーマリンク 通常表示 履歴

#pragma once
#include <nall/iterator.hpp>
#include <nall/range.hpp>
#include <nall/traits.hpp>
namespace nall {
template<typename T> struct array_view {
using type = array_view;
array_view() {
_data = nullptr;
_size = 0;
}
array_view(nullptr_t) {
_data = nullptr;
_size = 0;
}
array_view(const void* data, u64 size) {
_data = (const T*)data;
_size = (s32)size;
}
template<s32 size> array_view(const T (&data)[size]) {
_data = data;
_size = size;
}
Update to ares v118 release. I'm excited to launch ares v118 today, the first release featuring playable, full-speed Nintendo 64 emulation! The new Nintendo 64 emulation is made possible thanks to [Themaister] very graciously porting his Vulkan-based ParaLLEl-RDP graphics renderer to ares. With its default settings, it is nearly pixel-perfect to real hardware, and it optionally supports upscaling to 2x or 4x the original Nintendo 64 resolution, plus optional supersampling back down to the original resolution (for enhanced anti-aliasing) if desired. The Vulkan support requires an appropriate graphics card, and either Windows or Linux. At this time, Vulkan is not available for macOS nor the BSDs. Also new for the Nintendo 64 core in this release is Rumble Pak, Cartridge Pak, SRAM, EEPROM, and Flash save support. Note that for right now, the Rumble Pak will only be enabled for games which use internal saves (SRAM, EEPROM, and Flash.) That does not cover all Rumble Pak-capable games. The option to choose between Rumble Paks and Cartridge Paks will be added to a future release. For the PlayStation core, [Luke Usher] provided two rendering fixes that allow Final Fantasy VII and Tony Hawk's Pro Skater to be fully playable! Right now, approximately 33% of the Nintendo 64 library is fully playable, and about 67% of the PlayStation library is fully playable. Each core has only been under active development for about one month each, so they both have a long way to go. Please treat these early releases as tech samples, rather than finished emulation cores. Further, note that the Nintendo 64 and PlayStation cores employ cached interpreters. This is a middle-ground between the accuracy of interpreters and the performance of dynamic recompilers. As such, ares' system requirements will be a bit higher than traditional emulators for these systems. Presuming no background task interference or CPU throttling, generally speaking, a Ryzen 5 2600 or better CPU should get you to around ~120fps in the average case, and ~60fps in the worst case. The source code has also been released under the terms of the Creative Commons BY-NC-ND 4.0 license. [Themaister]: http://github.com/Themaister/ [Luke Usher]: https://twitter.com/LukeUsher1
2021-02-21 08:51:00 +09:00
explicit operator bool() const {
return _data && _size > 0;
}
Update to ares v118 release. I'm excited to launch ares v118 today, the first release featuring playable, full-speed Nintendo 64 emulation! The new Nintendo 64 emulation is made possible thanks to [Themaister] very graciously porting his Vulkan-based ParaLLEl-RDP graphics renderer to ares. With its default settings, it is nearly pixel-perfect to real hardware, and it optionally supports upscaling to 2x or 4x the original Nintendo 64 resolution, plus optional supersampling back down to the original resolution (for enhanced anti-aliasing) if desired. The Vulkan support requires an appropriate graphics card, and either Windows or Linux. At this time, Vulkan is not available for macOS nor the BSDs. Also new for the Nintendo 64 core in this release is Rumble Pak, Cartridge Pak, SRAM, EEPROM, and Flash save support. Note that for right now, the Rumble Pak will only be enabled for games which use internal saves (SRAM, EEPROM, and Flash.) That does not cover all Rumble Pak-capable games. The option to choose between Rumble Paks and Cartridge Paks will be added to a future release. For the PlayStation core, [Luke Usher] provided two rendering fixes that allow Final Fantasy VII and Tony Hawk's Pro Skater to be fully playable! Right now, approximately 33% of the Nintendo 64 library is fully playable, and about 67% of the PlayStation library is fully playable. Each core has only been under active development for about one month each, so they both have a long way to go. Please treat these early releases as tech samples, rather than finished emulation cores. Further, note that the Nintendo 64 and PlayStation cores employ cached interpreters. This is a middle-ground between the accuracy of interpreters and the performance of dynamic recompilers. As such, ares' system requirements will be a bit higher than traditional emulators for these systems. Presuming no background task interference or CPU throttling, generally speaking, a Ryzen 5 2600 or better CPU should get you to around ~120fps in the average case, and ~60fps in the worst case. The source code has also been released under the terms of the Creative Commons BY-NC-ND 4.0 license. [Themaister]: http://github.com/Themaister/ [Luke Usher]: https://twitter.com/LukeUsher1
2021-02-21 08:51:00 +09:00
explicit operator const T*() const {
return _data;
}
Update to ares v118 release. I'm excited to launch ares v118 today, the first release featuring playable, full-speed Nintendo 64 emulation! The new Nintendo 64 emulation is made possible thanks to [Themaister] very graciously porting his Vulkan-based ParaLLEl-RDP graphics renderer to ares. With its default settings, it is nearly pixel-perfect to real hardware, and it optionally supports upscaling to 2x or 4x the original Nintendo 64 resolution, plus optional supersampling back down to the original resolution (for enhanced anti-aliasing) if desired. The Vulkan support requires an appropriate graphics card, and either Windows or Linux. At this time, Vulkan is not available for macOS nor the BSDs. Also new for the Nintendo 64 core in this release is Rumble Pak, Cartridge Pak, SRAM, EEPROM, and Flash save support. Note that for right now, the Rumble Pak will only be enabled for games which use internal saves (SRAM, EEPROM, and Flash.) That does not cover all Rumble Pak-capable games. The option to choose between Rumble Paks and Cartridge Paks will be added to a future release. For the PlayStation core, [Luke Usher] provided two rendering fixes that allow Final Fantasy VII and Tony Hawk's Pro Skater to be fully playable! Right now, approximately 33% of the Nintendo 64 library is fully playable, and about 67% of the PlayStation library is fully playable. Each core has only been under active development for about one month each, so they both have a long way to go. Please treat these early releases as tech samples, rather than finished emulation cores. Further, note that the Nintendo 64 and PlayStation cores employ cached interpreters. This is a middle-ground between the accuracy of interpreters and the performance of dynamic recompilers. As such, ares' system requirements will be a bit higher than traditional emulators for these systems. Presuming no background task interference or CPU throttling, generally speaking, a Ryzen 5 2600 or better CPU should get you to around ~120fps in the average case, and ~60fps in the worst case. The source code has also been released under the terms of the Creative Commons BY-NC-ND 4.0 license. [Themaister]: http://github.com/Themaister/ [Luke Usher]: https://twitter.com/LukeUsher1
2021-02-21 08:51:00 +09:00
const T& operator*() const {
return *_data;
}
auto operator++() -> type& { _data++; _size--; return *this; }
auto operator--() -> type& { _data--; _size++; return *this; }
auto operator++(s32) -> type { auto copy = *this; ++(*this); return copy; }
auto operator--(s32) -> type { auto copy = *this; --(*this); return copy; }
auto operator-=(s32 distance) -> type& { _data -= distance; _size += distance; return *this; }
auto operator+=(s32 distance) -> type& { _data += distance; _size -= distance; return *this; }
auto operator[](u32 index) const -> const T& {
#ifdef DEBUG
struct out_of_bounds {};
if(index >= _size) throw out_of_bounds{};
#endif
return _data[index];
}
auto operator()(u32 index, const T& fallback = {}) const -> T {
if(index >= _size) return fallback;
return _data[index];
}
template<typename U = T> auto data() const -> const U* { return (const U*)_data; }
template<typename U = T> auto size() const -> u64 { return _size * sizeof(T) / sizeof(U); }
auto begin() const -> iterator_const<T> { return {_data, (u32)0}; }
auto end() const -> iterator_const<T> { return {_data, (u32)_size}; }
auto rbegin() const -> reverse_iterator_const<T> { return {_data, (u32)_size - 1}; }
auto rend() const -> reverse_iterator_const<T> { return {_data, (u32)-1}; }
auto read() -> T {
auto value = operator[](0);
_data++;
_size--;
return value;
}
auto view(u32 offset, u32 length) const -> type {
#ifdef DEBUG
struct out_of_bounds {};
if(offset + length >= _size) throw out_of_bounds{};
#endif
return {_data + offset, length};
}
//array_view<u8> specializations
template<typename U> auto readl(U& value, u32 size) -> U;
template<typename U> auto readm(U& value, u32 size) -> U;
template<typename U> auto readvn(U& value, u32 size) -> U;
template<typename U> auto readvi(U& value, u32 size) -> U;
template<typename U> auto readl(U& value, u32 offset, u32 size) -> U { return view(offset, size).readl(value, size); }
template<typename U = u64> auto readl(u32 size) -> U { U value; return readl(value, size); }
template<typename U = u64> auto readm(u32 size) -> U { U value; return readm(value, size); }
template<typename U = u64> auto readvn(u32 size) -> U { U value; return readvn(value, size); }
template<typename U = s64> auto readvi(u32 size) -> U { U value; return readvi(value, size); }
template<typename U = u64> auto readl(u32 offset, u32 size) -> U { U value; return readl(value, offset, size); }
protected:
const T* _data;
s32 _size;
};
//array_view<u8>
template<> template<typename U> inline auto array_view<u8>::readl(U& value, u32 size) -> U {
value = 0;
for(u32 byte : range(size)) value |= (U)read() << byte * 8;
return value;
}
template<> template<typename U> inline auto array_view<u8>::readm(U& value, u32 size) -> U {
value = 0;
for(u32 byte : reverse(range(size))) value |= (U)read() << byte * 8;
return value;
}
template<> template<typename U> inline auto array_view<u8>::readvn(U& value, u32 size) -> U {
value = 0;
u32 shift = 1;
while(true) {
auto byte = read();
value += (byte & 0x7f) * shift;
if(byte & 0x80) break;
shift <<= 7;
value += shift;
}
return value;
}
template<> template<typename U> inline auto array_view<u8>::readvi(U& value, u32 size) -> U {
value = readvn<U>();
bool negate = value & 1;
value >>= 1;
if(negate) value = ~value;
return value;
}
}