Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/engine/renderer/GLUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ struct GLConfig
int max3DTextureSize;
int maxCubeMapTextureSize;
int maxTextureUnits;
int maxColorTextureSamples;
int maxDepthTextureSamples;

char shadingLanguageVersionString[MAX_STRING_CHARS];
int shadingLanguageVersion;
Expand Down Expand Up @@ -153,6 +155,7 @@ struct GLConfig
bool reflectionMappingAvailable;
bool reflectionMapping;
bool bloom;
int MSAA; // 0 == disabled, otherwise used as sample count
bool ssao;
bool motionBlur;
};
Expand Down
4 changes: 4 additions & 0 deletions src/engine/renderer/Material.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1062,6 +1062,8 @@ void BindShaderHeatHaze( Material* material ) {
gl_heatHazeShaderMaterial->SetUniform_DeformEnable( true );

// draw to background image
TransitionMSAAToMain( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

R_BindFBO( tr.mainFBO[1 - backEnd.currentMainFBO] );
}

Expand Down Expand Up @@ -2228,6 +2230,8 @@ void MaterialSystem::RenderMaterial( Material& material, const uint32_t viewID )
R_BindFBO( tr.mainFBO[backEnd.currentMainFBO] );

RenderIndirect( material, viewID );

TransitionMainToMSAA( GL_COLOR_BUFFER_BIT );
}

if ( r_showTris->integer
Expand Down
75 changes: 72 additions & 3 deletions src/engine/renderer/tr_backend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,47 @@ GLuint64 GL_BindToTMU( int unit, image_t *image )
return 0;
}

static void BlitFBOToMSAA( FBO_t* fbo, const GLbitfield mask ) {
R_BindFBO( GL_READ_FRAMEBUFFER, fbo );
R_BindFBO( GL_DRAW_FRAMEBUFFER, tr.msaaFBO );
glBlitFramebuffer( 0, 0, fbo->width, fbo->height, 0, 0, tr.msaaFBO->width, tr.msaaFBO->height,
mask, GL_NEAREST );

R_BindFBO( GL_DRAW_FRAMEBUFFER, fbo );
glState.currentFBO = fbo;
}

static void BlitMSAAToFBO( FBO_t* fbo, const GLbitfield mask ) {
R_BindFBO( GL_READ_FRAMEBUFFER, tr.msaaFBO );
R_BindFBO( GL_DRAW_FRAMEBUFFER, fbo );
glBlitFramebuffer( 0, 0, tr.msaaFBO->width, tr.msaaFBO->height, 0, 0, fbo->width, fbo->height,
mask, GL_NEAREST );

R_BindFBO( GL_READ_FRAMEBUFFER, fbo );
glState.currentFBO = fbo;
}

void TransitionMainToMSAA( const GLbitfield mask ) {
if ( glConfig.MSAA ) {
BlitFBOToMSAA( tr.mainFBO[backEnd.currentMainFBO], mask );
R_BindFBO( tr.msaaFBO );
}
}

void TransitionMSAAToMain( const GLbitfield mask ) {
if ( glConfig.MSAA ) {
BlitMSAAToFBO( tr.mainFBO[backEnd.currentMainFBO], mask );
}
}

void BindMSAAOrMainFBO() {
if ( glConfig.MSAA ) {
R_BindFBO( tr.msaaFBO );
} else {
R_BindFBO( tr.mainFBO[backEnd.currentMainFBO] );
}
}

void GL_BlendFunc( GLenum sfactor, GLenum dfactor )
{
if ( glState.blendSrc != ( signed ) sfactor || glState.blendDst != ( signed ) dfactor )
Expand Down Expand Up @@ -797,7 +838,13 @@ void GL_TexImage2D( GLenum target, GLint level, GLint internalFormat, GLsizei wi
GLint finalFormat = GL_ToSRGB( internalFormat, isSRGB );

glTexImage2D( target, level, finalFormat, width, height, border, format, type, data );
}

void GL_TexImage2DMultisample( GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, bool fixedSampleLocations, bool isSRGB )
{
GLint finalFormat = GL_ToSRGB( internalFormat, isSRGB );

glTexImage2DMultisample( target, samples, finalFormat, width, height, fixedSampleLocations );
}

void GL_TexImage3D( GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *data, bool isSRGB )
Expand Down Expand Up @@ -1256,6 +1303,8 @@ static void RenderDepthTiles()
{
RB_PrepareForSamplingDepthMap();
}

TransitionMSAAToMain( GL_DEPTH_BUFFER_BIT );

// 1st step
R_BindFBO( tr.depthtile1FBO );
Expand Down Expand Up @@ -1365,7 +1414,8 @@ void RB_RenderPostDepthLightTile()
Tess_Clear();

// back to main image
R_BindFBO( tr.mainFBO[ backEnd.currentMainFBO ] );
BindMSAAOrMainFBO();

GL_Viewport( backEnd.viewParms.viewportX, backEnd.viewParms.viewportY,
backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight );
GL_Scissor( backEnd.viewParms.scissorX, backEnd.viewParms.scissorY,
Expand Down Expand Up @@ -1446,6 +1496,8 @@ void RB_RenderBloom()
GL_BindToTMU( 0, tr.currentRenderImage[backEnd.currentMainFBO] )
);

TransitionMSAAToMain( GL_COLOR_BUFFER_BIT );

R_BindFBO( tr.contrastRenderFBO );
GL_ClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
glClear( GL_COLOR_BUFFER_BIT );
Expand Down Expand Up @@ -1510,6 +1562,8 @@ void RB_RenderBloom()
GL_PopMatrix();
}

