HLSL: Resource as function parameter

Started by
2 comments, last by zolwik 11 years ago

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.

Advertisement

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?

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.

@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);
	}
}

This topic is closed to new replies.

Advertisement