Am 01.07.2010 um 20:58 schrieb Fabian Bieler:
I hoped that OpenGL took care of those cases. According to the spec samplers with incomplete textures bound to them should return (0, 0, 0, 1), too. Wouldn't sampling from a texture unit to which the binding of matching dimensionality is 0 count as incomplete? (At least as long as no one uploads an image to it, I'm not sure if it's legal to use texture name 0)
Part of the problem is that we don't maintain a texture dimension that isn't used on a sampler. E.g.
bind Volume texture to sampler 0 draw with a shader reading the volume texture bind 2D texture to sampler 0 draw with a shader reading the 2D texture bind a shader reading volume textures draw with that shader
The last step reads from the volume texture bound in step 0, but I guess the correct thing would be to return 0,0,0,1 because the sampler doesn't match the shader. That's why I am afraid you'll have to fix this in the shader, by not sampling at all if the texture doesn't match.
Anyhow, I just did some testing and found out that nvidia returns (0, 0, 0, 0) for incomplete textures and 'unbound' texture units i.e. bound to 0. Maybe it does that on windows for D3D, too. I only tested on AMD and the reference rasterizer (which both return (0, 0, 0, 1)) and bug 14942 only depends on the rgb components.
I can do some testing, but first I have to fix the existing tests. I get about 1000 failures on my Win7+Nvidia box.
Also: If you want to work around the issue with more dummy textures, wouldn't you also have to bind dummy textures to all available texture units (and not just the ones exposed to the fixed-function-pipeline)?
I don't think dummy textures are the way to go here. They're needed for fixed function for texture ops that don't involve textures, because otherwise ARB_texture_combiners returns an error. E.g.
stage 1 texture: NULL stage 1 color op: D3DTOP_ADD stage 1 color arg1: D3DTA_PREVIOUS stage 1 color arg2: D3DTA_TEXFACTOR
The texture isn't used here, but the texture_combiner API says that using a stage without a texture is an error, hence the dummy textures. We shouldn't need them for the nvrc, arbfp and atifs pipelines.