mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-03 06:38:46 +00:00
Promote r32f textures to depth target if shader expects so
This commit is contained in:
parent
72fd77d979
commit
40c9b2addb
4 changed files with 14 additions and 4 deletions
|
@ -449,6 +449,7 @@ void GraphicsPipeline::BindResources(const Liverpool::Regs& regs,
|
||||||
if (tsharp) {
|
if (tsharp) {
|
||||||
tsharps.emplace_back(tsharp);
|
tsharps.emplace_back(tsharp);
|
||||||
VideoCore::ImageInfo image_info{tsharp};
|
VideoCore::ImageInfo image_info{tsharp};
|
||||||
|
VideoCore::ImageInfo image_info{tsharp, image_desc.is_depth};
|
||||||
VideoCore::ImageViewInfo view_info{tsharp, image_desc.is_storage};
|
VideoCore::ImageViewInfo view_info{tsharp, image_desc.is_storage};
|
||||||
const auto& image_view = texture_cache.FindTexture(image_info, view_info);
|
const auto& image_view = texture_cache.FindTexture(image_info, view_info);
|
||||||
const auto& image = texture_cache.GetImage(image_view.image_id);
|
const auto& image = texture_cache.GetImage(image_view.image_id);
|
||||||
|
|
|
@ -200,9 +200,19 @@ ImageInfo::ImageInfo(const AmdGpu::Liverpool::DepthBuffer& buffer, u32 num_slice
|
||||||
mips_layout.emplace_back(depth_slice_sz, pitch, 0);
|
mips_layout.emplace_back(depth_slice_sz, pitch, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
ImageInfo::ImageInfo(const AmdGpu::Image& image) noexcept {
|
ImageInfo::ImageInfo(const AmdGpu::Image& image, bool force_depth /*= false*/) noexcept {
|
||||||
tiling_mode = image.GetTilingMode();
|
tiling_mode = image.GetTilingMode();
|
||||||
pixel_format = LiverpoolToVK::SurfaceFormat(image.GetDataFmt(), image.GetNumberFmt());
|
pixel_format = LiverpoolToVK::SurfaceFormat(image.GetDataFmt(), image.GetNumberFmt());
|
||||||
|
// Override format if image is forced to be a depth target
|
||||||
|
if (force_depth) {
|
||||||
|
if (pixel_format == vk::Format::eR32Sfloat) {
|
||||||
|
pixel_format = vk::Format::eD32SfloatS8Uint;
|
||||||
|
} else if (pixel_format == vk::Format::eR16Sfloat) {
|
||||||
|
pixel_format = vk::Format::eD16UnormS8Uint;
|
||||||
|
} else {
|
||||||
|
UNREACHABLE();
|
||||||
|
}
|
||||||
|
}
|
||||||
type = ConvertImageType(image.GetType());
|
type = ConvertImageType(image.GetType());
|
||||||
props.is_tiled = image.IsTiled();
|
props.is_tiled = image.IsTiled();
|
||||||
props.is_cube = image.GetType() == AmdGpu::ImageType::Cube;
|
props.is_cube = image.GetType() == AmdGpu::ImageType::Cube;
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "common/enum.h"
|
|
||||||
#include "common/types.h"
|
#include "common/types.h"
|
||||||
#include "core/libraries/videoout/buffer.h"
|
#include "core/libraries/videoout/buffer.h"
|
||||||
#include "video_core/amdgpu/liverpool.h"
|
#include "video_core/amdgpu/liverpool.h"
|
||||||
|
@ -20,7 +19,7 @@ struct ImageInfo {
|
||||||
const AmdGpu::Liverpool::CbDbExtent& hint = {}) noexcept;
|
const AmdGpu::Liverpool::CbDbExtent& hint = {}) noexcept;
|
||||||
ImageInfo(const AmdGpu::Liverpool::DepthBuffer& buffer, u32 num_slices, VAddr htile_address,
|
ImageInfo(const AmdGpu::Liverpool::DepthBuffer& buffer, u32 num_slices, VAddr htile_address,
|
||||||
const AmdGpu::Liverpool::CbDbExtent& hint = {}) noexcept;
|
const AmdGpu::Liverpool::CbDbExtent& hint = {}) noexcept;
|
||||||
ImageInfo(const AmdGpu::Image& image) noexcept;
|
ImageInfo(const AmdGpu::Image& image, bool force_depth = false) noexcept;
|
||||||
|
|
||||||
bool IsTiled() const {
|
bool IsTiled() const {
|
||||||
return tiling_mode != AmdGpu::TilingMode::Display_Linear;
|
return tiling_mode != AmdGpu::TilingMode::Display_Linear;
|
||||||
|
|
|
@ -386,7 +386,7 @@ void TextureCache::RefreshImage(Image& image, Vulkan::Scheduler* custom_schedule
|
||||||
.bufferRowLength = static_cast<u32>(mip_pitch),
|
.bufferRowLength = static_cast<u32>(mip_pitch),
|
||||||
.bufferImageHeight = static_cast<u32>(mip_height),
|
.bufferImageHeight = static_cast<u32>(mip_height),
|
||||||
.imageSubresource{
|
.imageSubresource{
|
||||||
.aspectMask = vk::ImageAspectFlagBits::eColor,
|
.aspectMask = image.aspect_mask & ~vk::ImageAspectFlagBits::eStencil,
|
||||||
.mipLevel = m,
|
.mipLevel = m,
|
||||||
.baseArrayLayer = 0,
|
.baseArrayLayer = 0,
|
||||||
.layerCount = num_layers,
|
.layerCount = num_layers,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue