OpenGL Renderer: Add support for Fog, Edge Mark, and on-GPU framebuffer color conversion for ancient GPUs that have support for shaders and FBOs, but lack support for GL_EXT_framebuffer_blit.

This commit is contained in:
rogerman 2024-07-14 19:38:29 -07:00
parent de62116cc8
commit 15a6e51739
4 changed files with 21 additions and 11 deletions

View File

@ -1269,6 +1269,7 @@ OpenGLRenderer::OpenGLRenderer()
isVBOSupported = false; isVBOSupported = false;
isPBOSupported = false; isPBOSupported = false;
isFBOSupported = false; isFBOSupported = false;
_isFBOBlitSupported = false;
isMultisampledFBOSupported = false; isMultisampledFBOSupported = false;
isShaderSupported = false; isShaderSupported = false;
isVAOSupported = false; isVAOSupported = false;
@ -2586,9 +2587,8 @@ Render3DError OpenGLRenderer_1_2::InitExtensions()
} }
// Don't use ARB versions since we're using the EXT versions for backwards compatibility. // Don't use ARB versions since we're using the EXT versions for backwards compatibility.
this->isFBOSupported = this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_object") && this->isFBOSupported = this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_object") &&
this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_blit") && this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_packed_depth_stencil");
this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_packed_depth_stencil");
if (this->isFBOSupported) if (this->isFBOSupported)
{ {
GLint maxColorAttachments = 0; GLint maxColorAttachments = 0;
@ -2614,11 +2614,18 @@ Render3DError OpenGLRenderer_1_2::InitExtensions()
INFO("OpenGL: FBOs are unsupported. Some emulation features will be disabled.\n"); INFO("OpenGL: FBOs are unsupported. Some emulation features will be disabled.\n");
} }
this->_isFBOBlitSupported = this->isFBOSupported &&
this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_blit");
if (!this->_isFBOBlitSupported)
{
INFO("OpenGL: FBO blitting is unsupported. Some emulation features will be disabled.\n");
}
this->_selectedMultisampleSize = CommonSettings.GFX3D_Renderer_MultisampleSize; this->_selectedMultisampleSize = CommonSettings.GFX3D_Renderer_MultisampleSize;
// Don't use ARB versions since we're using the EXT versions for backwards compatibility. // Don't use ARB versions since we're using the EXT versions for backwards compatibility.
this->isMultisampledFBOSupported = this->isFBOSupported && this->isMultisampledFBOSupported = this->_isFBOBlitSupported &&
this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_multisample"); this->IsExtensionPresent(&oglExtensionSet, "GL_EXT_framebuffer_multisample");
if (this->isMultisampledFBOSupported) if (this->isMultisampledFBOSupported)
{ {
GLint maxSamplesOGL = 0; GLint maxSamplesOGL = 0;
@ -2744,7 +2751,7 @@ Render3DError OpenGLRenderer_1_2::InitExtensions()
// Set rendering support flags based on driver features. // Set rendering support flags based on driver features.
this->willFlipAndConvertFramebufferOnGPU = this->isShaderSupported && this->isVBOSupported; this->willFlipAndConvertFramebufferOnGPU = this->isShaderSupported && this->isVBOSupported;
this->willFlipOnlyFramebufferOnGPU = this->willFlipAndConvertFramebufferOnGPU || this->isFBOSupported; this->willFlipOnlyFramebufferOnGPU = this->willFlipAndConvertFramebufferOnGPU || this->_isFBOBlitSupported;
this->_deviceInfo.isEdgeMarkSupported = this->isShaderSupported && this->isVBOSupported && this->isFBOSupported; this->_deviceInfo.isEdgeMarkSupported = this->isShaderSupported && this->isVBOSupported && this->isFBOSupported;
this->_deviceInfo.isFogSupported = this->isShaderSupported && this->isVBOSupported && this->isFBOSupported; this->_deviceInfo.isFogSupported = this->isShaderSupported && this->isVBOSupported && this->isFBOSupported;
this->_deviceInfo.isTextureSmoothingSupported = this->isShaderSupported; this->_deviceInfo.isTextureSmoothingSupported = this->isShaderSupported;
@ -4797,7 +4804,7 @@ Render3DError OpenGLRenderer_1_2::EndRender()
Render3DError OpenGLRenderer_1_2::ClearUsingImage(const u16 *__restrict colorBuffer, const u32 *__restrict depthBuffer, const u8 *__restrict fogBuffer, const u8 opaquePolyID) Render3DError OpenGLRenderer_1_2::ClearUsingImage(const u16 *__restrict colorBuffer, const u32 *__restrict depthBuffer, const u8 *__restrict fogBuffer, const u8 opaquePolyID)
{ {
if (!this->isFBOSupported) if (!this->isFBOSupported || !this->_isFBOBlitSupported)
{ {
return OGLERROR_FEATURE_UNSUPPORTED; return OGLERROR_FEATURE_UNSUPPORTED;
} }
@ -5490,7 +5497,7 @@ Render3DError OpenGLRenderer_1_2::SetFramebufferSize(size_t w, size_t h)
if (this->isShaderSupported || this->isFBOSupported) if (this->isShaderSupported || this->isFBOSupported)
{ {
glActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_FinalColor); glActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_FinalColor);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)w, (GLsizei)h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, (GLsizei)w, (GLsizei)h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
} }
if (this->isFBOSupported) if (this->isFBOSupported)
@ -5499,13 +5506,13 @@ Render3DError OpenGLRenderer_1_2::SetFramebufferSize(size_t w, size_t h)
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8_EXT, (GLsizei)w, (GLsizei)h, 0, GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, NULL); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8_EXT, (GLsizei)w, (GLsizei)h, 0, GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, NULL);
glActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_GColor); glActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_GColor);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)w, (GLsizei)h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, (GLsizei)w, (GLsizei)h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_GPolyID); glActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_GPolyID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)w, (GLsizei)h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, (GLsizei)w, (GLsizei)h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_FogAttr); glActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_FogAttr);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)w, (GLsizei)h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, (GLsizei)w, (GLsizei)h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
} }
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);

View File

@ -811,6 +811,7 @@ protected:
bool isVBOSupported; bool isVBOSupported;
bool isPBOSupported; bool isPBOSupported;
bool isFBOSupported; bool isFBOSupported;
bool _isFBOBlitSupported;
bool isMultisampledFBOSupported; bool isMultisampledFBOSupported;
bool isShaderSupported; bool isShaderSupported;
bool isVAOSupported; bool isVAOSupported;

View File

@ -807,6 +807,7 @@ Render3DError OpenGLRenderer_3_2::InitExtensions()
return error; return error;
} }
this->_isFBOBlitSupported = true;
this->isMultisampledFBOSupported = true; this->isMultisampledFBOSupported = true;
this->_selectedMultisampleSize = CommonSettings.GFX3D_Renderer_MultisampleSize; this->_selectedMultisampleSize = CommonSettings.GFX3D_Renderer_MultisampleSize;

View File

@ -387,6 +387,7 @@ Render3DError OpenGLESRenderer_3_0::InitExtensions()
return error; return error;
} }
this->_isFBOBlitSupported = true;
this->isMultisampledFBOSupported = true; this->isMultisampledFBOSupported = true;
this->_selectedMultisampleSize = CommonSettings.GFX3D_Renderer_MultisampleSize; this->_selectedMultisampleSize = CommonSettings.GFX3D_Renderer_MultisampleSize;