Bug #898

Shadows under Linux

Added by kervala about 5 years ago. Updated almost 5 years ago.

Status:Closed Start date:05/13/2010
Priority:High Due date:
Assignee:kervala % Done:

100%

Category:OS: GNU/Linux
Target version:Version 0.8.0

Description

Shadows are bugging under Linux (big dark blocks).

Check what could change from Windows version.

History

#1 Updated by jayme about 5 years ago

If you enable bloom, the shadows look normal.

#2 Updated by kervala about 5 years ago

Thanks a lot ! So it could be related to bloom code :)

#3 Updated by Krolock about 5 years ago

hm, if I enable bloom, it doesn't change anything. I have still these dark blocks.

#4 Updated by kervala about 5 years ago

Bug seems to be located in driver_opengl_texture.cpp and most precisely in setRenderTarget.

We already had a bug with shadows when bloom was implemented so this part was fixed, but I suspect there is another bug in this method.

Previous code (which was not working properly with bloom) :

 1bool CDriverGL::setRenderTarget (ITexture *tex, uint32 x, uint32 y, uint32 width, uint32 height, uint32 mipmapLevel, uint32 cubeFace)
 2{
 3        H_AUTO_OGL(CDriverGL_setRenderTarget )
 4
 5        // Check the texture is a render target
 6        if (tex)
 7                nlassertex (tex->getRenderTarget(), ("The texture must be a render target. Call ITexture::setRenderTarget(true)."));
 8
 9        _RenderTargetFBO = supportFrameBufferObject();
10        _RenderTargetPackedDepthStencil = supportPackedDepthStencil();
11
12        // make backup of offscreen buffer to old texture if not using FBOs
13        if (!_RenderTargetFBO && _TextureTarget && (_TextureTarget != tex || _TextureTargetCubeFace != cubeFace) && _TextureTargetUpload)
14        {
15                // Flush it
16                copyFrameBufferToTexture (_TextureTarget, _TextureTargetLevel, _TextureTargetX, _TextureTargetY, 0,
17                        0, _TextureTargetWidth, _TextureTargetHeight, _TextureTargetCubeFace);
18        }
19
20        // Backup the texture
21        _TextureTarget = tex;
22
23        // Set a new texture as render target
24        if (tex)
25        {
26                // Backup the parameters
27                _TextureTargetLevel = mipmapLevel;
28                _TextureTargetX = x;
29                _TextureTargetY = y;
30                _TextureTargetWidth = width;
31                _TextureTargetHeight = height;
32                _TextureTargetUpload = true;
33                _TextureTargetCubeFace = cubeFace;
34
35                if (_RenderTargetFBO)
36                {
37                        uint32 w, h;
38                        getWindowSize(w, h);
39
40                        getViewport(_OldViewport);
41                        CViewport newVP;
42                        newVP.init(0, 0, ((float)width/(float)w), ((float)height/(float)h));
43                        setupViewport(newVP);
44                        setupScissor(_CurrScissor);
45                        if (!tex->TextureDrvShare)
46                                setupTexture(*tex);
47                        return activeFrameBufferObject(tex);
48                }
49                else
50                {
51                        // Update the viewport
52                        setupViewport (_CurrViewport);
53                        // Update the scissor
54                        setupScissor (_CurrScissor);
55                        //_RenderTargetFBO = false;
56                        _OldViewport = _CurrViewport;
57                }
58        }
59        else
60        {
61                if (_RenderTargetFBO)
62                        activeFrameBufferObject(NULL);
63                setupViewport(_OldViewport);
64                setupScissor(_CurrScissor);
65                _OldViewport = _CurrViewport;
66                _RenderTargetFBO = false;
67        }
68
69        return true;
70}

#5 Updated by vl about 5 years ago

  • Status changed from Validated to Assigned
  • Assignee set to kervala
  • Target version set to Version 0.8.0

#6 Updated by kervala about 5 years ago

