hle: nvflinger: Add implementation for GraphicBuffer class.

This commit is contained in:
bunnei 2021-11-11 18:11:32 -08:00
parent 8c27465325
commit 5a8b9a9706
2 changed files with 101 additions and 0 deletions

View File

@ -541,6 +541,7 @@ add_library(core STATIC
hle/service/nvflinger/nvflinger.h hle/service/nvflinger/nvflinger.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/rect.h hle/service/nvflinger/ui/rect.h
hle/service/olsc/olsc.cpp hle/service/olsc/olsc.cpp
hle/service/olsc/olsc.h hle/service/olsc/olsc.h

View File

@ -0,0 +1,100 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright 2021 yuzu Emulator Project
// Copyright 2007 The Android Open Source Project
// Parts of this implementation were base on:
// https://cs.android.com/android/platform/superproject/+/android-5.1.1_r38:frameworks/native/include/ui/GraphicBuffer.h
#pragma once
#include "common/common_funcs.h"
#include "common/common_types.h"
#include "core/hle/service/nvflinger/pixel_format.h"
namespace android {
class GraphicBuffer final {
public:
constexpr GraphicBuffer() = default;
constexpr GraphicBuffer(u32 width_, u32 height_, PixelFormat format_, u32 usage_)
: width{static_cast<s32>(width_)}, height{static_cast<s32>(height_)}, format{format_},
usage{static_cast<s32>(usage_)} {}
constexpr u32 Width() const {
return static_cast<u32>(width);
}
constexpr u32 Height() const {
return static_cast<u32>(height);
}
constexpr u32 Stride() const {
return static_cast<u32>(stride);
}
constexpr u32 Usage() const {
return static_cast<u32>(usage);
}
constexpr PixelFormat Format() const {
return format;
}
constexpr u32 BufferId() const {
return buffer_id;
}
constexpr u32 ExternalFormat() const {
return external_format;
}
constexpr u32 Handle() const {
return handle;
}
constexpr u32 Offset() const {
return offset;
}
constexpr bool NeedsReallocation(u32 width_, u32 height_, PixelFormat format_,
u32 usage_) const {
if (static_cast<s32>(width_) != width) {
return true;
}
if (static_cast<s32>(height_) != height) {
return true;
}
if (format_ != format) {
return true;
}
if ((static_cast<u32>(usage) & usage_) != usage_) {
return true;
}
return false;
}
private:
u32 magic{};
s32 width{};
s32 height{};
s32 stride{};
PixelFormat format{};
s32 usage{};
INSERT_PADDING_WORDS(1);
u32 index{};
INSERT_PADDING_WORDS(3);
u32 buffer_id{};
INSERT_PADDING_WORDS(6);
u32 external_format{};
INSERT_PADDING_WORDS(10);
u32 handle{};
u32 offset{};
INSERT_PADDING_WORDS(60);
};
static_assert(sizeof(GraphicBuffer) == 0x16C, "GraphicBuffer has wrong size");
} // namespace android