summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Software/SWTexture.cpp
diff options
context:
space:
mode:
authorPierre Bourdon <delroth@gmail.com>2017-11-19 04:58:59 +0100
committerGitHub <noreply@github.com>2017-11-19 04:58:59 +0100
commit609a17a0cd41a12c0fbf9a7c47c8889232594778 (patch)
tree0a5f6f4b0a7d480accc4dfbcc3e9c1c6e3652dc0 /Source/Core/VideoBackends/Software/SWTexture.cpp
parentd800b0f79868a28356b4e40cb9b2e5af43977042 (diff)
parent1f1574b7ab032afa7b3a600a071699f2cbea124e (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.cpp53
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