TransitionMainToMSAA( GL_COLOR_BUFFER_BIT );

GL_CheckErrors();
}

Expand All @@ -1530,6 +1584,8 @@ void RB_RenderMotionBlur()

gl_motionblurShader->BindProgram();

TransitionMSAAToMain( GL_COLOR_BUFFER_BIT );

// Swap main FBOs
gl_motionblurShader->SetUniform_ColorMapBindless(
GL_BindToTMU( 0, tr.currentRenderImage[backEnd.currentMainFBO] )
Expand All @@ -1545,6 +1601,8 @@ void RB_RenderMotionBlur()

Tess_InstantScreenSpaceQuad();

TransitionMainToMSAA( GL_COLOR_BUFFER_BIT );

GL_CheckErrors();
}

Expand All @@ -1565,6 +1623,8 @@ void RB_RenderSSAO()

RB_PrepareForSamplingDepthMap();

TransitionMSAAToMain( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_DST_COLOR | GLS_DSTBLEND_ZERO );
GL_Cull( cullType_t::CT_TWO_SIDED );

Expand Down Expand Up @@ -1596,6 +1656,8 @@ void RB_RenderSSAO()

Tess_InstantScreenSpaceQuad();

TransitionMainToMSAA( GL_COLOR_BUFFER_BIT );

GL_CheckErrors();
}

Expand Down Expand Up @@ -2666,7 +2728,7 @@ static void RB_RenderView( bool depthPass )
backEnd.pc.c_surfaces += backEnd.viewParms.numDrawSurfs;

// disable offscreen rendering
R_BindFBO( tr.mainFBO[ backEnd.currentMainFBO ] );
BindMSAAOrMainFBO();

// we will need to change the projection matrix before drawing
// 2D images again
Expand Down Expand Up @@ -2794,6 +2856,8 @@ static void RB_RenderPostProcess()
materialSystem.EndFrame();
}

TransitionMSAAToMain( GL_COLOR_BUFFER_BIT );

RB_FXAA();

// render chromatic aberration
Expand Down Expand Up @@ -3428,7 +3492,7 @@ const RenderCommand *ClearBufferCommand::ExecuteSelf( ) const
}

// disable offscreen rendering
R_BindFBO( tr.mainFBO[ backEnd.currentMainFBO ] );
R_BindFBO( tr.mainFBO[backEnd.currentMainFBO] );

// we will need to change the projection matrix before drawing
// 2D images again
Expand All @@ -3449,6 +3513,11 @@ const RenderCommand *ClearBufferCommand::ExecuteSelf( ) const

glClear( clearBits );

if ( glConfig.MSAA ) {
R_BindFBO( tr.msaaFBO );
glClear( clearBits );
}

return this + 1;
}

Expand Down
16 changes: 15 additions & 1 deletion src/engine/renderer/tr_fbo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,8 @@ R_AttachFBOTexture2D
*/
void R_AttachFBOTexture2D( int target, int texId, int index )
{
if ( target != GL_TEXTURE_2D && ( target < GL_TEXTURE_CUBE_MAP_POSITIVE_X || target > GL_TEXTURE_CUBE_MAP_NEGATIVE_Z ) )
if ( target != GL_TEXTURE_2D && target != GL_TEXTURE_2D_MULTISAMPLE
&& ( target < GL_TEXTURE_CUBE_MAP_POSITIVE_X || target > GL_TEXTURE_CUBE_MAP_NEGATIVE_Z ) )
{
Log::Warn("R_AttachFBOTexture2D: invalid target %i", target );
return;
Expand Down Expand Up @@ -194,6 +195,11 @@ void R_AttachFBOTexturePackedDepthStencil( int texId )
GL_fboShim.glFramebufferTexture2D( GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, texId, 0 );
}

void R_AttachFBOTexturePackedDepthStencilMSAA( int texId ) {
GL_fboShim.glFramebufferTexture2D( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE, texId, 0 );
GL_fboShim.glFramebufferTexture2D( GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE, texId, 0 );
}

/*
============
R_BindFBO
Expand Down Expand Up @@ -271,6 +277,14 @@ void R_InitFBOs()
glConfig.usingReadonlyDepth = R_CheckFBO( tr.readonlyDepthFBO );
}

if ( glConfig.MSAA ) {
tr.msaaFBO = R_CreateFBO( "msaa", width, height );
R_BindFBO( tr.msaaFBO );
R_AttachFBOTexture2D( GL_TEXTURE_2D_MULTISAMPLE, tr.currentRenderImageMSAA->texnum, 0 );
R_AttachFBOTexturePackedDepthStencilMSAA( tr.currentDepthImageMSAA->texnum );
R_CheckFBO( tr.msaaFBO );
}

if ( glConfig.realtimeLighting )
{
/* It's only required to create frame buffers only used by the
Expand Down
Loading
Loading