vkd3d: Introduce d3d12_resource_validate_create_info.
Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
parent
22f61611d1
commit
fee47ef695
|
@ -2713,6 +2713,12 @@ HRESULT d3d12_resource_validate_desc(const D3D12_RESOURCE_DESC *desc, struct d3d
|
||||||
WARN("Invalid parameters for a buffer resource.\n");
|
WARN("Invalid parameters for a buffer resource.\n");
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (desc->Flags & D3D12_RESOURCE_FLAG_ALLOW_SIMULTANEOUS_ACCESS)
|
||||||
|
{
|
||||||
|
WARN("D3D12_RESOURCE_FLAG_ALLOW_SIMULTANEOUS_ACCESS cannot be set for buffers.\n");
|
||||||
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case D3D12_RESOURCE_DIMENSION_TEXTURE1D:
|
case D3D12_RESOURCE_DIMENSION_TEXTURE1D:
|
||||||
|
@ -2745,37 +2751,72 @@ HRESULT d3d12_resource_validate_desc(const D3D12_RESOURCE_DESC *desc, struct d3d
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool d3d12_resource_validate_heap_properties(const struct d3d12_resource *resource,
|
static HRESULT d3d12_resource_validate_heap_properties(const D3D12_RESOURCE_DESC *desc,
|
||||||
const D3D12_HEAP_PROPERTIES *heap_properties, D3D12_RESOURCE_STATES initial_state)
|
const D3D12_HEAP_PROPERTIES *heap_properties, D3D12_RESOURCE_STATES initial_state)
|
||||||
{
|
{
|
||||||
if (heap_properties->Type == D3D12_HEAP_TYPE_UPLOAD
|
if (heap_properties->Type == D3D12_HEAP_TYPE_UPLOAD
|
||||||
|| heap_properties->Type == D3D12_HEAP_TYPE_READBACK)
|
|| heap_properties->Type == D3D12_HEAP_TYPE_READBACK)
|
||||||
{
|
{
|
||||||
if (d3d12_resource_is_texture(resource))
|
if (desc->Dimension != D3D12_RESOURCE_DIMENSION_BUFFER)
|
||||||
{
|
{
|
||||||
WARN("Textures cannot be created on upload/readback heaps.\n");
|
WARN("Textures cannot be created on upload/readback heaps.\n");
|
||||||
return false;
|
return E_INVALIDARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (resource->desc.Flags & (D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET | D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS))
|
if (desc->Flags & (D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET | D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS))
|
||||||
{
|
{
|
||||||
WARN("Render target and unordered access buffers cannot be created on upload/readback heaps.\n");
|
WARN("Render target and unordered access buffers cannot be created on upload/readback heaps.\n");
|
||||||
return false;
|
return E_INVALIDARG;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (heap_properties->Type == D3D12_HEAP_TYPE_UPLOAD && initial_state != D3D12_RESOURCE_STATE_GENERIC_READ)
|
if (heap_properties->Type == D3D12_HEAP_TYPE_UPLOAD && initial_state != D3D12_RESOURCE_STATE_GENERIC_READ)
|
||||||
{
|
{
|
||||||
WARN("For D3D12_HEAP_TYPE_UPLOAD the state must be D3D12_RESOURCE_STATE_GENERIC_READ.\n");
|
WARN("For D3D12_HEAP_TYPE_UPLOAD the state must be D3D12_RESOURCE_STATE_GENERIC_READ.\n");
|
||||||
return false;
|
return E_INVALIDARG;
|
||||||
}
|
}
|
||||||
if (heap_properties->Type == D3D12_HEAP_TYPE_READBACK && initial_state != D3D12_RESOURCE_STATE_COPY_DEST)
|
if (heap_properties->Type == D3D12_HEAP_TYPE_READBACK && initial_state != D3D12_RESOURCE_STATE_COPY_DEST)
|
||||||
{
|
{
|
||||||
WARN("For D3D12_HEAP_TYPE_READBACK the state must be D3D12_RESOURCE_STATE_COPY_DEST.\n");
|
WARN("For D3D12_HEAP_TYPE_READBACK the state must be D3D12_RESOURCE_STATE_COPY_DEST.\n");
|
||||||
return false;
|
return E_INVALIDARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT d3d12_resource_validate_create_info(const D3D12_RESOURCE_DESC *desc,
|
||||||
|
const D3D12_HEAP_PROPERTIES *heap_properties, D3D12_RESOURCE_STATES initial_state,
|
||||||
|
const D3D12_CLEAR_VALUE *optimized_clear_value, struct d3d12_device *device)
|
||||||
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
if (FAILED(hr = d3d12_resource_validate_desc(desc, device)))
|
||||||
|
return hr;
|
||||||
|
|
||||||
|
if (heap_properties)
|
||||||
|
{
|
||||||
|
if (FAILED(hr = d3d12_resource_validate_heap_properties(desc, heap_properties, initial_state)))
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (optimized_clear_value)
|
||||||
|
{
|
||||||
|
if (desc->Dimension == D3D12_RESOURCE_DIMENSION_BUFFER)
|
||||||
|
{
|
||||||
|
WARN("Optimized clear value must be NULL for buffers.\n");
|
||||||
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
WARN("Ignoring optimized clear value.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_valid_resource_state(initial_state))
|
||||||
|
{
|
||||||
|
WARN("Invalid initial resource state %#x.\n", initial_state);
|
||||||
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT d3d12_resource_bind_sparse_metadata(struct d3d12_resource *resource,
|
static HRESULT d3d12_resource_bind_sparse_metadata(struct d3d12_resource *resource,
|
||||||
|
@ -3046,6 +3087,10 @@ static HRESULT d3d12_resource_init(struct d3d12_resource *resource, struct d3d12
|
||||||
{
|
{
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
|
if (FAILED(hr = d3d12_resource_validate_create_info(desc,
|
||||||
|
heap_properties, initial_state, optimized_clear_value, device)))
|
||||||
|
return hr;
|
||||||
|
|
||||||
resource->ID3D12Resource_iface.lpVtbl = &d3d12_resource_vtbl;
|
resource->ID3D12Resource_iface.lpVtbl = &d3d12_resource_vtbl;
|
||||||
resource->refcount = 1;
|
resource->refcount = 1;
|
||||||
resource->internal_refcount = 1;
|
resource->internal_refcount = 1;
|
||||||
|
@ -3064,24 +3109,6 @@ static HRESULT d3d12_resource_init(struct d3d12_resource *resource, struct d3d12
|
||||||
resource->view_map.resource_cookie = resource->cookie;
|
resource->view_map.resource_cookie = resource->cookie;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (heap_properties && !d3d12_resource_validate_heap_properties(resource, heap_properties, initial_state))
|
|
||||||
return E_INVALIDARG;
|
|
||||||
|
|
||||||
if (!is_valid_resource_state(initial_state))
|
|
||||||
{
|
|
||||||
WARN("Invalid initial resource state %#x.\n", initial_state);
|
|
||||||
return E_INVALIDARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (optimized_clear_value && d3d12_resource_is_buffer(resource))
|
|
||||||
{
|
|
||||||
WARN("Optimized clear value must be NULL for buffers.\n");
|
|
||||||
return E_INVALIDARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (optimized_clear_value)
|
|
||||||
WARN("Ignoring optimized clear value.\n");
|
|
||||||
|
|
||||||
resource->gpu_address = 0;
|
resource->gpu_address = 0;
|
||||||
resource->flags = 0;
|
resource->flags = 0;
|
||||||
resource->initial_layout_transition = 0;
|
resource->initial_layout_transition = 0;
|
||||||
|
@ -3093,9 +3120,6 @@ static HRESULT d3d12_resource_init(struct d3d12_resource *resource, struct d3d12
|
||||||
if (!heap_properties)
|
if (!heap_properties)
|
||||||
resource->flags |= VKD3D_RESOURCE_SPARSE;
|
resource->flags |= VKD3D_RESOURCE_SPARSE;
|
||||||
|
|
||||||
if (FAILED(hr = d3d12_resource_validate_desc(&resource->desc, device)))
|
|
||||||
return hr;
|
|
||||||
|
|
||||||
resource->format = vkd3d_format_from_d3d12_resource_desc(device, desc, 0);
|
resource->format = vkd3d_format_from_d3d12_resource_desc(device, desc, 0);
|
||||||
|
|
||||||
switch (desc->Dimension)
|
switch (desc->Dimension)
|
||||||
|
|
Loading…
Reference in New Issue