[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Public WebGL] More driver bugs: Getting FRAMEBUFFER_INCOMPLETE for a texture that is not "texture complete" on some cards.



+1

On Thu, Dec 16, 2010 at 6:16 PM, Steve Baker <steve@sjbaker.org> wrote:
> On 12/16/2010 05:09 PM, Gregg Tavares (wrk) wrote:
>> So we were informed of a new issue.
>>
>> If you bind a texture to a framebuffer and that texture is not
>> "texture complete" then on some (all?) nvidia drivers it wrongly
>> return FRAMEBUFFER_UNSUPPORED.
>>
>> In other words,
>>
>>    // create a 32x32 texture
>>    tex = gl.createTexture();
>>    gl.bindTexture(gl.TEXTURE_2D, tex);
>>    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 32, 32, 0, gl.RGBA,
>> gl.UNSIGNED_BYTE, null);
>>
>>    // attach that texture to a framebuffer
>>    fbo = gl.createFramebuffer();
>>    gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
>>    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0,
>> gl.TEXTURE_2D, tex, 0);
>>
>>    // check that it's complete
>>    var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
>>    ASSERT(status == gl.FRAMEBUFFER_COMPLETE);
>>
>> This code will wrongly fail on some nvidia drivers.
>>
>> The issue is apparently that bad nvidia drivers require the textures
>> to either have all their mips or be set to use filtering that does not
>> require mips.
>>
>> The workaround is to add this line
>>
>>    // because the default for a texture is gl.NEAREST_MIPMAP_LINEAR
>>    // we need to set it to something that doesn't need mips.
>>    gl.texParameteriv(gl.TEXTURE_2D, TEXTURE_MIN_FILTER, gl.LINEAR);
>>
>> So, for WebGL what if anything should we do?
>>
>> 1) Ignore the issue
>>
>>     You couldn't render with the texture without setting filtering
>>     anyway. Mostly like you just have to re-order your initialization
>>     to set the texParameter before setting up your FBO instead of after.
>>
>>
>> 2) Try to fix it inside WebGL implementations
>>
>>     I think you'd basically have to track if a texture is being used
>>     as an fbo. When it is (either on bindFramebuffer or
>>     framebufferTexture2D) you'd have to set its filtering to LINEAR or
>>     NEAREST while resetting any previously bound framebuffer texture
>>     back to it's original user specified filters. You'd also have to
>>     wrap texParameteriv and getTexParameter so that they shadowed the
>>     settings since if the texture is currently being used as a render
>>     target you can neither set or query its parameters and expect to
>>     get the correct result.
>>
>> 3) Change the WebGL spec to have the same requirements so the failure
>> is consistent
>>
>>     You'd again have track which textures are currently being rendered
>>     too. Before each draw call you'd have to see if the texture being
>>     rendered to meets the conditions above. If not generate
>>     GL_INVALID_FRAMEBUFFER_OPERATION on top of
>>     GL_FRAMEBUFFER_INCOMPLETE on checkFramebufferStatus.
>>
>> 4) ?
>
> 4) Create a website where we document the heck out of these
> gotcha's...and then ignore them.  Truly - you can't fix every
> implementation bug in every OpenGL implementation in every browser...as
> a policy, that's going to cause **SO** much grief.  If it's not a
> general policy - than what makes this rather obscure bug more important
> than any of the others that are out there?  Having an official,
> well-publicized, well-supported, comprehensive "gotcha's" site - with
> good work-arounds right there - would be worth it's weight in gold.  It
> would also serve as a very public way to gently encourage the driver
> writers to fix it!
>
> -----------------------------------------------------------
> You are currently subscribed to public_webgl@khronos.org.
> To unsubscribe, send an email to majordomo@khronos.org with
> the following command in the body of your email:
>
>

-----------------------------------------------------------
You are currently subscribed to public_webgl@khronos.org.
To unsubscribe, send an email to majordomo@khronos.org with
the following command in the body of your email: