summaryrefslogtreecommitdiffstats
path: root/src/video_core/texture_cache/surface_params.h
diff options
context:
space:
mode:
authorFernando Sahmkow <fsahmkow27@gmail.com>2019-05-13 02:33:52 +0200
committerReinUsesLisp <reinuseslisp@airmail.cc>2019-06-21 02:36:12 +0200
commit7731a0e2d15da04eea746b4b8dd5c6c4b29f9f29 (patch)
tree9769d59ddb0076234d26993ee8aca62e7da58554 /src/video_core/texture_cache/surface_params.h
parentsurface_params: Ensure pitch is always written to avoid surface leaks (diff)
downloadyuzu-7731a0e2d15da04eea746b4b8dd5c6c4b29f9f29.tar
yuzu-7731a0e2d15da04eea746b4b8dd5c6c4b29f9f29.tar.gz
yuzu-7731a0e2d15da04eea746b4b8dd5c6c4b29f9f29.tar.bz2
yuzu-7731a0e2d15da04eea746b4b8dd5c6c4b29f9f29.tar.lz
yuzu-7731a0e2d15da04eea746b4b8dd5c6c4b29f9f29.tar.xz
yuzu-7731a0e2d15da04eea746b4b8dd5c6c4b29f9f29.tar.zst
yuzu-7731a0e2d15da04eea746b4b8dd5c6c4b29f9f29.zip
Diffstat (limited to '')
-rw-r--r--src/video_core/texture_cache/surface_params.h27
1 files changed, 19 insertions, 8 deletions
diff --git a/src/video_core/texture_cache/surface_params.h b/src/video_core/texture_cache/surface_params.h
index 7c48782c7..b3082173f 100644
--- a/src/video_core/texture_cache/surface_params.h
+++ b/src/video_core/texture_cache/surface_params.h
@@ -7,6 +7,7 @@
#include <map>
#include "common/alignment.h"
+#include "common/bit_util.h"
#include "common/common_types.h"
#include "video_core/engines/fermi_2d.h"
#include "video_core/engines/maxwell_3d.h"
@@ -16,6 +17,8 @@
namespace VideoCommon {
+using VideoCore::Surface::SurfaceCompression;
+
class SurfaceParams {
public:
/// Creates SurfaceCachedParams from a texture configuration.
@@ -50,17 +53,12 @@ public:
std::size_t GetHostSizeInBytes() const {
std::size_t host_size_in_bytes;
- if (IsPixelFormatASTC(pixel_format)) {
+ if (GetCompressionType() == SurfaceCompression::Converted) {
constexpr std::size_t rgb8_bpp = 4ULL;
// ASTC is uncompressed in software, in emulated as RGBA8
host_size_in_bytes = 0;
for (u32 level = 0; level < num_levels; ++level) {
- const std::size_t width =
- Common::AlignUp(GetMipWidth(level), GetDefaultBlockWidth());
- const std::size_t height =
- Common::AlignUp(GetMipHeight(level), GetDefaultBlockHeight());
- const std::size_t depth = is_layered ? this->depth : GetMipDepth(level);
- host_size_in_bytes += width * height * depth * rgb8_bpp;
+ host_size_in_bytes += GetConvertedMipmapSize(level);
}
} else {
host_size_in_bytes = GetInnerMemorySize(true, false, false);
@@ -93,6 +91,12 @@ public:
/// Returns the block depth of a given mipmap level.
u32 GetMipBlockDepth(u32 level) const;
+ u32 GetRowAlignment(u32 level) const {
+ const u32 bpp =
+ GetCompressionType() == SurfaceCompression::Converted ? 4 : GetBytesPerPixel();
+ return 1U << Common::CountTrailingZeroes32(GetMipWidth(level) * bpp);
+ }
+
// Helper used for out of class size calculations
static std::size_t AlignLayered(const std::size_t out_size, const u32 block_height,
const u32 block_depth) {
@@ -106,12 +110,16 @@ public:
/// Returns the offset in bytes in host memory (linear) of a given mipmap level.
std::size_t GetHostMipmapLevelOffset(u32 level) const;
+ std::size_t GetConvertedMipmapOffset(u32 level) const;
+
/// Returns the size in bytes in guest memory of a given mipmap level.
std::size_t GetGuestMipmapSize(u32 level) const;
/// Returns the size in bytes in host memory (linear) of a given mipmap level.
std::size_t GetHostMipmapSize(u32 level) const;
+ std::size_t GetConvertedMipmapSize(u32 level) const;
+
/// Returns the size of a layer in bytes in guest memory.
std::size_t GetGuestLayerSize() const;
@@ -141,6 +149,10 @@ public:
/// Returns true if the pixel format is a depth and/or stencil format.
bool IsPixelFormatZeta() const;
+ SurfaceCompression GetCompressionType() const {
+ return VideoCore::Surface::GetFormatCompressionType(pixel_format);
+ }
+
std::string TargetName() const;
bool is_tiled;
@@ -154,7 +166,6 @@ public:
u32 height;
u32 depth;
u32 pitch;
- u32 unaligned_height;
u32 num_levels;
VideoCore::Surface::PixelFormat pixel_format;
VideoCore::Surface::ComponentType component_type;