renderer_opengl: Better handling of framebuffer transform flags.
This commit is contained in:
parent
c2c55e0811
commit
ec4e1a3685
|
@ -27,10 +27,8 @@ void nvdisp_disp0::flip(u32 buffer_handle, u32 offset, u32 format, u32 width, u3
|
||||||
offset, width, height, stride, format);
|
offset, width, height, stride, format);
|
||||||
|
|
||||||
using PixelFormat = Tegra::FramebufferConfig::PixelFormat;
|
using PixelFormat = Tegra::FramebufferConfig::PixelFormat;
|
||||||
using Flags = NVFlinger::BufferQueue::BufferTransformFlags;
|
|
||||||
const bool flip_vertical = static_cast<u32>(transform) & static_cast<u32>(Flags::FlipV);
|
|
||||||
const Tegra::FramebufferConfig framebuffer{
|
const Tegra::FramebufferConfig framebuffer{
|
||||||
addr, offset, width, height, stride, static_cast<PixelFormat>(format), flip_vertical};
|
addr, offset, width, height, stride, static_cast<PixelFormat>(format), transform};
|
||||||
|
|
||||||
Core::System::GetInstance().perf_stats.EndGameFrame();
|
Core::System::GetInstance().perf_stats.EndGameFrame();
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,8 @@ public:
|
||||||
~BufferQueue() = default;
|
~BufferQueue() = default;
|
||||||
|
|
||||||
enum class BufferTransformFlags : u32 {
|
enum class BufferTransformFlags : u32 {
|
||||||
|
/// No transform flags are set
|
||||||
|
Unset = 0x00,
|
||||||
/// Flip source image horizontally (around the vertical axis)
|
/// Flip source image horizontally (around the vertical axis)
|
||||||
FlipH = 0x01,
|
FlipH = 0x01,
|
||||||
/// Flip source image vertically (around the horizontal axis)
|
/// Flip source image vertically (around the horizontal axis)
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
|
#include "core/hle/service/nvflinger/buffer_queue.h"
|
||||||
#include "video_core/memory_manager.h"
|
#include "video_core/memory_manager.h"
|
||||||
|
|
||||||
namespace Tegra {
|
namespace Tegra {
|
||||||
|
@ -38,7 +39,9 @@ struct FramebufferConfig {
|
||||||
u32 height;
|
u32 height;
|
||||||
u32 stride;
|
u32 stride;
|
||||||
PixelFormat pixel_format;
|
PixelFormat pixel_format;
|
||||||
bool flip_vertical;
|
|
||||||
|
using TransformFlags = Service::NVFlinger::BufferQueue::BufferTransformFlags;
|
||||||
|
TransformFlags transform_flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace Engines {
|
namespace Engines {
|
||||||
|
|
|
@ -141,6 +141,9 @@ void RendererOpenGL::LoadFBToScreenInfo(const Tegra::FramebufferConfig& framebuf
|
||||||
const u32 size_in_bytes{framebuffer.stride * framebuffer.height * bpp};
|
const u32 size_in_bytes{framebuffer.stride * framebuffer.height * bpp};
|
||||||
const VAddr framebuffer_addr{framebuffer.address};
|
const VAddr framebuffer_addr{framebuffer.address};
|
||||||
|
|
||||||
|
// Framebuffer orientation handling
|
||||||
|
framebuffer_transform_flags = framebuffer.transform_flags;
|
||||||
|
|
||||||
// Ensure no bad interactions with GL_UNPACK_ALIGNMENT, which by default
|
// Ensure no bad interactions with GL_UNPACK_ALIGNMENT, which by default
|
||||||
// only allows rows to have a memory alignement of 4.
|
// only allows rows to have a memory alignement of 4.
|
||||||
ASSERT(framebuffer.stride % 4 == 0);
|
ASSERT(framebuffer.stride % 4 == 0);
|
||||||
|
@ -292,8 +295,19 @@ void RendererOpenGL::ConfigureFramebufferTexture(TextureInfo& texture,
|
||||||
void RendererOpenGL::DrawSingleScreen(const ScreenInfo& screen_info, float x, float y, float w,
|
void RendererOpenGL::DrawSingleScreen(const ScreenInfo& screen_info, float x, float y, float w,
|
||||||
float h) {
|
float h) {
|
||||||
const auto& texcoords = screen_info.display_texcoords;
|
const auto& texcoords = screen_info.display_texcoords;
|
||||||
const auto& left = framebuffer_flip_vertical ? texcoords.right : texcoords.left;
|
auto left = texcoords.left;
|
||||||
const auto& right = framebuffer_flip_vertical ? texcoords.left : texcoords.right;
|
auto right = texcoords.right;
|
||||||
|
if (framebuffer_transform_flags != Tegra::FramebufferConfig::TransformFlags::Unset)
|
||||||
|
if (framebuffer_transform_flags == Tegra::FramebufferConfig::TransformFlags::FlipV) {
|
||||||
|
// Flip the framebuffer vertically
|
||||||
|
left = texcoords.right;
|
||||||
|
right = texcoords.left;
|
||||||
|
} else {
|
||||||
|
// Other transformations are unsupported
|
||||||
|
LOG_CRITICAL(HW_GPU, "unsupported framebuffer_transform_flags=%d",
|
||||||
|
framebuffer_transform_flags);
|
||||||
|
UNIMPLEMENTED();
|
||||||
|
}
|
||||||
|
|
||||||
std::array<ScreenRectVertex, 4> vertices = {{
|
std::array<ScreenRectVertex, 4> vertices = {{
|
||||||
ScreenRectVertex(x, y, texcoords.top, right),
|
ScreenRectVertex(x, y, texcoords.top, right),
|
||||||
|
|
Reference in New Issue