mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-26 16:52:46 +01:00
hle: nvflinger: Move PixelFormat to its own header.
This commit is contained in:
parent
5a8b9a9706
commit
d456b9d554
11 changed files with 50 additions and 33 deletions
|
@ -539,6 +539,7 @@ add_library(core STATIC
|
||||||
hle/service/nvflinger/buffer_queue.h
|
hle/service/nvflinger/buffer_queue.h
|
||||||
hle/service/nvflinger/nvflinger.cpp
|
hle/service/nvflinger/nvflinger.cpp
|
||||||
hle/service/nvflinger/nvflinger.h
|
hle/service/nvflinger/nvflinger.h
|
||||||
|
hle/service/nvflinger/pixel_format.h
|
||||||
hle/service/nvflinger/status.h
|
hle/service/nvflinger/status.h
|
||||||
hle/service/nvflinger/ui/fence.h
|
hle/service/nvflinger/ui/fence.h
|
||||||
hle/service/nvflinger/ui/graphic_buffer.h
|
hle/service/nvflinger/ui/graphic_buffer.h
|
||||||
|
|
|
@ -38,18 +38,16 @@ NvResult nvdisp_disp0::Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>&
|
||||||
void nvdisp_disp0::OnOpen(DeviceFD fd) {}
|
void nvdisp_disp0::OnOpen(DeviceFD fd) {}
|
||||||
void nvdisp_disp0::OnClose(DeviceFD fd) {}
|
void nvdisp_disp0::OnClose(DeviceFD fd) {}
|
||||||
|
|
||||||
void nvdisp_disp0::flip(u32 buffer_handle, u32 offset, u32 format, u32 width, u32 height,
|
void nvdisp_disp0::flip(u32 buffer_handle, u32 offset, android::PixelFormat format, u32 width,
|
||||||
u32 stride, NVFlinger::BufferQueue::BufferTransformFlags transform,
|
u32 height, u32 stride, android::BufferTransformFlags transform,
|
||||||
const Common::Rectangle<int>& crop_rect) {
|
const Common::Rectangle<int>& crop_rect) {
|
||||||
const VAddr addr = nvmap_dev->GetObjectAddress(buffer_handle);
|
const VAddr addr = nvmap_dev->GetObjectAddress(buffer_handle);
|
||||||
LOG_TRACE(Service,
|
LOG_TRACE(Service,
|
||||||
"Drawing from address {:X} offset {:08X} Width {} Height {} Stride {} Format {}",
|
"Drawing from address {:X} offset {:08X} Width {} Height {} Stride {} Format {}",
|
||||||
addr, offset, width, height, stride, format);
|
addr, offset, width, height, stride, format);
|
||||||
|
|
||||||
const auto pixel_format = static_cast<Tegra::FramebufferConfig::PixelFormat>(format);
|
const Tegra::FramebufferConfig framebuffer{addr, offset, width, height,
|
||||||
const auto transform_flags = static_cast<Tegra::FramebufferConfig::TransformFlags>(transform);
|
stride, format, transform, crop_rect};
|
||||||
const Tegra::FramebufferConfig framebuffer{addr, offset, width, height,
|
|
||||||
stride, pixel_format, transform_flags, crop_rect};
|
|
||||||
|
|
||||||
system.GetPerfStats().EndSystemFrame();
|
system.GetPerfStats().EndSystemFrame();
|
||||||
system.GPU().SwapBuffers(&framebuffer);
|
system.GPU().SwapBuffers(&framebuffer);
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include "common/math_util.h"
|
#include "common/math_util.h"
|
||||||
#include "core/hle/service/nvdrv/devices/nvdevice.h"
|
#include "core/hle/service/nvdrv/devices/nvdevice.h"
|
||||||
#include "core/hle/service/nvflinger/buffer_queue.h"
|
#include "core/hle/service/nvflinger/buffer_queue.h"
|
||||||
|
#include "core/hle/service/nvflinger/pixel_format.h"
|
||||||
|
|
||||||
namespace Service::Nvidia::Devices {
|
namespace Service::Nvidia::Devices {
|
||||||
|
|
||||||
|
@ -31,8 +32,8 @@ public:
|
||||||
void OnClose(DeviceFD fd) override;
|
void OnClose(DeviceFD fd) override;
|
||||||
|
|
||||||
/// Performs a screen flip, drawing the buffer pointed to by the handle.
|
/// Performs a screen flip, drawing the buffer pointed to by the handle.
|
||||||
void flip(u32 buffer_handle, u32 offset, u32 format, u32 width, u32 height, u32 stride,
|
void flip(u32 buffer_handle, u32 offset, android::PixelFormat format, u32 width, u32 height,
|
||||||
NVFlinger::BufferQueue::BufferTransformFlags transform,
|
u32 stride, android::BufferTransformFlags transform,
|
||||||
const Common::Rectangle<int>& crop_rect);
|
const Common::Rectangle<int>& crop_rect);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
21
src/core/hle/service/nvflinger/pixel_format.h
Normal file
21
src/core/hle/service/nvflinger/pixel_format.h
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Copyright 2021 yuzu Emulator Project
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "common/common_types.h"
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
|
||||||
|
enum class PixelFormat : u32 {
|
||||||
|
NoFormat = 0,
|
||||||
|
Rgba8888 = 1,
|
||||||
|
Rgbx8888 = 2,
|
||||||
|
Rgb888 = 3,
|
||||||
|
Rgb565 = 4,
|
||||||
|
Bgra8888 = 5,
|
||||||
|
Rgba5551 = 6,
|
||||||
|
Rgba4444 = 7,
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace android
|
|
@ -44,7 +44,7 @@ public:
|
||||||
return buffer_id;
|
return buffer_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr u32 ExternalFormat() const {
|
constexpr PixelFormat ExternalFormat() const {
|
||||||
return external_format;
|
return external_format;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ private:
|
||||||
INSERT_PADDING_WORDS(3);
|
INSERT_PADDING_WORDS(3);
|
||||||
u32 buffer_id{};
|
u32 buffer_id{};
|
||||||
INSERT_PADDING_WORDS(6);
|
INSERT_PADDING_WORDS(6);
|
||||||
u32 external_format{};
|
PixelFormat external_format{};
|
||||||
INSERT_PADDING_WORDS(10);
|
INSERT_PADDING_WORDS(10);
|
||||||
u32 handle{};
|
u32 handle{};
|
||||||
u32 offset{};
|
u32 offset{};
|
||||||
|
|
|
@ -6,18 +6,14 @@
|
||||||
|
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "common/math_util.h"
|
#include "common/math_util.h"
|
||||||
|
#include "core/hle/service/nvflinger/pixel_format.h"
|
||||||
|
|
||||||
namespace Tegra {
|
namespace Tegra {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Struct describing framebuffer configuration
|
* Struct describing framebuffer configuration
|
||||||
*/
|
*/
|
||||||
struct FramebufferConfig {
|
struct FramebufferConfig {
|
||||||
enum class PixelFormat : u32 {
|
|
||||||
A8B8G8R8_UNORM = 1,
|
|
||||||
RGB565_UNORM = 4,
|
|
||||||
B8G8R8A8_UNORM = 5,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class TransformFlags : u32 {
|
enum class TransformFlags : u32 {
|
||||||
/// No transform flags are set
|
/// No transform flags are set
|
||||||
Unset = 0x00,
|
Unset = 0x00,
|
||||||
|
@ -38,9 +34,9 @@ struct FramebufferConfig {
|
||||||
u32 width{};
|
u32 width{};
|
||||||
u32 height{};
|
u32 height{};
|
||||||
u32 stride{};
|
u32 stride{};
|
||||||
PixelFormat pixel_format{};
|
|
||||||
|
|
||||||
TransformFlags transform_flags{};
|
TransformFlags transform_flags{};
|
||||||
|
android::PixelFormat pixel_format{};
|
||||||
Common::Rectangle<int> crop_rect;
|
Common::Rectangle<int> crop_rect;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -323,12 +323,12 @@ void RendererOpenGL::ConfigureFramebufferTexture(TextureInfo& texture,
|
||||||
|
|
||||||
GLint internal_format;
|
GLint internal_format;
|
||||||
switch (framebuffer.pixel_format) {
|
switch (framebuffer.pixel_format) {
|
||||||
case Tegra::FramebufferConfig::PixelFormat::A8B8G8R8_UNORM:
|
case android::PixelFormat::Rgba8888:
|
||||||
internal_format = GL_RGBA8;
|
internal_format = GL_RGBA8;
|
||||||
texture.gl_format = GL_RGBA;
|
texture.gl_format = GL_RGBA;
|
||||||
texture.gl_type = GL_UNSIGNED_INT_8_8_8_8_REV;
|
texture.gl_type = GL_UNSIGNED_INT_8_8_8_8_REV;
|
||||||
break;
|
break;
|
||||||
case Tegra::FramebufferConfig::PixelFormat::RGB565_UNORM:
|
case android::PixelFormat::Rgb565:
|
||||||
internal_format = GL_RGB565;
|
internal_format = GL_RGB565;
|
||||||
texture.gl_format = GL_RGB;
|
texture.gl_format = GL_RGB;
|
||||||
texture.gl_type = GL_UNSIGNED_SHORT_5_6_5;
|
texture.gl_type = GL_UNSIGNED_SHORT_5_6_5;
|
||||||
|
@ -464,8 +464,8 @@ void RendererOpenGL::DrawScreen(const Layout::FramebufferLayout& layout) {
|
||||||
const auto& texcoords = screen_info.display_texcoords;
|
const auto& texcoords = screen_info.display_texcoords;
|
||||||
auto left = texcoords.left;
|
auto left = texcoords.left;
|
||||||
auto right = texcoords.right;
|
auto right = texcoords.right;
|
||||||
if (framebuffer_transform_flags != Tegra::FramebufferConfig::TransformFlags::Unset) {
|
if (framebuffer_transform_flags != android::BufferTransformFlags::Unset) {
|
||||||
if (framebuffer_transform_flags == Tegra::FramebufferConfig::TransformFlags::FlipV) {
|
if (framebuffer_transform_flags == android::BufferTransformFlags::FlipV) {
|
||||||
// Flip the framebuffer vertically
|
// Flip the framebuffer vertically
|
||||||
left = texcoords.right;
|
left = texcoords.right;
|
||||||
right = texcoords.left;
|
right = texcoords.left;
|
||||||
|
|
|
@ -46,7 +46,7 @@ struct TextureInfo {
|
||||||
GLsizei height;
|
GLsizei height;
|
||||||
GLenum gl_format;
|
GLenum gl_format;
|
||||||
GLenum gl_type;
|
GLenum gl_type;
|
||||||
Tegra::FramebufferConfig::PixelFormat pixel_format;
|
android::PixelFormat pixel_format;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Structure used for storing information about the display target for the Switch screen
|
/// Structure used for storing information about the display target for the Switch screen
|
||||||
|
@ -135,7 +135,7 @@ private:
|
||||||
std::vector<u8> gl_framebuffer_data;
|
std::vector<u8> gl_framebuffer_data;
|
||||||
|
|
||||||
/// Used for transforming the framebuffer orientation
|
/// Used for transforming the framebuffer orientation
|
||||||
Tegra::FramebufferConfig::TransformFlags framebuffer_transform_flags{};
|
android::BufferTransformFlags framebuffer_transform_flags{};
|
||||||
Common::Rectangle<int> framebuffer_crop_rect;
|
Common::Rectangle<int> framebuffer_crop_rect;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -94,11 +94,11 @@ std::size_t GetSizeInBytes(const Tegra::FramebufferConfig& framebuffer) {
|
||||||
|
|
||||||
VkFormat GetFormat(const Tegra::FramebufferConfig& framebuffer) {
|
VkFormat GetFormat(const Tegra::FramebufferConfig& framebuffer) {
|
||||||
switch (framebuffer.pixel_format) {
|
switch (framebuffer.pixel_format) {
|
||||||
case Tegra::FramebufferConfig::PixelFormat::A8B8G8R8_UNORM:
|
case android::PixelFormat::Rgba8888:
|
||||||
return VK_FORMAT_A8B8G8R8_UNORM_PACK32;
|
return VK_FORMAT_A8B8G8R8_UNORM_PACK32;
|
||||||
case Tegra::FramebufferConfig::PixelFormat::RGB565_UNORM:
|
case android::PixelFormat::Rgb565:
|
||||||
return VK_FORMAT_R5G6B5_UNORM_PACK16;
|
return VK_FORMAT_R5G6B5_UNORM_PACK16;
|
||||||
case Tegra::FramebufferConfig::PixelFormat::B8G8R8A8_UNORM:
|
case android::PixelFormat::Bgra8888:
|
||||||
return VK_FORMAT_B8G8R8A8_UNORM;
|
return VK_FORMAT_B8G8R8A8_UNORM;
|
||||||
default:
|
default:
|
||||||
UNIMPLEMENTED_MSG("Unknown framebuffer pixel format: {}",
|
UNIMPLEMENTED_MSG("Unknown framebuffer pixel format: {}",
|
||||||
|
@ -1390,9 +1390,9 @@ void VKBlitScreen::SetVertexData(BufferData& data, const Tegra::FramebufferConfi
|
||||||
auto right = texcoords.right;
|
auto right = texcoords.right;
|
||||||
|
|
||||||
switch (framebuffer_transform_flags) {
|
switch (framebuffer_transform_flags) {
|
||||||
case Tegra::FramebufferConfig::TransformFlags::Unset:
|
case android::BufferTransformFlags::Unset:
|
||||||
break;
|
break;
|
||||||
case Tegra::FramebufferConfig::TransformFlags::FlipV:
|
case android::BufferTransformFlags::FlipV:
|
||||||
// Flip the framebuffer vertically
|
// Flip the framebuffer vertically
|
||||||
left = texcoords.right;
|
left = texcoords.right;
|
||||||
right = texcoords.left;
|
right = texcoords.left;
|
||||||
|
|
|
@ -190,13 +190,13 @@ PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PixelFormat PixelFormatFromGPUPixelFormat(Tegra::FramebufferConfig::PixelFormat format) {
|
PixelFormat PixelFormatFromGPUPixelFormat(android::PixelFormat format) {
|
||||||
switch (format) {
|
switch (format) {
|
||||||
case Tegra::FramebufferConfig::PixelFormat::A8B8G8R8_UNORM:
|
case android::PixelFormat::Rgba8888:
|
||||||
return PixelFormat::A8B8G8R8_UNORM;
|
return PixelFormat::A8B8G8R8_UNORM;
|
||||||
case Tegra::FramebufferConfig::PixelFormat::RGB565_UNORM:
|
case android::PixelFormat::Rgb565:
|
||||||
return PixelFormat::R5G6B5_UNORM;
|
return PixelFormat::R5G6B5_UNORM;
|
||||||
case Tegra::FramebufferConfig::PixelFormat::B8G8R8A8_UNORM:
|
case android::PixelFormat::Bgra8888:
|
||||||
return PixelFormat::B8G8R8A8_UNORM;
|
return PixelFormat::B8G8R8A8_UNORM;
|
||||||
default:
|
default:
|
||||||
UNIMPLEMENTED_MSG("Unimplemented format={}", format);
|
UNIMPLEMENTED_MSG("Unimplemented format={}", format);
|
||||||
|
|
|
@ -460,7 +460,7 @@ PixelFormat PixelFormatFromDepthFormat(Tegra::DepthFormat format);
|
||||||
|
|
||||||
PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format);
|
PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format);
|
||||||
|
|
||||||
PixelFormat PixelFormatFromGPUPixelFormat(Tegra::FramebufferConfig::PixelFormat format);
|
PixelFormat PixelFormatFromGPUPixelFormat(android::PixelFormat format);
|
||||||
|
|
||||||
SurfaceType GetFormatType(PixelFormat pixel_format);
|
SurfaceType GetFormatType(PixelFormat pixel_format);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue