OpenGL Renderer: Simplify the code by removing the references to multiple output shaders, since commit 0c7cb99 has obsoleted them.

This commit is contained in:
rogerman 2024-08-07 12:20:35 -07:00
parent c5ab8a6ef6
commit 176e38ce2f
6 changed files with 89 additions and 180 deletions

View File

@ -1295,7 +1295,6 @@ OpenGLRenderer::OpenGLRenderer()
_needsZeroDstAlphaPass = true; _needsZeroDstAlphaPass = true;
_currentPolyIndex = 0; _currentPolyIndex = 0;
_enableAlphaBlending = true; _enableAlphaBlending = true;
_lastTextureDrawTarget = OGLTextureUnitID_GColor;
_geometryProgramFlags.value = 0; _geometryProgramFlags.value = 0;
_fogProgramKey.key = 0; _fogProgramKey.key = 0;
_fogProgramMap.clear(); _fogProgramMap.clear();
@ -3509,7 +3508,7 @@ void OpenGLRenderer_1_2::DestroyFogPrograms()
} }
} }
Render3DError OpenGLRenderer_1_2::CreateFramebufferOutput6665Program(const size_t outColorIndex, const char *vtxShaderCString, const char *fragShaderCString) Render3DError OpenGLRenderer_1_2::CreateFramebufferOutput6665Program(const char *vtxShaderCString, const char *fragShaderCString)
{ {
Render3DError error = OGLERROR_NOERR; Render3DError error = OGLERROR_NOERR;
OGLRenderRef &OGLRef = *this->ref; OGLRenderRef &OGLRef = *this->ref;
@ -3528,7 +3527,7 @@ Render3DError OpenGLRenderer_1_2::CreateFramebufferOutput6665Program(const size_
error = this->ShaderProgramCreate(OGLRef.vertexFramebufferOutput6665ShaderID, error = this->ShaderProgramCreate(OGLRef.vertexFramebufferOutput6665ShaderID,
OGLRef.fragmentFramebufferRGBA6665OutputShaderID, OGLRef.fragmentFramebufferRGBA6665OutputShaderID,
OGLRef.programFramebufferRGBA6665OutputID[outColorIndex], OGLRef.programFramebufferRGBA6665OutputID,
vtxShaderCode.c_str(), vtxShaderCode.c_str(),
fragShaderCString); fragShaderCString);
if (error != OGLERROR_NOERR) if (error != OGLERROR_NOERR)
@ -3539,11 +3538,11 @@ Render3DError OpenGLRenderer_1_2::CreateFramebufferOutput6665Program(const size_
return error; return error;
} }
glBindAttribLocation(OGLRef.programFramebufferRGBA6665OutputID[outColorIndex], OGLVertexAttributeID_Position, "inPosition"); glBindAttribLocation(OGLRef.programFramebufferRGBA6665OutputID, OGLVertexAttributeID_Position, "inPosition");
glBindAttribLocation(OGLRef.programFramebufferRGBA6665OutputID[outColorIndex], OGLVertexAttributeID_TexCoord0, "inTexCoord0"); glBindAttribLocation(OGLRef.programFramebufferRGBA6665OutputID, OGLVertexAttributeID_TexCoord0, "inTexCoord0");
glLinkProgram(OGLRef.programFramebufferRGBA6665OutputID[outColorIndex]); glLinkProgram(OGLRef.programFramebufferRGBA6665OutputID);
if (!this->ValidateShaderProgramLink(OGLRef.programFramebufferRGBA6665OutputID[outColorIndex])) if (!this->ValidateShaderProgramLink(OGLRef.programFramebufferRGBA6665OutputID))
{ {
INFO("OpenGL: Failed to link the FRAMEBUFFER OUTPUT RGBA6665 shader program.\n"); INFO("OpenGL: Failed to link the FRAMEBUFFER OUTPUT RGBA6665 shader program.\n");
glUseProgram(0); glUseProgram(0);
@ -3551,17 +3550,19 @@ Render3DError OpenGLRenderer_1_2::CreateFramebufferOutput6665Program(const size_
return OGLERROR_SHADER_CREATE_ERROR; return OGLERROR_SHADER_CREATE_ERROR;
} }
glValidateProgram(OGLRef.programFramebufferRGBA6665OutputID[outColorIndex]); glValidateProgram(OGLRef.programFramebufferRGBA6665OutputID);
glUseProgram(OGLRef.programFramebufferRGBA6665OutputID[outColorIndex]); glUseProgram(OGLRef.programFramebufferRGBA6665OutputID);
const GLint uniformTexGColor = glGetUniformLocation(OGLRef.programFramebufferRGBA6665OutputID[outColorIndex], "texInFragColor"); const GLint uniformTexGColor = glGetUniformLocation(OGLRef.programFramebufferRGBA6665OutputID, "texInFragColor");
if (outColorIndex == 0) if (this->isFBOSupported)
{ {
glUniform1i(uniformTexGColor, OGLTextureUnitID_FinalColor); glUniform1i(uniformTexGColor, OGLTextureUnitID_GColor);
} }
else else
{ {
glUniform1i(uniformTexGColor, OGLTextureUnitID_GColor); // Reading back the output framebuffer without FBOs requires
// sampling from the working buffer.
glUniform1i(uniformTexGColor, OGLTextureUnitID_FinalColor);
} }
return OGLERROR_NOERR; return OGLERROR_NOERR;
@ -3576,20 +3577,12 @@ void OpenGLRenderer_1_2::DestroyFramebufferOutput6665Programs()
return; return;
} }
if (OGLRef.programFramebufferRGBA6665OutputID[0] != 0) if (OGLRef.programFramebufferRGBA6665OutputID != 0)
{ {
glDetachShader(OGLRef.programFramebufferRGBA6665OutputID[0], OGLRef.vertexFramebufferOutput6665ShaderID); glDetachShader(OGLRef.programFramebufferRGBA6665OutputID, OGLRef.vertexFramebufferOutput6665ShaderID);
glDetachShader(OGLRef.programFramebufferRGBA6665OutputID[0], OGLRef.fragmentFramebufferRGBA6665OutputShaderID); glDetachShader(OGLRef.programFramebufferRGBA6665OutputID, OGLRef.fragmentFramebufferRGBA6665OutputShaderID);
glDeleteProgram(OGLRef.programFramebufferRGBA6665OutputID[0]); glDeleteProgram(OGLRef.programFramebufferRGBA6665OutputID);
OGLRef.programFramebufferRGBA6665OutputID[0] = 0; OGLRef.programFramebufferRGBA6665OutputID = 0;
}
if (OGLRef.programFramebufferRGBA6665OutputID[1] != 0)
{
glDetachShader(OGLRef.programFramebufferRGBA6665OutputID[1], OGLRef.vertexFramebufferOutput6665ShaderID);
glDetachShader(OGLRef.programFramebufferRGBA6665OutputID[1], OGLRef.fragmentFramebufferRGBA6665OutputShaderID);
glDeleteProgram(OGLRef.programFramebufferRGBA6665OutputID[1]);
OGLRef.programFramebufferRGBA6665OutputID[1] = 0;
} }
glDeleteShader(OGLRef.vertexFramebufferOutput6665ShaderID); glDeleteShader(OGLRef.vertexFramebufferOutput6665ShaderID);
@ -3598,7 +3591,7 @@ void OpenGLRenderer_1_2::DestroyFramebufferOutput6665Programs()
OGLRef.fragmentFramebufferRGBA6665OutputShaderID = 0; OGLRef.fragmentFramebufferRGBA6665OutputShaderID = 0;
} }
Render3DError OpenGLRenderer_1_2::CreateFramebufferOutput8888Program(const size_t outColorIndex, const char *vtxShaderCString, const char *fragShaderCString) Render3DError OpenGLRenderer_1_2::CreateFramebufferOutput8888Program(const char *vtxShaderCString, const char *fragShaderCString)
{ {
Render3DError error = OGLERROR_NOERR; Render3DError error = OGLERROR_NOERR;
OGLRenderRef &OGLRef = *this->ref; OGLRenderRef &OGLRef = *this->ref;
@ -3617,7 +3610,7 @@ Render3DError OpenGLRenderer_1_2::CreateFramebufferOutput8888Program(const size_
error = this->ShaderProgramCreate(OGLRef.vertexFramebufferOutput8888ShaderID, error = this->ShaderProgramCreate(OGLRef.vertexFramebufferOutput8888ShaderID,
OGLRef.fragmentFramebufferRGBA8888OutputShaderID, OGLRef.fragmentFramebufferRGBA8888OutputShaderID,
OGLRef.programFramebufferRGBA8888OutputID[outColorIndex], OGLRef.programFramebufferRGBA8888OutputID,
vtxShaderCode.c_str(), vtxShaderCode.c_str(),
fragShaderCString); fragShaderCString);
if (error != OGLERROR_NOERR) if (error != OGLERROR_NOERR)
@ -3628,11 +3621,11 @@ Render3DError OpenGLRenderer_1_2::CreateFramebufferOutput8888Program(const size_
return error; return error;
} }
glBindAttribLocation(OGLRef.programFramebufferRGBA8888OutputID[outColorIndex], OGLVertexAttributeID_Position, "inPosition"); glBindAttribLocation(OGLRef.programFramebufferRGBA8888OutputID, OGLVertexAttributeID_Position, "inPosition");
glBindAttribLocation(OGLRef.programFramebufferRGBA8888OutputID[outColorIndex], OGLVertexAttributeID_TexCoord0, "inTexCoord0"); glBindAttribLocation(OGLRef.programFramebufferRGBA8888OutputID, OGLVertexAttributeID_TexCoord0, "inTexCoord0");
glLinkProgram(OGLRef.programFramebufferRGBA8888OutputID[outColorIndex]); glLinkProgram(OGLRef.programFramebufferRGBA8888OutputID);
if (!this->ValidateShaderProgramLink(OGLRef.programFramebufferRGBA8888OutputID[outColorIndex])) if (!this->ValidateShaderProgramLink(OGLRef.programFramebufferRGBA8888OutputID))
{ {
INFO("OpenGL: Failed to link the FRAMEBUFFER OUTPUT RGBA8888 shader program.\n"); INFO("OpenGL: Failed to link the FRAMEBUFFER OUTPUT RGBA8888 shader program.\n");
glUseProgram(0); glUseProgram(0);
@ -3640,17 +3633,19 @@ Render3DError OpenGLRenderer_1_2::CreateFramebufferOutput8888Program(const size_
return OGLERROR_SHADER_CREATE_ERROR; return OGLERROR_SHADER_CREATE_ERROR;
} }
glValidateProgram(OGLRef.programFramebufferRGBA8888OutputID[outColorIndex]); glValidateProgram(OGLRef.programFramebufferRGBA8888OutputID);
glUseProgram(OGLRef.programFramebufferRGBA8888OutputID[outColorIndex]); glUseProgram(OGLRef.programFramebufferRGBA8888OutputID);
const GLint uniformTexGColor = glGetUniformLocation(OGLRef.programFramebufferRGBA8888OutputID[outColorIndex], "texInFragColor"); const GLint uniformTexGColor = glGetUniformLocation(OGLRef.programFramebufferRGBA8888OutputID, "texInFragColor");
if (outColorIndex == 0) if (this->isFBOSupported)
{ {
glUniform1i(uniformTexGColor, OGLTextureUnitID_FinalColor); glUniform1i(uniformTexGColor, OGLTextureUnitID_GColor);
} }
else else
{ {
glUniform1i(uniformTexGColor, OGLTextureUnitID_GColor); // Reading back the output framebuffer without FBOs requires
// sampling from the working buffer.
glUniform1i(uniformTexGColor, OGLTextureUnitID_FinalColor);
} }
return OGLERROR_NOERR; return OGLERROR_NOERR;
@ -3665,20 +3660,12 @@ void OpenGLRenderer_1_2::DestroyFramebufferOutput8888Programs()
return; return;
} }
if (OGLRef.programFramebufferRGBA8888OutputID[0] != 0) if (OGLRef.programFramebufferRGBA8888OutputID != 0)
{ {
glDetachShader(OGLRef.programFramebufferRGBA8888OutputID[0], OGLRef.vertexFramebufferOutput8888ShaderID); glDetachShader(OGLRef.programFramebufferRGBA8888OutputID, OGLRef.vertexFramebufferOutput8888ShaderID);
glDetachShader(OGLRef.programFramebufferRGBA8888OutputID[0], OGLRef.fragmentFramebufferRGBA8888OutputShaderID); glDetachShader(OGLRef.programFramebufferRGBA8888OutputID, OGLRef.fragmentFramebufferRGBA8888OutputShaderID);
glDeleteProgram(OGLRef.programFramebufferRGBA8888OutputID[0]); glDeleteProgram(OGLRef.programFramebufferRGBA8888OutputID);
OGLRef.programFramebufferRGBA8888OutputID[0] = 0; OGLRef.programFramebufferRGBA8888OutputID = 0;
}
if (OGLRef.programFramebufferRGBA8888OutputID[1] != 0)
{
glDetachShader(OGLRef.programFramebufferRGBA8888OutputID[1], OGLRef.vertexFramebufferOutput8888ShaderID);
glDetachShader(OGLRef.programFramebufferRGBA8888OutputID[1], OGLRef.fragmentFramebufferRGBA8888OutputShaderID);
glDeleteProgram(OGLRef.programFramebufferRGBA8888OutputID[1]);
OGLRef.programFramebufferRGBA8888OutputID[1] = 0;
} }
glDeleteShader(OGLRef.vertexFramebufferOutput8888ShaderID); glDeleteShader(OGLRef.vertexFramebufferOutput8888ShaderID);
@ -3739,25 +3726,13 @@ Render3DError OpenGLRenderer_1_2::InitPostprocessingPrograms(const char *edgeMar
} }
} }
error = this->CreateFramebufferOutput6665Program(0, framebufferOutputVtxShaderCString, framebufferOutputRGBA6665FragShaderCString); error = this->CreateFramebufferOutput6665Program(framebufferOutputVtxShaderCString, framebufferOutputRGBA6665FragShaderCString);
if (error != OGLERROR_NOERR) if (error != OGLERROR_NOERR)
{ {
return error; return error;
} }
error = this->CreateFramebufferOutput6665Program(1, framebufferOutputVtxShaderCString, framebufferOutputRGBA6665FragShaderCString); error = this->CreateFramebufferOutput8888Program(framebufferOutputVtxShaderCString, framebufferOutputRGBA8888FragShaderCString);
if (error != OGLERROR_NOERR)
{
return error;
}
error = this->CreateFramebufferOutput8888Program(0, framebufferOutputVtxShaderCString, framebufferOutputRGBA8888FragShaderCString);
if (error != OGLERROR_NOERR)
{
return error;
}
error = this->CreateFramebufferOutput8888Program(1, framebufferOutputVtxShaderCString, framebufferOutputRGBA8888FragShaderCString);
if (error != OGLERROR_NOERR) if (error != OGLERROR_NOERR)
{ {
return error; return error;
@ -4126,32 +4101,17 @@ Render3DError OpenGLRenderer_1_2::ReadBackPixels()
// should be necessary at this point. // should be necessary at this point.
if (this->willFlipAndConvertFramebufferOnGPU) if (this->willFlipAndConvertFramebufferOnGPU)
{ {
const GLuint convertProgramID = (this->_outputFormat == NDSColorFormat_BGR666_Rev) ? OGLRef.programFramebufferRGBA6665OutputID : OGLRef.programFramebufferRGBA8888OutputID;
glUseProgram(convertProgramID);
if (this->isFBOSupported) if (this->isFBOSupported)
{ {
if (this->_lastTextureDrawTarget == OGLTextureUnitID_GColor) glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.fboRenderID);
{ glReadBuffer(OGL_WORKING_ATTACHMENT_ID);
const GLuint convertProgramID = (this->_outputFormat == NDSColorFormat_BGR666_Rev) ? OGLRef.programFramebufferRGBA6665OutputID[1] : OGLRef.programFramebufferRGBA8888OutputID[1]; glDrawBuffer(OGL_WORKING_ATTACHMENT_ID);
glUseProgram(convertProgramID);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.fboRenderID);
glReadBuffer(OGL_WORKING_ATTACHMENT_ID);
glDrawBuffer(OGL_WORKING_ATTACHMENT_ID);
this->_lastTextureDrawTarget = OGLTextureUnitID_FinalColor;
}
else
{
const GLuint convertProgramID = (this->_outputFormat == NDSColorFormat_BGR666_Rev) ? OGLRef.programFramebufferRGBA6665OutputID[0] : OGLRef.programFramebufferRGBA8888OutputID[0];
glUseProgram(convertProgramID);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, OGLRef.fboRenderID);
glReadBuffer(OGL_COLOROUT_ATTACHMENT_ID);
glDrawBuffer(OGL_COLOROUT_ATTACHMENT_ID);
this->_lastTextureDrawTarget = OGLTextureUnitID_GColor;
}
} }
else else
{ {
const GLuint convertProgramID = (this->_outputFormat == NDSColorFormat_BGR666_Rev) ? OGLRef.programFramebufferRGBA6665OutputID[0] : OGLRef.programFramebufferRGBA8888OutputID[0];
glUseProgram(convertProgramID);
glActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_FinalColor); glActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_FinalColor);
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, (GLsizei)this->_framebufferWidth, (GLsizei)this->_framebufferHeight); glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, (GLsizei)this->_framebufferWidth, (GLsizei)this->_framebufferHeight);
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
@ -4563,7 +4523,6 @@ Render3DError OpenGLRenderer_1_2::RenderGeometry()
if (!this->_willUseMultisampleShaders) if (!this->_willUseMultisampleShaders)
{ {
this->_ResolveGeometry(); this->_ResolveGeometry();
this->_lastTextureDrawTarget = OGLTextureUnitID_GColor;
} }
return OGLERROR_NOERR; return OGLERROR_NOERR;
@ -4716,7 +4675,6 @@ Render3DError OpenGLRenderer_1_2::EndRender()
if (this->_willUseMultisampleShaders) if (this->_willUseMultisampleShaders)
{ {
this->_ResolveFinalFramebuffer(); this->_ResolveFinalFramebuffer();
this->_lastTextureDrawTarget = OGLTextureUnitID_GColor;
} }
this->ReadBackPixels(); this->ReadBackPixels();
@ -5459,17 +5417,13 @@ Render3DError OpenGLRenderer_1_2::SetFramebufferSize(size_t w, size_t h)
if (OGLRef.readPixelsBestFormat == GL_BGRA) if (OGLRef.readPixelsBestFormat == GL_BGRA)
{ {
this->CreateFramebufferOutput6665Program(0, FramebufferOutputVtxShader_100, FramebufferOutputBGRA6665FragShader_100); this->CreateFramebufferOutput6665Program(FramebufferOutputVtxShader_100, FramebufferOutputBGRA6665FragShader_100);
this->CreateFramebufferOutput6665Program(1, FramebufferOutputVtxShader_100, FramebufferOutputBGRA6665FragShader_100); this->CreateFramebufferOutput8888Program(FramebufferOutputVtxShader_100, FramebufferOutputBGRA8888FragShader_100);
this->CreateFramebufferOutput8888Program(0, FramebufferOutputVtxShader_100, FramebufferOutputBGRA8888FragShader_100);
this->CreateFramebufferOutput8888Program(1, FramebufferOutputVtxShader_100, FramebufferOutputBGRA8888FragShader_100);
} }
else else
{ {
this->CreateFramebufferOutput6665Program(0, FramebufferOutputVtxShader_100, FramebufferOutputRGBA6665FragShader_100); this->CreateFramebufferOutput6665Program(FramebufferOutputVtxShader_100, FramebufferOutputRGBA6665FragShader_100);
this->CreateFramebufferOutput6665Program(1, FramebufferOutputVtxShader_100, FramebufferOutputRGBA6665FragShader_100); this->CreateFramebufferOutput8888Program(FramebufferOutputVtxShader_100, FramebufferOutputRGBA8888FragShader_100);
this->CreateFramebufferOutput8888Program(0, FramebufferOutputVtxShader_100, FramebufferOutputRGBA8888FragShader_100);
this->CreateFramebufferOutput8888Program(1, FramebufferOutputVtxShader_100, FramebufferOutputRGBA8888FragShader_100);
} }
} }

