Sign in to follow this  
zolwik

HLSL: Resource as function parameter

Recommended Posts

zolwik    135

I can't find this in doc. Is there any way to declare helper function argument as resource (as in interlocked intrinsic functions)? I want to make my own general atomic function working on resource and declaring argument as uint returns compile error.

 

error X3669: Resources being indexed cannot come from conditional expressions, they must come from literal expressions.

Index is available at compile time, so I hope it is just some fancy syntax problem.

Share this post


Link to post
Share on other sites
Jason Z    6434

I haven't ever seen a resource passed as an argument, since all of the resources are available at the 'global' scope of the shader.  You can just use the resource without having to explicitly pass it as an argument.  What you can do is make some helper functions where you pass the location and value and the function would modify a particular resource accordingly.

 

It also depends on your resource configurations how you will be able to address them in your function.

 

EDIT: Can you post the shader so we can try to modify and re-compile it?

Edited by Jason Z

Share this post


Link to post
Share on other sites
MrCodeSushi    1066

I'm guessing his helper function is located in a separate file where it has no knowledge about the resource it wants to modify and it is being included in a file where the shader function and the resource declaration are located.

Share this post


Link to post
Share on other sites
zolwik    135

@up

Exactly. Right now I just do what Jason wrote. I wondered if there is option to avoid code redundancy and duplicating same code for each resource and index. I would like to pass Nodes[i0].nodes[i1].data[1] as argument, not i0 and i1, same as in InterlockedCompareExchange.

 

void InterlockedAverage(uint i0, uint i1, float4 val)
{
	val.rgb *= 255.;
	uint nval = Float4ToUint(val);
	uint prev = 0;
	uint current;

	InterlockedCompareExchange(Nodes[i0].nodes[i1].data[1], prev, nval, current);
	[allow_uav_condition]
	while(prev != current)
	{
		prev = current;
		float4 rval = UintToFloat4(current);
		rval.xyz *= rval.w;
		float4 curf = rval + val;
		curf.xyz /= curf.w;
		nval = Float4ToUint(curf);
		InterlockedCompareExchange(Nodes[i0].nodes[i1].data[1], prev, nval, current);
	}
}
Edited by zolwik

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this