<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/111566>111566</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [HLSL] Use constructors for resource handle initialization
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          hekota
      </td>
    </tr>
</table>

<pre>
    Resource handle initialization should be done via resource class constructors. If a resource is declared in a global variable, the compiler should make sure to call a constructor that takes binding information, which will later be translated to `dx.handle.fromBinding`.

Resources declared as local variables would use a default constructor that will initialize the handle to 'empty' or 'null', or simply leave it undefined. Another resource can be assigned to these local variables and a copy constructor and/or assignment operator will take care of copying the resource handle.

This should greatly simplify handling of resources, including when they are dynamically bound, used as function in/out parameters, declared in unbounded arrays or used defined types.

Resource classes should look like this:

```
struct Binding;

template <typename T> struct RWBuffer {
private:
 using handle_t = __hlsl_resource_t
      [[hlsl::contained_type(T)]] [[hlsl::resource_class(UAV)]];
  handle_t h;

public:
  // For uninitialized handles
  RWBuffer() { h = __builtin_hlsl_create_poison_handle(); }
  
  // Resources are copyable.
  RWBuffer(RWBuffer &LHS) = default;
  
  // For handles constructed as globals with binding information, or from the
  // descriptor heap.
  RWBuffer(Binding &B) { h = __builtin_create_handle_from_binding(B); }

  ~RWBuffer() = default;

  RWBuffer &operator=(RWBuffer &LHS) {
    h = LHS.h;
 return *this
  }
...  
}
```

Follow-up from #105076.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJx0VkuPqzgT_TXOpnQRMUlIFlkkN1_Un9Sr231nlpGBInja2MiPZDKL-e2jMpBXP9SiG-GqOufUqQLhnDxqxDWbb9l8NxHBN8auG_wwXkwKU13Wv9CZYEuERuhKIUgtvRRK_iO8NBpcY4KqoECojEY4SQF2jCiVcA5Ko523ofTGugT-X8PdCemgwlIJixVIDQKOyhRCwUlYKQqFjP8E3yCUpu2kQjuWa8UHggsWwRsohVIg7uuAb4QHLz7QQSF1JfURpK6NbSNoynpuZNnAWSoFSni0xMBboR3dVZSWLdLq76RnndTWtNs-E1ukCUt3LN3011GgOyrCgTLlHQ8H54g7OAQBFdYiKP8ZcYRzFRgj9UF2AsRzbDt_YTwHY-lWB6UYz4mPseBk26kLKBQnBOkh6AprqbFKYKONb9DetUZoYjz0P_L1DTr8hFvoKmrbXR7gCl0xvqd_YoYWtQfToRX0MNIg9aEUFsHUMZ6aQITso6EetHxvpBt7fLQovLr0tGR96c9TFlNfkzjiLnWpQmzyuUFNRS5AhauLFq0ke1ygMIEg_6QWxAbVQZfRwVITk-ChE1a06NHGpPe-DDqGU6C14uJI7ZhnEBj8pUP3pSv6IcArK2XMByj5Qc2VjmWb-yC2SIffeNurDaPvsu39WY9tR14Flv2k8lq0CO8s-x8MYb_-3Ia6RgssHwI7K0_C47UoBEei9X04eGDZDg6HRjl1GPU9-OFo_IlbYksHKEe2KY32ggQ4EALGl--Mr9h8x-a7T2evGaMgjC9_b_64nr5ygxua5olwFwolyxt4YHzP-B7IhUHfpqYaUrjx3CgE40vGVyQHNAPXIkjlpe45l2Q4PHRGOqMPfZI-hmVbYPnuWvgRwG0BkOnI6jQ6yRflby3hi9eXt4gm24374E6ELygOpG5T2Nu4X5gOztI33-06Y4H2Fw3GU-IKXWllR0PboOi-wjy4jyBvv5NvUG5oHdU6DFAowbOAY5F_nxvzhRTPgAjGuGdYtvtG03x7c22P9fXlLbkZCiz6YDUwvolTOIoyIkySZOzBDfXjbPbXvVHKnH-ErheY8WyaztN8kUyqdVatspWY4Hqa8-UsXc5Ws0mznuV5UVRpXS74nM9wjtNpVfKlyLKiXqxWOJFrnvLZNE2XFDedJXPkYlXNV4tilq9ysWKzFFshVaLUqU2MPU6kcwHX0-l0vlhMlChQufhC51zjGeJTxjm93-2agn4U4ejYLFXSeXdL46VX8Uvg5fXtlUb4t8OHtzfUxj6v76fvgUmwat1438XVFk12lL4JRVKalvE9FRv-_Ois-QtLz_g-QnSM7wcOpzX_LwAA__8o5MZ-">