mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 10:56:58 +02:00
66cc2fe26d
Co-authored-by: TarkusR <90155059+TarkusR@users.noreply.github.com>
104 lines
4.6 KiB
C++
104 lines
4.6 KiB
C++
#ifndef EMULATOR_SRC_GRAPHICS_HOST_GPU_RENDERER_DEPTHRENDERTARGET_H_
|
|
#define EMULATOR_SRC_GRAPHICS_HOST_GPU_RENDERER_DEPTHRENDERTARGET_H_
|
|
|
|
#include "common/assert.h"
|
|
#include "graphics/host_gpu/renderer/cache/textureCache.h"
|
|
#include "graphics/host_gpu/renderer/image/imageView.h"
|
|
#include "graphics/host_gpu/renderer/renderTarget.h"
|
|
#include "graphics/host_gpu/vulkanCommon.h"
|
|
|
|
#include <cstdint>
|
|
|
|
namespace Libs::Graphics {
|
|
|
|
// Without a stencil plane, Hi-Stencil fields are inactive. An active plane is compatible when
|
|
// Hi-Stencil is disabled or HTile backing is present.
|
|
inline constexpr bool depth_htile_stencil_acceleration_compatible(bool has_stencil, bool has_htile,
|
|
bool htile_stencil_disabled) {
|
|
return !has_stencil || htile_stencil_disabled || has_htile;
|
|
}
|
|
|
|
struct RenderDepthInfo {
|
|
// Discovery keeps guest image information but can remap the view into a larger cache image.
|
|
TextureCache::ImageDesc desc;
|
|
bool depth_clear_enable = false;
|
|
bool depth_load_clear_enable = false;
|
|
float depth_clear_value = 0.0f;
|
|
bool depth_test_enable = false;
|
|
// Effective draw writes; discovery applies test, target-write and clear controls.
|
|
bool depth_write_enable = false;
|
|
vk::CompareOp depth_compare_op = vk::CompareOp::eNever;
|
|
bool depth_bounds_test_enable = false;
|
|
float depth_min_bounds = 0.0f;
|
|
float depth_max_bounds = 0.0f;
|
|
bool stencil_clear_enable = false;
|
|
uint8_t stencil_clear_value = 0;
|
|
bool stencil_test_enable = false;
|
|
vk::StencilOpState stencil_front;
|
|
vk::StencilOpState stencil_back;
|
|
ImageId image_id;
|
|
|
|
[[nodiscard]] vk::ImageAspectFlags AttachmentWriteAspects() const;
|
|
};
|
|
|
|
inline vk::ImageAspectFlags DepthFeedbackAspects(vk::ImageAspectFlags draw_writes,
|
|
const ImageViewInfo& target,
|
|
const ImageViewInfo& sampled) {
|
|
if (!ImageRangeOverlaps(target.base_level, target.level_count, sampled.base_level,
|
|
sampled.level_count) ||
|
|
!ImageRangeOverlaps(target.base_layer, target.layer_count, sampled.base_layer,
|
|
sampled.layer_count)) {
|
|
return {};
|
|
}
|
|
return draw_writes & sampled.aspect;
|
|
}
|
|
|
|
inline vk::ImageAspectFlags DepthReadableAspects(vk::ImageLayout layout) {
|
|
switch (layout) {
|
|
case vk::ImageLayout::eDepthReadOnlyOptimal:
|
|
case vk::ImageLayout::eDepthReadOnlyStencilAttachmentOptimal:
|
|
return vk::ImageAspectFlagBits::eDepth;
|
|
case vk::ImageLayout::eStencilReadOnlyOptimal:
|
|
case vk::ImageLayout::eDepthAttachmentStencilReadOnlyOptimal:
|
|
return vk::ImageAspectFlagBits::eStencil;
|
|
case vk::ImageLayout::eDepthStencilReadOnlyOptimal:
|
|
case vk::ImageLayout::eAttachmentFeedbackLoopOptimalEXT:
|
|
case vk::ImageLayout::eGeneral:
|
|
return vk::ImageAspectFlagBits::eDepth | vk::ImageAspectFlagBits::eStencil;
|
|
default:
|
|
return {};
|
|
}
|
|
}
|
|
|
|
inline vk::ImageLayout depth_attachment_layout(const RenderDepthInfo& depth) {
|
|
const auto available = ImageViewOps::DepthAspectMask(depth.desc.view_info.format);
|
|
const auto writes = depth.AttachmentWriteAspects();
|
|
const bool has_depth = static_cast<bool>(available & vk::ImageAspectFlagBits::eDepth);
|
|
const bool has_stencil = static_cast<bool>(available & vk::ImageAspectFlagBits::eStencil);
|
|
// The attachment layout must permit load clears as well as draw writes.
|
|
const bool depth_write = static_cast<bool>(writes & vk::ImageAspectFlagBits::eDepth);
|
|
const bool stencil_write = static_cast<bool>(writes & vk::ImageAspectFlagBits::eStencil);
|
|
if (!has_stencil) {
|
|
return depth_write ? vk::ImageLayout::eDepthAttachmentOptimal
|
|
: vk::ImageLayout::eDepthReadOnlyOptimal;
|
|
}
|
|
if (!has_depth) {
|
|
return stencil_write ? vk::ImageLayout::eStencilAttachmentOptimal
|
|
: vk::ImageLayout::eStencilReadOnlyOptimal;
|
|
}
|
|
if (depth_write && stencil_write) {
|
|
return vk::ImageLayout::eDepthStencilAttachmentOptimal;
|
|
}
|
|
if (depth_write) {
|
|
return vk::ImageLayout::eDepthAttachmentStencilReadOnlyOptimal;
|
|
}
|
|
if (stencil_write) {
|
|
return vk::ImageLayout::eDepthReadOnlyStencilAttachmentOptimal;
|
|
}
|
|
return vk::ImageLayout::eDepthStencilReadOnlyOptimal;
|
|
}
|
|
|
|
} // namespace Libs::Graphics
|
|
|
|
#endif // EMULATOR_SRC_GRAPHICS_HOST_GPU_RENDERER_DEPTHRENDERTARGET_H_
|