hle: nvflinger: Move PixelFormat to its own header.

This commit is contained in:
bunnei 2021-11-11 18:13:35 -08:00
parent 5a8b9a9706
commit d456b9d554
11 changed files with 50 additions and 33 deletions

View file

@ -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

View file

@ -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);

View file

@ -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:

View 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

View file

@ -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{};

View file

@ -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;
}; };

View file

@ -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;

View file

@ -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;
}; };

View file

@ -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;

View file

@ -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);

View file

@ -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);