View File

@ -673,8 +673,8 @@ struct OGLRenderRef
GLuint fragmentFramebufferRGBA6665OutputShaderID; GLuint fragmentFramebufferRGBA6665OutputShaderID;
GLuint fragmentFramebufferRGBA8888OutputShaderID; GLuint fragmentFramebufferRGBA8888OutputShaderID;
GLuint programEdgeMarkID; GLuint programEdgeMarkID;
GLuint programFramebufferRGBA6665OutputID[2]; GLuint programFramebufferRGBA6665OutputID;
GLuint programFramebufferRGBA8888OutputID[2]; GLuint programFramebufferRGBA8888OutputID;
GLint uniformStateEnableFogAlphaOnly; GLint uniformStateEnableFogAlphaOnly;
GLint uniformStateClearPolyID; GLint uniformStateClearPolyID;
@ -891,7 +891,6 @@ protected:
bool _needsZeroDstAlphaPass; bool _needsZeroDstAlphaPass;
size_t _currentPolyIndex; size_t _currentPolyIndex;
bool _enableAlphaBlending; bool _enableAlphaBlending;
OGLTextureUnitID _lastTextureDrawTarget;
OGLGeometryFlags _geometryProgramFlags; OGLGeometryFlags _geometryProgramFlags;
OGLFogProgramKey _fogProgramKey; OGLFogProgramKey _fogProgramKey;
std::map<u32, OGLFogShaderID> _fogProgramMap; std::map<u32, OGLFogShaderID> _fogProgramMap;
@ -946,9 +945,9 @@ protected:
virtual Render3DError CreateFogProgram(const OGLFogProgramKey fogProgramKey, const bool isMultisample, const char *vtxShaderCString, const char *fragShaderCString) = 0; virtual Render3DError CreateFogProgram(const OGLFogProgramKey fogProgramKey, const bool isMultisample, const char *vtxShaderCString, const char *fragShaderCString) = 0;
virtual void DestroyFogProgram(const OGLFogProgramKey fogProgramKey) = 0; virtual void DestroyFogProgram(const OGLFogProgramKey fogProgramKey) = 0;
virtual void DestroyFogPrograms() = 0; virtual void DestroyFogPrograms() = 0;
virtual Render3DError CreateFramebufferOutput6665Program(const size_t outColorIndex, const char *vtxShaderCString, const char *fragShaderCString) = 0; virtual Render3DError CreateFramebufferOutput6665Program(const char *vtxShaderCString, const char *fragShaderCString) = 0;
virtual void DestroyFramebufferOutput6665Programs() = 0; virtual void DestroyFramebufferOutput6665Programs() = 0;
virtual Render3DError CreateFramebufferOutput8888Program(const size_t outColorIndex, const char *vtxShaderCString, const char *fragShaderCString) = 0; virtual Render3DError CreateFramebufferOutput8888Program(const char *vtxShaderCString, const char *fragShaderCString) = 0;
virtual void DestroyFramebufferOutput8888Programs() = 0; virtual void DestroyFramebufferOutput8888Programs() = 0;
virtual Render3DError InitFinalRenderStates(const std::set<std::string> *oglExtensionSet) = 0; virtual Render3DError InitFinalRenderStates(const std::set<std::string> *oglExtensionSet) = 0;
@ -1024,9 +1023,9 @@ protected:
virtual Render3DError CreateFogProgram(const OGLFogProgramKey fogProgramKey, const bool isMultisample, const char *vtxShaderCString, const char *fragShaderCString); virtual Render3DError CreateFogProgram(const OGLFogProgramKey fogProgramKey, const bool isMultisample, const char *vtxShaderCString, const char *fragShaderCString);
virtual void DestroyFogProgram(const OGLFogProgramKey fogProgramKey); virtual void DestroyFogProgram(const OGLFogProgramKey fogProgramKey);
virtual void DestroyFogPrograms(); virtual void DestroyFogPrograms();
virtual Render3DError CreateFramebufferOutput6665Program(const size_t outColorIndex, const char *vtxShaderCString, const char *fragShaderCString); virtual Render3DError CreateFramebufferOutput6665Program(const char *vtxShaderCString, const char *fragShaderCString);
virtual void DestroyFramebufferOutput6665Programs(); virtual void DestroyFramebufferOutput6665Programs();
virtual Render3DError CreateFramebufferOutput8888Program(const size_t outColorIndex, const char *vtxShaderCString, const char *fragShaderCString); virtual Render3DError CreateFramebufferOutput8888Program(const char *vtxShaderCString, const char *fragShaderCString);
virtual void DestroyFramebufferOutput8888Programs(); virtual void DestroyFramebufferOutput8888Programs();
virtual Render3DError InitFinalRenderStates(const std::set<std::string> *oglExtensionSet); virtual Render3DError InitFinalRenderStates(const std::set<std::string> *oglExtensionSet);

