Shocker's picture

TransformFeedback problem

Now I am trying for TransformFeedback .
I made a simple TF sample .
But this program causes an error at GL.LinkProgram probably because of "TransformFeedbackVaryings".

...
GL.TransformFeedbackVaryings(program, 1, new string[] { "feedback" }, TransformFeedbackMode.SeparateAttribs);
 
GL.LinkProgram(program);
GL.GetProgramInfoLog(program, out info);
GL.GetProgram(program, ProgramParameter.LinkStatus, out status_code);
if (status_code != 1)
{
    //Error
    /*
    Link info
    ---------
    error: Varying (named edback) specified but not present in the program object.
    */
    throw new ApplicationException(info);
}
GL.UseProgram(program);
...

Try changing 2nd argument of TransformFeedback to '0', the error disappers .
But, in rendering step , result of queries was zero .
This means the program couldn't write vertices into buffer object .

Could anyone tell me what is wrong in my code or show me a correct sample ?
Thanks .

I write down my PC's environments below . This may lead the problem to solving early .
OS : Windows Vista Home Premium SP2
CPU : Core 2 Duo T7500 2.2GHz
Mem : PC2-5300 2GB
GPU : Geforce 8600M GT (GDDR3 256MB)
ForceWare 186.81 (supports OpenGL 3.0)

Everytime, sorry for my english .

AttachmentSize
Form1.cs7.74 KB

Comments

kvark's picture

It looks correct. Though, you don't need fragment shader as you disable the rasterizer.

This can be easily a driver bug.
ATI fixed their Catalyst to support TF properly only 1-2 months ago.
Try latest NV drivers (even beta ones).

zahirtezcan's picture

I have got an Nvidia card and tried this code . And got the same error with some encoding problem:

error: Varying (named ë edback) specified but not present in the program object.

the Fiddler's picture

Which version of OpenTK are you using and what is your OS language settings for non-Unicode applications? (You can find this in "Control Panel" -> "Regional and Language Options", it should be the last tab).

Shocker's picture

Thanks for replies .
I use OpenTK 0.9.9.3 and OS language settings for non-unicode applications is Japanese .

Fortunately, today NVIDIA released new Beta version driver 195.55 for Notebooks .
I install it and test problem again .
Unfortunately, I got same error .

the Fiddler's picture

Thanks. I've tested this on my Linux laptop (Quadro NVS135M, 190.42 drivers, Mono 2.4.3 / english codepage) and the code does not fail at that point. Instead, it fails with an "InvalidOperation" OpenGL error in the first GL.DrawArrays call. Unfortunately, I don't have access to a windows machine with transform-feedback-capable drivers right now, so I cannot test in a configuration more similar to yours.

This looks like a marshaling issue but the cause is not immediately obvious (it could be similar to #1332: 2byte character may causes a bug with GL.ShaderSource .).

Suggestion: try importing the function manually.

// Code was wrong, see below for corrected code.

We need to find out what works, so we can add this to OpenTK.

Edit: Corrected code here, http://www.opentk.com/node/1389#comment-7477

kvark's picture

I have to add what is obvious for me but might not be the same for you:
TransformFeedback + OpenTK works correctly in my engine (the 'dude' demo uses it), at least on ATI Catalyst 9.9+.
So the problem is not with OpenTK, but with Nv drivers most probably.

the Fiddler's picture

Indeed, but you have to take into account that string-related functions are affected by your regional settings. I'm not saying that this is the problem here (it could be, but that's for from certain at this point - hence the code in my previous post), but it has caused problems before so it's something to keep an eye out for.

Shocker's picture

I'm sorry for reply is late .
Where should I add code which manually calls TF ?

I tried inserting declares of delegate and it's instance into class members .
I got an error "static qualifier is improper" .
So I removed static qualifier .
then I got another error which notices wrong in argument type .
I swap 1st and 2nd argument of "Marshal.GetDelegateForFunctionPointer" .

finally error disappered , but program crashed .

Would you mind my asking you to tell me where is correct place ?

Thank you .

the Fiddler's picture

Ugh, that's what you get for writing code directly in the browser. :)

Corrected code below:

using System.Runtime.InteropServices;
 
// Note: this code assumes you are using GameWindow. The same code can be used with
// GLControl - the only limitation is that you need a valid GraphicsContext prior to calling
// GraphicsContext.CurrentContext.
class Game : GameWindow
{
    // Edit, this should be IntPtr[] varyings
    delegate void glTransformFeedbackVaryings(int program, int count, IntPtr varyings, TransformFeedbackMode bufferMode);
 
    static glTransformFeedbackVaryings TransformFeedbackVaryings;
 
    protected override void OnLoad(object sender, EventArgs e)
    {
        base.OnLoad(sender, e);
 
        TransformFeedbackVaryings = (glTransformFeedbackVaryings)Marshal.GetDelegateForFunctionPointer(
            (GraphicsContext.CurrentContext as IGraphicsContextInternal).GetAddress("glTransformFeedbackVaryings"),,
            typeof(glTransformFeedbackVaryings));
    }
}

Afterwards, simply use TransformFeedbackVaryings instead of GL.TransformFeedbackVaryings.

If it still crashes, please post the exception message, this could be useful.

Edit: this code also has an error, see below.

Shocker's picture

Thank you .
I added manual TransformFeedback into code .
But program still crashed or threw error that is similar to before .
A name of varying variable mentioned by the error message is strange . (What is "stemBrushesKey" ??)

AttachmentSize
TFTest_GLControl.cs8.62 KB
the Fiddler's picture

Thanks for the code, I will test it as soon as I have access to a computer that supports transform feedback (probably around Monday or so).

If you would be so kind as to run one last test for me?

// Replace IntPtr varyings from the previous code with IntPtr[] varyings
// and pass an array, i.e. "new IntPtr[] { varying }"
delegate void glTransformFeedbackVaryings(int program, int count, IntPtr[] varyings, TransformFeedbackMode bufferMode);

The error "stemBrushesKey" indicates an out-of-bounds memory access (my previous code was invalid, as OpenGL expects a pointer-to-pointer-to-string, not a pointer-to-string).

Shocker's picture

Sure : ) I've tested .
the crash that I always get disappeared .
But I still get no result from TF . QueryResult are zero from "TransformFeedbackPrimitivesWritten"
and "PrimitivesGenerated" .

AttachmentSize
TFTest_GLControl.cs8.31 KB
the Fiddler's picture

Thanks. I'm out of ideas now. :/

The issue is that transform feedback works for at least some I don't know where the difference lies - at least not yet. My gut instinct says this could be an encoding issue (a mismatch between the encoding of the shader vs the encoding of the varyings, maybe?) but I have no way to test right now. I'll try running with mesa/soft to see if I can come up with anything.

zahirtezcan's picture

I am using OpenTK 1.0-beta-2 in Debug mode and got an InvalidOperation from ErrorHandler. Then I investigated the problem and 3.2 spec Table 2.11 answered the question. If you render with Triangles, TriangleStrip or TriangleFan then you should use Triangles as BeginFeedbackMode. After i have done that I got the attached messagebox

AttachmentSize
PrimitivesWritten.JPG12.04 KB
Shocker's picture

Oops : (
I'm sorry for my simple miss .
I should have read OpenGL Spec more carefully and have used GL.GetError .
Thank you very much for your advise : )
I'm sorry for the unnecessary problem the Fiddler .

Thank you .

Shocker's picture

The file is appended.

AttachmentSize
Form1.cs13 KB