diff options
| author | Tilka <tilkax@gmail.com> | 2019-02-26 04:21:05 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-02-26 04:21:05 +0000 |
| commit | 6ce7f44b8a0bb3b95d3f12ebffbef7a71a443fdd (patch) | |
| tree | 98380ce3a3284c52597a6fba86589c847219ecd5 /Source/Core/VideoBackends/Software | |
| parent | 19673ce79af814ca3b77d7f8ea60458e564bfa51 (diff) | |
| parent | f039149198657c1891e1c6462ed30c31ed4b8486 (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.cpp | 32 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/Software/SWRenderer.h | 18 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/Software/SWTexture.cpp | 58 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/Software/SWTexture.h | 10 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/Software/SWVertexLoader.cpp | 50 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/Software/SWVertexLoader.h | 12 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/Software/SWmain.cpp | 27 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/Software/TextureCache.h | 14 |
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 } |
