VideoCore: Unify interface to OpenGL and SW rasterizers

This removes explicit checks sprinkled all over the codebase to instead
just have the SW rasterizer expose an implementation with no-ops for
most operations.
This commit is contained in:
Yuri Kunde Schlesner 2015-12-06 19:06:12 -08:00
parent 03835d04f4
commit 195fedccf0
16 changed files with 115 additions and 77 deletions

View file

@ -188,9 +188,6 @@ void RasterizerOpenGL::FlushFramebuffer() {
void RasterizerOpenGL::NotifyPicaRegisterChanged(u32 id) {
const auto& regs = Pica::g_state.regs;
if (!Settings::values.use_hw_renderer)
return;
switch(id) {
// Culling
case PICA_REG_INDEX(cull_mode):
@ -287,9 +284,6 @@ void RasterizerOpenGL::NotifyPicaRegisterChanged(u32 id) {
void RasterizerOpenGL::FlushRegion(PAddr addr, u32 size) {
const auto& regs = Pica::g_state.regs;
if (!Settings::values.use_hw_renderer)
return;
PAddr cur_fb_color_addr = regs.framebuffer.GetColorBufferPhysicalAddress();
u32 cur_fb_color_size = Pica::Regs::BytesPerColorPixel(regs.framebuffer.color_format)
* regs.framebuffer.GetWidth() * regs.framebuffer.GetHeight();
@ -309,9 +303,6 @@ void RasterizerOpenGL::FlushRegion(PAddr addr, u32 size) {
void RasterizerOpenGL::InvalidateRegion(PAddr addr, u32 size) {
const auto& regs = Pica::g_state.regs;
if (!Settings::values.use_hw_renderer)
return;
PAddr cur_fb_color_addr = regs.framebuffer.GetColorBufferPhysicalAddress();
u32 cur_fb_color_size = Pica::Regs::BytesPerColorPixel(regs.framebuffer.color_format)
* regs.framebuffer.GetWidth() * regs.framebuffer.GetHeight();

View file

@ -14,7 +14,7 @@
#include "common/hash.h"
#include "video_core/pica.h"
#include "video_core/hwrasterizer_base.h"
#include "video_core/rasterizer_interface.h"
#include "video_core/renderer_opengl/gl_rasterizer_cache.h"
#include "video_core/renderer_opengl/gl_state.h"
#include "video_core/shader/shader_interpreter.h"
@ -102,36 +102,21 @@ struct hash<PicaShaderConfig> {
} // namespace std
class RasterizerOpenGL : public HWRasterizer {
class RasterizerOpenGL : public VideoCore::RasterizerInterface {
public:
RasterizerOpenGL();
~RasterizerOpenGL() override;
/// Initialize API-specific GPU objects
void InitObjects() override;
/// Reset the rasterizer, such as flushing all caches and updating all state
void Reset() override;
/// Queues the primitive formed by the given vertices for rendering
void AddTriangle(const Pica::Shader::OutputVertex& v0,
const Pica::Shader::OutputVertex& v1,
const Pica::Shader::OutputVertex& v2) override;
/// Draw the current batch of triangles
void DrawTriangles() override;
/// Commit the rasterizer's framebuffer contents immediately to the current 3DS memory framebuffer
void FlushFramebuffer() override;
/// Notify rasterizer that the specified PICA register has been changed
void NotifyPicaRegisterChanged(u32 id) override;
/// Notify rasterizer that the specified 3DS memory region will be read from after this notification
void FlushRegion(PAddr addr, u32 size) override;
/// Notify rasterizer that a 3DS memory region has been changed
void InvalidateRegion(PAddr addr, u32 size) override;
/// OpenGL shader generated for a given Pica register state

View file

@ -93,7 +93,6 @@ static std::array<GLfloat, 3*2> MakeOrthographicMatrix(const float width, const
/// RendererOpenGL constructor
RendererOpenGL::RendererOpenGL() {
hw_rasterizer.reset(new RasterizerOpenGL());
resolution_width = std::max(VideoCore::kScreenTopWidth, VideoCore::kScreenBottomWidth);
resolution_height = VideoCore::kScreenTopHeight + VideoCore::kScreenBottomHeight;
}
@ -157,15 +156,7 @@ void RendererOpenGL::SwapBuffers() {
profiler.BeginFrame();
bool hw_renderer_enabled = VideoCore::g_hw_renderer_enabled;
if (Settings::values.use_hw_renderer != hw_renderer_enabled) {
// TODO: Save new setting value to config file for next startup
Settings::values.use_hw_renderer = hw_renderer_enabled;
if (Settings::values.use_hw_renderer) {
hw_rasterizer->Reset();
}
}
RefreshRasterizerSetting();
if (Pica::g_debug_context && Pica::g_debug_context->recorder) {
Pica::g_debug_context->recorder->FrameFinished();
@ -286,8 +277,6 @@ void RendererOpenGL::InitOpenGLObjects() {
state.texture_units[0].texture_2d = 0;
state.Apply();
hw_rasterizer->InitObjects();
}
void RendererOpenGL::ConfigureFramebufferTexture(TextureInfo& texture,
@ -419,6 +408,8 @@ void RendererOpenGL::Init() {
LOG_INFO(Render_OpenGL, "GL_VENDOR: %s", glGetString(GL_VENDOR));
LOG_INFO(Render_OpenGL, "GL_RENDERER: %s", glGetString(GL_RENDERER));
InitOpenGLObjects();
RefreshRasterizerSetting();
}
/// Shutdown the renderer