Oldest version I found :

 1bool CDriverGL::setRenderTarget (ITexture *tex, uint32 x, uint32 y, uint32 width, uint32 height, uint32 mipmapLevel, uint32 cubeFace)
 2{
 3    H_AUTO_OGL(CDriverGL_setRenderTarget )
 4
 5    // Check the texture is a render target
 6    if (tex)
 7        nlassertex (tex->getRenderTarget(), ("The texture must be a render target. Call ITexture::setRenderTarget(true)."));
 8
 9    if(tex==NULL && _RenderTargetFBO)
10    {
11        activeFrameBufferObject(NULL);
12        setupViewport(_OldViewport);
13        _OldViewport = _CurrViewport;
14
15        _RenderTargetFBO = false;
16        return false;
17    }
18    else if(tex && tex->isBloomTexture() && supportBloomEffect()) //  && activeFrameBufferObject(tex)
19    {
20        uint32 w, h;
21        getWindowSize(w, h);
22
23        getViewport(_OldViewport);
24        CViewport newVP;
25        newVP.init(0, 0, ((float)width/(float)w), ((float)height/(float)h));
26        setupViewport(newVP);
27
28        _RenderTargetFBO = true;
29
30        return activeFrameBufferObject(tex);
31    }
32    else
33    {
34        // Have a previous texture ?
35        if (_TextureTarget && (_TextureTarget != tex || _TextureTargetCubeFace != cubeFace) && _TextureTargetUpload)
36        {
37            // Flush it
38            copyFrameBufferToTexture (_TextureTarget, _TextureTargetLevel, _TextureTargetX, _TextureTargetY, 0,
39                0, _TextureTargetWidth, _TextureTargetHeight, _TextureTargetCubeFace);
40        }
41
42        // Backup the texture
43        _TextureTarget = tex;
44
45        // Set a new texture as render target ?
46        if (tex)
47        {
48            // Backup the parameters
49            _TextureTargetLevel = mipmapLevel;
50            _TextureTargetX = x;
51            _TextureTargetY = y;
52            _TextureTargetWidth = width;
53            _TextureTargetHeight = height;
54            _TextureTargetUpload = true;
55            _TextureTargetCubeFace = cubeFace;
56        }
57
58        // Update the viewport
59        setupViewport (_CurrViewport);
60
61        // Update the scissor
62        setupScissor (_CurrScissor);
63
64        _RenderTargetFBO = false;
65        _OldViewport = _CurrViewport;
66    }
67
68    return true;
69}

#7 Updated by kervala about 5 years ago

  • Status changed from Assigned to Resolved
  • % Done changed from 0 to 100

Applied in changeset r270.

#8 Updated by kervala about 5 years ago

It was a trivial error... Stencil was not defined :s

I deduced that after investigating more than 10 hours to fix a lot of parts and finally comparing Windows and Linux pixel format settings.

#9 Updated by kervala about 5 years ago

  • Status changed from Resolved to Assigned

I tried with a fresh mercurial and it doesn't seem to be fixed...

#10 Updated by kervala about 5 years ago

  • % Done changed from 100 to 90

#11 Updated by kervala about 5 years ago

  • Status changed from Assigned to Resolved
  • % Done changed from 90 to 100

Applied in changeset r289.

#12 Updated by kervala about 5 years ago

Please could you confirm it's working under your configurations ?

#13 Updated by jayme about 5 years ago

kervala wrote:

Please could you confirm it's working under your configurations ?

Works for me (with and without bloom).

#14 Updated by ThibG about 5 years ago

With bloom, the shadows are buggy and don't get updated (well, the animation is, but not the orientation nor the equipments)

#15 Updated by kervala about 5 years ago

Are you using nouveau ?

If yes, it could be a bug in nouveau FBO implementation (or a not yet implemented feature).

http://nouveau.freedesktop.org/wiki/FeatureMatrix

#16 Updated by kervala about 5 years ago

  • Status changed from Resolved to Closed

#17 Updated by kervala almost 5 years ago

  • Category changed from NeL: General to OS: GNU/Linux

Also available in: Atom PDF