Jump to content

  • Log In with Google      Sign In   
  • Create Account


HLSL: Resource as function parameter


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 zolwik   Members   -  Reputation: 135

Like
0Likes
Like

Posted 02 April 2013 - 03:59 AM

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.



Sponsor:

#2 Jason Z   Crossbones+   -  Reputation: 4538

Like
0Likes
Like

Posted 02 April 2013 - 04:41 AM

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, 02 April 2013 - 04:41 AM.


#3 BrentChua   Crossbones+   -  Reputation: 1066

Like
0Likes
Like

Posted 02 April 2013 - 05:01 AM

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.



#4 zolwik   Members   -  Reputation: 135

Like
0Likes
Like

Posted 02 April 2013 - 05:04 AM

@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, 02 April 2013 - 07:49 AM.





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS