diff --git a/include/renderer.hpp b/include/renderer.hpp index 94a0b0f3..5a1efc77 100644 --- a/include/renderer.hpp +++ b/include/renderer.hpp @@ -84,7 +84,7 @@ class Renderer { // It is responsible for things like looking up which vertex/fragment shaders to use, recompiling them if they don't exist, choosing between // ubershaders and shadergen, and so on. // Returns whether this draw is eligible for using hardware-accelerated shaders or if shaders should run on the CPU - virtual bool prepareForDraw(ShaderUnit& shaderUnit, PICA::DrawAcceleration* accel, bool isImmediateMode) { return false; } + virtual bool prepareForDraw(ShaderUnit& shaderUnit, PICA::DrawAcceleration* accel) { return false; } // Functions for initializing the graphics context for the Qt frontend, where we don't have the convenience of SDL_Window #ifdef PANDA3DS_FRONTEND_QT diff --git a/include/renderer_gl/renderer_gl.hpp b/include/renderer_gl/renderer_gl.hpp index 63bbb474..16286484 100644 --- a/include/renderer_gl/renderer_gl.hpp +++ b/include/renderer_gl/renderer_gl.hpp @@ -160,7 +160,7 @@ class RendererGL final : public Renderer { virtual bool supportsShaderReload() override { return true; } virtual std::string getUbershader() override; virtual void setUbershader(const std::string& shader) override; - virtual bool prepareForDraw(ShaderUnit& shaderUnit, PICA::DrawAcceleration* accel, bool isImmediateMode) override; + virtual bool prepareForDraw(ShaderUnit& shaderUnit, PICA::DrawAcceleration* accel) override; std::optional getColourBuffer(u32 addr, PICA::ColorFmt format, u32 width, u32 height, bool createIfnotFound = true); diff --git a/src/core/PICA/gpu.cpp b/src/core/PICA/gpu.cpp index 76f3acea..64dc5beb 100644 --- a/src/core/PICA/gpu.cpp +++ b/src/core/PICA/gpu.cpp @@ -131,7 +131,7 @@ void GPU::drawArrays(bool indexed) { getAcceleratedDrawInfo(accel, indexed); } - const bool hwShaders = renderer->prepareForDraw(shaderUnit, &accel, false); + const bool hwShaders = renderer->prepareForDraw(shaderUnit, &accel); if (hwShaders) { if (indexed) { diff --git a/src/core/PICA/regs.cpp b/src/core/PICA/regs.cpp index 091bd377..4c865d12 100644 --- a/src/core/PICA/regs.cpp +++ b/src/core/PICA/regs.cpp @@ -249,7 +249,7 @@ void GPU::writeInternalReg(u32 index, u32 value, u32 mask) { // If we've reached 3 verts, issue a draw call // Handle rendering depending on the primitive type if (immediateModeVertIndex == 3) { - renderer->prepareForDraw(shaderUnit, nullptr, true); + renderer->prepareForDraw(shaderUnit, nullptr); renderer->drawVertices(PICA::PrimType::TriangleList, immediateModeVertices); switch (primType) { diff --git a/src/core/renderer_gl/renderer_gl.cpp b/src/core/renderer_gl/renderer_gl.cpp index 4ed1eac1..fc6e2ce6 100644 --- a/src/core/renderer_gl/renderer_gl.cpp +++ b/src/core/renderer_gl/renderer_gl.cpp @@ -950,7 +950,7 @@ OpenGL::Program& RendererGL::getSpecializedShader() { return program; } -bool RendererGL::prepareForDraw(ShaderUnit& shaderUnit, PICA::DrawAcceleration* accel, bool isImmediateMode) { +bool RendererGL::prepareForDraw(ShaderUnit& shaderUnit, PICA::DrawAcceleration* accel) { // First we figure out if we will be using an ubershader bool usingUbershader = emulatorConfig->useUbershaders; if (usingUbershader) { @@ -966,7 +966,7 @@ bool RendererGL::prepareForDraw(ShaderUnit& shaderUnit, PICA::DrawAcceleration* // Then we figure out if we will use hw accelerated shaders, and try to fetch our shader // TODO: Ubershader support for accelerated shaders - usingAcceleratedShader = emulatorConfig->accelerateShaders && !isImmediateMode && !usingUbershader; + usingAcceleratedShader = emulatorConfig->accelerateShaders && !usingUbershader && accel != nullptr && accel->canBeAccelerated; if (usingAcceleratedShader) { PICA::VertConfig vertexConfig(shaderUnit.vs, regs, usingUbershader); @@ -1000,9 +1000,10 @@ bool RendererGL::prepareForDraw(ShaderUnit& shaderUnit, PICA::DrawAcceleration* shaderUnit.vs.uniformsDirty = false; glBufferSubData(GL_UNIFORM_BUFFER, 0, PICAShader::totalUniformSize(), shaderUnit.vs.getUniformPointer()); } - } - accelerateVertexUpload(shaderUnit, accel); + // Upload vertex data and index buffer data to our GPU + accelerateVertexUpload(shaderUnit, accel); + } } if (usingUbershader) {