diff options
| author | Pierre Bourdon <delroth@gmail.com> | 2017-11-19 04:58:59 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-11-19 04:58:59 +0100 |
| commit | 609a17a0cd41a12c0fbf9a7c47c8889232594778 (patch) | |
| tree | 0a5f6f4b0a7d480accc4dfbcc3e9c1c6e3652dc0 /Source/Core/VideoBackends/Software/SWTexture.cpp | |
| parent | d800b0f79868a28356b4e40cb9b2e5af43977042 (diff) | |
| parent | 1f1574b7ab032afa7b3a600a071699f2cbea124e (diff) | |
Merge pull request #5498 from iwubcode/hybrid_xfb
Hybrid xfb
Diffstat (limited to 'Source/Core/VideoBackends/Software/SWTexture.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/Software/SWTexture.cpp | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/Source/Core/VideoBackends/Software/SWTexture.cpp b/Source/Core/VideoBackends/Software/SWTexture.cpp index 164c0d5314..aa279b520b 100644 --- a/Source/Core/VideoBackends/Software/SWTexture.cpp +++ b/Source/Core/VideoBackends/Software/SWTexture.cpp @@ -4,10 +4,27 @@ #include "VideoBackends/Software/SWTexture.h" +#include <cstring> + +#include "VideoBackends/Software/CopyRegion.h" + namespace SW { +namespace +{ +#pragma pack(push, 1) +struct Pixel +{ + u8 r; + u8 g; + u8 b; + u8 a; +}; +#pragma pack(pop) +} SWTexture::SWTexture(const TextureConfig& tex_config) : AbstractTexture(tex_config) { + m_data.resize(tex_config.width * tex_config.height * 4); } void SWTexture::Bind(unsigned int stage) @@ -18,11 +35,47 @@ void SWTexture::CopyRectangleFromTexture(const AbstractTexture* source, const MathUtil::Rectangle<int>& srcrect, const MathUtil::Rectangle<int>& dstrect) { + const SWTexture* software_source_texture = static_cast<const SWTexture*>(source); + + if (srcrect.GetWidth() == dstrect.GetWidth() && srcrect.GetHeight() == dstrect.GetHeight()) + { + m_data.assign(software_source_texture->GetData(), + software_source_texture->GetData() + m_data.size()); + } + else + { + std::vector<Pixel> source_pixels; + source_pixels.resize(srcrect.GetHeight() * srcrect.GetWidth() * 4); + memcpy(source_pixels.data(), software_source_texture->GetData(), source_pixels.size()); + + std::vector<Pixel> destination_pixels; + destination_pixels.resize(dstrect.GetHeight() * dstrect.GetWidth() * 4); + + CopyRegion(source_pixels.data(), srcrect, destination_pixels.data(), dstrect); + memcpy(GetData(), destination_pixels.data(), destination_pixels.size()); + } } 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); +} + +const u8* SWTexture::GetData() const +{ + return m_data.data(); +} + +u8* SWTexture::GetData() +{ + return m_data.data(); +} + +std::optional<AbstractTexture::RawTextureInfo> SWTexture::MapFullImpl() +{ + return AbstractTexture::RawTextureInfo{GetData(), m_config.width * 4, m_config.width, + m_config.height}; } } // namespace SW |