View File

@ -2201,7 +2201,7 @@ Render3DError OpenGLRenderer_3_2::CreateFogProgram(const OGLFogProgramKey fogPro
return OGLERROR_NOERR; return OGLERROR_NOERR;
} }
Render3DError OpenGLRenderer_3_2::CreateFramebufferOutput6665Program(const size_t outColorIndex, const char *vtxShaderCString, const char *fragShaderCString) Render3DError OpenGLRenderer_3_2::CreateFramebufferOutput6665Program(const char *vtxShaderCString, const char *fragShaderCString)
{ {
Render3DError error = OGLERROR_NOERR; Render3DError error = OGLERROR_NOERR;
OGLRenderRef &OGLRef = *this->ref; OGLRenderRef &OGLRef = *this->ref;
@ -2254,7 +2254,7 @@ Render3DError OpenGLRenderer_3_2::CreateFramebufferOutput6665Program(const size_
error = this->ShaderProgramCreate(OGLRef.vertexFramebufferOutput6665ShaderID, error = this->ShaderProgramCreate(OGLRef.vertexFramebufferOutput6665ShaderID,
OGLRef.fragmentFramebufferRGBA6665OutputShaderID, OGLRef.fragmentFramebufferRGBA6665OutputShaderID,
OGLRef.programFramebufferRGBA6665OutputID[outColorIndex], OGLRef.programFramebufferRGBA6665OutputID,
vtxShaderCode.c_str(), vtxShaderCode.c_str(),
fragShaderCode.c_str()); fragShaderCode.c_str());
if (error != OGLERROR_NOERR) if (error != OGLERROR_NOERR)
@ -2268,14 +2268,14 @@ Render3DError OpenGLRenderer_3_2::CreateFramebufferOutput6665Program(const size_
#if defined(GL_VERSION_3_0) #if defined(GL_VERSION_3_0)
if (!this->_isShaderFixedLocationSupported) if (!this->_isShaderFixedLocationSupported)
{ {
glBindAttribLocation(OGLRef.programFramebufferRGBA6665OutputID[outColorIndex], OGLVertexAttributeID_Position, "inPosition"); glBindAttribLocation(OGLRef.programFramebufferRGBA6665OutputID, OGLVertexAttributeID_Position, "inPosition");
glBindAttribLocation(OGLRef.programFramebufferRGBA6665OutputID[outColorIndex], OGLVertexAttributeID_TexCoord0, "inTexCoord0"); glBindAttribLocation(OGLRef.programFramebufferRGBA6665OutputID, OGLVertexAttributeID_TexCoord0, "inTexCoord0");
glBindFragDataLocation(OGLRef.programFramebufferRGBA6665OutputID[outColorIndex], 0, "outFragColor6665"); glBindFragDataLocation(OGLRef.programFramebufferRGBA6665OutputID, 0, "outFragColor6665");
} }
#endif #endif
glLinkProgram(OGLRef.programFramebufferRGBA6665OutputID[outColorIndex]); glLinkProgram(OGLRef.programFramebufferRGBA6665OutputID);
if (!this->ValidateShaderProgramLink(OGLRef.programFramebufferRGBA6665OutputID[outColorIndex])) if (!this->ValidateShaderProgramLink(OGLRef.programFramebufferRGBA6665OutputID))
{ {
INFO("OpenGL: Failed to link the FRAMEBUFFER OUTPUT RGBA6665 shader program.\n"); INFO("OpenGL: Failed to link the FRAMEBUFFER OUTPUT RGBA6665 shader program.\n");
glUseProgram(0); glUseProgram(0);
@ -2283,26 +2283,19 @@ Render3DError OpenGLRenderer_3_2::CreateFramebufferOutput6665Program(const size_
return OGLERROR_SHADER_CREATE_ERROR; return OGLERROR_SHADER_CREATE_ERROR;
} }
glValidateProgram(OGLRef.programFramebufferRGBA6665OutputID[outColorIndex]); glValidateProgram(OGLRef.programFramebufferRGBA6665OutputID);
glUseProgram(OGLRef.programFramebufferRGBA6665OutputID[outColorIndex]); glUseProgram(OGLRef.programFramebufferRGBA6665OutputID);
const GLint uniformTexGColor = glGetUniformLocation(OGLRef.programFramebufferRGBA6665OutputID[outColorIndex], "texInFragColor"); const GLint uniformTexGColor = glGetUniformLocation(OGLRef.programFramebufferRGBA6665OutputID, "texInFragColor");
if (outColorIndex == 0) glUniform1i(uniformTexGColor, OGLTextureUnitID_GColor);
{
glUniform1i(uniformTexGColor, OGLTextureUnitID_FinalColor);
}
else
{
glUniform1i(uniformTexGColor, OGLTextureUnitID_GColor);
}
return OGLERROR_NOERR; return OGLERROR_NOERR;
} }
Render3DError OpenGLRenderer_3_2::CreateFramebufferOutput8888Program(const size_t outColorIndex, const char *vtxShaderCString, const char *fragShaderCString) Render3DError OpenGLRenderer_3_2::CreateFramebufferOutput8888Program(const char *vtxShaderCString, const char *fragShaderCString)
{ {
OGLRenderRef &OGLRef = *this->ref; OGLRenderRef &OGLRef = *this->ref;
OGLRef.programFramebufferRGBA8888OutputID[outColorIndex] = 0; OGLRef.programFramebufferRGBA8888OutputID = 0;
OGLRef.vertexFramebufferOutput8888ShaderID = 0; OGLRef.vertexFramebufferOutput8888ShaderID = 0;
OGLRef.fragmentFramebufferRGBA8888OutputShaderID = 0; OGLRef.fragmentFramebufferRGBA8888OutputShaderID = 0;
@ -2507,24 +2500,10 @@ Render3DError OpenGLRenderer_3_2::ReadBackPixels()
{ {
// Both flips and converts the framebuffer on the GPU. No additional postprocessing // Both flips and converts the framebuffer on the GPU. No additional postprocessing
// should be necessary at this point. // should be necessary at this point.
if (this->_lastTextureDrawTarget == OGLTextureUnitID_GColor) glUseProgram(OGLRef.programFramebufferRGBA6665OutputID);
{ glBindFramebuffer(GL_FRAMEBUFFER, OGLRef.fboRenderID);
// Use the alternate program where the output color is not at index 0. glReadBuffer(OGL_WORKING_ATTACHMENT_ID);
glUseProgram(OGLRef.programFramebufferRGBA6665OutputID[1]); glDrawBuffer(OGL_WORKING_ATTACHMENT_ID);
glBindFramebuffer(GL_FRAMEBUFFER, OGLRef.fboRenderID);
glReadBuffer(OGL_WORKING_ATTACHMENT_ID);
glDrawBuffer(OGL_WORKING_ATTACHMENT_ID);
this->_lastTextureDrawTarget = OGLTextureUnitID_FinalColor;
}
else
{
// Use the program where the output color is from index 0.
glUseProgram(OGLRef.programFramebufferRGBA6665OutputID[0]);
glBindFramebuffer(GL_FRAMEBUFFER, OGLRef.fboRenderID);
glReadBuffer(OGL_COLOROUT_ATTACHMENT_ID);
glDrawBuffer(OGL_COLOROUT_ATTACHMENT_ID);
this->_lastTextureDrawTarget = OGLTextureUnitID_GColor;
}
glViewport(0, 0, (GLsizei)this->_framebufferWidth, (GLsizei)this->_framebufferHeight); glViewport(0, 0, (GLsizei)this->_framebufferWidth, (GLsizei)this->_framebufferHeight);
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
@ -2540,25 +2519,10 @@ Render3DError OpenGLRenderer_3_2::ReadBackPixels()
{ {
// Just flips the framebuffer in Y to match the coordinates of OpenGL and the NDS hardware. // Just flips the framebuffer in Y to match the coordinates of OpenGL and the NDS hardware.
glBindFramebuffer(GL_FRAMEBUFFER, OGLRef.fboRenderID); glBindFramebuffer(GL_FRAMEBUFFER, OGLRef.fboRenderID);
if (this->_lastTextureDrawTarget == OGLTextureUnitID_GColor) glReadBuffer(OGL_COLOROUT_ATTACHMENT_ID);
{ glDrawBuffer(OGL_WORKING_ATTACHMENT_ID);
glReadBuffer(OGL_COLOROUT_ATTACHMENT_ID); glBlitFramebuffer(0, (GLint)this->_framebufferHeight, (GLint)this->_framebufferWidth, 0, 0, 0, (GLint)this->_framebufferWidth, (GLint)this->_framebufferHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST);
glDrawBuffer(OGL_WORKING_ATTACHMENT_ID); glReadBuffer(OGL_WORKING_ATTACHMENT_ID);
glBlitFramebuffer(0, (GLint)this->_framebufferHeight, (GLint)this->_framebufferWidth, 0, 0, 0, (GLint)this->_framebufferWidth, (GLint)this->_framebufferHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST);
glReadBuffer(OGL_WORKING_ATTACHMENT_ID);
this->_lastTextureDrawTarget = OGLTextureUnitID_FinalColor;
}
else
{
glBindFramebuffer(GL_FRAMEBUFFER, OGLRef.fboRenderID);
glReadBuffer(OGL_WORKING_ATTACHMENT_ID);
glDrawBuffer(OGL_COLOROUT_ATTACHMENT_ID);
glBlitFramebuffer(0, (GLint)this->_framebufferHeight, (GLint)this->_framebufferWidth, 0, 0, 0, (GLint)this->_framebufferWidth, (GLint)this->_framebufferHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST);
glReadBuffer(OGL_COLOROUT_ATTACHMENT_ID);
this->_lastTextureDrawTarget = OGLTextureUnitID_GColor;
}
} }
// Read back the pixels in RGBA format, since an OpenGL 3.2 device should be able to read back this // Read back the pixels in RGBA format, since an OpenGL 3.2 device should be able to read back this
@ -3273,8 +3237,7 @@ Render3DError OpenGLRenderer_3_2::SetFramebufferSize(size_t w, size_t h)
this->DestroyFogPrograms(); this->DestroyFogPrograms();
} }
this->CreateFramebufferOutput6665Program(0, FramebufferOutputVtxShader_150, FramebufferOutput6665FragShader_150); this->CreateFramebufferOutput6665Program(FramebufferOutputVtxShader_150, FramebufferOutput6665FragShader_150);
this->CreateFramebufferOutput6665Program(1, FramebufferOutputVtxShader_150, FramebufferOutput6665FragShader_150);
// Call ResizeMultisampledFBOs() after _framebufferWidth and _framebufferHeight are set // Call ResizeMultisampledFBOs() after _framebufferWidth and _framebufferHeight are set
// since this method depends on them. // since this method depends on them.

View File

@ -90,8 +90,8 @@ protected:
virtual void DestroyMSGeometryZeroDstAlphaProgram(); virtual void DestroyMSGeometryZeroDstAlphaProgram();
virtual Render3DError CreateEdgeMarkProgram(const bool isMultisample, const char *vtxShaderCString, const char *fragShaderCString); virtual Render3DError CreateEdgeMarkProgram(const bool isMultisample, const char *vtxShaderCString, const char *fragShaderCString);
virtual Render3DError CreateFogProgram(const OGLFogProgramKey fogProgramKey, const bool isMultisample, const char *vtxShaderCString, const char *fragShaderCString); virtual Render3DError CreateFogProgram(const OGLFogProgramKey fogProgramKey, const bool isMultisample, const char *vtxShaderCString, const char *fragShaderCString);
virtual Render3DError CreateFramebufferOutput6665Program(const size_t outColorIndex, const char *vtxShaderCString, const char *fragShaderCString); virtual Render3DError CreateFramebufferOutput6665Program(const char *vtxShaderCString, const char *fragShaderCString);
virtual Render3DError CreateFramebufferOutput8888Program(const size_t outColorIndex, const char *vtxShaderCString, const char *fragShaderCString); virtual Render3DError CreateFramebufferOutput8888Program(const char *vtxShaderCString, const char *fragShaderCString);
virtual void GetExtensionSet(std::set<std::string> *oglExtensionSet); virtual void GetExtensionSet(std::set<std::string> *oglExtensionSet);
virtual void _SetupGeometryShaders(const OGLGeometryFlags flags); virtual void _SetupGeometryShaders(const OGLGeometryFlags flags);

View File

@ -932,7 +932,7 @@ Render3DError OpenGLESRenderer_3_0::CreateFogProgram(const OGLFogProgramKey fogP
return OGLERROR_NOERR; return OGLERROR_NOERR;
} }
Render3DError OpenGLESRenderer_3_0::CreateFramebufferOutput6665Program(const size_t outColorIndex, const char *vtxShaderCString, const char *fragShaderCString) Render3DError OpenGLESRenderer_3_0::CreateFramebufferOutput6665Program(const char *vtxShaderCString, const char *fragShaderCString)
{ {
Render3DError error = OGLERROR_NOERR; Render3DError error = OGLERROR_NOERR;
OGLRenderRef &OGLRef = *this->ref; OGLRenderRef &OGLRef = *this->ref;
@ -964,7 +964,7 @@ Render3DError OpenGLESRenderer_3_0::CreateFramebufferOutput6665Program(const siz
error = this->ShaderProgramCreate(OGLRef.vertexFramebufferOutput6665ShaderID, error = this->ShaderProgramCreate(OGLRef.vertexFramebufferOutput6665ShaderID,
OGLRef.fragmentFramebufferRGBA6665OutputShaderID, OGLRef.fragmentFramebufferRGBA6665OutputShaderID,
OGLRef.programFramebufferRGBA6665OutputID[outColorIndex], OGLRef.programFramebufferRGBA6665OutputID,
vtxShaderCode.c_str(), vtxShaderCode.c_str(),
fragShaderCode.c_str()); fragShaderCode.c_str());
if (error != OGLERROR_NOERR) if (error != OGLERROR_NOERR)
@ -975,8 +975,8 @@ Render3DError OpenGLESRenderer_3_0::CreateFramebufferOutput6665Program(const siz
return error; return error;
} }
glLinkProgram(OGLRef.programFramebufferRGBA6665OutputID[outColorIndex]); glLinkProgram(OGLRef.programFramebufferRGBA6665OutputID);
if (!this->ValidateShaderProgramLink(OGLRef.programFramebufferRGBA6665OutputID[outColorIndex])) if (!this->ValidateShaderProgramLink(OGLRef.programFramebufferRGBA6665OutputID))
{ {
INFO("OpenGL ES: Failed to link the FRAMEBUFFER OUTPUT RGBA6665 shader program.\n"); INFO("OpenGL ES: Failed to link the FRAMEBUFFER OUTPUT RGBA6665 shader program.\n");
glUseProgram(0); glUseProgram(0);
@ -984,18 +984,11 @@ Render3DError OpenGLESRenderer_3_0::CreateFramebufferOutput6665Program(const siz
return OGLERROR_SHADER_CREATE_ERROR; return OGLERROR_SHADER_CREATE_ERROR;
} }
glValidateProgram(OGLRef.programFramebufferRGBA6665OutputID[outColorIndex]); glValidateProgram(OGLRef.programFramebufferRGBA6665OutputID);
glUseProgram(OGLRef.programFramebufferRGBA6665OutputID[outColorIndex]); glUseProgram(OGLRef.programFramebufferRGBA6665OutputID);
const GLint uniformTexGColor = glGetUniformLocation(OGLRef.programFramebufferRGBA6665OutputID[outColorIndex], "texInFragColor"); const GLint uniformTexGColor = glGetUniformLocation(OGLRef.programFramebufferRGBA6665OutputID, "texInFragColor");
if (outColorIndex == 0) glUniform1i(uniformTexGColor, OGLTextureUnitID_GColor);
{
glUniform1i(uniformTexGColor, OGLTextureUnitID_FinalColor);
}
else
{
glUniform1i(uniformTexGColor, OGLTextureUnitID_GColor);
}
return OGLERROR_NOERR; return OGLERROR_NOERR;
} }

View File

@ -48,7 +48,7 @@ protected:
virtual Render3DError CreateGeometryZeroDstAlphaProgram(const char *vtxShaderCString, const char *fragShaderCString); virtual Render3DError CreateGeometryZeroDstAlphaProgram(const char *vtxShaderCString, const char *fragShaderCString);
virtual Render3DError CreateEdgeMarkProgram(const bool isMultisample, const char *vtxShaderCString, const char *fragShaderCString); virtual Render3DError CreateEdgeMarkProgram(const bool isMultisample, const char *vtxShaderCString, const char *fragShaderCString);
virtual Render3DError CreateFogProgram(const OGLFogProgramKey fogProgramKey, const bool isMultisample, const char *vtxShaderCString, const char *fragShaderCString); virtual Render3DError CreateFogProgram(const OGLFogProgramKey fogProgramKey, const bool isMultisample, const char *vtxShaderCString, const char *fragShaderCString);
virtual Render3DError CreateFramebufferOutput6665Program(const size_t outColorIndex, const char *vtxShaderCString, const char *fragShaderCString); virtual Render3DError CreateFramebufferOutput6665Program(const char *vtxShaderCString, const char *fragShaderCString);
public: public:
OpenGLESRenderer_3_0(); OpenGLESRenderer_3_0();