summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Software
diff options
context:
space:
mode:
authorTilka <tilkax@gmail.com>2019-02-26 04:21:05 +0000
committerGitHub <noreply@github.com>2019-02-26 04:21:05 +0000
commit6ce7f44b8a0bb3b95d3f12ebffbef7a71a443fdd (patch)
tree98380ce3a3284c52597a6fba86589c847219ecd5 /Source/Core/VideoBackends/Software
parent19673ce79af814ca3b77d7f8ea60458e564bfa51 (diff)
parentf039149198657c1891e1c6462ed30c31ed4b8486 (diff)
Merge pull request #7753 from stenzek/videocommon-all-the-things
Move a significant amount of video backend logic to VideoCommon
Diffstat (limited to 'Source/Core/VideoBackends/Software')
-rw-r--r--Source/Core/VideoBackends/Software/SWRenderer.cpp32
-rw-r--r--Source/Core/VideoBackends/Software/SWRenderer.h18
-rw-r--r--Source/Core/VideoBackends/Software/SWTexture.cpp58
-rw-r--r--Source/Core/VideoBackends/Software/SWTexture.h10
-rw-r--r--Source/Core/VideoBackends/Software/SWVertexLoader.cpp50
-rw-r--r--Source/Core/VideoBackends/Software/SWVertexLoader.h12
-rw-r--r--Source/Core/VideoBackends/Software/SWmain.cpp27
-rw-r--r--Source/Core/VideoBackends/Software/TextureCache.h14
8 files changed, 89 insertions, 132 deletions
diff --git a/Source/Core/VideoBackends/Software/SWRenderer.cpp b/Source/Core/VideoBackends/Software/SWRenderer.cpp
index 6369b35b20..4b57b9b551 100644
--- a/Source/Core/VideoBackends/Software/SWRenderer.cpp
+++ b/Source/Core/VideoBackends/Software/SWRenderer.cpp
@@ -19,11 +19,15 @@
#include "VideoCommon/AbstractPipeline.h"
#include "VideoCommon/AbstractShader.h"
+#include "VideoCommon/AbstractTexture.h"
#include "VideoCommon/BoundingBox.h"
+#include "VideoCommon/NativeVertexFormat.h"
#include "VideoCommon/OnScreenDisplay.h"
#include "VideoCommon/VideoBackendBase.h"
#include "VideoCommon/VideoConfig.h"
+namespace SW
+{
SWRenderer::SWRenderer(std::unique_ptr<SWOGLWindow> window)
: ::Renderer(static_cast<int>(MAX_XFB_WIDTH), static_cast<int>(MAX_XFB_HEIGHT), 1.0f,
AbstractTextureFormat::RGBA8),
@@ -38,21 +42,20 @@ bool SWRenderer::IsHeadless() const
std::unique_ptr<AbstractTexture> SWRenderer::CreateTexture(const TextureConfig& config)
{
- return std::make_unique<SW::SWTexture>(config);
+ return std::make_unique<SWTexture>(config);
}
std::unique_ptr<AbstractStagingTexture>
SWRenderer::CreateStagingTexture(StagingTextureType type, const TextureConfig& config)
{
- return std::make_unique<SW::SWStagingTexture>(type, config);
+ return std::make_unique<SWStagingTexture>(type, config);
}
std::unique_ptr<AbstractFramebuffer>
-SWRenderer::CreateFramebuffer(const AbstractTexture* color_attachment,
- const AbstractTexture* depth_attachment)
+SWRenderer::CreateFramebuffer(AbstractTexture* color_attachment, AbstractTexture* depth_attachment)
{
- return SW::SWFramebuffer::Create(static_cast<const SW::SWTexture*>(color_attachment),
- static_cast<const SW::SWTexture*>(depth_attachment));
+ return SWFramebuffer::Create(static_cast<SWTexture*>(color_attachment),
+ static_cast<SWTexture*>(depth_attachment));
}
class SWShader final : public AbstractShader
@@ -132,18 +135,15 @@ void SWRenderer::BBoxWrite(int index, u16 value)
BoundingBox::coords[index] = value;
}
-TargetRectangle SWRenderer::ConvertEFBRectangle(const EFBRectangle& rc)
-{
- TargetRectangle result;
- result.left = rc.left;
- result.top = rc.top;
- result.right = rc.right;
- result.bottom = rc.bottom;
- return result;
-}
-
void SWRenderer::ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable,
bool zEnable, u32 color, u32 z)
{
EfbCopy::ClearEfb();
}
+
+std::unique_ptr<NativeVertexFormat>
+SWRenderer::CreateNativeVertexFormat(const PortableVertexDeclaration& vtx_decl)
+{
+ return std::make_unique<NativeVertexFormat>(vtx_decl);
+}
+} // namespace SW
diff --git a/Source/Core/VideoBackends/Software/SWRenderer.h b/Source/Core/VideoBackends/Software/SWRenderer.h
index 88c5ece360..a06ccaecd2 100644
--- a/Source/Core/VideoBackends/Software/SWRenderer.h
+++ b/Source/Core/VideoBackends/Software/SWRenderer.h
@@ -12,7 +12,9 @@
class SWOGLWindow;
-class SWRenderer : public Renderer
+namespace SW
+{
+class SWRenderer final : public Renderer
{
public:
SWRenderer(std::unique_ptr<SWOGLWindow> window);
@@ -23,13 +25,14 @@ public:
std::unique_ptr<AbstractStagingTexture>
CreateStagingTexture(StagingTextureType type, const TextureConfig& config) override;
std::unique_ptr<AbstractFramebuffer>
- CreateFramebuffer(const AbstractTexture* color_attachment,
- const AbstractTexture* depth_attachment) override;
+ CreateFramebuffer(AbstractTexture* color_attachment, AbstractTexture* depth_attachment) override;
std::unique_ptr<AbstractShader> CreateShaderFromSource(ShaderStage stage, const char* source,
size_t length) override;
std::unique_ptr<AbstractShader> CreateShaderFromBinary(ShaderStage stage, const void* data,
size_t length) override;
+ std::unique_ptr<NativeVertexFormat>
+ CreateNativeVertexFormat(const PortableVertexDeclaration& vtx_decl) override;
std::unique_ptr<AbstractPipeline> CreatePipeline(const AbstractPipelineConfig& config) override;
u32 AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) override;
@@ -37,15 +40,18 @@ public:
u16 BBoxRead(int index) override;
void BBoxWrite(int index, u16 value) override;
- TargetRectangle ConvertEFBRectangle(const EFBRectangle& rc) override;
-
void RenderXFBToScreen(const AbstractTexture* texture, const EFBRectangle& rc) override;
void ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable,
u32 color, u32 z) override;
- void ReinterpretPixelData(unsigned int convtype) override {}
+ void ReinterpretPixelData(EFBReinterpretType convtype) override {}
+
+ void ScaleTexture(AbstractFramebuffer* dst_framebuffer, const MathUtil::Rectangle<int>& dst_rect,
+ const AbstractTexture* src_texture,
+ const MathUtil::Rectangle<int>& src_rect) override;
private:
std::unique_ptr<SWOGLWindow> m_window;
};
+} // namespace SW
diff --git a/Source/Core/VideoBackends/Software/SWTexture.cpp b/Source/Core/VideoBackends/Software/SWTexture.cpp
index eb450d642f..466da1efd5 100644
--- a/Source/Core/VideoBackends/Software/SWTexture.cpp
+++ b/Source/Core/VideoBackends/Software/SWTexture.cpp
@@ -3,6 +3,7 @@
// Refer to the license.txt file included.
#include "VideoBackends/Software/SWTexture.h"
+#include "VideoBackends/Software/SWRenderer.h"
#include <cstring>
#include "Common/Assert.h"
@@ -45,6 +46,25 @@ void CopyTextureData(const TextureConfig& src_config, const u8* src_ptr, u32 src
dst_ptr += dst_stride;
}
}
+} // namespace
+
+void SWRenderer::ScaleTexture(AbstractFramebuffer* dst_framebuffer,
+ const MathUtil::Rectangle<int>& dst_rect,
+ const AbstractTexture* src_texture,
+ const MathUtil::Rectangle<int>& src_rect)
+{
+ const SWTexture* software_source_texture = static_cast<const SWTexture*>(src_texture);
+ SWTexture* software_dest_texture = static_cast<SWTexture*>(dst_framebuffer->GetColorAttachment());
+
+ std::vector<Pixel> source_pixels;
+ source_pixels.resize(src_rect.GetHeight() * src_rect.GetWidth() * 4);
+ memcpy(source_pixels.data(), software_source_texture->GetData(), source_pixels.size());
+
+ std::vector<Pixel> destination_pixels;
+ destination_pixels.resize(dst_rect.GetHeight() * dst_rect.GetWidth() * 4);
+
+ CopyRegion(source_pixels.data(), src_rect, destination_pixels.data(), dst_rect);
+ memcpy(software_dest_texture->GetData(), destination_pixels.data(), destination_pixels.size());
}
SWTexture::SWTexture(const TextureConfig& tex_config) : AbstractTexture(tex_config)
@@ -62,30 +82,6 @@ void SWTexture::CopyRectangleFromTexture(const AbstractTexture* src,
src_rect.left, src_rect.top, src_rect.GetWidth(), src_rect.GetHeight(), m_config,
m_data.data(), dst_rect.left, dst_rect.top);
}
-void SWTexture::ScaleRectangleFromTexture(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::ResolveFromTexture(const AbstractTexture* src, const MathUtil::Rectangle<int>& rect,
u32 layer, u32 level)
{
@@ -153,14 +149,16 @@ void SWStagingTexture::Flush()
m_needs_flush = false;
}
-SWFramebuffer::SWFramebuffer(AbstractTextureFormat color_format, AbstractTextureFormat depth_format,
+SWFramebuffer::SWFramebuffer(AbstractTexture* color_attachment, AbstractTexture* depth_attachment,
+ AbstractTextureFormat color_format, AbstractTextureFormat depth_format,
u32 width, u32 height, u32 layers, u32 samples)
- : AbstractFramebuffer(color_format, depth_format, width, height, layers, samples)
+ : AbstractFramebuffer(color_attachment, depth_attachment, color_format, depth_format, width,
+ height, layers, samples)
{
}
-std::unique_ptr<SWFramebuffer> SWFramebuffer::Create(const SWTexture* color_attachment,
- const SWTexture* depth_attachment)
+std::unique_ptr<SWFramebuffer> SWFramebuffer::Create(SWTexture* color_attachment,
+ SWTexture* depth_attachment)
{
if (!ValidateConfig(color_attachment, depth_attachment))
return nullptr;
@@ -175,8 +173,8 @@ std::unique_ptr<SWFramebuffer> SWFramebuffer::Create(const SWTexture* color_atta
const u32 layers = either_attachment->GetLayers();
const u32 samples = either_attachment->GetSamples();
- return std::make_unique<SWFramebuffer>(color_format, depth_format, width, height, layers,
- samples);
+ return std::make_unique<SWFramebuffer>(color_attachment, depth_attachment, color_format,
+ depth_format, width, height, layers, samples);
}
} // namespace SW
diff --git a/Source/Core/VideoBackends/Software/SWTexture.h b/Source/Core/VideoBackends/Software/SWTexture.h
index f9d5c50485..7990600e81 100644
--- a/Source/Core/VideoBackends/Software/SWTexture.h
+++ b/Source/Core/VideoBackends/Software/SWTexture.h
@@ -25,9 +25,6 @@ public:
const MathUtil::Rectangle<int>& src_rect, u32 src_layer,
u32 src_level, const MathUtil::Rectangle<int>& dst_rect,
u32 dst_layer, u32 dst_level) override;
- void ScaleRectangleFromTexture(const AbstractTexture* source,
- const MathUtil::Rectangle<int>& srcrect,
- const MathUtil::Rectangle<int>& dstrect) override;
void ResolveFromTexture(const AbstractTexture* src, const MathUtil::Rectangle<int>& rect,
u32 layer, u32 level) override;
void Load(u32 level, u32 width, u32 height, u32 row_length, const u8* buffer,
@@ -66,12 +63,13 @@ private:
class SWFramebuffer final : public AbstractFramebuffer
{
public:
- explicit SWFramebuffer(AbstractTextureFormat color_format, AbstractTextureFormat depth_format,
+ explicit SWFramebuffer(AbstractTexture* color_attachment, AbstractTexture* depth_attachment,
+ AbstractTextureFormat color_format, AbstractTextureFormat depth_format,
u32 width, u32 height, u32 layers, u32 samples);
~SWFramebuffer() override = default;
- static std::unique_ptr<SWFramebuffer> Create(const SWTexture* color_attachment,
- const SWTexture* depth_attachment);
+ static std::unique_ptr<SWFramebuffer> Create(SWTexture* color_attachment,
+ SWTexture* depth_attachment);
};
} // namespace SW
diff --git a/Source/Core/VideoBackends/Software/SWVertexLoader.cpp b/Source/Core/VideoBackends/Software/SWVertexLoader.cpp
index 4a53b4041c..20c6a1f700 100644
--- a/Source/Core/VideoBackends/Software/SWVertexLoader.cpp
+++ b/Source/Core/VideoBackends/Software/SWVertexLoader.cpp
@@ -14,6 +14,7 @@
#include "VideoBackends/Software/DebugUtil.h"
#include "VideoBackends/Software/NativeVertexFormat.h"
#include "VideoBackends/Software/Rasterizer.h"
+#include "VideoBackends/Software/SWRenderer.h"
#include "VideoBackends/Software/Tev.h"
#include "VideoBackends/Software/TransformUnit.h"
@@ -27,48 +28,9 @@
#include "VideoCommon/VideoConfig.h"
#include "VideoCommon/XFMemory.h"
-class NullNativeVertexFormat : public NativeVertexFormat
-{
-public:
- NullNativeVertexFormat(const PortableVertexDeclaration& _vtx_decl) { vtx_decl = _vtx_decl; }
-};
-
-std::unique_ptr<NativeVertexFormat>
-SWVertexLoader::CreateNativeVertexFormat(const PortableVertexDeclaration& vtx_decl)
-{
- return std::make_unique<NullNativeVertexFormat>(vtx_decl);
-}
+SWVertexLoader::SWVertexLoader() = default;
-SWVertexLoader::SWVertexLoader()
- : m_local_vertex_buffer(MAXVBUFFERSIZE), m_local_index_buffer(MAXIBUFFERSIZE)
-{
-}
-
-SWVertexLoader::~SWVertexLoader()
-{
-}
-
-void SWVertexLoader::UploadUtilityUniforms(const void* uniforms, u32 uniforms_size)
-{
-}
-
-void SWVertexLoader::ResetBuffer(u32 vertex_stride, bool cull_all)
-{
- m_cur_buffer_pointer = m_base_buffer_pointer = m_local_vertex_buffer.data();
- m_end_buffer_pointer = m_cur_buffer_pointer + m_local_vertex_buffer.size();
- IndexGenerator::Start(m_local_index_buffer.data());
-}
-
-void SWVertexLoader::CommitBuffer(u32 num_vertices, u32 vertex_stride, u32 num_indices,
- u32* out_base_vertex, u32* out_base_index)
-{
- *out_base_vertex = 0;
- *out_base_index = 0;
-}
-
-void SWVertexLoader::UploadConstants()
-{
-}
+SWVertexLoader::~SWVertexLoader() = default;
void SWVertexLoader::DrawCurrentBatch(u32 base_index, u32 num_indices, u32 base_vertex)
{
@@ -104,7 +66,7 @@ void SWVertexLoader::DrawCurrentBatch(u32 base_index, u32 num_indices, u32 base_
for (u32 i = 0; i < IndexGenerator::GetIndexLen(); i++)
{
- const u16 index = m_local_index_buffer[i];
+ const u16 index = m_cpu_index_buffer[i];
memset(static_cast<void*>(&m_vertex), 0, sizeof(m_vertex));
// Super Mario Sunshine requires those to be zero for those debug boxes.
@@ -224,8 +186,8 @@ static void ReadVertexAttribute(T* dst, DataReader src, const AttributeFormat& f
void SWVertexLoader::ParseVertex(const PortableVertexDeclaration& vdec, int index)
{
- DataReader src(m_local_vertex_buffer.data(),
- m_local_vertex_buffer.data() + m_local_vertex_buffer.size());
+ DataReader src(m_cpu_vertex_buffer.data(),
+ m_cpu_vertex_buffer.data() + m_cpu_vertex_buffer.size());
src.Skip(index * vdec.stride);
ReadVertexAttribute<float>(&m_vertex.position[0], src, vdec.position, 0, 3, false);
diff --git a/Source/Core/VideoBackends/Software/SWVertexLoader.h b/Source/Core/VideoBackends/Software/SWVertexLoader.h
index dabbdef168..55316e5134 100644
--- a/Source/Core/VideoBackends/Software/SWVertexLoader.h
+++ b/Source/Core/VideoBackends/Software/SWVertexLoader.h
@@ -20,24 +20,12 @@ public:
SWVertexLoader();
~SWVertexLoader();
- std::unique_ptr<NativeVertexFormat>
- CreateNativeVertexFormat(const PortableVertexDeclaration& vdec) override;
-
- void UploadUtilityUniforms(const void* uniforms, u32 uniforms_size) override;
-
protected:
- void ResetBuffer(u32 vertex_stride, bool cull_all) override;
- void CommitBuffer(u32 num_vertices, u32 vertex_stride, u32 num_indices, u32* out_base_vertex,
- u32* out_base_index) override;
- void UploadConstants() override;
void DrawCurrentBatch(u32 base_index, u32 num_indices, u32 base_vertex) override;
void SetFormat(u8 attributeIndex, u8 primitiveType);
void ParseVertex(const PortableVertexDeclaration& vdec, int index);
- std::vector<u8> m_local_vertex_buffer;
- std::vector<u16> m_local_index_buffer;
-
InputVertexData m_vertex;
SetupUnit m_setup_unit;
diff --git a/Source/Core/VideoBackends/Software/SWmain.cpp b/Source/Core/VideoBackends/Software/SWmain.cpp
index 0ab16bdfa8..c47072d4af 100644
--- a/Source/Core/VideoBackends/Software/SWmain.cpp
+++ b/Source/Core/VideoBackends/Software/SWmain.cpp
@@ -10,6 +10,7 @@
#include "Common/Common.h"
#include "Common/CommonTypes.h"
#include "Common/GL/GLContext.h"
+#include "Common/MsgHandler.h"
#include "VideoBackends/Software/Clipper.h"
#include "VideoBackends/Software/DebugUtil.h"
@@ -22,14 +23,11 @@
#include "VideoBackends/Software/TextureCache.h"
#include "VideoBackends/Software/VideoBackend.h"
-#include "VideoCommon/FramebufferManagerBase.h"
-#include "VideoCommon/OnScreenDisplay.h"
+#include "VideoCommon/FramebufferManager.h"
#include "VideoCommon/TextureCacheBase.h"
#include "VideoCommon/VideoCommon.h"
#include "VideoCommon/VideoConfig.h"
-#define VSYNC_ENABLED 0
-
namespace SW
{
class PerfQuery : public PerfQueryBase
@@ -59,6 +57,7 @@ void VideoSoftware::InitBackendInfo()
{
g_Config.backend_info.api_type = APIType::Nothing;
g_Config.backend_info.MaxTextureSize = 16384;
+ g_Config.backend_info.bUsesLowerLeftOrigin = false;
g_Config.backend_info.bSupports3DVision = false;
g_Config.backend_info.bSupportsDualSourceBlend = true;
g_Config.backend_info.bSupportsEarlyZ = true;
@@ -70,6 +69,7 @@ void VideoSoftware::InitBackendInfo()
g_Config.backend_info.bSupportsST3CTextures = false;
g_Config.backend_info.bSupportsBPTCTextures = false;
g_Config.backend_info.bSupportsCopyToVram = false;
+ g_Config.backend_info.bSupportsLargePoints = false;
g_Config.backend_info.bSupportsFramebufferFetch = false;
g_Config.backend_info.bSupportsBackgroundCompiling = false;
g_Config.backend_info.bSupportsLogicOp = true;
@@ -92,10 +92,22 @@ bool VideoSoftware::Initialize(const WindowSystemInfo& wsi)
g_renderer = std::make_unique<SWRenderer>(std::move(window));
g_vertex_manager = std::make_unique<SWVertexLoader>();
+ g_shader_cache = std::make_unique<VideoCommon::ShaderCache>();
+ g_framebuffer_manager = std::make_unique<FramebufferManager>();
g_perf_query = std::make_unique<PerfQuery>();
g_texture_cache = std::make_unique<TextureCache>();
- g_shader_cache = std::make_unique<VideoCommon::ShaderCache>();
- return g_renderer->Initialize() && g_shader_cache->Initialize();
+
+ if (!g_vertex_manager->Initialize() || !g_shader_cache->Initialize() ||
+ !g_renderer->Initialize() || !g_framebuffer_manager->Initialize() ||
+ !g_texture_cache->Initialize())
+ {
+ PanicAlert("Failed to initialize renderer classes");
+ Shutdown();
+ return false;
+ }
+
+ g_shader_cache->InitializeShaderCache();
+ return true;
}
void VideoSoftware::Shutdown()
@@ -107,9 +119,10 @@ void VideoSoftware::Shutdown()
g_renderer->Shutdown();
DebugUtil::Shutdown();
- g_framebuffer_manager.reset();
g_texture_cache.reset();
g_perf_query.reset();
+ g_framebuffer_manager.reset();
+ g_shader_cache.reset();
g_vertex_manager.reset();
g_renderer.reset();
ShutdownShared();
diff --git a/Source/Core/VideoBackends/Software/TextureCache.h b/Source/Core/VideoBackends/Software/TextureCache.h
index 06bfbf73fa..8d2e26d508 100644
--- a/Source/Core/VideoBackends/Software/TextureCache.h
+++ b/Source/Core/VideoBackends/Software/TextureCache.h
@@ -9,27 +9,19 @@ namespace SW
{
class TextureCache : public TextureCacheBase
{
-public:
- bool CompileShaders() override { return true; }
- void DeleteShaders() override {}
- void ConvertTexture(TCacheEntry* entry, TCacheEntry* unconverted, const void* palette,
- TLUTFormat format) override
- {
- }
+protected:
void CopyEFB(AbstractStagingTexture* dst, const EFBCopyParams& params, u32 native_width,
u32 bytes_per_row, u32 num_blocks_y, u32 memory_stride, const EFBRectangle& src_rect,
bool scale_by_half, float y_scale, float gamma, bool clamp_top, bool clamp_bottom,
- const CopyFilterCoefficientArray& filter_coefficients) override
+ const EFBCopyFilterCoefficients& filter_coefficients) override
{
TextureEncoder::Encode(dst, params, native_width, bytes_per_row, num_blocks_y, memory_stride,
src_rect, scale_by_half, y_scale, gamma);
}
-
-private:
void CopyEFBToCacheEntry(TCacheEntry* entry, bool is_depth_copy, const EFBRectangle& src_rect,
bool scale_by_half, EFBCopyFormat dst_format, bool is_intensity,
float gamma, bool clamp_top, bool clamp_bottom,
- const CopyFilterCoefficientArray& filter_coefficients) override
+ const EFBCopyFilterCoefficients& filter_coefficients) override
{
// TODO: If we ever want to "fake" vram textures, we would need to implement this
}