mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-06-02 16:53:17 +00:00
texture_cache: detiler image view moved into image class
This commit is contained in:
parent
b59e525408
commit
f9e5c70414
8 changed files with 20 additions and 24 deletions
|
@ -7,6 +7,7 @@
|
|||
#include "video_core/renderer_vulkan/vk_instance.h"
|
||||
#include "video_core/renderer_vulkan/vk_scheduler.h"
|
||||
#include "video_core/texture_cache/image.h"
|
||||
#include "video_core/texture_cache/tile_manager.h"
|
||||
|
||||
#include <vk_mem_alloc.h>
|
||||
|
||||
|
@ -181,6 +182,14 @@ Image::Image(const Vulkan::Instance& instance_, Vulkan::Scheduler& scheduler_,
|
|||
|
||||
image.Create(image_ci);
|
||||
|
||||
// Create a special view for detiler
|
||||
if (info.is_tiled) {
|
||||
ImageViewInfo view_info;
|
||||
view_info.format = DemoteImageFormatForDetiling(info.pixel_format);
|
||||
view_info.used_for_detiling = true;
|
||||
view_for_detiler.emplace(*instance, view_info, image);
|
||||
}
|
||||
|
||||
Transit(vk::ImageLayout::eGeneral, vk::AccessFlagBits::eNone);
|
||||
}
|
||||
|
||||
|
|
|
@ -12,6 +12,8 @@
|
|||
#include "video_core/texture_cache/image_view.h"
|
||||
#include "video_core/texture_cache/types.h"
|
||||
|
||||
#include <optional>
|
||||
|
||||
namespace Vulkan {
|
||||
class Instance;
|
||||
class Scheduler;
|
||||
|
@ -117,6 +119,7 @@ struct Image {
|
|||
VAddr cpu_addr_end = 0;
|
||||
std::vector<ImageViewInfo> image_view_infos;
|
||||
std::vector<ImageViewId> image_view_ids;
|
||||
std::optional<ImageView> view_for_detiler;
|
||||
|
||||
// Resource state tracking
|
||||
vk::Flags<vk::PipelineStageFlagBits> pl_stage = vk::PipelineStageFlagBits::eAllCommands;
|
||||
|
|
|
@ -66,7 +66,7 @@ TextureCache::TextureCache(const Vulkan::Instance& instance_, Vulkan::Scheduler&
|
|||
: instance{instance_}, scheduler{scheduler_},
|
||||
staging{instance, scheduler, vk::BufferUsageFlagBits::eTransferSrc, StreamBufferSize,
|
||||
Vulkan::BufferType::Upload},
|
||||
tile_manager{instance, scheduler, *this} {
|
||||
tile_manager{instance, scheduler} {
|
||||
|
||||
#ifndef _WIN64
|
||||
sigset_t signal_mask;
|
||||
|
@ -167,14 +167,6 @@ ImageView& TextureCache::FindImageView(const AmdGpu::Image& desc) {
|
|||
return RegisterImageView(image, view_info);
|
||||
}
|
||||
|
||||
ImageView& TextureCache::GetImageViewForDetiler(Image& image) {
|
||||
ImageViewInfo view_info;
|
||||
view_info.format = DemoteImageFormatForDetiling(image.info.pixel_format);
|
||||
view_info.used_for_detiling = true;
|
||||
|
||||
return RegisterImageView(image, view_info);
|
||||
}
|
||||
|
||||
ImageView& TextureCache::RenderTarget(const AmdGpu::Liverpool::ColorBuffer& buffer,
|
||||
const AmdGpu::Liverpool::CbDbExtent& hint) {
|
||||
const ImageInfo info{buffer, hint};
|
||||
|
|
|
@ -42,9 +42,6 @@ public:
|
|||
/// Retrieves an image view with the properties of the specified image descriptor.
|
||||
[[nodiscard]] ImageView& FindImageView(const AmdGpu::Image& image);
|
||||
|
||||
/// Retrieves an image view with "demoted" pixel format used in detiling
|
||||
[[nodiscard]] ImageView& GetImageViewForDetiler(Image& image);
|
||||
|
||||
/// Retrieves the render target with specified properties
|
||||
[[nodiscard]] ImageView& RenderTarget(const AmdGpu::Liverpool::ColorBuffer& buffer,
|
||||
const AmdGpu::Liverpool::CbDbExtent& hint);
|
||||
|
|
|
@ -206,10 +206,8 @@ static constexpr vk::BufferUsageFlags StagingFlags = vk::BufferUsageFlagBits::eT
|
|||
vk::BufferUsageFlagBits::eUniformBuffer |
|
||||
vk::BufferUsageFlagBits::eStorageBuffer;
|
||||
|
||||
TileManager::TileManager(const Vulkan::Instance& instance, Vulkan::Scheduler& scheduler,
|
||||
TextureCache& texture_cache)
|
||||
: instance{instance}, scheduler{scheduler}, texture_cache{texture_cache},
|
||||
staging{instance, scheduler, StagingFlags, 64_MB} {
|
||||
TileManager::TileManager(const Vulkan::Instance& instance, Vulkan::Scheduler& scheduler)
|
||||
: instance{instance}, scheduler{scheduler}, staging{instance, scheduler, StagingFlags, 64_MB} {
|
||||
|
||||
static const std::array detiler_shaders{
|
||||
HostShaders::DETILE_M8X1_COMP,
|
||||
|
@ -322,9 +320,9 @@ bool TileManager::TryDetile(Image& image) {
|
|||
.range = image.info.guest_size_bytes,
|
||||
};
|
||||
|
||||
const auto& demoted_view = texture_cache.GetImageViewForDetiler(image);
|
||||
ASSERT(image.view_for_detiler.has_value());
|
||||
const vk::DescriptorImageInfo output_image_info{
|
||||
.imageView = *demoted_view.image_view,
|
||||
.imageView = *image.view_for_detiler->image_view,
|
||||
.imageLayout = image.layout,
|
||||
};
|
||||
|
||||
|
|
|
@ -31,8 +31,7 @@ struct DetilerContext {
|
|||
|
||||
class TileManager {
|
||||
public:
|
||||
TileManager(const Vulkan::Instance& instance, Vulkan::Scheduler& scheduler,
|
||||
TextureCache& texture_cache);
|
||||
TileManager(const Vulkan::Instance& instance, Vulkan::Scheduler& scheduler);
|
||||
~TileManager();
|
||||
|
||||
bool TryDetile(Image& image);
|
||||
|
@ -43,7 +42,6 @@ private:
|
|||
private:
|
||||
const Vulkan::Instance& instance;
|
||||
Vulkan::Scheduler& scheduler;
|
||||
TextureCache& texture_cache;
|
||||
Vulkan::StreamBuffer staging;
|
||||
std::array<DetilerContext, DetilerType::Max> detilers;
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue