Jump to content
  • Advertisement
Sign in to follow this  

d3d11 + cgfx

This topic is 2563 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts


In my cgfx shader I have a sampler parameter:

uniform sampler2D texAlbedo;

In my shader load code, I loop over all effect parameters starting at cgGetFirstEffectParameter

For any parameters where cgGetParameterType(param) == CG_SAMPLER2D I cache the CGparameter handle

Now, when I am ready to render, I'd like to call PSSetShaderResources() to bind the ID3D11ShaderResourceView* that I have for a texture.

How do I get the index of the shader resource?

Calling cgGetParameterResourceIndex on the parameter returns 0xFFFFFFFF, which is obviously the wrong index... cgGetError() returns CG_NO_ERROR after the call to cgGetParameterResourceIndex,

A thought I had was that maybe I'm looking at the wrong CGparameter? This is the parameter I've gotten at the 'effect' level - but obviously a texture can be bound to other shaders besides pixel shaders, and I suspect it can have a different resource index per unit. Is there a way to take the effect parameter and enumerate the other shader units? Or do I need to dive into the effect and get the fragment shader programs and look for the parameter that way?

A little hand would be appreciated, thanks!

Share this post

Link to post
Share on other sites
So, I changed my shader to have two samplers:

uniform sampler2D samp0;
uniform sampler2D samp1;

I took the CGeffect and got the fragment program and looped over the global parameters:

CGprogram fp = cgGetPassProgram(p, CG_FRAGMENT_DOMAIN);
CGparameter param = cgGetFirstParameter(fp, CG_GLOBAL);

and found the CG_SAMPLER2D parameters

However, calling cgGetParameterResourceIndex on both parameters returns 0, so that's not it...

Share this post

Link to post
Share on other sites
So, I tried letting the cg runtime set the texture parameters.

Why do these functions take ID3D11Resource* instead of ID3D11ShaderResourceView* ???

CGD3D11DLL_API void CGD3D11ENTRY cgD3D11SetTextureParameter(CGparameter Parameter, ID3D11Resource *pTexture);
CGD3D11DLL_API void CGD3D11ENTRY cgD3D11SetTextureSamplerStateParameter(CGparameter Parameter, ID3D11Resource *pTexture, ID3D11SamplerState *pSamplerState);

What a mistake. Although it DOES seem to correctly bind the texture...

It wouldn't be that bad, except every time I call one of these functions, cg internally creates a ShaderResourceView and holds onto it. So when I exit my app after running it for a few seconds, there are tens of thousands of created SRVs. What the heck?

This happens regardless of whether cgD3D11SetManageTextureParameters is set to true or false

Share this post

Link to post
Share on other sites
I thought that maybe the shader resource indices were allocated in the order they're declared in the shader. That matches the order they are in the cg parameter list.

Turns out this isn't the case, after some experimenting (rearranging code, trial+error) the resource indices are allocated in the order the textures are sampled within the fragment shader code. That's unfortunate and means I'm still not any closer to finding the mapping ;)

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!