summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Software/SWTexture.cpp
diff options
context:
space:
mode:
authorMai <mathew1800@gmail.com>2022-09-29 09:05:51 -0400
committerGitHub <noreply@github.com>2022-09-29 09:05:51 -0400
commit0c19a1d87cbd51d62833d31d3413c61b3bc8ccf4 (patch)
treebd5a76acfeec8d7e70345b8720c5e164ef8e4da7 /Source/Core/VideoBackends/Software/SWTexture.cpp
parent3fab5b2338f1b7bc1b4ddc0e283c2650a6e2e825 (diff)
parent3d0cd8b076a4a8ff4f6741769781305cd571b5b7 (diff)
Merge pull request #11100 from Pokechu22/software-settings-merge
Use the same settings for the software renderer as other backends
Diffstat (limited to 'Source/Core/VideoBackends/Software/SWTexture.cpp')
-rw-r--r--Source/Core/VideoBackends/Software/SWTexture.cpp71
1 files changed, 44 insertions, 27 deletions
diff --git a/Source/Core/VideoBackends/Software/SWTexture.cpp b/Source/Core/VideoBackends/Software/SWTexture.cpp
index 082c26371e..6805ff0eb8 100644
--- a/Source/Core/VideoBackends/Software/SWTexture.cpp
+++ b/Source/Core/VideoBackends/Software/SWTexture.cpp
@@ -25,17 +25,17 @@ struct Pixel
#pragma pack(pop)
void CopyTextureData(const TextureConfig& src_config, const u8* src_ptr, u32 src_x, u32 src_y,
- u32 width, u32 height, const TextureConfig& dst_config, u8* dst_ptr, u32 dst_x,
- u32 dst_y)
+ u32 width, u32 height, u32 src_level, const TextureConfig& dst_config,
+ u8* dst_ptr, u32 dst_x, u32 dst_y, u32 dst_level)
{
- size_t texel_size = AbstractTexture::GetTexelSizeForFormat(src_config.format);
- size_t src_stride = src_config.GetStride();
- size_t src_offset =
+ const size_t texel_size = AbstractTexture::GetTexelSizeForFormat(src_config.format);
+ const size_t src_stride = src_config.GetMipStride(src_level);
+ const size_t src_offset =
static_cast<size_t>(src_y) * src_stride + static_cast<size_t>(src_x) * texel_size;
- size_t dst_stride = dst_config.GetStride();
- size_t dst_offset =
+ const size_t dst_stride = dst_config.GetMipStride(dst_level);
+ const size_t dst_offset =
static_cast<size_t>(dst_y) * dst_stride + static_cast<size_t>(dst_x) * texel_size;
- size_t copy_len = static_cast<size_t>(width) * texel_size;
+ const size_t copy_len = static_cast<size_t>(width) * texel_size;
src_ptr += src_offset;
dst_ptr += dst_offset;
@@ -56,15 +56,24 @@ void SWRenderer::ScaleTexture(AbstractFramebuffer* dst_framebuffer,
const SWTexture* software_source_texture = static_cast<const SWTexture*>(src_texture);
SWTexture* software_dest_texture = static_cast<SWTexture*>(dst_framebuffer->GetColorAttachment());
- CopyRegion(reinterpret_cast<const Pixel*>(software_source_texture->GetData()), src_rect,
+ CopyRegion(reinterpret_cast<const Pixel*>(software_source_texture->GetData(0, 0)), src_rect,
src_texture->GetWidth(), src_texture->GetHeight(),
- reinterpret_cast<Pixel*>(software_dest_texture->GetData()), dst_rect,
+ reinterpret_cast<Pixel*>(software_dest_texture->GetData(0, 0)), dst_rect,
dst_framebuffer->GetWidth(), dst_framebuffer->GetHeight());
}
SWTexture::SWTexture(const TextureConfig& tex_config) : AbstractTexture(tex_config)
{
- m_data.resize(tex_config.width * tex_config.height * 4);
+ m_data.resize(tex_config.layers);
+ for (u32 layer = 0; layer < tex_config.layers; layer++)
+ {
+ m_data[layer].resize(tex_config.levels);
+ for (u32 level = 0; level < tex_config.levels; level++)
+ {
+ m_data[layer][level].resize(std::max(tex_config.width >> level, 1u) *
+ std::max(tex_config.height >> level, 1u) * sizeof(Pixel));
+ }
+ }
}
void SWTexture::CopyRectangleFromTexture(const AbstractTexture* src,
@@ -72,10 +81,10 @@ void SWTexture::CopyRectangleFromTexture(const AbstractTexture* src,
u32 src_level, const MathUtil::Rectangle<int>& dst_rect,
u32 dst_layer, u32 dst_level)
{
- ASSERT(src_level == 0 && src_layer == 0 && dst_layer == 0 && dst_level == 0);
- CopyTextureData(src->GetConfig(), static_cast<const SWTexture*>(src)->m_data.data(),
- src_rect.left, src_rect.top, src_rect.GetWidth(), src_rect.GetHeight(), m_config,
- m_data.data(), dst_rect.left, dst_rect.top);
+ CopyTextureData(src->GetConfig(),
+ static_cast<const SWTexture*>(src)->GetData(src_layer, src_level), src_rect.left,
+ src_rect.top, src_rect.GetWidth(), src_rect.GetHeight(), src_level, m_config,
+ GetData(dst_layer, dst_level), dst_rect.left, dst_rect.top, dst_level);
}
void SWTexture::ResolveFromTexture(const AbstractTexture* src, const MathUtil::Rectangle<int>& rect,
u32 layer, u32 level)
@@ -85,17 +94,25 @@ void SWTexture::ResolveFromTexture(const AbstractTexture* src, const MathUtil::R
void SWTexture::Load(u32 level, u32 width, u32 height, u32 row_length, const u8* buffer,
size_t buffer_size)
{
- m_data.assign(buffer, buffer + buffer_size);
+ for (u32 layer = 0; layer < m_config.layers; layer++)
+ {
+ u8* data = GetData(layer, level);
+ for (u32 y = 0; y < height; y++)
+ {
+ memcpy(&data[width * y * sizeof(Pixel)], &buffer[y * row_length * sizeof(Pixel)],
+ width * sizeof(Pixel));
+ }
+ }
}
-const u8* SWTexture::GetData() const
+const u8* SWTexture::GetData(u32 layer, u32 level) const
{
- return m_data.data();
+ return m_data[layer][level].data();
}
-u8* SWTexture::GetData()
+u8* SWTexture::GetData(u32 layer, u32 level)
{
- return m_data.data();
+ return m_data[layer][level].data();
}
SWStagingTexture::SWStagingTexture(StagingTextureType type, const TextureConfig& config)
@@ -112,10 +129,10 @@ void SWStagingTexture::CopyFromTexture(const AbstractTexture* src,
const MathUtil::Rectangle<int>& src_rect, u32 src_layer,
u32 src_level, const MathUtil::Rectangle<int>& dst_rect)
{
- ASSERT(src_level == 0 && src_layer == 0);
- CopyTextureData(src->GetConfig(), static_cast<const SWTexture*>(src)->GetData(), src_rect.left,
- src_rect.top, src_rect.GetWidth(), src_rect.GetHeight(), m_config, m_data.data(),
- dst_rect.left, dst_rect.top);
+ CopyTextureData(src->GetConfig(),
+ static_cast<const SWTexture*>(src)->GetData(src_layer, src_level), src_rect.left,
+ src_rect.top, src_rect.GetWidth(), src_rect.GetHeight(), src_level, m_config,
+ m_data.data(), dst_rect.left, dst_rect.top, 0);
m_needs_flush = true;
}
@@ -123,10 +140,10 @@ void SWStagingTexture::CopyToTexture(const MathUtil::Rectangle<int>& src_rect, A
const MathUtil::Rectangle<int>& dst_rect, u32 dst_layer,
u32 dst_level)
{
- ASSERT(dst_level == 0 && dst_layer == 0);
CopyTextureData(m_config, m_data.data(), src_rect.left, src_rect.top, src_rect.GetWidth(),
- src_rect.GetHeight(), dst->GetConfig(), static_cast<SWTexture*>(dst)->GetData(),
- dst_rect.left, dst_rect.top);
+ src_rect.GetHeight(), 0, dst->GetConfig(),
+ static_cast<SWTexture*>(dst)->GetData(dst_layer, dst_level), dst_rect.left,
+ dst_rect.top, dst_level);
m_needs_flush = true;
}