+void d3d12_resource_desc_promote(D3D12_RESOURCE_DESC1 *dst_desc, const D3D12_RESOURCE_DESC *src_desc) +{ + dst_desc->Dimension = src_desc->Dimension; + dst_desc->Alignment = src_desc->Alignment; + dst_desc->Width = src_desc->Width; + dst_desc->Height = src_desc->Height; + dst_desc->DepthOrArraySize = src_desc->DepthOrArraySize; + dst_desc->MipLevels = src_desc->MipLevels; + dst_desc->Format = src_desc->Format; + dst_desc->SampleDesc = src_desc->SampleDesc; + dst_desc->Layout = src_desc->Layout; + dst_desc->Flags = src_desc->Flags; + dst_desc->SamplerFeedbackMipRegion.Width = 0; + dst_desc->SamplerFeedbackMipRegion.Height = 0; + dst_desc->SamplerFeedbackMipRegion.Depth = 0; +}
This is not used outside device.c. We'd typically implemented that like this: ```c static void d3d12_resource_desc1_from_desc(D3D12_RESOURCE_DESC1 *desc1, const D3D12_RESOURCE_DESC *desc) { memcpy(desc1, desc, sizeof(*desc)) desc1->SamplerFeedbackMipRegion.Width = 0; desc1->SamplerFeedbackMipRegion.Height = 0; desc1->SamplerFeedbackMipRegion.Depth = 0; } ```
+static void d3d12_device_get_resource_allocation_info(struct d3d12_device *device, + D3D12_RESOURCE_ALLOCATION_INFO1 *infos1, unsigned int count, const D3D12_RESOURCE_DESC *resource_descs, + D3D12_RESOURCE_ALLOCATION_INFO *result) +{ + D3D12_RESOURCE_DESC1 resource_descs1[4]; + D3D12_RESOURCE_DESC1 *descs1 = NULL; + unsigned int i; + + if (count > ARRAY_SIZE(resource_descs1)) + { + if (!(descs1 = vkd3d_calloc(count, sizeof(*descs1)))) + { + ERR("Failed to allocate %u resource descriptions.\n", count); + result->SizeInBytes = UINT64_MAX; + result->Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT; + return; + } + } + + if (!descs1) + descs1 = resource_descs1;
I.e., ```c { D3D12_RESOURCE_DESC1 resource_descs1[4]; D3D12_RESOURCE_DESC1 *descs1; unsigned int i;
if (count <= ARRAY_SIZE(resource_descs1)) { descs1 = resource_descs1; } else if (!(descs1 = vkd3d_calloc(count, sizeof(*descs1)))) { ... return; }
...
if (descs1 != resource_descs1) vkd3d_free(descs1); } ``` right?
-static D3D12_RESOURCE_DESC * STDMETHODCALLTYPE d3d12_resource_GetDesc(ID3D12Resource1 *iface, +static D3D12_RESOURCE_DESC * STDMETHODCALLTYPE d3d12_resource_GetDesc(ID3D12Resource2 *iface, D3D12_RESOURCE_DESC *resource_desc) { - struct d3d12_resource *resource = impl_from_ID3D12Resource1(iface); + struct d3d12_resource *resource = impl_from_ID3D12Resource2(iface); + const D3D12_RESOURCE_DESC1 *desc1 = &resource->desc; TRACE("iface %p, resource_desc %p.\n", iface, resource_desc); - *resource_desc = resource->desc; + resource_desc->Dimension = desc1->Dimension; + resource_desc->Alignment = desc1->Alignment; + resource_desc->Width = desc1->Width; + resource_desc->Height = desc1->Height; + resource_desc->DepthOrArraySize = desc1->DepthOrArraySize; + resource_desc->MipLevels = desc1->MipLevels; + resource_desc->Format = desc1->Format; + resource_desc->SampleDesc = desc1->SampleDesc; + resource_desc->Layout = desc1->Layout; + resource_desc->Flags = desc1->Flags; return resource_desc; }
Somewhat like above, we'd normally just use "memcpy(resource_desc, &resource->desc, sizeof(*resource_desc))" here.