Skip to content

Commit

Permalink
Ensure the correct FBO is bound when drawing. (Fixes bug #5791.)
Browse files Browse the repository at this point in the history
  • Loading branch information
SmileTheory committed Oct 30, 2012
1 parent c428850 commit 262e8e9
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 14 deletions.
18 changes: 13 additions & 5 deletions code/rend2/tr_backend.c
Expand Up @@ -482,9 +482,17 @@ void RB_BeginDrawingView (void) {
if (glRefConfig.framebufferObject)
{
// FIXME: HUGE HACK: render to the screen fbo if we've already postprocessed the frame and aren't drawing more world
if (backEnd.viewParms.targetFbo == tr.renderFbo && backEnd.framePostProcessed && (backEnd.refdef.rdflags & RDF_NOWORLDMODEL))
// drawing more world check is in case of double renders, such as skyportals
if (backEnd.viewParms.targetFbo == NULL)
{
FBO_Bind(tr.screenScratchFbo);
if (backEnd.framePostProcessed && (backEnd.refdef.rdflags & RDF_NOWORLDMODEL))
{
FBO_Bind(tr.screenScratchFbo);
}
else
{
FBO_Bind(tr.renderFbo);
}
}
else
{
Expand Down Expand Up @@ -949,7 +957,7 @@ void RE_StretchRaw (int x, int y, int w, int h, int cols, int rows, const byte *
}

// FIXME: HUGE hack
if (glRefConfig.framebufferObject && !glState.currentFBO)
if (glRefConfig.framebufferObject)
{
if (backEnd.framePostProcessed)
{
Expand Down Expand Up @@ -1092,7 +1100,7 @@ const void *RB_StretchPic ( const void *data ) {
cmd = (const stretchPicCommand_t *)data;

// FIXME: HUGE hack
if (glRefConfig.framebufferObject && !glState.currentFBO)
if (glRefConfig.framebufferObject)
{
if (backEnd.framePostProcessed)
{
Expand Down Expand Up @@ -1570,7 +1578,7 @@ const void *RB_ClearDepth(const void *data)

if (glRefConfig.framebufferObject)
{
if (backEnd.framePostProcessed && (backEnd.refdef.rdflags & RDF_NOWORLDMODEL))
if (backEnd.framePostProcessed)
{
FBO_Bind(tr.screenScratchFbo);
}
Expand Down
24 changes: 20 additions & 4 deletions code/rend2/tr_fbo.c
Expand Up @@ -661,6 +661,8 @@ void FBO_BlitFromTexture(struct image_s *src, vec4i_t inSrcBox, vec2_t inSrcTexS
vec2_t texCoords[4];
vec2_t invTexRes;
FBO_t *oldFbo = glState.currentFBO;
matrix_t projection;
int width, height;

if (!src)
return;
Expand Down Expand Up @@ -726,11 +728,25 @@ void FBO_BlitFromTexture(struct image_s *src, vec4i_t inSrcBox, vec2_t inSrcTexS

FBO_Bind(dst);

RB_SetGL2D();
if (glState.currentFBO)
{
width = glState.currentFBO->width;
height = glState.currentFBO->height;
}
else
{
width = glConfig.vidWidth;
height = glConfig.vidHeight;
}

qglViewport( 0, 0, width, height );
qglScissor( 0, 0, width, height );

Matrix16Ortho(0, width, height, 0, 0, 1, projection);

GL_SelectTexture(TB_COLORMAP);
qglDisable( GL_CULL_FACE );

GL_Bind(src);
GL_BindToTMU(src, TB_COLORMAP);

VectorSet4(quadVerts[0], dstBox[0], dstBox[1], 0, 1);
VectorSet4(quadVerts[1], dstBox[2], dstBox[1], 0, 1);
Expand All @@ -749,7 +765,7 @@ void FBO_BlitFromTexture(struct image_s *src, vec4i_t inSrcBox, vec2_t inSrcTexS

GLSL_BindProgram(shaderProgram);

GLSL_SetUniformMatrix16(shaderProgram, TEXTURECOLOR_UNIFORM_MODELVIEWPROJECTIONMATRIX, glState.modelviewProjection);
GLSL_SetUniformMatrix16(shaderProgram, TEXTURECOLOR_UNIFORM_MODELVIEWPROJECTIONMATRIX, projection);
GLSL_SetUniformVec4(shaderProgram, TEXTURECOLOR_UNIFORM_COLOR, color);
GLSL_SetUniformVec2(shaderProgram, TEXTURECOLOR_UNIFORM_INVTEXRES, invTexRes);
GLSL_SetUniformVec2(shaderProgram, TEXTURECOLOR_UNIFORM_AUTOEXPOSUREMINMAX, tr.refdef.autoExposureMinMax);
Expand Down
5 changes: 0 additions & 5 deletions code/rend2/tr_scene.c
Expand Up @@ -507,11 +507,6 @@ void RE_RenderScene( const refdef_t *fd ) {

parms.stereoFrame = tr.refdef.stereoFrame;

if (glRefConfig.framebufferObject)
{
parms.targetFbo = tr.renderFbo;
}

VectorCopy( fd->vieworg, parms.or.origin );
VectorCopy( fd->viewaxis[0], parms.or.axis[0] );
VectorCopy( fd->viewaxis[1], parms.or.axis[1] );
Expand Down

0 comments on commit 262e8e9

Please sign in to comment.