From 6b683517dc832312df82bf89a0b4cf129084b090 Mon Sep 17 00:00:00 2001 From: TryTwo Date: Tue, 12 Aug 2025 21:32:31 -0700 Subject: [PATCH] Fix bugs related to AbstractStagingTextures that perform an Upload (write to existing texture). This code path had probably never been used before. --- Source/Core/VideoBackends/D3D/DXTexture.cpp | 6 ++++-- Source/Core/VideoBackends/OGL/OGLTexture.cpp | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Source/Core/VideoBackends/D3D/DXTexture.cpp b/Source/Core/VideoBackends/D3D/DXTexture.cpp index 9015ede81c..eac31fd64d 100644 --- a/Source/Core/VideoBackends/D3D/DXTexture.cpp +++ b/Source/Core/VideoBackends/D3D/DXTexture.cpp @@ -211,6 +211,7 @@ std::unique_ptr DXStagingTexture::Create(StagingTextureType ty { D3D11_USAGE usage; UINT cpu_flags; + UINT bind_flags = 0; if (type == StagingTextureType::Readback) { usage = D3D11_USAGE_STAGING; @@ -220,6 +221,7 @@ std::unique_ptr DXStagingTexture::Create(StagingTextureType ty { usage = D3D11_USAGE_DYNAMIC; cpu_flags = D3D11_CPU_ACCESS_WRITE; + bind_flags = D3D11_BIND_SHADER_RESOURCE; } else { @@ -228,7 +230,7 @@ std::unique_ptr DXStagingTexture::Create(StagingTextureType ty } CD3D11_TEXTURE2D_DESC desc(D3DCommon::GetDXGIFormatForAbstractFormat(config.format, false), - config.width, config.height, 1, 1, 0, usage, cpu_flags); + config.width, config.height, 1, 1, bind_flags, usage, cpu_flags); ComPtr texture; HRESULT hr = D3D::device->CreateTexture2D(&desc, nullptr, texture.GetAddressOf()); @@ -317,7 +319,7 @@ bool DXStagingTexture::Map() if (m_type == StagingTextureType::Readback) map_type = D3D11_MAP_READ; else if (m_type == StagingTextureType::Upload) - map_type = D3D11_MAP_WRITE; + map_type = D3D11_MAP_WRITE_DISCARD; else map_type = D3D11_MAP_READ_WRITE; diff --git a/Source/Core/VideoBackends/OGL/OGLTexture.cpp b/Source/Core/VideoBackends/OGL/OGLTexture.cpp index 45f23abcd6..0d7c78d0bd 100644 --- a/Source/Core/VideoBackends/OGL/OGLTexture.cpp +++ b/Source/Core/VideoBackends/OGL/OGLTexture.cpp @@ -593,7 +593,7 @@ void OGLStagingTexture::CopyToTexture(const MathUtil::Rectangle& src_rect, glTexSubImage3D(target, 0, dst_rect.left, dst_rect.top, dst_layer, dst_rect.GetWidth(), dst_rect.GetHeight(), 1, GetGLFormatForTextureFormat(dst->GetFormat()), GetGLTypeForTextureFormat(dst->GetFormat()), reinterpret_cast(src_offset)); - + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); // If we support buffer storage, create a fence for synchronization.