common/math_util: Move contents into the Common namespace
These types are within the common library, so they should be within the Common namespace.
This commit is contained in:
parent
643472e24a
commit
e1a4912ade
11 changed files with 85 additions and 83 deletions
|
@ -7,7 +7,7 @@
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
namespace MathUtil {
|
namespace Common {
|
||||||
|
|
||||||
constexpr float PI = 3.14159265f;
|
constexpr float PI = 3.14159265f;
|
||||||
|
|
||||||
|
@ -41,4 +41,4 @@ struct Rectangle {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace MathUtil
|
} // namespace Common
|
||||||
|
|
|
@ -22,11 +22,11 @@ u16 FramebufferLayout::GetScalingRatio() const {
|
||||||
|
|
||||||
// Finds the largest size subrectangle contained in window area that is confined to the aspect ratio
|
// Finds the largest size subrectangle contained in window area that is confined to the aspect ratio
|
||||||
template <class T>
|
template <class T>
|
||||||
static MathUtil::Rectangle<T> maxRectangle(MathUtil::Rectangle<T> window_area,
|
static Common::Rectangle<T> maxRectangle(Common::Rectangle<T> window_area,
|
||||||
float screen_aspect_ratio) {
|
float screen_aspect_ratio) {
|
||||||
float scale = std::min(static_cast<float>(window_area.GetWidth()),
|
float scale = std::min(static_cast<float>(window_area.GetWidth()),
|
||||||
window_area.GetHeight() / screen_aspect_ratio);
|
window_area.GetHeight() / screen_aspect_ratio);
|
||||||
return MathUtil::Rectangle<T>{0, 0, static_cast<T>(std::round(scale)),
|
return Common::Rectangle<T>{0, 0, static_cast<T>(std::round(scale)),
|
||||||
static_cast<T>(std::round(scale * screen_aspect_ratio))};
|
static_cast<T>(std::round(scale * screen_aspect_ratio))};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,10 +36,10 @@ FramebufferLayout DefaultFrameLayout(unsigned width, unsigned height, bool swapp
|
||||||
|
|
||||||
FramebufferLayout res{width, height, true, true, {}, {}};
|
FramebufferLayout res{width, height, true, true, {}, {}};
|
||||||
// Default layout gives equal screen sizes to the top and bottom screen
|
// Default layout gives equal screen sizes to the top and bottom screen
|
||||||
MathUtil::Rectangle<unsigned> screen_window_area{0, 0, width, height / 2};
|
Common::Rectangle<unsigned> screen_window_area{0, 0, width, height / 2};
|
||||||
MathUtil::Rectangle<unsigned> top_screen =
|
Common::Rectangle<unsigned> top_screen =
|
||||||
maxRectangle(screen_window_area, TOP_SCREEN_ASPECT_RATIO);
|
maxRectangle(screen_window_area, TOP_SCREEN_ASPECT_RATIO);
|
||||||
MathUtil::Rectangle<unsigned> bot_screen =
|
Common::Rectangle<unsigned> bot_screen =
|
||||||
maxRectangle(screen_window_area, BOT_SCREEN_ASPECT_RATIO);
|
maxRectangle(screen_window_area, BOT_SCREEN_ASPECT_RATIO);
|
||||||
|
|
||||||
float window_aspect_ratio = static_cast<float>(height) / width;
|
float window_aspect_ratio = static_cast<float>(height) / width;
|
||||||
|
@ -77,10 +77,10 @@ FramebufferLayout SingleFrameLayout(unsigned width, unsigned height, bool swappe
|
||||||
// so just calculate them both even if the other isn't showing.
|
// so just calculate them both even if the other isn't showing.
|
||||||
FramebufferLayout res{width, height, !swapped, swapped, {}, {}};
|
FramebufferLayout res{width, height, !swapped, swapped, {}, {}};
|
||||||
|
|
||||||
MathUtil::Rectangle<unsigned> screen_window_area{0, 0, width, height};
|
Common::Rectangle<unsigned> screen_window_area{0, 0, width, height};
|
||||||
MathUtil::Rectangle<unsigned> top_screen =
|
Common::Rectangle<unsigned> top_screen =
|
||||||
maxRectangle(screen_window_area, TOP_SCREEN_ASPECT_RATIO);
|
maxRectangle(screen_window_area, TOP_SCREEN_ASPECT_RATIO);
|
||||||
MathUtil::Rectangle<unsigned> bot_screen =
|
Common::Rectangle<unsigned> bot_screen =
|
||||||
maxRectangle(screen_window_area, BOT_SCREEN_ASPECT_RATIO);
|
maxRectangle(screen_window_area, BOT_SCREEN_ASPECT_RATIO);
|
||||||
|
|
||||||
float window_aspect_ratio = static_cast<float>(height) / width;
|
float window_aspect_ratio = static_cast<float>(height) / width;
|
||||||
|
@ -116,13 +116,12 @@ FramebufferLayout LargeFrameLayout(unsigned width, unsigned height, bool swapped
|
||||||
float large_screen_aspect_ratio = swapped ? BOT_SCREEN_ASPECT_RATIO : TOP_SCREEN_ASPECT_RATIO;
|
float large_screen_aspect_ratio = swapped ? BOT_SCREEN_ASPECT_RATIO : TOP_SCREEN_ASPECT_RATIO;
|
||||||
float small_screen_aspect_ratio = swapped ? TOP_SCREEN_ASPECT_RATIO : BOT_SCREEN_ASPECT_RATIO;
|
float small_screen_aspect_ratio = swapped ? TOP_SCREEN_ASPECT_RATIO : BOT_SCREEN_ASPECT_RATIO;
|
||||||
|
|
||||||
MathUtil::Rectangle<unsigned> screen_window_area{0, 0, width, height};
|
Common::Rectangle<unsigned> screen_window_area{0, 0, width, height};
|
||||||
MathUtil::Rectangle<unsigned> total_rect =
|
Common::Rectangle<unsigned> total_rect =
|
||||||
maxRectangle(screen_window_area, emulation_aspect_ratio);
|
maxRectangle(screen_window_area, emulation_aspect_ratio);
|
||||||
MathUtil::Rectangle<unsigned> large_screen =
|
Common::Rectangle<unsigned> large_screen = maxRectangle(total_rect, large_screen_aspect_ratio);
|
||||||
maxRectangle(total_rect, large_screen_aspect_ratio);
|
Common::Rectangle<unsigned> fourth_size_rect = total_rect.Scale(.25f);
|
||||||
MathUtil::Rectangle<unsigned> fourth_size_rect = total_rect.Scale(.25f);
|
Common::Rectangle<unsigned> small_screen =
|
||||||
MathUtil::Rectangle<unsigned> small_screen =
|
|
||||||
maxRectangle(fourth_size_rect, small_screen_aspect_ratio);
|
maxRectangle(fourth_size_rect, small_screen_aspect_ratio);
|
||||||
|
|
||||||
if (window_aspect_ratio < emulation_aspect_ratio) {
|
if (window_aspect_ratio < emulation_aspect_ratio) {
|
||||||
|
@ -149,13 +148,13 @@ FramebufferLayout SideFrameLayout(unsigned width, unsigned height, bool swapped)
|
||||||
const float emulation_aspect_ratio = static_cast<float>(Core::kScreenTopHeight) /
|
const float emulation_aspect_ratio = static_cast<float>(Core::kScreenTopHeight) /
|
||||||
(Core::kScreenTopWidth + Core::kScreenBottomWidth);
|
(Core::kScreenTopWidth + Core::kScreenBottomWidth);
|
||||||
float window_aspect_ratio = static_cast<float>(height) / width;
|
float window_aspect_ratio = static_cast<float>(height) / width;
|
||||||
MathUtil::Rectangle<unsigned> screen_window_area{0, 0, width, height};
|
Common::Rectangle<unsigned> screen_window_area{0, 0, width, height};
|
||||||
// Find largest Rectangle that can fit in the window size with the given aspect ratio
|
// Find largest Rectangle that can fit in the window size with the given aspect ratio
|
||||||
MathUtil::Rectangle<unsigned> screen_rect =
|
Common::Rectangle<unsigned> screen_rect =
|
||||||
maxRectangle(screen_window_area, emulation_aspect_ratio);
|
maxRectangle(screen_window_area, emulation_aspect_ratio);
|
||||||
// Find sizes of top and bottom screen
|
// Find sizes of top and bottom screen
|
||||||
MathUtil::Rectangle<unsigned> top_screen = maxRectangle(screen_rect, TOP_SCREEN_ASPECT_RATIO);
|
Common::Rectangle<unsigned> top_screen = maxRectangle(screen_rect, TOP_SCREEN_ASPECT_RATIO);
|
||||||
MathUtil::Rectangle<unsigned> bot_screen = maxRectangle(screen_rect, BOT_SCREEN_ASPECT_RATIO);
|
Common::Rectangle<unsigned> bot_screen = maxRectangle(screen_rect, BOT_SCREEN_ASPECT_RATIO);
|
||||||
|
|
||||||
if (window_aspect_ratio < emulation_aspect_ratio) {
|
if (window_aspect_ratio < emulation_aspect_ratio) {
|
||||||
// Apply borders to the left and right sides of the window.
|
// Apply borders to the left and right sides of the window.
|
||||||
|
@ -180,10 +179,10 @@ FramebufferLayout CustomFrameLayout(unsigned width, unsigned height) {
|
||||||
|
|
||||||
FramebufferLayout res{width, height, true, true, {}, {}};
|
FramebufferLayout res{width, height, true, true, {}, {}};
|
||||||
|
|
||||||
MathUtil::Rectangle<unsigned> top_screen{
|
Common::Rectangle<unsigned> top_screen{
|
||||||
Settings::values.custom_top_left, Settings::values.custom_top_top,
|
Settings::values.custom_top_left, Settings::values.custom_top_top,
|
||||||
Settings::values.custom_top_right, Settings::values.custom_top_bottom};
|
Settings::values.custom_top_right, Settings::values.custom_top_bottom};
|
||||||
MathUtil::Rectangle<unsigned> bot_screen{
|
Common::Rectangle<unsigned> bot_screen{
|
||||||
Settings::values.custom_bottom_left, Settings::values.custom_bottom_top,
|
Settings::values.custom_bottom_left, Settings::values.custom_bottom_top,
|
||||||
Settings::values.custom_bottom_right, Settings::values.custom_bottom_bottom};
|
Settings::values.custom_bottom_right, Settings::values.custom_bottom_bottom};
|
||||||
|
|
||||||
|
|
|
@ -14,8 +14,8 @@ struct FramebufferLayout {
|
||||||
unsigned height;
|
unsigned height;
|
||||||
bool top_screen_enabled;
|
bool top_screen_enabled;
|
||||||
bool bottom_screen_enabled;
|
bool bottom_screen_enabled;
|
||||||
MathUtil::Rectangle<unsigned> top_screen;
|
Common::Rectangle<unsigned> top_screen;
|
||||||
MathUtil::Rectangle<unsigned> bottom_screen;
|
Common::Rectangle<unsigned> bottom_screen;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the ration of pixel size of the top screen, compared to the native size of the 3DS
|
* Returns the ration of pixel size of the top screen, compared to the native size of the 3DS
|
||||||
|
|
|
@ -46,7 +46,7 @@ public:
|
||||||
} else {
|
} else {
|
||||||
tilt_direction = mouse_move.Cast<float>();
|
tilt_direction = mouse_move.Cast<float>();
|
||||||
tilt_angle = std::clamp(tilt_direction.Normalize() * sensitivity, 0.0f,
|
tilt_angle = std::clamp(tilt_direction.Normalize() * sensitivity, 0.0f,
|
||||||
MathUtil::PI * this->tilt_clamp / 180.0f);
|
Common::PI * this->tilt_clamp / 180.0f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -109,7 +109,7 @@ private:
|
||||||
|
|
||||||
// Find the angular rate vector in world space
|
// Find the angular rate vector in world space
|
||||||
auto angular_rate = ((q - old_q) * inv_q).xyz * 2;
|
auto angular_rate = ((q - old_q) * inv_q).xyz * 2;
|
||||||
angular_rate *= 1000 / update_millisecond / MathUtil::PI * 180;
|
angular_rate *= 1000 / update_millisecond / Common::PI * 180;
|
||||||
|
|
||||||
// Transform the two vectors from world space to 3DS space
|
// Transform the two vectors from world space to 3DS space
|
||||||
gravity = QuaternionRotate(inv_q, gravity);
|
gravity = QuaternionRotate(inv_q, gravity);
|
||||||
|
|
|
@ -217,7 +217,8 @@ void TestCommunication(const std::string& host, u16 port, u8 pad_index, u32 clie
|
||||||
success_callback();
|
success_callback();
|
||||||
else
|
else
|
||||||
failure_callback();
|
failure_callback();
|
||||||
}).detach();
|
})
|
||||||
|
.detach();
|
||||||
}
|
}
|
||||||
|
|
||||||
CalibrationConfigurationJob::CalibrationConfigurationJob(
|
CalibrationConfigurationJob::CalibrationConfigurationJob(
|
||||||
|
@ -268,7 +269,8 @@ CalibrationConfigurationJob::CalibrationConfigurationJob(
|
||||||
complete_event.Wait();
|
complete_event.Wait();
|
||||||
socket.Stop();
|
socket.Stop();
|
||||||
worker_thread.join();
|
worker_thread.join();
|
||||||
}).detach();
|
})
|
||||||
|
.detach();
|
||||||
}
|
}
|
||||||
|
|
||||||
CalibrationConfigurationJob::~CalibrationConfigurationJob() {
|
CalibrationConfigurationJob::~CalibrationConfigurationJob() {
|
||||||
|
|
|
@ -522,7 +522,7 @@ bool RasterizerOpenGL::Draw(bool accelerate, bool is_indexed) {
|
||||||
(write_depth_fb || regs.framebuffer.output_merger.depth_test_enable != 0 ||
|
(write_depth_fb || regs.framebuffer.output_merger.depth_test_enable != 0 ||
|
||||||
(has_stencil && state.stencil.test_enabled));
|
(has_stencil && state.stencil.test_enabled));
|
||||||
|
|
||||||
MathUtil::Rectangle<s32> viewport_rect_unscaled{
|
Common::Rectangle<s32> viewport_rect_unscaled{
|
||||||
// These registers hold half-width and half-height, so must be multiplied by 2
|
// These registers hold half-width and half-height, so must be multiplied by 2
|
||||||
regs.rasterizer.viewport_corner.x, // left
|
regs.rasterizer.viewport_corner.x, // left
|
||||||
regs.rasterizer.viewport_corner.y + // top
|
regs.rasterizer.viewport_corner.y + // top
|
||||||
|
@ -536,7 +536,7 @@ bool RasterizerOpenGL::Draw(bool accelerate, bool is_indexed) {
|
||||||
|
|
||||||
Surface color_surface;
|
Surface color_surface;
|
||||||
Surface depth_surface;
|
Surface depth_surface;
|
||||||
MathUtil::Rectangle<u32> surfaces_rect;
|
Common::Rectangle<u32> surfaces_rect;
|
||||||
std::tie(color_surface, depth_surface, surfaces_rect) =
|
std::tie(color_surface, depth_surface, surfaces_rect) =
|
||||||
res_cache.GetFramebufferSurfaces(using_color_fb, using_depth_fb, viewport_rect_unscaled);
|
res_cache.GetFramebufferSurfaces(using_color_fb, using_depth_fb, viewport_rect_unscaled);
|
||||||
|
|
||||||
|
@ -544,7 +544,7 @@ bool RasterizerOpenGL::Draw(bool accelerate, bool is_indexed) {
|
||||||
? color_surface->res_scale
|
? color_surface->res_scale
|
||||||
: (depth_surface == nullptr ? 1u : depth_surface->res_scale);
|
: (depth_surface == nullptr ? 1u : depth_surface->res_scale);
|
||||||
|
|
||||||
MathUtil::Rectangle<u32> draw_rect{
|
Common::Rectangle<u32> draw_rect{
|
||||||
static_cast<u32>(std::clamp<s32>(static_cast<s32>(surfaces_rect.left) +
|
static_cast<u32>(std::clamp<s32>(static_cast<s32>(surfaces_rect.left) +
|
||||||
viewport_rect_unscaled.left * res_scale,
|
viewport_rect_unscaled.left * res_scale,
|
||||||
surfaces_rect.left, surfaces_rect.right)), // Left
|
surfaces_rect.left, surfaces_rect.right)), // Left
|
||||||
|
@ -841,8 +841,8 @@ bool RasterizerOpenGL::Draw(bool accelerate, bool is_indexed) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mark framebuffer surfaces as dirty
|
// Mark framebuffer surfaces as dirty
|
||||||
MathUtil::Rectangle<u32> draw_rect_unscaled{
|
Common::Rectangle<u32> draw_rect_unscaled{draw_rect.left / res_scale, draw_rect.top / res_scale,
|
||||||
draw_rect.left / res_scale, draw_rect.top / res_scale, draw_rect.right / res_scale,
|
draw_rect.right / res_scale,
|
||||||
draw_rect.bottom / res_scale};
|
draw_rect.bottom / res_scale};
|
||||||
|
|
||||||
if (color_surface != nullptr && write_color_fb) {
|
if (color_surface != nullptr && write_color_fb) {
|
||||||
|
@ -1392,7 +1392,7 @@ bool RasterizerOpenGL::AccelerateDisplayTransfer(const GPU::Regs::DisplayTransfe
|
||||||
dst_params.pixel_format = SurfaceParams::PixelFormatFromGPUPixelFormat(config.output_format);
|
dst_params.pixel_format = SurfaceParams::PixelFormatFromGPUPixelFormat(config.output_format);
|
||||||
dst_params.UpdateParams();
|
dst_params.UpdateParams();
|
||||||
|
|
||||||
MathUtil::Rectangle<u32> src_rect;
|
Common::Rectangle<u32> src_rect;
|
||||||
Surface src_surface;
|
Surface src_surface;
|
||||||
std::tie(src_surface, src_rect) =
|
std::tie(src_surface, src_rect) =
|
||||||
res_cache.GetSurfaceSubRect(src_params, ScaleMatch::Ignore, true);
|
res_cache.GetSurfaceSubRect(src_params, ScaleMatch::Ignore, true);
|
||||||
|
@ -1401,7 +1401,7 @@ bool RasterizerOpenGL::AccelerateDisplayTransfer(const GPU::Regs::DisplayTransfe
|
||||||
|
|
||||||
dst_params.res_scale = src_surface->res_scale;
|
dst_params.res_scale = src_surface->res_scale;
|
||||||
|
|
||||||
MathUtil::Rectangle<u32> dst_rect;
|
Common::Rectangle<u32> dst_rect;
|
||||||
Surface dst_surface;
|
Surface dst_surface;
|
||||||
std::tie(dst_surface, dst_rect) =
|
std::tie(dst_surface, dst_rect) =
|
||||||
res_cache.GetSurfaceSubRect(dst_params, ScaleMatch::Upscale, false);
|
res_cache.GetSurfaceSubRect(dst_params, ScaleMatch::Upscale, false);
|
||||||
|
@ -1461,7 +1461,7 @@ bool RasterizerOpenGL::AccelerateTextureCopy(const GPU::Regs::DisplayTransferCon
|
||||||
src_params.size = ((src_params.height - 1) * src_params.stride) + src_params.width;
|
src_params.size = ((src_params.height - 1) * src_params.stride) + src_params.width;
|
||||||
src_params.end = src_params.addr + src_params.size;
|
src_params.end = src_params.addr + src_params.size;
|
||||||
|
|
||||||
MathUtil::Rectangle<u32> src_rect;
|
Common::Rectangle<u32> src_rect;
|
||||||
Surface src_surface;
|
Surface src_surface;
|
||||||
std::tie(src_surface, src_rect) = res_cache.GetTexCopySurface(src_params);
|
std::tie(src_surface, src_rect) = res_cache.GetTexCopySurface(src_params);
|
||||||
if (src_surface == nullptr) {
|
if (src_surface == nullptr) {
|
||||||
|
@ -1486,7 +1486,7 @@ bool RasterizerOpenGL::AccelerateTextureCopy(const GPU::Regs::DisplayTransferCon
|
||||||
|
|
||||||
// Since we are going to invalidate the gap if there is one, we will have to load it first
|
// Since we are going to invalidate the gap if there is one, we will have to load it first
|
||||||
const bool load_gap = output_gap != 0;
|
const bool load_gap = output_gap != 0;
|
||||||
MathUtil::Rectangle<u32> dst_rect;
|
Common::Rectangle<u32> dst_rect;
|
||||||
Surface dst_surface;
|
Surface dst_surface;
|
||||||
std::tie(dst_surface, dst_rect) =
|
std::tie(dst_surface, dst_rect) =
|
||||||
res_cache.GetSurfaceSubRect(dst_params, ScaleMatch::Upscale, load_gap);
|
res_cache.GetSurfaceSubRect(dst_params, ScaleMatch::Upscale, load_gap);
|
||||||
|
@ -1532,7 +1532,7 @@ bool RasterizerOpenGL::AccelerateDisplay(const GPU::Regs::FramebufferConfig& con
|
||||||
src_params.pixel_format = SurfaceParams::PixelFormatFromGPUPixelFormat(config.color_format);
|
src_params.pixel_format = SurfaceParams::PixelFormatFromGPUPixelFormat(config.color_format);
|
||||||
src_params.UpdateParams();
|
src_params.UpdateParams();
|
||||||
|
|
||||||
MathUtil::Rectangle<u32> src_rect;
|
Common::Rectangle<u32> src_rect;
|
||||||
Surface src_surface;
|
Surface src_surface;
|
||||||
std::tie(src_surface, src_rect) =
|
std::tie(src_surface, src_rect) =
|
||||||
res_cache.GetSurfaceSubRect(src_params, ScaleMatch::Ignore, true);
|
res_cache.GetSurfaceSubRect(src_params, ScaleMatch::Ignore, true);
|
||||||
|
@ -1544,7 +1544,7 @@ bool RasterizerOpenGL::AccelerateDisplay(const GPU::Regs::FramebufferConfig& con
|
||||||
u32 scaled_width = src_surface->GetScaledWidth();
|
u32 scaled_width = src_surface->GetScaledWidth();
|
||||||
u32 scaled_height = src_surface->GetScaledHeight();
|
u32 scaled_height = src_surface->GetScaledHeight();
|
||||||
|
|
||||||
screen_info.display_texcoords = MathUtil::Rectangle<float>(
|
screen_info.display_texcoords = Common::Rectangle<float>(
|
||||||
(float)src_rect.bottom / (float)scaled_height, (float)src_rect.left / (float)scaled_width,
|
(float)src_rect.bottom / (float)scaled_height, (float)src_rect.left / (float)scaled_width,
|
||||||
(float)src_rect.top / (float)scaled_height, (float)src_rect.right / (float)scaled_width);
|
(float)src_rect.top / (float)scaled_height, (float)src_rect.right / (float)scaled_width);
|
||||||
|
|
||||||
|
|
|
@ -347,8 +347,8 @@ static void AllocateTextureCube(GLuint texture, const FormatTuple& format_tuple,
|
||||||
cur_state.Apply();
|
cur_state.Apply();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool BlitTextures(GLuint src_tex, const MathUtil::Rectangle<u32>& src_rect, GLuint dst_tex,
|
static bool BlitTextures(GLuint src_tex, const Common::Rectangle<u32>& src_rect, GLuint dst_tex,
|
||||||
const MathUtil::Rectangle<u32>& dst_rect, SurfaceType type,
|
const Common::Rectangle<u32>& dst_rect, SurfaceType type,
|
||||||
GLuint read_fb_handle, GLuint draw_fb_handle) {
|
GLuint read_fb_handle, GLuint draw_fb_handle) {
|
||||||
OpenGLState prev_state = OpenGLState::GetCurState();
|
OpenGLState prev_state = OpenGLState::GetCurState();
|
||||||
SCOPE_EXIT({ prev_state.Apply(); });
|
SCOPE_EXIT({ prev_state.Apply(); });
|
||||||
|
@ -407,7 +407,7 @@ static bool BlitTextures(GLuint src_tex, const MathUtil::Rectangle<u32>& src_rec
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool FillSurface(const Surface& surface, const u8* fill_data,
|
static bool FillSurface(const Surface& surface, const u8* fill_data,
|
||||||
const MathUtil::Rectangle<u32>& fill_rect, GLuint draw_fb_handle) {
|
const Common::Rectangle<u32>& fill_rect, GLuint draw_fb_handle) {
|
||||||
OpenGLState prev_state = OpenGLState::GetCurState();
|
OpenGLState prev_state = OpenGLState::GetCurState();
|
||||||
SCOPE_EXIT({ prev_state.Apply(); });
|
SCOPE_EXIT({ prev_state.Apply(); });
|
||||||
|
|
||||||
|
@ -511,7 +511,7 @@ SurfaceParams SurfaceParams::FromInterval(SurfaceInterval interval) const {
|
||||||
return params;
|
return params;
|
||||||
}
|
}
|
||||||
|
|
||||||
SurfaceInterval SurfaceParams::GetSubRectInterval(MathUtil::Rectangle<u32> unscaled_rect) const {
|
SurfaceInterval SurfaceParams::GetSubRectInterval(Common::Rectangle<u32> unscaled_rect) const {
|
||||||
if (unscaled_rect.GetHeight() == 0 || unscaled_rect.GetWidth() == 0) {
|
if (unscaled_rect.GetHeight() == 0 || unscaled_rect.GetWidth() == 0) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -534,24 +534,24 @@ SurfaceInterval SurfaceParams::GetSubRectInterval(MathUtil::Rectangle<u32> unsca
|
||||||
return {addr + BytesInPixels(pixel_offset), addr + BytesInPixels(pixel_offset + pixels)};
|
return {addr + BytesInPixels(pixel_offset), addr + BytesInPixels(pixel_offset + pixels)};
|
||||||
}
|
}
|
||||||
|
|
||||||
MathUtil::Rectangle<u32> SurfaceParams::GetSubRect(const SurfaceParams& sub_surface) const {
|
Common::Rectangle<u32> SurfaceParams::GetSubRect(const SurfaceParams& sub_surface) const {
|
||||||
const u32 begin_pixel_index = PixelsInBytes(sub_surface.addr - addr);
|
const u32 begin_pixel_index = PixelsInBytes(sub_surface.addr - addr);
|
||||||
|
|
||||||
if (is_tiled) {
|
if (is_tiled) {
|
||||||
const int x0 = (begin_pixel_index % (stride * 8)) / 8;
|
const int x0 = (begin_pixel_index % (stride * 8)) / 8;
|
||||||
const int y0 = (begin_pixel_index / (stride * 8)) * 8;
|
const int y0 = (begin_pixel_index / (stride * 8)) * 8;
|
||||||
// Top to bottom
|
// Top to bottom
|
||||||
return MathUtil::Rectangle<u32>(x0, height - y0, x0 + sub_surface.width,
|
return Common::Rectangle<u32>(x0, height - y0, x0 + sub_surface.width,
|
||||||
height - (y0 + sub_surface.height));
|
height - (y0 + sub_surface.height));
|
||||||
}
|
}
|
||||||
|
|
||||||
const int x0 = begin_pixel_index % stride;
|
const int x0 = begin_pixel_index % stride;
|
||||||
const int y0 = begin_pixel_index / stride;
|
const int y0 = begin_pixel_index / stride;
|
||||||
// Bottom to top
|
// Bottom to top
|
||||||
return MathUtil::Rectangle<u32>(x0, y0 + sub_surface.height, x0 + sub_surface.width, y0);
|
return Common::Rectangle<u32>(x0, y0 + sub_surface.height, x0 + sub_surface.width, y0);
|
||||||
}
|
}
|
||||||
|
|
||||||
MathUtil::Rectangle<u32> SurfaceParams::GetScaledSubRect(const SurfaceParams& sub_surface) const {
|
Common::Rectangle<u32> SurfaceParams::GetScaledSubRect(const SurfaceParams& sub_surface) const {
|
||||||
auto rect = GetSubRect(sub_surface);
|
auto rect = GetSubRect(sub_surface);
|
||||||
rect.left = rect.left * res_scale;
|
rect.left = rect.left * res_scale;
|
||||||
rect.right = rect.right * res_scale;
|
rect.right = rect.right * res_scale;
|
||||||
|
@ -819,7 +819,7 @@ void CachedSurface::FlushGLBuffer(PAddr flush_start, PAddr flush_end) {
|
||||||
}
|
}
|
||||||
|
|
||||||
MICROPROFILE_DEFINE(OpenGL_TextureUL, "OpenGL", "Texture Upload", MP_RGB(128, 192, 64));
|
MICROPROFILE_DEFINE(OpenGL_TextureUL, "OpenGL", "Texture Upload", MP_RGB(128, 192, 64));
|
||||||
void CachedSurface::UploadGLTexture(const MathUtil::Rectangle<u32>& rect, GLuint read_fb_handle,
|
void CachedSurface::UploadGLTexture(const Common::Rectangle<u32>& rect, GLuint read_fb_handle,
|
||||||
GLuint draw_fb_handle) {
|
GLuint draw_fb_handle) {
|
||||||
if (type == SurfaceType::Fill)
|
if (type == SurfaceType::Fill)
|
||||||
return;
|
return;
|
||||||
|
@ -883,7 +883,7 @@ void CachedSurface::UploadGLTexture(const MathUtil::Rectangle<u32>& rect, GLuint
|
||||||
}
|
}
|
||||||
|
|
||||||
MICROPROFILE_DEFINE(OpenGL_TextureDL, "OpenGL", "Texture Download", MP_RGB(128, 192, 64));
|
MICROPROFILE_DEFINE(OpenGL_TextureDL, "OpenGL", "Texture Download", MP_RGB(128, 192, 64));
|
||||||
void CachedSurface::DownloadGLTexture(const MathUtil::Rectangle<u32>& rect, GLuint read_fb_handle,
|
void CachedSurface::DownloadGLTexture(const Common::Rectangle<u32>& rect, GLuint read_fb_handle,
|
||||||
GLuint draw_fb_handle) {
|
GLuint draw_fb_handle) {
|
||||||
if (type == SurfaceType::Fill)
|
if (type == SurfaceType::Fill)
|
||||||
return;
|
return;
|
||||||
|
@ -918,7 +918,7 @@ void CachedSurface::DownloadGLTexture(const MathUtil::Rectangle<u32>& rect, GLui
|
||||||
OGLTexture unscaled_tex;
|
OGLTexture unscaled_tex;
|
||||||
unscaled_tex.Create();
|
unscaled_tex.Create();
|
||||||
|
|
||||||
MathUtil::Rectangle<u32> unscaled_tex_rect{0, rect.GetHeight(), rect.GetWidth(), 0};
|
Common::Rectangle<u32> unscaled_tex_rect{0, rect.GetHeight(), rect.GetWidth(), 0};
|
||||||
AllocateSurfaceTexture(unscaled_tex.handle, tuple, rect.GetWidth(), rect.GetHeight());
|
AllocateSurfaceTexture(unscaled_tex.handle, tuple, rect.GetWidth(), rect.GetHeight());
|
||||||
BlitTextures(texture.handle, scaled_rect, unscaled_tex.handle, unscaled_tex_rect, type,
|
BlitTextures(texture.handle, scaled_rect, unscaled_tex.handle, unscaled_tex_rect, type,
|
||||||
read_fb_handle, draw_fb_handle);
|
read_fb_handle, draw_fb_handle);
|
||||||
|
@ -1122,9 +1122,9 @@ RasterizerCacheOpenGL::~RasterizerCacheOpenGL() {
|
||||||
|
|
||||||
MICROPROFILE_DEFINE(OpenGL_BlitSurface, "OpenGL", "BlitSurface", MP_RGB(128, 192, 64));
|
MICROPROFILE_DEFINE(OpenGL_BlitSurface, "OpenGL", "BlitSurface", MP_RGB(128, 192, 64));
|
||||||
bool RasterizerCacheOpenGL::BlitSurfaces(const Surface& src_surface,
|
bool RasterizerCacheOpenGL::BlitSurfaces(const Surface& src_surface,
|
||||||
const MathUtil::Rectangle<u32>& src_rect,
|
const Common::Rectangle<u32>& src_rect,
|
||||||
const Surface& dst_surface,
|
const Surface& dst_surface,
|
||||||
const MathUtil::Rectangle<u32>& dst_rect) {
|
const Common::Rectangle<u32>& dst_rect) {
|
||||||
MICROPROFILE_SCOPE(OpenGL_BlitSurface);
|
MICROPROFILE_SCOPE(OpenGL_BlitSurface);
|
||||||
|
|
||||||
if (!SurfaceParams::CheckFormatsBlittable(src_surface->pixel_format, dst_surface->pixel_format))
|
if (!SurfaceParams::CheckFormatsBlittable(src_surface->pixel_format, dst_surface->pixel_format))
|
||||||
|
@ -1138,9 +1138,9 @@ bool RasterizerCacheOpenGL::BlitSurfaces(const Surface& src_surface,
|
||||||
}
|
}
|
||||||
|
|
||||||
void RasterizerCacheOpenGL::ConvertD24S8toABGR(GLuint src_tex,
|
void RasterizerCacheOpenGL::ConvertD24S8toABGR(GLuint src_tex,
|
||||||
const MathUtil::Rectangle<u32>& src_rect,
|
const Common::Rectangle<u32>& src_rect,
|
||||||
GLuint dst_tex,
|
GLuint dst_tex,
|
||||||
const MathUtil::Rectangle<u32>& dst_rect) {
|
const Common::Rectangle<u32>& dst_rect) {
|
||||||
OpenGLState prev_state = OpenGLState::GetCurState();
|
OpenGLState prev_state = OpenGLState::GetCurState();
|
||||||
SCOPE_EXIT({ prev_state.Apply(); });
|
SCOPE_EXIT({ prev_state.Apply(); });
|
||||||
|
|
||||||
|
@ -1247,7 +1247,7 @@ SurfaceRect_Tuple RasterizerCacheOpenGL::GetSurfaceSubRect(const SurfaceParams&
|
||||||
ScaleMatch match_res_scale,
|
ScaleMatch match_res_scale,
|
||||||
bool load_if_create) {
|
bool load_if_create) {
|
||||||
if (params.addr == 0 || params.height * params.width == 0) {
|
if (params.addr == 0 || params.height * params.width == 0) {
|
||||||
return std::make_tuple(nullptr, MathUtil::Rectangle<u32>{});
|
return std::make_tuple(nullptr, Common::Rectangle<u32>{});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Attempt to find encompassing surface
|
// Attempt to find encompassing surface
|
||||||
|
@ -1340,7 +1340,7 @@ Surface RasterizerCacheOpenGL::GetTextureSurface(const Pica::Texture::TextureInf
|
||||||
|
|
||||||
if (info.width % 8 != 0 || info.height % 8 != 0) {
|
if (info.width % 8 != 0 || info.height % 8 != 0) {
|
||||||
Surface src_surface;
|
Surface src_surface;
|
||||||
MathUtil::Rectangle<u32> rect;
|
Common::Rectangle<u32> rect;
|
||||||
std::tie(src_surface, rect) = GetSurfaceSubRect(params, ScaleMatch::Ignore, true);
|
std::tie(src_surface, rect) = GetSurfaceSubRect(params, ScaleMatch::Ignore, true);
|
||||||
|
|
||||||
params.res_scale = src_surface->res_scale;
|
params.res_scale = src_surface->res_scale;
|
||||||
|
@ -1447,7 +1447,7 @@ const CachedTextureCube& RasterizerCacheOpenGL::GetTextureCube(const TextureCube
|
||||||
}
|
}
|
||||||
|
|
||||||
SurfaceSurfaceRect_Tuple RasterizerCacheOpenGL::GetFramebufferSurfaces(
|
SurfaceSurfaceRect_Tuple RasterizerCacheOpenGL::GetFramebufferSurfaces(
|
||||||
bool using_color_fb, bool using_depth_fb, const MathUtil::Rectangle<s32>& viewport_rect) {
|
bool using_color_fb, bool using_depth_fb, const Common::Rectangle<s32>& viewport_rect) {
|
||||||
const auto& regs = Pica::g_state.regs;
|
const auto& regs = Pica::g_state.regs;
|
||||||
const auto& config = regs.framebuffer.framebuffer;
|
const auto& config = regs.framebuffer.framebuffer;
|
||||||
|
|
||||||
|
@ -1461,7 +1461,7 @@ SurfaceSurfaceRect_Tuple RasterizerCacheOpenGL::GetFramebufferSurfaces(
|
||||||
texture_cube_cache.clear();
|
texture_cube_cache.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
MathUtil::Rectangle<u32> viewport_clamped{
|
Common::Rectangle<u32> viewport_clamped{
|
||||||
static_cast<u32>(std::clamp(viewport_rect.left, 0, static_cast<s32>(config.GetWidth()))),
|
static_cast<u32>(std::clamp(viewport_rect.left, 0, static_cast<s32>(config.GetWidth()))),
|
||||||
static_cast<u32>(std::clamp(viewport_rect.top, 0, static_cast<s32>(config.GetHeight()))),
|
static_cast<u32>(std::clamp(viewport_rect.top, 0, static_cast<s32>(config.GetHeight()))),
|
||||||
static_cast<u32>(std::clamp(viewport_rect.right, 0, static_cast<s32>(config.GetWidth()))),
|
static_cast<u32>(std::clamp(viewport_rect.right, 0, static_cast<s32>(config.GetWidth()))),
|
||||||
|
@ -1495,19 +1495,19 @@ SurfaceSurfaceRect_Tuple RasterizerCacheOpenGL::GetFramebufferSurfaces(
|
||||||
using_depth_fb = false;
|
using_depth_fb = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
MathUtil::Rectangle<u32> color_rect{};
|
Common::Rectangle<u32> color_rect{};
|
||||||
Surface color_surface = nullptr;
|
Surface color_surface = nullptr;
|
||||||
if (using_color_fb)
|
if (using_color_fb)
|
||||||
std::tie(color_surface, color_rect) =
|
std::tie(color_surface, color_rect) =
|
||||||
GetSurfaceSubRect(color_params, ScaleMatch::Exact, false);
|
GetSurfaceSubRect(color_params, ScaleMatch::Exact, false);
|
||||||
|
|
||||||
MathUtil::Rectangle<u32> depth_rect{};
|
Common::Rectangle<u32> depth_rect{};
|
||||||
Surface depth_surface = nullptr;
|
Surface depth_surface = nullptr;
|
||||||
if (using_depth_fb)
|
if (using_depth_fb)
|
||||||
std::tie(depth_surface, depth_rect) =
|
std::tie(depth_surface, depth_rect) =
|
||||||
GetSurfaceSubRect(depth_params, ScaleMatch::Exact, false);
|
GetSurfaceSubRect(depth_params, ScaleMatch::Exact, false);
|
||||||
|
|
||||||
MathUtil::Rectangle<u32> fb_rect{};
|
Common::Rectangle<u32> fb_rect{};
|
||||||
if (color_surface != nullptr && depth_surface != nullptr) {
|
if (color_surface != nullptr && depth_surface != nullptr) {
|
||||||
fb_rect = color_rect;
|
fb_rect = color_rect;
|
||||||
// Color and Depth surfaces must have the same dimensions and offsets
|
// Color and Depth surfaces must have the same dimensions and offsets
|
||||||
|
@ -1560,7 +1560,7 @@ Surface RasterizerCacheOpenGL::GetFillSurface(const GPU::Regs::MemoryFillConfig&
|
||||||
}
|
}
|
||||||
|
|
||||||
SurfaceRect_Tuple RasterizerCacheOpenGL::GetTexCopySurface(const SurfaceParams& params) {
|
SurfaceRect_Tuple RasterizerCacheOpenGL::GetTexCopySurface(const SurfaceParams& params) {
|
||||||
MathUtil::Rectangle<u32> rect{};
|
Common::Rectangle<u32> rect{};
|
||||||
|
|
||||||
Surface match_surface = FindMatch<MatchFlags::TexCopy | MatchFlags::Invalid>(
|
Surface match_surface = FindMatch<MatchFlags::TexCopy | MatchFlags::Invalid>(
|
||||||
surface_cache, params, ScaleMatch::Ignore);
|
surface_cache, params, ScaleMatch::Ignore);
|
||||||
|
|
|
@ -88,8 +88,8 @@ static_assert(std::is_same<SurfaceRegions::interval_type, SurfaceCache::interval
|
||||||
std::is_same<SurfaceMap::interval_type, SurfaceCache::interval_type>(),
|
std::is_same<SurfaceMap::interval_type, SurfaceCache::interval_type>(),
|
||||||
"incorrect interval types");
|
"incorrect interval types");
|
||||||
|
|
||||||
using SurfaceRect_Tuple = std::tuple<Surface, MathUtil::Rectangle<u32>>;
|
using SurfaceRect_Tuple = std::tuple<Surface, Common::Rectangle<u32>>;
|
||||||
using SurfaceSurfaceRect_Tuple = std::tuple<Surface, Surface, MathUtil::Rectangle<u32>>;
|
using SurfaceSurfaceRect_Tuple = std::tuple<Surface, Surface, Common::Rectangle<u32>>;
|
||||||
|
|
||||||
using PageMap = boost::icl::interval_map<u32, int>;
|
using PageMap = boost::icl::interval_map<u32, int>;
|
||||||
|
|
||||||
|
@ -250,7 +250,7 @@ struct SurfaceParams {
|
||||||
// Returns the outer rectangle containing "interval"
|
// Returns the outer rectangle containing "interval"
|
||||||
SurfaceParams FromInterval(SurfaceInterval interval) const;
|
SurfaceParams FromInterval(SurfaceInterval interval) const;
|
||||||
|
|
||||||
SurfaceInterval GetSubRectInterval(MathUtil::Rectangle<u32> unscaled_rect) const;
|
SurfaceInterval GetSubRectInterval(Common::Rectangle<u32> unscaled_rect) const;
|
||||||
|
|
||||||
// Returns the region of the biggest valid rectange within interval
|
// Returns the region of the biggest valid rectange within interval
|
||||||
SurfaceInterval GetCopyableInterval(const Surface& src_surface) const;
|
SurfaceInterval GetCopyableInterval(const Surface& src_surface) const;
|
||||||
|
@ -263,11 +263,11 @@ struct SurfaceParams {
|
||||||
return height * res_scale;
|
return height * res_scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
MathUtil::Rectangle<u32> GetRect() const {
|
Common::Rectangle<u32> GetRect() const {
|
||||||
return {0, height, width, 0};
|
return {0, height, width, 0};
|
||||||
}
|
}
|
||||||
|
|
||||||
MathUtil::Rectangle<u32> GetScaledRect() const {
|
Common::Rectangle<u32> GetScaledRect() const {
|
||||||
return {0, GetScaledHeight(), GetScaledWidth(), 0};
|
return {0, GetScaledHeight(), GetScaledWidth(), 0};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,8 +284,8 @@ struct SurfaceParams {
|
||||||
bool CanExpand(const SurfaceParams& expanded_surface) const;
|
bool CanExpand(const SurfaceParams& expanded_surface) const;
|
||||||
bool CanTexCopy(const SurfaceParams& texcopy_params) const;
|
bool CanTexCopy(const SurfaceParams& texcopy_params) const;
|
||||||
|
|
||||||
MathUtil::Rectangle<u32> GetSubRect(const SurfaceParams& sub_surface) const;
|
Common::Rectangle<u32> GetSubRect(const SurfaceParams& sub_surface) const;
|
||||||
MathUtil::Rectangle<u32> GetScaledSubRect(const SurfaceParams& sub_surface) const;
|
Common::Rectangle<u32> GetScaledSubRect(const SurfaceParams& sub_surface) const;
|
||||||
|
|
||||||
PAddr addr = 0;
|
PAddr addr = 0;
|
||||||
PAddr end = 0;
|
PAddr end = 0;
|
||||||
|
@ -373,9 +373,9 @@ struct CachedSurface : SurfaceParams, std::enable_shared_from_this<CachedSurface
|
||||||
void FlushGLBuffer(PAddr flush_start, PAddr flush_end);
|
void FlushGLBuffer(PAddr flush_start, PAddr flush_end);
|
||||||
|
|
||||||
// Upload/Download data in gl_buffer in/to this surface's texture
|
// Upload/Download data in gl_buffer in/to this surface's texture
|
||||||
void UploadGLTexture(const MathUtil::Rectangle<u32>& rect, GLuint read_fb_handle,
|
void UploadGLTexture(const Common::Rectangle<u32>& rect, GLuint read_fb_handle,
|
||||||
GLuint draw_fb_handle);
|
GLuint draw_fb_handle);
|
||||||
void DownloadGLTexture(const MathUtil::Rectangle<u32>& rect, GLuint read_fb_handle,
|
void DownloadGLTexture(const Common::Rectangle<u32>& rect, GLuint read_fb_handle,
|
||||||
GLuint draw_fb_handle);
|
GLuint draw_fb_handle);
|
||||||
|
|
||||||
std::shared_ptr<SurfaceWatcher> CreateWatcher() {
|
std::shared_ptr<SurfaceWatcher> CreateWatcher() {
|
||||||
|
@ -413,11 +413,11 @@ public:
|
||||||
~RasterizerCacheOpenGL();
|
~RasterizerCacheOpenGL();
|
||||||
|
|
||||||
/// Blit one surface's texture to another
|
/// Blit one surface's texture to another
|
||||||
bool BlitSurfaces(const Surface& src_surface, const MathUtil::Rectangle<u32>& src_rect,
|
bool BlitSurfaces(const Surface& src_surface, const Common::Rectangle<u32>& src_rect,
|
||||||
const Surface& dst_surface, const MathUtil::Rectangle<u32>& dst_rect);
|
const Surface& dst_surface, const Common::Rectangle<u32>& dst_rect);
|
||||||
|
|
||||||
void ConvertD24S8toABGR(GLuint src_tex, const MathUtil::Rectangle<u32>& src_rect,
|
void ConvertD24S8toABGR(GLuint src_tex, const Common::Rectangle<u32>& src_rect, GLuint dst_tex,
|
||||||
GLuint dst_tex, const MathUtil::Rectangle<u32>& dst_rect);
|
const Common::Rectangle<u32>& dst_rect);
|
||||||
|
|
||||||
/// Copy one surface's region to another
|
/// Copy one surface's region to another
|
||||||
void CopySurface(const Surface& src_surface, const Surface& dst_surface,
|
void CopySurface(const Surface& src_surface, const Surface& dst_surface,
|
||||||
|
@ -441,7 +441,7 @@ public:
|
||||||
|
|
||||||
/// Get the color and depth surfaces based on the framebuffer configuration
|
/// Get the color and depth surfaces based on the framebuffer configuration
|
||||||
SurfaceSurfaceRect_Tuple GetFramebufferSurfaces(bool using_color_fb, bool using_depth_fb,
|
SurfaceSurfaceRect_Tuple GetFramebufferSurfaces(bool using_color_fb, bool using_depth_fb,
|
||||||
const MathUtil::Rectangle<s32>& viewport_rect);
|
const Common::Rectangle<s32>& viewport_rect);
|
||||||
|
|
||||||
/// Get a surface that matches the fill config
|
/// Get a surface that matches the fill config
|
||||||
Surface GetFillSurface(const GPU::Regs::MemoryFillConfig& config);
|
Surface GetFillSurface(const GPU::Regs::MemoryFillConfig& config);
|
||||||
|
|
|
@ -221,7 +221,7 @@ void RendererOpenGL::LoadFBToScreenInfo(const GPU::Regs::FramebufferConfig& fram
|
||||||
static_cast<u32>(pixel_stride), screen_info)) {
|
static_cast<u32>(pixel_stride), screen_info)) {
|
||||||
// Reset the screen info's display texture to its own permanent texture
|
// Reset the screen info's display texture to its own permanent texture
|
||||||
screen_info.display_texture = screen_info.texture.resource.handle;
|
screen_info.display_texture = screen_info.texture.resource.handle;
|
||||||
screen_info.display_texcoords = MathUtil::Rectangle<float>(0.f, 0.f, 1.f, 1.f);
|
screen_info.display_texcoords = Common::Rectangle<float>(0.f, 0.f, 1.f, 1.f);
|
||||||
|
|
||||||
Memory::RasterizerFlushRegion(framebuffer_addr, framebuffer.stride * framebuffer.height);
|
Memory::RasterizerFlushRegion(framebuffer_addr, framebuffer.stride * framebuffer.height);
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ struct TextureInfo {
|
||||||
/// Structure used for storing information about the display target for each 3DS screen
|
/// Structure used for storing information about the display target for each 3DS screen
|
||||||
struct ScreenInfo {
|
struct ScreenInfo {
|
||||||
GLuint display_texture;
|
GLuint display_texture;
|
||||||
MathUtil::Rectangle<float> display_texcoords;
|
Common::Rectangle<float> display_texcoords;
|
||||||
TextureInfo texture;
|
TextureInfo texture;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -152,7 +152,8 @@ inline void SetField<DebugDataRecord::COND_CMP_IN>(DebugDataRecord& record, bool
|
||||||
}
|
}
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
inline void SetField<DebugDataRecord::LOOP_INT_IN>(DebugDataRecord& record, Common::Vec4<u8> value) {
|
inline void SetField<DebugDataRecord::LOOP_INT_IN>(DebugDataRecord& record,
|
||||||
|
Common::Vec4<u8> value) {
|
||||||
record.loop_int = value;
|
record.loop_int = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue