From 825a5b176c03331af9d006e13bc425004f2ac523 Mon Sep 17 00:00:00 2001 From: Triang3l Date: Thu, 19 May 2022 21:39:11 +0300 Subject: [PATCH 1/3] [D3D12] Fix frontbuffer resource state --- src/xenia/gpu/d3d12/d3d12_texture_cache.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/xenia/gpu/d3d12/d3d12_texture_cache.cc b/src/xenia/gpu/d3d12/d3d12_texture_cache.cc index 72233c79f..09097fb99 100644 --- a/src/xenia/gpu/d3d12/d3d12_texture_cache.cc +++ b/src/xenia/gpu/d3d12/d3d12_texture_cache.cc @@ -1311,14 +1311,14 @@ ID3D12Resource* D3D12TextureCache::RequestSwapTexture( return nullptr; } texture->MarkAsUsed(); - // The swap texture is likely to be used only for the presentation pixel + // The swap texture is likely to be used only for the presentation compute // shader, and not during emulation, where it'd be NON_PIXEL_SHADER_RESOURCE | // PIXEL_SHADER_RESOURCE. ID3D12Resource* texture_resource = texture->resource(); command_processor_.PushTransitionBarrier( texture_resource, - texture->SetResourceState(D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE), - D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); + texture->SetResourceState(D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE), + D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE); srv_desc_out.Format = GetDXGIUnormFormat(key); srv_desc_out.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; srv_desc_out.Shader4ComponentMapping = From 7d63d6e1d30194334515263ca2ba5395e0aa8203 Mon Sep 17 00:00:00 2001 From: Triang3l Date: Thu, 19 May 2022 21:40:03 +0300 Subject: [PATCH 2/3] [D3D12] Fix 2:1-subsampled format swizzle --- src/xenia/gpu/d3d12/d3d12_texture_cache.cc | 4 ++-- src/xenia/gpu/xenos.h | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/xenia/gpu/d3d12/d3d12_texture_cache.cc b/src/xenia/gpu/d3d12/d3d12_texture_cache.cc index 09097fb99..761bd77a4 100644 --- a/src/xenia/gpu/d3d12/d3d12_texture_cache.cc +++ b/src/xenia/gpu/d3d12/d3d12_texture_cache.cc @@ -131,7 +131,7 @@ const D3D12TextureCache::HostFormat D3D12TextureCache::host_formats_[64] = { // Red and blue probably must be swapped, similar to k_Y1_Cr_Y0_Cb_REP. {DXGI_FORMAT_G8R8_G8B8_UNORM, DXGI_FORMAT_G8R8_G8B8_UNORM, LoadMode::k32bpb, DXGI_FORMAT_UNKNOWN, LoadMode::kUnknown, true, DXGI_FORMAT_UNKNOWN, - LoadMode::kUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_BGRA}, + LoadMode::kUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_BGRR}, // k_Y1_Cr_Y0_Cb_REP // Used for videos in 54540829. Red and blue must be swapped. // TODO(Triang3l): D3DFMT_G8R8_G8B8 is DXGI_FORMAT_R8G8_B8G8_UNORM * 255.0f, @@ -140,7 +140,7 @@ const D3D12TextureCache::HostFormat D3D12TextureCache::host_formats_[64] = { // a very rare case. {DXGI_FORMAT_R8G8_B8G8_UNORM, DXGI_FORMAT_R8G8_B8G8_UNORM, LoadMode::k32bpb, DXGI_FORMAT_UNKNOWN, LoadMode::kUnknown, true, DXGI_FORMAT_UNKNOWN, - LoadMode::kUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_BGRA}, + LoadMode::kUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_BGRR}, // k_16_16_EDRAM // Not usable as a texture, also has -32...32 range. {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, LoadMode::kUnknown, diff --git a/src/xenia/gpu/xenos.h b/src/xenia/gpu/xenos.h index 35e2a89cf..c396b285b 100644 --- a/src/xenia/gpu/xenos.h +++ b/src/xenia/gpu/xenos.h @@ -925,6 +925,7 @@ typedef enum { XE_GPU_TEXTURE_SWIZZLE_RGGG = XE_GPU_MAKE_TEXTURE_SWIZZLE(R, G, G, G), XE_GPU_TEXTURE_SWIZZLE_RGBB = XE_GPU_MAKE_TEXTURE_SWIZZLE(R, G, B, B), XE_GPU_TEXTURE_SWIZZLE_RGBA = XE_GPU_MAKE_TEXTURE_SWIZZLE(R, G, B, A), + XE_GPU_TEXTURE_SWIZZLE_BGRR = XE_GPU_MAKE_TEXTURE_SWIZZLE(B, G, R, R), XE_GPU_TEXTURE_SWIZZLE_BGRA = XE_GPU_MAKE_TEXTURE_SWIZZLE(B, G, R, A), XE_GPU_TEXTURE_SWIZZLE_0000 = XE_GPU_MAKE_TEXTURE_SWIZZLE(0, 0, 0, 0), } XE_GPU_TEXTURE_SWIZZLE; From 1dcc919a33791e0013b322d655b8a005771d5315 Mon Sep 17 00:00:00 2001 From: Triang3l Date: Thu, 19 May 2022 21:41:52 +0300 Subject: [PATCH 3/3] [GPU] Move k_Y1_Cr_Y0_Cb_REP usage example to xenos.h --- src/xenia/gpu/d3d12/d3d12_texture_cache.cc | 2 +- src/xenia/gpu/xenos.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/xenia/gpu/d3d12/d3d12_texture_cache.cc b/src/xenia/gpu/d3d12/d3d12_texture_cache.cc index 761bd77a4..2fb6e1bb3 100644 --- a/src/xenia/gpu/d3d12/d3d12_texture_cache.cc +++ b/src/xenia/gpu/d3d12/d3d12_texture_cache.cc @@ -133,7 +133,7 @@ const D3D12TextureCache::HostFormat D3D12TextureCache::host_formats_[64] = { DXGI_FORMAT_UNKNOWN, LoadMode::kUnknown, true, DXGI_FORMAT_UNKNOWN, LoadMode::kUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_BGRR}, // k_Y1_Cr_Y0_Cb_REP - // Used for videos in 54540829. Red and blue must be swapped. + // Red and blue must be swapped. // TODO(Triang3l): D3DFMT_G8R8_G8B8 is DXGI_FORMAT_R8G8_B8G8_UNORM * 255.0f, // watch out for num_format int, division in shaders, etc., in 54540829 it // works as is. Also need to decompress if the size is uneven, but should be diff --git a/src/xenia/gpu/xenos.h b/src/xenia/gpu/xenos.h index c396b285b..3bdc5cdcf 100644 --- a/src/xenia/gpu/xenos.h +++ b/src/xenia/gpu/xenos.h @@ -412,6 +412,7 @@ enum class TextureFormat : uint32_t { k_8_B = 9, k_8_8 = 10, k_Cr_Y1_Cb_Y0_REP = 11, + // Used for videos in 54540829. k_Y1_Cr_Y0_Cb_REP = 12, k_16_16_EDRAM = 13, k_8_8_8_8_A = 14,