mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-02 15:32:52 +00:00
texture_cache: Handle stencil texture reads
This commit is contained in:
parent
61cde67012
commit
743a290c6a
@ -147,10 +147,6 @@ void Translator::IMAGE_GET_RESINFO(const GcnInst& inst) {
|
|||||||
|
|
||||||
void Translator::IMAGE_SAMPLE(const GcnInst& inst) {
|
void Translator::IMAGE_SAMPLE(const GcnInst& inst) {
|
||||||
const auto& mimg = inst.control.mimg;
|
const auto& mimg = inst.control.mimg;
|
||||||
if (mimg.da) {
|
|
||||||
LOG_WARNING(Render_Vulkan, "Image instruction declares an array");
|
|
||||||
}
|
|
||||||
|
|
||||||
IR::VectorReg addr_reg{inst.src[0].code};
|
IR::VectorReg addr_reg{inst.src[0].code};
|
||||||
IR::VectorReg dest_reg{inst.dst[0].code};
|
IR::VectorReg dest_reg{inst.dst[0].code};
|
||||||
const IR::ScalarReg tsharp_reg{inst.src[2].code * 4};
|
const IR::ScalarReg tsharp_reg{inst.src[2].code * 4};
|
||||||
|
@ -587,7 +587,8 @@ vk::Format AdjustColorBufferFormat(vk::Format base_format,
|
|||||||
Liverpool::ColorBuffer::SwapMode comp_swap, bool is_vo_surface) {
|
Liverpool::ColorBuffer::SwapMode comp_swap, bool is_vo_surface) {
|
||||||
const bool comp_swap_alt = comp_swap == Liverpool::ColorBuffer::SwapMode::Alternate;
|
const bool comp_swap_alt = comp_swap == Liverpool::ColorBuffer::SwapMode::Alternate;
|
||||||
const bool comp_swap_reverse = comp_swap == Liverpool::ColorBuffer::SwapMode::StandardReverse;
|
const bool comp_swap_reverse = comp_swap == Liverpool::ColorBuffer::SwapMode::StandardReverse;
|
||||||
const bool comp_swap_alt_reverse = comp_swap == Liverpool::ColorBuffer::SwapMode::AlternateReverse;
|
const bool comp_swap_alt_reverse =
|
||||||
|
comp_swap == Liverpool::ColorBuffer::SwapMode::AlternateReverse;
|
||||||
if (comp_swap_alt) {
|
if (comp_swap_alt) {
|
||||||
switch (base_format) {
|
switch (base_format) {
|
||||||
case vk::Format::eR8G8B8A8Unorm:
|
case vk::Format::eR8G8B8A8Unorm:
|
||||||
|
@ -205,7 +205,7 @@ ImageInfo::ImageInfo(const AmdGpu::Image& image, bool force_depth /*= false*/) n
|
|||||||
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
|
// Override format if image is forced to be a depth target
|
||||||
if (force_depth || tiling_mode == AmdGpu::TilingMode::Depth_MacroTiled) {
|
if (force_depth || tiling_mode == AmdGpu::TilingMode::Depth_MacroTiled) {
|
||||||
if (pixel_format == vk::Format::eR32Sfloat) {
|
if (pixel_format == vk::Format::eR32Sfloat || pixel_format == vk::Format::eR8Unorm) {
|
||||||
pixel_format = vk::Format::eD32SfloatS8Uint;
|
pixel_format = vk::Format::eD32SfloatS8Uint;
|
||||||
} else if (pixel_format == vk::Format::eR16Unorm) {
|
} else if (pixel_format == vk::Format::eR16Unorm) {
|
||||||
pixel_format = vk::Format::eD16UnormS8Uint;
|
pixel_format = vk::Format::eD16UnormS8Uint;
|
||||||
|
@ -128,6 +128,10 @@ ImageView::ImageView(const Vulkan::Instance& instance, const ImageViewInfo& info
|
|||||||
format = image.info.pixel_format;
|
format = image.info.pixel_format;
|
||||||
aspect = vk::ImageAspectFlagBits::eDepth;
|
aspect = vk::ImageAspectFlagBits::eDepth;
|
||||||
}
|
}
|
||||||
|
if (image.aspect_mask & vk::ImageAspectFlagBits::eStencil && format == vk::Format::eR8Unorm) {
|
||||||
|
format = image.info.pixel_format;
|
||||||
|
aspect = vk::ImageAspectFlagBits::eStencil;
|
||||||
|
}
|
||||||
|
|
||||||
const vk::ImageViewCreateInfo image_view_ci = {
|
const vk::ImageViewCreateInfo image_view_ci = {
|
||||||
.pNext = usage_override ? &usage_ci : nullptr,
|
.pNext = usage_override ? &usage_ci : nullptr,
|
||||||
|
Loading…
Reference in New Issue
Block a user